pizza recipes are now loaded from the github repo on first app run, so always up to date

as a backup still have local recipes
This commit is contained in:
broodjeaap89 2021-11-20 14:33:31 +01:00
parent 42dcacee0b
commit b6f58222f1
3 changed files with 38 additions and 3 deletions

View file

@ -94,6 +94,9 @@ class PizzaRecipe extends HiveObject {
} }
static Future<PizzaRecipe> fromParsedYaml(YamlMap recipe) async { static Future<PizzaRecipe> fromParsedYaml(YamlMap recipe) async {
if (recipe.containsKey("recipe")){
recipe = recipe["recipe"] as YamlMap;
}
final String name = recipe["name"] as String; final String name = recipe["name"] as String;
final String? image = recipe.containsKey("image") ? recipe["image"] as String : null; final String? image = recipe.containsKey("image") ? recipe["image"] as String : null;
final String description = recipe["description"] as String; final String description = recipe["description"] as String;

View file

@ -45,9 +45,12 @@ Future<void> main() async {
await Hive.openBox<PizzaEvent>(PizzaEvent.hiveName); await Hive.openBox<PizzaEvent>(PizzaEvent.hiveName);
final pizzaRecipesBox = await Hive.openBox<PizzaRecipe>(PizzaRecipe.hiveName); final pizzaRecipesBox = await Hive.openBox<PizzaRecipe>(PizzaRecipe.hiveName);
if (pizzaRecipesBox.isEmpty){ if (pizzaRecipesBox.isEmpty){
pizzaRecipesBox.addAll(await getRecipes()); pizzaRecipesBox.addAll(await getRecipesFromGithub());
}
if (pizzaRecipesBox.isEmpty){
pizzaRecipesBox.addAll(await getLocalRecipes());
} }
// notification init // notification init

View file

@ -1,10 +1,13 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle; import 'package:flutter/services.dart' show rootBundle;
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:pizzaplanner/entities/PizzaRecipe/pizza_recipe.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/pizza_recipe.dart';
import 'package:yaml/yaml.dart';
Future<List<PizzaRecipe>> getRecipes() async { Future<List<PizzaRecipe>> getLocalRecipes() async {
final manifestContent = await rootBundle.loadString('AssetManifest.json'); final manifestContent = await rootBundle.loadString('AssetManifest.json');
final Map<String, dynamic> manifestMap = json.decode(manifestContent) as Map<String, dynamic>; final Map<String, dynamic> manifestMap = json.decode(manifestContent) as Map<String, dynamic>;
final List<String> fileList = manifestMap.keys.toList(); final List<String> fileList = manifestMap.keys.toList();
@ -18,6 +21,32 @@ Future<List<PizzaRecipe>> getRecipes() async {
return pizzaRecipes; return pizzaRecipes;
} }
Future<List<PizzaRecipe>> getRecipesFromGithub() async {
const String initialRecipeListUrl = "https://raw.githubusercontent.com/broodjeaap/PizzaRecipes/master/app_init/recipes.yaml";
final uri = Uri.parse(initialRecipeListUrl);
if (!uri.isAbsolute){
return const [];
}
final response = await http.get(uri);
if (response.statusCode != 200) {
return const [];
}
final yamlBody = response.body;
if (!yamlBody.startsWith("recipes:")){
return const [];
}
final rootYaml = loadYaml(yamlBody) as YamlMap;
final recipeList = rootYaml["recipes"] as YamlList;
final returnRecipeList = <PizzaRecipe>[];
for (final recipe in recipeList){
returnRecipeList.add(await PizzaRecipe.fromParsedYaml(recipe as YamlMap));
}
return returnRecipeList;
return const [];
}
Future<String> loadAsset(String path) async { Future<String> loadAsset(String path) async {
return rootBundle.loadString(path); return rootBundle.loadString(path);
} }