Skip to content

Commit

Permalink
🚧 Add bookmark to tweet
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAlphamerc committed Sep 25, 2021
1 parent a82da9b commit 86a1106
Show file tree
Hide file tree
Showing 8 changed files with 278 additions and 11 deletions.
34 changes: 34 additions & 0 deletions ios/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

/build
22 changes: 22 additions & 0 deletions lib/model/bookmarkModel.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class BookmarkModel {
String key;
String tweetId;
String createdAt;
BookmarkModel({
this.key,
this.tweetId,
this.createdAt,
});

factory BookmarkModel.fromJson(Map<dynamic, dynamic> json) => BookmarkModel(
key: json["tweetId"],
tweetId: json["tweetId"],
createdAt: json["created_at"],
);

Map<String, dynamic> toJson() => {
"key": key,
"tweetId": tweetId,
"created_at": createdAt,
};
}
89 changes: 89 additions & 0 deletions lib/state/bookmarkState.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import 'dart:async';

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter_twitter_clone/helper/shared_prefrence_helper.dart';
import 'package:flutter_twitter_clone/helper/utility.dart';
import 'package:flutter_twitter_clone/model/bookmarkModel.dart';
import 'package:flutter_twitter_clone/model/feedModel.dart';
import 'package:flutter_twitter_clone/ui/page/common/locator.dart';
import 'appState.dart';

class BookmarkState extends AppState {
BookmarkState() {
getDataFromDatabase();
}
List<FeedModel> _tweetList;
List<BookmarkModel> _bookmarkList;

addBookmarkTweetToList(BookmarkModel model) {
if (_bookmarkList == null) {
_bookmarkList = <BookmarkModel>[];
}

if (!_bookmarkList.any((element) => element.key == model.key)) {
_bookmarkList.add(model);
}
}

List<FeedModel> get tweetList => _tweetList;

/// get [Notification list] from firebase realtime database
void getDataFromDatabase() async {
String userId = await getIt<SharedPreferenceHelper>()
.getUserProfile()
.then((value) => value.userId);
try {
if (_tweetList != null) {
return;
}
loading = true;
kDatabase
.child('bookmark')
.child(userId)
.once()
.then((DataSnapshot snapshot) async {
if (snapshot.value != null) {
var map = snapshot.value as Map<dynamic, dynamic>;
if (map != null) {
map.forEach((bookmarkKey, value) {
var map = value as Map<dynamic, dynamic>;
var model = BookmarkModel.fromJson(map);
model.key = bookmarkKey;
addBookmarkTweetToList(model);
});
}

if (_bookmarkList != null) {
for (var bookmark in _bookmarkList) {
var tweet = await getTweetDetail(bookmark.tweetId);
if (tweet != null) {
if (_tweetList == null) {
_tweetList = <FeedModel>[];
}
_tweetList.add(tweet);
}
}
}
}
loading = false;
});
} catch (error) {
loading = false;
cprint(error, errorIn: 'getDataFromDatabase');
}
}

/// get `Tweet` present in notification
Future<FeedModel> getTweetDetail(String tweetId) async {
FeedModel _tweetDetail;
var snapshot = await kDatabase.child('tweet').child(tweetId).once();
if (snapshot.value != null) {
var map = snapshot.value as Map<dynamic, dynamic>;
_tweetDetail = FeedModel.fromJson(map);
_tweetDetail.key = snapshot.key;
return _tweetDetail;
} else {
return null;
}
}
}
11 changes: 11 additions & 0 deletions lib/state/feedState.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database/firebase_database.dart' as dabase;
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter_twitter_clone/helper/enum.dart';
import 'package:flutter_twitter_clone/helper/shared_prefrence_helper.dart';
import 'package:flutter_twitter_clone/model/feedModel.dart';
import 'package:flutter_twitter_clone/helper/utility.dart';
import 'package:flutter_twitter_clone/model/user.dart';
import 'package:flutter_twitter_clone/state/appState.dart';
import 'package:flutter_twitter_clone/ui/page/common/locator.dart';
import 'package:path/path.dart' as Path;
// import 'authState.dart';

Expand Down Expand Up @@ -452,6 +454,15 @@ class FeedState extends AppState {
notifyListeners();
}

/// Add Tweet in bookmark
Future addBookmark(String tweetId) async {
final pref = getIt<SharedPreferenceHelper>();
var userId = await pref.getUserProfile().then((value) => value.userId);
DatabaseReference dbReference =
kDatabase.child('bookmark').child(userId).child(tweetId);
await dbReference.set({"tweetId": tweetId});
}

