empty_state.dart 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import "package:flutter/material.dart";
  2. import "package:photos/core/event_bus.dart";
  3. import "package:photos/events/tab_changed_event.dart";
  4. import "package:photos/generated/l10n.dart";
  5. import "package:photos/theme/ente_theme.dart";
  6. import 'package:photos/ui/collections/collection_action_sheet.dart';
  7. import 'package:photos/ui/components/buttons/button_widget.dart';
  8. import "package:photos/ui/components/empty_state_item_widget.dart";
  9. import "package:photos/ui/components/models/button_type.dart";
  10. import "package:photos/utils/share_util.dart";
  11. import "package:photos/utils/toast_util.dart";
  12. class SharedEmptyStateWidget extends StatelessWidget {
  13. const SharedEmptyStateWidget({super.key});
  14. @override
  15. Widget build(BuildContext context) {
  16. final textTheme = getEnteTextTheme(context);
  17. return SingleChildScrollView(
  18. child: Padding(
  19. padding: const EdgeInsets.fromLTRB(16, 12, 16, 114),
  20. child: Padding(
  21. padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 10),
  22. child: Column(
  23. mainAxisSize: MainAxisSize.min,
  24. mainAxisAlignment: MainAxisAlignment.center,
  25. children: [
  26. Padding(
  27. padding:
  28. const EdgeInsets.symmetric(horizontal: 4, vertical: 16),
  29. child: Column(
  30. mainAxisSize: MainAxisSize.min,
  31. crossAxisAlignment: CrossAxisAlignment.start,
  32. children: [
  33. Text(
  34. S.of(context).privateSharing,
  35. style: textTheme.h3Bold,
  36. textAlign: TextAlign.start,
  37. ),
  38. const SizedBox(height: 24),
  39. Column(
  40. mainAxisSize: MainAxisSize.min,
  41. children: [
  42. EmptyStateItemWidget(
  43. S.of(context).shareOnlyWithThePeopleYouWant,
  44. ),
  45. const SizedBox(height: 12),
  46. EmptyStateItemWidget(
  47. S.of(context).usePublicLinksForPeopleNotOnEnte,
  48. ),
  49. const SizedBox(height: 12),
  50. EmptyStateItemWidget(
  51. S.of(context).allowPeopleToAddPhotos,
  52. ),
  53. ],
  54. ),
  55. ],
  56. ),
  57. ),
  58. const SizedBox(height: 16),
  59. Padding(
  60. padding: const EdgeInsets.symmetric(vertical: 4),
  61. child: Column(
  62. mainAxisSize: MainAxisSize.min,
  63. children: [
  64. ButtonWidget(
  65. buttonType: ButtonType.trailingIconPrimary,
  66. labelText: S.of(context).shareAnAlbumNow,
  67. icon: Icons.arrow_forward_outlined,
  68. onTap: () async {
  69. showCollectionActionSheet(
  70. context,
  71. actionType: CollectionActionType.shareCollection,
  72. );
  73. },
  74. ),
  75. const SizedBox(height: 6),
  76. ButtonWidget(
  77. buttonType: ButtonType.trailingIconSecondary,
  78. labelText: S.of(context).collectEventPhotos,
  79. icon: Icons.add_photo_alternate_outlined,
  80. onTap: () async {
  81. showCollectionActionSheet(
  82. context,
  83. actionType: CollectionActionType.collectPhotos,
  84. );
  85. },
  86. ),
  87. const SizedBox(height: 6),
  88. ButtonWidget(
  89. buttonType: ButtonType.trailingIconSecondary,
  90. labelText: S.of(context).inviteYourFriends,
  91. icon: Icons.ios_share_outlined,
  92. onTap: () async {
  93. shareText(S.of(context).shareTextRecommendUsingEnte);
  94. },
  95. ),
  96. ],
  97. ),
  98. ),
  99. ],
  100. ),
  101. ),
  102. ),
  103. );
  104. }
  105. }
  106. class OutgoingAlbumEmptyState extends StatelessWidget {
  107. const OutgoingAlbumEmptyState({super.key});
  108. @override
  109. Widget build(BuildContext context) {
  110. return Column(
  111. mainAxisSize: MainAxisSize.min,
  112. children: [
  113. Padding(
  114. padding: const EdgeInsets.symmetric(vertical: 24),
  115. child: Column(
  116. mainAxisSize: MainAxisSize.min,
  117. children: [
  118. Icon(
  119. Icons.collections_outlined,
  120. color: getEnteColorScheme(context).strokeMuted,
  121. ),
  122. const SizedBox(height: 12),
  123. Text(
  124. S.of(context).noAlbumsSharedByYouYet,
  125. style: getEnteTextTheme(context).bodyMuted,
  126. ),
  127. ],
  128. ),
  129. ),
  130. const SizedBox(height: 12),
  131. Padding(
  132. padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 24),
  133. child: ButtonWidget(
  134. buttonType: ButtonType.trailingIconPrimary,
  135. labelText: S.of(context).shareYourFirstAlbum,
  136. icon: Icons.add,
  137. onTap: () async {
  138. showToast(
  139. context,
  140. S.of(context).shareAlbumHint,
  141. );
  142. Bus.instance.fire(
  143. TabChangedEvent(1, TabChangedEventSource.collectionsPage),
  144. );
  145. },
  146. ),
  147. ),
  148. const SizedBox(height: 12),
  149. ],
  150. );
  151. }
  152. }
  153. class IncomingAlbumEmptyState extends StatelessWidget {
  154. const IncomingAlbumEmptyState({super.key});
  155. @override
  156. Widget build(BuildContext context) {
  157. return Column(
  158. mainAxisSize: MainAxisSize.min,
  159. children: [
  160. Padding(
  161. padding: const EdgeInsets.symmetric(vertical: 24),
  162. child: Column(
  163. mainAxisSize: MainAxisSize.min,
  164. children: [
  165. Icon(
  166. Icons.collections_outlined,
  167. color: getEnteColorScheme(context).strokeMuted,
  168. ),
  169. const SizedBox(height: 12),
  170. Text(
  171. S.of(context).nothingSharedWithYouYet,
  172. style: getEnteTextTheme(context).bodyMuted,
  173. ),
  174. ],
  175. ),
  176. ),
  177. const SizedBox(height: 12),
  178. Padding(
  179. padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 24),
  180. child: ButtonWidget(
  181. buttonType: ButtonType.trailingIconPrimary,
  182. labelText: S.of(context).inviteYourFriends,
  183. icon: Icons.ios_share_outlined,
  184. onTap: () async {
  185. shareText(S.of(context).shareTextRecommendUsingEnte);
  186. },
  187. ),
  188. ),
  189. const SizedBox(height: 12),
  190. ],
  191. );
  192. }
  193. }