mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* feat(mobile): map page - add map view * map: add map-markers * feat(map): add relative date filter * fix: do not let users scroll past map bounds * fix: fetch relative date from store to state on init * feat(mobile):re-fetch markers only on filter change * feat(mobile) - asset bottom sheet in map page * feat(mobile): display markers based on bottom sheet scroll * fix: exif-bottom-sheet - rebase conflict * feat(mobile): map-view - strongly typed map page events * feat(map): zoom to asset * chore: dart analyzer fixes * map-page move attribution to top-right * feat(mobile): map view - asset selection handling * feat(mobile): map-view display map in places row * fix: make asset marker icon responsive * optimise map page rebuilds * refactor(mobile): map page * feat(mobile): map-view: Go to location * map-view(mobile): minor refactor * fix(mobile): Handle invalid coords gracefully * small styling --------- Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'dart:io';
 | 
						|
 | 
						|
import 'package:auto_route/auto_route.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_hooks/flutter_hooks.dart';
 | 
						|
import 'package:immich_mobile/modules/home/ui/asset_grid/disable_multi_select_button.dart';
 | 
						|
import 'package:immich_mobile/modules/map/ui/map_settings_dialog.dart';
 | 
						|
 | 
						|
class MapAppBar extends HookWidget implements PreferredSizeWidget {
 | 
						|
  final ValueNotifier<bool> selectionEnabled;
 | 
						|
  final int selectedAssetsLength;
 | 
						|
  final bool isDarkTheme;
 | 
						|
 | 
						|
  final void Function() onShare;
 | 
						|
  final void Function() onFavorite;
 | 
						|
  final void Function() onArchive;
 | 
						|
 | 
						|
  const MapAppBar({
 | 
						|
    super.key,
 | 
						|
    required this.selectionEnabled,
 | 
						|
    required this.selectedAssetsLength,
 | 
						|
    required this.onShare,
 | 
						|
    required this.onArchive,
 | 
						|
    required this.onFavorite,
 | 
						|
    this.isDarkTheme = false,
 | 
						|
  });
 | 
						|
 | 
						|
  List<Widget> buildNonSelectionWidgets(BuildContext context) {
 | 
						|
    return [
 | 
						|
      Padding(
 | 
						|
        padding: const EdgeInsets.only(left: 15, top: 15),
 | 
						|
        child: ElevatedButton(
 | 
						|
          onPressed: () => AutoRouter.of(context).pop(),
 | 
						|
          style: ElevatedButton.styleFrom(
 | 
						|
            shape: const CircleBorder(),
 | 
						|
            padding: const EdgeInsets.all(12),
 | 
						|
          ),
 | 
						|
          child: const Icon(Icons.arrow_back_ios_new_rounded, size: 22),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
      Padding(
 | 
						|
        padding: const EdgeInsets.only(right: 15, top: 15),
 | 
						|
        child: ElevatedButton(
 | 
						|
          onPressed: () => showDialog(
 | 
						|
            context: context,
 | 
						|
            builder: (BuildContext _) {
 | 
						|
              return const MapSettingsDialog();
 | 
						|
            },
 | 
						|
          ),
 | 
						|
          style: ElevatedButton.styleFrom(
 | 
						|
            shape: const CircleBorder(),
 | 
						|
            padding: const EdgeInsets.all(12),
 | 
						|
          ),
 | 
						|
          child: const Icon(Icons.more_vert_rounded, size: 22),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    ];
 | 
						|
  }
 | 
						|
 | 
						|
  List<Widget> buildSelectionWidgets() {
 | 
						|
    return [
 | 
						|
      DisableMultiSelectButton(
 | 
						|
        onPressed: () {
 | 
						|
          selectionEnabled.value = false;
 | 
						|
        },
 | 
						|
        selectedItemCount: selectedAssetsLength,
 | 
						|
      ),
 | 
						|
      Row(
 | 
						|
        children: [
 | 
						|
          // Share button
 | 
						|
          Padding(
 | 
						|
            padding: const EdgeInsets.only(top: 15),
 | 
						|
            child: ElevatedButton(
 | 
						|
              onPressed: onShare,
 | 
						|
              style: ElevatedButton.styleFrom(
 | 
						|
                shape: const CircleBorder(),
 | 
						|
                padding: const EdgeInsets.all(12),
 | 
						|
              ),
 | 
						|
              child: Icon(
 | 
						|
                Platform.isAndroid
 | 
						|
                    ? Icons.share_rounded
 | 
						|
                    : Icons.ios_share_rounded,
 | 
						|
                size: 22,
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
          // Favorite button
 | 
						|
          Padding(
 | 
						|
            padding: const EdgeInsets.only(top: 15),
 | 
						|
            child: ElevatedButton(
 | 
						|
              onPressed: onFavorite,
 | 
						|
              style: ElevatedButton.styleFrom(
 | 
						|
                shape: const CircleBorder(),
 | 
						|
                padding: const EdgeInsets.all(12),
 | 
						|
              ),
 | 
						|
              child: const Icon(
 | 
						|
                Icons.favorite,
 | 
						|
                size: 22,
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
          // Archive Button
 | 
						|
          Padding(
 | 
						|
            padding: const EdgeInsets.only(right: 10, top: 15),
 | 
						|
            child: ElevatedButton(
 | 
						|
              onPressed: onArchive,
 | 
						|
              style: ElevatedButton.styleFrom(
 | 
						|
                shape: const CircleBorder(),
 | 
						|
                padding: const EdgeInsets.all(12),
 | 
						|
              ),
 | 
						|
              child: const Icon(
 | 
						|
                Icons.archive,
 | 
						|
                size: 22,
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    ];
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return Padding(
 | 
						|
      padding: const EdgeInsets.only(top: 30),
 | 
						|
      child: Row(
 | 
						|
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
        children: [
 | 
						|
          if (!selectionEnabled.value) ...buildNonSelectionWidgets(context),
 | 
						|
          if (selectionEnabled.value) ...buildSelectionWidgets(),
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Size get preferredSize => const Size.fromHeight(100);
 | 
						|
}
 |