Implemented editable album title (#130)

* Replace static title text with a text edit field
* Implement endpoint for updating album info
* Implement changing title
* Only the owner can change the title
This commit is contained in:
Alex 2022-04-28 23:46:37 -05:00 committed by GitHub
parent c5c7a134dd
commit 38e0178c81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 290 additions and 29 deletions

View file

@ -12,6 +12,7 @@ import 'package:immich_mobile/modules/sharing/providers/shared_album.provider.da
import 'package:immich_mobile/modules/sharing/services/shared_album.service.dart';
import 'package:immich_mobile/modules/sharing/ui/album_action_outlined_button.dart';
import 'package:immich_mobile/modules/sharing/ui/album_viewer_appbar.dart';
import 'package:immich_mobile/modules/sharing/ui/album_viewer_editable_title.dart';
import 'package:immich_mobile/modules/sharing/ui/album_viewer_thumbnail.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart';
@ -26,6 +27,7 @@ class AlbumViewerPage extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
FocusNode titleFocusNode = useFocusNode();
ScrollController _scrollController = useScrollController();
AsyncValue<SharedAlbum> _albumInfo = ref.watch(sharedAlbumDetailProvider(albumId));
@ -83,13 +85,18 @@ class AlbumViewerPage extends HookConsumerWidget {
}
}
Widget _buildTitle(String title) {
Widget _buildTitle(SharedAlbum albumInfo) {
return Padding(
padding: const EdgeInsets.only(left: 16.0, top: 16),
child: Text(
title,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
padding: const EdgeInsets.only(left: 8, right: 8, top: 16),
child: userId == albumInfo.ownerId
? AlbumViewerEditableTitle(
albumInfo: albumInfo,
titleFocusNode: titleFocusNode,
)
: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: Text(albumInfo.albumName, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
),
);
}
@ -124,7 +131,7 @@ class AlbumViewerPage extends HookConsumerWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTitle(albumInfo.albumName),
_buildTitle(albumInfo),
_buildAlbumDateRange(albumInfo),
SizedBox(
height: 60,
@ -204,31 +211,36 @@ class AlbumViewerPage extends HookConsumerWidget {
}
Widget _buildBody(SharedAlbum albumInfo) {
return Stack(children: [
DraggableScrollbar.semicircle(
backgroundColor: Theme.of(context).primaryColor,
controller: _scrollController,
heightScrollThumb: 48.0,
child: CustomScrollView(
return GestureDetector(
onTap: () {
titleFocusNode.unfocus();
},
child: Stack(children: [
DraggableScrollbar.semicircle(
backgroundColor: Theme.of(context).primaryColor,
controller: _scrollController,
slivers: [
_buildHeader(albumInfo),
SliverPersistentHeader(
pinned: true,
delegate: ImmichSliverPersistentAppBarDelegate(
minHeight: 50,
maxHeight: 50,
child: Container(
color: immichBackgroundColor,
child: _buildControlButton(albumInfo),
heightScrollThumb: 48.0,
child: CustomScrollView(
controller: _scrollController,
slivers: [
_buildHeader(albumInfo),
SliverPersistentHeader(
pinned: true,
delegate: ImmichSliverPersistentAppBarDelegate(
minHeight: 50,
maxHeight: 50,
child: Container(
color: immichBackgroundColor,
child: _buildControlButton(albumInfo),
),
),
),
),
_buildImageGrid(albumInfo)
],
_buildImageGrid(albumInfo)
],
),
),
),
]);
]),
);
}
return Scaffold(