mirror of
https://github.com/Myzel394/quid_faciam_hodie.git
synced 2025-06-19 15:45:26 +02:00
improved loading
This commit is contained in:
parent
46b35f2b54
commit
24927627ab
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:camera/camera.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.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/timeline_screen.dart';
|
||||||
import 'package:quid_faciam_hodie/screens/welcome_screen.dart';
|
import 'package:quid_faciam_hodie/screens/welcome_screen.dart';
|
||||||
|
|
||||||
|
import 'managers/global_values_manager.dart';
|
||||||
import 'models/memories.dart';
|
import 'models/memories.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
@ -21,6 +23,9 @@ void main() async {
|
|||||||
DeviceOrientation.portraitDown,
|
DeviceOrientation.portraitDown,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
GlobalValuesManager.setCameras(await availableCameras());
|
||||||
|
GlobalValuesManager.initializeServer();
|
||||||
|
|
||||||
runApp(const MyApp());
|
runApp(const MyApp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import 'dart:typed_data';
|
|||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:quid_faciam_hodie/enums.dart';
|
import 'package:quid_faciam_hodie/enums.dart';
|
||||||
import 'package:quid_faciam_hodie/foreign_types/memory.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:supabase_flutter/supabase_flutter.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
@ -15,6 +16,8 @@ class FileManager {
|
|||||||
static Map<String, Uint8List> fileCache = {};
|
static Map<String, Uint8List> fileCache = {};
|
||||||
|
|
||||||
static Future<Memory> getMemoryMetadata(final String id) async {
|
static Future<Memory> getMemoryMetadata(final String id) async {
|
||||||
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
|
|
||||||
final response = await supabase
|
final response = await supabase
|
||||||
.from('memories')
|
.from('memories')
|
||||||
.select()
|
.select()
|
||||||
@ -30,6 +33,8 @@ class FileManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static uploadFile(final User user, final File file) async {
|
static uploadFile(final User user, final File file) async {
|
||||||
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
|
|
||||||
final basename = uuid.v4();
|
final basename = uuid.v4();
|
||||||
final extension = file.path.split('.').last;
|
final extension = file.path.split('.').last;
|
||||||
final filename = '$basename.$extension';
|
final filename = '$basename.$extension';
|
||||||
@ -106,6 +111,8 @@ class FileManager {
|
|||||||
final bool disableDownloadCache = false,
|
final bool disableDownloadCache = false,
|
||||||
final bool disableFileCache = false,
|
final bool disableFileCache = false,
|
||||||
}) async {
|
}) async {
|
||||||
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
|
|
||||||
final tempDirectory = await getTemporaryDirectory();
|
final tempDirectory = await getTemporaryDirectory();
|
||||||
final filename = '${tempDirectory.path}/$path';
|
final filename = '${tempDirectory.path}/$path';
|
||||||
final file = File(filename);
|
final file = File(filename);
|
||||||
@ -125,6 +132,8 @@ class FileManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> deleteFile(final String path) async {
|
static Future<void> deleteFile(final String path) async {
|
||||||
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
|
|
||||||
final response =
|
final response =
|
||||||
await supabase.from('memories').delete().eq('location', path).execute();
|
await supabase.from('memories').delete().eq('location', path).execute();
|
||||||
|
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
import 'package:camera/camera.dart';
|
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 {
|
class GlobalValuesManager {
|
||||||
static bool _hasBeenInitialized = false;
|
static Future? _serverInitializationFuture;
|
||||||
|
static bool _isServerInitialized = false;
|
||||||
static List<CameraDescription> _cameras = [];
|
static List<CameraDescription> _cameras = [];
|
||||||
|
|
||||||
static List<CameraDescription> get cameras => [..._cameras];
|
static List<CameraDescription> get cameras => [..._cameras];
|
||||||
static bool get hasBeenInitialized => _hasBeenInitialized;
|
static bool get isServerInitialized => _isServerInitialized;
|
||||||
|
|
||||||
static void setCameras(List<CameraDescription> cameras) {
|
static void setCameras(List<CameraDescription> cameras) {
|
||||||
if (_cameras.isNotEmpty) {
|
if (_cameras.isNotEmpty) {
|
||||||
@ -15,7 +19,30 @@ class GlobalValuesManager {
|
|||||||
_cameras = cameras;
|
_cameras = cameras;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setHasBeenInitialized(bool hasBeenInitialized) {
|
static void initializeServer() {
|
||||||
_hasBeenInitialized = hasBeenInitialized;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'package:property_change_notifier/property_change_notifier.dart';
|
import 'package:property_change_notifier/property_change_notifier.dart';
|
||||||
import 'package:quid_faciam_hodie/foreign_types/memory.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:supabase_flutter/supabase_flutter.dart';
|
||||||
|
|
||||||
final supabase = Supabase.instance.client;
|
final supabase = Supabase.instance.client;
|
||||||
@ -10,10 +11,10 @@ class Memories extends PropertyChangeNotifier<String> {
|
|||||||
Memories();
|
Memories();
|
||||||
|
|
||||||
RealtimeSubscription? _serverSubscription;
|
RealtimeSubscription? _serverSubscription;
|
||||||
bool _isInitializing = true;
|
bool _isInitialized = false;
|
||||||
|
|
||||||
List<Memory> get memories => _memories;
|
List<Memory> get memories => _memories;
|
||||||
bool get isInitializing => _isInitializing;
|
bool get isInitialized => _isInitialized;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
@ -42,9 +43,9 @@ class Memories extends PropertyChangeNotifier<String> {
|
|||||||
notifyListeners('memories');
|
notifyListeners('memories');
|
||||||
}
|
}
|
||||||
|
|
||||||
void setIsInitializing(final bool value) {
|
void setIsInitialized(final bool value) {
|
||||||
_isInitializing = value;
|
_isInitialized = value;
|
||||||
notifyListeners('isInitializing');
|
notifyListeners('isInitialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
void sortMemories() {
|
void sortMemories() {
|
||||||
@ -53,11 +54,11 @@ class Memories extends PropertyChangeNotifier<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> initialize() async {
|
Future<void> initialize() async {
|
||||||
setIsInitializing(true);
|
setIsInitialized(false);
|
||||||
|
|
||||||
await _loadInitialData();
|
await _loadInitialData();
|
||||||
|
|
||||||
setIsInitializing(false);
|
setIsInitialized(true);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
// Watch new updates
|
// Watch new updates
|
||||||
@ -100,6 +101,8 @@ class Memories extends PropertyChangeNotifier<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _loadInitialData() async {
|
Future<void> _loadInitialData() async {
|
||||||
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
|
|
||||||
final response = await supabase
|
final response = await supabase
|
||||||
.from('memories')
|
.from('memories')
|
||||||
.select()
|
.select()
|
||||||
|
@ -62,7 +62,7 @@ class _MainScreenState extends AuthRequiredState<MainScreen> with Loadable {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
callWithLoading(getLastPhoto);
|
getLastPhoto();
|
||||||
onNewCameraSelected(GlobalValuesManager.cameras[0]);
|
onNewCameraSelected(GlobalValuesManager.cameras[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import 'package:camera/camera.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.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/constants/spacing.dart';
|
||||||
import 'package:quid_faciam_hodie/managers/global_values_manager.dart';
|
import 'package:quid_faciam_hodie/managers/global_values_manager.dart';
|
||||||
import 'package:quid_faciam_hodie/models/memories.dart';
|
import 'package:quid_faciam_hodie/models/memories.dart';
|
||||||
@ -15,7 +13,12 @@ import 'welcome_screen.dart';
|
|||||||
class ServerLoadingScreen extends StatefulWidget {
|
class ServerLoadingScreen extends StatefulWidget {
|
||||||
static const ID = 'server_loading';
|
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
|
@override
|
||||||
State<ServerLoadingScreen> createState() => _ServerLoadingScreenState();
|
State<ServerLoadingScreen> createState() => _ServerLoadingScreenState();
|
||||||
@ -30,25 +33,20 @@ class _ServerLoadingScreenState extends State<ServerLoadingScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> load() async {
|
Future<void> load() async {
|
||||||
if (!GlobalValuesManager.hasBeenInitialized) {
|
await GlobalValuesManager.waitForServerInitialization();
|
||||||
GlobalValuesManager.setCameras(await availableCameras());
|
|
||||||
|
|
||||||
await Supabase.initialize(
|
|
||||||
url: SUPABASE_API_URL,
|
|
||||||
anonKey: SUPABASE_API_KEY,
|
|
||||||
debug: kDebugMode,
|
|
||||||
);
|
|
||||||
|
|
||||||
GlobalValuesManager.setHasBeenInitialized(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
final memories = context.read<Memories>();
|
final memories = context.read<Memories>();
|
||||||
final session = Supabase.instance.client.auth.session();
|
final session = Supabase.instance.client.auth.session();
|
||||||
|
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
memories.initialize().then((_) {
|
if (!memories.isInitialized) {
|
||||||
Navigator.pushReplacementNamed(context, MainScreen.ID);
|
await memories.initialize();
|
||||||
});
|
}
|
||||||
|
|
||||||
|
Navigator.pushReplacementNamed(
|
||||||
|
context,
|
||||||
|
widget.nextScreen ?? MainScreen.ID,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
Navigator.pushReplacementNamed(context, WelcomeScreen.ID);
|
Navigator.pushReplacementNamed(context, WelcomeScreen.ID);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ import 'dart:typed_data';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:quid_faciam_hodie/constants/spacing.dart';
|
import 'package:quid_faciam_hodie/constants/spacing.dart';
|
||||||
import 'package:quid_faciam_hodie/enums.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 'package:quid_faciam_hodie/screens/timeline_screen.dart';
|
||||||
|
|
||||||
import 'raw_memory_display.dart';
|
import 'raw_memory_display.dart';
|
||||||
@ -27,7 +28,14 @@ class TodayPhotoButton extends StatelessWidget {
|
|||||||
onTap: () async {
|
onTap: () async {
|
||||||
onLeave();
|
onLeave();
|
||||||
|
|
||||||
await Navigator.pushNamed(context, TimelineScreen.ID);
|
await Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => ServerLoadingScreen(
|
||||||
|
nextScreen: TimelineScreen.ID,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
onComeBack();
|
onComeBack();
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user