Loading lib/common/widget/app_wrapper.dart +1 −0 Original line number Diff line number Diff line import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:stamped/bottom_nav_bar/widget/bottom_nav_bar.dart'; import 'package:stamped/pages/auth/login_page.dart'; class AppWrapper extends StatelessWidget { // final Widget child; Loading lib/pages/collections/postcard_tile.dart +3 −21 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:stamped/common/service/ioc_container.dart'; import 'package:stamped/common/widget/future_builder_handler.dart'; import 'package:stamped/data/entities/user.dart'; import 'package:stamped/data/models/postcard.dart'; import 'package:stamped/pages/collections/postcard_detail.dart'; import 'package:stamped/service/media_service.dart'; Loading @@ -11,25 +10,8 @@ class PostcardTile extends StatelessWidget { const PostcardTile({super.key, required this.postcard}); factory PostcardTile.empty() { final postcard = Postcard( id: '0', imagePath: 'https://firebasestorage.googleapis.com/v0/b/stamped-56619.appspot.com/o/0%2Ftestimage1.jfif?alt=media&token=89d731be-b01b-4505-aa05-d5e6292a2893', stampPath: '0', originLocation: 'Germany', destinationLocation: 'Germany', text: '0', sender: User( id: '0', userName: 'userName', profilePicture: 'profilePicture', lastLocation: 'lastLocation', isAdmin: true), timestamp: DateTime.parse('2023-07-20 20:18:04Z'), ); // create a new instance of Postcard return PostcardTile( postcard: postcard, ); // pass it to the existing constructor static PostcardTile fromData(Postcard data) { return PostcardTile(postcard: data); } @override Loading Loading @@ -70,7 +52,7 @@ class PostcardTile extends StatelessWidget { ), Row( children: [ Text(postcard.sender.userName), Text('some name'), Spacer(), FutureBuilderHandler( future: Loading lib/pages/home/home_page.dart +59 −50 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:stamped/common/service/ioc_container.dart'; import 'package:stamped/common/util/shared_ui_constants.dart'; import 'package:stamped/common/widget/page_template.dart'; import 'package:stamped/common/widget/stream_builder_handler.dart'; import 'package:stamped/data/models/postcard.dart'; import 'package:stamped/pages/collections/postcard_tile.dart'; import 'package:stamped/pages/home/from_friend_card.dart'; final postcardPlaceholders = [ for (var _ = 0; _ < 5; _++) PostcardTile.empty(), ]; final fromYourFriendsPlaceholder = [ for (var _ = 0; _ < 4; _++) FromFriendCard() ]; import 'package:stamped/service/postcard_service.dart'; class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); HomePage({Key? key}) : super(key: key); final postcardService = get<PostcardService>(); @override Widget build(BuildContext context) { Loading @@ -25,35 +22,20 @@ class HomePage extends StatelessWidget { mainAxisSize: MainAxisSize.max, children: [ _buildHeading('Postcards in Your Area'), _buildCardCarousel( context, height: 250, itemBuilder: (context, index) => postcardPlaceholders.elementAt(index), itemCount: postcardPlaceholders.length, ), _buildScrollList<Postcard>( context, 250, _recentPostcardStream(), PostcardTile.fromData), SizedBox( height: STANDARD_GAP, ), _buildHeading('From Your Friends'), _buildCardCarousel( context, height: 150, itemBuilder: (context, index) => fromYourFriendsPlaceholder.elementAt(index), itemCount: fromYourFriendsPlaceholder.length, ), _buildHeading('Recently Obtained Stamps'), _buildScrollList<String>( context, 220, postcardService.stampStream, _stampBuilder), SizedBox( height: STANDARD_GAP, ), _buildHeading('Your Last Postcards'), _buildCardCarousel( context, height: 250, itemBuilder: (context, index) => postcardPlaceholders.elementAt(index), itemCount: postcardPlaceholders.length, ) _buildHeading('Your Last Postcards TBD'), _buildScrollList<Postcard>( context, 250, _recentPostcardStream(), PostcardTile.fromData), ], ), ), Loading @@ -71,22 +53,49 @@ class HomePage extends StatelessWidget { ), ); Widget _buildCardCarousel( BuildContext context, { required double height, required Widget Function(BuildContext, int) itemBuilder, required int itemCount, }) => SizedBox( Widget _buildScrollList<T>(BuildContext context, double height, Stream<Iterable<T>> stream, Widget Function(T) builder) { return Container( height: height, width: MediaQuery.of(context).size.width, child: ListView.separated( itemBuilder: itemBuilder, child: StreamBuilderHandler( stream: stream, builder: (BuildContext context, data) { return ListView.separated( itemBuilder: (context, index) => builder(data.elementAt(index)), separatorBuilder: (context, index) => SizedBox( width: STANDARD_GAP, width: 12, ), itemCount: itemCount, itemCount: data.length, scrollDirection: Axis.horizontal, ); }), ); } Stream<List<Postcard>> _recentPostcardStream() { return postcardService.postcardDataStream.map((List<Postcard> postcards) { final recent = postcards .where((p) => (DateTime.now().millisecondsSinceEpoch - p.timestamp.millisecondsSinceEpoch) < 1800000) .toList(); recent.sort((a, b) => a.timestamp.compareTo(b.timestamp)); return recent; }); } Widget _stampBuilder(String url) { return Container( height: 220, width: 150, decoration: BoxDecoration( image: DecorationImage( image: NetworkImage(url), fit: BoxFit.contain, ), ), ); } } lib/service/postcard_service.dart +3 −2 Original line number Diff line number Diff line Loading @@ -53,11 +53,12 @@ class PostcardService { ); } Stream<List<String>> get stampStream { Stream<Set<String>> get stampStream { return _postcards.stream.map((List<PostcardEntity> postcards) { postcards.sort((a, b) => a.timestamp.compareTo(b.timestamp)); return postcards .map((postcard) => postcard.stampPath) .toList(); .toSet(); }); } Loading Loading
lib/common/widget/app_wrapper.dart +1 −0 Original line number Diff line number Diff line import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:stamped/bottom_nav_bar/widget/bottom_nav_bar.dart'; import 'package:stamped/pages/auth/login_page.dart'; class AppWrapper extends StatelessWidget { // final Widget child; Loading
lib/pages/collections/postcard_tile.dart +3 −21 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:stamped/common/service/ioc_container.dart'; import 'package:stamped/common/widget/future_builder_handler.dart'; import 'package:stamped/data/entities/user.dart'; import 'package:stamped/data/models/postcard.dart'; import 'package:stamped/pages/collections/postcard_detail.dart'; import 'package:stamped/service/media_service.dart'; Loading @@ -11,25 +10,8 @@ class PostcardTile extends StatelessWidget { const PostcardTile({super.key, required this.postcard}); factory PostcardTile.empty() { final postcard = Postcard( id: '0', imagePath: 'https://firebasestorage.googleapis.com/v0/b/stamped-56619.appspot.com/o/0%2Ftestimage1.jfif?alt=media&token=89d731be-b01b-4505-aa05-d5e6292a2893', stampPath: '0', originLocation: 'Germany', destinationLocation: 'Germany', text: '0', sender: User( id: '0', userName: 'userName', profilePicture: 'profilePicture', lastLocation: 'lastLocation', isAdmin: true), timestamp: DateTime.parse('2023-07-20 20:18:04Z'), ); // create a new instance of Postcard return PostcardTile( postcard: postcard, ); // pass it to the existing constructor static PostcardTile fromData(Postcard data) { return PostcardTile(postcard: data); } @override Loading Loading @@ -70,7 +52,7 @@ class PostcardTile extends StatelessWidget { ), Row( children: [ Text(postcard.sender.userName), Text('some name'), Spacer(), FutureBuilderHandler( future: Loading
lib/pages/home/home_page.dart +59 −50 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:stamped/common/service/ioc_container.dart'; import 'package:stamped/common/util/shared_ui_constants.dart'; import 'package:stamped/common/widget/page_template.dart'; import 'package:stamped/common/widget/stream_builder_handler.dart'; import 'package:stamped/data/models/postcard.dart'; import 'package:stamped/pages/collections/postcard_tile.dart'; import 'package:stamped/pages/home/from_friend_card.dart'; final postcardPlaceholders = [ for (var _ = 0; _ < 5; _++) PostcardTile.empty(), ]; final fromYourFriendsPlaceholder = [ for (var _ = 0; _ < 4; _++) FromFriendCard() ]; import 'package:stamped/service/postcard_service.dart'; class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); HomePage({Key? key}) : super(key: key); final postcardService = get<PostcardService>(); @override Widget build(BuildContext context) { Loading @@ -25,35 +22,20 @@ class HomePage extends StatelessWidget { mainAxisSize: MainAxisSize.max, children: [ _buildHeading('Postcards in Your Area'), _buildCardCarousel( context, height: 250, itemBuilder: (context, index) => postcardPlaceholders.elementAt(index), itemCount: postcardPlaceholders.length, ), _buildScrollList<Postcard>( context, 250, _recentPostcardStream(), PostcardTile.fromData), SizedBox( height: STANDARD_GAP, ), _buildHeading('From Your Friends'), _buildCardCarousel( context, height: 150, itemBuilder: (context, index) => fromYourFriendsPlaceholder.elementAt(index), itemCount: fromYourFriendsPlaceholder.length, ), _buildHeading('Recently Obtained Stamps'), _buildScrollList<String>( context, 220, postcardService.stampStream, _stampBuilder), SizedBox( height: STANDARD_GAP, ), _buildHeading('Your Last Postcards'), _buildCardCarousel( context, height: 250, itemBuilder: (context, index) => postcardPlaceholders.elementAt(index), itemCount: postcardPlaceholders.length, ) _buildHeading('Your Last Postcards TBD'), _buildScrollList<Postcard>( context, 250, _recentPostcardStream(), PostcardTile.fromData), ], ), ), Loading @@ -71,22 +53,49 @@ class HomePage extends StatelessWidget { ), ); Widget _buildCardCarousel( BuildContext context, { required double height, required Widget Function(BuildContext, int) itemBuilder, required int itemCount, }) => SizedBox( Widget _buildScrollList<T>(BuildContext context, double height, Stream<Iterable<T>> stream, Widget Function(T) builder) { return Container( height: height, width: MediaQuery.of(context).size.width, child: ListView.separated( itemBuilder: itemBuilder, child: StreamBuilderHandler( stream: stream, builder: (BuildContext context, data) { return ListView.separated( itemBuilder: (context, index) => builder(data.elementAt(index)), separatorBuilder: (context, index) => SizedBox( width: STANDARD_GAP, width: 12, ), itemCount: itemCount, itemCount: data.length, scrollDirection: Axis.horizontal, ); }), ); } Stream<List<Postcard>> _recentPostcardStream() { return postcardService.postcardDataStream.map((List<Postcard> postcards) { final recent = postcards .where((p) => (DateTime.now().millisecondsSinceEpoch - p.timestamp.millisecondsSinceEpoch) < 1800000) .toList(); recent.sort((a, b) => a.timestamp.compareTo(b.timestamp)); return recent; }); } Widget _stampBuilder(String url) { return Container( height: 220, width: 150, decoration: BoxDecoration( image: DecorationImage( image: NetworkImage(url), fit: BoxFit.contain, ), ), ); } }
lib/service/postcard_service.dart +3 −2 Original line number Diff line number Diff line Loading @@ -53,11 +53,12 @@ class PostcardService { ); } Stream<List<String>> get stampStream { Stream<Set<String>> get stampStream { return _postcards.stream.map((List<PostcardEntity> postcards) { postcards.sort((a, b) => a.timestamp.compareTo(b.timestamp)); return postcards .map((postcard) => postcard.stampPath) .toList(); .toSet(); }); } Loading