2020-09-15 11:10:16 +00:00
< template >
2020-12-07 14:45:00 +00:00
< Page @loaded ="onPageLoad" @unloaded ="onPageUnload" >
< ActionBar : androidElevation = "viewIsScrolled ? 4 : 0" >
< GridLayout v-if = "showSearch" columns="auto, *" verticalAlignment="center" >
< MDButton class = "bx" :text = "icon.back" variant = "text" automationText = "Back" col = "0" @tap ="closeSearch" / >
2020-12-29 10:35:19 +00:00
< SearchBar col = "1" : hint = "'Search' | L" v-model = "searchQuery" @textChange="updateFilter" @clear="clearSearch" / >
2020-12-07 14:45:00 +00:00
< / GridLayout >
< GridLayout v -else columns = "auto, *, auto, auto" >
< MDButton class = "bx" col = "0" variant = "text" @tap ="showDrawer" :text = "icon.menu" automationText = "Back" / >
< Label class = "title orkm" : text = "`${currentComponent}` | L" col = "1" / >
< MDButton v-if = "recipes.length" class="bx" :text="icon.search" variant="text" col="2" @tap="openSearch" / >
< MDButton v-if = "recipes.length" class="bx" :text="icon.sort" variant="text" col="3" @tap="sortDialog" / >
< / GridLayout >
< / ActionBar >
< AbsoluteLayout >
2020-12-29 10:35:19 +00:00
< RadListView ref = "listView" itemHeight = "104" for = "recipe in recipes" swipeActions = "true" @itemSwipeProgressChanged ="onSwiping" @itemSwipeProgressEnded ="onSwipeEnded" @scrolled ="onScroll" :filteringFunction = "filterFunction"
2020-12-07 14:45:00 +00:00
: sortingFunction = "sortFunction" >
2020-12-29 10:35:19 +00:00
< v-template name = "header" >
< StackLayout height = "4" > < / StackLayout >
< / v-template >
2020-12-07 14:45:00 +00:00
< v-template >
2020-12-29 10:35:19 +00:00
< GridLayout class = "recipeItem" rows = "104" columns = "104, *" androidElevation = "1" >
2020-12-07 14:45:00 +00:00
< MDRipple colSpan = "2" @tap ="viewRecipe(recipe.id)" / >
2020-12-29 10:35:19 +00:00
< GridLayout class = "imageHolder card" rows = "104" columns = "104" >
< Image row = "0" col = "0" v-if = "recipe.imageSrc" :src="recipe.imageSrc" stretch="aspectFill" decodeWidth="104" decodeHeight="104" loadMode="async" / >
2020-12-07 14:45:00 +00:00
< Label v -else row = "0" col = "0" horizontalAlignment = "center" class = "bx" fontSize = "56" :text = "icon.image" / >
< / GridLayout >
< StackLayout class = "recipeInfo" col = "1" >
2020-12-29 10:35:19 +00:00
< Label : text = "`${$options.filters.L(recipe.cuisine)} • ${$options.filters.L(recipe.category)}`" class = "category" / >
2020-12-07 14:45:00 +00:00
< Label :text = "recipe.title" class = "orkm title" / >
2020-12-29 10:35:19 +00:00
< GridLayout columns = "*" rows = "auto, *, auto" >
< StackLayout class = "attrContainer" orientation = "horizontal" row = "0" >
< Label class = "bx small" :text = "icon.starLine" / >
< Label class = "attr" :text = "recipe.rating" / >
< Label class = "bx small" :text = "icon.meter" / >
< Label class = "attr" : text = "`${recipe.difficulty}` | L" / >
< Label class = "bx small" :text = "icon.time" / >
< Label class = "attr" : text = "
` ${
formattedTotalTime ( recipe . prepTime , recipe . cookTime ) . time
} `
" / >
< / StackLayout >
< FlexboxLayout class = "tagsContainer" flexWrap = "wrap" row = "2" >
< Label v-for = "(tag, index) in recipe.tags" :key="index" v-if="tag && index < 2" class="tag" :text="tag" / >
< Label class = "collapsedTagsCount" v-if = "recipe.tags.length > 2" :text="recipe.tags.length - 2 +'+'" / >
< / FlexboxLayout >
< / GridLayout >
2020-12-07 14:45:00 +00:00
< / StackLayout >
< / GridLayout >
< / v-template >
< v-template name = "itemswipe" >
2020-12-29 10:35:19 +00:00
< GridLayout columns = "*, auto" padding = "0" >
2020-12-07 14:45:00 +00:00
< StackLayout id = "delete-action" col = "1" class = "swipe-item right" >
2020-12-29 10:35:19 +00:00
< Label class = "bx" padding = "8" :text = "icon.trash" / >
2020-12-07 14:45:00 +00:00
< / StackLayout >
< / GridLayout >
< / v-template >
< v-template name = "footer" >
2020-12-29 10:35:19 +00:00
< StackLayout height = "84" > < / StackLayout >
2020-12-07 14:45:00 +00:00
< / v-template >
< / RadListView >
< GridLayout rows = "*, auto, *, 88" columns = "*" class = "emptyStateContainer" >
< StackLayout row = "1" class = "emptyState" v -if = "
2020-11-10 18:28:48 +00:00
! recipes . length &&
2020-12-07 14:45:00 +00:00
! filterFavourites &&
2020-12-29 10:35:19 +00:00
! filterTrylater
2020-12-07 14:45:00 +00:00
" @tap=" addRecipe " >
< Label class = "bx icon" :text = "icon.plusCircle" / >
< Label class = "title orkm" : text = "'Start adding your recipes!' | L" textWrap = "true" / >
< StackLayout orientation = "horizontal" horizontalAlignment = "center" >
< Label : text = "'Use the plus button to add one' | L" textWrap = "true" / >
2020-11-10 18:28:48 +00:00
< / StackLayout >
2020-12-07 14:45:00 +00:00
< / StackLayout >
< StackLayout row = "1" class = "emptyState" v-if = "!filteredRecipes.length && filterTrylater && !searchQuery" >
2020-12-29 10:35:19 +00:00
< Label class = "bx icon" :text = "icon.trylaterLine" textWrap = "true" / >
2020-12-07 14:45:00 +00:00
< Label class = "title orkm" : text = "'All done!' | L" textWrap = "true" / >
< Label : text = "'Recipes you mark as try later will be listed here' | L" textWrap = "true" / >
< / StackLayout >
< StackLayout row = "1" class = "emptyState" v-if = "!filteredRecipes.length && filterFavourites && !searchQuery" >
2020-12-29 10:35:19 +00:00
< Label class = "bx icon" :text = "icon.heartLine" textWrap = "true" / >
2020-12-07 14:45:00 +00:00
< Label class = "title orkm" : text = "'No favourites yet' | L" textWrap = "true" / >
< Label : text = "'Recipes you mark as favourite will be listed here' | L" textWrap = "true" / >
< / StackLayout >
2020-12-29 10:35:19 +00:00
< StackLayout row = "1" class = "emptyState" v-if = "selectedCuisine && !filteredRecipes.length && !searchQuery" >
< Label class = "bx icon" :text = "icon.categoryLine" textWrap = "true" / >
2020-12-07 14:45:00 +00:00
< Label class = "title orkm" : text = "'Category looks empty' | L" textWrap = "true" / >
< StackLayout orientation = "horizontal" horizontalAlignment = "center" >
< Label : text = "'Use the plus button to add one' | L" textWrap = "true" / >
2020-10-29 20:12:53 +00:00
< / StackLayout >
2020-12-07 14:45:00 +00:00
< / StackLayout >
< StackLayout row = "1" class = "emptyState" v-if = "!filteredRecipes.length && searchQuery" >
< Label class = "bx icon" :text = "icon.search" textWrap = "true" / >
< Label class = "title orkm" : text = "'No recipes found' | L" textWrap = "true" / >
< Label : text = "`${noResultFor}` | L" textWrap = "true" / >
< / StackLayout >
< / GridLayout >
< GridLayout id = "btnFabContainer" rows = "*, auto" columns = "*, auto" >
< transition name = "bounce" >
< MDFloatingActionButton v-if = "showFAB" row="1" col="1" class="bx fab-button" src="res://plus" @tap="addRecipe" / >
< / transition >
< / GridLayout >
< / AbsoluteLayout >
< / Page >
2020-09-15 11:10:16 +00:00
< / template >
< script >
2020-12-07 14:45:00 +00:00
import {
2020-12-29 10:35:19 +00:00
ApplicationSettings ,
2020-12-07 14:45:00 +00:00
AndroidApplication ,
Utils ,
2020-12-29 10:35:19 +00:00
Observable ,
Device ,
2020-12-07 14:45:00 +00:00
}
from "@nativescript/core" ;
import {
localize
}
from "@nativescript/localize"
2020-12-29 10:35:19 +00:00
import {
time
} from "tns-core-modules/profiling"
import {
startAccelerometerUpdates ,
stopAccelerometerUpdates ,
} from "nativescript-accelerometer"
import {
Vibrate
} from 'nativescript-vibrate' ;
let vibrator = new Vibrate ( ) ;
2020-12-07 14:45:00 +00:00
import {
mapActions ,
mapState
}
from "vuex" ;
import EditRecipe from "./EditRecipe.vue" ;
import ViewRecipe from "./ViewRecipe.vue" ;
import ActionDialog from "./modal/ActionDialog.vue" ;
import ConfirmDialog from "./modal/ConfirmDialog.vue" ;
import * as utils from "~/shared/utils" ;
2020-12-29 10:35:19 +00:00
let lastTime = 0 ;
let lastShake = 0 ;
let lastForce = 0 ;
let shakeCount = 0 ;
2020-10-14 19:32:32 +00:00
export default {
2020-12-29 10:35:19 +00:00
props : [ "filterFavourites" , "filterTrylater" , "closeDrawer" , "selectedCategory" , "selectedCuisine" , "selectedTag" , "hijackGlobalBackEvent" , "releaseGlobalBackEvent" ] ,
2020-10-14 19:32:32 +00:00
components : {
EditRecipe ,
2020-12-07 14:45:00 +00:00
ViewRecipe
2020-10-14 19:32:32 +00:00
} ,
2020-09-15 11:10:16 +00:00
data ( ) {
return {
2020-10-14 19:32:32 +00:00
searchQuery : "" ,
viewIsScrolled : false ,
2020-10-21 17:54:45 +00:00
showSearch : false ,
2020-10-14 19:32:32 +00:00
rightAction : false ,
2020-10-24 18:02:35 +00:00
deletionDialogActive : false ,
2020-12-07 14:45:00 +00:00
showFAB : false
} ;
2020-09-15 11:10:16 +00:00
} ,
computed : {
2020-12-29 10:35:19 +00:00
... mapState ( [ "sortType" , "icon" , "recipes" , "currentComponent" , "shakeEnabled" ] ) ,
2020-09-15 11:10:16 +00:00
filteredRecipes ( ) {
2020-12-14 13:48:53 +00:00
let ingredients = this . recipes . map ( e => e . ingredients . map ( f => f . item . toLowerCase ( ) ) . join ( ) ) . join ( )
2020-12-29 10:35:19 +00:00
let tags = this . recipes . map ( e => e . tags . map ( f => f . toLowerCase ( ) ) . join ( ) ) . join ( )
2020-12-07 14:45:00 +00:00
if ( this . filterFavourites ) {
2020-12-29 10:35:19 +00:00
return this . recipes . filter ( e => e . isFavorite && ( tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) ) )
2020-12-14 13:48:53 +00:00
} else if ( this . filterTrylater ) {
2020-12-29 10:35:19 +00:00
return this . recipes . filter ( e => ! e . tried && ( tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) ) )
} else if ( this . selectedCuisine ) {
return this . recipes . filter ( e => {
return this . recipeFilter ( e ) && ( tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) )
} )
2020-12-14 13:48:53 +00:00
} else {
2020-12-29 10:35:19 +00:00
return this . recipes . filter ( e => tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) )
2020-09-15 11:10:16 +00:00
}
} ,
2020-11-28 19:21:57 +00:00
noResultFor ( ) {
2020-12-29 10:35:19 +00:00
if ( this . selectedCuisine ) return "Your search did not match any recipes in the filtered result" ;
2020-12-07 14:45:00 +00:00
if ( this . filterFavourites ) return "Your search did not match any recipes in your favourites" ;
if ( this . filterTrylater ) return "Your search did not match any recipes in your try later list" ;
return "Your search did not match any recipes" ;
2020-12-29 10:35:19 +00:00
} ,
2020-09-15 11:10:16 +00:00
} ,
methods : {
2020-12-29 10:35:19 +00:00
... mapActions ( [ "setCurrentComponentAction" , "setSortTypeAction" , "deleteRecipeAction" ] ) ,
2020-12-07 14:45:00 +00:00
onPageLoad ( args ) {
const page = args . object ;
page . bindingContext = new Observable ( ) ;
2020-12-29 10:35:19 +00:00
this . filterFavourites ? this . setComponent ( "Favourites" ) : this . filterTrylater ? this . setComponent ( "Try Later" ) : this . selectedCuisine ? this . setComponent ( "Filtered result" ) : this . setComponent ( "EnRecipes" ) ;
2020-12-07 14:45:00 +00:00
this . showFAB = true ;
2020-12-29 10:35:19 +00:00
if ( this . shakeEnabled ) startAccelerometerUpdates ( data => this . onSensorData ( data ) )
2020-12-07 14:45:00 +00:00
} ,
onPageUnload ( ) {
2020-12-29 10:35:19 +00:00
if ( this . shakeEnabled ) stopAccelerometerUpdates ( ) ;
2020-12-07 14:45:00 +00:00
this . releaseGlobalBackEvent ( ) ;
2020-10-24 18:02:35 +00:00
} ,
2020-11-10 18:28:48 +00:00
// HELPERS
2020-11-23 09:49:58 +00:00
showDrawer ( ) {
2020-12-07 14:45:00 +00:00
utils . showDrawer ( ) ;
2020-11-23 09:49:58 +00:00
} ,
2020-10-21 17:54:45 +00:00
openSearch ( ) {
2020-12-07 14:45:00 +00:00
this . showSearch = true ;
this . showFAB = false ;
this . hijackLocalBackEvent ( ) ;
2020-10-21 17:54:45 +00:00
} ,
2020-11-10 18:28:48 +00:00
closeSearch ( ) {
2020-12-07 14:45:00 +00:00
if ( this . searchQuery ) this . updateFilter ( ) ;
this . searchQuery = "" ;
Utils . ad . dismissSoftInput ( ) ;
this . showSearch = false ;
this . showFAB = true ;
this . releaseLocalBackEvent ( ) ;
2020-11-10 18:28:48 +00:00
} ,
2020-12-07 14:45:00 +00:00
setComponent ( comp ) {
this . setCurrentComponentAction ( comp ) ;
this . hijackGlobalBackEvent ( ) ;
2020-11-10 18:28:48 +00:00
} ,
clearSearch ( ) {
2020-12-07 14:45:00 +00:00
if ( this . searchQuery !== "" ) {
this . updateFilter ( ) ;
2020-11-10 18:28:48 +00:00
}
} ,
2020-12-07 14:45:00 +00:00
formattedTotalTime ( prepTime , cookTime ) {
let t1 = prepTime . split ( ":" ) ;
let t2 = cookTime . split ( ":" ) ;
2020-12-29 10:35:19 +00:00
let minutes = parseInt ( t1 [ 1 ] ) + parseInt ( t2 [ 1 ] )
let m = minutes % 60
let h = parseInt ( t1 [ 0 ] ) + parseInt ( t2 [ 0 ] ) + Math . floor ( minutes / 60 ) ;
2020-12-07 14:45:00 +00:00
let hr = localize ( 'hr' )
let min = localize ( 'min' )
2020-11-10 18:28:48 +00:00
return {
2020-12-07 14:45:00 +00:00
time : h ? ( m ? ` ${ h } ${ hr } ${ m } ${ min } ` : ` ${ h } ${ hr } ` ) : ` ${ m } ${ min } ` ,
duration : ` ${ h } ${ m } `
} ;
2020-11-10 18:28:48 +00:00
} ,
2020-12-07 14:45:00 +00:00
onScroll ( args ) {
this . viewIsScrolled = args . scrollOffset ? true : false ;
2020-11-10 18:28:48 +00:00
} ,
2020-12-29 10:35:19 +00:00
randomRecipeID ( ) { // TODO: show only from selected filter
let min = 0
let max = this . filteredRecipes . length - 1
let randomIndex = Math . round ( Math . random ( ) * ( max - min ) )
return this . filteredRecipes [ randomIndex ] . id
} ,
recipeFilter ( e ) {
let cuisineMatched = e . cuisine === this . selectedCuisine
let allCuisines = /All/ . test ( this . selectedCuisine )
let categoryMatched = e . category === this . selectedCategory
let allCategories = /All/ . test ( this . selectedCategory )
let tagMatched = e . tags . includes ( this . selectedTag )
let allTags = /All/ . test ( this . selectedTag )
let cuisine = cuisineMatched || allCuisines
return this . selectedTag && ! allTags ? ( categoryMatched || allCategories ) && cuisine && tagMatched : this . selectedCategory && ! allCategories ? cuisine && categoryMatched : cuisine
} ,
2020-11-10 18:28:48 +00:00
// NAVIGATION HANDLERS
2020-10-21 17:54:45 +00:00
hijackLocalBackEvent ( ) {
2020-12-07 14:45:00 +00:00
this . releaseGlobalBackEvent ( ) ;
AndroidApplication . on ( AndroidApplication . activityBackPressedEvent , this . searchBackEvent ) ;
2020-10-21 17:54:45 +00:00
} ,
releaseLocalBackEvent ( ) {
2020-12-07 14:45:00 +00:00
AndroidApplication . off ( AndroidApplication . activityBackPressedEvent , this . searchBackEvent ) ;
this . hijackGlobalBackEvent ( ) ;
2020-10-21 17:54:45 +00:00
} ,
2020-12-07 14:45:00 +00:00
searchBackEvent ( args ) {
args . cancel = true ;
this . closeDrawer ( ) ;
this . closeSearch ( ) ;
2020-10-21 17:54:45 +00:00
} ,
2020-11-10 18:28:48 +00:00
addRecipe ( ) {
2020-12-07 14:45:00 +00:00
this . showFAB = false ;
this . releaseGlobalBackEvent ( ) ;
this . $navigateTo ( EditRecipe , {
2020-11-10 18:28:48 +00:00
props : {
2020-12-29 10:35:19 +00:00
selectedCuisine : this . selectedCuisine ,
2020-11-10 18:28:48 +00:00
selectedCategory : this . selectedCategory ,
2020-12-29 10:35:19 +00:00
selectedTag : this . selectedTag ,
filterFavourites : this . filterFavourites ,
filterTrylater : this . filterTrylater ,
2020-12-07 14:45:00 +00:00
}
} ) ;
2020-10-21 17:54:45 +00:00
} ,
2020-12-07 14:45:00 +00:00
viewRecipe ( recipeID ) {
this . showFAB = false ;
this . $navigateTo ( ViewRecipe , {
2020-11-10 18:28:48 +00:00
props : {
filterTrylater : this . filterTrylater ,
2020-12-07 14:45:00 +00:00
recipeID
2020-11-10 18:28:48 +00:00
} ,
2020-12-07 14:45:00 +00:00
backstackVisible : false
} ) ;
2020-11-10 18:28:48 +00:00
} ,
2020-12-29 10:35:19 +00:00
viewRandomRecipe ( ) {
this . showFAB = false ;
this . $navigateTo ( ViewRecipe , {
props : {
filterTrylater : false ,
recipeID : this . randomRecipeID ( )
} ,
backstackVisible : false
} ) ;
} ,
2020-11-10 18:28:48 +00:00
// LIST HANDLERS
2020-10-21 17:54:45 +00:00
sortDialog ( ) {
2020-12-07 14:45:00 +00:00
this . releaseGlobalBackEvent ( ) ;
this . $showModal ( ActionDialog , {
2020-10-21 17:54:45 +00:00
props : {
title : "Sort by" ,
2020-12-29 10:35:19 +00:00
list : [ "Title" , "Quickest first" , "Slowest first" , "Rating" , "Difficulty level" , "Last updated" , "Newest first" , "Oldest first" ] ,
stretch : false
2020-12-07 14:45:00 +00:00
}
} ) . then ( action => {
if ( action && action !== "Cancel" && this . sortType !== action ) {
2020-12-29 10:35:19 +00:00
this . setSortTypeAction ( action )
ApplicationSettings . setString ( "sortType" , action )
2020-12-07 14:45:00 +00:00
this . updateSort ( ) ;
2020-10-21 17:54:45 +00:00
}
2020-12-07 14:45:00 +00:00
this . hijackGlobalBackEvent ( ) ;
} ) ;
2020-10-21 17:54:45 +00:00
} ,
updateSort ( ) {
2020-12-07 14:45:00 +00:00
let listView = this . $refs . listView . nativeView ;
listView . sortingFunction = undefined ;
listView . sortingFunction = this . sortFunction ;
2020-10-21 17:54:45 +00:00
} ,
2020-12-07 14:45:00 +00:00
sortFunction ( item , otherItem ) {
2020-12-29 10:35:19 +00:00
const titleOrder = item . title . toLowerCase ( ) . localeCompare ( otherItem . title . toLowerCase ( ) , Device . language , {
2020-12-07 14:45:00 +00:00
ignorePunctuation : true
} ) ;
let d1 = this . formattedTotalTime ( item . prepTime , item . cookTime ) . duration ;
let d2 = this . formattedTotalTime ( otherItem . prepTime , otherItem . cookTime ) . duration ;
let ld1 = new Date ( item . lastModified ) ;
let ld2 = new Date ( otherItem . lastModified ) ;
2020-12-29 10:35:19 +00:00
let cd1 = new Date ( item . created ) ;
let cd2 = new Date ( otherItem . created ) ;
let r1 = item . rating
let r2 = otherItem . rating
function difficultyLevel ( level ) {
switch ( level ) {
case "Easy" :
return 1 ;
case "Moderate" :
return 2 ;
case "Challenging" :
return 3 ;
}
}
let dl1 = difficultyLevel ( item . difficulty )
let dl2 = difficultyLevel ( otherItem . difficulty )
2020-12-07 14:45:00 +00:00
switch ( this . sortType ) {
2020-10-21 17:54:45 +00:00
case "Title" :
2020-12-07 14:45:00 +00:00
return titleOrder > 0 ? - 1 : titleOrder < 0 ? 1 : 0 ;
break ;
2020-12-29 10:35:19 +00:00
case "Quickest first" :
2020-12-07 14:45:00 +00:00
return d1 > d2 ? - 1 : d1 < d2 ? 1 : 0 ;
break ;
2020-12-29 10:35:19 +00:00
case "Slowest first" :
return d1 > d2 ? 1 : d1 < d2 ? - 1 : 0 ;
break ;
case "Rating" :
return r1 > r2 ? 1 : r1 < r2 ? - 1 : 0 ;
break ;
case "Difficulty level" :
return dl1 > dl2 ? - 1 : dl1 < dl2 ? 1 : 0 ;
break ;
case "Last updated" :
2020-12-07 14:45:00 +00:00
return ld1 < ld2 ? - 1 : ld1 > ld2 ? 1 : 0 ;
break ;
2020-12-29 10:35:19 +00:00
case "Newest first" :
return cd1 < cd2 ? - 1 : cd1 > cd2 ? 1 : 0 ;
break ;
case "Oldest first" :
return cd1 < cd2 ? 1 : cd1 > cd2 ? - 1 : 0 ;
2020-12-07 14:45:00 +00:00
break ;
2020-10-21 17:54:45 +00:00
}
} ,
updateFilter ( ) {
2020-12-07 14:45:00 +00:00
let listView = this . $refs . listView . nativeView ;
setTimeout ( e => {
listView . filteringFunction = undefined ;
listView . filteringFunction = this . filterFunction ;
} , 1 ) ;
2020-10-21 17:54:45 +00:00
} ,
2020-12-29 10:35:19 +00:00
filterFunction ( e ) {
let ingredients = e . ingredients . map ( e => e . item . toLowerCase ( ) ) . join ( )
let tags = e . tags . map ( e => e . toLowerCase ( ) ) . join ( )
2020-12-07 14:45:00 +00:00
if ( this . filterFavourites ) {
2020-12-29 10:35:19 +00:00
return e . isFavorite ? tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) : false ;
2020-12-14 13:48:53 +00:00
} else if ( this . filterTrylater ) {
2020-12-29 10:35:19 +00:00
return e . tried ? false : tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) ;
} else if ( this . selectedCuisine ) {
return this . recipeFilter ( e ) ? tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) : false ;
2020-12-14 13:48:53 +00:00
} else {
2020-12-29 10:35:19 +00:00
return tags . includes ( this . searchQuery ) || e . title . toLowerCase ( ) . includes ( this . searchQuery ) || ingredients . includes ( this . searchQuery ) ;
2020-10-21 17:54:45 +00:00
}
} ,
2020-12-07 14:45:00 +00:00
onSwiping ( {
data ,
object
} ) {
const swipeLimits = data . swipeLimits ;
const swipeView = object ;
const rightItem = swipeView . getViewById ( "delete-action" ) ;
2020-12-29 10:35:19 +00:00
swipeLimits . right = rightItem . getMeasuredWidth ( ) - 8 ;
swipeLimits . threshold = swipeLimits . right - 4 ;
2020-12-07 14:45:00 +00:00
if ( data . x < - swipeLimits . threshold ) {
this . rightAction = true ;
swipeView . notifySwipeToExecuteFinished ( ) ;
2020-10-14 19:32:32 +00:00
}
} ,
2020-12-07 14:45:00 +00:00
onSwipeEnded ( {
index
} ) {
let recipeID = this . recipes [ index ] . id ;
if ( this . rightAction && ! this . deletionDialogActive ) this . deleteRecipe ( index , recipeID ) ;
this . rightAction = false ;
2020-10-14 19:32:32 +00:00
} ,
2020-11-10 18:28:48 +00:00
// DATA HANDLERS
2020-12-07 14:45:00 +00:00
deleteRecipe ( index , recipeID ) {
this . deletionDialogActive = true ;
this . $showModal ( ConfirmDialog , {
2020-10-21 17:54:45 +00:00
props : {
2020-12-07 14:45:00 +00:00
title : localize ( "Delete recipe?" ) ,
description : ` ${ localize ( 'Are you sure you want to delete the recipe' ) } " ${ this . recipes [ index ] . title } "? ` ,
2020-10-21 17:54:45 +00:00
cancelButtonText : "CANCEL" ,
2020-12-07 14:45:00 +00:00
okButtonText : "DELETE"
2020-10-21 17:54:45 +00:00
}
2020-12-07 14:45:00 +00:00
} ) . then ( action => {
if ( action ) {
this . deleteRecipeAction ( {
index ,
id : recipeID
} ) ;
}
this . deletionDialogActive = false ;
} ) ;
2020-12-29 10:35:19 +00:00
} ,
// SHAKE DETECTOR
onSensorData ( {
x ,
y ,
z
} ) {
x = x . toFixed ( 2 )
y = y . toFixed ( 2 )
z = z . toFixed ( 2 )
const FORCE _THRESHOLD = 1 ;
const TIME _THRESHOLD = 150 ;
const SHAKE _TIMEOUT = 600 ;
const SHAKE _THROTTLE = 600 ;
const SHAKE _COUNT = 3 ;
const now = time ( )
if ( ( now - lastForce ) > SHAKE _TIMEOUT ) {
shakeCount = 0 ;
}
let timeDelta = now - lastTime ;
if ( timeDelta > TIME _THRESHOLD ) {
let forceVector = Math . abs ( Math . sqrt ( Math . pow ( x , 2 ) + Math . pow ( y , 2 ) + Math . pow ( z , 2 ) ) - 1 ) ;
if ( forceVector > FORCE _THRESHOLD ) {
shakeCount ++ ;
if ( ( shakeCount >= SHAKE _COUNT ) && ( now - lastShake > SHAKE _THROTTLE ) ) {
lastShake = now ;
shakeCount = 0 ;
if ( this . filteredRecipes . length ) {
vibrator . vibrate ( 100 )
this . viewRandomRecipe ( )
}
}
lastForce = now ;
}
lastTime = now ;
}
} ,
2020-09-15 11:10:16 +00:00
} ,
2020-10-29 20:12:53 +00:00
mounted ( ) {
2020-12-07 14:45:00 +00:00
this . showFAB = true ;
}
} ;
2020-09-15 11:10:16 +00:00
< / script >