mirror of
https://github.com/immich-app/immich.git
synced 2024-12-22 01:47:08 +02:00
e6c0f0e3aa
* 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,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|