mirror of
https://github.com/Iconica-Development/flutter_timeline.git
synced 2025-05-18 18:13:46 +02:00
feat: add options
This commit is contained in:
parent
9faca7cb99
commit
f0c1c265b3
24 changed files with 53 additions and 156 deletions
|
@ -42,7 +42,6 @@ class FirebaseCategoryRepository implements CategoryRepositoryInterface {
|
|||
);
|
||||
_categories.addAll(categories);
|
||||
} else {
|
||||
// Replace or update categories in the list while keeping the "All" category intact
|
||||
_categories
|
||||
..clear()
|
||||
..add(const TimelineCategory(key: null, title: "All"))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import "package:cloud_firestore/cloud_firestore.dart";
|
||||
import "package:firebase_auth/firebase_auth.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
import "package:cloud_firestore/cloud_firestore.dart";
|
||||
|
||||
class FirebaseUserRepository implements TimelineUserRepositoryInterface {
|
||||
final CollectionReference usersCollection =
|
||||
|
@ -42,7 +42,7 @@ class FirebaseUserRepository implements TimelineUserRepositoryInterface {
|
|||
toFirestore: (user, _) => user.toJson(),
|
||||
)
|
||||
.get();
|
||||
// print(userDoc.data()?.firstName);
|
||||
// print(userDoc.data()?.firstName);
|
||||
return userDoc.data();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ dependencies:
|
|||
cloud_firestore: ^5.4.4
|
||||
firebase_auth: ^5.3.1
|
||||
firebase_storage: ^12.3.2
|
||||
collection: ^1.18.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_iconica_analysis:
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'package:example/theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_timeline/flutter_timeline.dart';
|
||||
import 'package:timeline_repository_interface/timeline_repository_interface.dart';
|
||||
import 'package:intl/date_symbol_data_local.dart';
|
||||
|
||||
void main(List<String> args) {
|
||||
|
@ -25,106 +24,3 @@ class MyApp extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
// class Titje extends StatelessWidget {
|
||||
// const Titje({super.key, required this.initialCategory});
|
||||
// final String? initialCategory;
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return TimelineScreen(
|
||||
// onTapComments: (post) {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => Detail(
|
||||
// post: post,
|
||||
// timelineService: timelineService,
|
||||
// )));
|
||||
// },
|
||||
// onTapCreatePost: () {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => ChooseCategory(
|
||||
// timelineService: timelineService,
|
||||
// )));
|
||||
// },
|
||||
// currentUserId: "1",
|
||||
// options: TimelineOptions(),
|
||||
// timelineService: timelineService,
|
||||
// onTapPost: (post) {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => Detail(
|
||||
// post: post,
|
||||
// timelineService: timelineService,
|
||||
// )));
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// class Detail extends StatelessWidget {
|
||||
// const Detail({super.key, required this.post, required this.timelineService});
|
||||
|
||||
// final TimelinePost post;
|
||||
// final TimelineService timelineService;
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return TimelinePostDetailScreen(
|
||||
// onTapComments: (post) {},
|
||||
// onTapPost: (post) {},
|
||||
// post: post,
|
||||
// timelineService: timelineService,
|
||||
// options: TimelineOptions(),
|
||||
// currentUserId: "1");
|
||||
// }
|
||||
// }
|
||||
|
||||
// class ChooseCategory extends StatelessWidget {
|
||||
// const ChooseCategory({super.key, required this.timelineService});
|
||||
// final TimelineService timelineService;
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return TimelineChooseCategoryScreen(
|
||||
// options: TimelineOptions(),
|
||||
// timelineService: timelineService,
|
||||
// ontapCategory: (category) {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) =>
|
||||
// AddInformation(timelineService: timelineService)));
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// class AddInformation extends StatelessWidget {
|
||||
// const AddInformation({super.key, required this.timelineService});
|
||||
// final TimelineService timelineService;
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return TimelineAddPostInformationScreen(
|
||||
// timelineService: timelineService,
|
||||
// onTaponTapOverview: () {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => Overview(timelineService: timelineService)));
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// class Overview extends StatelessWidget {
|
||||
// const Overview({super.key, required this.timelineService});
|
||||
// final TimelineService timelineService;
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return TimelinePostOverview(
|
||||
// timelineService: timelineService,
|
||||
// options: TimelineOptions(),
|
||||
// onTapCreatePost: (post) {
|
||||
// Navigator.of(context).pushReplacement(MaterialPageRoute(
|
||||
// builder: (context) => Titje(initialCategory: post.category)));
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
|
|
@ -12,10 +12,7 @@ dependencies:
|
|||
flutter:
|
||||
sdk: flutter
|
||||
flutter_timeline:
|
||||
git:
|
||||
url: https://github.com/Iconica-Development/flutter_timeline
|
||||
ref: 6.0.0
|
||||
path: packages/flutter_timeline
|
||||
path: ../
|
||||
intl: 0.19.0
|
||||
dev_dependencies:
|
||||
flutter_lints: ^4.0.0
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
/// flutter_timeline library
|
||||
|
||||
// ignore_for_file: directives_ordering
|
||||
|
||||
library flutter_timeline;
|
||||
|
||||
/// userstory
|
||||
library;
|
||||
|
||||
export "src/flutter_timeline_navigator_userstory.dart";
|
||||
export "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class FlutterTimelineNavigatorUserstory extends StatefulWidget {
|
||||
const FlutterTimelineNavigatorUserstory({
|
||||
|
@ -38,20 +37,27 @@ class _FlutterTimelineNavigatorUserstoryState
|
|||
options: widget.options,
|
||||
onTapComments: (post) async {
|
||||
var currentUser = await timelineService.getCurrentUser();
|
||||
await _push(_timelinePostDetailScreenWidget(post, currentUser));
|
||||
|
||||
await widget.options.onTapComments?.call(post, currentUser) ??
|
||||
await _push(_timelinePostDetailScreenWidget(post, currentUser));
|
||||
},
|
||||
onTapCreatePost: () async {
|
||||
var selectedCategory = timelineService.getSelectedCategory();
|
||||
if (selectedCategory?.key != null) {
|
||||
await _push(_timelineAddpostInformationScreenWidget());
|
||||
if (widget.options.onTapCreatePost != null) {
|
||||
await widget.options.onTapCreatePost!(selectedCategory);
|
||||
} else {
|
||||
await _push(_timelineChooseCategoryScreenWidget());
|
||||
if (selectedCategory?.key != null) {
|
||||
await _push(_timelineAddpostInformationScreenWidget());
|
||||
} else {
|
||||
await _push(_timelineChooseCategoryScreenWidget());
|
||||
}
|
||||
}
|
||||
},
|
||||
onTapPost: (post) async {
|
||||
var currentUser = await timelineService.getCurrentUser();
|
||||
if (context.mounted)
|
||||
await _push(_timelinePostDetailScreenWidget(post, currentUser));
|
||||
await widget.options.onTapPost?.call(post, currentUser) ??
|
||||
await _push(_timelinePostDetailScreenWidget(post, currentUser));
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -71,7 +77,8 @@ class _FlutterTimelineNavigatorUserstoryState
|
|||
timelineService: timelineService,
|
||||
options: widget.options,
|
||||
ontapCategory: (category) async {
|
||||
await _push(_timelineAddpostInformationScreenWidget());
|
||||
await widget.options.onTapCategory?.call(category) ??
|
||||
await _push(_timelineAddpostInformationScreenWidget());
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -80,7 +87,8 @@ class _FlutterTimelineNavigatorUserstoryState
|
|||
timelineService: timelineService,
|
||||
options: widget.options,
|
||||
onTapOverview: () async {
|
||||
await _push(_timelinePostOverviewWidget());
|
||||
await widget.options.onTapOverview?.call() ??
|
||||
await _push(_timelinePostOverviewWidget());
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -88,12 +96,8 @@ class _FlutterTimelineNavigatorUserstoryState
|
|||
timelineService: timelineService,
|
||||
options: widget.options,
|
||||
onTapCreatePost: (post) async {
|
||||
await Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => _timelineScreenWidget(),
|
||||
),
|
||||
(route) => route.isFirst,
|
||||
);
|
||||
await widget.options.onTapCreatePostInOverview?.call(post) ??
|
||||
await _pushAndRemoveUntil(_timelineScreenWidget());
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -101,4 +105,11 @@ class _FlutterTimelineNavigatorUserstoryState
|
|||
await Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (context) => screen));
|
||||
}
|
||||
|
||||
Future<void> _pushAndRemoveUntil(Widget screen) async {
|
||||
await Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => screen),
|
||||
(route) => route.isFirst,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ import "package:flutter/material.dart";
|
|||
import "package:flutter_image_picker/flutter_image_picker.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:intl/intl.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelineOptions {
|
||||
const TimelineOptions({
|
||||
|
@ -30,6 +29,12 @@ class TimelineOptions {
|
|||
this.timelineScreenDrawer,
|
||||
this.timelineScreenAppBarBuilder,
|
||||
this.onCreatePost,
|
||||
this.onTapComments,
|
||||
this.onTapCreatePost,
|
||||
this.onTapPost,
|
||||
this.onTapCategory,
|
||||
this.onTapOverview,
|
||||
this.onTapCreatePostInOverview,
|
||||
});
|
||||
|
||||
// Builders
|
||||
|
@ -42,6 +47,12 @@ class TimelineOptions {
|
|||
|
||||
//general
|
||||
final TimelineTranslations translations;
|
||||
final Function(TimelinePost post, TimelineUser user)? onTapComments;
|
||||
final Function(TimelineCategory? category)? onTapCreatePost;
|
||||
final Function(TimelinePost post, TimelineUser user)? onTapPost;
|
||||
final Function(TimelineCategory? category)? onTapCategory;
|
||||
final Function()? onTapOverview;
|
||||
final Function(TimelinePost post)? onTapCreatePostInOverview;
|
||||
|
||||
// TimelinePostWidget
|
||||
final bool everyoneCanDelete;
|
||||
|
|
|
@ -2,9 +2,6 @@ import "dart:typed_data";
|
|||
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/image_picker.dart";
|
||||
import "package:flutter_timeline/src/widgets/post_info_textfield.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelineAddPostInformationScreen extends StatefulWidget {
|
||||
const TimelineAddPostInformationScreen({
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/post_info_textfield.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelineChooseCategoryScreen extends StatelessWidget {
|
||||
const TimelineChooseCategoryScreen({
|
||||
|
@ -99,7 +97,8 @@ class TimelineChooseCategoryScreen extends StatelessWidget {
|
|||
title: newCategoryController.text,
|
||||
),
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
if (context.mounted)
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_svg/svg.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/reaction_textfield.dart";
|
||||
import "package:flutter_timeline/src/widgets/timeline_post.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelinePostDetailScreen extends StatefulWidget {
|
||||
const TimelinePostDetailScreen({
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/timeline_post.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelinePostOverview extends StatefulWidget {
|
||||
const TimelinePostOverview({
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/src/widgets/category_widget.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
import "package:collection/collection.dart";
|
||||
|
||||
class CategoryList extends StatefulWidget {
|
||||
const CategoryList({
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import "package:cached_network_image/cached_network_image.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class CommentSection extends StatefulWidget {
|
||||
const CommentSection({
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/timeline_post.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class PostList extends StatelessWidget {
|
||||
const PostList({
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class MoreOptionsButton extends StatelessWidget {
|
||||
const MoreOptionsButton({
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class ReactionTextfield extends StatelessWidget {
|
||||
const ReactionTextfield({
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
import "package:cached_network_image/cached_network_image.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter_timeline/flutter_timeline.dart";
|
||||
import "package:flutter_timeline/src/widgets/comment_section.dart";
|
||||
import "package:flutter_timeline/src/widgets/post_more_options_widget.dart";
|
||||
import "package:flutter_timeline/src/widgets/tappable_image.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelinePostWidget extends StatefulWidget {
|
||||
const TimelinePostWidget({
|
||||
|
|
|
@ -24,6 +24,7 @@ dependencies:
|
|||
intl: 0.19.0
|
||||
flutter_svg: ^2.0.10+1
|
||||
dotted_border: ^2.1.0
|
||||
collection: ^1.18.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_iconica_analysis:
|
||||
|
|
|
@ -10,7 +10,7 @@ class LocalCategoryRepository implements CategoryRepositoryInterface {
|
|||
TimelineCategory? _selectedCategory;
|
||||
|
||||
@override
|
||||
Future<void> createCategory(TimelineCategory category) async{
|
||||
Future<void> createCategory(TimelineCategory category) async {
|
||||
_categories.add(category);
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ class LocalPostRepository implements PostRepositoryInterface {
|
|||
final StreamController<List<TimelinePost>> _postsController =
|
||||
BehaviorSubject<List<TimelinePost>>();
|
||||
|
||||
TimelinePost? _currentPost;
|
||||
late TimelinePost? _currentPost;
|
||||
|
||||
final jane = const TimelineUser(
|
||||
userId: "1",
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:timeline_repository_interface/src/interfaces/timeline_user_repository_interface.dart";
|
||||
import "package:timeline_repository_interface/src/models/timeline_user.dart";
|
||||
|
||||
|
@ -31,7 +32,7 @@ class LocalTimelineUserRepository implements TimelineUserRepositoryInterface {
|
|||
|
||||
@override
|
||||
Future<TimelineUser?> getUser(String userId) {
|
||||
// TODO: implement getUser
|
||||
throw UnimplementedError();
|
||||
var user = _users.firstWhereOrNull((element) => element.userId == userId);
|
||||
return Future.value(user);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import "dart:typed_data";
|
||||
import "package:timeline_repository_interface/src/local/local_timeline_user_repository.dart";
|
||||
import "package:timeline_repository_interface/timeline_repository_interface.dart";
|
||||
|
||||
class TimelineService {
|
||||
|
|
|
@ -11,6 +11,7 @@ dependencies:
|
|||
flutter:
|
||||
sdk: flutter
|
||||
rxdart: any
|
||||
collection: ^1.18.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_iconica_analysis:
|
||||
|
|
Loading…
Reference in a new issue