2020-10-14 19:32:32 +00:00
import Vue from "vue"
import Vuex from "vuex"
2020-10-26 20:49:54 +00:00
import { Couchbase } from "nativescript-couchbase-plugin"
2020-11-23 09:49:58 +00:00
import { Color , getFileAccess } from "@nativescript/core"
import { CalendarEvent } from "nativescript-ui-calendar"
import { stat } from "fs"
2020-11-06 09:07:41 +00:00
const EnRecipesDB = new Couchbase ( "EnRecipes" )
2020-11-03 19:57:31 +00:00
const userCategoriesDB = new Couchbase ( "userCategories" )
const userYieldUnitsDB = new Couchbase ( "userYieldUnits" )
2020-11-23 09:49:58 +00:00
const mealPlansDB = new Couchbase ( "mealPlans" )
2020-09-15 11:10:16 +00:00
2020-10-14 19:32:32 +00:00
Vue . use ( Vuex )
2020-09-15 11:10:16 +00:00
2020-11-02 11:36:53 +00:00
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" ,
2020-11-03 19:57:31 +00:00
"Patty" ,
2020-11-02 11:36:53 +00:00
"Loaf" ,
]
2020-09-15 11:10:16 +00:00
export default new Vuex . Store ( {
state : {
2020-10-29 20:12:53 +00:00
recipes : [
2020-11-02 11:36:53 +00:00
// {
// 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: [
2020-11-03 19:57:31 +00:00
// "Nutrition Facts: 3/4 cup: 409 calories, 22g fat (12g saturated fat), 61mg cholesterol, 667mg sodium, 41g carbohydrate (3g sugars, 2g fiber), 11g protein.",
2020-11-02 11:36:53 +00:00
// ],
// isFavorite: false,
// tried: false,
// lastTried: "2020-10-28T18:19:06.528Z",
// lastModified: "2020-10-28T06:19:06.528Z",
// id: "57qm8oqxdr",
// },
2020-10-29 20:12:53 +00:00
] ,
2020-10-26 20:49:54 +00:00
categories : [ ] ,
2020-11-02 11:36:53 +00:00
userCategories : [ ] ,
2020-10-26 20:49:54 +00:00
units : [
"unit" ,
"tsp" ,
2020-11-23 09:49:58 +00:00
"dsp" ,
2020-11-02 11:36:53 +00:00
"tbsp" ,
"fl oz" ,
2020-10-26 20:49:54 +00:00
"cup" ,
"pt" ,
"qt" ,
"gal" ,
"ml" ,
2020-11-02 11:36:53 +00:00
"l" ,
"oz" ,
"lb" ,
2020-10-26 20:49:54 +00:00
"mg" ,
"g" ,
"kg" ,
"cm" ,
"in" ,
2020-11-23 09:49:58 +00:00
"leaf" ,
2020-11-02 11:36:53 +00:00
"clove" ,
"pinch" ,
"drop" ,
"dozen" ,
"stick" ,
"small" ,
"medium" ,
"large" ,
2020-10-26 20:49:54 +00:00
] ,
2020-11-02 11:36:53 +00:00
yieldUnits : [ ] ,
userYieldUnits : [ ] ,
2020-11-23 09:49:58 +00:00
mealPlans : [ ] ,
2020-10-14 19:32:32 +00:00
icon : {
2020-11-02 11:36:53 +00:00
home : "\ued3b" ,
heart : "\ued36" ,
heartOutline : "\uea6c" ,
label : "\ued51" ,
2020-11-10 18:28:48 +00:00
labelOutline : "\uea8b" ,
2020-11-02 11:36:53 +00:00
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" ,
2020-11-10 18:28:48 +00:00
detail : "\ue9f9" ,
2020-11-02 11:36:53 +00:00
user : "\uee33" ,
trash : "\uee26" ,
donate : "\ueb4f" ,
trylater : "\uec31" ,
trylaterOutline : "\ue94a" ,
note : "\ueb04" ,
copy : "\ue9e6" ,
2020-11-28 19:21:57 +00:00
check : "\ue9a4" ,
2020-11-02 11:36:53 +00:00
telegram : "\ueec7" ,
time : "\ueba2" ,
item : "\ue99d" ,
step : "\ue948" ,
source : "\ueaa0" ,
2020-11-06 09:07:41 +00:00
export : "\ued07" ,
import : "\ued0c" ,
2020-11-15 10:51:10 +00:00
outline : "\ueb07" ,
2020-11-23 09:49:58 +00:00
calendar : "\uec55" ,
today : "\ue97c" ,
2020-10-14 19:32:32 +00:00
} ,
2020-10-21 17:54:45 +00:00
currentComponent : "EnRecipes" ,
2020-09-15 11:10:16 +00:00
} ,
mutations : {
2020-10-26 20:49:54 +00:00
initializeRecipes ( state ) {
2020-11-10 18:28:48 +00:00
EnRecipesDB . query ( { select : [ ] } ) . forEach ( ( recipe ) => {
state . recipes . push ( recipe )
2020-10-26 20:49:54 +00:00
} )
} ,
initializeCategories ( state ) {
2020-11-03 19:57:31 +00:00
let isCategoriesStored = userCategoriesDB . query ( { select : [ ] } ) . length
2020-10-26 20:49:54 +00:00
if ( isCategoriesStored ) {
2020-11-03 19:57:31 +00:00
state . userCategories = userCategoriesDB . getDocument (
2020-11-02 11:36:53 +00:00
"userCategories"
) . userCategories
let categoriesWithRecipes = state . recipes . map ( ( e ) => e . category )
state . userCategories = state . userCategories . filter ( ( e ) =>
categoriesWithRecipes . includes ( e )
)
2020-10-26 20:49:54 +00:00
} else {
2020-11-03 19:57:31 +00:00
userCategoriesDB . createDocument (
{ userCategories : [ ] } ,
"userCategories"
)
2020-11-02 11:36:53 +00:00
}
state . categories = [ ... defaultCategories , ... state . userCategories ]
state . categories . sort ( )
} ,
initializeYieldUnits ( state ) {
2020-11-03 19:57:31 +00:00
let isYieldUnitsStored = userYieldUnitsDB . query ( { select : [ ] } ) . length
2020-11-02 11:36:53 +00:00
if ( isYieldUnitsStored ) {
2020-11-03 19:57:31 +00:00
state . userYieldUnits = userYieldUnitsDB . getDocument (
2020-11-02 11:36:53 +00:00
"userYieldUnits"
) . userYieldUnits
let yieldUnitsWithRecipes = state . recipes . map ( ( e ) => e . yield . unit )
state . userYieldUnits = state . userYieldUnits . filter ( ( e ) =>
yieldUnitsWithRecipes . includes ( e )
2020-10-26 20:49:54 +00:00
)
2020-11-02 11:36:53 +00:00
} else {
2020-11-03 19:57:31 +00:00
userYieldUnitsDB . createDocument (
{ userYieldUnits : [ ] } ,
"userYieldUnits"
)
2020-10-26 20:49:54 +00:00
}
2020-11-02 11:36:53 +00:00
state . yieldUnits = [ ... defaultYieldUnits , ... state . userYieldUnits ]
2020-10-26 20:49:54 +00:00
} ,
2020-11-23 09:49:58 +00:00
initializeMealPlans ( state ) {
let isMealPlansDBStored = mealPlansDB . query ( { select : [ ] } ) . length
if ( isMealPlansDBStored ) {
state . mealPlans = mealPlansDB . getDocument ( "mealPlans" ) . mealPlans
} else {
mealPlansDB . createDocument ( { mealPlans : [ ] } , "mealPlans" )
}
2020-11-06 09:07:41 +00:00
} ,
2020-11-23 09:49:58 +00:00
2020-11-06 09:07:41 +00:00
importRecipes ( state , recipes ) {
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 ) {
state . recipes = [ ... state . recipes , ... data ]
data . forEach ( ( recipe ) => {
EnRecipesDB . createDocument ( recipe , recipe . id )
} )
}
function updateDocuments ( data ) {
data . forEach ( ( recipe ) => {
let recipeIndex = state . recipes
2020-11-23 09:49:58 +00:00
. map ( ( e , i ) => {
let d1 = new Date ( e . lastModified ) . getTime ( )
let d2 = new Date ( recipe . lastModified ) . getTime ( )
return e . id === recipe . id && d1 < d2 ? i : - 1
} )
2020-11-06 09:07:41 +00:00
. filter ( ( e ) => e >= 0 ) [ 0 ]
2020-11-23 09:49:58 +00:00
if ( recipeIndex >= 0 ) {
Object . assign ( state . recipes [ recipeIndex ] , recipe )
EnRecipesDB . updateDocument ( recipe . id , recipe )
}
2020-11-06 09:07:41 +00:00
} )
}
2020-10-26 20:49:54 +00:00
} ,
2020-11-23 09:49:58 +00:00
importCategories ( state , categories ) {
state . userCategories = new Set ( [ ... state . userCategories , ... categories ] )
userCategoriesDB . updateDocument ( "userCategories" , {
userCategories : [ ... state . userCategories ] ,
} )
state . categories = [ ... defaultCategories , ... state . userCategories ]
state . categories . sort ( )
} ,
importYieldUnits ( state , yieldUnits ) {
state . userYieldUnits = new Set ( [ ... state . userYieldUnits , ... yieldUnits ] )
userYieldUnitsDB . updateDocument ( "userYieldUnits" , {
userYieldUnits : [ ... state . userYieldUnits ] ,
} )
state . yieldUnits = [ ... defaultYieldUnits , ... state . userYieldUnits ]
} ,
importMealPlans ( state , mealPlans ) {
let newMealPlans = mealPlans . filter (
( e ) =>
! state . mealPlans . some (
( f ) => f . title === e . title && f . startDate === e . startDate
)
)
state . mealPlans = [ ... state . mealPlans , ... newMealPlans ]
mealPlansDB . updateDocument ( "mealPlans" , {
mealPlans : [ ... state . mealPlans ] ,
} )
} ,
addRecipe ( state , { id , recipe } ) {
state . recipes . push ( recipe )
EnRecipesDB . createDocument ( recipe , id )
} ,
2020-10-26 20:49:54 +00:00
addCategory ( state , category ) {
2020-11-02 11:36:53 +00:00
let lowercase = state . categories . map ( ( e ) => e . toLowerCase ( ) )
if ( lowercase . indexOf ( category . toLowerCase ( ) ) == - 1 ) {
state . userCategories . push ( category )
2020-11-03 19:57:31 +00:00
userCategoriesDB . updateDocument ( "userCategories" , {
2020-11-02 11:36:53 +00:00
userCategories : [ ... state . userCategories ] ,
} )
state . categories = [ ... defaultCategories , ... state . userCategories ]
2020-10-26 20:49:54 +00:00
state . categories . sort ( )
2020-11-02 11:36:53 +00:00
}
} ,
2020-11-06 09:07:41 +00:00
addYieldUnit ( state , yieldUnit ) {
2020-11-02 11:36:53 +00:00
let lowercase = state . yieldUnits . map ( ( e ) => e . toLowerCase ( ) )
2020-11-06 09:07:41 +00:00
if ( lowercase . indexOf ( yieldUnit . toLowerCase ( ) ) == - 1 ) {
state . userYieldUnits . push ( yieldUnit )
2020-11-03 19:57:31 +00:00
userYieldUnitsDB . updateDocument ( "userYieldUnits" , {
2020-11-02 11:36:53 +00:00
userYieldUnits : [ ... state . userYieldUnits ] ,
2020-10-26 20:49:54 +00:00
} )
2020-11-02 11:36:53 +00:00
state . yieldUnits = [ ... defaultYieldUnits , ... state . userYieldUnits ]
2020-10-26 20:49:54 +00:00
}
} ,
2020-11-23 09:49:58 +00:00
addMealPlan ( state , { event , eventColor } ) {
state . mealPlans . push ( {
title : event . title ,
startDate : event . startDate ,
endDate : event . endDate ,
eventColor ,
} )
mealPlansDB . updateDocument ( "mealPlans" , {
mealPlans : [ ... state . mealPlans ] ,
2020-11-06 09:07:41 +00:00
} )
2020-10-26 20:49:54 +00:00
} ,
2020-11-23 09:49:58 +00:00
2020-10-26 20:49:54 +00:00
deleteRecipe ( state , { index , id } ) {
2020-11-03 19:57:31 +00:00
getFileAccess ( ) . deleteFile ( state . recipes [ index ] . imageSrc )
2020-10-26 20:49:54 +00:00
state . recipes . splice ( index , 1 )
2020-11-06 09:07:41 +00:00
EnRecipesDB . deleteDocument ( id )
2020-11-15 10:51:10 +00:00
state . recipes . forEach ( ( e , i ) => {
if ( e . combinations . includes ( id ) ) {
state . recipes [ i ] . combinations . splice ( e . combinations . indexOf ( id ) , 1 )
EnRecipesDB . updateDocument ( state . recipes [ i ] . id , state . recipes [ i ] )
}
} )
2020-10-26 20:49:54 +00:00
} ,
2020-11-23 09:49:58 +00:00
deleteMealPlan ( state , { title , startDate } ) {
let mealPlan = state . mealPlans . filter ( ( e ) => {
console . log ( e . startDate , startDate )
let sd = new Date ( e . startDate ) . getTime ( )
return e . title === title && sd === startDate . getTime ( )
} ) [ 0 ]
let index = state . mealPlans . indexOf ( mealPlan )
state . mealPlans . splice ( index , 1 )
state . mealPlans = [ ... state . mealPlans ]
let mealPlans = mealPlansDB . getDocument ( "mealPlans" ) . mealPlans
mealPlans . splice ( index , 1 )
mealPlansDB . updateDocument ( "mealPlans" , {
mealPlans : [ ... mealPlans ] ,
} )
} ,
overwriteRecipe ( state , { id , recipe } ) {
let index = state . recipes . indexOf (
state . recipes . filter ( ( e ) => e . id === id ) [ 0 ]
)
Object . assign ( state . recipes [ index ] , recipe )
EnRecipesDB . updateDocument ( id , recipe )
} ,
2020-11-15 10:51:10 +00:00
toggleState ( state , { id , recipe , key , setDate } ) {
let index = state . recipes . indexOf (
state . recipes . filter ( ( e ) => e . id === id ) [ 0 ]
)
2020-10-26 20:49:54 +00:00
state . recipes [ index ] [ key ] = ! state . recipes [ index ] [ key ]
2020-11-02 11:36:53 +00:00
if ( setDate ) state . recipes [ index ] . lastTried = new Date ( )
2020-11-06 09:07:41 +00:00
EnRecipesDB . updateDocument ( id , recipe )
2020-10-26 20:49:54 +00:00
} ,
2020-11-17 21:21:08 +00:00
setRecipeAsTried ( state , { id , recipe } ) {
let index = state . recipes . indexOf (
state . recipes . filter ( ( e ) => e . id === id ) [ 0 ]
)
state . recipes [ index ] . tried = true
state . recipes [ index ] . lastTried = new Date ( )
EnRecipesDB . updateDocument ( id , recipe )
} ,
2020-11-02 11:36:53 +00:00
setLastTriedDate ( state , index ) {
state . recipes [ index ] . lastTried = new Date ( )
2020-11-06 09:07:41 +00:00
EnRecipesDB . updateDocument ( state . recipes [ index ] . id , state . recipes [ index ] )
2020-11-02 11:36:53 +00:00
} ,
2020-10-26 20:49:54 +00:00
renameCategory ( state , { current , updated } ) {
2020-11-02 11:36:53 +00:00
let lowercase = state . categories . map ( ( e ) => e . toLowerCase ( ) )
if ( lowercase . indexOf ( updated . toLowerCase ( ) ) == - 1 ) {
state . userCategories . push ( updated )
2020-11-03 19:57:31 +00:00
userCategoriesDB . updateDocument ( "userCategories" , {
2020-11-02 11:36:53 +00:00
userCategories : [ ... state . userCategories ] ,
2020-10-26 20:49:54 +00:00
} )
2020-11-02 11:36:53 +00:00
state . categories = [ ... defaultCategories , ... state . userCategories ]
state . categories . sort ( )
2020-10-26 20:49:54 +00:00
}
state . recipes . forEach ( ( e , i ) => {
if ( e . category == current ) {
state . recipes [ i ] . category = updated
2020-11-06 09:07:41 +00:00
EnRecipesDB . inBatch ( ( ) => {
EnRecipesDB . updateDocument ( state . recipes [ i ] . id , state . recipes [ i ] )
2020-10-26 20:49:54 +00:00
} )
}
} )
} ,
2020-11-23 09:49:58 +00:00
setCurrentComponent ( state , comp ) {
state . currentComponent = comp
} ,
2020-11-15 10:51:10 +00:00
unSyncCombinations ( state , { id , combinations } ) {
state . recipes . forEach ( ( e , i ) => {
if ( combinations . includes ( e . id ) ) {
state . recipes [ i ] . combinations . splice ( e . combinations . indexOf ( id ) , 1 )
EnRecipesDB . updateDocument ( state . recipes [ i ] . id , state . recipes [ i ] )
}
} )
} ,
2020-09-15 11:10:16 +00:00
} ,
actions : {
2020-10-26 20:49:54 +00:00
initializeRecipes ( { commit } ) {
commit ( "initializeRecipes" )
} ,
initializeCategories ( { commit } ) {
commit ( "initializeCategories" )
} ,
2020-11-02 11:36:53 +00:00
initializeYieldUnits ( { commit } ) {
commit ( "initializeYieldUnits" )
} ,
2020-11-23 09:49:58 +00:00
initializeMealPlans ( { commit } ) {
commit ( "initializeMealPlans" )
2020-10-26 20:49:54 +00:00
} ,
2020-11-23 09:49:58 +00:00
2020-11-06 09:07:41 +00:00
importRecipesAction ( { commit } , recipes ) {
commit ( "importRecipes" , recipes )
} ,
importCategoriesAction ( { commit } , categories ) {
commit ( "importCategories" , categories )
} ,
2020-11-23 09:49:58 +00:00
importYieldUnitsAction ( { commit } , yieldUnits ) {
commit ( "importYieldUnits" , yieldUnits )
} ,
importMealPlansAction ( { commit } , mealPlans ) {
commit ( "importMealPlans" , mealPlans )
} ,
addRecipeAction ( { commit } , recipe ) {
commit ( "addRecipe" , recipe )
} ,
2020-11-02 11:36:53 +00:00
addYieldUnitAction ( { commit } , yieldUnit ) {
commit ( "addYieldUnit" , yieldUnit )
} ,
2020-11-23 09:49:58 +00:00
addCategoryAction ( { commit } , category ) {
commit ( "addCategory" , category )
2020-11-06 09:07:41 +00:00
} ,
2020-11-23 09:49:58 +00:00
addMealPlanAction ( { commit } , mealPlan ) {
commit ( "addMealPlan" , mealPlan )
} ,
deleteMealPlanAction ( { commit } , mealPlan ) {
commit ( "deleteMealPlan" , mealPlan )
2020-10-26 20:49:54 +00:00
} ,
deleteRecipeAction ( { commit } , recipe ) {
commit ( "deleteRecipe" , recipe )
} ,
2020-11-23 09:49:58 +00:00
overwriteRecipeAction ( { commit } , updatedRecipe ) {
commit ( "overwriteRecipe" , updatedRecipe )
} ,
2020-10-26 20:49:54 +00:00
toggleStateAction ( { commit } , toggledRecipe ) {
commit ( "toggleState" , toggledRecipe )
} ,
2020-11-17 21:21:08 +00:00
setRecipeAsTriedAction ( { commit } , recipe ) {
commit ( "setRecipeAsTried" , recipe )
} ,
2020-11-02 11:36:53 +00:00
setLastTriedDateAction ( { commit } , index ) {
commit ( "setLastTriedDate" , index )
} ,
2020-10-26 20:49:54 +00:00
renameCategoryAction ( { commit } , category ) {
commit ( "renameCategory" , category )
} ,
2020-11-23 09:49:58 +00:00
setCurrentComponentAction ( { commit } , comp ) {
commit ( "setCurrentComponent" , comp )
} ,
2020-11-15 10:51:10 +00:00
unSyncCombinationsAction ( { commit } , combinations ) {
commit ( "unSyncCombinations" , combinations )
} ,
2020-10-14 19:32:32 +00:00
} ,
} )