diff --git a/README.md b/README.md
index 5a0978cc..cc79e3a5 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
You can also get the latest release on GitHub
+
You can also get the latest release on GitHub
Enjoying EnRecipes?
Please consider making a small donation to help fund the project. Developing an application, especially one that is open source and completely free, takes a lot of time and effort.
diff --git a/app/ForegroundService.js b/app/ForegroundService.js
new file mode 100644
index 00000000..3f2ac675
--- /dev/null
+++ b/app/ForegroundService.js
@@ -0,0 +1,39 @@
+import { TimerNotif } from './shared/utils'
+const superProto = android.app.Service.prototype
+android.app.Service.extend('com.tns.ForegroundService', {
+ onStartCommand: function(intent, flags, startId) {
+ console.log('onStartCommand')
+ superProto.onStartCommand.call(this, intent, flags, startId)
+ return android.app.Service.START_STICKY
+ },
+ onCreate: function() {
+ console.log('onCreate')
+ superProto.onCreate.call(this)
+ this.startForeground(777, this.getNotification())
+ },
+ onBind: function(intent) {
+ return superProto.onBind.call(this, intent)
+ },
+ onUnbind: function(intent) {
+ return superProto.onUnbind.call(this, intent)
+ },
+ onDestroy: function() {
+ console.log('onDestroy')
+ this.stopForeground(true)
+ },
+ getNotification: function() {
+ return TimerNotif.getNotification(
+ {
+ bID: 'bringToFront',
+ cID: 'cti',
+ cName: 'Cooking Timer info',
+ description: `0 ongoing, 0 paused`,
+ nID: 777,
+ priority: -2,
+ sound: null,
+ title: 'EnRecipes is running',
+ },
+ this.getApplicationContext()
+ )
+ },
+})
diff --git a/app/app.scss b/app/app.scss
index 6741df01..885ddbb7 100644
--- a/app/app.scss
+++ b/app/app.scss
@@ -12,11 +12,11 @@ $gray10: #000000;
$orange: #ff5200;
Page {
- font-family: "Inter-Medium";
+ font-family: 'Inter-Medium';
font-size: 14;
}
.ico {
- font-family: "enrecipes";
+ font-family: 'enrecipes';
font-size: 24;
vertical-alignment: center;
&.sm {
@@ -25,7 +25,7 @@ Page {
}
}
.tb {
- font-family: "Inter-Bold";
+ font-family: 'Inter-Bold';
}
.tac {
text-align: center;
@@ -180,7 +180,7 @@ TextView {
.progressContainer {
width: 100%;
}
-Progress {
+progress {
margin: 16;
background-color: $gray5;
}
@@ -203,7 +203,7 @@ Switch {
@extend .hl;
}
}
-Button {
+button {
background-color: transparent;
z-index: 0;
padding: 8;
@@ -240,7 +240,7 @@ Button {
width: 32;
height: 32;
min-width: 0;
- margin: 0 0 0 8;
+ margin: 0 0 0 4;
vertical-alignment: center;
}
&.rate {
@@ -253,7 +253,7 @@ Button {
// HOME
.emptyState {
padding: 16 16 8;
- Label {
+ label {
@extend .tw;
}
.title {
@@ -312,6 +312,25 @@ Button {
border-radius: 12;
}
// -----------------------------
+// COOKING TIMER
+
+.singleTimer {
+ padding: 8 16;
+ .info {
+ margin: 8;
+ }
+ .recipeTitle {
+ horizontal-alignment: left;
+ // font-size: 12;
+ }
+ progress {
+ color: $orange;
+ width: 100%;
+ height: 4;
+ margin: 8 0 0;
+ }
+}
+// -----------------------------
// SETTINGS
.group-info {
padding: 16 16 16 72;
@@ -334,9 +353,9 @@ Button {
font-size: 12;
}
}
- .listSpace {
- height: 72;
- }
+}
+.listSpace {
+ height: 72;
}
// -----------------------------
@@ -376,9 +395,9 @@ Button {
@extend .tb;
@extend .tw;
}
- .clickable {
- color: $orange;
- }
+}
+.clickable {
+ color: $orange;
}
.ingredient {
padding: 0 16;
@@ -452,7 +471,7 @@ Button {
horizontal-alignment: left;
.tool {
padding: 0 12;
- Label {
+ label {
vertical-alignment: center;
}
.ico {
@@ -509,7 +528,7 @@ Button {
color: $orange;
}
.activeDay {
- background-color: rgba($orange, 0.2);
+ @extend .hl;
}
}
.dayPlan {
@@ -549,7 +568,8 @@ Button {
}
ListPicker {
width: 25%;
- height: 160;
+ height: 128;
+ margin: 16 0;
}
.listItem {
@extend .tw;
@@ -596,19 +616,34 @@ ActivityIndicator {
}
// -----------------------------
// Transitions
+.blink {
+ animation-name: blink;
+ animation-duration: 1s;
+ animation-iteration-count: infinite;
+ animation-timing-function: ease;
+}
+@keyframes blink {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
.hl {
animation-name: hl;
animation-duration: 0.2s;
animation-fill-mode: forwards;
- animation-timing-function: ease-out;
+ animation-timing-function: ease;
}
@keyframes hl {
0% {
- opacity: 0.5;
background-color: transparent;
}
100% {
- opacity: 1;
background-color: rgba($orange, 0.2);
}
}
@@ -616,7 +651,7 @@ ActivityIndicator {
animation-name: fade;
animation-duration: 0.2s;
animation-fill-mode: forwards;
- animation-timing-function: ease-out;
+ animation-timing-function: ease;
}
@keyframes fade {
0% {
diff --git a/app/components/CookingTimer.vue b/app/components/CookingTimer.vue
new file mode 100644
index 00000000..1f70c6a7
--- /dev/null
+++ b/app/components/CookingTimer.vue
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/EditRecipe.vue b/app/components/EditRecipe.vue
index 588de825..516b4c76 100644
--- a/app/components/EditRecipe.vue
+++ b/app/components/EditRecipe.vue
@@ -10,8 +10,8 @@
-
-
-
+
+
+
@@ -276,7 +294,6 @@
diff --git a/app/components/GroceryList.vue b/app/components/GroceryList.vue
index 1ca66b4e..83dab81f 100644
--- a/app/components/GroceryList.vue
+++ b/app/components/GroceryList.vue
@@ -28,9 +28,8 @@ export default {
},
methods: {
...mapActions(["setComponent"]),
- onPageLoad(args) {
- const page = args.object;
- page.bindingContext = new Observable();
+ onPageLoad({ object }) {
+ object.bindingContext = new Observable();
this.setComponent("GroceryList");
},
// HELPERS
diff --git a/app/components/MealPlanner.vue b/app/components/MealPlanner.vue
index c487e932..fc79faab 100644
--- a/app/components/MealPlanner.vue
+++ b/app/components/MealPlanner.vue
@@ -7,7 +7,15 @@
scrollBarIndicatorVisible="false"
>
-
+
+
+
+
-
-
-
-
-
+ :count="countdown"
+ :msg="snackMsg"
+ :undo="undoDel"
+ :action="hideUndoBar"
+ />
diff --git a/app/components/Settings.vue b/app/components/Settings.vue
deleted file mode 100644
index ce61445d..00000000
--- a/app/components/Settings.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/Settings/CTSettings.vue b/app/components/Settings/CTSettings.vue
deleted file mode 100644
index 7c801bf5..00000000
--- a/app/components/Settings/CTSettings.vue
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/Settings/Options.vue b/app/components/Settings/Options.vue
deleted file mode 100644
index 892434c6..00000000
--- a/app/components/Settings/Options.vue
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/Settings/Reset.vue b/app/components/Settings/Reset.vue
deleted file mode 100644
index a07468bf..00000000
--- a/app/components/Settings/Reset.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/ViewRecipe.vue b/app/components/ViewRecipe.vue
index 49609b4c..5742d458 100644
--- a/app/components/ViewRecipe.vue
+++ b/app/components/ViewRecipe.vue
@@ -26,8 +26,8 @@
@@ -183,7 +184,7 @@
@loaded="onAppBarLoad"
class="appbar"
v-show="!toast"
- columns="auto, *, auto, auto, auto, auto"
+ columns="auto, *, auto, auto, auto, auto, auto"
>
+
-
+
-
+
-
-
-
-
-
+
(object.cancel = true)"
backgroundColor="black"
stretch="aspectFit"
@loaded="onImgViewLoad"
- :src="recipe.imageSrc"
+ :src="recipe.image"
class="photoviewer"
/>
@@ -266,11 +263,14 @@ import {
import { localize } from "@nativescript/localize";
const intl = require("nativescript-intl");
import { mapActions, mapState } from "vuex";
+import CookingTimer from "./CookingTimer.vue";
import EditRecipe from "./EditRecipe.vue";
-import ActionDialog from "./modal/ActionDialog.vue";
-import PromptDialog from "./modal/PromptDialog.vue";
+import Action from "./modals/Action.vue";
+import Toast from "./sub/Toast.vue";
+import Prompt from "./modals/Prompt.vue";
import * as utils from "~/shared/utils";
export default {
+ components: { Toast },
props: ["filterTrylater", "recipeID"],
data() {
return {
@@ -325,18 +325,15 @@ export default {
...mapActions([
"toggleStateAction",
"setComponent",
- "overwriteRecipeAction",
- "setRecipeAsTriedAction",
"setRatingAction",
"toggleCartAction",
]),
- onPageLoad(args) {
- const page = args.object;
- page.bindingContext = new Observable();
+ onPageLoad({ object }) {
+ object.bindingContext = new Observable();
this.busy = this.photoOpen = false;
this.setComponent("ViewRecipe");
- if (this.yieldMultiplier == this.recipe.yield.quantity)
- this.yieldMultiplier = this.recipe.yield.quantity;
+ if (this.yieldMultiplier == this.recipe.yieldQuantity)
+ this.yieldMultiplier = this.recipe.yieldQuantity;
this.keepScreenOn(true);
this.syncCombinations();
},
@@ -374,7 +371,6 @@ export default {
onStickyLoad({ object }) {
this.sticky = object;
},
- // FIX: scroll not smooth
fixTitle({ object }, swipeUp: boolean): void {
let ingL = this.recipe.ingredients.length;
let insL = this.recipe.instructions.length;
@@ -394,17 +390,6 @@ export default {
{ length: 4 },
(v, i) => (v = arr[i] ? i < n : false)
);
- // this.sticky
- // .animate({
- // opacity: 0.5,
- // duration: 0,
- // })
- // .then(() => {
- // this.sticky.animate({
- // opacity: 1,
- // duration: 250,
- // });
- // });
};
if (swipeUp) {
@@ -467,9 +452,9 @@ export default {
return localize(title) + text;
},
changeYield() {
- this.$showModal(PromptDialog, {
+ this.$showModal(Prompt, {
props: {
- title: `${localize("req", localize(this.recipe.yield.unit))}`,
+ title: `${localize("req", localize(this.recipe.yieldUnit))}`,
placeholder: Math.abs(parseFloat(this.yieldMultiplier)),
action: "SET",
},
@@ -480,8 +465,7 @@ export default {
hasTime(time) {
return time != "00:00";
},
- niceDate(time) {
- let lastTried = new Date(time).getTime();
+ niceDate(lastTried) {
let now = new Date().getTime();
let midnight = new Date().setHours(0, 0, 0, 0);
let diff = (now - lastTried) / 1000;
@@ -506,19 +490,40 @@ export default {
if (!val) this.toast = val;
});
},
+ hideLastTried({ object }) {
+ object
+ .animate({
+ opacity: 0,
+ translate: { x: 0, y: 64 },
+ duration: 250,
+ curve: CoreTypes.AnimationCurve.ease,
+ })
+ .then(() => {
+ this.showUndo = false;
+ this.appbar.translateY = 64;
+ this.appbar.animate({
+ translate: { x: 0, y: 0 },
+ duration: 250,
+ curve: CoreTypes.AnimationCurve.ease,
+ });
+ object.opacity = 1;
+ object.translateY = 0;
+ this.toast = null;
+ });
+ },
// getMeasure(value: number, unit: string) {
// let vm = this;
// function roundedQ(val: number) {
// return Math.abs(
// Math.round(
- // (val / vm.recipe.yield.quantity) * vm.tempYieldQuantity * 100
+ // (val / vm.recipe.yieldQuantity) * vm.tempYieldQuantity * 100
// ) / 100
// );
// }
// if (value) {
// let rounded = Math.abs(
// Math.round(
- // (value / this.recipe.yield.quantity) * this.tempYieldQuantity * 100
+ // (value / this.recipe.yieldQuantity) * this.tempYieldQuantity * 100
// ) / 100
// );
// let lUnit = localize(unit);
@@ -551,7 +556,7 @@ export default {
roundedQuantity(quantity: number) {
return Math.abs(
Math.round(
- (quantity / this.recipe.yield.quantity) * this.tempYieldQuantity * 100
+ (quantity / this.recipe.yieldQuantity) * this.tempYieldQuantity * 100
) / 100
);
},
@@ -598,10 +603,10 @@ export default {
)
.map((e) => e.id);
this.recipe.combinations = combinationForOtherRecipes;
- this.overwriteRecipeAction({
- id: this.currentRecipeID,
- recipe: this.recipe,
- });
+ // this.overwriteRecipeAction({
+ // id: this.currentRecipeID,
+ // recipe: this.recipe,
+ // });
},
touchIngredient({ object, action }, index) {
object.className = action.match(/down|move/)
@@ -672,14 +677,14 @@ export default {
this.currentRecipeID = combination;
this.syncCombinations();
this.createNotes();
- this.yieldMultiplier = this.recipe.yield.quantity;
+ this.yieldMultiplier = this.recipe.yieldQuantity;
this.recipe.tried && this.recipe.lastTried && this.showLastTried();
},
// SHARE ACTION
shareHandler() {
- if (this.recipe.imageSrc) {
- this.$showModal(ActionDialog, {
+ if (this.recipe.image) {
+ this.$showModal(Action, {
props: {
title: "shr",
list: ["rec", "pht"],
@@ -690,7 +695,7 @@ export default {
this.shareRecipe();
break;
case "pht":
- ImageSource.fromFile(this.recipe.imageSrc).then((res) =>
+ ImageSource.fromFile(this.recipe.image).then((res) =>
utils.shareImage(res, localize("srpu"))
);
break;
@@ -718,7 +723,7 @@ export default {
this.recipe.cookTime
)}\n`;
overview += `${localize("yld")}: ${this.tempYieldQuantity} ${localize(
- this.recipe.yield.unit
+ this.recipe.yieldUnit
)}\n${localize("Difficulty level")}: ${localize(
this.recipe.difficulty
)}\n`;
@@ -765,26 +770,18 @@ export default {
},
// DATA HANDLERS
- toggle(key, setDate) {
+ toggle(key: string, setDate: boolean) {
this.toggleStateAction({
id: this.currentRecipeID,
- recipe: this.recipe,
key,
setDate,
});
- },
- recipeTried() {
- this.setRecipeAsTriedAction({
- id: this.currentRecipeID,
- recipe: this.recipe,
- });
- this.$navigateBack();
+ if (setDate) this.$navigateBack();
},
setRating(rating) {
if (rating !== this.recipe.rating || rating === 1) {
this.setRatingAction({
id: this.currentRecipeID,
- recipe: this.recipe,
rating,
});
}
@@ -797,7 +794,6 @@ export default {
}
this.toggleCartAction({
id: this.currentRecipeID,
- recipe: this.recipe,
});
},
@@ -855,7 +851,6 @@ export default {
} else this.$navigateBack();
},
viewPhoto() {
- // this.imgView.initNativeView();
this.photoOpen = true;
this.hijackBackEvent();
let pv = this.imgView;
@@ -920,6 +915,14 @@ export default {
this.photoOpen ? this.closePhoto() : this.$navigateBack();
},
+ //TIMERS
+ openCookingTimer() {
+ this.$navigateTo(CookingTimer, {
+ props: {
+ recipeID: this.recipe.id,
+ },
+ });
+ },
//HELPERS
touchYield({ object, action }) {
object.className = action.match(/down|move/)
@@ -933,7 +936,7 @@ export default {
this.recipe.ingredients.forEach((e) => this.checks.push(false));
},
mounted() {
- this.yieldMultiplier = this.recipe.yield.quantity;
+ this.yieldMultiplier = this.recipe.yieldQuantity;
this.recipe.tried && this.recipe.lastTried && this.showLastTried();
},
};
diff --git a/app/components/modal/ActionDialog.vue b/app/components/modals/Action.vue
similarity index 97%
rename from app/components/modal/ActionDialog.vue
rename to app/components/modals/Action.vue
index ee69d937..5ec66390 100644
--- a/app/components/modal/ActionDialog.vue
+++ b/app/components/modals/Action.vue
@@ -50,7 +50,7 @@
import { Screen } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
-import ConfirmDialog from "./ConfirmDialog.vue";
+import Confirm from "./Confirm.vue";
interface IData {
newList: unknown[];
@@ -92,7 +92,7 @@ export default {
this.$modal.close(item);
},
deletionConfirmation(description: string): void {
- return this.$showModal(ConfirmDialog, {
+ return this.$showModal(Confirm, {
props: {
title: "conf",
description,
diff --git a/app/components/modal/ActionDialogWithSearch.vue b/app/components/modals/ActionWithSearch.vue
similarity index 94%
rename from app/components/modal/ActionDialogWithSearch.vue
rename to app/components/modals/ActionWithSearch.vue
index 597851c1..7bff6e75 100644
--- a/app/components/modal/ActionDialogWithSearch.vue
+++ b/app/components/modals/ActionWithSearch.vue
@@ -11,11 +11,7 @@
v-if="filteredRecipes.length || searchQuery"
class="input"
>
-
+
@@ -48,7 +44,7 @@
diff --git a/app/components/modal/ConfirmDialog.vue b/app/components/modals/Confirm.vue
similarity index 100%
rename from app/components/modal/ConfirmDialog.vue
rename to app/components/modals/Confirm.vue
diff --git a/app/components/modal/Filters.vue b/app/components/modals/Filter.vue
similarity index 100%
rename from app/components/modal/Filters.vue
rename to app/components/modals/Filter.vue
diff --git a/app/components/modal/PromptDialog.vue b/app/components/modals/Prompt.vue
similarity index 100%
rename from app/components/modal/PromptDialog.vue
rename to app/components/modals/Prompt.vue
diff --git a/app/components/modal/ListPicker.vue b/app/components/modals/TimePickerHM.vue
similarity index 94%
rename from app/components/modal/ListPicker.vue
rename to app/components/modals/TimePickerHM.vue
index c089df28..48882d9c 100644
--- a/app/components/modal/ListPicker.vue
+++ b/app/components/modals/TimePickerHM.vue
@@ -66,12 +66,7 @@ export default {
return h.map((e) => `${e} ${localize("hr")}`);
},
minsList() {
- let m = [
- ...new Set([
- ...Array(11).keys(),
- ...Array.from(Array(12), (_, x) => x * 5),
- ]),
- ];
+ let m = [...Array(60).keys()];
this.mins = m;
return m.map((e) => `${e} ${localize("min")}`);
},
diff --git a/app/components/modals/TimePickerHMS.vue b/app/components/modals/TimePickerHMS.vue
new file mode 100644
index 00000000..8c231a96
--- /dev/null
+++ b/app/components/modals/TimePickerHMS.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/Settings/About.vue b/app/components/settings/About.vue
similarity index 92%
rename from app/components/Settings/About.vue
rename to app/components/settings/About.vue
index cb25541a..d7cd9afe 100644
--- a/app/components/Settings/About.vue
+++ b/app/components/settings/About.vue
@@ -12,11 +12,7 @@
-
+
@@ -99,9 +95,8 @@ export default {
},
},
methods: {
- onPageLoad(args) {
- const page = args.object;
- page.bindingContext = new Observable();
+ onPageLoad({ object }) {
+ object.bindingContext = new Observable();
},
// HELPERS
openURL(url) {
diff --git a/app/components/settings/AppSettings.vue b/app/components/settings/AppSettings.vue
new file mode 100644
index 00000000..1cd499db
--- /dev/null
+++ b/app/components/settings/AppSettings.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/settings/CTSettings.vue b/app/components/settings/CTSettings.vue
new file mode 100644
index 00000000..2f94fb4c
--- /dev/null
+++ b/app/components/settings/CTSettings.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/Settings/Database.vue b/app/components/settings/Database.vue
similarity index 56%
rename from app/components/Settings/Database.vue
rename to app/components/settings/Database.vue
index 1496a165..0bebcdac 100644
--- a/app/components/Settings/Database.vue
+++ b/app/components/settings/Database.vue
@@ -1,32 +1,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
{
console.log("Backup error: ", err);
this.progress = null;
+ this.releaseBackEvent();
this.setBackupFolder(true);
});
},
- exportFiles(option) {
- const folder = path.join(knownFolders.documents().path, "EnRecipes");
- const EnRecipesFile = File.fromPath(path.join(folder, "recipes.json"));
- let userCuisinesFile,
- userCategoriesFile,
- userYieldUnitsFile,
- userUnitsFile,
- mealPlansFile;
- if (this.cuisines.length)
- userCuisinesFile = File.fromPath(
- path.join(folder, "userCuisines.json")
- );
- if (this.categories.length)
- userCategoriesFile = File.fromPath(
- path.join(folder, "userCategories.json")
- );
- if (this.yieldUnits.length)
- userYieldUnitsFile = File.fromPath(
- path.join(folder, "userYieldUnits.json")
- );
- if (this.units.length)
- userUnitsFile = File.fromPath(path.join(folder, "userUnits.json"));
- if (this.mealPlans.length)
- mealPlansFile = File.fromPath(path.join(folder, "mealPlans.json"));
- switch (option) {
- case "create":
- this.writeDataToFile(EnRecipesFile, this.recipes);
- this.cuisines.length &&
- this.writeDataToFile(userCuisinesFile, this.cuisines);
- this.categories.length &&
- this.writeDataToFile(userCategoriesFile, this.categories);
- this.yieldUnits.length &&
- this.writeDataToFile(userYieldUnitsFile, this.yieldUnits);
- this.units.length && this.writeDataToFile(userUnitsFile, this.units);
- this.mealPlans.length &&
- this.writeDataToFile(mealPlansFile, this.mealPlans);
- break;
- case "delete":
- EnRecipesFile.remove();
- this.cuisines.length && userCuisinesFile.remove();
- this.categories.length && userCategoriesFile.remove();
- this.yieldUnits.length && userYieldUnitsFile.remove();
- this.units.length && userUnitsFile.remove();
- this.mealPlans.length && mealPlansFile.remove();
- break;
- }
- },
- writeDataToFile(file, data) {
- file.writeText(JSON.stringify(data));
- },
showExportSummary(filename) {
+ // delete copied db file
+ getFileAccess().deleteFile(
+ path.join(
+ knownFolders.documents().getFolder("EnRecipes").path,
+ "EnRecipes.db"
+ )
+ );
this.progress = null;
+ this.releaseBackEvent();
let description = localize("buto", `"${filename}"`);
- this.$showModal(ConfirmDialog, {
+ this.$showModal(Confirm, {
props: {
title: "expSuc",
description,
@@ -274,6 +209,7 @@ export default {
openZipFile() {
utils.getBackupFile().then((uri) => {
if (uri) {
+ knownFolders.temp().clear();
let dest = knownFolders.temp().path;
utils.Zip.unzip(uri, dest)
.then((res) => res && this.validateZipContent(res, uri))
@@ -281,63 +217,77 @@ export default {
}
});
},
- validateZipContent(extractedFolderPath, uri) {
+ validateZipContent(dest, uri) {
this.progress = localize("impip");
- let cacheFolderPath = extractedFolderPath + "/EnRecipes";
- const EnRecipesFilePath = cacheFolderPath + "/recipes.json";
- const ImagesFolderPath = cacheFolderPath + "/Images";
- const userCuisinesFilePath = cacheFolderPath + "/userCuisines.json";
- const userCategoriesFilePath = cacheFolderPath + "/userCategories.json";
- const userYieldUnitsFilePath = cacheFolderPath + "/userYieldUnits.json";
- const userUnitsFilePath = cacheFolderPath + "/userUnits.json";
- const mealPlansFilePath = cacheFolderPath + "/mealPlans.json";
- if (Folder.exists(cacheFolderPath)) {
- this.isFileDataValid([
- {
- path: EnRecipesFilePath,
- db: "EnRecipesDB",
- file: "recipes.json",
- },
- {
- path: userCuisinesFilePath,
- db: "userCuisinesDB",
- file: "userCuisines.json",
- },
- {
- path: userCategoriesFilePath,
- db: "userCategoriesDB",
- file: "userCategories.json",
- },
- {
- path: userYieldUnitsFilePath,
- db: "userYieldUnitsDB",
- file: "userYieldUnits.json",
- },
- {
- path: userUnitsFilePath,
- db: "userUnitsDB",
- file: "userUnits.json",
- },
- {
- path: mealPlansFilePath,
- db: "mealPlansDB",
- file: "mealPlans.json",
- },
- ]);
+ this.hijackBackEvent();
+ let cache = dest + "/EnRecipes";
+ const recipesDB = cache + "/EnRecipes.db";
+ const recipes = cache + "/recipes.json";
+ const images = cache + "/Images";
+ const userCuisines = cache + "/userCuisines.json";
+ const userCategories = cache + "/userCategories.json";
+ const userYieldUnits = cache + "/userYieldUnits.json";
+ const userUnits = cache + "/userUnits.json";
+ const mealPlans = cache + "/mealPlans.json";
+ let vm = this;
+ // IMPORT IMAGES FINALLY
+ function importImages() {
const timer = setInterval(() => {
- if (!this.progress) clearInterval(timer);
- if (this.progress && this.importSummary.found) {
- Folder.exists(ImagesFolderPath)
- ? this.importImages(uri)
- : this.showImportSummary();
+ if (!vm.progress) clearInterval(timer);
+ if (vm.progress && vm.importSummary.found) {
+ Folder.exists(images)
+ ? vm.importImages(uri)
+ : vm.showImportSummary();
}
}, 100);
+ }
+ if (Folder.exists(cache)) {
+ if (File.exists(recipesDB)) {
+ // IMPORT FROM DB FILE
+ this.extractData(recipesDB);
+ importImages();
+ } else if (File.exists(recipes)) {
+ // IMPORT FROM JSON FILES
+ this.isFileDataValid([
+ {
+ path: recipes,
+ db: "recipes",
+ file: "recipes.json",
+ },
+ {
+ path: userCuisines,
+ db: "userCuisines",
+ file: "userCuisines.json",
+ },
+ {
+ path: userCategories,
+ db: "userCategories",
+ file: "userCategories.json",
+ },
+ {
+ path: userYieldUnits,
+ db: "userYieldUnits",
+ file: "userYieldUnits.json",
+ },
+ {
+ path: userUnits,
+ db: "userUnits",
+ file: "userUnits.json",
+ },
+ {
+ path: mealPlans,
+ db: "mealPlans",
+ file: "mealPlans.json",
+ },
+ ]);
+ importImages();
+ } else this.failedImport(localize("buEmp"));
} else this.failedImport(localize("buInc"));
},
isFileDataValid(file) {
const files = file.filter((e) => File.exists(e.path));
if (files.length) {
- let isValid = files.map((e) => false);
+ let isValid = files.map(() => false);
files.forEach((file, i) => {
File.fromPath(file.path)
.readText()
@@ -354,7 +304,7 @@ export default {
File.fromPath(file.path)
.readText()
.then((data) => {
- this.importDataToDB(JSON.parse(data), file.db);
+ this.importData(JSON.parse(data), file.db);
});
});
}
@@ -364,8 +314,9 @@ export default {
},
failedImport(description) {
this.progress = null;
+ this.releaseBackEvent();
knownFolders.temp().clear();
- this.$showModal(ConfirmDialog, {
+ this.$showModal(Confirm, {
props: {
title: "impFail",
description,
@@ -381,37 +332,62 @@ export default {
}
return true;
},
- importDataToDB(data, db) {
+ extractData(recipesDB) {
+ const db = openOrCreate(recipesDB);
+
+ // Import recipes
+ db.select("SELECT * FROM recipes").then((res) => {
+ this.importRecipesFromDB(res);
+ });
+
+ // Import listitems
+ db.select(
+ `SELECT cuisines, categories, yieldUnits, units FROM lists`
+ ).then((res) =>
+ Object.keys(res[0]).forEach((listName) =>
+ this.importListItems({
+ data: JSON.parse(res[0][listName]),
+ listName,
+ })
+ )
+ );
+
+ // Import mealPlans
+ db.select(`SELECT * FROM mealPlans`).then((res) =>
+ this.importMealPlansFromDB(res)
+ );
+ },
+ importData(data, db) {
switch (db) {
- case "EnRecipesDB":
- this.importRecipesAction(data);
+ case "recipes":
+ this.importRecipesFromJSON(data);
break;
- case "userCuisinesDB":
- this.importListItemsAction({
+ case "userCuisines":
+ this.importListItems({
data,
listName: "cuisines",
});
break;
- case "userCategoriesDB":
- this.importListItemsAction({
+ case "userCategories":
+ this.importListItems({
data,
listName: "categories",
});
break;
- case "userYieldUnitsDB":
- this.importListItemsAction({
+ case "userYieldUnits":
+ this.importListItems({
data,
listName: "yieldUnits",
});
break;
- case "userUnitsDB":
- this.importListItemsAction({
+ case "userUnits":
+ this.importListItems({
data,
listName: "units",
});
break;
- case "mealPlansDB":
- this.importMealPlansAction(data);
+ case "mealPlans":
+ this.importMealPlansFromJSON(data);
break;
}
},
@@ -420,6 +396,16 @@ export default {
Folder.fromPath(destPath);
utils.Zip.unzip(uri, destPath).then((res) => {
if (res) {
+ // delete unzipped data files
+ Folder.fromPath(path.join(destPath, "EnRecipes"))
+ .getEntities()
+ .then((entities) => {
+ entities.forEach((entity) => {
+ if (/.json|.db/.test(entity._extension))
+ File.fromPath(entity._path).remove();
+ });
+ });
+
this.showImportSummary();
this.unlinkBrokenImages();
}
@@ -427,14 +413,13 @@ export default {
},
showImportSummary() {
this.progress = null;
- knownFolders.temp().clear();
- this.exportFiles("delete");
+ this.releaseBackEvent();
let { found, imported, updated } = this.importSummary;
let exists = Math.abs(found - imported - updated) + updated;
let importedNote = `\n${localize("recI")} ${imported}`;
let existsNote = `\n${localize("recE")} ${exists}`;
let updatedNote = `\n${localize("recU")} ${updated}`;
- this.$showModal(ConfirmDialog, {
+ this.$showModal(Confirm, {
props: {
title: "impSuc",
description: `${found} ${localize(
@@ -445,10 +430,26 @@ export default {
}).then(() => this.clearImportSummary());
},
+ // NAVIGATION HANDLERS
+ hijackBackEvent() {
+ AndroidApplication.on(
+ AndroidApplication.activityBackPressedEvent,
+ this.backEvent
+ );
+ },
+ releaseBackEvent() {
+ AndroidApplication.off(
+ AndroidApplication.activityBackPressedEvent,
+ this.backEvent
+ );
+ },
+ backEvent(args) {
+ args.cancel = true;
+ },
+
// HELPERS
- touch({ object, action }, method) {
- object.className = action.match(/down|move/) ? "option fade" : "option";
- if (action == "up") method();
+ hideToast() {
+ this.toast = null;
},
},
};
diff --git a/app/components/Settings/Interface.vue b/app/components/settings/Interface.vue
similarity index 68%
rename from app/components/Settings/Interface.vue
rename to app/components/settings/Interface.vue
index df2b6498..be65f6eb 100644
--- a/app/components/Settings/Interface.vue
+++ b/app/components/settings/Interface.vue
@@ -1,32 +1,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -42,12 +17,14 @@ import {
Frame,
} from "@nativescript/core";
import { localize, overrideLocale } from "@nativescript/localize";
-import ActionDialog from "../modal/ActionDialog.vue";
-import ConfirmDialog from "../modal/ConfirmDialog.vue";
+import Action from "../modals/Action";
+import Confirm from "../modals/Confirm";
+import OptionsList from "../sub/OptionsList";
import { mapState, mapActions } from "vuex";
import * as utils from "~/shared/utils";
export default {
+ components: { OptionsList },
data() {
return {
appLanguage: "English",
@@ -59,12 +36,14 @@ export default {
return [
{},
{
+ type: "list",
icon: "lang",
title: "lang",
subTitle: this.appLanguage,
action: this.selectAppLanguage,
},
{
+ type: "list",
icon: "theme",
title: "Theme",
subTitle: localize(
@@ -73,6 +52,7 @@ export default {
action: this.selectThemes,
},
{
+ type: "list",
icon: "layout",
title: "listVM",
subTitle: localize(this.layout),
@@ -84,25 +64,24 @@ export default {
},
methods: {
...mapActions(["setTheme", "setLayout"]),
- onPageLoad(args) {
- const page = args.object;
- page.bindingContext = new Observable();
+ onPageLoad({ object }) {
+ object.bindingContext = new Observable();
},
// LANGUAGE SELECTION
selectAppLanguage() {
let languages = this.language.map((e) => e.title);
- this.$showModal(ActionDialog, {
+ this.$showModal(Action, {
props: {
title: "lang",
list: [...languages],
},
}).then((action) => {
- if (action && action !== "Cancel" && this.appLanguage !== action) {
+ if (action && this.appLanguage !== action) {
let currentLocale = Device.language.split("-")[0];
let locale = this.language.filter((e) => e.title === action)[0]
.locale;
if (currentLocale !== locale) {
- this.$showModal(ConfirmDialog, {
+ this.$showModal(Confirm, {
props: {
title: "appRst",
description: localize("nLangInfo"),
@@ -123,7 +102,7 @@ export default {
},
// THEME SELECTION
selectThemes() {
- this.$showModal(ActionDialog, {
+ this.$showModal(Action, {
props: {
title: "Theme",
list: ["Light", "Dark", "Black", "sysDef", "sysDefB"],
@@ -142,26 +121,21 @@ export default {
},
// LAYOUT MODE
setLayoutMode() {
- this.$showModal(ActionDialog, {
+ this.$showModal(Action, {
props: {
title: "listVM",
list: ["detailed", "grid", "photogrid", "simple", "minimal"],
},
}).then((action) => {
- if (action && action !== "Cancel" && this.layoutMode !== action) {
+ if (action && this.layoutMode !== action) {
let act = action.toLowerCase();
ApplicationSettings.setString("layout", act);
this.setLayout(act);
}
});
},
- // HELPERS
- touch({ object, action }, method) {
- object.className = action.match(/down|move/) ? "option fade" : "option";
- if (action == "up") method();
- },
},
- mounted() {
+ created() {
this.appLanguage = ApplicationSettings.getString(
"appLanguage",
localize("sysDef")
diff --git a/app/components/settings/MPSettings.vue b/app/components/settings/MPSettings.vue
new file mode 100644
index 00000000..ce164690
--- /dev/null
+++ b/app/components/settings/MPSettings.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/settings/Options.vue b/app/components/settings/Options.vue
new file mode 100644
index 00000000..ed75b272
--- /dev/null
+++ b/app/components/settings/Options.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/settings/Reset.vue b/app/components/settings/Reset.vue
new file mode 100644
index 00000000..fb5b4429
--- /dev/null
+++ b/app/components/settings/Reset.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/sub/OptionsList.vue b/app/components/sub/OptionsList.vue
new file mode 100644
index 00000000..99b1f752
--- /dev/null
+++ b/app/components/sub/OptionsList.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/sub/SnackBar.vue b/app/components/sub/SnackBar.vue
new file mode 100644
index 00000000..096106a9
--- /dev/null
+++ b/app/components/sub/SnackBar.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/sub/Timer.vue b/app/components/sub/Timer.vue
new file mode 100644
index 00000000..d1f5f912
--- /dev/null
+++ b/app/components/sub/Timer.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/sub/Toast.vue b/app/components/sub/Toast.vue
new file mode 100644
index 00000000..4c54cef6
--- /dev/null
+++ b/app/components/sub/Toast.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/fonts/enrecipes.ttf b/app/fonts/enrecipes.ttf
index b2324228..8aff549f 100644
Binary files a/app/fonts/enrecipes.ttf and b/app/fonts/enrecipes.ttf differ
diff --git a/app/i18n/ar.json b/app/i18n/ar.json
index 9101f4bf..ef1e8276 100644
--- a/app/i18n/ar.json
+++ b/app/i18n/ar.json
@@ -12,7 +12,7 @@
"American": "أمريكية",
"aNBtn": "أضف جديدة",
"aNoBtn": "أضف ملاحظة",
- "app.name": "",
+ "app.name": "EnRecipes",
"appCrd": "شورك عبر EnRecipes. احصل عليه على F-Droid, IzzyOnDroid, أو متجر بلاي.",
"Appetizers": "مقبلات",
"appInfo": "EnRecipes كتاب طبخ مفتوح المصدر صديق للخصوصية يتيح لك إنشاء وصفاتك و إدارتها ومشاركتها",
@@ -70,7 +70,7 @@
"editRec": "عدل الوصفة",
"Egyptian": "مصرية",
"English": "إنجليزية",
- "EnRecipes": "",
+ "EnRecipes": "EnRecipes",
"expBu": "صدر نسخة احتياطية كاملة",
"expip": "جار التصدير",
"expSuc": "نجح التصدير",
diff --git a/app/i18n/en-GB.default.json b/app/i18n/en-GB.default.json
index caa44806..de3748fd 100644
--- a/app/i18n/en-GB.default.json
+++ b/app/i18n/en-GB.default.json
@@ -298,7 +298,8 @@
"delay": "Delay",
"tmr": "Timer %s",
"prstBtn": "PRESETS",
- "tmrPrsts": "Timer presets",
+ "prsts": "Presets",
+ "delPrst": "You are about to delete %s from the presets",
"fwr": "for which recipe?",
"aTPrst": "Added to presets",
"tmrSnd": "Timer sound",
@@ -309,5 +310,6 @@
"hour": "hour",
"hours": "hours",
"seconds": "seconds",
- "tmrClr": "Timer cleared"
+ "tmrRm": "Timer removed",
+ "notifSetg": "Notification settings"
}
diff --git a/app/i18n/fi.json b/app/i18n/fi.json
index f835d7f6..8c3274fc 100644
--- a/app/i18n/fi.json
+++ b/app/i18n/fi.json
@@ -12,7 +12,7 @@
"American": "amerikkalainen",
"aNBtn": "LISÄÄ UUSI",
"aNoBtn": "LISÄÄ HUOMAUTUS",
- "app.name": "",
+ "app.name": "EnRecipes",
"appCrd": "Jaettu EnRecipesin kautta. Lataa se F-Droidista, IzzyOnDroidista tai Play Storesta.",
"Appetizers": "Alkupalat",
"appInfo": "EnRecipes on avoimen lähdekoodin, yksityisyyden suojaa kunnioittava digitaalinen keittokirja, jonka avulla voit luoda, hallita ja jakaa reseptejäsi",
@@ -70,7 +70,7 @@
"editRec": "Muokkaa resepti",
"Egyptian": "egyptiläinen",
"English": "englantilainen",
- "EnRecipes": "",
+ "EnRecipes": "EnRecipes",
"expBu": "Vie koko varmuuskopio",
"expip": "Vienti käynnissä",
"expSuc": "",
diff --git a/app/i18n/ja.json b/app/i18n/ja.json
index 63c97b84..2167f57e 100644
--- a/app/i18n/ja.json
+++ b/app/i18n/ja.json
@@ -12,6 +12,7 @@
"American": "アメリカ料理",
"aNBtn": "新しく追加",
"aNoBtn": "メモを追加",
+ "app.name": "EnRecipes",
"appCrd": "EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。",
"Appetizers": "前菜",
"appInfo": "EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です",
@@ -69,6 +70,7 @@
"editRec": "レシピを編集する",
"Egyptian": "エジプト料理",
"English": "イングランド料理",
+ "EnRecipes": "EnRecipes",
"expBu": "バックアップをエクスポート",
"expip": "エクスポートを実行中",
"expSuc": "エクスポートに成功",
diff --git a/app/main.ts b/app/main.ts
index af11cc52..633e14e6 100644
--- a/app/main.ts
+++ b/app/main.ts
@@ -2,20 +2,56 @@ import {
localize,
androidLaunchEventLocalizationHandler,
} from '@nativescript/localize'
-import { on, launchEvent } from '@nativescript/core/application'
-on(launchEvent, (args) => {
+import { Application, AndroidApplication, Utils } from '@nativescript/core'
+
+const keepScreenOn = () => {
+ let ctx = Utils.ad.getApplicationContext()
+ const pm = ctx.getSystemService(android.content.Context.POWER_SERVICE)
+ let isScreenOff = !pm.isInteractive()
+ if (isScreenOff) {
+ console.log('keepScreenOn')
+ const window = Application.android.startActivity.getWindow()
+ const windowMgr = android.view.WindowManager
+ const flags =
+ windowMgr.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
+ windowMgr.LayoutParams.FLAG_TURN_SCREEN_ON |
+ windowMgr.LayoutParams.FLAG_KEEP_SCREEN_ON
+ window.addFlags(flags)
+ function clearFlags(args) {
+ args.cancel = true
+ window.clearFlags(flags)
+ Application.android.off(
+ AndroidApplication.activityBackPressedEvent,
+ clearFlags
+ )
+ }
+ Application.android.on(
+ AndroidApplication.activityBackPressedEvent,
+ clearFlags
+ )
+ }
+}
+Application.on(Application.resumeEvent, keepScreenOn)
+
+Application.on(Application.launchEvent, (args) => {
+ console.log('launching')
if (args.android) {
androidLaunchEventLocalizationHandler()
+ intentListener(args)
}
})
+
import Vue from 'nativescript-vue'
import EnRecipes from './components/EnRecipes.vue'
+import CookingTimer from './components/CookingTimer.vue'
import store from './store'
+export const EventBus = new Vue()
+
import CollectionView from '@nativescript-community/ui-collectionview/vue'
Vue.use(CollectionView)
-import { lvMixin } from './shared/mixins.js'
+import { lvMixin } from './shared/mixins'
Vue.mixin(lvMixin)
Vue.config.silent = false
@@ -26,3 +62,35 @@ new Vue({
store,
render: (h) => h(EnRecipes),
}).$start()
+
+const intentListener = ({ intent, android }: any) => {
+ let ct = 'CookingTimer'
+ let action = (intent || android).getStringExtra('action')
+ console.log('calling: ', action)
+ if (action == 'open_timer' && store.state.currentComponent != ct) {
+ let openTimer = setInterval(() => {
+ let comp = store.state.currentComponent
+ if (comp == ct) clearInterval(openTimer)
+ else {
+ if (comp == 'CTSettings') Vue.navigateBack()
+ else {
+ Vue.navigateTo(CookingTimer)
+ store.commit('setComponent', 'CookingTimer')
+ }
+ }
+ }, 250)
+ }
+}
+Application.on(Application.launchEvent, () => {
+ Application.android.on(
+ AndroidApplication.activityNewIntentEvent,
+ intentListener
+ )
+})
+Application.on(Application.exitEvent, () => {
+ store.commit('setComponent', 'EnRecipes')
+ Application.android.off(
+ AndroidApplication.activityNewIntentEvent,
+ intentListener
+ )
+})
diff --git a/app/resources/Android/app.gradle b/app/resources/Android/app.gradle
index f44686c4..5eb017de 100644
--- a/app/resources/Android/app.gradle
+++ b/app/resources/Android/app.gradle
@@ -15,29 +15,18 @@
android {
defaultConfig {
- versionCode 8
- versionName '1.3.3'
- applicationId 'com.vishnuraghav.enrecipes'
- minSdkVersion 23
+ versionCode 1
+ versionName '2.0.0'
+ minSdkVersion 21
targetSdkVersion 30
compileSdkVersion 30
generatedDensities = []
- ndk {
- abiFilters.clear()
- abiFilters.addAll(['arm64-v8a', 'armeabi-v7a', 'x86'])
- }
+ // ndk {
+ // abiFilters.clear()
+ // abiFilters.addAll(['arm64-v8a'])
+ // }
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
- // buildTypes {
- // release {
- // minifyEnabled true
- // shrinkResources false
- // debuggable false
- // jniDebuggable false
- // renderscriptDebuggable false
- // }
- // }
-
}
diff --git a/app/resources/Android/src/main/AndroidManifest.xml b/app/resources/Android/src/main/AndroidManifest.xml
index ac8a9170..f5e4faba 100644
--- a/app/resources/Android/src/main/AndroidManifest.xml
+++ b/app/resources/Android/src/main/AndroidManifest.xml
@@ -1,17 +1,18 @@
+
+
+
+
-
-
-
-
+
+
@@ -19,14 +20,9 @@
-
-
+
+
+
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify.webp b/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify.webp
new file mode 100644
index 00000000..ad765b78
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify_silhouette.webp b/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify_silhouette.webp
new file mode 100644
index 00000000..f759bdf8
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-hdpi/ic_stat_notify_silhouette.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-ldpi/ic_launcher.webp b/app/resources/Android/src/main/res/drawable-ldpi/ic_launcher.webp
deleted file mode 100644
index 5eb47833..00000000
Binary files a/app/resources/Android/src/main/res/drawable-ldpi/ic_launcher.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-ldpi/logo.webp b/app/resources/Android/src/main/res/drawable-ldpi/logo.webp
deleted file mode 100644
index cabf24db..00000000
Binary files a/app/resources/Android/src/main/res/drawable-ldpi/logo.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify.webp b/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify.webp
new file mode 100644
index 00000000..dd7cfcdf
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify_silhouette.webp b/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify_silhouette.webp
new file mode 100644
index 00000000..6ecb0244
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-mdpi/ic_stat_notify_silhouette.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify.webp b/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify.webp
new file mode 100644
index 00000000..14cef5f8
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify_silhouette.webp b/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify_silhouette.webp
new file mode 100644
index 00000000..f581f593
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xhdpi/ic_stat_notify_silhouette.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify.webp
new file mode 100644
index 00000000..c6b575b9
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify_silhouette.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify_silhouette.webp
new file mode 100644
index 00000000..1c68a3df
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xxhdpi/ic_stat_notify_silhouette.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify.webp
new file mode 100644
index 00000000..494cf34a
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify_silhouette.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify_silhouette.webp
new file mode 100644
index 00000000..b05161d1
Binary files /dev/null and b/app/resources/Android/src/main/res/drawable-xxxhdpi/ic_stat_notify_silhouette.webp differ
diff --git a/app/resources/Android/src/main/res/values-ar/strings.xml b/app/resources/Android/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000..08840dd5
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-ar/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "Timer cleared"
+ "ثوان"
+ "ساعات"
+ "ساعة"
+ "دقائق"
+ "دقيقة"
+ "مدة التأخير"
+ "اهتزاز المؤقت"
+ "صوت المؤقت"
+ "Added to presets"
+ "لأي وصفة؟"
+ "Timer presets"
+ "PRESETS"
+ "مؤقت %1$s"
+ "التأخير"
+ "قف"
+ "ابدأ"
+ "مؤقت جديد"
+ "Cooking Timer"
+ "System default + Black"
+ "Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "أمس"
+ "WED"
+ "قبل %1$s أسابيع"
+ "فيتنامية"
+ "نباتي"
+ "نباتي صرف"
+ "Untitled Recipe"
+ "تغيرات غبر محفوظة"
+ "وحدة"
+ "وحدة"
+ "Undefined"
+ "تركية"
+ "TUE"
+ "tsp"
+ "separate with spaces"
+ "العلامات"
+ "ابحث في كل الوصفات؟"
+ "حاول لاحقاً"
+ "ترجم"
+ "جربت هذه الوصفة %1$s"
+ "اليوم"
+ "الوصفات التي تريد تجربتها مسرودة هنا"
+ "العنوان"
+ "THU"
+ "السمة"
+ "تايلندية"
+ "ملعقة شاي"
+ "tbsp"
+ "ملعقة"
+ "System default"
+ "ابدأ الاسبوع يوم الاثنين"
+ "سويدية"
+ "لمساعدتك على اختيار ما تطبخ عندما لا تستطيع الاختيار"
+ "هز لرؤية وصفة عشوائية"
+ "SUN"
+ "ابدأ إضافة وصفاتك!"
+ "خطوة"
+ "stick"
+ "التقييم النجمي"
+ "شارك وصفة باستعمال..."
+ "Sort"
+ "شارك صورة الوصفة باستعمال..."
+ "سري لانكية"
+ "اسبانية"
+ "شوربات"
+ "وجبات خفيفة"
+ "صغير"
+ "المختارة"
+ "الأبطأ أولاً"
+ "بسيط"
+ "الأطباق الجانبية"
+ "شارك"
+ "الإعدادات"
+ "SET"
+ "Serving"
+ "ابحث"
+ "سبتمبر"
+ "اختر وصفة"
+ "بحرية"
+ "سكتلندية"
+ "صلصات"
+ "SAT"
+ "سلطات"
+ "روسية"
+ "أعد التشغيل"
+ "Remove photo"
+ "لفة"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "أرز"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "وصفتي الصحية"
+ "الوصفات"
+ "Recipe removed"
+ "صورة الوصفة"
+ "لا شيء هنا! أضف بعض الوصفات ثم حاول مجدداً"
+ "المستورد:"
+ "recipes found"
+ "Already exist:"
+ "الوصفة"
+ "REMOVE"
+ "التقييم"
+ "الاسرع أولاً"
+ "qt"
+ "pt"
+ "سياسة الخصوصية"
+ "وقت التحضير"
+ "رطل"
+ "دواجن"
+ "برتغالية"
+ "استعمل زر الزائد لإضافة واحدة"
+ "مخططة الوجبات"
+ "رشة"
+ "قطعة"
+ "قطعة"
+ "صورة الوصفة"
+ "Photo Grid"
+ "فطيرة"
+ "باستا"
+ "oz"
+ "أونصة"
+ "الاعدادات"
+ "الأقدم أولاً"
+ "OK"
+ "أكتوبر"
+ "New yield unit"
+ "صنف جديد"
+ "نوفمبر"
+ "ملاحظات"
+ "None of the recipes here matches your search"
+ "لا وصفات مطابقة لبحثك"
+ "نودلز"
+ "No favourites yet"
+ "مقياس التسارع إما معطل أو لا يعمل"
+ "ملاحظة"
+ "ليس الآن"
+ "أعد تشغيل EnRecipes لاستخدام اللغة الجديدة"
+ "نيجيرية"
+ "وحدة جديدة"
+ "وصفة جديدة"
+ "الأجد أولاً"
+ "مطبخ جديد"
+ "MON"
+ "متوسطة"
+ "مل"
+ "Minimal"
+ "sec"
+ "min"
+ "مللتر"
+ "مغ"
+ "مكسيكية"
+ "medium"
+ "لحم"
+ "مايو"
+ "مارس"
+ "الأطباق الرئيسة"
+ "منذ %1$s أشهر"
+ "غداء"
+ "منذ وقت طويل"
+ "رغيف"
+ "لتر"
+ "وضع عرض القائمة"
+ "فاتح"
+ "leaf"
+ "lb"
+ "Last updated"
+ "كبير"
+ "اللغة"
+ "ل"
+ "كورية"
+ "كيلوغرام"
+ "كغ"
+ "كينية"
+ "KEEP EDITING"
+ "يونيو"
+ "يوليو"
+ "انضم لمجموعة التلغرام"
+ "يهودية"
+ "يابانية"
+ "يناير"
+ "جمايكية"
+ "إيطالية"
+ "Item"
+ "إيرلندية"
+ "ملف غير صحيح"
+ "الواجهة"
+ "Instructions"
+ "المكونات"
+ "هندية"
+ "إن"
+ "نجح الاستيراد"
+ "جار الاستيراد"
+ "يدعم النسخ الاحتياطية الكاملة المصدرة من هذا التطبيق"
+ "فشل الاستيراد"
+ "استورد البيانات"
+ "hr"
+ "صحية"
+ "دليل المستخدم"
+ "قائمة التسوق"
+ "شبكة"
+ "إغريقية"
+ "غرام"
+ "اعرض على github"
+ "ألمانية"
+ "جالون"
+ "جال"
+ "غ"
+ "وصفاتك المفضلة مسرودة هنا"
+ "FRI"
+ "فرنسية"
+ "Fluid Ounce"
+ "المصفاة"
+ "fl oz"
+ "الوصفات المصفاة"
+ "فلبينية"
+ "فبراير"
+ "المفضلات"
+ "نجح التصدير"
+ "جار التصدير"
+ "صدر نسخة احتياطية كاملة"
+ ""
+ "إنجليزية"
+ "مصرية"
+ "عدل الوصفة"
+ "سهلة"
+ "dstspn"
+ "قطرة"
+ "درزن"
+ "تبرع"
+ "هذه الوصفة فيها تغييرات غير محفوظة. ما الذي تريد فعله؟"
+ "استبعد"
+ "عشاء"
+ "مستوى الصعوبة"
+ "مفصل"
+ "حلا"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "ديسمبر"
+ "DELETE"
+ "قاعدة البيانات"
+ "داكن"
+ "دنماركي"
+ "قبل %1$s أيام"
+ "كأس"
+ "كأس"
+ "المطبخ"
+ "Created"
+ "قص الصورة"
+ "Cooking time"
+ "Confirm"
+ "أكمل"
+ "Combinations"
+ "سم"
+ "فص"
+ "صينية"
+ "صعبة"
+ "ألغ"
+ "الصنف"
+ "لف النسخة الاحتياطة عدل في مكان آخر"
+ "يولد ملف ZIP يحتوي على جميع بياناتك يمكن استيراده مجدداً"
+ "ملف نسخة احتياطي مشوه أو فاسد"
+ "مجلد النسخ الاحتياطية"
+ "مجلد النسخ الاحتيطية فارغ"
+ "بريطانية"
+ "فطور"
+ "أخباز"
+ "برازيلية"
+ "أسود"
+ "مشروبات"
+ "شواء"
+ "أغسطس"
+ "أضف خطوة"
+ "أبريل"
+ "إعادة تشغيل التطبيق متطلبة"
+ "طبق"
+ "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
+ "مقبلات"
+ "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
+ ""
+ ""
+ ""
+ "أضف ملاحظة"
+ "أضف جديدة"
+ "أمريكية"
+ "كل العلامات"
+ "كل المطابخ"
+ "كل الأصناف"
+ "أضف مكون"
+ "أضف وصفة لتقوم بالنسخ الاحتياطي"
+ "ADD COMBINATION"
+ "انتهى!"
+ "أضف"
+ "حول"
+ "ألحق صورة"
+ "Notification settings"
+ "Timer removed"
+
diff --git a/app/resources/Android/src/main/res/values-ca/strings.xml b/app/resources/Android/src/main/res/values-ca/strings.xml
index 1eee7fcb..8931d5d7 100644
--- a/app/resources/Android/src/main/res/values-ca/strings.xml
+++ b/app/resources/Android/src/main/res/values-ca/strings.xml
@@ -1,58 +1,23 @@
- ""
- ""
- ""
- ""
+ "s"
"DC."
- ""
- ""
"Vegetarianes"
"Veganes"
"Recepta sense títol"
"Canvis no desats"
- ""
- ""
"Sense definir"
- ""
"DT."
- ""
- ""
"Etiquetes"
- ""
"Per a provar més tard"
"Tradueix"
- ""
- ""
- ""
- ""
"DJ."
- ""
- ""
"Culleradeta"
- ""
"Cullerada"
- ""
- ""
- ""
- ""
- ""
"DG."
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Espanyola"
"Brous"
"piscolabis"
- ""
- ""
- ""
- ""
"Guarnicions"
"Comparteix"
"Paràmetres"
@@ -60,236 +25,294 @@
"Ració"
"Cerca"
"setembre"
- ""
"Peix i marisc"
- ""
"Salses"
"DS."
"Amanides"
- ""
"REINICIA"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Arròs"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Recepta com a text"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Lliura"
- ""
- ""
- ""
"Planificador d’àpats"
- ""
"Peça"
- ""
"Foto de la recepta"
- ""
- ""
"Pasta"
- ""
"Unça"
- ""
- ""
"D’acord"
"octubre"
- ""
"Categoria nova"
"novembre"
- ""
- ""
"Fideus"
- ""
- ""
- ""
"ARA NO"
- ""
- ""
- ""
- ""
- ""
- ""
"DL."
- ""
- ""
- ""
- ""
"Mil·lilitre"
- ""
"Mexicana"
- ""
"Carn"
"maig"
"març"
- ""
- ""
- ""
- ""
- ""
"Litre"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Quilogram"
- ""
- ""
- ""
"juny"
"juliol"
- ""
- ""
- ""
"gener"
- ""
- ""
- ""
- ""
"El fitxer no és vàlid"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Ha fallat la importació"
- ""
- ""
- ""
- ""
"Llista de queviures"
"Graella"
- ""
"Gram"
- ""
- ""
"Galó"
- ""
- ""
- ""
"DV."
- ""
"Unça líquida"
- ""
- ""
- ""
- ""
"febrer"
"Preferits"
- ""
- ""
- ""
"EnRecipes"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Aquesta recepta té canvis no desats. Què voleu fer?"
"DESCARTA’LS"
- ""
- ""
- ""
"Postres"
- ""
- ""
"desembre"
"SUPRIMEIX"
- ""
- ""
- ""
- ""
"Tassa"
- ""
- ""
- ""
"Escapça la foto"
- ""
"Confirma"
"CONTINUA"
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
- ""
"Pans"
- ""
- ""
"Begudes"
"Barbacoes"
"agost"
- ""
"abril"
"Cal reiniciar l’aplicació"
- ""
"L’EnRecipes és un receptari digital, de codi obert i privat, que us permet crear, gestionar i compartir les vostres receptes"
"Aperitius"
- ""
"EnRecipes"
"EnRecipes"
"EnRecipes"
- ""
"AFEGEIX-NE UN DE NOU"
- ""
"Totes les etiquetes"
- ""
"Totes les categories"
- ""
- ""
- ""
- ""
- ""
"Quant a"
- ""
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "System default + Black"
"Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "yesterday"
+ "%1$s weeks ago"
+ "Vietnamese"
+ "Unit"
+ "unit"
+ "Turkish"
+ "tsp"
+ "separate with spaces"
+ "SEARCH IN ALL THE RECIPES?"
+ "You tried this recipe %1$s"
+ "today"
+ "Recipes you want to try later are listed here"
+ "Title"
+ "Theme"
+ "Thai"
+ "tbsp"
+ "System default"
+ "Start week on Monday"
+ "Swedish"
+ "Helps you choose what to cook when you can\'t decide"
+ "Shake to view random recipe"
+ "Start adding your recipes!"
+ "Step"
+ "stick"
+ "Star rating"
+ "Share recipe using..."
+ "Sort"
+ "Share recipe photo using..."
+ "Sri Lankan"
+ "small"
+ "selected"
+ "Slowest first"
+ "Simple"
+ "Select recipe"
+ "Scottish"
+ "Russian"
+ "Remove photo"
+ "Roll"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "My Healthy Recipe"
+ "recipes"
+ "Recipe removed"
+ "Recipe photo"
+ "Nothing here! Add some recipes and try again"
+ "Imported:"
+ "recipes found"
+ "Already exist:"
+ "REMOVE"
+ "Rating"
+ "Quickest first"
+ "qt"
+ "pt"
+ "Privacy policy"
+ "Preparation time"
+ "Poultry"
+ "Portuguese"
+ "Use the plus button to add one"
+ "pinch"
+ "piece"
+ "Photo Grid"
+ "Patty"
+ "oz"
+ "Options"
+ "Oldest first"
+ "New yield unit"
+ "Notes"
"None of the recipes here matches your search"
+ "No recipes match your search"
+ "No favourites yet"
+ "Accelerometer sensor is either disabled or is not working"
+ "Note"
+ "Restart EnRecipes to use the new language"
+ "Nigerian"
+ "New unit"
+ "New recipe"
+ "Newest first"
+ "New cuisine"
+ "Moderate"
+ "ml"
+ "Minimal"
+ "min"
+ "mg"
+ "medium"
+ "Main dishes"
+ "%1$s months ago"
+ "Lunch"
+ "a long time ago"
+ "Loaf"
+ "List view mode"
+ "Light"
+ "leaf"
+ "lb"
+ "Last updated"
+ "large"
+ "Language"
+ "l"
+ "Korean"
+ "kg"
+ "Kenyan"
+ "KEEP EDITING"
+ "Join the Telegram group"
+ "Jewish"
+ "Japanese"
+ "Jamaican"
+ "Italian"
+ "Item"
+ "Irish"
+ "Interface"
+ "Instructions"
+ "Ingredients"
+ "Indian"
+ "in"
+ "Import success"
+ "Import in progress"
+ "Supports full backups exported by this app"
+ "Import data"
+ "hr"
+ "Healthy"
+ "User guide"
+ "Greek"
+ "View on GitHub"
+ "German"
+ "gal"
+ "g"
+ "Your favourite recipes are listed here"
+ "French"
+ "Filter"
+ "fl oz"
+ "Filtered recipes"
+ "Filipino"
+ "Export success"
+ "Export in progress"
+ "Export full backup"
+ "English"
+ "Egyptian"
+ "Edit recipe"
+ "Easy"
+ "dstspn"
+ "drop"
+ "dozen"
+ "Donate"
+ "Dinner"
+ "Difficulty level"
+ "Detailed"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "Database"
+ "Dark"
+ "Danish"
+ "%1$s days ago"
+ "cup"
+ "Cuisine"
+ "Created"
+ "Cooking time"
+ "Combinations"
+ "cm"
+ "clove"
+ "Chinese"
+ "Challenging"
+ "CANCEL"
+ "Category"
+ "The backup file was modified elsewhere"
+ "Generates a ZIP file containing all your data that can be imported back"
+ "Malformed or corrupt backup file"
+ "Backup folder"
+ "The backup file is empty"
+ "British"
+ "Breakfast"
+ "Brazilian"
+ "Black"
+ "ADD STEP"
+ "APPLY"
+ "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
+ "ADD NOTE"
+ "American"
+ "All Cuisines"
+ "ADD INGREDIENT"
+ "Add a recipe to perform a backup"
+ "ADD COMBINATION"
+ "All done!"
+ "ADD"
+ "Attach a photo"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-da/strings.xml b/app/resources/Android/src/main/res/values-da/strings.xml
index bafed1f2..f0da2471 100644
--- a/app/resources/Android/src/main/res/values-da/strings.xml
+++ b/app/resources/Android/src/main/res/values-da/strings.xml
@@ -1,5 +1,26 @@
+ "sekunder"
+ "minutter"
+ "minut"
+ "Forsinkelsens varighed"
+ "Timer vibrerer"
+ "Timeren %1$s"
+ "Timeren lyd"
+ "FORUDSÆTTER"
+ "Timeren forindstillinger"
+ "til hvilken opskrift?"
+ "Tilføjet til forudindstillinger"
+ "timers"
+ "timer"
+ "Timeren er slettet"
+ "Kogetid Timer"
+ "Ny timer"
+ "STARTER"
+ "Stopper"
+ "Forsinkelse"
+ "s"
+ "Systemstandard + sort"
"November"
"Ny kategori"
"Ny udbytteenhed"
@@ -292,4 +313,6 @@
"American"
"Fuldendt!"
"Om"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-de/strings.xml b/app/resources/Android/src/main/res/values-de/strings.xml
index c79e5dfe..4b6c6923 100644
--- a/app/resources/Android/src/main/res/values-de/strings.xml
+++ b/app/resources/Android/src/main/res/values-de/strings.xml
@@ -1,5 +1,26 @@
+ "Timer gelöscht"
+ "Verzögerung"
+ "Verzögerungsdauer"
+ "Minute"
+ "Minuten"
+ "Stunde"
+ "Stunden"
+ "Sekunden"
+ "Stopp"
+ "Voreinstellungen"
+ "für welches Rezept?"
+ "Zu Voreinstellungen hinzugefügt"
+ "Timer-Voreinstellungen"
+ "Timerton"
+ "Timervibration"
+ "sec"
+ "Kochtimer"
+ "Neuer Timer"
+ "START"
+ "Timer %1$s"
+ "Systemstandard + schwarz"
"Gesichert in %1$s"
"Ergebnis"
"Ertragseinheit"
@@ -292,4 +313,6 @@
"HINZUFÜGEN"
"Über"
"Foto anhängen"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-en-rIN/strings.xml b/app/resources/Android/src/main/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..c40b78ae
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-en-rIN/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "Timer cleared"
+ "Delay"
+ "Delay duration"
+ "minute"
+ "minutes"
+ "hour"
+ "hours"
+ "seconds"
+ "s"
+ "Cooking Timer"
+ "New timer"
+ "START"
+ "Stop"
+ "Timer %1$s"
+ "PRESETS"
+ "Timer presets"
+ "for which recipe?"
+ "Added to presets"
+ "Timer sound"
+ "Timer vibrate"
+ "System default + Black"
+ "Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "yesterday"
+ "WED"
+ "%1$s weeks ago"
+ "Vietnamese"
+ "Vegetarian"
+ "Vegan"
+ "Untitled Recipe"
+ "Unsaved changes"
+ "Unit"
+ "unit"
+ "Undefined"
+ "Turkish"
+ "TUE"
+ "tsp"
+ "separate with spaces"
+ "Tags"
+ "SEARCH IN ALL THE RECIPES?"
+ "Try Later"
+ "Translate"
+ "You tried this recipe %1$s"
+ "today"
+ "Recipes you want to try later are listed here"
+ "Title"
+ "THU"
+ "Theme"
+ "Thai"
+ "Teaspoon"
+ "tbsp"
+ "Tablespoon"
+ "System default"
+ "Start week on Monday"
+ "Swedish"
+ "Helps you choose what to cook when you can\'t decide"
+ "Shake to view random recipe"
+ "SUN"
+ "Start adding your recipes!"
+ "Step"
+ "stick"
+ "Star rating"
+ "Share recipe using..."
+ "Sort"
+ "Share recipe photo using..."
+ "Sri Lankan"
+ "Spanish"
+ "Soups"
+ "Snacks"
+ "small"
+ "selected"
+ "Slowest first"
+ "Simple"
+ "Side dishes"
+ "Share"
+ "Settings"
+ "SET"
+ "Serving"
+ "Search"
+ "September"
+ "Select recipe"
+ "Seafood"
+ "Scottish"
+ "Sauces"
+ "SAT"
+ "Salads"
+ "Russian"
+ "RESTART"
+ "Remove photo"
+ "Roll"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "Rice"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "My Healthy Recipe"
+ "recipes"
+ "Recipe removed"
+ "Recipe photo"
+ "Nothing here! Add some recipes and try again"
+ "Imported:"
+ "recipes found"
+ "Already exist:"
+ "Recipe"
+ "REMOVE"
+ "Rating"
+ "Quickest first"
+ "qt"
+ "pt"
+ "Privacy policy"
+ "Preparation time"
+ "Pound"
+ "Poultry"
+ "Portuguese"
+ "Use the plus button to add one"
+ "Meal Planner"
+ "pinch"
+ "Piece"
+ "piece"
+ "Recipe photo"
+ "Photo Grid"
+ "Patty"
+ "Pasta"
+ "oz"
+ "Ounce"
+ "Options"
+ "Oldest first"
+ "OK"
+ "October"
+ "New yield unit"
+ "New category"
+ "November"
+ "Notes"
+ "None of the recipes here matches your search"
+ "No recipes match your search"
+ "Noodles"
+ "No favourites yet"
+ "Accelerometer sensor is either disabled or is not working"
+ "Note"
+ "NOT NOW"
+ "Restart EnRecipes to use the new language"
+ "Nigerian"
+ "New unit"
+ "New recipe"
+ "Newest first"
+ "New cuisine"
+ "MON"
+ "Moderate"
+ "ml"
+ "Minimal"
+ "min"
+ "Millilitre"
+ "mg"
+ "Mexican"
+ "medium"
+ "Meat"
+ "May"
+ "March"
+ "Main dishes"
+ "%1$s months ago"
+ "Lunch"
+ "a long time ago"
+ "Loaf"
+ "Litre"
+ "List view mode"
+ "Light"
+ "leaf"
+ "lb"
+ "Last updated"
+ "large"
+ "Language"
+ "l"
+ "Korean"
+ "Kilogram"
+ "kg"
+ "Kenyan"
+ "KEEP EDITING"
+ "June"
+ "July"
+ "Join the Telegram group"
+ "Jewish"
+ "Japanese"
+ "January"
+ "Jamaican"
+ "Italian"
+ "Item"
+ "Irish"
+ "Invalid file"
+ "Interface"
+ "Instructions"
+ "Ingredients"
+ "Indian"
+ "in"
+ "Import success"
+ "Import in progress"
+ "Supports full backups exported by this app"
+ "Import failed"
+ "Import data"
+ "h"
+ "Healthy"
+ "User guide"
+ "Grocery List"
+ "Grid"
+ "Greek"
+ "Gram"
+ "View on GitHub"
+ "German"
+ "Gallon"
+ "gal"
+ "g"
+ "Your favourite recipes are listed here"
+ "FRI"
+ "French"
+ "Fluid Ounce"
+ "Filter"
+ "fl oz"
+ "Filtered recipes"
+ "Filipino"
+ "February"
+ "Favourites"
+ "Export success"
+ "Export in progress"
+ "Export full backup"
+ "EnRecipes"
+ "English"
+ "Egyptian"
+ "Edit recipe"
+ "Easy"
+ "dstspn"
+ "drop"
+ "dozen"
+ "Donate"
+ "This recipe has unsaved changes. What would you like to do?"
+ "DISCARD"
+ "Dinner"
+ "Difficulty level"
+ "Detailed"
+ "Desserts"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "December"
+ "DELETE"
+ "Database"
+ "Dark"
+ "Danish"
+ "%1$s days ago"
+ "Cup"
+ "cup"
+ "Cuisine"
+ "Created"
+ "Crop photo"
+ "Cooking time"
+ "Confirm"
+ "CONTINUE"
+ "Combinations"
+ "cm"
+ "clove"
+ "Chinese"
+ "Challenging"
+ "CANCEL"
+ "Category"
+ "The backup file was modified elsewhere"
+ "Generates a ZIP file containing all your data that can be imported back"
+ "Malformed or corrupt backup file"
+ "Backup folder"
+ "The backup file is empty"
+ "British"
+ "Breakfast"
+ "Breads"
+ "Brazilian"
+ "Black"
+ "Beverages"
+ "Barbecue"
+ "August"
+ "ADD STEP"
+ "April"
+ "App restart required"
+ "APPLY"
+ "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
+ "Appetizers"
+ "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "ADD NOTE"
+ "ADD NEW"
+ "American"
+ "All Tags"
+ "All Cuisines"
+ "All Categories"
+ "ADD INGREDIENT"
+ "Add a recipe to perform a backup"
+ "ADD COMBINATION"
+ "All done!"
+ "ADD"
+ "About"
+ "Attach a photo"
+ "Notification settings"
+ "Timer removed"
+
diff --git a/app/resources/Android/src/main/res/values-en-rUS/strings.xml b/app/resources/Android/src/main/res/values-en-rUS/strings.xml
new file mode 100644
index 00000000..8abaf9d7
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-en-rUS/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "Timer cleared"
+ "Delay"
+ "Delay duration"
+ "minute"
+ "minutes"
+ "hour"
+ "hours"
+ "seconds"
+ "s"
+ "Cooking Timer"
+ "New timer"
+ "START"
+ "Stop"
+ "Timer %1$s"
+ "PRESETS"
+ "Timer presets"
+ "for which recipe?"
+ "Added to presets"
+ "Timer sound"
+ "Timer vibrate"
+ "System default + Black"
+ "Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "yesterday"
+ "WED"
+ "%1$s weeks ago"
+ "Vietnamese"
+ "Vegetarian"
+ "Vegan"
+ "Untitled Recipe"
+ "Unsaved changes"
+ "Unit"
+ "unit"
+ "Undefined"
+ "Turkish"
+ "TUE"
+ "tsp"
+ "separate with spaces"
+ "Tags"
+ "SEARCH IN ALL THE RECIPES?"
+ "Try Later"
+ "Translate"
+ "You tried this recipe %1$s"
+ "today"
+ "Recipes you want to try later are listed here"
+ "Title"
+ "THU"
+ "Theme"
+ "Thai"
+ "Teaspoon"
+ "tbsp"
+ "Tablespoon"
+ "System default"
+ "Start week on Monday"
+ "Swedish"
+ "Helps you choose what to cook when you can\'t decide"
+ "Shake to view random recipe"
+ "SUN"
+ "Start adding your recipes!"
+ "Step"
+ "stick"
+ "Star rating"
+ "Share recipe using..."
+ "Sort"
+ "Share recipe photo using..."
+ "Sri Lankan"
+ "Spanish"
+ "Soups"
+ "Snacks"
+ "small"
+ "selected"
+ "Slowest first"
+ "Simple"
+ "Side dishes"
+ "Share"
+ "Settings"
+ "SET"
+ "Serving"
+ "Search"
+ "September"
+ "Select recipe"
+ "Seafood"
+ "Scottish"
+ "Sauces"
+ "SAT"
+ "Salads"
+ "Russian"
+ "RESTART"
+ "Remove photo"
+ "Roll"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "Rice"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "My Healthy Recipe"
+ "recipes"
+ "Recipe removed"
+ "Recipe photo"
+ "Nothing here! Add some recipes and try again"
+ "Imported:"
+ "recipes found"
+ "Already exist:"
+ "Recipe"
+ "REMOVE"
+ "Rating"
+ "Quickest first"
+ "qt"
+ "pt"
+ "Privacy policy"
+ "Preparation time"
+ "Pound"
+ "Poultry"
+ "Portuguese"
+ "Use the plus button to add one"
+ "Meal Planner"
+ "pinch"
+ "Piece"
+ "piece"
+ "Recipe photo"
+ "Photo Grid"
+ "Patty"
+ "Pasta"
+ "oz"
+ "Ounce"
+ "Options"
+ "Oldest first"
+ "OK"
+ "October"
+ "New yield unit"
+ "New category"
+ "November"
+ "Notes"
+ "None of the recipes here matches your search"
+ "No recipes match your search"
+ "Noodles"
+ "No favorites yet"
+ "Accelerometer sensor is either disabled or is not working"
+ "Note"
+ "NOT NOW"
+ "Restart EnRecipes to use the new language"
+ "Nigerian"
+ "New unit"
+ "New recipe"
+ "Newest first"
+ "New cuisine"
+ "MON"
+ "Moderate"
+ "ml"
+ "Minimal"
+ "min"
+ "Milliliter"
+ "mg"
+ "Mexican"
+ "medium"
+ "Meat"
+ "May"
+ "March"
+ "Main dishes"
+ "%1$s months ago"
+ "Lunch"
+ "a long time ago"
+ "Loaf"
+ "Liter"
+ "List view mode"
+ "Light"
+ "leaf"
+ "lb"
+ "Last updated"
+ "large"
+ "Language"
+ "l"
+ "Korean"
+ "Kilogram"
+ "kg"
+ "Kenyan"
+ "KEEP EDITING"
+ "June"
+ "July"
+ "Join the Telegram group"
+ "Jewish"
+ "Japanese"
+ "January"
+ "Jamaican"
+ "Italian"
+ "Item"
+ "Irish"
+ "Invalid file"
+ "Interface"
+ "Instructions"
+ "Ingredients"
+ "Indian"
+ "in"
+ "Import success"
+ "Import in progress"
+ "Supports full backups exported by this app"
+ "Import failed"
+ "Import data"
+ "h"
+ "Healthy"
+ "User guide"
+ "Grocery List"
+ "Grid"
+ "Greek"
+ "Gram"
+ "View on GitHub"
+ "German"
+ "Gallon"
+ "gal"
+ "g"
+ "Your favorite recipes are listed here"
+ "FRI"
+ "French"
+ "Fluid Ounce"
+ "Filter"
+ "fl oz"
+ "Filtered recipes"
+ "Filipino"
+ "February"
+ "Favorites"
+ "Export success"
+ "Export in progress"
+ "Export full backup"
+ "EnRecipes"
+ "English"
+ "Egyptian"
+ "Edit recipe"
+ "Easy"
+ "dstspn"
+ "drop"
+ "dozen"
+ "Donate"
+ "This recipe has unsaved changes. What would you like to do?"
+ "DISCARD"
+ "Dinner"
+ "Difficulty level"
+ "Detailed"
+ "Desserts"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "December"
+ "DELETE"
+ "Database"
+ "Dark"
+ "Danish"
+ "%1$s days ago"
+ "Cup"
+ "cup"
+ "Cuisine"
+ "Created"
+ "Crop photo"
+ "Cooking time"
+ "Confirm"
+ "CONTINUE"
+ "Combinations"
+ "cm"
+ "clove"
+ "Chinese"
+ "Challenging"
+ "CANCEL"
+ "Category"
+ "The backup file was modified elsewhere"
+ "Generates a ZIP file containing all your data that can be imported back"
+ "Malformed or corrupt backup file"
+ "Backup folder"
+ "The backup file is empty"
+ "British"
+ "Breakfast"
+ "Breads"
+ "Brazilian"
+ "Black"
+ "Beverages"
+ "Barbecue"
+ "August"
+ "ADD STEP"
+ "April"
+ "App restart required"
+ "APPLY"
+ "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
+ "Appetizers"
+ "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "ADD NOTE"
+ "ADD NEW"
+ "American"
+ "All Tags"
+ "All Cuisines"
+ "All Categories"
+ "ADD INGREDIENT"
+ "Add a recipe to perform a backup"
+ "ADD COMBINATION"
+ "All done!"
+ "ADD"
+ "About"
+ "Attach a photo"
+ "Notification settings"
+ "Timer removed"
+
diff --git a/app/resources/Android/src/main/res/values-es-rAR/strings.xml b/app/resources/Android/src/main/res/values-es-rAR/strings.xml
new file mode 100644
index 00000000..6ee9f9b3
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-es-rAR/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "Adjuntá una foto"
+ "Acerca de"
+ "AGREGAR"
+ "¡Todo listo!"
+ "AGREGAR COMBINACIÓN"
+ "Agregá recetas para hacer un backup"
+ "AGREGAR INGREDIENTE"
+ "Todas las categorías"
+ "Americana"
+ "AGREGAR NUEVA"
+ "AGREGAR NOTA"
+ "Compartido vía EnRecipes. Conseguilo en F-Droid, IzzyOnDroid o en la Play Store."
+ "Aperitivos"
+ "EnRecipes es un libro de cocina digital, privado y de código abierto, que te permite crear, administrar y compartir tus recetas"
+ "APLICAR"
+ "Se requiere reiniciar la app"
+ "Abril"
+ "AGREGAR PASO"
+ "Agosto"
+ "s"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "System default + Black"
+ "Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "yesterday"
+ "WED"
+ "%1$s weeks ago"
+ "Vietnamese"
+ "Vegetarian"
+ "Vegan"
+ "Untitled Recipe"
+ "Unsaved changes"
+ "Unit"
+ "unit"
+ "Undefined"
+ "Turkish"
+ "TUE"
+ "tsp"
+ "separate with spaces"
+ "Tags"
+ "SEARCH IN ALL THE RECIPES?"
+ "Try Later"
+ "Translate"
+ "You tried this recipe %1$s"
+ "today"
+ "Recipes you want to try later are listed here"
+ "Title"
+ "THU"
+ "Theme"
+ "Thai"
+ "Teaspoon"
+ "tbsp"
+ "Tablespoon"
+ "System default"
+ "Start week on Monday"
+ "Swedish"
+ "Helps you choose what to cook when you can\'t decide"
+ "Shake to view random recipe"
+ "SUN"
+ "Start adding your recipes!"
+ "Step"
+ "stick"
+ "Star rating"
+ "Share recipe using..."
+ "Sort"
+ "Share recipe photo using..."
+ "Sri Lankan"
+ "Spanish"
+ "Soups"
+ "Snacks"
+ "small"
+ "selected"
+ "Slowest first"
+ "Simple"
+ "Side dishes"
+ "Share"
+ "Settings"
+ "SET"
+ "Serving"
+ "Search"
+ "September"
+ "Select recipe"
+ "Seafood"
+ "Scottish"
+ "Sauces"
+ "SAT"
+ "Salads"
+ "Russian"
+ "RESTART"
+ "Remove photo"
+ "Roll"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "Rice"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "My Healthy Recipe"
+ "recipes"
+ "Recipe removed"
+ "Recipe photo"
+ "Nothing here! Add some recipes and try again"
+ "Imported:"
+ "recipes found"
+ "Already exist:"
+ "Recipe"
+ "REMOVE"
+ "Rating"
+ "Quickest first"
+ "qt"
+ "pt"
+ "Privacy policy"
+ "Preparation time"
+ "Pound"
+ "Poultry"
+ "Portuguese"
+ "Use the plus button to add one"
+ "Meal Planner"
+ "pinch"
+ "Piece"
+ "piece"
+ "Recipe photo"
+ "Photo Grid"
+ "Patty"
+ "Pasta"
+ "oz"
+ "Ounce"
+ "Options"
+ "Oldest first"
+ "OK"
+ "October"
+ "New yield unit"
+ "New category"
+ "November"
+ "Notes"
+ "None of the recipes here matches your search"
+ "No recipes match your search"
+ "Noodles"
+ "No favourites yet"
+ "Accelerometer sensor is either disabled or is not working"
+ "Note"
+ "NOT NOW"
+ "Restart EnRecipes to use the new language"
+ "Nigerian"
+ "New unit"
+ "New recipe"
+ "Newest first"
+ "New cuisine"
+ "MON"
+ "Moderate"
+ "ml"
+ "Minimal"
+ "min"
+ "Millilitre"
+ "mg"
+ "Mexican"
+ "medium"
+ "Meat"
+ "May"
+ "March"
+ "Main dishes"
+ "%1$s months ago"
+ "Lunch"
+ "a long time ago"
+ "Loaf"
+ "Litre"
+ "List view mode"
+ "Light"
+ "leaf"
+ "lb"
+ "Last updated"
+ "large"
+ "Language"
+ "l"
+ "Korean"
+ "Kilogram"
+ "kg"
+ "Kenyan"
+ "KEEP EDITING"
+ "June"
+ "July"
+ "Join the Telegram group"
+ "Jewish"
+ "Japanese"
+ "January"
+ "Jamaican"
+ "Italian"
+ "Item"
+ "Irish"
+ "Invalid file"
+ "Interface"
+ "Instructions"
+ "Ingredients"
+ "Indian"
+ "in"
+ "Import success"
+ "Import in progress"
+ "Supports full backups exported by this app"
+ "Import failed"
+ "Import data"
+ "hr"
+ "Healthy"
+ "User guide"
+ "Grocery List"
+ "Grid"
+ "Greek"
+ "Gram"
+ "View on GitHub"
+ "German"
+ "Gallon"
+ "gal"
+ "g"
+ "Your favourite recipes are listed here"
+ "FRI"
+ "French"
+ "Fluid Ounce"
+ "Filter"
+ "fl oz"
+ "Filtered recipes"
+ "Filipino"
+ "February"
+ "Favourites"
+ "Export success"
+ "Export in progress"
+ "Export full backup"
+ "EnRecipes"
+ "English"
+ "Egyptian"
+ "Edit recipe"
+ "Easy"
+ "dstspn"
+ "drop"
+ "dozen"
+ "Donate"
+ "This recipe has unsaved changes. What would you like to do?"
+ "DISCARD"
+ "Dinner"
+ "Difficulty level"
+ "Detailed"
+ "Desserts"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "December"
+ "DELETE"
+ "Database"
+ "Dark"
+ "Danish"
+ "%1$s days ago"
+ "Cup"
+ "cup"
+ "Cuisine"
+ "Created"
+ "Crop photo"
+ "Cooking time"
+ "Confirm"
+ "CONTINUE"
+ "Combinations"
+ "cm"
+ "clove"
+ "Chinese"
+ "Challenging"
+ "CANCEL"
+ "Category"
+ "The backup file was modified elsewhere"
+ "Generates a ZIP file containing all your data that can be imported back"
+ "Malformed or corrupt backup file"
+ "Backup folder"
+ "The backup file is empty"
+ "British"
+ "Breakfast"
+ "Breads"
+ "Brazilian"
+ "Black"
+ "Beverages"
+ "Barbecue"
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "All Tags"
+ "All Cuisines"
+ "tmrClr"
+
diff --git a/app/resources/Android/src/main/res/values-es/strings.xml b/app/resources/Android/src/main/res/values-es/strings.xml
index 99088c99..f2acde4a 100644
--- a/app/resources/Android/src/main/res/values-es/strings.xml
+++ b/app/resources/Android/src/main/res/values-es/strings.xml
@@ -1,5 +1,26 @@
+ "Temporizador borrado"
+ "Duración del retraso"
+ "Vibrador del temporizador"
+ "Sonido del temporizador"
+ "Añadido a los preajustes"
+ "para qué receta?"
+ "Preselecciones del temporizador"
+ "PRECIPIOS"
+ "Retraso"
+ "Detener"
+ "minuto"
+ "minutos"
+ "hora"
+ "horas"
+ "segundos"
+ "Temporizador %1$s"
+ "INICIO"
+ "Nuevo temporizador"
+ "Temporizador de cocción"
+ "s"
+ "Por defecto del Sistema + Negro"
"Copia de seguridad guardada a %1$s"
"Producir"
"Unidad de medida"
@@ -292,4 +313,6 @@
"AÑADIR"
"Acerca de"
"Adjuntar una foto"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-fi/strings.xml b/app/resources/Android/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000..dcd130d5
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-fi/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "minuutti"
+ "tunti"
+ "minuuttia"
+ "tuntia"
+ "sekuntia"
+ "Viiveen kesto"
+ "s"
+ "ESIASETUKSET"
+ "Ajastimen esiasetukset"
+ "mitä reseptiä varten?"
+ "Lisätty esiasetuksiin"
+ "Ajastinääni"
+ "Keittoajastin"
+ "Uusi ajastin"
+ "Pysäytä"
+ "Ajastin %1$s"
+ "Järjestelmän oletusarvo + Musta"
+ ""
+ ""
+ ""
+ ""
+ "eilen"
+ "ke"
+ "%1$s viikkoa sitten"
+ "vietnamilainen"
+ "Kasvissyöjä"
+ "Vegaani"
+ ""
+ ""
+ ""
+ ""
+ "Määrittelemätön"
+ ""
+ "ti"
+ ""
+ ""
+ "Tunnisteet"
+ "ETSI KAIKISTA RESEPTEISTÄ?"
+ ""
+ "Käännä"
+ "Kokeilit tätä reseptiä %1$s"
+ "tänään"
+ "Reseptit, joita haluat kokeilla myöhemmin, on lueteltu täällä"
+ "Otsikko"
+ "to"
+ "Teema"
+ "thaimaalainen"
+ ""
+ ""
+ ""
+ "Järjestelmän oletus"
+ "Aloita viikko maanantaina"
+ "ruotsalainen"
+ "Auttaa sinua valitsemaan, mitä valmistaa, kun et osaa päättää."
+ "Ravista nähdäksesi satunnainen resepti"
+ "su"
+ ""
+ ""
+ ""
+ ""
+ "Jaa resepti käyttämällä…"
+ "Järjestä"
+ "Jaa reseptikuva käyttämällä…"
+ "srilankalainen"
+ "espanjalainen"
+ "Keitot"
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ "Jaa"
+ "Asetukset"
+ "ASETA"
+ ""
+ "Etsi"
+ ""
+ ""
+ ""
+ "skotlantilainen"
+ "Kastikkeet"
+ "la"
+ "Salaatit"
+ "venäläinen"
+ "UUDELLEENKÄYNNISTÄ"
+ "Poista valokuva"
+ ""
+ ""
+ ""
+ "Huomautus poistettu"
+ "Ohje poistettu"
+ "Ainesosa poistettu"
+ ""
+ "Yhdistelmä poistettu"
+ "Olet poistamassa %1$s luokkaluettelosta"
+ "Riisi"
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ "Nollaa"
+ ""
+ ""
+ "Päivitetty:"
+ "Minun terveellinen reseptini"
+ "reseptiä"
+ "Resepti poistettu"
+ "Reseptivalokuva"
+ ""
+ ""
+ "löydettyä reseptiä"
+ "On jo olemassa:"
+ "Resepti"
+ "POISTA"
+ ""
+ ""
+ ""
+ ""
+ "Tietosuojakäytäntö"
+ "Valmisteluaika"
+ ""
+ ""
+ "portugalilainen"
+ "Lisää resepti pluspainikkeella"
+ "Ateriasuunnittelija"
+ ""
+ "Pala"
+ "pala"
+ "Reseptivalokuva"
+ ""
+ ""
+ ""
+ ""
+ ""
+ "Valinnat"
+ ""
+ "OK"
+ "lokakuu"
+ ""
+ "Uusi luokka"
+ "marraskuu"
+ ""
+ ""
+ "Hakua vastaavia reseptejä ei ole"
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ "Kieli"
+ "l"
+ "korealainen"
+ "kilogramma"
+ "kg"
+ ""
+ ""
+ "kesäkuu"
+ "heinäkuu"
+ ""
+ "juutalainen"
+ "japanilainen"
+ "tammikuu"
+ ""
+ ""
+ ""
+ "irlantilainen"
+ "Virheellinen tiedosto"
+ "Käyttöliittymä"
+ "Ohjeet"
+ "Ainekset"
+ "intialainen"
+ ""
+ "Tuonti onnistui"
+ "Tuonti käynnissä"
+ "Tukee tämän sovelluksen viemiä täydellisiä varmuuskopioita"
+ "Tuonti epäonnistui"
+ "Tuo tietoja"
+ "t."
+ "Terveellinen"
+ "Käyttöopas"
+ "Ostoslista"
+ ""
+ "kreikkalainen"
+ "gramma"
+ "Näytä GitHub:ssa"
+ "saksalainen"
+ ""
+ ""
+ "g"
+ "Suosikkireseptisi on lueteltu täällä"
+ "pe"
+ "ranskalainen"
+ ""
+ ""
+ ""
+ "Suodatetut reseptit"
+ ""
+ "helmikuu"
+ ""
+ ""
+ "Vienti käynnissä"
+ "Vie koko varmuuskopio"
+ ""
+ "englantilainen"
+ "egyptiläinen"
+ "Muokkaa resepti"
+ "Helppo"
+ ""
+ ""
+ "tusina"
+ "Lahjoita"
+ "Tässä reseptissä on tallentamattomia muutoksia. Mitä haluaisit tehdä?"
+ "HYLKÄÄ"
+ "Illallinen"
+ "Vaikeustaso"
+ "Yksityiskohtainen"
+ "Jälkiruoat"
+ "Olet poistamassa %1$s pysyvästi"
+ "Olet poistamassa reseptiä %1$s pysyvästi"
+ "joulukuu"
+ "POISTA"
+ "Tietokanta"
+ "Tumma"
+ "tanskalainen"
+ "%1$s päivää sitten"
+ "Kuppi"
+ "cup"
+ "Keittiö"
+ "Luotu"
+ "Rajaa kuva"
+ "Kypsennysaika"
+ "Vahvista"
+ "JATKA"
+ "Yhdistelmät"
+ "cm"
+ "kynsi"
+ "kiinalainen"
+ "Haastava"
+ "PERUUTA"
+ "Luokka"
+ "Varmuuskopiotiedostoa muutettiin muualla"
+ "Luo ZIP-tiedoston, joka sisältää kaikki tiedot, jotka voidaan tuoda takaisin"
+ "Virheellinen tai vioittunut varmuuskopiotiedosto"
+ "Varmuuskopioiden hakemisto"
+ "Varmuuskopiotiedosto on tyhjä"
+ "brittiläinen"
+ "Aamiainen"
+ "Leivät"
+ "brasilialainen"
+ "Musta"
+ "Juomat"
+ "Grilli"
+ "elokuu"
+ ""
+ "huhtikuu"
+ "Sovelluksen uudelleenkäynnistys vaaditaan"
+ "KÄYTÄ"
+ "EnRecipes on avoimen lähdekoodin, yksityisyyden suojaa kunnioittava digitaalinen keittokirja, jonka avulla voit luoda, hallita ja jakaa reseptejäsi"
+ "Alkupalat"
+ "Jaettu EnRecipesin kautta. Lataa se F-Droidista, IzzyOnDroidista tai Play Storesta."
+ ""
+ ""
+ ""
+ "LISÄÄ HUOMAUTUS"
+ "LISÄÄ UUSI"
+ "amerikkalainen"
+ "Kaikki tunnisteet"
+ "Kaikki keittiöt"
+ "Kaikki luokat"
+ "LISÄÄ AINESOSA"
+ "Lisää resepti varmuuskopioinnin suorittamiseen"
+ "LISÄÄ YHDISTELMÄ"
+ "Valmista!"
+ "LISÄÄ"
+ "Tietoja"
+ "Liitä valokuva"
+ "Notification settings"
+ "Timer removed"
+ "Timer vibrate"
+ "Delay"
+ "START"
+ "tmrClr"
+
diff --git a/app/resources/Android/src/main/res/values-fr-rBE/strings.xml b/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
index 4f7fdc6f..1b1f01f6 100644
--- a/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
@@ -1,5 +1,26 @@
+ "Minuterie effacée"
+ "Retard"
+ "Durée du retard"
+ "minute"
+ "minutes"
+ "heure"
+ "heures"
+ "secondes"
+ "s"
+ "Minuterie de cuisson"
+ "Nouvelle minuterie"
+ "DÉMARRER"
+ "Arrêter"
+ "Minuterie %1$s"
+ "PRÉRÉGLAGES"
+ "Préréglages de la minuterie"
+ "pour quelle recette ?"
+ "Ajouté aux préréglages"
+ "Son de la minuterie"
+ "Vibreur de la minuterie"
+ "Selon le système + Noir"
"Sauvegardé dans %1$s"
"Rendement"
"Unité de rendement"
@@ -21,7 +42,7 @@
"séparez par des espaces"
"Étiquettes"
"RECHERCHE DANS TOUTES LES RECETTES ?"
- "Essayer plus tard"
+ "À essayer plus tard"
"Traduire"
"Vous avez essayé cette recette %1$s"
"aujourd’hui"
@@ -49,7 +70,7 @@
"sri-lankaise"
"espagnole"
"Soupes"
- "en-cas"
+ "En-cas"
"petit"
"sélectionné"
"La plus lente d’abord"
@@ -88,7 +109,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requise"
+ "%1$s requis(e)"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -110,7 +131,7 @@
"Volaille"
"portugaise"
"Utilisez le bouton plus pour en ajouter une"
- "Organisateur de repas"
+ "Planificateur de repas"
"pincée"
"Morceau"
"morceau"
@@ -154,8 +175,8 @@
"mai"
"mars"
"Plats principaux"
- "Il ya %1$s mois"
- "diner"
+ "Il y a %1$s mois"
+ "Diner"
"il y a longtemps"
"Miche"
"Litre"
@@ -229,7 +250,7 @@
"Faire un don"
"Cette recette a des modifications non enregistrées. Que voudriez-vous faire ?"
"IGNORER"
- "souper"
+ "Souper"
"Niveau de difficulté"
"Détaillée"
"Desserts"
@@ -292,4 +313,6 @@
"AJOUTER"
"À propos"
"Joindre une photo"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-fr-rCA/strings.xml b/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
index ed55dc71..a38eaa2c 100644
--- a/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
@@ -1,5 +1,26 @@
+ "Minuterie effacée"
+ "Retard"
+ "Durée du retard"
+ "minute"
+ "minutes"
+ "heure"
+ "heures"
+ "secondes"
+ "s"
+ "Minuterie de cuisson"
+ "Nouvelle minuterie"
+ "DÉMARRER"
+ "Arrêter"
+ "Minuterie %1$s"
+ "PRÉRÉGLAGES"
+ "Préréglages de la minuterie"
+ "pour quelle recette?"
+ "Ajouté aux préréglages"
+ "Son de la minuterie"
+ "Vibreur de la minuterie"
+ "Selon le système + Noir"
"Sauvegardé dans %1$s"
"Rendement"
"Unité de rendement"
@@ -21,7 +42,7 @@
"séparez par des espaces"
"Étiquettes"
"RECHERCHE DANS TOUTES LES RECETTES?"
- "Essayer plus tard"
+ "À essayer plus tard"
"Traduire"
"Vous avez essayé cette recette %1$s"
"aujourd’hui"
@@ -49,7 +70,7 @@
"sri-lankaise"
"espagnole"
"Soupes"
- "en-cas"
+ "En-cas"
"petit"
"sélectionné"
"La plus lente d’abord"
@@ -88,7 +109,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requise"
+ "%1$s requis(e)"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -110,7 +131,7 @@
"Volaille"
"portugaise"
"Utilisez le bouton plus pour en ajouter une"
- "Organisateur de repas"
+ "Planificateur de repas"
"pincée"
"Morceau"
"morceau"
@@ -154,8 +175,8 @@
"mai"
"mars"
"Plats principaux"
- "Il ya %1$s mois"
- "dîner"
+ "Il y a %1$s mois"
+ "Dîner"
"il y a longtemps"
"Miche"
"Litre"
@@ -229,7 +250,7 @@
"Faire un don"
"Cette recette a des modifications non enregistrées. Que voudriez-vous faire?"
"IGNORER"
- "souper"
+ "Souper"
"Niveau de difficulté"
"Détaillée"
"Desserts"
@@ -292,4 +313,6 @@
"AJOUTER"
"À propos"
"Joindre une photo"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-fr-rCH/strings.xml b/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
index 00f0bd80..36631328 100644
--- a/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
@@ -1,5 +1,26 @@
+ "Minuterie effacée"
+ "Retard"
+ "Durée du retard"
+ "minute"
+ "minutes"
+ "heure"
+ "heures"
+ "secondes"
+ "s"
+ "Minuterie de cuisson"
+ "Nouvelle minuterie"
+ "DÉMARRER"
+ "Arrêter"
+ "Minuterie %1$s"
+ "PRÉRÉGLAGES"
+ "Préréglages de la minuterie"
+ "pour quelle recette?"
+ "Ajouté aux préréglages"
+ "Son de la minuterie"
+ "Vibreur de la minuterie"
+ "Selon le système + Noir"
"Sauvegardé dans %1$s"
"Rendement"
"Unité de rendement"
@@ -21,7 +42,7 @@
"séparez par des espaces"
"Étiquettes"
"RECHERCHE DANS TOUTES LES RECETTES?"
- "Essayer plus tard"
+ "À essayer plus tard"
"Traduire"
"Vous avez essayé cette recette %1$s"
"aujourd’hui"
@@ -49,7 +70,7 @@
"sri-lankaise"
"espagnole"
"Soupes"
- "en-cas"
+ "En-cas"
"petit"
"sélectionné"
"La plus lente d’abord"
@@ -88,7 +109,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requise"
+ "%1$s requis(e)"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -110,7 +131,7 @@
"Volaille"
"portugaise"
"Utilisez le bouton plus pour en ajouter une"
- "Organisateur de repas"
+ "Planificateur de repas"
"pincée"
"Morceau"
"morceau"
@@ -154,8 +175,8 @@
"mai"
"mars"
"Plats principaux"
- "Il ya %1$s mois"
- "dîner"
+ "Il y a %1$s mois"
+ "Dîner"
"il y a longtemps"
"Miche"
"Litre"
@@ -229,7 +250,7 @@
"Faire un don"
"Cette recette a des modifications non enregistrées. Que voudriez-vous faire?"
"IGNORER"
- "souper"
+ "Souper"
"Niveau de difficulté"
"Détaillée"
"Desserts"
@@ -292,4 +313,6 @@
"AJOUTER"
"À propos"
"Joindre une photo"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-fr/strings.xml b/app/resources/Android/src/main/res/values-fr/strings.xml
index 715b7271..333240ba 100644
--- a/app/resources/Android/src/main/res/values-fr/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr/strings.xml
@@ -1,5 +1,26 @@
+ "Minuterie effacée"
+ "Retard"
+ "Durée du retard"
+ "minute"
+ "minutes"
+ "heure"
+ "heures"
+ "secondes"
+ "s"
+ "Minuterie de cuisson"
+ "Nouvelle minuterie"
+ "DÉMARRER"
+ "Arrêter"
+ "Minuterie %1$s"
+ "PRÉRÉGLAGES"
+ "Préréglages de la minuterie"
+ "pour quelle recette ?"
+ "Ajouté aux préréglages"
+ "Son de la minuterie"
+ "Vibreur de la minuterie"
+ "Selon le système + Noir"
"Sauvegardé dans %1$s"
"Rendement"
"Unité de portion"
@@ -7,7 +28,7 @@
"hier"
"mer"
"il y a %1$s semaines"
- "Vietnamienne"
+ "vietnamienne"
"Végétarien"
"Végétalien"
"Recette sans titre"
@@ -15,13 +36,13 @@
"Unité"
"unité"
"Indéfini"
- "Turque"
+ "turque"
"mar"
"c.à.c"
"séparez par des espaces"
"Étiquettes"
"RECHERCHE DANS TOUTES LES RECETTES ?"
- "Essayer plus tard"
+ "À essayer plus tard"
"Traduire"
"Vous avez essayé cette recette %1$s"
"aujourd’hui"
@@ -29,13 +50,13 @@
"Titre"
"jeu"
"Thème"
- "Thaïlandaise"
+ "thaïlandaise"
"Cuillère à café"
"cuillérée"
"Cuillère à soupe"
"Selon le système"
"Début de la semaine le lundi"
- "Suédoise"
+ "suédoise"
"Vous aide à choisir quoi cuisiner quand vous ne pouvez pas vous décider"
"Secouez pour voir une recette au hasard"
"dim"
@@ -46,14 +67,14 @@
"Partager la recette en utilisant…"
"Trier"
"Partager une photo de recette en utilisant…"
- "Sri-lankaise"
- "Espagnole"
+ "sri-lankaise"
+ "espagnole"
"Soupes"
- "en-cas"
+ "En-cas"
"petit"
"sélectionné"
"La plus lente d’abord"
- "Simple"
+ "Simplicité"
"Plats d’accompagnement"
"Partager"
"Paramètres"
@@ -63,11 +84,11 @@
"septembre"
"Sélectionner une recette"
"Fruits de mer"
- "Écossaise"
- "Sauces"
+ "écossaise"
+ "Soupes"
"sam"
"Salades"
- "Russe"
+ "russe"
"REDÉMARRER"
"Retirer la photo"
"Rouleau"
@@ -88,7 +109,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requise"
+ "%1$s requis(e)"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -108,9 +129,9 @@
"Temps de préparation"
"Livre"
"Volaille"
- "Portugaise"
+ "portugaise"
"Utilisez le bouton plus pour en ajouter une"
- "Organisateur de repas"
+ "Planificateur de repas"
"pincée"
"Morceau"
"morceau"
@@ -136,7 +157,7 @@
"Note"
"PAS MAINTENANT"
"Redémarrez EnRecipes pour utiliser la nouvelle langue"
- "Nigériane"
+ "nigériane"
"Nouvelle unité"
"Nouvelle recette"
"La plus récente d’abord"
@@ -146,19 +167,19 @@
"ml"
"Minimale"
"min"
- "Millilitre"
+ "Millilette"
"mg"
- "Mexicaine"
+ "mexicaine"
"moyen"
"Viande"
"mai"
"mars"
"Plats principaux"
- "Il ya %1$s mois"
- "déjeuner"
+ "Il y a %1$s mois"
+ "Déjeuner"
"il y a longtemps"
"Miche"
- "Litre"
+ "Leitre"
"Type de vue en liste"
"Clair"
"feuille"
@@ -167,26 +188,26 @@
"grand"
"Langue"
"l"
- "Coréenne"
+ "coréenne"
"Kilogramme"
"kg"
- "Kényane"
+ "kényane"
"CONTINUER"
"juin"
"juillet"
"Rejoignez le groupe Telegram"
- "Juive"
- "Japonaise"
+ "juive"
+ "japonaise"
"janvier"
- "Jamaïcaine"
- "Italienne"
+ "jamaïcaine"
+ "italienne"
"Élément"
- "Irlandaise"
+ "irlandaise"
"Fichier invalide"
"Interface"
"Instructions"
"Ingrédients"
- "Indienne"
+ "indienne"
"in"
"Importation réussie"
"Importation en cours"
@@ -198,29 +219,29 @@
"Guide d’utilisation"
"Liste de courses"
"Grille"
- "Grecque"
+ "grecque"
"Gramme"
"Voir sur GitHub"
- "Allemande"
- "Gallon"
+ "allemande"
+ "Galon"
"gal"
"g"
"Vos recettes favorites sont listées ici"
"ven"
- "Française"
+ "française"
"Once liquide"
"Filtre"
"oz liq"
"Recettes filtrées"
- "Philippine"
+ "philippine"
"février"
"Favoris"
"Exportation réussie"
"Exportation en cours"
"Exporter une sauvegarde complète"
"EnRecipes"
- "Anglaise"
- "Égyptienne"
+ "anglaise"
+ "égyptienne"
"Modifier la recette"
"Facile"
"c.à.d"
@@ -229,21 +250,21 @@
"Faire un don"
"Cette recette a des modifications non enregistrées. Que voudriez-vous faire ?"
"IGNORER"
- "dîner"
+ "Dîner"
"Niveau de difficulté"
"Détaillée"
- "Desserts"
+ "Délices"
"Vous êtes sur le point de supprimer définitivement %1$s"
"Vous êtes sur le point de supprimer définitivement la recette %1$s"
"décembre"
"SUPPRIMER"
"Base de données"
"Sombre"
- "Danoise"
+ "danoise"
"il y a %1$s jours"
"Tasse"
"tasse"
- "Cuisine"
+ "Cuisines"
"Créé le"
"Recadrer la photo"
"Temps de cuisson"
@@ -252,7 +273,7 @@
"Combinaisons"
"cm"
"gousse"
- "Chinoise"
+ "chinoise"
"Difficile"
"ANNULER"
"Catégorie"
@@ -261,13 +282,13 @@
"Fichier de sauvegarde mal formé ou corrompu"
"Dossier de sauvegarde"
"La sauvegarde est vide"
- "Britannique"
+ "britannique"
"Petit déjeuner"
"Pains"
"Brésilienne"
"Noir"
"Boissons"
- "Barbecue"
+ "Grillades"
"août"
"AJOUTER UNE ÉTAPE"
"avril"
@@ -292,4 +313,6 @@
"AJOUTER"
"À propos"
"Joindre une photo"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-hi/strings.xml b/app/resources/Android/src/main/res/values-hi/strings.xml
index 42988824..edf58ac0 100644
--- a/app/resources/Android/src/main/res/values-hi/strings.xml
+++ b/app/resources/Android/src/main/res/values-hi/strings.xml
@@ -1,5 +1,26 @@
+ "सेकंड"
+ "कुकिंग टाइमर"
+ "नया टाइमर"
+ "शुरू"
+ "रुकें"
+ "देरी"
+ "टाइमर%1$s"
+ "प्रीसेट"
+ "टाइमर प्रीसेट"
+ "प्रीसेट में जोड़ा गया"
+ "टाइमर की आवाज़"
+ "टाइमर वाइब्रेट"
+ "विलंब अवधि"
+ "मिनट"
+ "मिनटो"
+ "घंटा"
+ "घंटे"
+ "सेकंड"
+ "टाइमर साफ"
+ "किस विधि के लिए?"
+ "प्रणालीगत चूक + काला"
"%1$s में बैकअप लिया गया"
"मान जाना"
"उपज इकाई"
@@ -292,4 +313,6 @@
"जोड़ें"
"तकरीबन"
"एक तस्वीर लगाओ"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-id/strings.xml b/app/resources/Android/src/main/res/values-id/strings.xml
index 30799337..0f6571b1 100644
--- a/app/resources/Android/src/main/res/values-id/strings.xml
+++ b/app/resources/Android/src/main/res/values-id/strings.xml
@@ -1,5 +1,26 @@
+ "Berhenti"
+ "Menunda"
+ "Timer %1$s"
+ "PRESET"
+ "Preset timer"
+ "untuk resep yang mana?"
+ "Ditambahkan ke preset"
+ "Suara timer"
+ "Timer bergetar"
+ "Durasi penundaan"
+ "menit"
+ "menit"
+ "jam"
+ "jam"
+ "detik"
+ "Timer dibersihkan"
+ "Timer Memasak"
+ "Timer baru"
+ "MULAI"
+ "s"
+ "Default sistem + Hitam"
"Didukung ke %1$s"
"Menghasilkan"
"Satuan hasil"
@@ -292,4 +313,6 @@
"Tambah"
"Tentang"
"Lampirkan foto"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-it/strings.xml b/app/resources/Android/src/main/res/values-it/strings.xml
index 6ab45dec..3fc11eab 100644
--- a/app/resources/Android/src/main/res/values-it/strings.xml
+++ b/app/resources/Android/src/main/res/values-it/strings.xml
@@ -1,5 +1,26 @@
+ "Contaminuti cancellato"
+ "Ritardo"
+ "Durata del ritardo"
+ "minuto"
+ "minuti"
+ "ora"
+ "ore"
+ "secondi"
+ "s"
+ "Ferma"
+ "Preimpostazioni"
+ "Preimpostazioni del contaminuti"
+ "per quale ricetta?"
+ "Aggiunto alle preimpostazioni"
+ "Suono del contaminuti"
+ "Vibrazione contaminuti"
+ "Contaminuti di cottura"
+ "Nuovo contaminuti"
+ "AVVIA"
+ "Contaminuti %1$s"
+ "Predefinito del sistema + Nero"
"Backup salvato in %1$s"
"Resa"
"Unità di resa"
@@ -21,7 +42,7 @@
"separa con spazi"
"Etichette"
"CERCARE IN TUTTE LE RICETTE?"
- "Prova più tardi"
+ "Da provare più tardi"
"Traduci"
"Hai provato questa ricetta %1$s"
"oggi"
@@ -117,7 +138,7 @@
"Foto ricetta"
"Griglia di foto"
"Polpetta"
- "Pasta"
+ "Pastore"
"oz"
"Oncia"
"Opzioni"
@@ -292,4 +313,6 @@
"AGGIUNGI"
"Informazioni"
"Allega una foto"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-ja/strings.xml b/app/resources/Android/src/main/res/values-ja/strings.xml
new file mode 100644
index 00000000..8295639c
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-ja/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "中"
+ "大"
+ "小"
+ "材料"
+ "ポンド"
+ "オンス"
+ "ピンチ"
+ "スティック"
+ "あとで"
+ "未定義"
+ "中の"
+ "システム既定+黒"
+ "%1$s としてバックアップしました"
+ "仕上がり分量"
+ "仕上がり分量の単位"
+ "仕上がり分量"
+ "昨日"
+ "水"
+ "%1$s 週前"
+ "ベトナム料理"
+ "ベジタリアン"
+ "ビーガン"
+ "無題のレシピ"
+ "未保存の変更"
+ "単位"
+ "個"
+ "トルコ料理"
+ "火"
+ "小さじ"
+ "スペースで区切ってください"
+ "タグ"
+ "全てのレシピを検索しますか?"
+ "あとで作る"
+ "翻訳"
+ "に作りました"
+ "今日"
+ "あとで試したいレシピはここに並びます"
+ "タイトル"
+ "木"
+ "テーマ"
+ "タイ料理"
+ "小さじ"
+ "大さじ"
+ "大さじ"
+ "システム既定"
+ "月曜始まりにする"
+ "スウェーデン料理"
+ "何を作るか決められないときに使います"
+ "振ってランダムなレシピを表示"
+ "日"
+ "レシピを追加しましょう!"
+ "作り方"
+ "星評価"
+ "レシピを共有..."
+ "並び替え"
+ "レシピの写真を共有..."
+ "スリランカ料理"
+ "スペイン料理"
+ "スープ"
+ "軽食"
+ "選択"
+ "遅い順"
+ "シンプル"
+ "副菜"
+ "共有"
+ "設定"
+ "設定"
+ "人前"
+ "検索"
+ "9月"
+ "レシピを選択"
+ "シーフード"
+ "スコットランド料理"
+ "ソース"
+ "土"
+ "サラダ"
+ "ロシア料理"
+ "再起動"
+ "写真を削除"
+ "ロール"
+ "仕上がり分量の単位のリストから %1$s を削除しようとしています"
+ "単位のリストから %1$s を削除しようとしています"
+ "メモが削除されました"
+ "作り方を削除しました"
+ "材料を削除しました"
+ "ジャンルのリストから %1$s を削除しようとしています"
+ "組合せが削除されました"
+ "カテゴリーのリストから %1$s を削除しようとしています"
+ "お米料理"
+ "仕上がり分量の単位のリストをリセットする"
+ "単位のリストをリセットする"
+ "リストをリセットすると、作成した項目が削除され、既定の項目を復元します。既にあるレシピには影響しません。"
+ "リセットが完了しました"
+ "ジャンルのリストをリセット"
+ "カテゴリーリストをリセット"
+ "リセット"
+ "レシピが見つかりません"
+ "%1$s が必要"
+ "アップデート:"
+ "私の健康レシピ"
+ "レシピ"
+ "レシピを削除しました"
+ "レシピの写真"
+ "まだ何もありません!レシピを追加してもう一度試してください"
+ "インポートしました:"
+ "件のレシピが見つかりました"
+ "既に存在します:"
+ "レシピ"
+ "削除"
+ "評価"
+ "速いもの順"
+ "クォート"
+ "少々"
+ "プライバシーポリシー"
+ "準備時間"
+ "ポンド"
+ "チキン料理"
+ "ポルトガル料理"
+ "プラスボタンを押して追加します"
+ "献立プラン"
+ "片"
+ "片"
+ "レシピの写真"
+ "写真グリッド"
+ "パティ"
+ "パスタ"
+ "オンス"
+ "オプション"
+ "古いもの順"
+ "OK"
+ "10月"
+ "新しい仕上がり単位"
+ "新しいカテゴリー"
+ "11月"
+ "メモ"
+ "検索に一致するレシピが見つかりませんでした"
+ "検索に一致するレシピがありません"
+ "麺"
+ "お気に入りはまだありません"
+ "加速度センサーが無効です"
+ "メモ"
+ "新しい言語を使用するためにEnRecipesを再起動"
+ "ナイジェリア料理"
+ "新しい単位"
+ "新しいレシピ"
+ "新しい順"
+ "新しいジャンル"
+ "月"
+ "普通"
+ "ml"
+ "最小"
+ "分"
+ "ミリリットル"
+ "mg"
+ "メキシコ料理"
+ "肉料理"
+ "5月"
+ "3月"
+ "主菜"
+ "%1$s か月前"
+ "昼食"
+ "ずっと前"
+ "ローフ"
+ "リットル"
+ "一覧の表示方法"
+ "ライト"
+ "枚"
+ "最終更新"
+ "言語"
+ "リットル"
+ "韓国料理"
+ "キログラム"
+ "kg"
+ "ケニア料理"
+ "編集を続ける"
+ "6月"
+ "7月"
+ "Telegramグループに参加"
+ "ユダヤ料理"
+ "和食"
+ "1月"
+ "ジャマイカ料理"
+ "イタリア料理"
+ "アイルランド料理"
+ "無効なファイルです"
+ "インターフェイス"
+ "作り方"
+ "材料"
+ "インド料理"
+ "インポートに成功"
+ "インポートを実行中"
+ "アプリからエクスポートしたフルバックアップに対応しています"
+ "インポートに失敗"
+ "データをインポート"
+ "時間"
+ "ヘルシー"
+ "ユーザーガイド"
+ "食材のリスト"
+ "グリッド"
+ "ギリシャ料理"
+ "グラム"
+ "GitHubで見る"
+ "ドイツ料理"
+ "ガロン"
+ "ガロン"
+ "g"
+ "お気に入りのレシピはここに表示されます"
+ "金"
+ "フランス料理"
+ "液量オンス"
+ "絞り込み"
+ "液量オンス"
+ "絞り込み結果"
+ "フィリピン料理"
+ "2月"
+ "お気に入り"
+ "エクスポートに成功"
+ "エクスポートを実行中"
+ "バックアップをエクスポート"
+ "イングランド料理"
+ "エジプト料理"
+ "レシピを編集する"
+ "簡単"
+ "デザート用スプーン"
+ "滴"
+ "ダース"
+ "寄付する"
+ "レシピの変更が保存されていません。どうしますか?"
+ "破棄"
+ "夕食"
+ "難易度"
+ "詳細"
+ "デザート"
+ "%1$s 件のレシピを削除しようとしています"
+ "レシピ %1$s を削除しようとしています"
+ "12月"
+ "削除"
+ "データベース"
+ "ダーク"
+ "デンマーク料理"
+ "%1$s 日前"
+ "カップ"
+ "カップ"
+ "ジャンル"
+ "作成日時"
+ "写真を切り抜く"
+ "調理時間"
+ "確認"
+ "続ける"
+ "組合せ"
+ "cm"
+ "クローブ"
+ "中華料理"
+ "難しい"
+ "キャンセル"
+ "カテゴリー"
+ "バックアップファイルが一部修正されています"
+ "全てのデータを復元するためのZIPファイルを生成します"
+ "バックアップファイルが壊れています"
+ "バックアップフォルダー"
+ "バックアップファイルが空です"
+ "イギリス料理"
+ "朝食"
+ "パン"
+ "ブラジル料理"
+ "黒"
+ "飲物"
+ "キャンプ料理"
+ "8月"
+ "手順を追加"
+ "4月"
+ "アプリの再起動が必要"
+ "適用する"
+ "EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です"
+ "前菜"
+ "EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。"
+ "メモを追加"
+ "新しく追加"
+ "アメリカ料理"
+ "全てのタグ"
+ "全てのジャンル"
+ "全てのカテゴリー"
+ "材料を追加"
+ "バックアップするにはレシピを登録してください"
+ "組合せを追加"
+ "完了しました!"
+ "追加"
+ "アプリについて"
+ "写真を添付"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "sec"
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "tmrClr"
+
diff --git a/app/resources/Android/src/main/res/values-kn/strings.xml b/app/resources/Android/src/main/res/values-kn/strings.xml
new file mode 100644
index 00000000..d91f9e1d
--- /dev/null
+++ b/app/resources/Android/src/main/res/values-kn/strings.xml
@@ -0,0 +1,318 @@
+
+
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "System default + Black"
+ "Backed up to %1$s"
+ "Yield"
+ "Yield unit"
+ "Yield quantity"
+ "yesterday"
+ "WED"
+ "%1$s weeks ago"
+ "Vietnamese"
+ "Vegetarian"
+ "Vegan"
+ "Untitled Recipe"
+ "Unsaved changes"
+ "Unit"
+ "unit"
+ "Undefined"
+ "Turkish"
+ "TUE"
+ "tsp"
+ "separate with spaces"
+ "Tags"
+ "SEARCH IN ALL THE RECIPES?"
+ "Try Later"
+ "Translate"
+ "You tried this recipe %1$s"
+ "today"
+ "Recipes you want to try later are listed here"
+ "Title"
+ "THU"
+ "Theme"
+ "Thai"
+ "Teaspoon"
+ "tbsp"
+ "Tablespoon"
+ "System default"
+ "Start week on Monday"
+ "Swedish"
+ "Helps you choose what to cook when you can\'t decide"
+ "Shake to view random recipe"
+ "SUN"
+ "Start adding your recipes!"
+ "Step"
+ "stick"
+ "Star rating"
+ "Share recipe using..."
+ "Sort"
+ "Share recipe photo using..."
+ "Sri Lankan"
+ "Spanish"
+ "Soups"
+ "Snacks"
+ "small"
+ "selected"
+ "Slowest first"
+ "Simple"
+ "Side dishes"
+ "Share"
+ "Settings"
+ "SET"
+ "Serving"
+ "Search"
+ "September"
+ "Select recipe"
+ "Seafood"
+ "Scottish"
+ "Sauces"
+ "SAT"
+ "Salads"
+ "Russian"
+ "RESTART"
+ "Remove photo"
+ "Roll"
+ "You are about to remove %1$s from the yield unit list"
+ "You are about to remove %1$s from the unit list"
+ "Note removed"
+ "Instruction removed"
+ "Ingredient removed"
+ "You are about to remove %1$s from the cuisine list"
+ "Combination removed"
+ "You are about to remove %1$s from the category list"
+ "Rice"
+ "Reset yield unit list"
+ "Reset unit list"
+ "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
+ "Reset done"
+ "Reset cuisine list"
+ "Reset category list"
+ "Reset"
+ "Recipe not found"
+ "Required %1$s"
+ "Updated:"
+ "My Healthy Recipe"
+ "recipes"
+ "Recipe removed"
+ "Recipe photo"
+ "Nothing here! Add some recipes and try again"
+ "Imported:"
+ "recipes found"
+ "Already exist:"
+ "Recipe"
+ "REMOVE"
+ "Rating"
+ "Quickest first"
+ "qt"
+ "pt"
+ "Privacy policy"
+ "Preparation time"
+ "Pound"
+ "Poultry"
+ "Portuguese"
+ "Use the plus button to add one"
+ "Meal Planner"
+ "pinch"
+ "Piece"
+ "piece"
+ "Recipe photo"
+ "Photo Grid"
+ "Patty"
+ "Pasta"
+ "oz"
+ "Ounce"
+ "Options"
+ "Oldest first"
+ "OK"
+ "October"
+ "New yield unit"
+ "New category"
+ "November"
+ "Notes"
+ "None of the recipes here matches your search"
+ "No recipes match your search"
+ "Noodles"
+ "No favourites yet"
+ "Accelerometer sensor is either disabled or is not working"
+ "Note"
+ "NOT NOW"
+ "Restart EnRecipes to use the new language"
+ "Nigerian"
+ "New unit"
+ "New recipe"
+ "Newest first"
+ "New cuisine"
+ "MON"
+ "Moderate"
+ "ml"
+ "Minimal"
+ "sec"
+ "min"
+ "Millilitre"
+ "mg"
+ "Mexican"
+ "medium"
+ "Meat"
+ "May"
+ "March"
+ "Main dishes"
+ "%1$s months ago"
+ "Lunch"
+ "a long time ago"
+ "Loaf"
+ "Litre"
+ "List view mode"
+ "Light"
+ "leaf"
+ "lb"
+ "Last updated"
+ "large"
+ "Language"
+ "l"
+ "Korean"
+ "Kilogram"
+ "kg"
+ "Kenyan"
+ "KEEP EDITING"
+ "June"
+ "July"
+ "Join the Telegram group"
+ "Jewish"
+ "Japanese"
+ "January"
+ "Jamaican"
+ "Italian"
+ "Item"
+ "Irish"
+ "Invalid file"
+ "Interface"
+ "Instructions"
+ "Ingredients"
+ "Indian"
+ "in"
+ "Import success"
+ "Import in progress"
+ "Supports full backups exported by this app"
+ "Import failed"
+ "Import data"
+ "hr"
+ "Healthy"
+ "User guide"
+ "Grocery List"
+ "Grid"
+ "Greek"
+ "Gram"
+ "View on GitHub"
+ "German"
+ "Gallon"
+ "gal"
+ "g"
+ "Your favourite recipes are listed here"
+ "FRI"
+ "French"
+ "Fluid Ounce"
+ "Filter"
+ "fl oz"
+ "Filtered recipes"
+ "Filipino"
+ "February"
+ "Favourites"
+ "Export success"
+ "Export in progress"
+ "Export full backup"
+ "EnRecipes"
+ "English"
+ "Egyptian"
+ "Edit recipe"
+ "Easy"
+ "dstspn"
+ "drop"
+ "dozen"
+ "Donate"
+ "This recipe has unsaved changes. What would you like to do?"
+ "DISCARD"
+ "Dinner"
+ "Difficulty level"
+ "Detailed"
+ "Desserts"
+ "You are about to permanently delete %1$s"
+ "You are about to permanently delete the recipe %1$s"
+ "December"
+ "DELETE"
+ "Database"
+ "Dark"
+ "Danish"
+ "%1$s days ago"
+ "Cup"
+ "cup"
+ "Cuisine"
+ "Created"
+ "Crop photo"
+ "Cooking time"
+ "Confirm"
+ "CONTINUE"
+ "Combinations"
+ "cm"
+ "clove"
+ "Chinese"
+ "Challenging"
+ "CANCEL"
+ "Category"
+ "The backup file was modified elsewhere"
+ "Generates a ZIP file containing all your data that can be imported back"
+ "Malformed or corrupt backup file"
+ "Backup folder"
+ "The backup file is empty"
+ "British"
+ "Breakfast"
+ "Breads"
+ "Brazilian"
+ "Black"
+ "Beverages"
+ "Barbecue"
+ "August"
+ "ADD STEP"
+ "April"
+ "App restart required"
+ "APPLY"
+ "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
+ "Appetizers"
+ "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
+ "ADD NOTE"
+ "ADD NEW"
+ "American"
+ "All Tags"
+ "All Cuisines"
+ "All Categories"
+ "ADD INGREDIENT"
+ "Add a recipe to perform a backup"
+ "ADD COMBINATION"
+ "All done!"
+ "ADD"
+ "About"
+ "Attach a photo"
+ "tmrClr"
+
diff --git a/app/resources/Android/src/main/res/values-ml/strings.xml b/app/resources/Android/src/main/res/values-ml/strings.xml
index 3cb7daee..d1e54ef9 100644
--- a/app/resources/Android/src/main/res/values-ml/strings.xml
+++ b/app/resources/Android/src/main/res/values-ml/strings.xml
@@ -1,5 +1,6 @@
+ "സിസ്റ്റം സ്ഥിരസ്ഥിതി + കറുപ്പ്"
"%1$s ലേക്ക് ബാക്കപ്പ് ചെയ്തു"
"വരുമാനം"
"വിളവ് യൂണിറ്റ്"
@@ -292,4 +293,26 @@
"ചേർക്കുക"
"കുറിച്ച്"
"ഒരു ഫോട്ടോ അറ്റാച്ചുചെയ്യുക"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "sec"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-nb-rNO/strings.xml b/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
index 93da2fc7..8f15b3f7 100644
--- a/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
+++ b/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
@@ -1,5 +1,7 @@
+ "s"
+ "Systemforvalg + Svart"
"Støttet opp til %1$s"
"Nyttemengde"
"Enhet for nyttemengde"
@@ -292,4 +294,25 @@
"Legg til"
"Om"
"Legg ved et bilde"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-night/styles.xml b/app/resources/Android/src/main/res/values-night/styles.xml
index 34e7f52f..39e32333 100644
--- a/app/resources/Android/src/main/res/values-night/styles.xml
+++ b/app/resources/Android/src/main/res/values-night/styles.xml
@@ -1,14 +1,8 @@
-
+
diff --git a/app/resources/Android/src/main/res/values-nl/strings.xml b/app/resources/Android/src/main/res/values-nl/strings.xml
index d45779b5..0eac0b0e 100644
--- a/app/resources/Android/src/main/res/values-nl/strings.xml
+++ b/app/resources/Android/src/main/res/values-nl/strings.xml
@@ -1,5 +1,26 @@
+ "Kookwekker gewist"
+ "Vertraging"
+ "Vertragingsduur"
+ "minuut"
+ "minuten"
+ "uur"
+ "uur"
+ "seconden"
+ "Kookwekker laten trillen"
+ "Stoppen"
+ "VOORINSTELLINGEN"
+ "Kookwekker: voorinstellingen"
+ "bij welk recept?"
+ "Toegevoegd aan voorinstellingen"
+ "Kookwekkergeluid"
+ "s"
+ "Kookwekker"
+ "Nieuwe kookwekker"
+ "STARTEN"
+ "Kookwekker %1$s"
+ "Systeemthema + Zwart"
"Gebackupt naar %1$s"
"Hoeveelheid"
"Eenheid"
@@ -292,4 +313,6 @@
"TOEVOEGEN"
"Over"
"Foto bijvoegen"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-pt-rBR/strings.xml b/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
index 5ff5a956..51aca148 100644
--- a/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
+++ b/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
@@ -1,5 +1,32 @@
+ "Temporizador liberado"
+ "segundos"
+ "horas"
+ "hora"
+ "atas"
+ "minuto"
+ "Duração do atraso"
+ "Temporizador vibrar"
+ "Som temporizador"
+ "Adicionado às predefinições"
+ "para qual receita?"
+ "Predefinições temporizadas"
+ "Atraso"
+ "Parada"
+ "s"
+ "PERSPECTIVAS"
+ "Temporizador de Culinária"
+ "Novo timer"
+ "INICIAR"
+ "Temporizador %1$s"
+ "%1$s dias atrás"
+ "Filipina"
+ "%1$s meses atrás"
+ "Tailandesa"
+ "%1$s semanas atrás"
+ "Padrão do sistema + Preto"
+ "Porção"
"Judeu"
"Japonês"
"Janeiro"
@@ -70,7 +97,7 @@
"Reposição feita"
"A redefinição de uma lista eliminará as entradas criadas pelo usuário e restaurará as entradas padrão. As receitas existentes não serão afetadas."
"Reiniciar a lista de unidades"
- "Redefinir a lista de unidades de rendimento"
+ "Redefinir a lista de unidades de porção"
"Combinação removida"
"Ingrediente removido"
"Instrução retirada"
@@ -114,7 +141,7 @@
"Os mais antigos"
"OK"
"Outubro"
- "Nova unidade de produção"
+ "Nova unidade de porção"
"Nova categoria"
"Nenhuma das receitas aqui corresponde à sua busca"
"O sensor do acelerômetro está desativado ou não está funcionando"
@@ -143,8 +170,8 @@
"VIA"
"SEX"
"SEG"
- "Unidade de rendimento"
- "Quantidade de rendimento"
+ "Unidade de porção"
+ "Quantidade de porção"
"Vegetariano"
"Vegano"
"Unidade"
@@ -177,7 +204,7 @@
"Saladas"
"REINICIAR"
"Lista"
- "Você está prestes a remover a unidade de rendimento"
+ "Você está prestes a remover a unidade de porção"
"Você está prestes a remover a unidade"
"Você está prestes a remover a cozinha"
"Você está prestes a remover a categoria"
@@ -286,10 +313,6 @@
"Tudo feito!"
"ADICIONAR"
"Sobre"
- "Yield"
- "%1$s weeks ago"
- "Thai"
- "%1$s months ago"
- "Filipino"
- "%1$s days ago"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-pt/strings.xml b/app/resources/Android/src/main/res/values-pt/strings.xml
index 2bb3255f..5b9a1e06 100644
--- a/app/resources/Android/src/main/res/values-pt/strings.xml
+++ b/app/resources/Android/src/main/res/values-pt/strings.xml
@@ -1,5 +1,115 @@
+ "Temporizador a zero"
+ "PRIMEIROS"
+ "Predefinições temporizadas"
+ "para que receita?"
+ "Adicionado às predefinições"
+ "Som temporizador"
+ "Vibrador temporizador"
+ "segundos"
+ "horas"
+ "hora"
+ "minutos"
+ "minuto"
+ "s"
+ "Parar"
+ "Atraso"
+ "Duração do atraso"
+ "Temporizador de cozedura"
+ "Novo temporizador"
+ "INICIAR"
+ "Temporizador %1$s"
+ "ADICIONAR"
+ "Terminado!"
+ "ADICIONAR COMBINAÇÃO"
+ "Adicione uma receita para fazer uma cópia de segurança"
+ "ADICIONAR INGREDIENTE"
+ "Todas as categorias"
+ "Todas as cozinhas"
+ "Todas as etiquetas"
+ "ADICIONAR NOVA"
+ "ADICIONAR NOTA"
+ "Partilhado via EnRecipes. Obtenha-o no F-Droid, IzzyOnDroid ou na Play Store."
+ "EnRecipes é um livro de receitas digital de código aberto, amigo da privacidade, que lhe permite criar, gerir e partilhar as suas receitas"
+ "APLICAR"
+ "É necessário reiniciar a aplicação"
+ "Abril"
+ "ADICIONAR PASSO"
+ "Agosto"
+ "CANCELAR"
+ "CONTINUAR"
+ "ELIMINAR"
+ "DESCARTAR"
+ "As suas receitas favoritas são apresentadas aqui"
+ "Ver no GitHub"
+ "Grelha"
+ "Guia do utilizador"
+ "Importar dados"
+ "A importação falhou"
+ "Suporta cópias de segurança completas exportadas por esta aplicação"
+ "Importação em curso"
+ "Importado com sucesso"
+ "Ingredientes"
+ "Instruções"
+ "Interface"
+ "Ficheiro inválido"
+ "Item"
+ "Janeiro"
+ "Junte-se ao grupo no Telegram"
+ "Julho"
+ "Junho"
+ "CONTINUAR A EDITAR"
+ "Idioma"
+ "Modo de vista em lista"
+ "há muito tempo"
+ "%1$s meses atrás"
+ "Março"
+ "Maio"
+ "Mínimo"
+ "Nova cozinha"
+ "Nova receita"
+ "Nova unidade"
+ "Reinicie o EnRecipes para usar o novo idioma"
+ "AGORA NÃO"
+ "Nota"
+ "Ainda não tem favoritos"
+ "Nenhuma receita corresponde à pesquisa"
+ "Fotografia da receita"
+ "Use o botão mais para adicionar uma"
+ "Tempo de preparação"
+ "Política de privacidade"
+ "REMOVER"
+ "A redefinição de uma lista eliminará as entradas criadas pelo utilizador e restaurará as entradas predefinidas. As receitas existentes não serão afetadas."
+ "Repor lista de unidades"
+ "Repor lista de unidades de porções"
+ "Porção"
+ "Combinação removida"
+ "Ingrediente removido"
+ "Instrução removida"
+ "Nota removida"
+ "Remover fotografia"
+ "REINICIAR"
+ "Selecione a receita"
+ "Setembro"
+ "Pesquisar"
+ "Partilhar"
+ "Simples"
+ "selecionada"
+ "Partilhar fotografia da receita usando..."
+ "Ordenar"
+ "Partilhar receita usando..."
+ "Classificação por estrelas"
+ "Etapa"
+ "PROCURAR EM TODAS AS RECEITAS?"
+ "Padrão do sistema + Preto"
+ "SEX"
+ "SEG"
+ "SÁB"
+ "DOM"
+ "TER"
+ "QUA"
+ "QUI"
"Receita"
"Já existem:"
"receitas encontradas"
@@ -9,20 +119,20 @@
"Receita retirada"
"receitas"
"A minha receita saudável"
- "Actualizado:"
+ "Atualizado:"
"Necessárias %1$s"
"Receita não encontrada"
"Reiniciar"
"Reiniciar lista de categorias"
"Repor a lista de cozinha"
"Reposição feita"
- "Replacement made"
- "Quantidade de produção"
- "Unidade de rendimento"
+ "Cópia de segurança guardada em %1$s"
+ "Quantidade da porção"
+ "Unidade de porção"
"Preto"
- "O arquivo de backup está vazio"
- "Pasta de backup"
- "Ficheiro de backup malformado ou corrupto"
+ "O ficheiro da cópia de segurança está vazio"
+ "Pasta da cópia de segurança"
+ "Ficheiro da cópia de segurança está mal formado ou corrupto"
"Gera um ficheiro ZIP contendo todos os seus dados que podem ser importados de volta"
"O ficheiro de cópia de segurança foi modificado noutro local"
"Categoria"
@@ -42,7 +152,7 @@
"Editar receita"
"Exportar apoio total"
"Exportação em curso"
- "Sucesso de exportação"
+ "Exportado com sucesso"
"Fevereiro"
"Receitas filtradas"
"Filtro"
@@ -50,13 +160,13 @@
"Notas"
"Novembro"
"Nova categoria"
- "Nova unidade de rendimento"
+ "Nova unidade de porção"
"Outubro"
"Opções"
"Grelha de fotos"
"%1$s semanas atrás"
"Receita sem título"
- "Alterações não salvas"
+ "Alterações não guardadas"
"separar com espaços"
"Etiquetas"
"Traduzir"
@@ -67,11 +177,11 @@
"Começa na segunda-feira"
"Ajuda-o a escolher o que deve cozinhar quando não consegue decidir"
"Sacudir para ver a receita aleatória"
- "Está prestes a remover %1$s da lista de unidades de rendimento"
+ "Está prestes a remover %1$s da lista de unidades de porções"
"Está prestes a remover %1$s da lista de unidades"
"Está prestes a retirar %1$s da lista de cozinha"
"Está prestes a remover %1$s da lista de categorias"
- "O sensor do acelerómetro ou está desactivado ou não está a funcionar"
+ "O sensor do acelerómetro ou está desativado ou não está a funcionar"
"ontem"
"Vietnamita"
"Vegetariano"
@@ -81,7 +191,7 @@
"Indefinido"
"Turca"
"colher de chá"
- "Tente Mais Tarde"
+ "Tentar mais tarde"
"hoje"
"Tema"
"Tailandesa"
@@ -91,7 +201,7 @@
"Sueca"
"Comece a adicionar as suas receitas!"
"galho"
- "Cingalês"
+ "Cingalesa"
"Espanhola"
"Sopas"
"Lanches"
@@ -99,10 +209,10 @@
"Mais lentas primeiro"
"Acompanhamentos"
"Definições"
- "SET"
+ "DEFINIR"
"Porção"
"Marisco"
- "Escocêsa"
+ "Escocesa"
"Molhos"
"Saladas"
"Russa"
@@ -115,7 +225,7 @@
"Pound"
"Aves"
"Portuguesa"
- "Plano Refeições"
+ "Plano de refeições"
"pitada"
"Peça"
"peça"
@@ -151,15 +261,15 @@
"kg"
"Queniana"
"Judaica"
- "Japonêsa"
+ "Japonesa"
"Jamaicana"
"Italiana"
- "Irlândesa"
+ "Irlandesa"
"Indiana"
"in"
"hr"
"Saudável"
- "Lista Supermercado"
+ "Lista de compras"
"Grega"
"Grama"
"Alemã"
@@ -167,12 +277,12 @@
"gal"
"g"
"Francesa"
- "Onça Fluida"
+ "Onça líquida"
"fl oz"
"Filipina"
"Favoritos"
"EnRecipes"
- "Inglêsa"
+ "Inglesa"
"Egípcia"
"Fácil"
"colher de sobremesa"
@@ -182,7 +292,7 @@
"Nível de dificuldade"
"Sobremesas"
"Escuro"
- "Dinamarquêsa"
+ "Dinamarquesa"
"Copo"
"copo"
"Criado"
@@ -202,94 +312,7 @@
"EnRecipes"
"Americana"
"Sobre"
- ""
- "Yield"
- "WED"
- "TUE"
- "SEARCH IN ALL THE RECIPES?"
- "THU"
- "SUN"
- "Step"
- "Star rating"
- "Share recipe using..."
- "Sort"
- "Share recipe photo using..."
- "selected"
- "Simple"
- "Share"
- "Search"
- "September"
- "Select recipe"
- "SAT"
- "RESTART"
- "Remove photo"
- "Note removed"
- "Instruction removed"
- "Ingredient removed"
- "Combination removed"
- "Reset yield unit list"
- "Reset unit list"
- "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
- "REMOVE"
- "Privacy policy"
- "Preparation time"
- "Use the plus button to add one"
- "Recipe photo"
- "No recipes match your search"
- "No favourites yet"
- "Note"
- "NOT NOW"
- "Restart EnRecipes to use the new language"
- "New unit"
- "New recipe"
- "New cuisine"
- "MON"
- "Minimal"
- "May"
- "March"
- "%1$s months ago"
- "a long time ago"
- "List view mode"
- "Language"
- "KEEP EDITING"
- "June"
- "July"
- "Join the Telegram group"
- "January"
- "Item"
- "Invalid file"
- "Interface"
- "Instructions"
- "Ingredients"
- "Import success"
- "Import in progress"
- "Supports full backups exported by this app"
- "Import failed"
- "Import data"
- "User guide"
- "Grid"
- "View on GitHub"
- "Your favourite recipes are listed here"
- "FRI"
- "DISCARD"
- "DELETE"
- "CONTINUE"
- "CANCEL"
- "August"
- "ADD STEP"
- "April"
- "App restart required"
- "APPLY"
- "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
- "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
- "ADD NOTE"
- "ADD NEW"
- "All Tags"
- "All Cuisines"
- "All Categories"
- "ADD INGREDIENT"
- "Add a recipe to perform a backup"
- "ADD COMBINATION"
- "All done!"
- "ADD"
+ "Anexar uma fotografia"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-ru/strings.xml b/app/resources/Android/src/main/res/values-ru/strings.xml
index 3c19c980..a4e703a1 100644
--- a/app/resources/Android/src/main/res/values-ru/strings.xml
+++ b/app/resources/Android/src/main/res/values-ru/strings.xml
@@ -1,5 +1,26 @@
+ "Таймер очищен"
+ "секунды"
+ "часы"
+ "час"
+ "минут"
+ "минута"
+ "Длительность задержки"
+ "Таймер вибрации"
+ "Звук таймера"
+ "Добавлено в предустановки"
+ "для какого рецепта?"
+ "Предустановки таймера"
+ "ПРЕЗЕТЫ"
+ "Задержка"
+ "Стоп"
+ "вто"
+ "Таймер готовки"
+ "Новый таймер"
+ "Таймер %1$s"
+ "СТАРТ"
+ "По умолчанию + Чернить"
"Резервировано до %1$s"
"Урожай"
"Подавать в"
@@ -292,4 +313,6 @@
"ДОБАВИТЬ"
"О приложении"
"Прикрепить фото"
+ "Notification settings"
+ "Timer removed"
diff --git a/app/resources/Android/src/main/res/values-ta/strings.xml b/app/resources/Android/src/main/res/values-ta/strings.xml
index 91596ccb..a58630a4 100644
--- a/app/resources/Android/src/main/res/values-ta/strings.xml
+++ b/app/resources/Android/src/main/res/values-ta/strings.xml
@@ -1,5 +1,6 @@
+ "அமைப்பு இயல்புநிலை + கருப்பு"
"%1$s இல் காப்புப் பிரதி எடுக்கப்பட்டது"
"மகசூல்"
"மகசூல் அலகு"
@@ -292,4 +293,26 @@
"சேர்"
"பற்றி"
"புகைப்படத்தை இணைக்கவும்"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "sec"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-te/strings.xml b/app/resources/Android/src/main/res/values-te/strings.xml
index 91049607..3dd25ff9 100644
--- a/app/resources/Android/src/main/res/values-te/strings.xml
+++ b/app/resources/Android/src/main/res/values-te/strings.xml
@@ -1,5 +1,6 @@
+ "సిస్టమ్ డిఫాల్ట్ + నలుపు"
"%1$s కు బ్యాకప్ చేయబడింది"
"దిగుబడి"
"దిగుబడి యూనిట్"
@@ -292,4 +293,26 @@
"చేర్చు"
"గురించి"
"ఫోటోను అటాచ్ చేయండి"
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "sec"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values/colors.xml b/app/resources/Android/src/main/res/values/colors.xml
index e30afdce..d55b086c 100644
--- a/app/resources/Android/src/main/res/values/colors.xml
+++ b/app/resources/Android/src/main/res/values/colors.xml
@@ -9,6 +9,9 @@
#ffffff
+
+ #ff5200
+
#ffffff
diff --git a/app/resources/Android/src/main/res/values/strings.xml b/app/resources/Android/src/main/res/values/strings.xml
index fa7fa8f8..d91f9e1d 100644
--- a/app/resources/Android/src/main/res/values/strings.xml
+++ b/app/resources/Android/src/main/res/values/strings.xml
@@ -1,5 +1,26 @@
+ "Notification settings"
+ "Timer removed"
+ "seconds"
+ "hours"
+ "hour"
+ "minutes"
+ "minute"
+ "Delay duration"
+ "Timer vibrate"
+ "Timer sound"
+ "Added to presets"
+ "for which recipe?"
+ "Timer presets"
+ "PRESETS"
+ "Timer %1$s"
+ "Delay"
+ "Stop"
+ "START"
+ "New timer"
+ "Cooking Timer"
+ "System default + Black"
"Backed up to %1$s"
"Yield"
"Yield unit"
@@ -145,6 +166,7 @@
"Moderate"
"ml"
"Minimal"
+ "sec"
"min"
"Millilitre"
"mg"
@@ -292,4 +314,5 @@
"ADD"
"About"
"Attach a photo"
+ "tmrClr"
diff --git a/app/resources/Android/src/main/res/values/styles.xml b/app/resources/Android/src/main/res/values/styles.xml
index 604572cc..decefe13 100644
--- a/app/resources/Android/src/main/res/values/styles.xml
+++ b/app/resources/Android/src/main/res/values/styles.xml
@@ -1,14 +1,8 @@
-
+
diff --git a/app/shared/mixins.js b/app/shared/mixins.ts
similarity index 96%
rename from app/shared/mixins.js
rename to app/shared/mixins.ts
index b317bc85..39d041f0 100644
--- a/app/shared/mixins.js
+++ b/app/shared/mixins.ts
@@ -1,3 +1,5 @@
+declare const android: any
+
export const lvMixin = {
methods: {
transparentPage({ object }) {
diff --git a/app/shared/utils.js b/app/shared/utils.ts
similarity index 54%
rename from app/shared/utils.js
rename to app/shared/utils.ts
index 86f840e7..ee37e93a 100644
--- a/app/shared/utils.js
+++ b/app/shared/utils.ts
@@ -1,20 +1,30 @@
-import { Application, AndroidApplication, Utils } from '@nativescript/core'
+import {
+ Application,
+ AndroidApplication,
+ Utils,
+ Device,
+ Color,
+ path,
+ knownFolders,
+ TimerInfo,
+} from '@nativescript/core'
let timerOne
+declare const global, android, androidx, com, java, Array: any
+
export const restartApp = () => {
+ const ctx = Utils.ad.getApplicationContext()
let mStartActivity = new android.content.Intent(
- Application.android.context,
+ ctx,
Application.android.startActivity.getClass()
)
let mPendingIntentId = Math.random() * 100000
let mPendingIntent = android.app.PendingIntent.getActivity(
- Application.android.context,
+ ctx,
mPendingIntentId,
mStartActivity,
android.app.PendingIntent.FLAG_CANCEL_CURRENT
)
- let mgr = Application.android.context.getSystemService(
- android.content.Context.ALARM_SERVICE
- )
+ let mgr = ctx.getSystemService(android.content.Context.ALARM_SERVICE)
mgr.set(
android.app.AlarmManager.RTC,
java.lang.System.currentTimeMillis() + 100,
@@ -86,11 +96,12 @@ export const getRecipePhoto = () => {
android.content.Intent.ACTION_GET_CONTENT
)
intent.setType('image/*')
- return callIntent(ctx, intent, 'Select photo', DIR_CODE).then((res) => {
- if (res.resultCode === android.app.Activity.RESULT_OK)
- if (res.intent != null && res.intent.getData())
- return res.intent.getData()
- })
+ return callIntent(ctx, intent, 'Select photo', DIR_CODE).then(
+ ({ resultCode, intent }: any) => {
+ if (resultCode === android.app.Activity.RESULT_OK)
+ if (intent != null && intent.getData()) return intent.getData()
+ }
+ )
}
export const copyPhotoToCache = (uri, filepath) => {
const ContentResolver = Application.android.nativeApp.getContentResolver()
@@ -112,6 +123,26 @@ export const copyPhotoToCache = (uri, filepath) => {
})
}
+// COPY DB FILE
+export const copyDBToExport = () => {
+ const src = path.join(knownFolders.documents().path, 'EnRecipes.db')
+ const dst = path.join(
+ knownFolders.documents().getFolder('EnRecipes').path,
+ 'EnRecipes.db'
+ )
+ const input = new java.io.FileInputStream(src)
+ try {
+ const output = new java.io.FileOutputStream(dst)
+ let len: number
+ let buffer = Array.create('byte', 1024)
+ while ((len = input.read(buffer)) > 0) output.write(buffer, 0, len)
+ } catch (error) {
+ console.log(error)
+ } finally {
+ input.close()
+ }
+}
+
// BACKUP FOLDER PICKER
export const getBackupFolder = () => {
const ctx =
@@ -120,11 +151,12 @@ export const getBackupFolder = () => {
const intent = new android.content.Intent(
android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
)
- return callIntent(ctx, intent, 'Select folder', DIR_CODE).then((res) => {
- if (res.resultCode === android.app.Activity.RESULT_OK)
- if (res.intent != null && res.intent.getData())
- return res.intent.getData()
- })
+ return callIntent(ctx, intent, 'Select folder', DIR_CODE).then(
+ ({ resultCode, intent }: any) => {
+ if (resultCode === android.app.Activity.RESULT_OK)
+ if (intent != null && intent.getData()) return intent.getData()
+ }
+ )
}
// BACKUP FILE PICKER
@@ -138,10 +170,9 @@ export const getBackupFile = () => {
intent.addCategory(android.content.Intent.CATEGORY_OPENABLE)
intent.setType('application/zip')
return callIntent(ctx, intent, 'Select file to import', DIR_CODE).then(
- (res) => {
- if (res.resultCode === android.app.Activity.RESULT_OK) {
- if (res.intent != null && res.intent.getData())
- return res.intent.getData()
+ ({ resultCode, intent }: any) => {
+ if (resultCode === android.app.Activity.RESULT_OK) {
+ if (intent != null && intent.getData()) return intent.getData()
}
}
)
@@ -149,7 +180,7 @@ export const getBackupFile = () => {
// ZIP OPERATIONS
export class Zip {
- static getSubFiles(src, isRootFolder) {
+ static getSubFiles(src: string, isRootFolder?: boolean) {
const fileList = new java.util.ArrayList()
const sourceFile = new java.io.File(src)
let tempList = sourceFile.listFiles()
@@ -272,3 +303,189 @@ export const shareImage = (image, subject) => {
intent.putExtra(android.content.Intent.EXTRA_STREAM, shareUri)
share(intent, subject)
}
+
+// TIMER NOTIFICATION
+export class TimerNotif {
+ static getIcon(ctx, icon) {
+ const packageName = ctx.getApplicationInfo().packageName
+ let resources = ctx.getResources()
+ return (
+ resources.getIdentifier(icon, 'drawable', packageName) ||
+ ctx.getApplicationInfo().icon
+ )
+ }
+ static clear(nID) {
+ let ctx = Utils.ad.getApplicationContext()
+ const NotifySrv = ctx.getSystemService(
+ android.content.Context.NOTIFICATION_SERVICE
+ )
+ // nID ? NotifySrv.cancel(nID) : NotifySrv.cancelAll()
+ NotifySrv.cancel(nID)
+ }
+
+ static getNotification(
+ {
+ actions,
+ bID,
+ cID,
+ cName,
+ description,
+ nID,
+ priority,
+ sound,
+ title,
+ vibrate,
+ }: {
+ actions?: boolean
+ bID: string
+ cID: string
+ cName: string
+ description: string
+ nID: number
+ priority: number
+ sound: string
+ title: string
+ vibrate?: number
+ },
+ ctx
+ ) {
+ let sdkv: number = parseInt(Device.sdkVersion)
+ let soundUri: any
+ if (sound) soundUri = new android.net.Uri.parse(sound)
+ const NotifyMgr = android.app.NotificationManager
+ const NotifySrv = ctx.getSystemService(
+ android.content.Context.NOTIFICATION_SERVICE
+ )
+ const NotificationCompat = androidx.core.app.NotificationCompat
+ const AudioManager = android.media.AudioManager
+ if (sdkv >= 26) {
+ const importance =
+ priority > 0 ? NotifyMgr.IMPORTANCE_HIGH : NotifyMgr.IMPORTANCE_MIN
+ console.log(priority, importance)
+ const AudioAttributes = android.media.AudioAttributes
+ const audioAttributes = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ALARM)
+ .build()
+ const Channel = new android.app.NotificationChannel(
+ cID,
+ cName,
+ importance
+ )
+ if (description) Channel.setDescription(description)
+ Channel.enableVibration(vibrate)
+ Channel.enableLights(false)
+ if (sound) Channel.setSound(soundUri, audioAttributes)
+ else Channel.setSound(null, null)
+ Channel.setShowBadge(true)
+ Channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+ NotifySrv.createNotificationChannel(Channel)
+ }
+
+ const Intent = android.content.Intent
+ const PendingIntent = android.app.PendingIntent
+
+ const mainInt = new Intent(ctx, com.tns.NativeScriptActivity.class)
+ mainInt.putExtra('action', 'open_timer')
+ const mainPInt = PendingIntent.getActivity(
+ ctx,
+ 1,
+ mainInt,
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+
+ // Action intent
+ let actionInt1, actionInt2, actionPInt1, actionPInt2
+ if (actions) {
+ actionInt1 = new Intent(bID)
+ actionInt1.putExtra('action', 'stop')
+ actionPInt1 = PendingIntent.getBroadcast(
+ ctx,
+ 2,
+ actionInt1,
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ actionInt2 = new Intent(bID)
+ actionInt2.putExtra('action', 'delay')
+ actionPInt2 = PendingIntent.getBroadcast(
+ ctx,
+ 3,
+ actionInt2,
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ }
+
+ // CREATE NOTIFICATION
+
+ let icon = TimerNotif.getIcon(ctx, 'ic_stat_notify_silhouette')
+ let builder = new NotificationCompat.Builder(ctx, cID)
+ .setColor(new Color('#ff5200').android)
+ .setContentIntent(mainPInt)
+ .setContentTitle(title)
+ .setOngoing(true)
+ .setPriority(priority)
+ .setShowWhen(actions)
+ .setSmallIcon(icon)
+ .setTicker(title)
+ .setAutoCancel(false)
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+ if (sound) builder.setSound(soundUri, AudioManager.STREAM_ALARM)
+ else builder.setSound(null)
+ if (description) builder.setContentText(description)
+ if (vibrate) builder.setVibrate([500, 1000])
+ if (actions) {
+ builder.setDeleteIntent(actionPInt2)
+ builder.setFullScreenIntent(mainPInt, true)
+ builder.addAction(null, 'Stop', actionPInt1)
+ builder.addAction(null, 'Delay', actionPInt2)
+ }
+ let notification = builder.build()
+ notification.flags =
+ NotificationCompat.FLAG_INSISTENT | NotificationCompat.FLAG_ONGOING_EVENT
+
+ return notification
+ }
+ static show(data) {
+ const ctx = Utils.ad.getApplicationContext()
+ const NotifySrv = ctx.getSystemService(
+ android.content.Context.NOTIFICATION_SERVICE
+ )
+ NotifySrv.notify(data.nID, TimerNotif.getNotification(data, ctx))
+ }
+}
+
+// GET RINGTONES LIST
+export const getTones = () => {
+ const RingtoneManager = android.media.RingtoneManager
+ let ctx = Utils.ad.getApplicationContext()
+ const ringtonesMgr = new RingtoneManager(ctx)
+ ringtonesMgr.setType(RingtoneManager.TYPE_ALARM)
+ const cursor = ringtonesMgr.getCursor()
+ let tones = []
+ while (cursor.moveToNext()) {
+ tones.push({
+ title: cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX),
+ uri:
+ cursor.getString(RingtoneManager.URI_COLUMN_INDEX) +
+ '/' +
+ cursor.getString(RingtoneManager.ID_COLUMN_INDEX),
+ })
+ }
+
+ let defaultToneUri = RingtoneManager.getActualDefaultRingtoneUri(
+ ctx,
+ RingtoneManager.TYPE_ALARM
+ )
+ let defaultTone
+ if (defaultToneUri) {
+ let uriString = defaultToneUri.toString()
+ let tonesAvailable = tones.filter((e) => e.uri == uriString)
+ let toneExist = tonesAvailable.length
+ defaultTone = {
+ title: toneExist ? tonesAvailable[0].title : tones[0].title,
+ uri: toneExist ? uriString : tones[0].uri,
+ }
+ }
+
+ return { tones, defaultTone: defaultToneUri ? defaultTone : tones[0] }
+}
diff --git a/app/store.ts b/app/store.ts
index f3d37e36..f27a76bc 100644
--- a/app/store.ts
+++ b/app/store.ts
@@ -1,14 +1,36 @@
import Vue from 'nativescript-vue'
import Vuex from 'vuex'
Vue.use(Vuex)
-import { CouchBase } from '@triniwiz/nativescript-couchbase'
-import { getFileAccess, File, ApplicationSettings, Application } from '@nativescript/core'
-const EnRecipesDB = new CouchBase('EnRecipes')
-const userCuisinesDB = new CouchBase('userCuisines')
-const userCategoriesDB = new CouchBase('userCategories')
-const userYieldUnitsDB = new CouchBase('userYieldUnits')
-const userUnitsDB = new CouchBase('userUnits')
-const mealPlansDB = new CouchBase('mealPlans')
+import { openOrCreate } from '@akylas/nativescript-sqlite'
+import {
+ getFileAccess,
+ File,
+ ApplicationSettings,
+ Application,
+ knownFolders,
+ path,
+} from '@nativescript/core'
+
+// OPEN DATABASE FILE
+const db = openOrCreate(
+ path.join(knownFolders.documents().path, 'EnRecipes.db')
+)
+
+// CREATE recipes TABLE
+db.execute(
+ 'CREATE TABLE IF NOT EXISTS recipes (id TEXT PRIMARY KEY, image TEXT, title TEXT, cuisine TEXT, category TEXT, tags TEXT, prepTime TEXT, cookTime TEXT, yieldQuantity TEXT, yieldUnit TEXT, difficulty TEXT, rating INT, ingredients TEXT, instructions TEXT, combinations TEXT, notes TEXT, favorite INT, tried INT, lastTried INT, lastModified INT, created INT)'
+)
+
+// CREATE lists TABLE
+db.execute(
+ 'CREATE TABLE IF NOT EXISTS lists (cuisines TEXT, categories TEXT, yieldUnits TEXT, units TEXT)'
+)
+
+// CREATE mealPlans TABLE
+db.execute(
+ 'CREATE TABLE IF NOT EXISTS mealPlans (date INT, type TEXT, title TEXT)'
+)
+
const defaultCuisines = [
'American',
'Brazilian',
@@ -116,30 +138,18 @@ const defaultUnits = [
]
const listItems = {
cuisines: {
- db: userCuisinesDB,
- key: 'userCuisines',
- stateName: 'cuisines',
sort: true,
defaultItems: defaultCuisines,
},
categories: {
- db: userCategoriesDB,
- key: 'userCategories',
- stateName: 'categories',
sort: true,
defaultItems: defaultCategories,
},
yieldUnits: {
- db: userYieldUnitsDB,
- key: 'userYieldUnits',
- stateName: 'yieldUnits',
sort: false,
defaultItems: defaultYieldUnits,
},
units: {
- db: userUnitsDB,
- key: 'userUnits',
- stateName: 'units',
sort: false,
defaultItems: defaultUnits,
},
@@ -154,61 +164,69 @@ export default new Vuex.Store({
units: [],
mealPlans: [],
icon: {
- back: '\ue900',
- bag: '\ue901',
- bagged: '\ue902',
- cal: '\ue903',
- category: '\ue904',
- check: '\ue905',
- cog: '\ue906',
+ cog: '\ue900',
+ home: '\ue901',
+ try: '\ue902',
+ tried: '\ue903',
+ fav: '\ue904',
+ faved: '\ue905',
+ menu: '\ue906',
cuisine: '\ue907',
- db: '\ue908',
- del: '\ue909',
- diff: '\ue90a',
- don: '\ue90b',
- done: '\ue90c',
- edit: '\ue90d',
- exp: '\ue90e',
- fav: '\ue90f',
- faved: '\ue910',
- filter: '\ue911',
- folder: '\ue912',
- gh: '\ue913',
- help: '\ue914',
- home: '\ue915',
- img: '\ue916',
- imp: '\ue917',
- info: '\ue918',
- interface: '\ue919',
- lang: '\ue91a',
- layout: '\ue91b',
- left: '\ue91c',
- menu: '\ue91d',
- opts: '\ue91e',
- plus: '\ue91f',
- price: '\ue920',
- priv: '\ue921',
- reset: '\ue922',
- right: '\ue923',
- save: '\ue924',
- sear: '\ue925',
- share: '\ue926',
- shuf: '\ue927',
- sort: '\ue928',
- star: '\ue929',
- starred: '\ue92a',
- tag: '\ue92b',
- tg: '\ue92c',
- theme: '\ue92d',
- time: '\ue92e',
- tod: '\ue92f',
- trans: '\ue930',
- tried: '\ue931',
- try: '\ue932',
- uncheck: '\ue933',
- undo: '\ue934',
- week: '\ue935',
- x: '\ue936',
+ category: '\ue908',
+ tag: '\ue909',
+ star: '\ue90a',
+ starred: '\ue90b',
+ time: '\ue90c',
+ diff: '\ue90d',
+ bag: '\ue90e',
+ bagged: '\ue90f',
+ price: '\ue910',
+ sear: '\ue911',
+ sort: '\ue912',
+ filter: '\ue913',
+ plus: '\ue914',
+ done: '\ue915',
+ back: '\ue916',
+ x: '\ue917',
+ del: '\ue918',
+ save: '\ue919',
+ undo: '\ue91a',
+ edit: '\ue91b',
+ cal: '\ue91c',
+ tod: '\ue91d',
+ left: '\ue91e',
+ right: '\ue91f',
+ img: '\ue920',
+ uncheck: '\ue921',
+ check: '\ue922',
+ share: '\ue923',
+ timer: '\ue924',
+ start: '\ue925',
+ pause: '\ue926',
+ addTo: '\ue927',
+ sound: '\ue928',
+ vibrate: '\ue929',
+ interface: '\ue92a',
+ opts: '\ue92b',
+ db: '\ue92c',
+ reset: '\ue92d',
+ info: '\ue92e',
+ lang: '\ue92f',
+ theme: '\ue930',
+ layout: '\ue931',
+ shuf: '\ue932',
+ week: '\ue933',
+ folder: '\ue934',
+ exp: '\ue935',
+ imp: '\ue936',
+ gh: '\ue937',
+ tg: '\ue938',
+ help: '\ue939',
+ priv: '\ue93a',
+ don: '\ue93b',
+ trans: '\ue93c',
+ delay: '\ue93d',
+ ring: '\ue93e',
},
currentComponent: 'EnRecipes',
sortType: 'Oldest first',
@@ -290,20 +308,91 @@ export default new Vuex.Store({
title: 'తెలుగు',
},
],
- shakeEnabled: true,
+ shakeEnabled: ApplicationSettings.getBoolean('shakeEnabled', true),
importSummary: {
found: 0,
imported: 0,
updated: 0,
},
- layout: 'detailed',
+ layout: ApplicationSettings.getString('layout', 'detailed'),
selectedCuisine: null,
selectedCategory: null,
selectedTag: null,
appTheme: 'sysDef',
- mondayFirst: false,
+ mondayFirst: ApplicationSettings.getBoolean('mondayFirst', false),
+ timerDelay: ApplicationSettings.getString('timerDelay', '1 minute'),
+ timerSound: {},
+ timerVibrate: ApplicationSettings.getBoolean('timerVibrate', false),
+ timerPresets: [
+ {
+ id: 534534563,
+ label: 'Soft Eggs',
+ recipeID: null,
+ time: '00:06:00',
+ timerInterval: null,
+ isPaused: false,
+ preset: 1,
+ },
+ {
+ id: 564646,
+ label: 'Medium Eggs',
+ recipeID: null,
+ time: '00:08:00',
+ timerInterval: null,
+ isPaused: false,
+ preset: 1,
+ },
+ {
+ id: 43276767,
+ label: 'Hard Eggs',
+ recipeID: null,
+ time: '00:10:00',
+ timerInterval: null,
+ isPaused: false,
+ preset: 1,
+ },
+ ],
+ activeTimers: [],
+ timerIntervals: [],
},
mutations: {
+ addTimerPreset(state, timer) {
+ state.timerPresets.push(timer)
+ },
+ removeTimerPreset(state, index) {
+ state.timerPresets.splice(index, 1)
+ },
+ clearTimerInterval(state) {
+ state.activeTimers.forEach((e) => {
+ clearInterval(e.timerInterval)
+ e.timerInterval = null
+ })
+ },
+ addActiveTimer(state, { timer, index }) {
+ state.activeTimers.splice(index, 0, timer)
+ },
+ updateActiveTimer(state, timer) {
+ let index = state.activeTimers.findIndex((e) => e.id == timer.id)
+ state.activeTimers.splice(index, 1, timer)
+ },
+ removeActiveTimer(state, index) {
+ state.activeTimers.splice(index, 1)
+ },
+ setTimerDelay(state, delay) {
+ state.timerDelay = delay
+ ApplicationSettings.setString('timerDelay', delay)
+ },
+ setTimerSound(state, sound) {
+ state.timerSound = {
+ title: sound.title,
+ uri: sound.uri,
+ }
+ ApplicationSettings.setString('timerSound', JSON.stringify(sound))
+ },
+ setTimerVibrate(state, bool) {
+ state.timerVibrate = bool
+ ApplicationSettings.setBoolean('timerVibrate', bool)
+ },
clearImportSummary(state) {
for (const key in state.importSummary) state.importSummary[key] = 0
},
@@ -314,14 +403,16 @@ export default new Vuex.Store({
setTheme(state, theme) {
switch (theme) {
case 'sysDef':
- state.appTheme = Application.systemAppearance() == 'dark' ? "Dark" : "Light"
- break;
+ state.appTheme =
+ Application.systemAppearance() == 'dark' ? 'Dark' : 'Light'
+ break
case 'sysDefB':
- state.appTheme = Application.systemAppearance() == 'dark' ? "Black" : "Light"
- break;
+ state.appTheme =
+ Application.systemAppearance() == 'dark' ? 'Black' : 'Light'
+ break
default:
state.appTheme = theme
- break;
+ break
}
ApplicationSettings.setString('appTheme', theme)
},
@@ -335,25 +426,20 @@ export default new Vuex.Store({
state.sortType = sortType
},
initRecipes(state) {
- EnRecipesDB.query({ select: [] }).forEach((r) => {
- if (r.timeRequired) {
- r.prepTime = '00:00'
- r.cookTime = r.timeRequired
- delete r.timeRequired
- }
- if (!r.hasOwnProperty('cuisine')) r.cuisine = 'Undefined'
- if (!r.hasOwnProperty('tags')) r.tags = []
- if (!r.hasOwnProperty('difficulty')) r.difficulty = 'Easy'
- if (!r.hasOwnProperty('rating')) r.rating = 0
- if (!r.hasOwnProperty('created')) r.created = r.lastModified
- // if (!r.hasOwnProperty("inBag"))
- // r.inBag = false
- state.recipes.push(r)
+ db.select('SELECT * FROM recipes').then((res) => {
+ res.forEach((e) => {
+ Object.keys(e).forEach(
+ (f) =>
+ f.match(/tags|ingredients|instructions|combinations|notes/) &&
+ (e[f] = JSON.parse(e[f]))
+ )
+ state.recipes.push(e)
+ })
})
state.shakeEnabled = ApplicationSettings.getBoolean('shakeEnabled', true)
state.sortType = ApplicationSettings.getString('sortType', 'Oldest first')
},
- importRecipes(state, recipes) {
+ importRecipesFromJSON(state, recipes) {
let localRecipesIDs, partition
let imported = 0
let updated = 0
@@ -365,45 +451,100 @@ export default new Vuex.Store({
r.cookTime = r.timeRequired
delete r.timeRequired
}
+ if (r.imageSrc) {
+ r.image = r.imageSrc.replace('enrecipes', 'EnRecipes')
+ delete r.imageSrc
+ }
if (!r.hasOwnProperty('cuisine')) r.cuisine = 'Undefined'
if (!r.hasOwnProperty('tags')) r.tags = []
if (!r.hasOwnProperty('difficulty')) r.difficulty = 'Easy'
if (!r.hasOwnProperty('rating')) r.rating = 0
if (!r.hasOwnProperty('created')) r.created = r.lastModified
- // if (!r.hasOwnProperty("inBag"))
- // r.inBag = false
+ r.yieldQuantity = r.yield.quantity
+ r.yieldUnit = r.yield.unit
+ delete r.yield
return r
})
}
function createDocuments(data) {
data = getUpdatedData(data)
state.recipes = [...state.recipes, ...data]
- data.forEach((recipe) => {
+ data.forEach((r) => {
imported++
- EnRecipesDB.createDocument(recipe, recipe.id)
+ db.execute(
+ `INSERT INTO recipes (id, image, title, cuisine, category, tags, prepTime, cookTime, yieldQuantity, yieldUnit, difficulty, rating, ingredients, instructions, combinations, notes, favorite, tried, lastTried, lastModified, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
+ [
+ r.id,
+ r.image,
+ r.title,
+ r.cuisine,
+ r.category,
+ JSON.stringify(r.tags),
+ r.prepTime,
+ r.cookTime,
+ r.yieldQuantity,
+ r.yieldUnit,
+ r.difficulty,
+ r.rating,
+ JSON.stringify(r.ingredients),
+ JSON.stringify(r.instructions),
+ JSON.stringify(r.combinations),
+ JSON.stringify(r.notes),
+ r.favorite ? 1 : 0,
+ r.tried ? 1 : 0,
+ r.lastTried ? new Date(r.lastTried).getTime() : null,
+ r.lastModified ? new Date(r.lastModified).getTime() : null,
+ r.created ? new Date(r.created).getTime() : null,
+ ]
+ )
})
}
function updateDocuments(data) {
data = getUpdatedData(data)
- data.forEach((recipe) => {
+ data.forEach((r) => {
let recipeIndex = state.recipes
.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
+ let d2 = new Date(r.lastModified).getTime()
+ return e.id === r.id && d1 < d2 ? i : -1
})
.filter((e) => e >= 0)[0]
if (recipeIndex >= 0) {
updated++
- Object.assign(state.recipes[recipeIndex], recipe)
- EnRecipesDB.updateDocument(recipe.id, recipe)
+ Object.assign(state.recipes[recipeIndex], r)
+ db.execute(
+ `REPLACE INTO recipes (id, image, title, cuisine, category, tags, prepTime, cookTime, yieldQuantity, yieldUnit, difficulty, rating, ingredients, instructions, combinations, notes, favorite, tried, lastTried, lastModified, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
+ [
+ r.id,
+ r.image,
+ r.title,
+ r.cuisine,
+ r.category,
+ JSON.stringify(r.tags),
+ r.prepTime,
+ r.cookTime,
+ r.yieldQuantity,
+ r.yieldUnit,
+ r.difficulty,
+ r.rating,
+ JSON.stringify(r.ingredients),
+ JSON.stringify(r.instructions),
+ JSON.stringify(r.combinations),
+ JSON.stringify(r.notes),
+ r.favorite ? 1 : 0,
+ r.tried ? 1 : 0,
+ r.lastTried ? new Date(r.lastTried).getTime() : null,
+ r.lastModified ? new Date(r.lastModified).getTime() : null,
+ r.created ? new Date(r.created).getTime() : null,
+ ]
+ )
}
})
}
if (state.recipes.length) {
localRecipesIDs = state.recipes.map((e) => e.id)
partition = recipes.reduce(
- (result, recipe, i) => {
+ (result, recipe) => {
localRecipesIDs.indexOf(recipe.id) < 0
? result[0].push(recipe) // create candidates
: result[1].push(recipe) // update candidates
@@ -420,160 +561,194 @@ export default new Vuex.Store({
state.importSummary.imported = imported
state.importSummary.updated = updated
},
- addRecipe(state, { id, recipe }) {
- state.recipes.push(recipe)
- EnRecipesDB.createDocument(recipe, id)
+ importRecipesFromDB(state, recipes) {
+ let localRecipesIDs: string[], partition: any[]
+ let imported = 0
+ let updated = 0
+ function createDocuments(data: any[]) {
+ data.forEach((r) => {
+ const cols = Object.keys(r).join(', ')
+ const placeholder = Object.keys(r)
+ .fill('?')
+ .join(', ')
+ imported++
+ db.execute(
+ `REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
+ Object.values(r)
+ )
+ Object.keys(r).forEach(
+ (f) =>
+ f.match(/tags|ingredients|instructions|combinations|notes/) &&
+ (r[f] = JSON.parse(r[f]))
+ )
+ state.recipes.push(r)
+ })
+ }
+ function updateDocuments(data: any[]) {
+ data.forEach((r) => {
+ let recipeIndex = state.recipes
+ .map((e, i) => {
+ let d1 = new Date(e.lastModified).getTime()
+ let d2 = new Date(r.lastModified).getTime()
+ return e.id === r.id && d1 < d2 ? i : -1
+ })
+ .filter((e) => e >= 0)[0]
+ if (recipeIndex >= 0) {
+ updated++
+ const cols = Object.keys(r).join(', ')
+ const placeholder = Object.keys(r)
+ .fill('?')
+ .join(', ')
+ db.execute(
+ `REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
+ Object.values(r)
+ )
+ Object.keys(r).forEach(
+ (f) =>
+ f.match(/tags|ingredients|instructions|combinations|notes/) &&
+ (r[f] = JSON.parse(r[f]))
+ )
+ Object.assign(state.recipes[recipeIndex], r)
+ }
+ })
+ }
+ if (state.recipes.length) {
+ localRecipesIDs = state.recipes.map((e) => e.id)
+ partition = recipes.reduce(
+ (result, recipe) => {
+ 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)
+ state.importSummary.found = recipes.length
+ state.importSummary.imported = imported
+ state.importSummary.updated = updated
},
- 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)
- },
- deleteRecipe(state, { index, id }) {
- getFileAccess().deleteFile(state.recipes[index].imageSrc)
- state.recipes.splice(index, 1)
- EnRecipesDB.deleteDocument(id)
- 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])
- }
+ addRecipe(state, recipe) {
+ let r = JSON.parse(JSON.stringify(recipe))
+ Object.keys(recipe).forEach((e) => {
+ if (e.match(/tags|ingredients|instructions|combinations|notes/))
+ r[e] = JSON.stringify(r[e])
+ if (e.match(/favorite|tried/)) r[e] = r[e] ? 1 : 0
})
+ const cols = Object.keys(recipe).join(', ')
+ const placeholder = Object.keys(recipe)
+ .fill('?')
+ .join(', ')
+ db.execute(
+ `REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
+ Object.values(r)
+ )
+ let i: number
+ function exist({ id }, index: number) {
+ if (id === recipe.id) {
+ i = index
+ return true
+ }
+ return false
+ }
+ state.recipes.some(exist)
+ ? Object.assign(state.recipes[i], recipe)
+ : state.recipes.push(recipe)
},
deleteRecipes(state, ids) {
- ids.forEach((id) => {
+ ids.forEach((id: string) => {
let index = state.recipes.findIndex((e) => e.id === id)
- getFileAccess().deleteFile(state.recipes[index].imageSrc)
+ getFileAccess().deleteFile(state.recipes[index].image)
state.recipes.splice(index, 1)
- EnRecipesDB.deleteDocument(id)
+ db.execute(`DELETE FROM recipes WHERE id = '${id}'`)
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])
+ db.execute(
+ `UPDATE recipes SET combinations = '${JSON.stringify(
+ state.recipes[i].combinations
+ )}' WHERE id = '${id}'`
+ )
}
})
})
},
initListItems(state) {
- function initialize(listName) {
- let userItems
- let db = listItems[listName].db
- let key = listItems[listName].key
- let stateName = listItems[listName].stateName
- let defaultItems = listItems[listName].defaultItems
- if (!state[stateName].length) {
- let isStored = db.query({ select: [] }).length
- if (isStored) {
- userItems = db.getDocument(key)[key]
- if (userItems.some((e) => defaultItems.includes(e)))
- state[stateName] = userItems
- else state[stateName] = [...defaultItems, ...userItems]
- } else {
- if (listItems[listName].sort) {
- state[stateName].sort()
- }
- state[stateName] = defaultItems
- db.createDocument(
- {
- [key]: [],
- },
- key
+ if (!state.cuisines.length) {
+ db.select(`SELECT * FROM lists`).then((res) => {
+ if (!res.length) {
+ db.execute(
+ `INSERT INTO lists (cuisines, categories, yieldUnits, units) VALUES (?, ?, ?, ?)`,
+ [null, null, null, null]
)
}
- }
+
+ db.select(`SELECT * FROM lists`).then((res) => {
+ Object.keys(res[0]).forEach((list) => {
+ let userItems: string[]
+ let defaultItems = listItems[list].defaultItems
+ if (res[0][list]) {
+ userItems = JSON.parse(res[0][list])
+ state[list] = userItems.some((e: string) =>
+ defaultItems.includes(e)
+ )
+ ? userItems
+ : [...defaultItems, ...userItems]
+ } else {
+ state[list] = defaultItems
+ listItems[list].sort && state[list].sort()
+ }
+ })
+ })
+ })
}
- ;['cuisines', 'categories', 'yieldUnits', 'units'].forEach((item) => {
- initialize(item)
- })
},
importListItems(state, { data, listName }) {
- let db = listItems[listName].db
- let key = listItems[listName].key
- let stateName = listItems[listName].stateName
- let items = new Set([...state[stateName], ...data])
- state[stateName] = [...items]
- if (listItems[listName].sort) state[stateName].sort()
- db.updateDocument(key, { [key]: state[stateName] })
+ state[listName] = [...new Set([...state[listName], ...data])]
+ if (listItems[listName].sort) state[listName].sort()
+ db.execute(
+ `UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
+ )
},
addListItem(state, { item, listName }) {
- let db = listItems[listName].db
- let key = listItems[listName].key
- let stateName = listItems[listName].stateName
- let lowercase = state[stateName].map((e) => e.toLowerCase())
+ let lowercase = state[listName].map((e: string) => e.toLowerCase())
if (lowercase.indexOf(item.toLowerCase()) == -1) {
- state[stateName].push(item)
- db.updateDocument(key, { [key]: state[stateName] })
+ state[listName].push(item)
if (listItems[listName].sort)
- state[stateName].sort((a, b) =>
+ state[listName].sort((a: string, b: string) =>
a.toLowerCase().localeCompare(b.toLowerCase())
)
- }
- },
- removeListItem(state, { item, listName }) {
- let db = listItems[listName].db
- let key = listItems[listName].key
- let stateName = listItems[listName].stateName
- let index = state[stateName].indexOf(item)
- state[stateName].splice(index, 1)
- db.updateDocument(key, { [key]: state[stateName] })
- if (listItems[listName].sort) state[stateName].sort()
- },
- resetListItems(state, listName) {
- let stateName = listItems[listName].stateName
- let defaultItems = listItems[listName].defaultItems
- state[listName] = [...defaultItems]
- if (listItems[listName].sort) {
- state[stateName].sort()
- }
- },
- initMealPlans(state) {
- let isMealPlansDBStored = mealPlansDB.query({ select: [] }).length
- if (isMealPlansDBStored) {
- let plans = mealPlansDB.getDocument('mealPlans').mealPlans
- if (plans.length && plans[0].hasOwnProperty('eventColor')) {
- plans.forEach((p) => {
- let d = new Date(p.startDate)
- p.date = new Date(
- d.getFullYear(),
- d.getMonth(),
- d.getDate(),
- 0
- ).getTime()
- switch (new Date(p.date).getHours()) {
- case 0:
- p.type = 'breakfast'
- break
- case 5:
- p.type = 'lunch'
- break
- case 10:
- p.type = 'dinner'
- break
- case 15:
- p.type = 'snacks'
- break
- }
- delete p.startDate
- delete p.endDate
- delete p.eventColor
- state.mealPlans.push(p)
- })
- mealPlansDB.updateDocument('mealPlans', {
- mealPlans: state.mealPlans,
- })
- } else state.mealPlans = [...plans]
- } else {
- mealPlansDB.createDocument(
- {
- mealPlans: [],
- },
- 'mealPlans'
+ db.execute(
+ `UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
)
}
},
- importMealPlans(state, mealPlans) {
+ removeListItem(state, { item, listName }) {
+ state[listName].splice(state[listName].indexOf(item), 1)
+ db.execute(
+ `UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
+ )
+ },
+ resetListItems(state, listName) {
+ let defaultItems = listItems[listName].defaultItems
+ state[listName] = [...defaultItems]
+ if (listItems[listName].sort)
+ state[listName].sort((a: string, b: string) =>
+ a.toLowerCase().localeCompare(b.toLowerCase())
+ )
+ db.execute(
+ `UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
+ )
+ },
+ initMealPlans(state) {
+ if (!state.mealPlans.length)
+ db.select(`SELECT * FROM mealPlans`).then((res) =>
+ res.forEach((m: {}) => state.mealPlans.push(m))
+ )
+ },
+ importMealPlansFromJSON(state, mealPlans) {
let newMealPlans = mealPlans.filter((e) => {
if (e.hasOwnProperty('eventColor')) {
return !state.mealPlans.some((f) => {
@@ -638,46 +813,66 @@ export default new Vuex.Store({
})
}
state.mealPlans = [...state.mealPlans, ...updatedMealPlans]
- mealPlansDB.updateDocument('mealPlans', { mealPlans: state.mealPlans })
+ updatedMealPlans.forEach((m) => {
+ db.execute(
+ `INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
+ [m.date, m.type, m.title]
+ )
+ })
},
- addMealPlan(state, { title, date, type, index }) {
+ importMealPlansFromDB(state, mealPlans) {
+ let newMealPlans = mealPlans.filter(
+ (e) =>
+ !state.mealPlans.some((f) =>
+ Object.keys(f).every((key) => f[key] == e[key])
+ )
+ )
+ state.mealPlans = [...state.mealPlans, ...newMealPlans]
+ newMealPlans.forEach((m) => {
+ db.execute(
+ `INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
+ [m.date, m.type, m.title]
+ )
+ })
+ },
+ addMealPlan(state, { date, type, title }) {
let mealPlan = {
- title,
date,
type,
+ title,
}
- if (index != null) state.mealPlans.splice(index, 0, mealPlan)
- else state.mealPlans.push(mealPlan)
- mealPlansDB.updateDocument('mealPlans', {
- mealPlans: [...state.mealPlans],
- })
+ state.mealPlans.push(mealPlan)
+ const cols = Object.keys(mealPlan).join(', ')
+ const placeholder = Object.keys(mealPlan)
+ .fill('?')
+ .join(', ')
+ db.execute(
+ `INSERT INTO mealPlans (${cols}) VALUES (${placeholder})`,
+ Object.values(mealPlan)
+ )
},
- deleteMealPlan(state, { title, date, type, index }) {
+ deleteMealPlan(state, { date, type, title }) {
+ let index = state.mealPlans.findIndex(
+ (e) => e.title === title && e.type === type && e.date === date
+ )
state.mealPlans.splice(index, 1)
state.mealPlans = [...state.mealPlans]
- mealPlansDB.updateDocument('mealPlans', {
- mealPlans: [...state.mealPlans],
- })
- },
- toggleState(state, { id, recipe, key, setDate }) {
- let index = state.recipes.indexOf(
- state.recipes.filter((e) => e.id === id)[0]
+ db.execute(
+ `DELETE FROM mealPlans WHERE date = ${date} AND type = '${type}' AND title = '${title}'`
)
- state.recipes[index][key] = !state.recipes[index][key]
- if (setDate) state.recipes[index].lastTried = new Date()
- EnRecipesDB.updateDocument(id, recipe)
},
- setRecipeAsTried(state, { id, recipe }) {
- let index = state.recipes.indexOf(
- state.recipes.filter((e) => e.id === id)[0]
+ toggleState(state, { id, key, setDate }) {
+ let index = state.recipes.findIndex((e) => e.id == id)
+ state.recipes[index][key] = state.recipes[index][key] ? 0 : 1
+ db.execute(
+ `UPDATE recipes SET ${key} = ${state.recipes[index][key]} WHERE id = '${id}'`
)
- state.recipes[index].tried = true
- 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])
+ if (setDate) {
+ state.recipes[index].lastTried = new Date().getTime()
+ db.execute(
+ `UPDATE recipes SET lastTried = ${state.recipes[index].lastTried} WHERE id = '${id}'`
+ )
+ }
},
setComponent(state, comp) {
state.currentComponent = comp
@@ -686,7 +881,11 @@ export default new Vuex.Store({
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])
+ db.execute(
+ `UPDATE recipes SET combinations = '${JSON.stringify(
+ state.recipes[i].combinations
+ )}' WHERE id = '${id}'`
+ )
}
})
},
@@ -694,26 +893,23 @@ export default new Vuex.Store({
state.shakeEnabled = shake
ApplicationSettings.setBoolean('shakeEnabled', shake)
},
- setRating(state, { id, recipe, rating }) {
- let index = state.recipes.indexOf(
- state.recipes.filter((e) => e.id === id)[0]
- )
+ setRating(state, { id, rating }) {
+ let index = state.recipes.findIndex((e) => e.id == id)
state.recipes[index].rating = rating
- EnRecipesDB.updateDocument(id, recipe)
+ db.execute(`UPDATE recipes SET rating = ${rating} WHERE id = '${id}'`)
},
- toggleCart(state, { id, recipe }) {
+ toggleCart(state, { id }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
)
state.recipes[index].inBag = !state.recipes[index].inBag
- EnRecipesDB.updateDocument(id, recipe)
},
unlinkBrokenImages(state) {
state.recipes.forEach((r, i) => {
- if (r.imageSrc && !File.exists(r.imageSrc)) {
- r.imageSrc = null
+ if (r.image && !File.exists(r.image)) {
+ r.image = null
Object.assign(state.recipes[i], r)
- EnRecipesDB.updateDocument(r.id, r)
+ db.execute(`UPDATE recipes SET image = null WHERE id = '${r.id}'`)
}
})
},
@@ -728,6 +924,33 @@ export default new Vuex.Store({
},
},
actions: {
+ addTimerPreset({ commit }, timer) {
+ commit('addTimerPreset', timer)
+ },
+ removeTimerPreset({ commit }, timer) {
+ commit('removeTimerPreset', timer)
+ },
+ clearTimerInterval({ commit }) {
+ commit('clearTimerInterval')
+ },
+ addActiveTimer({ commit }, timer) {
+ commit('addActiveTimer', timer)
+ },
+ updateActiveTimer({ commit }, timer) {
+ commit('updateActiveTimer', timer)
+ },
+ removeActiveTimer({ commit }, index) {
+ commit('removeActiveTimer', index)
+ },
+ setTimerDelay({ commit }, delay) {
+ commit('setTimerDelay', delay)
+ },
+ setTimerSound({ commit }, sound) {
+ commit('setTimerSound', sound)
+ },
+ setTimerVibrate({ commit }, bool) {
+ commit('setTimerVibrate', bool)
+ },
clearImportSummary({ commit }) {
commit('clearImportSummary')
},
@@ -749,25 +972,22 @@ export default new Vuex.Store({
initRecipes({ commit }) {
commit('initRecipes')
},
- importRecipesAction({ commit }, recipes) {
- commit('importRecipes', recipes)
+ importRecipesFromJSON({ commit }, recipes) {
+ commit('importRecipesFromJSON', recipes)
+ },
+ importRecipesFromDB({ commit }, recipes) {
+ commit('importRecipesFromDB', recipes)
},
addRecipeAction({ commit }, recipe) {
commit('addRecipe', recipe)
},
- overwriteRecipeAction({ commit }, updatedRecipe) {
- commit('overwriteRecipe', updatedRecipe)
- },
- deleteRecipeAction({ commit }, recipe) {
- commit('deleteRecipe', recipe)
- },
- deleteRecipesAction({ commit }, ids) {
+ deleteRecipes({ commit }, ids) {
commit('deleteRecipes', ids)
},
initListItems({ commit }) {
commit('initListItems')
},
- importListItemsAction({ commit }, data) {
+ importListItems({ commit }, data) {
commit('importListItems', data)
},
addListItemAction({ commit }, item) {
@@ -782,8 +1002,11 @@ export default new Vuex.Store({
initMealPlans({ commit }) {
commit('initMealPlans')
},
- importMealPlansAction({ commit }, mealPlans) {
- commit('importMealPlans', mealPlans)
+ importMealPlansFromJSON({ commit }, mealPlans) {
+ commit('importMealPlansFromJSON', mealPlans)
+ },
+ importMealPlansFromDB({ commit }, mealPlans) {
+ commit('importMealPlansFromDB', mealPlans)
},
addMealPlanAction({ commit }, mealPlan) {
commit('addMealPlan', mealPlan)
@@ -794,12 +1017,6 @@ export default new Vuex.Store({
toggleStateAction({ commit }, toggledRecipe) {
commit('toggleState', toggledRecipe)
},
- setRecipeAsTriedAction({ commit }, recipe) {
- commit('setRecipeAsTried', recipe)
- },
- setLastTriedDateAction({ commit }, index) {
- commit('setLastTriedDate', index)
- },
setComponent({ commit }, comp) {
commit('setComponent', comp)
},
diff --git a/fastlane/metadata/android/en-GB/changelogs/8.txt b/fastlane/metadata/android/en-GB/changelogs/8.txt
deleted file mode 100644
index ff8c6b66..00000000
--- a/fastlane/metadata/android/en-GB/changelogs/8.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- You can now choose a system default theme to follow your device's dark mode setting (for Android 10 and above)
-- Cooking timer tool has been added
-- Individual settings page for each tool
\ No newline at end of file
diff --git a/nativescript.config.ts b/nativescript.config.ts
index fc941933..033ea2bd 100644
--- a/nativescript.config.ts
+++ b/nativescript.config.ts
@@ -1,7 +1,7 @@
import { NativeScriptConfig } from "@nativescript/core"
export default {
- id: "com.vishnuraghav.enrecipes",
+ id: "com.vishnuraghav.EnRecipes",
appPath: "app",
appResourcesPath: "app/resources",
android: {
diff --git a/package-lock.json b/package-lock.json
index 442c9ad2..9a322c11 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,35 +1,48 @@
{
"name": "enrecipes",
- "version": "1.0.0",
+ "version": "2.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "enrecipes",
- "version": "1.0.0",
+ "version": "2.0.0",
"license": "GPL",
"dependencies": {
+ "@akylas/nativescript-sqlite": "^3.3.12",
"@nativescript-community/ui-collectionview": "^4.0.29",
- "@nativescript/core": "~8.0.1",
+ "@nativescript/core": "^8.0.5",
+ "@nativescript/local-notifications": "^5.0.3",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
- "@triniwiz/nativescript-couchbase": "^1.2.2",
"nativescript-imagecropper": "^4.0.1",
"nativescript-intl": "^4.0.2",
- "nativescript-vue": "~2.9.0",
+ "nativescript-vue": "^2.9.0",
"vuex": "^3.6.2"
},
"devDependencies": {
"@nativescript/android": "8.0.0",
- "@nativescript/types-android": "^8.0.0",
+ "@nativescript/types": "^8.0.1",
"@nativescript/webpack": "beta",
- "@types/node": "^14.14.37",
+ "@types/node": "^15.3.0",
"nativescript-vue-template-compiler": "~2.9.0",
- "sass": "^1.32.8",
+ "sass": "^1.32.13",
"typescript": "^4.2.4",
"vue": "^2.6.12"
}
},
+ "node_modules/@akylas/nativescript-sqlite": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/@akylas/nativescript-sqlite/-/nativescript-sqlite-3.3.12.tgz",
+ "integrity": "sha512-wu8zoLfw9OJP6UYQ0BAUsnf7rEsLY4gC+X71r7ga7zZcTqwNmmU+9E6so2eZlAdzzYIwUMIeTrxRm/VB129DRA==",
+ "dependencies": {
+ "@nativescript/hook": "~2.0.0"
+ },
+ "peerDependencies": {
+ "@nano-sql/core": "^2.3.7",
+ "@nativescript-community/typeorm": "0.2.28-1"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
@@ -40,9 +53,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.13.15",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz",
- "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz",
+ "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==",
"dev": true
},
"node_modules/@babel/core": {
@@ -85,12 +98,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz",
- "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz",
+ "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.13.16",
+ "@babel/types": "^7.14.2",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
@@ -120,14 +133,14 @@
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
- "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz",
+ "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==",
"dev": true,
"dependencies": {
"@babel/helper-get-function-arity": "^7.12.13",
"@babel/template": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.2"
}
},
"node_modules/@babel/helper-get-function-arity": {
@@ -158,19 +171,19 @@
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.13.14",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz",
- "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz",
+ "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.13.12",
"@babel/helper-replace-supers": "^7.13.12",
"@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"@babel/template": "^7.12.13",
- "@babel/traverse": "^7.13.13",
- "@babel/types": "^7.13.14"
+ "@babel/traverse": "^7.14.2",
+ "@babel/types": "^7.14.2"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
@@ -183,15 +196,15 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
- "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz",
+ "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==",
"dev": true,
"dependencies": {
"@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.12"
+ "@babel/traverse": "^7.14.2",
+ "@babel/types": "^7.14.2"
}
},
"node_modules/@babel/helper-simple-access": {
@@ -213,9 +226,9 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
"dev": true
},
"node_modules/@babel/helper-validator-option": {
@@ -225,23 +238,23 @@
"dev": true
},
"node_modules/@babel/helpers": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz",
- "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
+ "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.12.13",
- "@babel/traverse": "^7.13.17",
- "@babel/types": "^7.13.17"
+ "@babel/traverse": "^7.14.0",
+ "@babel/types": "^7.14.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -309,9 +322,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz",
- "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz",
+ "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -332,44 +345,44 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz",
- "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz",
+ "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.13.16",
- "@babel/helper-function-name": "^7.12.13",
+ "@babel/generator": "^7.14.2",
+ "@babel/helper-function-name": "^7.14.2",
"@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/parser": "^7.13.16",
- "@babel/types": "^7.13.17",
+ "@babel/parser": "^7.14.2",
+ "@babel/types": "^7.14.2",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"node_modules/@babel/types": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz",
- "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz",
+ "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"to-fast-properties": "^2.0.0"
}
},
"node_modules/@discoveryjs/json-ext": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
- "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
+ "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
"dev": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/@nativescript-community/ui-collectionview": {
- "version": "4.0.29",
- "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.29.tgz",
- "integrity": "sha512-u+HR3XNbws8ORus4lcKzMr5TWUR/w43OszscJIfv1orGI7ZnqrUHvPyiVz2Ff5+W78s1VPTQdMg0tyGjSX/qEg=="
+ "version": "4.0.31",
+ "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.31.tgz",
+ "integrity": "sha512-kWtupfe+zr2Vj5hLfie/xxlFYLtLbBS6WrDBUD9z1cJYIZRf9KQxwl8z4wJ2dtQ51dlt1r8CJZgpgRbMTk5xQA=="
},
"node_modules/@nativescript/android": {
"version": "8.0.0",
@@ -378,9 +391,9 @@
"dev": true
},
"node_modules/@nativescript/core": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.2.tgz",
- "integrity": "sha512-g4WvY7DMj3wN7CkWCkgXMloe2hTZbMKumtCO/4HhhGkvHoYa3Udm6HIwf6o88ekNOKrMwWsUzOcOXBFFT4AguQ==",
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.6.tgz",
+ "integrity": "sha512-w9fmuzUrKUblHbkmApMNWExgFZewZCnwf8A2ymcdLsftvljXrDhztbIgQD4aDis61OaqE1N42UToYPpUkaw5pw==",
"hasInstallScript": true,
"dependencies": {
"@nativescript/hook": "~2.0.0",
@@ -398,6 +411,14 @@
"mkdirp": "^1.0.4"
}
},
+ "node_modules/@nativescript/local-notifications": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@nativescript/local-notifications/-/local-notifications-5.0.3.tgz",
+ "integrity": "sha512-zIynr7kbac1/XZZ14NGnRro7eocdj+T5G3GqPtoJnlCNF2Lfwdr9KcbshhOsRiW/gszi5wkUli7QuFm0T3j5Dg==",
+ "dependencies": {
+ "@nativescript/shared-notification-delegate": "~1.0.0"
+ }
+ },
"node_modules/@nativescript/localize": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@nativescript/localize/-/localize-5.0.4.tgz",
@@ -410,16 +431,37 @@
"sprintf-js": "^1.1.1"
}
},
+ "node_modules/@nativescript/shared-notification-delegate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@nativescript/shared-notification-delegate/-/shared-notification-delegate-1.0.2.tgz",
+ "integrity": "sha512-Wh6F1WH9Aj23K+nyolA5MrA6MXku/5rSPt9r20ekbyx2FkRpBr0stjg4uD6KSyUvWY8YT+KQ9WlOUzhq7g7Ycw=="
+ },
+ "node_modules/@nativescript/types": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@nativescript/types/-/types-8.0.1.tgz",
+ "integrity": "sha512-D+tiui/HAgeLyJI62KdDEcXotXIG/MS1SkTK5PkP0GqakqsXJom4piggexg9sUv1zecHSefeA+Fpg0XBPRVOZQ==",
+ "dev": true,
+ "dependencies": {
+ "@nativescript/types-android": "8.0.1",
+ "@nativescript/types-ios": "8.0.1"
+ }
+ },
"node_modules/@nativescript/types-android": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@nativescript/types-android/-/types-android-8.0.1.tgz",
"integrity": "sha512-+j+AgxOADDQrq/LZRGB8cznCad8dbGqD68KbkTxKwtUGdMFl2wlwcZEYgrv/N3JCOScEmQHJogAjixHCgnlnrA==",
"dev": true
},
+ "node_modules/@nativescript/types-ios": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@nativescript/types-ios/-/types-ios-8.0.1.tgz",
+ "integrity": "sha512-j8g/FbaQQsZlHEVEU2EUnX3SJvo3SI8ZhmPBzKoq1xTwnG3XvG3txU+yXQ95mZOT0YoaPdyo53ROEMNDOEDtMQ==",
+ "dev": true
+ },
"node_modules/@nativescript/webpack": {
- "version": "5.0.0-beta.9",
- "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-beta.9.tgz",
- "integrity": "sha512-DbsPLX7IYxeq6wtzOKNdLBVWakQCYF16UuFKTnQWfmPqRAHANn+Cpn48qhVmrLXp3u/BxHHdoPmDx5080j+Kvg==",
+ "version": "5.0.0-beta.10",
+ "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-beta.10.tgz",
+ "integrity": "sha512-j/NlhVCZi/8N5IQQbPjSRWPc3a7zSW8NTc0LsxbidsBPqeTiX1wUq5ajmNv/ctmbiNRsjmB9wTDwDxowormr2Q==",
"dev": true,
"dependencies": {
"@babel/core": "7.13.15",
@@ -568,9 +610,9 @@
}
},
"node_modules/@polka/url": {
- "version": "1.0.0-next.12",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.12.tgz",
- "integrity": "sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ==",
+ "version": "1.0.0-next.15",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz",
+ "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==",
"dev": true
},
"node_modules/@triniwiz/nativescript-accelerometer": {
@@ -578,15 +620,10 @@
"resolved": "https://registry.npmjs.org/@triniwiz/nativescript-accelerometer/-/nativescript-accelerometer-4.0.3.tgz",
"integrity": "sha512-LKwlNaIWJPEbFKsPwA5vndqrKBUqE9dK9wdi/LsHs0Nl6pfMI7fPkBPoGW7UvVSMqy4s4d35Q0FDbKXR1t796A=="
},
- "node_modules/@triniwiz/nativescript-couchbase": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@triniwiz/nativescript-couchbase/-/nativescript-couchbase-1.2.3.tgz",
- "integrity": "sha512-E9BS1+DZn2xy3jSYjafFG6lAr4uYxxsLmc3pLmDjchK8H5oURzZgB9ubWwOn2ElGoLAaDaXv2ZFhHVIgFMmdwg=="
- },
"node_modules/@types/eslint": {
- "version": "7.2.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz",
- "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==",
+ "version": "7.2.11",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.11.tgz",
+ "integrity": "sha512-WYhv//5K8kQtsSc9F1Kn2vHzhYor6KpwPbARH7hwYe3C3ETD0EVx/3P5qQybUoaBEuUa9f/02JjBiXFWalYUmw==",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -616,9 +653,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "14.14.41",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz",
- "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==",
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz",
+ "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==",
"dev": true
},
"node_modules/@types/parse-json": {
@@ -894,9 +931,9 @@
}
},
"node_modules/@webpack-cli/configtest": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.2.tgz",
- "integrity": "sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz",
+ "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==",
"dev": true,
"peerDependencies": {
"webpack": "4.x.x || 5.x.x",
@@ -904,9 +941,9 @@
}
},
"node_modules/@webpack-cli/info": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.3.tgz",
- "integrity": "sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz",
+ "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==",
"dev": true,
"dependencies": {
"envinfo": "^7.7.3"
@@ -916,9 +953,9 @@
}
},
"node_modules/@webpack-cli/serve": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.1.tgz",
- "integrity": "sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz",
+ "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==",
"dev": true,
"peerDependencies": {
"webpack-cli": "4.x.x"
@@ -942,9 +979,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz",
- "integrity": "sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==",
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz",
+ "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1028,9 +1065,9 @@
}
},
"node_modules/acorn-walk": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz",
- "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.0.tgz",
+ "integrity": "sha512-mjmzmv12YIG/G8JQdQuz2MUDShEJ6teYpT5bmWA4q7iwoGen8xtt3twF3OvzIUl+Q06aWIjvnwQUKvQ6TtMRjg==",
"dev": true,
"engines": {
"node": ">=0.4.0"
@@ -1302,14 +1339,14 @@
}
},
"node_modules/browserslist": {
- "version": "4.16.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz",
- "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==",
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
"dev": true,
"dependencies": {
- "caniuse-lite": "^1.0.30001214",
+ "caniuse-lite": "^1.0.30001219",
"colorette": "^1.2.2",
- "electron-to-chromium": "^1.3.719",
+ "electron-to-chromium": "^1.3.723",
"escalade": "^3.1.1",
"node-releases": "^1.1.71"
},
@@ -1351,10 +1388,14 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001214",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz",
- "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==",
- "dev": true
+ "version": "1.0.30001230",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
+ "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
},
"node_modules/chalk": {
"version": "4.1.0",
@@ -1797,12 +1838,12 @@
}
},
"node_modules/dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
"node_modules/dotenv-defaults": {
@@ -1836,9 +1877,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.3.720",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz",
- "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==",
+ "version": "1.3.739",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz",
+ "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -2261,9 +2302,9 @@
}
},
"node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -2502,9 +2543,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
- "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+ "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
@@ -2942,9 +2983,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.1.22",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz",
- "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==",
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
+ "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
@@ -2997,9 +3038,9 @@
"dev": true
},
"node_modules/node-releases": {
- "version": "1.1.71",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
- "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "version": "1.1.72",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
+ "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
"dev": true
},
"node_modules/normalize-path": {
@@ -3193,9 +3234,9 @@
}
},
"node_modules/path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-type": {
@@ -3208,9 +3249,9 @@
}
},
"node_modules/picomatch": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
- "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
"dev": true,
"engines": {
"node": ">=8.6"
@@ -3419,9 +3460,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz",
- "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==",
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@@ -3725,9 +3766,9 @@
"dev": true
},
"node_modules/sass": {
- "version": "1.32.11",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.11.tgz",
- "integrity": "sha512-O9tRcob/fegUVSIV1ihLLZcftIOh0AF1VpKgusUfLqnb2jQ0GLDwI5ivv1FYWivGv8eZ/AwntTyTzjcHu0c/qw==",
+ "version": "1.34.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.34.0.tgz",
+ "integrity": "sha512-rHEN0BscqjUYuomUEaqq3BMgsXqQfkcMVR7UhscsAVub0/spUrZGBMxQXFS2kfiDsPLZw5yuU9iJEFNC2x38Qw==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0"
@@ -3873,12 +3914,12 @@
}
},
"node_modules/sirv": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz",
- "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==",
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz",
+ "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==",
"dev": true,
"dependencies": {
- "@polka/url": "^1.0.0-next.9",
+ "@polka/url": "^1.0.0-next.15",
"mime": "^2.3.1",
"totalist": "^1.0.0"
},
@@ -4022,9 +4063,9 @@
}
},
"node_modules/terser": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz",
- "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz",
+ "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==",
"dev": true,
"dependencies": {
"commander": "^2.20.0",
@@ -4395,9 +4436,9 @@
}
},
"node_modules/watchpack": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
- "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz",
+ "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==",
"dev": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
@@ -4594,9 +4635,9 @@
"dev": true
},
"node_modules/webpack/node_modules/enhanced-resolve": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz",
- "integrity": "sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ==",
+ "version": "5.8.2",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz",
+ "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -4677,9 +4718,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/ws": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
- "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true,
"engines": {
"node": ">=8.3.0"
@@ -4786,6 +4827,14 @@
}
},
"dependencies": {
+ "@akylas/nativescript-sqlite": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/@akylas/nativescript-sqlite/-/nativescript-sqlite-3.3.12.tgz",
+ "integrity": "sha512-wu8zoLfw9OJP6UYQ0BAUsnf7rEsLY4gC+X71r7ga7zZcTqwNmmU+9E6so2eZlAdzzYIwUMIeTrxRm/VB129DRA==",
+ "requires": {
+ "@nativescript/hook": "~2.0.0"
+ }
+ },
"@babel/code-frame": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
@@ -4796,9 +4845,9 @@
}
},
"@babel/compat-data": {
- "version": "7.13.15",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz",
- "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz",
+ "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==",
"dev": true
},
"@babel/core": {
@@ -4833,12 +4882,12 @@
}
},
"@babel/generator": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz",
- "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz",
+ "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==",
"dev": true,
"requires": {
- "@babel/types": "^7.13.16",
+ "@babel/types": "^7.14.2",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
},
@@ -4864,14 +4913,14 @@
}
},
"@babel/helper-function-name": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
- "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz",
+ "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==",
"dev": true,
"requires": {
"@babel/helper-get-function-arity": "^7.12.13",
"@babel/template": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.2"
}
},
"@babel/helper-get-function-arity": {
@@ -4902,19 +4951,19 @@
}
},
"@babel/helper-module-transforms": {
- "version": "7.13.14",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz",
- "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz",
+ "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.13.12",
"@babel/helper-replace-supers": "^7.13.12",
"@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"@babel/template": "^7.12.13",
- "@babel/traverse": "^7.13.13",
- "@babel/types": "^7.13.14"
+ "@babel/traverse": "^7.14.2",
+ "@babel/types": "^7.14.2"
}
},
"@babel/helper-optimise-call-expression": {
@@ -4927,15 +4976,15 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
- "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz",
+ "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==",
"dev": true,
"requires": {
"@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.12"
+ "@babel/traverse": "^7.14.2",
+ "@babel/types": "^7.14.2"
}
},
"@babel/helper-simple-access": {
@@ -4957,9 +5006,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
"dev": true
},
"@babel/helper-validator-option": {
@@ -4969,23 +5018,23 @@
"dev": true
},
"@babel/helpers": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz",
- "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
+ "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
"dev": true,
"requires": {
"@babel/template": "^7.12.13",
- "@babel/traverse": "^7.13.17",
- "@babel/types": "^7.13.17"
+ "@babel/traverse": "^7.14.0",
+ "@babel/types": "^7.14.0"
}
},
"@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
@@ -5043,9 +5092,9 @@
}
},
"@babel/parser": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz",
- "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==",
+ "version": "7.14.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz",
+ "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==",
"dev": true
},
"@babel/template": {
@@ -5060,41 +5109,41 @@
}
},
"@babel/traverse": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz",
- "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz",
+ "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.13.16",
- "@babel/helper-function-name": "^7.12.13",
+ "@babel/generator": "^7.14.2",
+ "@babel/helper-function-name": "^7.14.2",
"@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/parser": "^7.13.16",
- "@babel/types": "^7.13.17",
+ "@babel/parser": "^7.14.2",
+ "@babel/types": "^7.14.2",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz",
- "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz",
+ "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/helper-validator-identifier": "^7.14.0",
"to-fast-properties": "^2.0.0"
}
},
"@discoveryjs/json-ext": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
- "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
+ "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
"dev": true
},
"@nativescript-community/ui-collectionview": {
- "version": "4.0.29",
- "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.29.tgz",
- "integrity": "sha512-u+HR3XNbws8ORus4lcKzMr5TWUR/w43OszscJIfv1orGI7ZnqrUHvPyiVz2Ff5+W78s1VPTQdMg0tyGjSX/qEg=="
+ "version": "4.0.31",
+ "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.31.tgz",
+ "integrity": "sha512-kWtupfe+zr2Vj5hLfie/xxlFYLtLbBS6WrDBUD9z1cJYIZRf9KQxwl8z4wJ2dtQ51dlt1r8CJZgpgRbMTk5xQA=="
},
"@nativescript/android": {
"version": "8.0.0",
@@ -5103,9 +5152,9 @@
"dev": true
},
"@nativescript/core": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.2.tgz",
- "integrity": "sha512-g4WvY7DMj3wN7CkWCkgXMloe2hTZbMKumtCO/4HhhGkvHoYa3Udm6HIwf6o88ekNOKrMwWsUzOcOXBFFT4AguQ==",
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.6.tgz",
+ "integrity": "sha512-w9fmuzUrKUblHbkmApMNWExgFZewZCnwf8A2ymcdLsftvljXrDhztbIgQD4aDis61OaqE1N42UToYPpUkaw5pw==",
"requires": {
"@nativescript/hook": "~2.0.0",
"css-tree": "^1.1.2",
@@ -5122,6 +5171,14 @@
"mkdirp": "^1.0.4"
}
},
+ "@nativescript/local-notifications": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@nativescript/local-notifications/-/local-notifications-5.0.3.tgz",
+ "integrity": "sha512-zIynr7kbac1/XZZ14NGnRro7eocdj+T5G3GqPtoJnlCNF2Lfwdr9KcbshhOsRiW/gszi5wkUli7QuFm0T3j5Dg==",
+ "requires": {
+ "@nativescript/shared-notification-delegate": "~1.0.0"
+ }
+ },
"@nativescript/localize": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@nativescript/localize/-/localize-5.0.4.tgz",
@@ -5133,16 +5190,37 @@
"sprintf-js": "^1.1.1"
}
},
+ "@nativescript/shared-notification-delegate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@nativescript/shared-notification-delegate/-/shared-notification-delegate-1.0.2.tgz",
+ "integrity": "sha512-Wh6F1WH9Aj23K+nyolA5MrA6MXku/5rSPt9r20ekbyx2FkRpBr0stjg4uD6KSyUvWY8YT+KQ9WlOUzhq7g7Ycw=="
+ },
+ "@nativescript/types": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@nativescript/types/-/types-8.0.1.tgz",
+ "integrity": "sha512-D+tiui/HAgeLyJI62KdDEcXotXIG/MS1SkTK5PkP0GqakqsXJom4piggexg9sUv1zecHSefeA+Fpg0XBPRVOZQ==",
+ "dev": true,
+ "requires": {
+ "@nativescript/types-android": "8.0.1",
+ "@nativescript/types-ios": "8.0.1"
+ }
+ },
"@nativescript/types-android": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@nativescript/types-android/-/types-android-8.0.1.tgz",
"integrity": "sha512-+j+AgxOADDQrq/LZRGB8cznCad8dbGqD68KbkTxKwtUGdMFl2wlwcZEYgrv/N3JCOScEmQHJogAjixHCgnlnrA==",
"dev": true
},
+ "@nativescript/types-ios": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@nativescript/types-ios/-/types-ios-8.0.1.tgz",
+ "integrity": "sha512-j8g/FbaQQsZlHEVEU2EUnX3SJvo3SI8ZhmPBzKoq1xTwnG3XvG3txU+yXQ95mZOT0YoaPdyo53ROEMNDOEDtMQ==",
+ "dev": true
+ },
"@nativescript/webpack": {
- "version": "5.0.0-beta.9",
- "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-beta.9.tgz",
- "integrity": "sha512-DbsPLX7IYxeq6wtzOKNdLBVWakQCYF16UuFKTnQWfmPqRAHANn+Cpn48qhVmrLXp3u/BxHHdoPmDx5080j+Kvg==",
+ "version": "5.0.0-beta.10",
+ "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-beta.10.tgz",
+ "integrity": "sha512-j/NlhVCZi/8N5IQQbPjSRWPc3a7zSW8NTc0LsxbidsBPqeTiX1wUq5ajmNv/ctmbiNRsjmB9wTDwDxowormr2Q==",
"dev": true,
"requires": {
"@babel/core": "7.13.15",
@@ -5234,9 +5312,9 @@
}
},
"@polka/url": {
- "version": "1.0.0-next.12",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.12.tgz",
- "integrity": "sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ==",
+ "version": "1.0.0-next.15",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz",
+ "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==",
"dev": true
},
"@triniwiz/nativescript-accelerometer": {
@@ -5244,15 +5322,10 @@
"resolved": "https://registry.npmjs.org/@triniwiz/nativescript-accelerometer/-/nativescript-accelerometer-4.0.3.tgz",
"integrity": "sha512-LKwlNaIWJPEbFKsPwA5vndqrKBUqE9dK9wdi/LsHs0Nl6pfMI7fPkBPoGW7UvVSMqy4s4d35Q0FDbKXR1t796A=="
},
- "@triniwiz/nativescript-couchbase": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@triniwiz/nativescript-couchbase/-/nativescript-couchbase-1.2.3.tgz",
- "integrity": "sha512-E9BS1+DZn2xy3jSYjafFG6lAr4uYxxsLmc3pLmDjchK8H5oURzZgB9ubWwOn2ElGoLAaDaXv2ZFhHVIgFMmdwg=="
- },
"@types/eslint": {
- "version": "7.2.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz",
- "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==",
+ "version": "7.2.11",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.11.tgz",
+ "integrity": "sha512-WYhv//5K8kQtsSc9F1Kn2vHzhYor6KpwPbARH7hwYe3C3ETD0EVx/3P5qQybUoaBEuUa9f/02JjBiXFWalYUmw==",
"dev": true,
"requires": {
"@types/estree": "*",
@@ -5282,9 +5355,9 @@
"dev": true
},
"@types/node": {
- "version": "14.14.41",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz",
- "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==",
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz",
+ "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==",
"dev": true
},
"@types/parse-json": {
@@ -5537,24 +5610,24 @@
}
},
"@webpack-cli/configtest": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.2.tgz",
- "integrity": "sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz",
+ "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==",
"dev": true
},
"@webpack-cli/info": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.3.tgz",
- "integrity": "sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz",
+ "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==",
"dev": true,
"requires": {
"envinfo": "^7.7.3"
}
},
"@webpack-cli/serve": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.1.tgz",
- "integrity": "sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz",
+ "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==",
"dev": true
},
"@xtuc/ieee754": {
@@ -5570,9 +5643,9 @@
"dev": true
},
"acorn": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz",
- "integrity": "sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==",
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz",
+ "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==",
"dev": true
},
"acorn-class-fields": {
@@ -5620,9 +5693,9 @@
}
},
"acorn-walk": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz",
- "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.0.tgz",
+ "integrity": "sha512-mjmzmv12YIG/G8JQdQuz2MUDShEJ6teYpT5bmWA4q7iwoGen8xtt3twF3OvzIUl+Q06aWIjvnwQUKvQ6TtMRjg==",
"dev": true
},
"ajv": {
@@ -5811,14 +5884,14 @@
}
},
"browserslist": {
- "version": "4.16.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz",
- "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==",
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001214",
+ "caniuse-lite": "^1.0.30001219",
"colorette": "^1.2.2",
- "electron-to-chromium": "^1.3.719",
+ "electron-to-chromium": "^1.3.723",
"escalade": "^3.1.1",
"node-releases": "^1.1.71"
}
@@ -5841,9 +5914,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001214",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz",
- "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==",
+ "version": "1.0.30001230",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
+ "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
"dev": true
},
"chalk": {
@@ -6178,9 +6251,9 @@
}
},
"dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true
},
"dotenv-defaults": {
@@ -6208,9 +6281,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.720",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz",
- "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==",
+ "version": "1.3.739",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz",
+ "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==",
"dev": true
},
"emoji-regex": {
@@ -6535,9 +6608,9 @@
"dev": true
},
"glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -6710,9 +6783,9 @@
}
},
"is-core-module": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
- "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+ "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
"dev": true,
"requires": {
"has": "^1.0.3"
@@ -7051,9 +7124,9 @@
}
},
"nanoid": {
- "version": "3.1.22",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz",
- "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==",
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
+ "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
"dev": true
},
"native-url": {
@@ -7100,9 +7173,9 @@
"dev": true
},
"node-releases": {
- "version": "1.1.71",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
- "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "version": "1.1.72",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
+ "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
"dev": true
},
"normalize-path": {
@@ -7246,9 +7319,9 @@
"dev": true
},
"path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-type": {
@@ -7258,9 +7331,9 @@
"dev": true
},
"picomatch": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
- "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
"dev": true
},
"pify": {
@@ -7404,9 +7477,9 @@
}
},
"postcss-selector-parser": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz",
- "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==",
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
@@ -7619,9 +7692,9 @@
"dev": true
},
"sass": {
- "version": "1.32.11",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.11.tgz",
- "integrity": "sha512-O9tRcob/fegUVSIV1ihLLZcftIOh0AF1VpKgusUfLqnb2jQ0GLDwI5ivv1FYWivGv8eZ/AwntTyTzjcHu0c/qw==",
+ "version": "1.34.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.34.0.tgz",
+ "integrity": "sha512-rHEN0BscqjUYuomUEaqq3BMgsXqQfkcMVR7UhscsAVub0/spUrZGBMxQXFS2kfiDsPLZw5yuU9iJEFNC2x38Qw==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0"
@@ -7715,12 +7788,12 @@
}
},
"sirv": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz",
- "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==",
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz",
+ "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==",
"dev": true,
"requires": {
- "@polka/url": "^1.0.0-next.9",
+ "@polka/url": "^1.0.0-next.15",
"mime": "^2.3.1",
"totalist": "^1.0.0"
}
@@ -7836,9 +7909,9 @@
"dev": true
},
"terser": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz",
- "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz",
+ "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==",
"dev": true,
"requires": {
"commander": "^2.20.0",
@@ -8113,9 +8186,9 @@
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
},
"watchpack": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
- "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz",
+ "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==",
"dev": true,
"requires": {
"glob-to-regexp": "^0.4.1",
@@ -8154,9 +8227,9 @@
},
"dependencies": {
"enhanced-resolve": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz",
- "integrity": "sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ==",
+ "version": "5.8.2",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz",
+ "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
@@ -8313,9 +8386,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
- "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true
},
"xmlbuilder": {
diff --git a/package.json b/package.json
index f76cc892..c5fe4d58 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"name": "enrecipes",
"main": "./app/main.ts",
- "version": "1.0.0",
- "description": "A native application built with NativeScript-Vue",
+ "version": "2.0.0",
+ "description": "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes.",
"homepage": "https://enrecipes.vercel.app/",
"bugs": {
"url": "https://github.com/vishnuraghavb/EnRecipes/issues"
@@ -18,23 +18,24 @@
},
"private": "true",
"dependencies": {
+ "@akylas/nativescript-sqlite": "^3.3.12",
"@nativescript-community/ui-collectionview": "^4.0.29",
- "@nativescript/core": "~8.0.1",
+ "@nativescript/core": "^8.0.5",
+ "@nativescript/local-notifications": "^5.0.3",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
- "@triniwiz/nativescript-couchbase": "^1.2.2",
"nativescript-imagecropper": "^4.0.1",
"nativescript-intl": "^4.0.2",
- "nativescript-vue": "~2.9.0",
+ "nativescript-vue": "^2.9.0",
"vuex": "^3.6.2"
},
"devDependencies": {
"@nativescript/android": "8.0.0",
- "@nativescript/types-android": "^8.0.0",
+ "@nativescript/types": "^8.0.1",
"@nativescript/webpack": "beta",
- "@types/node": "^14.14.37",
+ "@types/node": "^15.3.0",
"nativescript-vue-template-compiler": "~2.9.0",
- "sass": "^1.32.8",
+ "sass": "^1.32.13",
"typescript": "^4.2.4",
"vue": "^2.6.12"
}
diff --git a/tsconfig.json b/tsconfig.json
index c0ea2af0..d381e021 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
"lib": ["dom", "es2017"],
"sourceMap": true,
"noEmitHelpers": true,
- "importHelpers": true,
+ "importHelpers": false, // Must be false to create custom android componentt
"baseUrl": ".",
"paths": {
"~/*": ["app/*"],
diff --git a/types/references.d.ts b/types/references.d.ts
index d5b01651..dedd7934 100644
--- a/types/references.d.ts
+++ b/types/references.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/webpack.config.js b/webpack.config.js
index c31f14bb..bc678552 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,6 +1,20 @@
const webpack = require('@nativescript/webpack')
+const path = require('path')
module.exports = (env) => {
webpack.init(env)
+ const platform = webpack.Utils.platform.getPlatformName()
+ webpack.chainWebpack((config) => {
+ if (platform === 'android') {
+ const appComponents = [
+ '@nativescript/core/ui/frame',
+ '@nativescript/core/ui/frame/activity',
+ path.resolve(__dirname, 'app/ForegroundService.js'),
+ ]
+ appComponents.map((component) => {
+ config.entry('bundle').add(component)
+ })
+ }
+ })
return webpack.resolveConfig()
}