ente/lib/ui/sharing/album_participants_page.dart

279 lines
11 KiB
Dart
Raw Normal View History

2022-11-22 10:23:45 +00:00
import 'package:flutter/material.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/extensions/list.dart';
import 'package:photos/models/collection.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/divider_widget.dart';
2023-01-31 12:21:57 +00:00
import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart';
2022-11-22 10:23:45 +00:00
import 'package:photos/ui/components/menu_section_title.dart';
import 'package:photos/ui/components/title_bar_title_widget.dart';
import 'package:photos/ui/components/title_bar_widget.dart';
import 'package:photos/ui/sharing/add_partipant_page.dart';
import 'package:photos/ui/sharing/manage_album_participant.dart';
2022-11-22 10:23:45 +00:00
import 'package:photos/ui/sharing/user_avator_widget.dart';
import 'package:photos/utils/navigation_util.dart';
class AlbumParticipantsPage extends StatefulWidget {
2022-11-22 10:23:45 +00:00
final Collection collection;
const AlbumParticipantsPage(
this.collection, {
super.key,
});
@override
State<AlbumParticipantsPage> createState() => _AlbumParticipantsPageState();
}
class _AlbumParticipantsPageState extends State<AlbumParticipantsPage> {
late int currentUserID;
@override
void initState() {
currentUserID = Configuration.instance.getUserID()!;
super.initState();
}
Future<void> _navigateToManageUser(User user) async {
if (user.id == currentUserID) {
return;
}
await routeToPage(
context,
ManageIndividualParticipant(collection: widget.collection, user: user),
);
if (mounted) {
setState(() => {});
}
}
Future<void> _navigateToAddUser(bool addingViewer) async {
await routeToPage(
context,
2023-01-30 17:45:26 +00:00
AddParticipantPage(widget.collection, addingViewer),
);
if (mounted) {
setState(() => {});
}
}
2022-11-22 10:23:45 +00:00
@override
Widget build(BuildContext context) {
final isOwner =
widget.collection.owner?.id == Configuration.instance.getUserID();
2022-11-22 10:23:45 +00:00
final colorScheme = getEnteColorScheme(context);
final currentUserID = Configuration.instance.getUserID()!;
2022-12-16 04:10:33 +00:00
final int participants = 1 + widget.collection.getSharees().length;
final User owner = widget.collection.owner!;
2022-11-22 10:23:45 +00:00
if (owner.id == currentUserID && owner.email == "") {
owner.email = Configuration.instance.getEmail()!;
}
final splitResult =
widget.collection.getSharees().splitMatch((x) => x.isViewer);
2022-11-22 10:23:45 +00:00
final List<User> viewers = splitResult.matched;
2023-01-30 18:29:25 +00:00
viewers.sort((a, b) => a.email.compareTo(b.email));
2022-11-22 10:23:45 +00:00
final List<User> collaborators = splitResult.unmatched;
2023-01-30 18:29:25 +00:00
collaborators.sort((a, b) => a.email.compareTo(b.email));
2022-11-22 10:23:45 +00:00
return Scaffold(
body: CustomScrollView(
primary: false,
slivers: <Widget>[
TitleBarWidget(
flexibleSpaceTitle: TitleBarTitleWidget(
title: "${widget.collection.name}",
2022-11-22 10:23:45 +00:00
),
2022-12-16 04:10:33 +00:00
flexibleSpaceCaption: "$participants Participants",
2022-11-22 10:23:45 +00:00
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return Padding(
padding: const EdgeInsets.only(top: 20, left: 16, right: 16),
child: Column(
children: [
Column(
children: [
const MenuSectionTitle(
title: "Owner",
iconData: Icons.admin_panel_settings_outlined,
),
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: isOwner
? "You"
: widget.collection.owner?.email ?? '',
makeTextBold: isOwner,
2022-11-22 10:23:45 +00:00
),
leadingIconWidget: UserAvatarWidget(
owner,
currentUserID: currentUserID,
),
leadingIconSize: 24,
menuItemColor: colorScheme.fillFaint,
borderRadius: 8,
isGestureDetectorDisabled: true,
),
],
),
],
),
);
},
childCount: 1,
),
),
SliverPadding(
padding: const EdgeInsets.only(top: 20, left: 16, right: 16),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == 0 && (isOwner || collaborators.isNotEmpty)) {
2022-11-22 10:23:45 +00:00
return const MenuSectionTitle(
title: "Collaborator",
iconData: Icons.edit_outlined,
);
} else if (index > 0 && index <= collaborators.length) {
final listIndex = index - 1;
final currentUser = collaborators[listIndex];
final isSameAsLoggedInUser =
currentUserID == currentUser.id;
2022-11-22 10:23:45 +00:00
return Column(
children: [
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: isSameAsLoggedInUser
? "You"
: currentUser.email,
makeTextBold: isSameAsLoggedInUser,
2022-11-22 10:23:45 +00:00
),
leadingIconSize: 24.0,
leadingIconWidget: UserAvatarWidget(
currentUser,
type: AvatarType.mini,
currentUserID: currentUserID,
2022-11-22 10:23:45 +00:00
),
menuItemColor: getEnteColorScheme(context).fillFaint,
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: isOwner ? Icons.chevron_right : null,
2022-11-22 10:23:45 +00:00
trailingIconIsMuted: true,
onTap: () async {
if (isOwner) {
_navigateToManageUser(currentUser);
}
},
2022-11-22 10:23:45 +00:00
isTopBorderRadiusRemoved: listIndex > 0,
isBottomBorderRadiusRemoved: true,
borderRadius: 8,
),
DividerWidget(
dividerType: DividerType.menu,
bgColor: getEnteColorScheme(context).blurStrokeFaint,
),
],
);
} else if (index == (1 + collaborators.length) && isOwner) {
2022-11-22 10:23:45 +00:00
return MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
2023-01-31 08:24:38 +00:00
title: collaborators.isNotEmpty
? "Add more"
: "Add collaborator",
2022-11-22 10:23:45 +00:00
makeTextBold: true,
),
leadingIcon: Icons.add_outlined,
menuItemColor: getEnteColorScheme(context).fillFaint,
pressedColor: getEnteColorScheme(context).fillFaint,
onTap: () async {
_navigateToAddUser(false);
},
2022-11-22 10:23:45 +00:00
isTopBorderRadiusRemoved: collaborators.isNotEmpty,
borderRadius: 8,
);
}
return const SizedBox.shrink();
2022-11-22 10:23:45 +00:00
},
childCount: 1 + collaborators.length + 1,
),
),
),
SliverPadding(
padding: const EdgeInsets.only(top: 24, left: 16, right: 16),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == 0 && (isOwner || viewers.isNotEmpty)) {
2022-11-22 10:23:45 +00:00
return const MenuSectionTitle(
title: "Viewer",
iconData: Icons.photo_outlined,
);
} else if (index > 0 && index <= viewers.length) {
final listIndex = index - 1;
final currentUser = viewers[listIndex];
final isSameAsLoggedInUser =
currentUserID == currentUser.id;
2022-12-16 08:19:32 +00:00
final isLastItem = !isOwner && index == viewers.length;
2022-11-22 10:23:45 +00:00
return Column(
children: [
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: isSameAsLoggedInUser
? "You"
: currentUser.email,
makeTextBold: isSameAsLoggedInUser,
2022-11-22 10:23:45 +00:00
),
leadingIconSize: 24.0,
leadingIconWidget: UserAvatarWidget(
currentUser,
type: AvatarType.mini,
currentUserID: currentUserID,
2022-11-22 10:23:45 +00:00
),
menuItemColor: getEnteColorScheme(context).fillFaint,
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: isOwner ? Icons.chevron_right : null,
2022-11-22 10:23:45 +00:00
trailingIconIsMuted: true,
onTap: () async {
if (isOwner) {
await _navigateToManageUser(currentUser);
}
},
2022-11-22 10:23:45 +00:00
isTopBorderRadiusRemoved: listIndex > 0,
2022-12-16 08:19:32 +00:00
isBottomBorderRadiusRemoved: !isLastItem,
2022-11-22 10:23:45 +00:00
borderRadius: 8,
),
2022-12-16 08:19:32 +00:00
isLastItem
? const SizedBox.shrink()
: DividerWidget(
2022-12-16 08:28:54 +00:00
dividerType: DividerType.menu,
bgColor: getEnteColorScheme(context).fillFaint,
2022-12-16 08:19:32 +00:00
),
2022-11-22 10:23:45 +00:00
],
);
} else if (index == (1 + viewers.length) && isOwner) {
2022-11-22 10:23:45 +00:00
return MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
2023-01-31 08:24:38 +00:00
title: viewers.isNotEmpty ? "Add more" : "Add viewer",
2022-11-22 10:23:45 +00:00
makeTextBold: true,
),
leadingIcon: Icons.add_outlined,
menuItemColor: getEnteColorScheme(context).fillFaint,
pressedColor: getEnteColorScheme(context).fillFaint,
onTap: () async {
_navigateToAddUser(true);
},
2022-11-22 10:23:45 +00:00
isTopBorderRadiusRemoved: viewers.isNotEmpty,
borderRadius: 8,
);
}
return const SizedBox.shrink();
2022-11-22 10:23:45 +00:00
},
childCount: 1 + viewers.length + 1,
),
),
),
],
),
);
}
}