diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart new file mode 100644 index 0000000..fab5ef2 --- /dev/null +++ b/lib/screens/settings.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:fooder/screens/based.dart'; +import 'package:fooder/components/button.dart'; + +class SettingsScreen extends BasedScreen { + const SettingsScreen({super.key, required super.ctx}); + + @override + State createState() => _SettingsScreen(); +} + +class _SettingsScreen extends BasedState { + Future resetStorage() async { + try { + ctx.storage.reset(); + showText("Storage reset"); + } catch (e) { + showError(e.toString()); + } + } + + @override + Widget build(BuildContext context) { + var theme = Theme.of(context); + var colorScheme = theme.colorScheme; + + return Scaffold( + extendBodyBehindAppBar: false, + extendBody: true, + appBar: appBar(), + bottomNavigationBar: navBar(), + body: Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 600), + padding: const EdgeInsets.all(10), + child: AutofillGroup( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Icon( + Icons.verified_user_sharp, + size: 100, + color: colorScheme.primary.withOpacity(0.85), + ), + FButton( + labelText: 'Reset local storage', + onPressed: resetStorage, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/storage/diary.dart b/lib/storage/diary.dart new file mode 100644 index 0000000..e09b4c1 --- /dev/null +++ b/lib/storage/diary.dart @@ -0,0 +1,43 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:sqflite/sqflite.dart'; +import 'package:fooder/models/diary.dart'; +import 'package:fooder/storage/based.dart'; + +class DiaryStorage extends StorageBased { + DiaryStorage({required super.db}); + + static Future createTable(Batch batch) async { + batch.execute(''' + CREATE TABLE diary( + date TEXT PRIMARY KEY, + content TEXT, + needs_sync BOOLEAN, + last_sync TEXT + ) + '''); + } + + Future get({required DateTime date}) async { + var result = await db + .query('diary', where: 'date = ?', whereArgs: [date.toIso8601String()]); + if (result.isEmpty) { + return null; + } + return Diary.fromJson( + jsonDecode((result.first as Map)['content'])); + } + + Future insert(Diary diary, {bool needsSync = false}) async { + var data = { + 'id': diary.id, + 'date': diary.date.toIso8601String(), + 'content': jsonEncode(diary.toMap()), + 'needs_sync': needsSync, + 'last_sync': needsSync ? DateTime.now().toIso8601String() : null, + }; + await db.insert('diary', data, + conflictAlgorithm: ConflictAlgorithm.replace); + } +} diff --git a/lib/storage/preset.dart b/lib/storage/preset.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/storage/product.dart b/lib/storage/product.dart index 33c2f13..04cf13d 100644 --- a/lib/storage/product.dart +++ b/lib/storage/product.dart @@ -10,7 +10,7 @@ class ProductStorage extends StorageBased { static Future createTable(Batch batch) async { batch.execute(''' CREATE TABLE product( - id INTEGER, + id INTEGER PRIMARY KEY, name TEXT, barcode TEXT, calories REAL,