mirror of
https://github.com/immich-app/immich
synced 2026-08-15 13:03:57 +00:00
63 lines
2.3 KiB
Dart
63 lines
2.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/general_bottom_sheet.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/map/map.state.dart';
|
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
|
import 'package:immich_mobile/providers/user.provider.dart';
|
|
|
|
class MapBottomSheet extends StatelessWidget {
|
|
final Key? sheetKey;
|
|
|
|
const MapBottomSheet({super.key, this.sheetKey});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return BaseBottomSheet(
|
|
key: sheetKey,
|
|
initialChildSize: 0.25,
|
|
maxChildSize: 0.75,
|
|
shouldCloseOnMinExtent: false,
|
|
resizeOnScroll: false,
|
|
actions: const [],
|
|
backgroundColor: context.themeData.colorScheme.surface,
|
|
slivers: const [
|
|
SliverFillRemaining(hasScrollBody: false, child: SizedBox(height: 0, child: _ScopedMapTimeline())),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class _ScopedMapTimeline extends StatelessWidget {
|
|
const _ScopedMapTimeline();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ProviderScope(
|
|
overrides: [
|
|
timelineServiceProvider.overrideWith((ref) {
|
|
final user = ref.watch(currentUserProvider);
|
|
if (user == null) {
|
|
throw Exception('User must be logged in to access archive');
|
|
}
|
|
|
|
final withPartners = ref.watch(mapStateProvider.select((s) => s.withPartners));
|
|
final users = withPartners ? ref.watch(timelineUsersProvider).valueOrNull ?? [user.id] : [user.id];
|
|
|
|
final timelineService = ref
|
|
.watch(timelineFactoryProvider)
|
|
.geographicMap(
|
|
users,
|
|
() => ref.read(mapStateProvider).toOptions(),
|
|
ref.read(mapStateProvider.notifier).optionsStream,
|
|
);
|
|
ref.onDispose(timelineService.dispose);
|
|
return timelineService;
|
|
}),
|
|
],
|
|
child: const Timeline(appBar: null, bottomSheet: GeneralBottomSheet(minChildSize: 0.23), withScrubber: false),
|
|
);
|
|
}
|
|
}
|