diff --git a/lib/locale/l10n/app_de.arb b/lib/locale/l10n/app_de.arb index 52953ea..2775ffc 100644 --- a/lib/locale/l10n/app_de.arb +++ b/lib/locale/l10n/app_de.arb @@ -41,6 +41,7 @@ "memoryViewIsDownloading": "Erinnerung wird heruntergeladen", + "memoryViewDownloadFailed": "Erinnerung konnte nicht geladen werden.", "memorySheetSavedToGallery": "In Gallerie gespeichert!", diff --git a/lib/locale/l10n/app_en.arb b/lib/locale/l10n/app_en.arb index 773ca86..f13f61e 100644 --- a/lib/locale/l10n/app_en.arb +++ b/lib/locale/l10n/app_en.arb @@ -33,7 +33,7 @@ "grantPermissionScreenTitle": "Grant Permissions", "permissionsRequiredPageTitle": "Permissions Required", - "permissionsRequiredPageDescription": "Please grant the following permissions to use this app.", + "permissionsRequiredPageDescription": "Please grant the following permissions to use this app.", "permissionsRequiredPagePermanentlyDenied": "You have permanently denied permissions required to use this app. Please enable them in the settings.", "permissionsRequiredPageOpenSettings": "Open Settings", "permissionsRequiredPageGrantCameraPermission": "Grant camera permission", @@ -41,6 +41,7 @@ "memoryViewIsDownloading": "Downloading memory", + "memoryViewDownloadFailed": "Memory could not be loaded.", "memorySheetSavedToGallery": "Saved to Gallery!", diff --git a/lib/models/calendar.dart b/lib/models/calendar.dart deleted file mode 100644 index 7d1b848..0000000 --- a/lib/models/calendar.dart +++ /dev/null @@ -1,158 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:quid_faciam_hodie/foreign_types/memory.dart'; -import 'package:supabase_flutter/supabase_flutter.dart'; - -final supabase = Supabase.instance.client; - -class CalendarModel extends ChangeNotifier { - // Maps each day to an amount of memories on that day. - // To remove days later we only store the IDs of the memories. - final Map> _values = {}; - bool _isInitializing = true; - - RealtimeSubscription? _serverSubscription; - - bool get isInitializing => _isInitializing; - - CalendarModel(); - - static String formatCreationDateKey(final DateTime date) => - DateFormat('yyyy-MM-dd').format(date); - - static Map> mapFromMemoriesList( - final List memories) { - final map = >{}; - - for (final memory in memories) { - final key = formatCreationDateKey(memory.creationDate); - - if (map.containsKey(key)) { - map[key]!.add(memory.id); - } else { - map[key] = { - memory.id, - }; - } - } - - return map; - } - - @override - void dispose() { - _serverSubscription?.unsubscribe(timeout: Duration.zero); - - super.dispose(); - } - - void setIsInitializing(final bool value) { - _isInitializing = value; - notifyListeners(); - } - - Future _loadInitialData() async { - final response = await supabase - .from('memories') - .select() - .order('created_at', ascending: false) - .execute(); - final newMemories = List.from( - List>.from(response.data).map(Memory.parse), - ); - - _values.addAll(mapFromMemoriesList(newMemories)); - } - - void _removeEmptyDates() { - _values.removeWhere((key, value) => value.isEmpty); - } - - void _addMemory(final Memory memory) { - final key = formatCreationDateKey(memory.creationDate); - - if (_values.containsKey(key)) { - _values[key]!.add(memory.id); - } else { - _values[key] = { - memory.id, - }; - } - } - - void _removeMemory(final String id) { - // Search for the id and remove it - for (final memories in _values.values) { - memories.remove(id); - } - - _removeEmptyDates(); - } - - Future _onServerUpdate( - final SupabaseRealtimePayload response, - ) async { - if (response == null) { - return; - } - - switch (response.eventType) { - case 'INSERT': - final memory = Memory.parse(response.newRecord!); - - _addMemory(memory); - - break; - case 'DELETE': - final id = response.oldRecord!['id']; - - _removeMemory(id); - break; - // Used for easier debugging - case 'UPDATE': - final memory = Memory.parse(response.newRecord!); - - _removeMemory(response.oldRecord!['id']); - _addMemory(memory); - break; - } - - notifyListeners(); - } - - Future initialize() async { - setIsInitializing(true); - - await _loadInitialData(); - - setIsInitializing(false); - notifyListeners(); - - // Watch new updates - _serverSubscription = supabase - .from('memories') - .on(SupabaseEventTypes.all, _onServerUpdate) - .subscribe(); - } - - Map> getMonthDayAmountMapping() { - final map = >{}; - - for (final entry in _values.entries) { - final key = entry.key; - final date = DateTime.parse(key); - final monthDate = DateTime(date.year, date.month, 1); - final memoryIDs = entry.value; - - if (map.containsKey(monthDate)) { - map[monthDate]![date] = memoryIDs.length; - } else { - map[monthDate] = { - date: memoryIDs.length, - }; - } - } - - return map; - } -} diff --git a/lib/models/memory_pack.dart b/lib/models/memory_pack.dart deleted file mode 100644 index 3377624..0000000 --- a/lib/models/memory_pack.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:quid_faciam_hodie/foreign_types/memory.dart'; - -class MemoryPack { - final List _memories; - - const MemoryPack(this._memories); - - List get memories => _memories; - - void orderMemories() { - _memories.sort((a, b) => b.creationDate.compareTo(a.creationDate)); - } - - void updateWithNewMemory(final String memoryID, final Memory memory) { - final index = _memories.indexWhere((memory) => memory.id == memoryID); - - if (index == -1) { - throw Exception('Memory not found'); - } - - _memories[index] = memory; - - orderMemories(); - } - - void addMemory(final Memory memory) { - _memories.add(memory); - orderMemories(); - } -} diff --git a/lib/models/timeline.dart b/lib/models/timeline.dart index f7422ab..6e83239 100644 --- a/lib/models/timeline.dart +++ b/lib/models/timeline.dart @@ -36,9 +36,9 @@ class TimelineModel extends PropertyChangeNotifier { List atIndex(final int index) => _timeline.values.elementAt(index); - List get _currentMemoryPack => atIndex(currentIndex); - bool get _isAtLastMemory => _memoryIndex == _currentMemoryPack.length - 1; - Memory get currentMemory => _currentMemoryPack.elementAt(_memoryIndex); + List get _currentMemories => atIndex(currentIndex); + bool get _isAtLastMemory => _memoryIndex == _currentMemories.length - 1; + Memory get currentMemory => _currentMemories.elementAt(_memoryIndex); void _removeEmptyDates() { _timeline.removeWhere((key, memories) => memories.isEmpty); @@ -129,7 +129,7 @@ class TimelineModel extends PropertyChangeNotifier { } setCurrentIndex(currentIndex - 1); - setMemoryIndex(_currentMemoryPack.length - 1); + setMemoryIndex(_currentMemories.length - 1); } void nextMemory() { diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index f43b22a..df5103d 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -98,7 +98,7 @@ class _LoginScreenState extends AuthState with Loadable { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - 'Login', + localizations.loginScreenTitle, style: theme.textTheme.headline1, ), const SizedBox(height: LARGE_SPACE), diff --git a/lib/widgets/memory.dart b/lib/widgets/memory.dart index 2bf2215..8fbd682 100644 --- a/lib/widgets/memory.dart +++ b/lib/widgets/memory.dart @@ -86,7 +86,7 @@ class _MemoryViewState extends State { if (status == MemoryFetchStatus.error) { return Center( child: Text( - 'Memory could not be loaded.', + localizations.memoryViewDownloadFailed, style: theme.textTheme.bodyText2!.copyWith( color: Colors.white, ), diff --git a/lib/widgets/today_photo_button.dart b/lib/widgets/today_photo_button.dart index f9bdb1c..355816b 100644 --- a/lib/widgets/today_photo_button.dart +++ b/lib/widgets/today_photo_button.dart @@ -41,9 +41,11 @@ class _TodayPhotoButtonState extends State { @override void dispose() { - final memories = context.read(); + try { + final memories = context.read(); - memories.removeListener(loadMemory); + memories.removeListener(loadMemory); + } catch (_) {} super.dispose(); }