You've already forked immich
							
							
				mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 00:18:28 +02:00 
			
		
		
		
	feat(mobile): shared album activity disable handling (#4890)
* feat(mobile): shared album activity disable handling * not show comment/like option on non-shared album, alternative text when activity is disabled --------- Co-authored-by: shalong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
		| @@ -376,5 +376,8 @@ | ||||
|   "app_bar_signout_dialog_ok": "Yes", | ||||
|   "shared_album_activities_input_hint": "Say something", | ||||
|   "shared_album_activity_remove_title": "Delete Activity", | ||||
|   "shared_album_activity_remove_content": "Do you want to delete this activity?" | ||||
|   "shared_album_activity_remove_content": "Do you want to delete this activity?", | ||||
|   "shared_album_activity_setting_title": "Comments & likes", | ||||
|   "shared_album_activity_setting_subtitle": "Let others respond", | ||||
|   "shared_album_activities_input_disable": "Comment is disabled" | ||||
| } | ||||
|   | ||||
| @@ -169,4 +169,4 @@ SPEC CHECKSUMS: | ||||
|  | ||||
| PODFILE CHECKSUM: 599d8aeb73728400c15364e734525722250a5382 | ||||
|  | ||||
| COCOAPODS: 1.12.1 | ||||
| COCOAPODS: 1.11.3 | ||||
|   | ||||
| @@ -19,12 +19,14 @@ class ActivitiesPage extends HookConsumerWidget { | ||||
|   final bool withAssetThumbs; | ||||
|   final String appBarTitle; | ||||
|   final bool isOwner; | ||||
|   final bool isReadOnly; | ||||
|   const ActivitiesPage( | ||||
|     this.albumId, { | ||||
|     this.appBarTitle = "", | ||||
|     this.assetId, | ||||
|     this.withAssetThumbs = true, | ||||
|     this.isOwner = false, | ||||
|     this.isReadOnly = false, | ||||
|     super.key, | ||||
|   }); | ||||
|  | ||||
| @@ -45,6 +47,7 @@ class ActivitiesPage extends HookConsumerWidget { | ||||
|       }, | ||||
|       [], | ||||
|     ); | ||||
|  | ||||
|     buildTitleWithTimestamp(Activity activity, {bool leftAlign = true}) { | ||||
|       final textColor = Theme.of(context).brightness == Brightness.dark | ||||
|           ? Colors.white | ||||
| @@ -116,6 +119,7 @@ class ActivitiesPage extends HookConsumerWidget { | ||||
|         padding: const EdgeInsets.only(bottom: 10), | ||||
|         child: TextField( | ||||
|           controller: inputController, | ||||
|           enabled: !isReadOnly, | ||||
|           focusNode: inputFocusNode, | ||||
|           textInputAction: TextInputAction.send, | ||||
|           autofocus: false, | ||||
| @@ -150,7 +154,9 @@ class ActivitiesPage extends HookConsumerWidget { | ||||
|               ), | ||||
|             ), | ||||
|             suffixIconColor: liked ? Colors.red[700] : null, | ||||
|             hintText: 'shared_album_activities_input_hint'.tr(), | ||||
|             hintText: isReadOnly | ||||
|                 ? 'shared_album_activities_input_disable'.tr() | ||||
|                 : 'shared_album_activities_input_hint'.tr(), | ||||
|             hintStyle: TextStyle( | ||||
|               fontWeight: FontWeight.normal, | ||||
|               fontSize: 14, | ||||
| @@ -240,70 +246,72 @@ class ActivitiesPage extends HookConsumerWidget { | ||||
|                 a.assetId == assetId, | ||||
|           ); | ||||
|  | ||||
|           return Stack( | ||||
|             children: [ | ||||
|               ListView.builder( | ||||
|                 controller: listViewScrollController, | ||||
|                 itemCount: data.length + 1, | ||||
|                 itemBuilder: (context, index) { | ||||
|                   // Vertical gap after the last element | ||||
|                   if (index == data.length) { | ||||
|                     return const SizedBox( | ||||
|                       height: 80, | ||||
|                     ); | ||||
|                   } | ||||
|           return SafeArea( | ||||
|             child: Stack( | ||||
|               children: [ | ||||
|                 ListView.builder( | ||||
|                   controller: listViewScrollController, | ||||
|                   itemCount: data.length + 1, | ||||
|                   itemBuilder: (context, index) { | ||||
|                     // Vertical gap after the last element | ||||
|                     if (index == data.length) { | ||||
|                       return const SizedBox( | ||||
|                         height: 80, | ||||
|                       ); | ||||
|                     } | ||||
|  | ||||
|                   final activity = data[index]; | ||||
|                   final canDelete = | ||||
|                       activity.user.id == currentUser?.id || isOwner; | ||||
|                     final activity = data[index]; | ||||
|                     final canDelete = | ||||
|                         activity.user.id == currentUser?.id || isOwner; | ||||
|  | ||||
|                   return Padding( | ||||
|                     padding: const EdgeInsets.all(5), | ||||
|                     child: activity.type == ActivityType.comment | ||||
|                         ? getDismissibleWidget( | ||||
|                             ListTile( | ||||
|                               minVerticalPadding: 15, | ||||
|                               leading: UserCircleAvatar(user: activity.user), | ||||
|                               title: buildTitleWithTimestamp( | ||||
|                                 activity, | ||||
|                                 leftAlign: | ||||
|                                     withAssetThumbs && activity.assetId != null, | ||||
|                               ), | ||||
|                               titleAlignment: ListTileTitleAlignment.top, | ||||
|                               trailing: buildAssetThumbnail(activity), | ||||
|                               subtitle: Text(activity.comment!), | ||||
|                             ), | ||||
|                             activity, | ||||
|                             canDelete, | ||||
|                           ) | ||||
|                         : getDismissibleWidget( | ||||
|                             ListTile( | ||||
|                               minVerticalPadding: 15, | ||||
|                               leading: Container( | ||||
|                                 width: 44, | ||||
|                                 alignment: Alignment.center, | ||||
|                                 child: Icon( | ||||
|                                   Icons.favorite_rounded, | ||||
|                                   color: Colors.red[700], | ||||
|                     return Padding( | ||||
|                       padding: const EdgeInsets.all(5), | ||||
|                       child: activity.type == ActivityType.comment | ||||
|                           ? getDismissibleWidget( | ||||
|                               ListTile( | ||||
|                                 minVerticalPadding: 15, | ||||
|                                 leading: UserCircleAvatar(user: activity.user), | ||||
|                                 title: buildTitleWithTimestamp( | ||||
|                                   activity, | ||||
|                                   leftAlign: withAssetThumbs && | ||||
|                                       activity.assetId != null, | ||||
|                                 ), | ||||
|                                 titleAlignment: ListTileTitleAlignment.top, | ||||
|                                 trailing: buildAssetThumbnail(activity), | ||||
|                                 subtitle: Text(activity.comment!), | ||||
|                               ), | ||||
|                               title: buildTitleWithTimestamp(activity), | ||||
|                               trailing: buildAssetThumbnail(activity), | ||||
|                               activity, | ||||
|                               canDelete, | ||||
|                             ) | ||||
|                           : getDismissibleWidget( | ||||
|                               ListTile( | ||||
|                                 minVerticalPadding: 15, | ||||
|                                 leading: Container( | ||||
|                                   width: 44, | ||||
|                                   alignment: Alignment.center, | ||||
|                                   child: Icon( | ||||
|                                     Icons.favorite_rounded, | ||||
|                                     color: Colors.red[700], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                                 title: buildTitleWithTimestamp(activity), | ||||
|                                 trailing: buildAssetThumbnail(activity), | ||||
|                               ), | ||||
|                               activity, | ||||
|                               canDelete, | ||||
|                             ), | ||||
|                             activity, | ||||
|                             canDelete, | ||||
|                           ), | ||||
|                   ); | ||||
|                 }, | ||||
|               ), | ||||
|               Align( | ||||
|                 alignment: Alignment.bottomCenter, | ||||
|                 child: Container( | ||||
|                   color: Theme.of(context).scaffoldBackgroundColor, | ||||
|                   child: buildTextField(liked?.id), | ||||
|                     ); | ||||
|                   }, | ||||
|                 ), | ||||
|               ), | ||||
|             ], | ||||
|                 Align( | ||||
|                   alignment: Alignment.bottomCenter, | ||||
|                   child: Container( | ||||
|                     color: Theme.of(context).scaffoldBackgroundColor, | ||||
|                     child: buildTextField(liked?.id), | ||||
|                   ), | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|           ); | ||||
|         }, | ||||
|       ), | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import 'dart:async'; | ||||
|  | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||
| import 'package:immich_mobile/modules/album/providers/album_detail.provider.dart'; | ||||
| import 'package:immich_mobile/modules/album/services/album.service.dart'; | ||||
| import 'package:immich_mobile/shared/models/album.dart'; | ||||
| import 'package:immich_mobile/shared/models/asset.dart'; | ||||
| @@ -10,7 +11,7 @@ import 'package:immich_mobile/shared/providers/db.provider.dart'; | ||||
| import 'package:isar/isar.dart'; | ||||
|  | ||||
| class SharedAlbumNotifier extends StateNotifier<List<Album>> { | ||||
|   SharedAlbumNotifier(this._albumService, Isar db) : super([]) { | ||||
|   SharedAlbumNotifier(this._albumService, Isar db, this._ref) : super([]) { | ||||
|     final query = db.albums.filter().sharedEqualTo(true).sortByCreatedAtDesc(); | ||||
|     query.findAll().then((value) => state = value); | ||||
|     _streamSub = query.watch().listen((data) => state = data); | ||||
| @@ -18,6 +19,7 @@ class SharedAlbumNotifier extends StateNotifier<List<Album>> { | ||||
|  | ||||
|   final AlbumService _albumService; | ||||
|   late final StreamSubscription<List<Album>> _streamSub; | ||||
|   final Ref _ref; | ||||
|  | ||||
|   Future<Album?> createSharedAlbum( | ||||
|     String albumName, | ||||
| @@ -66,6 +68,17 @@ class SharedAlbumNotifier extends StateNotifier<List<Album>> { | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   Future<bool> setActivityEnabled(Album album, bool activityEnabled) async { | ||||
|     final result = | ||||
|         await _albumService.setActivityEnabled(album, activityEnabled); | ||||
|  | ||||
|     if (result) { | ||||
|       _ref.invalidate(albumDetailProvider(album.id)); | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void dispose() { | ||||
|     _streamSub.cancel(); | ||||
| @@ -78,5 +91,6 @@ final sharedAlbumProvider = | ||||
|   return SharedAlbumNotifier( | ||||
|     ref.watch(albumServiceProvider), | ||||
|     ref.watch(dbProvider), | ||||
|     ref, | ||||
|   ); | ||||
| }); | ||||
|   | ||||
| @@ -284,6 +284,23 @@ class AlbumService { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   Future<bool> setActivityEnabled(Album album, bool enabled) async { | ||||
|     try { | ||||
|       final result = await _apiService.albumApi.updateAlbumInfo( | ||||
|         album.remoteId!, | ||||
|         UpdateAlbumDto(isActivityEnabled: enabled), | ||||
|       ); | ||||
|       if (result != null) { | ||||
|         album.activityEnabled = enabled; | ||||
|         await _db.writeTxn(() => _db.albums.put(album)); | ||||
|         return true; | ||||
|       } | ||||
|     } catch (e) { | ||||
|       debugPrint("Error setActivityEnabled  ${e.toString()}"); | ||||
|     } | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   Future<bool> deleteAlbum(Album album) async { | ||||
|     try { | ||||
|       final userId = Store.get(StoreKey.currentUser).isarId; | ||||
|   | ||||
| @@ -216,32 +216,36 @@ class AlbumViewerAppbar extends HookConsumerWidget | ||||
|             ).tr(), | ||||
|             onTap: () => onShareAssetsTo(), | ||||
|           ), | ||||
|           album.ownerId == userId ? ListTile( | ||||
|             leading: const Icon(Icons.delete_sweep_rounded), | ||||
|             title: const Text( | ||||
|               'album_viewer_appbar_share_remove', | ||||
|               style: TextStyle(fontWeight: FontWeight.bold), | ||||
|             ).tr(), | ||||
|             onTap: () => onRemoveFromAlbumPressed(), | ||||
|           ) : const SizedBox(), | ||||
|           album.ownerId == userId | ||||
|               ? ListTile( | ||||
|                   leading: const Icon(Icons.delete_sweep_rounded), | ||||
|                   title: const Text( | ||||
|                     'album_viewer_appbar_share_remove', | ||||
|                     style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                   ).tr(), | ||||
|                   onTap: () => onRemoveFromAlbumPressed(), | ||||
|                 ) | ||||
|               : const SizedBox(), | ||||
|         ]; | ||||
|       } else { | ||||
|         return [ | ||||
|           album.ownerId == userId ? ListTile( | ||||
|             leading: const Icon(Icons.delete_forever_rounded), | ||||
|             title: const Text( | ||||
|               'album_viewer_appbar_share_delete', | ||||
|               style: TextStyle(fontWeight: FontWeight.bold), | ||||
|             ).tr(), | ||||
|             onTap: () => onDeleteAlbumPressed(), | ||||
|           ) : ListTile( | ||||
|             leading: const Icon(Icons.person_remove_rounded), | ||||
|             title: const Text( | ||||
|               'album_viewer_appbar_share_leave', | ||||
|               style: TextStyle(fontWeight: FontWeight.bold), | ||||
|             ).tr(), | ||||
|             onTap: () => onLeaveAlbumPressed(), | ||||
|           ), | ||||
|           album.ownerId == userId | ||||
|               ? ListTile( | ||||
|                   leading: const Icon(Icons.delete_forever_rounded), | ||||
|                   title: const Text( | ||||
|                     'album_viewer_appbar_share_delete', | ||||
|                     style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                   ).tr(), | ||||
|                   onTap: () => onDeleteAlbumPressed(), | ||||
|                 ) | ||||
|               : ListTile( | ||||
|                   leading: const Icon(Icons.person_remove_rounded), | ||||
|                   title: const Text( | ||||
|                     'album_viewer_appbar_share_leave', | ||||
|                     style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                   ).tr(), | ||||
|                   onTap: () => onLeaveAlbumPressed(), | ||||
|                 ), | ||||
|         ]; | ||||
|       } | ||||
|     } | ||||
| @@ -390,7 +394,8 @@ class AlbumViewerAppbar extends HookConsumerWidget | ||||
|       title: selected.isNotEmpty ? Text('${selected.length}') : null, | ||||
|       centerTitle: false, | ||||
|       actions: [ | ||||
|         if (album.shared) buildActivitiesButton(), | ||||
|         if (album.shared && (album.activityEnabled || comments != 0)) | ||||
|           buildActivitiesButton(), | ||||
|         if (album.isRemote) | ||||
|           IconButton( | ||||
|             splashRadius: 25, | ||||
|   | ||||
| @@ -23,6 +23,7 @@ class AlbumOptionsPage extends HookConsumerWidget { | ||||
|     final sharedUsers = useState(album.sharedUsers.toList()); | ||||
|     final owner = album.owner.value; | ||||
|     final userId = ref.watch(authenticationProvider).userId; | ||||
|     final activityEnabled = useState(album.activityEnabled); | ||||
|     final isOwner = owner?.id == userId; | ||||
|  | ||||
|     void showErrorMessage() { | ||||
| @@ -195,6 +196,31 @@ class AlbumOptionsPage extends HookConsumerWidget { | ||||
|         mainAxisAlignment: MainAxisAlignment.start, | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|           if (isOwner && album.shared) | ||||
|             SwitchListTile.adaptive( | ||||
|               value: activityEnabled.value, | ||||
|               onChanged: (bool value) async { | ||||
|                 activityEnabled.value = value; | ||||
|                 if (await ref | ||||
|                     .read(sharedAlbumProvider.notifier) | ||||
|                     .setActivityEnabled(album, value)) { | ||||
|                   album.activityEnabled = value; | ||||
|                 } | ||||
|               }, | ||||
|               activeColor: activityEnabled.value | ||||
|                   ? Theme.of(context).primaryColor | ||||
|                   : Theme.of(context).disabledColor, | ||||
|               dense: true, | ||||
|               title: Text( | ||||
|                 "shared_album_activity_setting_title", | ||||
|                 style: Theme.of(context) | ||||
|                     .textTheme | ||||
|                     .labelLarge | ||||
|                     ?.copyWith(fontWeight: FontWeight.bold), | ||||
|               ).tr(), | ||||
|               subtitle: | ||||
|                   const Text("shared_album_activity_setting_subtitle").tr(), | ||||
|             ), | ||||
|           buildSectionTitle("PEOPLE"), | ||||
|           buildOwnerInfo(), | ||||
|           buildSharedUsersList(), | ||||
|   | ||||
| @@ -239,6 +239,7 @@ class AlbumViewerPage extends HookConsumerWidget { | ||||
|             albumId: album.remoteId!, | ||||
|             appBarTitle: album.name, | ||||
|             isOwner: userId == album.ownerId, | ||||
|             isReadOnly: !album.activityEnabled, | ||||
|           ), | ||||
|         ); | ||||
|       } | ||||
| @@ -279,7 +280,8 @@ class AlbumViewerPage extends HookConsumerWidget { | ||||
|                 ], | ||||
|               ), | ||||
|               isOwner: userId == data.ownerId, | ||||
|               sharedAlbumId: data.remoteId, | ||||
|               sharedAlbumId: | ||||
|                   data.shared && data.activityEnabled ? data.remoteId : null, | ||||
|             ), | ||||
|           ), | ||||
|         ), | ||||
|   | ||||
| @@ -348,6 +348,7 @@ class _$AppRouter extends RootStackRouter { | ||||
|           assetId: args.assetId, | ||||
|           withAssetThumbs: args.withAssetThumbs, | ||||
|           isOwner: args.isOwner, | ||||
|           isReadOnly: args.isReadOnly, | ||||
|           key: args.key, | ||||
|         ), | ||||
|         transitionsBuilder: TransitionsBuilders.slideLeft, | ||||
| @@ -1568,6 +1569,7 @@ class ActivitiesRoute extends PageRouteInfo<ActivitiesRouteArgs> { | ||||
|     String? assetId, | ||||
|     bool withAssetThumbs = true, | ||||
|     bool isOwner = false, | ||||
|     bool isReadOnly = false, | ||||
|     Key? key, | ||||
|   }) : super( | ||||
|           ActivitiesRoute.name, | ||||
| @@ -1578,6 +1580,7 @@ class ActivitiesRoute extends PageRouteInfo<ActivitiesRouteArgs> { | ||||
|             assetId: assetId, | ||||
|             withAssetThumbs: withAssetThumbs, | ||||
|             isOwner: isOwner, | ||||
|             isReadOnly: isReadOnly, | ||||
|             key: key, | ||||
|           ), | ||||
|         ); | ||||
| @@ -1592,6 +1595,7 @@ class ActivitiesRouteArgs { | ||||
|     this.assetId, | ||||
|     this.withAssetThumbs = true, | ||||
|     this.isOwner = false, | ||||
|     this.isReadOnly = false, | ||||
|     this.key, | ||||
|   }); | ||||
|  | ||||
| @@ -1605,11 +1609,13 @@ class ActivitiesRouteArgs { | ||||
|  | ||||
|   final bool isOwner; | ||||
|  | ||||
|   final bool isReadOnly; | ||||
|  | ||||
|   final Key? key; | ||||
|  | ||||
|   @override | ||||
|   String toString() { | ||||
|     return 'ActivitiesRouteArgs{albumId: $albumId, appBarTitle: $appBarTitle, assetId: $assetId, withAssetThumbs: $withAssetThumbs, isOwner: $isOwner, key: $key}'; | ||||
|     return 'ActivitiesRouteArgs{albumId: $albumId, appBarTitle: $appBarTitle, assetId: $assetId, withAssetThumbs: $withAssetThumbs, isOwner: $isOwner, isReadOnly: $isReadOnly, key: $key}'; | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ class Album { | ||||
|     this.endDate, | ||||
|     this.lastModifiedAssetTimestamp, | ||||
|     required this.shared, | ||||
|     required this.activityEnabled, | ||||
|   }); | ||||
|  | ||||
|   Id id = Isar.autoIncrement; | ||||
| @@ -36,6 +37,7 @@ class Album { | ||||
|   DateTime? endDate; | ||||
|   DateTime? lastModifiedAssetTimestamp; | ||||
|   bool shared; | ||||
|   bool activityEnabled; | ||||
|   final IsarLink<User> owner = IsarLink<User>(); | ||||
|   final IsarLink<Asset> thumbnail = IsarLink<Asset>(); | ||||
|   final IsarLinks<User> sharedUsers = IsarLinks<User>(); | ||||
| @@ -106,6 +108,7 @@ class Album { | ||||
|         modifiedAt.isAtSameMomentAs(other.modifiedAt) && | ||||
|         lastModifiedAssetTimestampIsSetAndEqual && | ||||
|         shared == other.shared && | ||||
|         activityEnabled == other.activityEnabled && | ||||
|         owner.value == other.owner.value && | ||||
|         thumbnail.value == other.thumbnail.value && | ||||
|         sharedUsers.length == other.sharedUsers.length && | ||||
| @@ -123,6 +126,7 @@ class Album { | ||||
|       modifiedAt.hashCode ^ | ||||
|       lastModifiedAssetTimestamp.hashCode ^ | ||||
|       shared.hashCode ^ | ||||
|       activityEnabled.hashCode ^ | ||||
|       owner.value.hashCode ^ | ||||
|       thumbnail.value.hashCode ^ | ||||
|       sharedUsers.length.hashCode ^ | ||||
| @@ -134,6 +138,7 @@ class Album { | ||||
|       createdAt: ape.lastModified?.toUtc() ?? DateTime.now().toUtc(), | ||||
|       modifiedAt: ape.lastModified?.toUtc() ?? DateTime.now().toUtc(), | ||||
|       shared: false, | ||||
|       activityEnabled: false, | ||||
|     ); | ||||
|     a.owner.value = Store.get(StoreKey.currentUser); | ||||
|     a.localId = ape.id; | ||||
| @@ -151,6 +156,7 @@ class Album { | ||||
|       shared: dto.shared, | ||||
|       startDate: dto.startDate, | ||||
|       endDate: dto.endDate, | ||||
|       activityEnabled: dto.isActivityEnabled, | ||||
|     ); | ||||
|     a.owner.value = await db.users.getById(dto.ownerId); | ||||
|     if (dto.albumThumbnailAssetId != null) { | ||||
|   | ||||
| @@ -17,48 +17,53 @@ const AlbumSchema = CollectionSchema( | ||||
|   name: r'Album', | ||||
|   id: -1355968412107120937, | ||||
|   properties: { | ||||
|     r'createdAt': PropertySchema( | ||||
|     r'activityEnabled': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'activityEnabled', | ||||
|       type: IsarType.bool, | ||||
|     ), | ||||
|     r'createdAt': PropertySchema( | ||||
|       id: 1, | ||||
|       name: r'createdAt', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     r'endDate': PropertySchema( | ||||
|       id: 1, | ||||
|       id: 2, | ||||
|       name: r'endDate', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     r'lastModifiedAssetTimestamp': PropertySchema( | ||||
|       id: 2, | ||||
|       id: 3, | ||||
|       name: r'lastModifiedAssetTimestamp', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     r'localId': PropertySchema( | ||||
|       id: 3, | ||||
|       id: 4, | ||||
|       name: r'localId', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'modifiedAt': PropertySchema( | ||||
|       id: 4, | ||||
|       id: 5, | ||||
|       name: r'modifiedAt', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     r'name': PropertySchema( | ||||
|       id: 5, | ||||
|       id: 6, | ||||
|       name: r'name', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'remoteId': PropertySchema( | ||||
|       id: 6, | ||||
|       id: 7, | ||||
|       name: r'remoteId', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'shared': PropertySchema( | ||||
|       id: 7, | ||||
|       id: 8, | ||||
|       name: r'shared', | ||||
|       type: IsarType.bool, | ||||
|     ), | ||||
|     r'startDate': PropertySchema( | ||||
|       id: 8, | ||||
|       id: 9, | ||||
|       name: r'startDate', | ||||
|       type: IsarType.dateTime, | ||||
|     ) | ||||
| @@ -157,15 +162,16 @@ void _albumSerialize( | ||||
|   List<int> offsets, | ||||
|   Map<Type, List<int>> allOffsets, | ||||
| ) { | ||||
|   writer.writeDateTime(offsets[0], object.createdAt); | ||||
|   writer.writeDateTime(offsets[1], object.endDate); | ||||
|   writer.writeDateTime(offsets[2], object.lastModifiedAssetTimestamp); | ||||
|   writer.writeString(offsets[3], object.localId); | ||||
|   writer.writeDateTime(offsets[4], object.modifiedAt); | ||||
|   writer.writeString(offsets[5], object.name); | ||||
|   writer.writeString(offsets[6], object.remoteId); | ||||
|   writer.writeBool(offsets[7], object.shared); | ||||
|   writer.writeDateTime(offsets[8], object.startDate); | ||||
|   writer.writeBool(offsets[0], object.activityEnabled); | ||||
|   writer.writeDateTime(offsets[1], object.createdAt); | ||||
|   writer.writeDateTime(offsets[2], object.endDate); | ||||
|   writer.writeDateTime(offsets[3], object.lastModifiedAssetTimestamp); | ||||
|   writer.writeString(offsets[4], object.localId); | ||||
|   writer.writeDateTime(offsets[5], object.modifiedAt); | ||||
|   writer.writeString(offsets[6], object.name); | ||||
|   writer.writeString(offsets[7], object.remoteId); | ||||
|   writer.writeBool(offsets[8], object.shared); | ||||
|   writer.writeDateTime(offsets[9], object.startDate); | ||||
| } | ||||
|  | ||||
| Album _albumDeserialize( | ||||
| @@ -175,15 +181,16 @@ Album _albumDeserialize( | ||||
|   Map<Type, List<int>> allOffsets, | ||||
| ) { | ||||
|   final object = Album( | ||||
|     createdAt: reader.readDateTime(offsets[0]), | ||||
|     endDate: reader.readDateTimeOrNull(offsets[1]), | ||||
|     lastModifiedAssetTimestamp: reader.readDateTimeOrNull(offsets[2]), | ||||
|     localId: reader.readStringOrNull(offsets[3]), | ||||
|     modifiedAt: reader.readDateTime(offsets[4]), | ||||
|     name: reader.readString(offsets[5]), | ||||
|     remoteId: reader.readStringOrNull(offsets[6]), | ||||
|     shared: reader.readBool(offsets[7]), | ||||
|     startDate: reader.readDateTimeOrNull(offsets[8]), | ||||
|     activityEnabled: reader.readBool(offsets[0]), | ||||
|     createdAt: reader.readDateTime(offsets[1]), | ||||
|     endDate: reader.readDateTimeOrNull(offsets[2]), | ||||
|     lastModifiedAssetTimestamp: reader.readDateTimeOrNull(offsets[3]), | ||||
|     localId: reader.readStringOrNull(offsets[4]), | ||||
|     modifiedAt: reader.readDateTime(offsets[5]), | ||||
|     name: reader.readString(offsets[6]), | ||||
|     remoteId: reader.readStringOrNull(offsets[7]), | ||||
|     shared: reader.readBool(offsets[8]), | ||||
|     startDate: reader.readDateTimeOrNull(offsets[9]), | ||||
|   ); | ||||
|   object.id = id; | ||||
|   return object; | ||||
| @@ -197,22 +204,24 @@ P _albumDeserializeProp<P>( | ||||
| ) { | ||||
|   switch (propertyId) { | ||||
|     case 0: | ||||
|       return (reader.readDateTime(offset)) as P; | ||||
|       return (reader.readBool(offset)) as P; | ||||
|     case 1: | ||||
|       return (reader.readDateTimeOrNull(offset)) as P; | ||||
|       return (reader.readDateTime(offset)) as P; | ||||
|     case 2: | ||||
|       return (reader.readDateTimeOrNull(offset)) as P; | ||||
|     case 3: | ||||
|       return (reader.readStringOrNull(offset)) as P; | ||||
|       return (reader.readDateTimeOrNull(offset)) as P; | ||||
|     case 4: | ||||
|       return (reader.readDateTime(offset)) as P; | ||||
|     case 5: | ||||
|       return (reader.readString(offset)) as P; | ||||
|     case 6: | ||||
|       return (reader.readStringOrNull(offset)) as P; | ||||
|     case 5: | ||||
|       return (reader.readDateTime(offset)) as P; | ||||
|     case 6: | ||||
|       return (reader.readString(offset)) as P; | ||||
|     case 7: | ||||
|       return (reader.readBool(offset)) as P; | ||||
|       return (reader.readStringOrNull(offset)) as P; | ||||
|     case 8: | ||||
|       return (reader.readBool(offset)) as P; | ||||
|     case 9: | ||||
|       return (reader.readDateTimeOrNull(offset)) as P; | ||||
|     default: | ||||
|       throw IsarError('Unknown property with id $propertyId'); | ||||
| @@ -442,6 +451,16 @@ extension AlbumQueryWhere on QueryBuilder<Album, Album, QWhereClause> { | ||||
| } | ||||
|  | ||||
| extension AlbumQueryFilter on QueryBuilder<Album, Album, QFilterCondition> { | ||||
|   QueryBuilder<Album, Album, QAfterFilterCondition> activityEnabledEqualTo( | ||||
|       bool value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'activityEnabled', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QAfterFilterCondition> createdAtEqualTo( | ||||
|       DateTime value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
| @@ -1385,6 +1404,18 @@ extension AlbumQueryLinks on QueryBuilder<Album, Album, QFilterCondition> { | ||||
| } | ||||
|  | ||||
| extension AlbumQuerySortBy on QueryBuilder<Album, Album, QSortBy> { | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> sortByActivityEnabled() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'activityEnabled', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> sortByActivityEnabledDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'activityEnabled', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> sortByCreatedAt() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'createdAt', Sort.asc); | ||||
| @@ -1496,6 +1527,18 @@ extension AlbumQuerySortBy on QueryBuilder<Album, Album, QSortBy> { | ||||
| } | ||||
|  | ||||
| extension AlbumQuerySortThenBy on QueryBuilder<Album, Album, QSortThenBy> { | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> thenByActivityEnabled() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'activityEnabled', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> thenByActivityEnabledDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'activityEnabled', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QAfterSortBy> thenByCreatedAt() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'createdAt', Sort.asc); | ||||
| @@ -1619,6 +1662,12 @@ extension AlbumQuerySortThenBy on QueryBuilder<Album, Album, QSortThenBy> { | ||||
| } | ||||
|  | ||||
| extension AlbumQueryWhereDistinct on QueryBuilder<Album, Album, QDistinct> { | ||||
|   QueryBuilder<Album, Album, QDistinct> distinctByActivityEnabled() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'activityEnabled'); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, Album, QDistinct> distinctByCreatedAt() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'createdAt'); | ||||
| @@ -1684,6 +1733,12 @@ extension AlbumQueryProperty on QueryBuilder<Album, Album, QQueryProperty> { | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, bool, QQueryOperations> activityEnabledProperty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addPropertyName(r'activityEnabled'); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   QueryBuilder<Album, DateTime, QQueryOperations> createdAtProperty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addPropertyName(r'createdAt'); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user