mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 18:47:09 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:immich_mobile/extensions/build_context_extensions.dart';
 | |
| import 'package:immich_mobile/widgets/common/delayed_loading_indicator.dart';
 | |
| 
 | |
| final _loadingEntry = OverlayEntry(
 | |
|   builder: (context) => SizedBox.square(
 | |
|     dimension: double.infinity,
 | |
|     child: DecoratedBox(
 | |
|       decoration:
 | |
|           BoxDecoration(color: context.colorScheme.surface.withAlpha(200)),
 | |
|       child: const Center(
 | |
|         child: DelayedLoadingIndicator(
 | |
|           delay: Duration(seconds: 1),
 | |
|           fadeInDuration: Duration(milliseconds: 400),
 | |
|         ),
 | |
|       ),
 | |
|     ),
 | |
|   ),
 | |
| );
 | |
| 
 | |
| ValueNotifier<bool> useProcessingOverlay() {
 | |
|   return use(const _LoadingOverlay());
 | |
| }
 | |
| 
 | |
| class _LoadingOverlay extends Hook<ValueNotifier<bool>> {
 | |
|   const _LoadingOverlay();
 | |
| 
 | |
|   @override
 | |
|   _LoadingOverlayState createState() => _LoadingOverlayState();
 | |
| }
 | |
| 
 | |
| class _LoadingOverlayState
 | |
|     extends HookState<ValueNotifier<bool>, _LoadingOverlay> {
 | |
|   late final _isLoading = ValueNotifier(false)..addListener(_listener);
 | |
|   OverlayEntry? _loadingOverlay;
 | |
| 
 | |
|   void _listener() {
 | |
|     setState(() {
 | |
|       WidgetsBinding.instance.addPostFrameCallback((_) {
 | |
|         if (_isLoading.value) {
 | |
|           _loadingOverlay?.remove();
 | |
|           _loadingOverlay = _loadingEntry;
 | |
|           Overlay.of(context).insert(_loadingEntry);
 | |
|         } else {
 | |
|           _loadingOverlay?.remove();
 | |
|           _loadingOverlay = null;
 | |
|         }
 | |
|       });
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   ValueNotifier<bool> build(BuildContext context) {
 | |
|     return _isLoading;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     _isLoading.dispose();
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Object? get debugValue => _isLoading.value;
 | |
| 
 | |
|   @override
 | |
|   String get debugLabel => 'useProcessingOverlay<>';
 | |
| }
 |