Skip to content

Commit feff189

Browse files
feat: expanded sliver app bar (#19827)
* use mutex * feat: cool app bar * animation * adapt to more pages * animation * better animation * fix: asset count * Revert "fix: asset count" This reverts commit 673a5b2. * fix: asset count * fix: shaky animation on Android * tunning * offset SizedBox to fix scroll jump on multiselect --------- Co-authored-by: shenlong-tanwen <[email protected]>
1 parent 977d645 commit feff189

21 files changed

+733
-75
lines changed

mobile/lib/domain/models/album/album.model.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ enum AlbumUserRole {
1111
}
1212

1313
// Model for an album stored in the server
14-
class Album {
14+
class RemoteAlbum {
1515
final String id;
1616
final String name;
1717
final String ownerId;
@@ -24,7 +24,7 @@ class Album {
2424
final int assetCount;
2525
final String ownerName;
2626

27-
const Album({
27+
const RemoteAlbum({
2828
required this.id,
2929
required this.name,
3030
required this.ownerId,
@@ -57,7 +57,7 @@ class Album {
5757

5858
@override
5959
bool operator ==(Object other) {
60-
if (other is! Album) return false;
60+
if (other is! RemoteAlbum) return false;
6161
if (identical(this, other)) return true;
6262
return id == other.id &&
6363
name == other.name &&

mobile/lib/domain/services/remote_album.service.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,26 @@ class RemoteAlbumService {
88

99
const RemoteAlbumService(this._repository);
1010

11-
Future<List<Album>> getAll() {
11+
Future<List<RemoteAlbum>> getAll() {
1212
return _repository.getAll();
1313
}
1414

15-
List<Album> sortAlbums(
16-
List<Album> albums,
15+
List<RemoteAlbum> sortAlbums(
16+
List<RemoteAlbum> albums,
1717
RemoteAlbumSortMode sortMode, {
1818
bool isReverse = false,
1919
}) {
2020
return sortMode.sortFn(albums, isReverse);
2121
}
2222

23-
List<Album> searchAlbums(
24-
List<Album> albums,
23+
List<RemoteAlbum> searchAlbums(
24+
List<RemoteAlbum> albums,
2525
String query,
2626
String? userId, [
2727
QuickFilterMode filterMode = QuickFilterMode.all,
2828
]) {
2929
final lowerQuery = query.toLowerCase();
30-
List<Album> filtered = albums;
30+
List<RemoteAlbum> filtered = albums;
3131

3232
// Apply text search filter
3333
if (query.isNotEmpty) {

mobile/lib/domain/services/timeline.service.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ class TimelineService {
210210
Future<void> preCacheAssets(int index) =>
211211
_mutex.run(() => _loadAssets(index, math.min(5, _totalAssets - index)));
212212

213+
BaseAsset getRandomAsset() =>
214+
_buffer.elementAt(math.Random().nextInt(_buffer.length));
215+
213216
BaseAsset getAsset(int index) {
214217
if (!hasRange(index, 1)) {
215218
throw RangeError(

mobile/lib/infrastructure/repositories/remote_album.repository.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
99
final Drift _db;
1010
const DriftRemoteAlbumRepository(this._db) : super(_db);
1111

12-
Future<List<Album>> getAll({Set<SortRemoteAlbumsBy> sortBy = const {}}) {
12+
Future<List<RemoteAlbum>> getAll({
13+
Set<SortRemoteAlbumsBy> sortBy = const {},
14+
}) {
1315
final assetCount = _db.remoteAlbumAssetEntity.assetId.count();
1416

1517
final query = _db.remoteAlbumEntity.select().join([
@@ -59,8 +61,8 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
5961
}
6062

6163
extension on RemoteAlbumEntityData {
62-
Album toDto({int assetCount = 0, required String ownerName}) {
63-
return Album(
64+
RemoteAlbum toDto({int assetCount = 0, required String ownerName}) {
65+
return RemoteAlbum(
6466
id: id,
6567
name: name,
6668
ownerId: ownerId,

mobile/lib/presentation/pages/dev/drift_archive.page.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import 'package:auto_route/auto_route.dart';
2-
import 'package:flutter/widgets.dart';
2+
import 'package:flutter/material.dart';
33
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/extensions/translate_extensions.dart';
45
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
56
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
67
import 'package:immich_mobile/providers/user.provider.dart';
8+
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
79

810
@RoutePage()
911
class DriftArchivePage extends StatelessWidget {
@@ -27,7 +29,12 @@ class DriftArchivePage extends StatelessWidget {
2729
},
2830
),
2931
],
30-
child: const Timeline(),
32+
child: Timeline(
33+
appBar: MesmerizingSliverAppBar(
34+
title: 'archive'.t(context: context),
35+
icon: Icons.archive_outlined,
36+
),
37+
),
3138
);
3239
}
3340
}

mobile/lib/presentation/pages/dev/drift_favorite.page.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import 'package:auto_route/auto_route.dart';
2-
import 'package:flutter/widgets.dart';
2+
import 'package:flutter/material.dart';
33
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/extensions/translate_extensions.dart';
45
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
56
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
67
import 'package:immich_mobile/providers/user.provider.dart';
8+
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
79

810
@RoutePage()
911
class DriftFavoritePage extends StatelessWidget {
@@ -27,7 +29,12 @@ class DriftFavoritePage extends StatelessWidget {
2729
},
2830
),
2931
],
30-
child: const Timeline(),
32+
child: Timeline(
33+
appBar: MesmerizingSliverAppBar(
34+
title: 'favorites'.t(context: context),
35+
icon: Icons.favorite_outline,
36+
),
37+
),
3138
);
3239
}
3340
}

mobile/lib/presentation/pages/dev/drift_local_album.page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class _AlbumList extends ConsumerWidget {
103103
),
104104
),
105105
onTap: () =>
106-
context.pushRoute(LocalTimelineRoute(albumId: album.id)),
106+
context.pushRoute(LocalTimelineRoute(album: album)),
107107
),
108108
);
109109
},

mobile/lib/presentation/pages/dev/drift_trash.page.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:auto_route/auto_route.dart';
2-
import 'package:flutter/widgets.dart';
2+
import 'package:flutter/material.dart';
33
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/extensions/translate_extensions.dart';
45
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
56
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
67
import 'package:immich_mobile/providers/user.provider.dart';
@@ -27,7 +28,16 @@ class DriftTrashPage extends StatelessWidget {
2728
},
2829
),
2930
],
30-
child: const Timeline(),
31+
child: Timeline(
32+
appBar: SliverAppBar(
33+
title: Text('trash'.t(context: context)),
34+
floating: true,
35+
snap: true,
36+
pinned: true,
37+
centerTitle: true,
38+
elevation: 0,
39+
),
40+
),
3141
);
3242
}
3343
}
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
11
import 'package:auto_route/auto_route.dart';
22
import 'package:flutter/widgets.dart';
33
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
45
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
56
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
7+
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
68

79
@RoutePage()
810
class LocalTimelinePage extends StatelessWidget {
9-
final String albumId;
11+
final LocalAlbum album;
1012

11-
const LocalTimelinePage({super.key, required this.albumId});
13+
const LocalTimelinePage({super.key, required this.album});
1214

1315
@override
1416
Widget build(BuildContext context) {
1517
return ProviderScope(
1618
overrides: [
1719
timelineServiceProvider.overrideWith(
1820
(ref) {
19-
final timelineService =
20-
ref.watch(timelineFactoryProvider).localAlbum(albumId: albumId);
21+
final timelineService = ref
22+
.watch(timelineFactoryProvider)
23+
.localAlbum(albumId: album.id);
2124
ref.onDispose(timelineService.dispose);
2225
return timelineService;
2326
},
2427
),
2528
],
26-
child: const Timeline(),
29+
child: Timeline(
30+
appBar: MesmerizingSliverAppBar(title: album.name),
31+
),
2732
);
2833
}
2934
}

mobile/lib/presentation/pages/dev/media_stat.page.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class LocalMediaSummaryPage extends StatelessWidget {
125125
name: album.name,
126126
countFuture: countFuture,
127127
onTap: () => context.router.push(
128-
LocalTimelineRoute(albumId: album.id),
128+
LocalTimelineRoute(album: album),
129129
),
130130
);
131131
},
@@ -226,7 +226,7 @@ class RemoteMediaSummaryPage extends StatelessWidget {
226226
name: album.name,
227227
countFuture: countFuture,
228228
onTap: () => context.router.push(
229-
RemoteTimelineRoute(albumId: album.id),
229+
RemoteTimelineRoute(album: album),
230230
),
231231
);
232232
},

0 commit comments

Comments
 (0)