improved loading

This commit is contained in:
Myzel394 2022-08-17 10:33:08 +02:00
parent 46b35f2b54
commit 24927627ab
7 changed files with 80 additions and 30 deletions

View File

@ -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());
}

View File

@ -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<String, Uint8List> fileCache = {};
static Future<Memory> 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<void> deleteFile(final String path) async {
await GlobalValuesManager.waitForServerInitialization();
final response =
await supabase.from('memories').delete().eq('location', path).execute();

View File

@ -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<CameraDescription> _cameras = [];
static List<CameraDescription> get cameras => [..._cameras];
static bool get hasBeenInitialized => _hasBeenInitialized;
static bool get isServerInitialized => _isServerInitialized;
static void setCameras(List<CameraDescription> 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<void> waitForServerInitialization() async {
if (_serverInitializationFuture == null) {
if (_isServerInitialized) {
return;
} else {
throw Exception('Server has not been initialized yet');
}
}
await _serverInitializationFuture;
}
}

View File

@ -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<String> {
Memories();
RealtimeSubscription? _serverSubscription;
bool _isInitializing = true;
bool _isInitialized = false;
List<Memory> get memories => _memories;
bool get isInitializing => _isInitializing;
bool get isInitialized => _isInitialized;
@override
void dispose() {
@ -42,9 +43,9 @@ class Memories extends PropertyChangeNotifier<String> {
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<String> {
}
Future<void> initialize() async {
setIsInitializing(true);
setIsInitialized(false);
await _loadInitialData();
setIsInitializing(false);
setIsInitialized(true);
notifyListeners();
// Watch new updates
@ -100,6 +101,8 @@ class Memories extends PropertyChangeNotifier<String> {
}
Future<void> _loadInitialData() async {
await GlobalValuesManager.waitForServerInitialization();
final response = await supabase
.from('memories')
.select()

View File

@ -62,7 +62,7 @@ class _MainScreenState extends AuthRequiredState<MainScreen> with Loadable {
void initState() {
super.initState();
callWithLoading(getLastPhoto);
getLastPhoto();
onNewCameraSelected(GlobalValuesManager.cameras[0]);
}

View File

@ -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<ServerLoadingScreen> createState() => _ServerLoadingScreenState();
@ -30,25 +33,20 @@ class _ServerLoadingScreenState extends State<ServerLoadingScreen> {
}
Future<void> 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<Memories>();
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);
}

View File

@ -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();
},