mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-30 18:22:37 -04:00 
			
		
		
		
	* chore: maplibre gl pubspec * refactor(wip): maplibre for maps * refactor(wip): dual pane + location button * chore: remove flutter_map and deps * refactor(wip): map zoom to location * refactor: location picker * open gallery_viewer on marker tap * remove detectScaleGesture param * test: debounce and throttle * chore: rename get location method * feat(mobile): Adds gps locator to map prompt for easy geolocation (#6282) * Refactored get gps coords * Use var for linter's sake, should handle errors better * Cleanup * Fix linter issues * chore(dep): update maplibre to official lib --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Joshua Herrera <joshua.herrera227@gmail.com>
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:immich_mobile/modules/map/providers/map_state.provider.dart';
 | |
| import 'package:immich_mobile/utils/immich_app_theme.dart';
 | |
| 
 | |
| /// Overrides the theme below the widget tree to use the theme data based on the
 | |
| /// map settings instead of the one from the app settings
 | |
| class MapThemeOveride extends StatefulHookConsumerWidget {
 | |
|   final ThemeMode? themeMode;
 | |
|   final Widget Function(AsyncValue<String> style) mapBuilder;
 | |
| 
 | |
|   const MapThemeOveride({required this.mapBuilder, this.themeMode, super.key});
 | |
| 
 | |
|   @override
 | |
|   ConsumerState createState() => _MapThemeOverideState();
 | |
| }
 | |
| 
 | |
| class _MapThemeOverideState extends ConsumerState<MapThemeOveride>
 | |
|     with WidgetsBindingObserver {
 | |
|   late ThemeMode _theme;
 | |
|   bool _isDarkTheme = false;
 | |
| 
 | |
|   bool get _isSystemDark =>
 | |
|       WidgetsBinding.instance.platformDispatcher.platformBrightness ==
 | |
|       Brightness.dark;
 | |
| 
 | |
|   bool checkDarkTheme() {
 | |
|     return _theme == ThemeMode.dark ||
 | |
|         _theme == ThemeMode.system && _isSystemDark;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     super.initState();
 | |
|     _theme = widget.themeMode ??
 | |
|         ref.read(mapStateNotifierProvider.select((v) => v.themeMode));
 | |
|     setState(() {
 | |
|       _isDarkTheme = checkDarkTheme();
 | |
|     });
 | |
|     if (_theme == ThemeMode.system) {
 | |
|       WidgetsBinding.instance.addObserver(this);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void didChangeDependencies() {
 | |
|     super.didChangeDependencies();
 | |
|     if (_theme != ThemeMode.system) {
 | |
|       WidgetsBinding.instance.removeObserver(this);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     WidgetsBinding.instance.removeObserver(this);
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void didChangePlatformBrightness() {
 | |
|     super.didChangePlatformBrightness();
 | |
| 
 | |
|     if (_theme == ThemeMode.system) {
 | |
|       setState(() => _isDarkTheme = _isSystemDark);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     _theme = widget.themeMode ??
 | |
|         ref.watch(mapStateNotifierProvider.select((v) => v.themeMode));
 | |
| 
 | |
|     useValueChanged<ThemeMode, void>(_theme, (_, __) {
 | |
|       if (_theme == ThemeMode.system) {
 | |
|         WidgetsBinding.instance.addObserver(this);
 | |
|       } else {
 | |
|         WidgetsBinding.instance.removeObserver(this);
 | |
|       }
 | |
|       setState(() {
 | |
|         _isDarkTheme = checkDarkTheme();
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     return Theme(
 | |
|       data: _isDarkTheme ? immichDarkTheme : immichLightTheme,
 | |
|       child: widget.mapBuilder.call(
 | |
|         ref.watch(
 | |
|           mapStateNotifierProvider.select(
 | |
|             (v) => _isDarkTheme ? v.darkStyleFetched : v.lightStyleFetched,
 | |
|           ),
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |