enrecipes/app/store.js
Vishnu Raghav B cff2dea334 cleanup
2020-11-10 23:58:48 +05:30

398 lines
12 KiB
JavaScript

import Vue from "vue"
import Vuex from "vuex"
import { Couchbase } from "nativescript-couchbase-plugin"
import { getFileAccess } from "@nativescript/core"
const EnRecipesDB = new Couchbase("EnRecipes")
const userCategoriesDB = new Couchbase("userCategories")
const userYieldUnitsDB = new Couchbase("userYieldUnits")
Vue.use(Vuex)
let defaultCategories = [
"Appetizers",
"BBQ",
"Beverages",
"Breads",
"Breakfast",
"Desserts",
"Dinner",
"Drinks",
"Healthy",
"Lunch",
"Main dishes",
"Meat",
"Noodles",
"Pasta",
"Poultry",
"Rice",
"Salads",
"Sauces",
"Seafood",
"Side dishes",
"Snacks",
"Soups",
"Undefined",
"Vegan",
"Vegetarian",
]
let defaultYieldUnits = [
"Serving",
"Piece",
"Teaspoon",
"Tablespoon",
"Fluid Ounce",
"Ounce",
"Pound",
"Gram",
"Kilogram",
"Cup",
"Gallon",
"Millilitre",
"Litre",
"Roll",
"Patty",
"Loaf",
]
export default new Vuex.Store({
state: {
recipes: [
// {
// imageSrc: null,
// title: "Mushroom & Spinach Risotto",
// category: "Lunch",
// timeRequired: "01:45",
// yield: {
// quantity: 1,
// unit: "Serving",
// },
// ingredients: [
// {
// item: "reduced-sodium chicken broth",
// unit: "cup",
// quantity: "5.25",
// },
// { item: "sliced fresh mushrooms", unit: "cup", quantity: "2.5" },
// { item: "medium onion, finely chopped", unit: "unit", quantity: "1" },
// { item: "butter", unit: "Tbsp", quantity: "3" },
// { item: "Garlic", unit: "unit", quantity: "3" },
// {
// item: "white wine or reduced-sodium chicken broth",
// unit: "l",
// quantity: ".75",
// },
// { item: "heavy whipping cream", unit: "cup", quantity: "1" },
// { item: "uncooked arborio rice", unit: "cup", quantity: "1.75" },
// { item: "olive oil", unit: "Tbsp", quantity: "2" },
// {
// item: "frozen chopped spinach, thawed and squeezed dry",
// unit: "cup",
// quantity: "1.5",
// },
// { item: "pepper", unit: "tsp", quantity: ".5" },
// { item: "Salt", unit: "tsp", quantity: ".25" },
// { item: "grated Parmesan cheese", unit: "cup", quantity: "1" },
// ],
// instructions: [
// "In a large saucepan, heat broth and keep warm. In a large skillet, saute mushrooms and onion in butter until tender. Add garlic; cook 1 minute longer. Stir in wine. Bring to a boil; cook until liquid is reduced by half. Add cream; cook and stir over medium heat until slightly thickened",
// "In a large saucepan, saute rice in oil for 2-3 minutes or until rice is lightly browned. Stir in 1/2 cup hot broth. Reduce heat; cook and stir for 20 minutes or until broth is absorbed.",
// "Continue adding hot broth, 1/2 cup at a time, and stirring until all the broth has been absorbed and rice is tender but firm. Add the mushroom mixture, spinach, pepper, salt and grated Parmesan cheese; cook and stir until heated through. If desired, sprinkle with parsley and shaved Parmesan cheese. Serve immediately.",
// ],
// notes: [
// "Nutrition Facts: 3/4 cup: 409 calories, 22g fat (12g saturated fat), 61mg cholesterol, 667mg sodium, 41g carbohydrate (3g sugars, 2g fiber), 11g protein.",
// ],
// references: [
// "https://www.tasteofhome.com/recipes/mushroom-spinach-risotto/",
// ],
// isFavorite: false,
// tried: false,
// lastTried: "2020-10-28T18:19:06.528Z",
// lastModified: "2020-10-28T06:19:06.528Z",
// id: "57qm8oqxdr",
// },
],
categories: [],
userCategories: [],
units: [
"unit",
"tsp",
"tbsp",
"fl oz",
"cup",
"pt",
"qt",
"gal",
"ml",
"l",
"oz",
"lb",
"mg",
"g",
"kg",
"cm",
"in",
"clove",
"pinch",
"drop",
"dozen",
"stick",
"small",
"medium",
"large",
],
yieldUnits: [],
userYieldUnits: [],
icon: {
home: "\ued3b",
heart: "\ued36",
heartOutline: "\uea6c",
label: "\ued51",
labelOutline: "\uea8b",
cog: "\ueca6",
info: "\ued49",
menu: "\ueac1",
search: "\ueb54",
sort: "\ueac2",
plus: "\ueb21",
plusCircle: "\ueb22",
close: "\uebe9",
image: "\uea7f",
food: "\ueb3e",
back: "\uea95",
save: "\uedeb",
camera: "\uec61",
share: "\uedf3",
edit: "\uedba",
theme: "\uecaa",
link: "\ueaa0",
file: "\ued02",
detail: "\ue9f9",
user: "\uee33",
trash: "\uee26",
donate: "\ueb4f",
trylater: "\uec31",
trylaterOutline: "\ue94a",
note: "\ueb04",
copy: "\ue9e6",
check: "\ue9ab",
telegram: "\ueec7",
time: "\ueba2",
item: "\ue99d",
step: "\ue948",
source: "\ueaa0",
export: "\ued07",
import: "\ued0c",
},
currentComponent: "EnRecipes",
},
mutations: {
initializeRecipes(state) {
EnRecipesDB.query({ select: [] }).forEach((recipe) => {
state.recipes.push(recipe)
})
},
initializeCategories(state) {
let isCategoriesStored = userCategoriesDB.query({ select: [] }).length
if (isCategoriesStored) {
state.userCategories = userCategoriesDB.getDocument(
"userCategories"
).userCategories
let categoriesWithRecipes = state.recipes.map((e) => e.category)
state.userCategories = state.userCategories.filter((e) =>
categoriesWithRecipes.includes(e)
)
} else {
userCategoriesDB.createDocument(
{ userCategories: [] },
"userCategories"
)
}
state.categories = [...defaultCategories, ...state.userCategories]
state.categories.sort()
},
initializeYieldUnits(state) {
let isYieldUnitsStored = userYieldUnitsDB.query({ select: [] }).length
if (isYieldUnitsStored) {
state.userYieldUnits = userYieldUnitsDB.getDocument(
"userYieldUnits"
).userYieldUnits
let yieldUnitsWithRecipes = state.recipes.map((e) => e.yield.unit)
state.userYieldUnits = state.userYieldUnits.filter((e) =>
yieldUnitsWithRecipes.includes(e)
)
} else {
userYieldUnitsDB.createDocument(
{ userYieldUnits: [] },
"userYieldUnits"
)
}
state.yieldUnits = [...defaultYieldUnits, ...state.userYieldUnits]
},
addRecipe(state, { id, recipe }) {
state.recipes.push(recipe)
EnRecipesDB.createDocument(recipe, id)
},
importRecipes(state, recipes) {
console.log("hello")
let localRecipesIDs, partition
if (state.recipes.length) {
localRecipesIDs = state.recipes.map((e) => e.id)
partition = recipes.reduce(
(result, recipe, i) => {
localRecipesIDs.indexOf(recipe.id) < 0
? result[0].push(recipe) // create candidates
: result[1].push(recipe) // update candidates
return result
},
[[], []]
)
if (partition[0].length) createDocuments(partition[0])
if (partition[1].length) updateDocuments(partition[1])
} else {
createDocuments(recipes)
}
function createDocuments(data) {
console.log("creating")
state.recipes = [...state.recipes, ...data]
data.forEach((recipe) => {
EnRecipesDB.createDocument(recipe, recipe.id)
})
}
function updateDocuments(data) {
console.log("updating")
data.forEach((recipe) => {
let recipeIndex = state.recipes
.map((e, i) => (e.id === recipe.id ? i : -1))
.filter((e) => e >= 0)[0]
console.log(recipeIndex)
Object.assign(state.recipes[recipeIndex], recipe)
EnRecipesDB.updateDocument(recipe.id, recipe)
})
}
},
addCategory(state, category) {
let lowercase = state.categories.map((e) => e.toLowerCase())
if (lowercase.indexOf(category.toLowerCase()) == -1) {
state.userCategories.push(category)
userCategoriesDB.updateDocument("userCategories", {
userCategories: [...state.userCategories],
})
state.categories = [...defaultCategories, ...state.userCategories]
state.categories.sort()
}
},
importCategories(state, categories) {
state.userCategories = new Set([...state.userCategories, ...categories])
userCategoriesDB.updateDocument("userCategories", {
userCategories: [...state.userCategories],
})
state.categories = [...defaultCategories, ...state.userCategories]
state.categories.sort()
},
addYieldUnit(state, yieldUnit) {
let lowercase = state.yieldUnits.map((e) => e.toLowerCase())
if (lowercase.indexOf(yieldUnit.toLowerCase()) == -1) {
state.userYieldUnits.push(yieldUnit)
userYieldUnitsDB.updateDocument("userYieldUnits", {
userYieldUnits: [...state.userYieldUnits],
})
state.yieldUnits = [...defaultYieldUnits, ...state.userYieldUnits]
}
},
importYieldUnits(state, yieldUnits) {
state.userYieldUnits = new Set([...state.userYieldUnits, ...yieldUnits])
userYieldUnitsDB.updateDocument("userYieldUnits", {
userYieldUnits: [...state.userYieldUnits],
})
state.yieldUnits = [...defaultYieldUnits, ...state.userYieldUnits]
},
overwriteRecipe(state, { index, id, recipe }) {
Object.assign(state.recipes[index], recipe)
EnRecipesDB.updateDocument(id, recipe)
},
deleteRecipe(state, { index, id }) {
getFileAccess().deleteFile(state.recipes[index].imageSrc)
state.recipes.splice(index, 1)
EnRecipesDB.deleteDocument(id)
},
toggleState(state, { index, id, recipe, key, setDate }) {
state.recipes[index][key] = !state.recipes[index][key]
if (setDate) state.recipes[index].lastTried = new Date()
EnRecipesDB.updateDocument(id, recipe)
},
setLastTriedDate(state, index) {
state.recipes[index].lastTried = new Date()
EnRecipesDB.updateDocument(state.recipes[index].id, state.recipes[index])
},
setCurrentComponent(state, comp) {
state.currentComponent = comp
},
renameCategory(state, { current, updated }) {
let lowercase = state.categories.map((e) => e.toLowerCase())
if (lowercase.indexOf(updated.toLowerCase()) == -1) {
state.userCategories.push(updated)
userCategoriesDB.updateDocument("userCategories", {
userCategories: [...state.userCategories],
})
state.categories = [...defaultCategories, ...state.userCategories]
state.categories.sort()
}
state.recipes.forEach((e, i) => {
if (e.category == current) {
state.recipes[i].category = updated
EnRecipesDB.inBatch(() => {
EnRecipesDB.updateDocument(state.recipes[i].id, state.recipes[i])
})
}
})
},
},
actions: {
initializeRecipes({ commit }) {
commit("initializeRecipes")
},
initializeCategories({ commit }) {
commit("initializeCategories")
},
initializeYieldUnits({ commit }) {
commit("initializeYieldUnits")
},
addRecipeAction({ commit }, recipe) {
commit("addRecipe", recipe)
},
importRecipesAction({ commit }, recipes) {
commit("importRecipes", recipes)
},
addCategoryAction({ commit }, category) {
commit("addCategory", category)
},
importCategoriesAction({ commit }, categories) {
commit("importCategories", categories)
},
addYieldUnitAction({ commit }, yieldUnit) {
commit("addYieldUnit", yieldUnit)
},
importYieldUnitsAction({ commit }, yieldUnits) {
commit("importYieldUnits", yieldUnits)
},
overwriteRecipeAction({ commit }, updatedRecipe) {
commit("overwriteRecipe", updatedRecipe)
},
deleteRecipeAction({ commit }, recipe) {
commit("deleteRecipe", recipe)
},
toggleStateAction({ commit }, toggledRecipe) {
commit("toggleState", toggledRecipe)
},
setLastTriedDateAction({ commit }, index) {
commit("setLastTriedDate", index)
},
setCurrentComponentAction({ commit }, comp) {
commit("setCurrentComponent", comp)
},
renameCategoryAction({ commit }, category) {
commit("renameCategory", category)
},
},
})