shared_collections_gallery.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/widgets.dart';
  4. import 'package:logging/logging.dart';
  5. import 'package:photos/core/configuration.dart';
  6. import 'package:photos/core/event_bus.dart';
  7. import 'package:photos/db/collections_db.dart';
  8. import 'package:photos/db/files_db.dart';
  9. import 'package:photos/events/remote_sync_event.dart';
  10. import 'package:photos/ui/collections_gallery_widget.dart';
  11. import 'package:photos/ui/common_elements.dart';
  12. import 'package:photos/ui/loading_widget.dart';
  13. import 'package:photos/ui/shared_collection_page.dart';
  14. import 'package:photos/ui/thumbnail_widget.dart';
  15. class SharedCollectionGallery extends StatefulWidget {
  16. const SharedCollectionGallery({Key key}) : super(key: key);
  17. @override
  18. _SharedCollectionGalleryState createState() =>
  19. _SharedCollectionGalleryState();
  20. }
  21. class _SharedCollectionGalleryState extends State<SharedCollectionGallery> {
  22. Logger _logger = Logger("SharedCollectionGallery");
  23. StreamSubscription<RemoteSyncEvent> _subscription;
  24. @override
  25. void initState() {
  26. _subscription = Bus.instance.on<RemoteSyncEvent>().listen((event) {
  27. if (event.success) {
  28. setState(() {});
  29. }
  30. });
  31. super.initState();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. return FutureBuilder<List<CollectionWithThumbnail>>(
  36. future:
  37. CollectionsDB.instance.getAllCollections().then((collections) async {
  38. final c = List<CollectionWithThumbnail>();
  39. for (final collection in collections) {
  40. if (collection.ownerID == Configuration.instance.getUserID()) {
  41. continue;
  42. }
  43. var thumbnail;
  44. try {
  45. thumbnail =
  46. await FilesDB.instance.getLatestFileInCollection(collection.id);
  47. } catch (e) {
  48. _logger.warning(e.toString());
  49. }
  50. c.add(CollectionWithThumbnail(collection, thumbnail));
  51. }
  52. return c;
  53. }),
  54. builder: (context, snapshot) {
  55. if (snapshot.hasData) {
  56. if (snapshot.data.isEmpty) {
  57. return nothingToSeeHere;
  58. } else {
  59. return _getSharedCollectionsGallery(snapshot.data);
  60. }
  61. } else if (snapshot.hasError) {
  62. _logger.shout(snapshot.error);
  63. return Center(child: Text(snapshot.error.toString()));
  64. } else {
  65. return loadWidget;
  66. }
  67. },
  68. );
  69. }
  70. Widget _getSharedCollectionsGallery(
  71. List<CollectionWithThumbnail> collections) {
  72. return Container(
  73. margin: EdgeInsets.only(top: 24),
  74. child: GridView.builder(
  75. shrinkWrap: true,
  76. padding: EdgeInsets.only(bottom: 12),
  77. physics: ScrollPhysics(), // to disable GridView's scrolling
  78. itemBuilder: (context, index) {
  79. return _buildCollection(context, collections[index]);
  80. },
  81. itemCount: collections.length,
  82. gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  83. crossAxisCount: 2,
  84. ),
  85. ),
  86. );
  87. }
  88. Widget _buildCollection(BuildContext context, CollectionWithThumbnail c) {
  89. return GestureDetector(
  90. child: Column(
  91. children: <Widget>[
  92. ClipRRect(
  93. borderRadius: BorderRadius.circular(4.0),
  94. child: Container(
  95. child: c.thumbnail ==
  96. null // When the user has shared a folder without photos
  97. ? Icon(Icons.error)
  98. : Hero(
  99. tag: "shared_collection" + c.thumbnail.tag(),
  100. child: ThumbnailWidget(c.thumbnail)),
  101. height: 150,
  102. width: 150,
  103. ),
  104. ),
  105. Padding(padding: EdgeInsets.all(2)),
  106. Expanded(
  107. child: Text(
  108. c.collection.name,
  109. style: TextStyle(
  110. fontSize: 16,
  111. ),
  112. ),
  113. ),
  114. ],
  115. ),
  116. onTap: () {
  117. final page = SharedCollectionPage(c.collection);
  118. Navigator.of(context).push(
  119. MaterialPageRoute(
  120. builder: (BuildContext context) {
  121. return page;
  122. },
  123. ),
  124. );
  125. },
  126. );
  127. }
  128. @override
  129. void dispose() {
  130. _subscription.cancel();
  131. super.dispose();
  132. }
  133. }