mirror of
https://github.com/immich-app/immich.git
synced 2025-05-30 19:54:52 -04:00
refactor(mobile): refactor user provider (#16358)
This commit is contained in:
parent
c778516ce2
commit
8fbd650483
@ -79,14 +79,14 @@ custom_lint:
|
|||||||
- lib/widgets/asset_grid/asset_grid_data_structure.dart
|
- lib/widgets/asset_grid/asset_grid_data_structure.dart
|
||||||
- test/**.dart
|
- test/**.dart
|
||||||
# refactor the remaining providers
|
# refactor the remaining providers
|
||||||
- lib/providers/{db,user}.provider.dart
|
- lib/providers/db.provider.dart
|
||||||
- lib/providers/backup/backup.provider.dart
|
- lib/providers/backup/backup.provider.dart
|
||||||
|
|
||||||
- import_rule_openapi:
|
- import_rule_openapi:
|
||||||
message: openapi must only be used through ApiRepositories
|
message: openapi must only be used through ApiRepositories
|
||||||
restrict: package:openapi
|
restrict: package:openapi
|
||||||
allowed:
|
allowed:
|
||||||
# requried / wanted
|
# required / wanted
|
||||||
- lib/repositories/*_api.repository.dart
|
- lib/repositories/*_api.repository.dart
|
||||||
# acceptable exceptions for the time being
|
# acceptable exceptions for the time being
|
||||||
- lib/entities/{album,asset,exif_info,user}.entity.dart # to convert DTOs to entities
|
- lib/entities/{album,asset,exif_info,user}.entity.dart # to convert DTOs to entities
|
||||||
|
@ -22,6 +22,10 @@ abstract interface class IUserRepository implements IDatabaseRepository {
|
|||||||
Future<User> me();
|
Future<User> me();
|
||||||
|
|
||||||
Future<void> clearTable();
|
Future<void> clearTable();
|
||||||
|
|
||||||
|
Future<List<int>> getTimelineUserIds(int id);
|
||||||
|
|
||||||
|
Stream<List<int>> watchTimelineUsers(int id);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum UserSort { id }
|
enum UserSort { id }
|
||||||
|
@ -110,7 +110,7 @@ class PhotosPage extends HookConsumerWidget {
|
|||||||
: const SizedBox(),
|
: const SizedBox(),
|
||||||
renderListProvider: timelineUsers.length > 1
|
renderListProvider: timelineUsers.length > 1
|
||||||
? multiUsersTimelineProvider(timelineUsers)
|
? multiUsersTimelineProvider(timelineUsers)
|
||||||
: singleUserTimelineProvider(currentUser!.isarId),
|
: singleUserTimelineProvider(currentUser?.isarId),
|
||||||
buildLoadingIndicator: buildLoadingIndicator,
|
buildLoadingIndicator: buildLoadingIndicator,
|
||||||
onRefresh: refreshAssets,
|
onRefresh: refreshAssets,
|
||||||
stackEnabled: true,
|
stackEnabled: true,
|
||||||
|
@ -8,6 +8,7 @@ import 'package:immich_mobile/entities/user.entity.dart';
|
|||||||
|
|
||||||
class PartnerSharedWithNotifier extends StateNotifier<List<User>> {
|
class PartnerSharedWithNotifier extends StateNotifier<List<User>> {
|
||||||
final PartnerService _partnerService;
|
final PartnerService _partnerService;
|
||||||
|
late final StreamSubscription<List<User>> streamSub;
|
||||||
|
|
||||||
PartnerSharedWithNotifier(this._partnerService) : super([]) {
|
PartnerSharedWithNotifier(this._partnerService) : super([]) {
|
||||||
Function eq = const ListEquality<User>().equals;
|
Function eq = const ListEquality<User>().equals;
|
||||||
@ -16,7 +17,7 @@ class PartnerSharedWithNotifier extends StateNotifier<List<User>> {
|
|||||||
state = partners;
|
state = partners;
|
||||||
}
|
}
|
||||||
}).then((_) {
|
}).then((_) {
|
||||||
_partnerService.watchSharedWith().listen((partners) {
|
streamSub = _partnerService.watchSharedWith().listen((partners) {
|
||||||
if (!eq(state, partners)) {
|
if (!eq(state, partners)) {
|
||||||
state = partners;
|
state = partners;
|
||||||
}
|
}
|
||||||
@ -27,6 +28,14 @@ class PartnerSharedWithNotifier extends StateNotifier<List<User>> {
|
|||||||
Future<bool> updatePartner(User partner, {required bool inTimeline}) {
|
Future<bool> updatePartner(User partner, {required bool inTimeline}) {
|
||||||
return _partnerService.updatePartner(partner, inTimeline: inTimeline);
|
return _partnerService.updatePartner(partner, inTimeline: inTimeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
if (mounted) {
|
||||||
|
streamSub.cancel();
|
||||||
|
}
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final partnerSharedWithProvider =
|
final partnerSharedWithProvider =
|
||||||
@ -38,6 +47,7 @@ final partnerSharedWithProvider =
|
|||||||
|
|
||||||
class PartnerSharedByNotifier extends StateNotifier<List<User>> {
|
class PartnerSharedByNotifier extends StateNotifier<List<User>> {
|
||||||
final PartnerService _partnerService;
|
final PartnerService _partnerService;
|
||||||
|
late final StreamSubscription<List<User>> streamSub;
|
||||||
|
|
||||||
PartnerSharedByNotifier(this._partnerService) : super([]) {
|
PartnerSharedByNotifier(this._partnerService) : super([]) {
|
||||||
Function eq = const ListEquality<User>().equals;
|
Function eq = const ListEquality<User>().equals;
|
||||||
@ -54,11 +64,11 @@ class PartnerSharedByNotifier extends StateNotifier<List<User>> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
late final StreamSubscription<List<User>> streamSub;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
streamSub.cancel();
|
if (mounted) {
|
||||||
|
streamSub.cancel();
|
||||||
|
}
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,12 @@ import 'package:immich_mobile/providers/locale_provider.dart';
|
|||||||
import 'package:immich_mobile/services/timeline.service.dart';
|
import 'package:immich_mobile/services/timeline.service.dart';
|
||||||
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
|
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
|
||||||
|
|
||||||
final singleUserTimelineProvider = StreamProvider.family<RenderList, int>(
|
final singleUserTimelineProvider = StreamProvider.family<RenderList, int?>(
|
||||||
(ref, userId) {
|
(ref, userId) {
|
||||||
|
if (userId == null) {
|
||||||
|
return const Stream.empty();
|
||||||
|
}
|
||||||
|
|
||||||
ref.watch(localeProvider);
|
ref.watch(localeProvider);
|
||||||
final timelineService = ref.watch(timelineServiceProvider);
|
final timelineService = ref.watch(timelineServiceProvider);
|
||||||
return timelineService.watchHomeTimeline(userId);
|
return timelineService.watchHomeTimeline(userId);
|
||||||
|
@ -5,9 +5,8 @@ import 'package:immich_mobile/domain/models/store.model.dart';
|
|||||||
import 'package:immich_mobile/entities/store.entity.dart';
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
import 'package:immich_mobile/entities/user.entity.dart';
|
import 'package:immich_mobile/entities/user.entity.dart';
|
||||||
import 'package:immich_mobile/providers/api.provider.dart';
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
import 'package:immich_mobile/providers/db.provider.dart';
|
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
import 'package:immich_mobile/services/api.service.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:immich_mobile/services/user.service.dart';
|
||||||
|
|
||||||
class CurrentUserProvider extends StateNotifier<User?> {
|
class CurrentUserProvider extends StateNotifier<User?> {
|
||||||
CurrentUserProvider(this._apiService) : super(null) {
|
CurrentUserProvider(this._apiService) : super(null) {
|
||||||
@ -47,18 +46,14 @@ final currentUserProvider =
|
|||||||
});
|
});
|
||||||
|
|
||||||
class TimelineUserIdsProvider extends StateNotifier<List<int>> {
|
class TimelineUserIdsProvider extends StateNotifier<List<int>> {
|
||||||
TimelineUserIdsProvider(Isar db, User? currentUser) : super([]) {
|
TimelineUserIdsProvider(this._userService) : super([]) {
|
||||||
final query = db.users
|
_userService.getTimelineUserIds().then((users) => state = users);
|
||||||
.filter()
|
streamSub =
|
||||||
.inTimelineEqualTo(true)
|
_userService.watchTimelineUserIds().listen((users) => state = users);
|
||||||
.or()
|
|
||||||
.isarIdEqualTo(currentUser?.isarId ?? Isar.autoIncrement)
|
|
||||||
.isarIdProperty();
|
|
||||||
query.findAll().then((users) => state = users);
|
|
||||||
streamSub = query.watch().listen((users) => state = users);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
late final StreamSubscription<List<int>> streamSub;
|
late final StreamSubscription<List<int>> streamSub;
|
||||||
|
final UserService _userService;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
@ -69,8 +64,5 @@ class TimelineUserIdsProvider extends StateNotifier<List<int>> {
|
|||||||
|
|
||||||
final timelineUsersIdsProvider =
|
final timelineUsersIdsProvider =
|
||||||
StateNotifierProvider<TimelineUserIdsProvider, List<int>>((ref) {
|
StateNotifierProvider<TimelineUserIdsProvider, List<int>>((ref) {
|
||||||
return TimelineUserIdsProvider(
|
return TimelineUserIdsProvider(ref.watch(userServiceProvider));
|
||||||
ref.watch(dbProvider),
|
|
||||||
ref.watch(currentUserProvider),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
@ -70,4 +70,26 @@ class UserRepository extends DatabaseRepository implements IUserRepository {
|
|||||||
await db.users.clear();
|
await db.users.clear();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<int>> getTimelineUserIds(int id) {
|
||||||
|
return db.users
|
||||||
|
.filter()
|
||||||
|
.inTimelineEqualTo(true)
|
||||||
|
.or()
|
||||||
|
.isarIdEqualTo(id)
|
||||||
|
.isarIdProperty()
|
||||||
|
.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<List<int>> watchTimelineUsers(int id) {
|
||||||
|
return db.users
|
||||||
|
.filter()
|
||||||
|
.inTimelineEqualTo(true)
|
||||||
|
.or()
|
||||||
|
.isarIdEqualTo(id)
|
||||||
|
.isarIdProperty()
|
||||||
|
.watch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,4 +107,14 @@ class UserService {
|
|||||||
Future<void> clearTable() {
|
Future<void> clearTable() {
|
||||||
return _userRepository.clearTable();
|
return _userRepository.clearTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<int>> getTimelineUserIds() async {
|
||||||
|
final me = await _userRepository.me();
|
||||||
|
return _userRepository.getTimelineUserIds(me.isarId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<List<int>> watchTimelineUserIds() async* {
|
||||||
|
final me = await _userRepository.me();
|
||||||
|
yield* _userRepository.watchTimelineUsers(me.isarId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user