diff --git a/lib/main.dart b/lib/main.dart index fc0f411..2f5653f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:camera/camera.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -11,6 +12,7 @@ import 'package:quid_faciam_hodie/screens/server_loading_screen.dart'; import 'package:quid_faciam_hodie/screens/timeline_screen.dart'; import 'package:quid_faciam_hodie/screens/welcome_screen.dart'; +import 'managers/global_values_manager.dart'; import 'models/memories.dart'; void main() async { @@ -21,6 +23,9 @@ void main() async { DeviceOrientation.portraitDown, ]); + GlobalValuesManager.setCameras(await availableCameras()); + GlobalValuesManager.initializeServer(); + runApp(const MyApp()); } diff --git a/lib/managers/file_manager.dart b/lib/managers/file_manager.dart index db93687..d0dc867 100644 --- a/lib/managers/file_manager.dart +++ b/lib/managers/file_manager.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:path_provider/path_provider.dart'; import 'package:quid_faciam_hodie/enums.dart'; import 'package:quid_faciam_hodie/foreign_types/memory.dart'; +import 'package:quid_faciam_hodie/managers/global_values_manager.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:uuid/uuid.dart'; @@ -15,6 +16,8 @@ class FileManager { static Map fileCache = {}; static Future getMemoryMetadata(final String id) async { + await GlobalValuesManager.waitForServerInitialization(); + final response = await supabase .from('memories') .select() @@ -30,6 +33,8 @@ class FileManager { } static uploadFile(final User user, final File file) async { + await GlobalValuesManager.waitForServerInitialization(); + final basename = uuid.v4(); final extension = file.path.split('.').last; final filename = '$basename.$extension'; @@ -106,6 +111,8 @@ class FileManager { final bool disableDownloadCache = false, final bool disableFileCache = false, }) async { + await GlobalValuesManager.waitForServerInitialization(); + final tempDirectory = await getTemporaryDirectory(); final filename = '${tempDirectory.path}/$path'; final file = File(filename); @@ -125,6 +132,8 @@ class FileManager { } static Future deleteFile(final String path) async { + await GlobalValuesManager.waitForServerInitialization(); + final response = await supabase.from('memories').delete().eq('location', path).execute(); diff --git a/lib/managers/global_values_manager.dart b/lib/managers/global_values_manager.dart index f6e2abc..d9202ff 100644 --- a/lib/managers/global_values_manager.dart +++ b/lib/managers/global_values_manager.dart @@ -1,11 +1,15 @@ import 'package:camera/camera.dart'; +import 'package:flutter/foundation.dart'; +import 'package:quid_faciam_hodie/constants/apis.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; class GlobalValuesManager { - static bool _hasBeenInitialized = false; + static Future? _serverInitializationFuture; + static bool _isServerInitialized = false; static List _cameras = []; static List get cameras => [..._cameras]; - static bool get hasBeenInitialized => _hasBeenInitialized; + static bool get isServerInitialized => _isServerInitialized; static void setCameras(List cameras) { if (_cameras.isNotEmpty) { @@ -15,7 +19,30 @@ class GlobalValuesManager { _cameras = cameras; } - static void setHasBeenInitialized(bool hasBeenInitialized) { - _hasBeenInitialized = hasBeenInitialized; + static void initializeServer() { + if (_isServerInitialized || _serverInitializationFuture != null) { + return; + } + + _serverInitializationFuture = Supabase.initialize( + url: SUPABASE_API_URL, + anonKey: SUPABASE_API_KEY, + debug: kDebugMode, + )..then((_) { + _isServerInitialized = true; + _serverInitializationFuture = null; + }); + } + + static Future waitForServerInitialization() async { + if (_serverInitializationFuture == null) { + if (_isServerInitialized) { + return; + } else { + throw Exception('Server has not been initialized yet'); + } + } + + await _serverInitializationFuture; } } diff --git a/lib/models/memories.dart b/lib/models/memories.dart index 5092d05..8aa363b 100644 --- a/lib/models/memories.dart +++ b/lib/models/memories.dart @@ -1,5 +1,6 @@ import 'package:property_change_notifier/property_change_notifier.dart'; import 'package:quid_faciam_hodie/foreign_types/memory.dart'; +import 'package:quid_faciam_hodie/managers/global_values_manager.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; final supabase = Supabase.instance.client; @@ -10,10 +11,10 @@ class Memories extends PropertyChangeNotifier { Memories(); RealtimeSubscription? _serverSubscription; - bool _isInitializing = true; + bool _isInitialized = false; List get memories => _memories; - bool get isInitializing => _isInitializing; + bool get isInitialized => _isInitialized; @override void dispose() { @@ -42,9 +43,9 @@ class Memories extends PropertyChangeNotifier { notifyListeners('memories'); } - void setIsInitializing(final bool value) { - _isInitializing = value; - notifyListeners('isInitializing'); + void setIsInitialized(final bool value) { + _isInitialized = value; + notifyListeners('isInitialized'); } void sortMemories() { @@ -53,11 +54,11 @@ class Memories extends PropertyChangeNotifier { } Future initialize() async { - setIsInitializing(true); + setIsInitialized(false); await _loadInitialData(); - setIsInitializing(false); + setIsInitialized(true); notifyListeners(); // Watch new updates @@ -100,6 +101,8 @@ class Memories extends PropertyChangeNotifier { } Future _loadInitialData() async { + await GlobalValuesManager.waitForServerInitialization(); + final response = await supabase .from('memories') .select() diff --git a/lib/screens/main_screen.dart b/lib/screens/main_screen.dart index e91ee59..76040dd 100644 --- a/lib/screens/main_screen.dart +++ b/lib/screens/main_screen.dart @@ -62,7 +62,7 @@ class _MainScreenState extends AuthRequiredState with Loadable { void initState() { super.initState(); - callWithLoading(getLastPhoto); + getLastPhoto(); onNewCameraSelected(GlobalValuesManager.cameras[0]); } diff --git a/lib/screens/server_loading_screen.dart b/lib/screens/server_loading_screen.dart index cd576aa..603abe6 100644 --- a/lib/screens/server_loading_screen.dart +++ b/lib/screens/server_loading_screen.dart @@ -1,8 +1,6 @@ -import 'package:camera/camera.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:quid_faciam_hodie/constants/apis.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/managers/global_values_manager.dart'; import 'package:quid_faciam_hodie/models/memories.dart'; @@ -15,7 +13,12 @@ import 'welcome_screen.dart'; class ServerLoadingScreen extends StatefulWidget { static const ID = 'server_loading'; - const ServerLoadingScreen({Key? key}) : super(key: key); + final String? nextScreen; + + const ServerLoadingScreen({ + Key? key, + this.nextScreen, + }) : super(key: key); @override State createState() => _ServerLoadingScreenState(); @@ -30,25 +33,20 @@ class _ServerLoadingScreenState extends State { } Future load() async { - if (!GlobalValuesManager.hasBeenInitialized) { - GlobalValuesManager.setCameras(await availableCameras()); - - await Supabase.initialize( - url: SUPABASE_API_URL, - anonKey: SUPABASE_API_KEY, - debug: kDebugMode, - ); - - GlobalValuesManager.setHasBeenInitialized(true); - } + await GlobalValuesManager.waitForServerInitialization(); final memories = context.read(); final session = Supabase.instance.client.auth.session(); if (session != null) { - memories.initialize().then((_) { - Navigator.pushReplacementNamed(context, MainScreen.ID); - }); + if (!memories.isInitialized) { + await memories.initialize(); + } + + Navigator.pushReplacementNamed( + context, + widget.nextScreen ?? MainScreen.ID, + ); } else { Navigator.pushReplacementNamed(context, WelcomeScreen.ID); } diff --git a/lib/widgets/today_photo_button.dart b/lib/widgets/today_photo_button.dart index efe6e47..440d1b7 100644 --- a/lib/widgets/today_photo_button.dart +++ b/lib/widgets/today_photo_button.dart @@ -3,6 +3,7 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/enums.dart'; +import 'package:quid_faciam_hodie/screens/server_loading_screen.dart'; import 'package:quid_faciam_hodie/screens/timeline_screen.dart'; import 'raw_memory_display.dart'; @@ -27,7 +28,14 @@ class TodayPhotoButton extends StatelessWidget { onTap: () async { onLeave(); - await Navigator.pushNamed(context, TimelineScreen.ID); + await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ServerLoadingScreen( + nextScreen: TimelineScreen.ID, + ), + ), + ); onComeBack(); },