mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	Implemented load new image when navigating back from backup page (#9)
This commit is contained in:
		@@ -1,15 +1,19 @@
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/models/get_all_asset_respose.model.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/services/asset.service.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/models/immich_asset.model.dart';
 | 
			
		||||
import 'package:intl/intl.dart';
 | 
			
		||||
import 'package:collection/collection.dart';
 | 
			
		||||
 | 
			
		||||
class AssetNotifier extends StateNotifier<List<ImmichAssetGroupByDate>> {
 | 
			
		||||
  final imagePerPage = 100;
 | 
			
		||||
  final AssetService _assetService = AssetService();
 | 
			
		||||
 | 
			
		||||
  AssetNotifier() : super([]);
 | 
			
		||||
 | 
			
		||||
  late String? nextPageKey = "";
 | 
			
		||||
  bool isFetching = false;
 | 
			
		||||
 | 
			
		||||
  // Get All assets
 | 
			
		||||
  getImmichAssets() async {
 | 
			
		||||
    GetAllAssetResponse? res = await _assetService.getAllAsset();
 | 
			
		||||
    nextPageKey = res?.nextPageKey;
 | 
			
		||||
@@ -21,10 +25,11 @@ class AssetNotifier extends StateNotifier<List<ImmichAssetGroupByDate>> {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getMoreAsset() async {
 | 
			
		||||
  // Get Asset From The Past
 | 
			
		||||
  getOlderAsset() async {
 | 
			
		||||
    if (nextPageKey != null && !isFetching) {
 | 
			
		||||
      isFetching = true;
 | 
			
		||||
      GetAllAssetResponse? res = await _assetService.getMoreAsset(nextPageKey);
 | 
			
		||||
      GetAllAssetResponse? res = await _assetService.getOlderAsset(nextPageKey);
 | 
			
		||||
 | 
			
		||||
      if (res != null) {
 | 
			
		||||
        nextPageKey = res.nextPageKey;
 | 
			
		||||
@@ -48,6 +53,40 @@ class AssetNotifier extends StateNotifier<List<ImmichAssetGroupByDate>> {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Get newer asset from the current time
 | 
			
		||||
  getNewAsset() async {
 | 
			
		||||
    if (state.isNotEmpty) {
 | 
			
		||||
      var latestGroup = state.first;
 | 
			
		||||
 | 
			
		||||
      // Sort the last asset group and put the lastest asset in front.
 | 
			
		||||
      latestGroup.assets.sortByCompare<DateTime>((e) => DateTime.parse(e.createdAt), (a, b) => b.compareTo(a));
 | 
			
		||||
      var latestAsset = latestGroup.assets.first;
 | 
			
		||||
      var formatDateTemplate = 'y-MM-dd';
 | 
			
		||||
      var latestAssetDateText = DateFormat(formatDateTemplate).format(DateTime.parse(latestAsset.createdAt));
 | 
			
		||||
 | 
			
		||||
      List<ImmichAsset> newAssets = await _assetService.getNewAsset(latestAsset.createdAt);
 | 
			
		||||
 | 
			
		||||
      if (newAssets.isEmpty) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Grouping by data
 | 
			
		||||
      var groupByDateList = groupBy<ImmichAsset, String>(
 | 
			
		||||
          newAssets, (asset) => DateFormat(formatDateTemplate).format(DateTime.parse(asset.createdAt)));
 | 
			
		||||
 | 
			
		||||
      groupByDateList.forEach((groupDateInFormattedText, assets) {
 | 
			
		||||
        if (groupDateInFormattedText != latestAssetDateText) {
 | 
			
		||||
          ImmichAssetGroupByDate newGroup = ImmichAssetGroupByDate(assets: assets, date: groupDateInFormattedText);
 | 
			
		||||
          state = [newGroup, ...state];
 | 
			
		||||
        } else {
 | 
			
		||||
          latestGroup.assets.insertAll(0, assets);
 | 
			
		||||
 | 
			
		||||
          state = [latestGroup, ...state.sublist(1)];
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  clearAllAsset() {
 | 
			
		||||
    state = [];
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ import 'dart:convert';
 | 
			
		||||
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/models/get_all_asset_respose.model.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/models/immich_asset.model.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/services/network.service.dart';
 | 
			
		||||
 | 
			
		||||
class AssetService {
 | 
			
		||||
@@ -17,9 +18,10 @@ class AssetService {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      debugPrint("Error getAllAsset  ${e.toString()}");
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future<GetAllAssetResponse?> getMoreAsset(String? nextPageKey) async {
 | 
			
		||||
  Future<GetAllAssetResponse?> getOlderAsset(String? nextPageKey) async {
 | 
			
		||||
    try {
 | 
			
		||||
      var res = await _networkService.getRequest(
 | 
			
		||||
        url: "asset/all?nextPageKey=$nextPageKey",
 | 
			
		||||
@@ -34,5 +36,26 @@ class AssetService {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      debugPrint("Error getAllAsset  ${e.toString()}");
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future<List<ImmichAsset>> getNewAsset(String latestDate) async {
 | 
			
		||||
    try {
 | 
			
		||||
      var res = await _networkService.getRequest(
 | 
			
		||||
        url: "asset/new?latestDate=$latestDate",
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      List<dynamic> decodedData = jsonDecode(res.toString());
 | 
			
		||||
 | 
			
		||||
      List<ImmichAsset> result = List.from(decodedData.map((a) => ImmichAsset.fromMap(a)));
 | 
			
		||||
      if (result.isNotEmpty) {
 | 
			
		||||
        return result;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return [];
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      debugPrint("Error getAllAsset  ${e.toString()}");
 | 
			
		||||
      return [];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ import 'package:auto_route/auto_route.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:google_fonts/google_fonts.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
 | 
			
		||||
 | 
			
		||||
import 'package:immich_mobile/routing/router.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/models/backup_state.model.dart';
 | 
			
		||||
@@ -12,9 +11,11 @@ class ImmichSliverAppBar extends ConsumerWidget {
 | 
			
		||||
  const ImmichSliverAppBar({
 | 
			
		||||
    Key? key,
 | 
			
		||||
    required this.imageGridGroup,
 | 
			
		||||
    this.onPopBack,
 | 
			
		||||
  }) : super(key: key);
 | 
			
		||||
 | 
			
		||||
  final List<Widget> imageGridGroup;
 | 
			
		||||
  final Function? onPopBack;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context, WidgetRef ref) {
 | 
			
		||||
@@ -75,15 +76,7 @@ class ImmichSliverAppBar extends ConsumerWidget {
 | 
			
		||||
                  var onPop = await AutoRouter.of(context).push(const BackupControllerRoute());
 | 
			
		||||
 | 
			
		||||
                  if (onPop == true) {
 | 
			
		||||
                    // Remove and force getting new widget again if there is not many widget on screen.
 | 
			
		||||
                    // Otherwise do nothing.
 | 
			
		||||
                    if (imageGridGroup.isNotEmpty && imageGridGroup.length < 20) {
 | 
			
		||||
                      print("Get more access");
 | 
			
		||||
                      ref.read(assetProvider.notifier).getMoreAsset();
 | 
			
		||||
                    } else if (imageGridGroup.isEmpty) {
 | 
			
		||||
                      print("get immich asset");
 | 
			
		||||
                      ref.read(assetProvider.notifier).getImmichAssets();
 | 
			
		||||
                    }
 | 
			
		||||
                    onPopBack!();
 | 
			
		||||
                  }
 | 
			
		||||
                },
 | 
			
		||||
              ),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,9 @@
 | 
			
		||||
import 'package:auto_route/annotations.dart';
 | 
			
		||||
import 'package:auto_route/auto_route.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter/src/widgets/framework.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/models/authentication_state.model.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/routing/router.dart';
 | 
			
		||||
 | 
			
		||||
class ProfileDrawer extends ConsumerWidget {
 | 
			
		||||
  const ProfileDrawer({Key? key}) : super(key: key);
 | 
			
		||||
@@ -58,6 +55,7 @@ class ProfileDrawer extends ConsumerWidget {
 | 
			
		||||
            ),
 | 
			
		||||
            onTap: () async {
 | 
			
		||||
              bool res = await ref.read(authenticationProvider.notifier).logout();
 | 
			
		||||
 | 
			
		||||
              ref.read(assetProvider.notifier).clearAllAsset();
 | 
			
		||||
 | 
			
		||||
              if (res) {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ class HomePage extends HookConsumerWidget {
 | 
			
		||||
      var endOfPage = _scrollController.position.maxScrollExtent;
 | 
			
		||||
 | 
			
		||||
      if (_scrollController.offset >= endOfPage - (endOfPage * 0.1) && !_scrollController.position.outOfRange) {
 | 
			
		||||
        ref.read(assetProvider.notifier).getMoreAsset();
 | 
			
		||||
        ref.read(assetProvider.notifier).getOlderAsset();
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (_scrollController.offset >= 400) {
 | 
			
		||||
@@ -44,6 +44,18 @@ class HomePage extends HookConsumerWidget {
 | 
			
		||||
      };
 | 
			
		||||
    }, []);
 | 
			
		||||
 | 
			
		||||
    onPopBackFromBackupPage() {
 | 
			
		||||
      ref.read(assetProvider.notifier).getNewAsset();
 | 
			
		||||
      // Remove and force getting new widget again if there is not many widget on screen.
 | 
			
		||||
      // Otherwise do nothing.
 | 
			
		||||
 | 
			
		||||
      if (imageGridGroup.isNotEmpty && imageGridGroup.length < 20) {
 | 
			
		||||
        ref.read(assetProvider.notifier).getOlderAsset();
 | 
			
		||||
      } else if (imageGridGroup.isEmpty) {
 | 
			
		||||
        ref.read(assetProvider.notifier).getImmichAssets();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Widget _buildBody() {
 | 
			
		||||
      if (assetGroup.isNotEmpty) {
 | 
			
		||||
        String lastGroupDate = assetGroup[0].date;
 | 
			
		||||
@@ -56,10 +68,13 @@ class HomePage extends HookConsumerWidget {
 | 
			
		||||
          int? previousMonth = DateTime.tryParse(lastGroupDate)?.month;
 | 
			
		||||
 | 
			
		||||
          // Add Monthly Title Group if started at the beginning of the month
 | 
			
		||||
          if ((currentMonth! - previousMonth!) != 0) {
 | 
			
		||||
            imageGridGroup.add(
 | 
			
		||||
              MonthlyTitleText(isoDate: dateTitle),
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
          if (currentMonth != null && previousMonth != null) {
 | 
			
		||||
            if ((currentMonth - previousMonth) != 0) {
 | 
			
		||||
              imageGridGroup.add(
 | 
			
		||||
                MonthlyTitleText(isoDate: dateTitle),
 | 
			
		||||
              );
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          // Add Daily Title Group
 | 
			
		||||
@@ -84,7 +99,10 @@ class HomePage extends HookConsumerWidget {
 | 
			
		||||
          child: CustomScrollView(
 | 
			
		||||
            controller: _scrollController,
 | 
			
		||||
            slivers: [
 | 
			
		||||
              ImmichSliverAppBar(imageGridGroup: imageGridGroup),
 | 
			
		||||
              ImmichSliverAppBar(
 | 
			
		||||
                imageGridGroup: imageGridGroup,
 | 
			
		||||
                onPopBack: onPopBackFromBackupPage,
 | 
			
		||||
              ),
 | 
			
		||||
              ...imageGridGroup,
 | 
			
		||||
            ],
 | 
			
		||||
          ),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user