2022-09-07 08:30:09 +00:00
|
|
|
// @dart=2.9
|
|
|
|
|
2022-11-22 08:43:40 +00:00
|
|
|
import 'package:collection/collection.dart';
|
2022-02-13 17:01:09 +00:00
|
|
|
import 'package:fast_base58/fast_base58.dart';
|
2020-05-17 12:39:38 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2022-01-23 06:04:39 +00:00
|
|
|
import 'package:flutter/services.dart';
|
2020-10-31 13:17:17 +00:00
|
|
|
import 'package:logging/logging.dart';
|
2020-10-09 23:51:20 +00:00
|
|
|
import 'package:photos/models/collection.dart';
|
|
|
|
import 'package:photos/services/collections_service.dart';
|
2022-11-20 04:33:24 +00:00
|
|
|
import 'package:photos/theme/ente_theme.dart';
|
2022-11-20 11:02:14 +00:00
|
|
|
import 'package:photos/ui/actions/collection/collection_sharing_actions.dart';
|
2022-11-20 04:33:24 +00:00
|
|
|
import 'package:photos/ui/components/captioned_text_widget.dart';
|
2022-11-20 07:01:06 +00:00
|
|
|
import 'package:photos/ui/components/divider_widget.dart';
|
2022-11-20 04:33:24 +00:00
|
|
|
import 'package:photos/ui/components/menu_item_widget.dart';
|
|
|
|
import 'package:photos/ui/components/menu_section_title.dart';
|
2022-11-22 04:16:19 +00:00
|
|
|
import 'package:photos/ui/sharing/add_partipant_page.dart';
|
2022-11-22 11:33:34 +00:00
|
|
|
import 'package:photos/ui/sharing/album_participants_page.dart';
|
2022-07-01 14:39:02 +00:00
|
|
|
import 'package:photos/ui/sharing/manage_links_widget.dart';
|
2022-11-22 11:33:34 +00:00
|
|
|
import 'package:photos/ui/sharing/user_avator_widget.dart';
|
2022-02-21 02:13:10 +00:00
|
|
|
import 'package:photos/utils/navigation_util.dart';
|
2020-10-09 23:51:20 +00:00
|
|
|
import 'package:photos/utils/share_util.dart';
|
2020-07-07 21:46:14 +00:00
|
|
|
import 'package:photos/utils/toast_util.dart';
|
2020-05-17 12:39:38 +00:00
|
|
|
|
2022-11-20 11:55:12 +00:00
|
|
|
class ShareCollectionPage extends StatefulWidget {
|
2020-10-13 06:23:45 +00:00
|
|
|
final Collection collection;
|
|
|
|
|
2022-11-20 11:55:12 +00:00
|
|
|
const ShareCollectionPage(this.collection, {Key key}) : super(key: key);
|
2020-10-13 06:23:45 +00:00
|
|
|
|
|
|
|
@override
|
2022-11-20 11:55:12 +00:00
|
|
|
State<ShareCollectionPage> createState() => _ShareCollectionPageState();
|
2020-10-13 06:23:45 +00:00
|
|
|
}
|
|
|
|
|
2022-11-20 11:55:12 +00:00
|
|
|
class _ShareCollectionPageState extends State<ShareCollectionPage> {
|
2020-11-02 14:38:59 +00:00
|
|
|
List<User> _sharees;
|
2021-09-10 11:47:58 +00:00
|
|
|
final Logger _logger = Logger("SharingDialogState");
|
2022-12-15 10:02:46 +00:00
|
|
|
final CollectionActions collectionActions =
|
|
|
|
CollectionActions(CollectionsService.instance);
|
2020-10-13 06:23:45 +00:00
|
|
|
|
2022-11-22 11:33:34 +00:00
|
|
|
Future<void> _navigateToManageUser() async {
|
|
|
|
final result = await routeToPage(
|
|
|
|
context,
|
|
|
|
AlbumParticipantsPage(widget.collection),
|
|
|
|
);
|
|
|
|
if (mounted) {
|
|
|
|
setState(() => {});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-13 06:23:45 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2022-11-22 08:43:40 +00:00
|
|
|
_sharees = widget.collection.sharees ?? [];
|
2021-09-04 11:38:41 +00:00
|
|
|
final children = <Widget>[];
|
2022-11-21 10:39:14 +00:00
|
|
|
children.add(
|
|
|
|
MenuSectionTitle(
|
|
|
|
title: _sharees.isEmpty
|
|
|
|
? "Share with specific people"
|
2022-11-22 11:33:34 +00:00
|
|
|
: "Shared with ${_sharees.length} ${_sharees.length == 1 ? 'person' : 'people'}",
|
2022-11-21 10:39:14 +00:00
|
|
|
iconData: Icons.workspaces,
|
|
|
|
),
|
|
|
|
);
|
2022-11-22 06:39:48 +00:00
|
|
|
|
2022-11-22 11:33:34 +00:00
|
|
|
children.add(
|
|
|
|
EmailItemWidget(
|
|
|
|
widget.collection,
|
|
|
|
onTap: _navigateToManageUser,
|
|
|
|
),
|
|
|
|
);
|
2022-11-22 06:39:48 +00:00
|
|
|
|
2022-11-22 04:16:19 +00:00
|
|
|
children.add(
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: CaptionedTextWidget(
|
|
|
|
title: _sharees.isEmpty ? "Add email" : "Add more",
|
|
|
|
makeTextBold: true,
|
2020-10-09 23:51:20 +00:00
|
|
|
),
|
2022-11-22 04:16:19 +00:00
|
|
|
leadingIcon: Icons.add,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
2022-11-22 11:33:34 +00:00
|
|
|
borderRadius: 4.0,
|
2022-12-16 04:12:18 +00:00
|
|
|
isTopBorderRadiusRemoved: _sharees.isNotEmpty,
|
2022-11-22 04:16:19 +00:00
|
|
|
onTap: () async {
|
2022-11-22 11:33:34 +00:00
|
|
|
routeToPage(context, AddParticipantPage(widget.collection)).then(
|
|
|
|
(value) => {
|
|
|
|
if (mounted) {setState(() => {})}
|
|
|
|
},
|
|
|
|
);
|
2022-11-22 04:16:19 +00:00
|
|
|
},
|
|
|
|
),
|
|
|
|
);
|
2020-10-13 05:22:20 +00:00
|
|
|
|
2022-09-15 05:34:22 +00:00
|
|
|
final bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
|
2022-11-22 08:10:58 +00:00
|
|
|
final bool hasExpired =
|
2022-11-22 08:43:40 +00:00
|
|
|
widget.collection?.publicURLs?.firstOrNull?.isExpired ?? false;
|
2022-09-15 05:34:22 +00:00
|
|
|
children.addAll([
|
2022-11-20 04:33:24 +00:00
|
|
|
const SizedBox(
|
|
|
|
height: 24,
|
|
|
|
),
|
2022-11-20 07:01:06 +00:00
|
|
|
MenuSectionTitle(
|
|
|
|
title: hasUrl ? "Public link enabled" : "Share a public link",
|
2022-11-20 04:33:24 +00:00
|
|
|
iconData: Icons.public,
|
|
|
|
),
|
2022-09-15 05:34:22 +00:00
|
|
|
]);
|
2022-11-20 07:01:06 +00:00
|
|
|
if (hasUrl) {
|
2022-11-22 08:10:58 +00:00
|
|
|
if (hasExpired) {
|
|
|
|
children.add(
|
2022-11-20 07:01:06 +00:00
|
|
|
MenuItemWidget(
|
2022-11-22 08:10:58 +00:00
|
|
|
captionedTextWidget: CaptionedTextWidget(
|
|
|
|
title: "Link has expired",
|
|
|
|
textColor: getEnteColorScheme(context).warning500,
|
2022-11-20 07:01:06 +00:00
|
|
|
),
|
2022-11-22 08:10:58 +00:00
|
|
|
leadingIcon: Icons.error_outline,
|
|
|
|
leadingIconColor: getEnteColorScheme(context).warning500,
|
2022-11-20 07:01:06 +00:00
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
2022-11-22 08:10:58 +00:00
|
|
|
onTap: () async {},
|
2022-11-20 07:01:06 +00:00
|
|
|
isBottomBorderRadiusRemoved: true,
|
|
|
|
),
|
2022-11-22 08:10:58 +00:00
|
|
|
);
|
|
|
|
} else {
|
|
|
|
final String collectionKey = Base58Encode(
|
|
|
|
CollectionsService.instance.getCollectionKey(widget.collection.id),
|
|
|
|
);
|
|
|
|
final String url =
|
|
|
|
"${widget.collection.publicURLs.first.url}#$collectionKey";
|
|
|
|
children.addAll(
|
|
|
|
[
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: const CaptionedTextWidget(
|
|
|
|
title: "Copy link",
|
|
|
|
makeTextBold: true,
|
|
|
|
),
|
|
|
|
leadingIcon: Icons.copy,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
onTap: () async {
|
|
|
|
await Clipboard.setData(ClipboardData(text: url));
|
|
|
|
showToast(context, "Link copied to clipboard");
|
|
|
|
},
|
|
|
|
isBottomBorderRadiusRemoved: true,
|
2022-11-20 07:01:06 +00:00
|
|
|
),
|
2022-11-22 08:10:58 +00:00
|
|
|
DividerWidget(
|
|
|
|
dividerType: DividerType.menu,
|
|
|
|
bgColor: getEnteColorScheme(context).blurStrokeFaint,
|
|
|
|
),
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: const CaptionedTextWidget(
|
|
|
|
title: "Send link",
|
|
|
|
makeTextBold: true,
|
|
|
|
),
|
|
|
|
leadingIcon: Icons.adaptive.share,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
onTap: () async {
|
|
|
|
shareText(url);
|
|
|
|
},
|
|
|
|
isTopBorderRadiusRemoved: true,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
children.addAll(
|
|
|
|
[
|
2022-11-20 07:01:06 +00:00
|
|
|
DividerWidget(
|
|
|
|
dividerType: DividerType.menu,
|
|
|
|
bgColor: getEnteColorScheme(context).blurStrokeFaint,
|
|
|
|
),
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: const CaptionedTextWidget(
|
|
|
|
title: "Manage link",
|
2022-11-21 10:39:14 +00:00
|
|
|
makeTextBold: true,
|
2022-11-20 07:01:06 +00:00
|
|
|
),
|
|
|
|
leadingIcon: Icons.link,
|
|
|
|
trailingIcon: Icons.navigate_next,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
2022-11-21 10:39:14 +00:00
|
|
|
trailingIconIsMuted: true,
|
2022-11-20 07:01:06 +00:00
|
|
|
onTap: () async {
|
|
|
|
routeToPage(
|
|
|
|
context,
|
|
|
|
ManageSharedLinkWidget(collection: widget.collection),
|
2022-11-20 11:02:14 +00:00
|
|
|
).then(
|
|
|
|
(value) => {
|
|
|
|
if (mounted) {setState(() => {})}
|
|
|
|
},
|
2022-11-20 07:01:06 +00:00
|
|
|
);
|
|
|
|
},
|
|
|
|
isTopBorderRadiusRemoved: true,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
} else {
|
2022-09-15 05:34:22 +00:00
|
|
|
children.add(
|
2022-11-20 07:01:06 +00:00
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: const CaptionedTextWidget(
|
|
|
|
title: "Create public link",
|
|
|
|
),
|
|
|
|
leadingIcon: Icons.link,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
onTap: () async {
|
2022-12-15 10:02:46 +00:00
|
|
|
final bool result = await collectionActions.publicLinkToggle(
|
2022-11-20 11:02:14 +00:00
|
|
|
context,
|
|
|
|
widget.collection,
|
|
|
|
true,
|
|
|
|
);
|
|
|
|
if (result && mounted) {
|
|
|
|
setState(() => {});
|
|
|
|
}
|
2022-11-20 07:01:06 +00:00
|
|
|
},
|
2022-09-15 05:34:22 +00:00
|
|
|
),
|
|
|
|
);
|
2022-01-23 06:04:39 +00:00
|
|
|
}
|
|
|
|
|
2022-11-20 04:33:24 +00:00
|
|
|
return Scaffold(
|
|
|
|
appBar: AppBar(title: const Text("Sharing")),
|
|
|
|
body: SingleChildScrollView(
|
2020-10-13 05:22:20 +00:00
|
|
|
child: ListBody(
|
|
|
|
children: <Widget>[
|
|
|
|
Padding(
|
2022-11-20 04:33:24 +00:00
|
|
|
padding:
|
|
|
|
const EdgeInsets.symmetric(vertical: 4.0, horizontal: 16),
|
2022-06-11 08:23:52 +00:00
|
|
|
child: Column(
|
|
|
|
children: children,
|
|
|
|
),
|
|
|
|
),
|
2020-10-13 05:22:20 +00:00
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
2020-10-09 23:51:20 +00:00
|
|
|
}
|
2020-08-07 10:21:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class EmailItemWidget extends StatelessWidget {
|
2021-03-21 11:21:45 +00:00
|
|
|
final Collection collection;
|
2022-11-22 11:33:34 +00:00
|
|
|
final Function onTap;
|
2020-10-31 13:17:17 +00:00
|
|
|
|
2020-08-07 10:21:56 +00:00
|
|
|
const EmailItemWidget(
|
2022-11-22 11:33:34 +00:00
|
|
|
this.collection, {
|
|
|
|
this.onTap,
|
2020-08-07 10:21:56 +00:00
|
|
|
Key key,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2022-11-22 11:33:34 +00:00
|
|
|
if (collection.getSharees().isEmpty) {
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
} else if (collection.getSharees().length == 1) {
|
|
|
|
return Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: CaptionedTextWidget(
|
|
|
|
title: collection.getSharees().firstOrNull?.email ?? '',
|
|
|
|
),
|
|
|
|
leadingIconWidget: UserAvatarWidget(collection.getSharees().first),
|
|
|
|
leadingIconSize: 24,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
trailingIconIsMuted: true,
|
|
|
|
trailingIcon: Icons.chevron_right,
|
2022-11-21 10:39:14 +00:00
|
|
|
onTap: () async {
|
2022-11-22 11:33:34 +00:00
|
|
|
if (onTap != null) {
|
|
|
|
onTap();
|
|
|
|
}
|
2022-11-21 10:39:14 +00:00
|
|
|
},
|
2022-11-22 11:33:34 +00:00
|
|
|
isBottomBorderRadiusRemoved: true,
|
|
|
|
),
|
|
|
|
DividerWidget(
|
|
|
|
dividerType: DividerType.menu,
|
|
|
|
bgColor: getEnteColorScheme(context).blurStrokeFaint,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
MenuItemWidget(
|
|
|
|
captionedTextWidget: const CaptionedTextWidget(
|
|
|
|
title: 'Manage',
|
2022-11-21 10:39:14 +00:00
|
|
|
),
|
2022-11-22 11:33:34 +00:00
|
|
|
leadingIcon: Icons.people_outline,
|
|
|
|
menuItemColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
pressedColor: getEnteColorScheme(context).fillFaint,
|
|
|
|
trailingIconIsMuted: true,
|
|
|
|
trailingIcon: Icons.chevron_right,
|
|
|
|
onTap: () async {
|
|
|
|
if (onTap != null) {
|
|
|
|
onTap();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
isBottomBorderRadiusRemoved: true,
|
2020-12-03 23:54:45 +00:00
|
|
|
),
|
2022-11-22 11:33:34 +00:00
|
|
|
DividerWidget(
|
|
|
|
dividerType: DividerType.menu,
|
|
|
|
bgColor: getEnteColorScheme(context).blurStrokeFaint,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
2020-05-17 12:39:38 +00:00
|
|
|
}
|
|
|
|
}
|