diff --git a/README.md b/README.md index b63e679..b465115 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,39 @@ If you are going to use Firebase as the back-end of the Timeline, you should als ## How to use To use the module within your Flutter-application with predefined `Go_router` routes you should add the following: +Add go_router as dependency to your project. +Add the following configuration to your flutter_application: + +``` +List getTimelineStoryRoutes() => getTimelineStoryRoutes( + TimelineUserStoryConfiguration( + service: FirebaseTimelineService(), + userService: FirebaseUserService(), + userId: currentUserId, + categoriesBuilder: (context) {}, + optionsBuilder: (context) {}, + ), + ); +``` + +Add the `getTimelineStoryRoutes()` to your go_router routes like so: + +``` +final GoRouter _router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (BuildContext context, GoRouterState state) { + return const MyHomePage( + title: "home", + ); + }, + ), + ...getTimelineStoryRoutes() + ], +); +``` + To add the `TimelineScreen` add the following code: ```` diff --git a/packages/flutter_timeline/example/lib/post_screen.dart b/packages/flutter_timeline/example/lib/post_screen.dart index 3c5f05a..0bae2fb 100644 --- a/packages/flutter_timeline/example/lib/post_screen.dart +++ b/packages/flutter_timeline/example/lib/post_screen.dart @@ -25,7 +25,7 @@ class _PostScreenState extends State { options: TimelineOptions(), post: widget.post, onPostDelete: () { - print('delete post'); + Navigator.of(context).pop(); }, ), ); diff --git a/packages/flutter_timeline/lib/src/flutter_timeline_userstory.dart b/packages/flutter_timeline/lib/src/flutter_timeline_userstory.dart index ffb4612..5ca037f 100644 --- a/packages/flutter_timeline/lib/src/flutter_timeline_userstory.dart +++ b/packages/flutter_timeline/lib/src/flutter_timeline_userstory.dart @@ -16,8 +16,6 @@ List getTimelineStoryRoutes( GoRoute( path: TimelineUserStoryRoutes.timelineHome, pageBuilder: (context, state) { - var timelineFilter = - Container(); // TODO(anyone): create a filter widget var timelineScreen = TimelineScreen( userId: configuration.userId, onUserTap: (user) => configuration.onUserTap?.call(context, user), @@ -31,7 +29,6 @@ List getTimelineStoryRoutes( state: state, child: configuration.mainPageBuilder?.call( context, - timelineFilter, timelineScreen, ) ?? Scaffold( diff --git a/packages/flutter_timeline/lib/src/models/timeline_configuration.dart b/packages/flutter_timeline/lib/src/models/timeline_configuration.dart index 748f641..dc11f3f 100644 --- a/packages/flutter_timeline/lib/src/models/timeline_configuration.dart +++ b/packages/flutter_timeline/lib/src/models/timeline_configuration.dart @@ -25,7 +25,7 @@ class TimelineUserStoryConfiguration { final Function(BuildContext context, String userId)? onUserTap; - final Widget Function(BuildContext context, Widget filterBar, Widget child)? + final Widget Function(BuildContext context, Widget child)? mainPageBuilder; final Widget Function( diff --git a/packages/flutter_timeline_firebase/lib/flutter_timeline_firebase.dart b/packages/flutter_timeline_firebase/lib/flutter_timeline_firebase.dart index 8a0afdc..9ad1f86 100644 --- a/packages/flutter_timeline_firebase/lib/flutter_timeline_firebase.dart +++ b/packages/flutter_timeline_firebase/lib/flutter_timeline_firebase.dart @@ -7,3 +7,4 @@ library flutter_timeline_firebase; export 'src/config/firebase_timeline_options.dart'; export 'src/service/firebase_timeline_service.dart'; +export 'src/service/firebase_user_service.dart'; diff --git a/packages/flutter_timeline_firebase/lib/src/service/firebase_user_service.dart b/packages/flutter_timeline_firebase/lib/src/service/firebase_user_service.dart new file mode 100644 index 0000000..fb1da17 --- /dev/null +++ b/packages/flutter_timeline_firebase/lib/src/service/firebase_user_service.dart @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2023 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_timeline_firebase/src/config/firebase_timeline_options.dart'; +import 'package:flutter_timeline_firebase/src/models/firebase_user_document.dart'; +import 'package:flutter_timeline_interface/flutter_timeline_interface.dart'; + +class FirebaseUserService implements TimelineUserService { + FirebaseUserService({ + FirebaseApp? app, + options = const FirebaseTimelineOptions(), + }) { + var appInstance = app ?? Firebase.app(); + _db = FirebaseFirestore.instanceFor(app: appInstance); + _options = options; + } + + late FirebaseFirestore _db; + late FirebaseTimelineOptions _options; + + final Map _users = {}; + + CollectionReference get _userCollection => _db + .collection(_options.usersCollectionName) + .withConverter( + fromFirestore: (snapshot, _) => FirebaseUserDocument.fromJson( + snapshot.data()!, + snapshot.id, + ), + toFirestore: (user, _) => user.toJson(), + ); + @override + Future getUser(String userId) async { + if (_users.containsKey(userId)) { + return _users[userId]!; + } + var data = (await _userCollection.doc(userId).get()).data(); + + var user = data == null + ? TimelinePosterUserModel(userId: userId) + : TimelinePosterUserModel( + userId: userId, + firstName: data.firstName, + lastName: data.lastName, + imageUrl: data.imageUrl, + ); + + _users[userId] = user; + + return user; + } +}