/// Trigger when any tweet changes or update
/// When any tweet changes it update it in UI
/// No matter if Tweet is in home page or in detail page or in comment section.
Expand Down
78 changes: 78 additions & 0 deletions lib/ui/page/bookmark/bookmarkPage.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import 'package:flutter/material.dart';
import 'package:flutter_twitter_clone/helper/enum.dart';
import 'package:flutter_twitter_clone/model/feedModel.dart';
import 'package:flutter_twitter_clone/state/bookmarkState.dart';
import 'package:flutter_twitter_clone/ui/theme/theme.dart';
import 'package:flutter_twitter_clone/widgets/customAppBar.dart';
import 'package:flutter_twitter_clone/widgets/newWidget/emptyList.dart';
import 'package:flutter_twitter_clone/widgets/tweet/tweet.dart';
import 'package:provider/provider.dart';

class BookmarkPage extends StatelessWidget {
const BookmarkPage({Key key}) : super(key: key);

static Route<T> getRoute<T>() {
return MaterialPageRoute(
builder: (_) {
return Provider(
create: (_) => BookmarkState(),
child: ChangeNotifierProvider(
create: (BuildContext context) => BookmarkState(),
builder: (_, child) => BookmarkPage(),
),
);
},
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: TwitterColor.mystic,
appBar: CustomAppBar(
title: Text("Bookmark", style: TextStyles.titleStyle),
isBackButton: true,
),
body: BookmarkPageBody(),
);
}
}

class BookmarkPageBody extends StatelessWidget {
const BookmarkPageBody({Key key}) : super(key: key);

Widget _tweet(BuildContext context, FeedModel model) {
return Container(
color: Colors.white,
child: Tweet(
model: model,
type: TweetType.Tweet,
),
);
}

@override
Widget build(BuildContext context) {
var state = Provider.of<BookmarkState>(context);
var list = state.tweetList;
if (state.isbusy) {
return SizedBox(
height: 3,
child: LinearProgressIndicator(),
);
} else if (list == null || list.isEmpty) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 30),
child: EmptyList(
'No Bookmark available yet',
subTitle: 'When new bookmark found, they\'ll show up here.',
),
);
}
return ListView.builder(
addAutomaticKeepAlives: true,
itemBuilder: (context, index) => _tweet(context, list[index]),
itemCount: list.length,
);
}
}
10 changes: 9 additions & 1 deletion lib/ui/page/common/sidebar.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_twitter_clone/helper/constant.dart';
import 'package:flutter_twitter_clone/state/authState.dart';
import 'package:flutter_twitter_clone/ui/page/bookmark/bookmarkPage.dart';
import 'package:flutter_twitter_clone/ui/page/profile/follow/followerListPage.dart';
import 'package:flutter_twitter_clone/ui/page/profile/profilePage.dart';
import 'package:flutter_twitter_clone/ui/page/profile/qrCode/scanner.dart';
Expand Down Expand Up @@ -255,7 +256,14 @@ class _SidebarMenuState extends State<SidebarMenu> {
context, ProfilePage.getRoute(profileId: state.userId));
}),
_menuListRowButton('Lists', icon: AppIcon.lists),
_menuListRowButton('Bookmark', icon: AppIcon.bookmark),
_menuListRowButton(
'Bookmark',
icon: AppIcon.bookmark,
isEnable: true,
onPressed: () {
Navigator.push(context, BookmarkPage.getRoute());
},
),
_menuListRowButton('Moments', icon: AppIcon.moments),
_menuListRowButton('Fwitter ads', icon: AppIcon.twitterAds),
Divider(),
Expand Down
22 changes: 20 additions & 2 deletions lib/widgets/tweet/widgets/tweetBottomSheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ class TweetBottomSheet {
builder: (context) {
return Container(
padding: EdgeInsets.only(top: 5, bottom: 0),
height: 130,
height: 180,
width: context.width,
decoration: BoxDecoration(
color: Theme.of(context).bottomSheetTheme.backgroundColor,
Expand Down Expand Up @@ -515,6 +515,22 @@ class TweetBottomSheet {
),
),
),
SizedBox(height: 8),
_widgetBottomSheetRow(
context,
AppIcon.bookmark,
isEnable: true,
text: 'Bookmark',
onPressed: () async {
var state = Provider.of<FeedState>(context, listen: false);
await state.addBookmark(model.key);
Navigator.pop(context);
ScaffoldMessenger.maybeOf(context).showSnackBar(
SnackBar(content: Text("Bookmark saved!!")),
);
},
),
SizedBox(height: 8),
_widgetBottomSheetRow(
context,
AppIcon.link,
Expand All @@ -531,6 +547,7 @@ class TweetBottomSheet {
Utility.share(uri.toString(), subject: "Tweet");
},
),
SizedBox(height: 8),
_widgetBottomSheetRow(
context,
AppIcon.image,
Expand All @@ -554,7 +571,8 @@ class TweetBottomSheet {
socialMetaTagParameters: socialMetaTagParameters),
);
},
)
),
SizedBox(height: 12),
],
);
}
Expand Down
Loading

0 comments on commit 86a1106

Please sign in to comment.