@@ -28,28 +28,31 @@ class FeedState extends AuthState {
28
28
/// [Skip if any duplicate tweet already present]
29
29
if (_tweetDetailModel.length == 0 ||
30
30
_tweetDetailModel.length > 0 &&
31
- ! _tweetDetailModel.any ((x) => x.key == model.key)) {
32
- _tweetDetailModel.add (model);
33
- notifyListeners ();
34
- }
31
+ ! _tweetDetailModel.any ((x) => x.key == model.key)) {
32
+ _tweetDetailModel.add (model);
33
+ notifyListeners ();
34
+ }
35
35
}
36
+
36
37
/// remove last tweet available from tweet detail page stack
37
38
void removeLastTweetDetail (String tweetKey) {
38
39
if (_tweetDetailModel != null && _tweetDetailModel.length > 0 ) {
39
40
_tweetDetailModel.removeWhere ((x) => x.key == tweetKey);
40
41
tweetReplyMap.removeWhere ((key, value) => key == tweetKey);
41
42
}
42
43
}
44
+
43
45
/// [clear all tweets] if any tweet present in tweet detail page or comment tweet
44
- void clearAllDetailAndReplyTweetStack (){
45
- if (_tweetDetailModel != null ){
46
+ void clearAllDetailAndReplyTweetStack () {
47
+ if (_tweetDetailModel != null ) {
46
48
_tweetDetailModel.clear ();
47
49
}
48
- if (tweetReplyMap != null ){
49
- tweetReplyMap.clear ();
50
- }
50
+ if (tweetReplyMap != null ) {
51
+ tweetReplyMap.clear ();
52
+ }
51
53
cprint ('Empty tweets from stack' );
52
54
}
55
+
53
56
/// contain tweet list for home page
54
57
List <FeedModel > get feedlist {
55
58
if (_feedlist == null ) {
@@ -66,6 +69,7 @@ class FeedState extends AuthState {
66
69
return List .from (_commentlist);
67
70
}
68
71
}
72
+
69
73
/// [Intitilise firebase Database]
70
74
Future <bool > databaseInit () {
71
75
try {
@@ -81,7 +85,8 @@ class FeedState extends AuthState {
81
85
return Future .value (false );
82
86
}
83
87
}
84
- /// get [Tweet list] from firebase realtime database
88
+
89
+ /// get [Tweet list] from firebase realtime database
85
90
void getDataFromDatabase () {
86
91
try {
87
92
isBusy = true ;
@@ -108,6 +113,7 @@ class FeedState extends AuthState {
108
113
cprint (error);
109
114
}
110
115
}
116
+
111
117
/// get [Tweet Detail] from firebase realtime database
112
118
void getpostDetailFromDatabase (String postID) {
113
119
try {
@@ -127,7 +133,7 @@ class FeedState extends AuthState {
127
133
// _tweetDetailModel = null;
128
134
}
129
135
}).then ((value) {
130
- _commentlist = List <FeedModel >();
136
+ _commentlist = List <FeedModel >();
131
137
if (_tweetDetail.replyTweetKeyList != null &&
132
138
_tweetDetail.replyTweetKeyList.length > 0 ) {
133
139
_tweetDetail.replyTweetKeyList.forEach ((x) {
@@ -148,25 +154,23 @@ class FeedState extends AuthState {
148
154
if (! _commentlist.any ((x) => x.key == key)) {
149
155
_commentlist.add (commentmodel);
150
156
}
151
- } else {
152
-
153
- }
157
+ } else {}
154
158
if (x == _tweetDetail.replyTweetKeyList.last) {
155
159
tweetReplyMap.putIfAbsent (postID, () => _commentlist);
156
160
notifyListeners ();
157
161
}
158
162
});
159
163
});
160
- }
161
- else {
164
+ } else {
162
165
tweetReplyMap.putIfAbsent (postID, () => _commentlist);
163
- notifyListeners ();
166
+ notifyListeners ();
164
167
}
165
168
});
166
169
} catch (error) {
167
170
cprint (error);
168
171
}
169
172
}
173
+
170
174
/// create [New Tweet]
171
175
createTweet (FeedModel model) {
172
176
/// Create feed in [Firebase database]
@@ -180,30 +184,65 @@ class FeedState extends AuthState {
180
184
isBusy = false ;
181
185
notifyListeners ();
182
186
}
187
+
183
188
/// [Delete tweet]
184
- deleteTweet (String tweetId, TweetType type) {
189
+ deleteTweet (String tweetId, TweetType type, { String parentkey} ) {
185
190
/// Delete feed in [Firebase database]
186
191
try {
187
- _database.reference ().child ('feed' ).child (tweetId).remove ().then ((_) {
188
- if (_feedlist.any ((x) => x.key == tweetId)) {
189
- if (_tweetDetailModel.last.imagePath != null &&
190
- _tweetDetailModel.last.imagePath.length > 0 ) {
191
- deleteFile (_tweetDetailModel.last.imagePath, 'feeds' );
192
- }
193
- _feedlist.removeWhere ((x) => x.key == tweetId);
194
- if (_feedlist.length == 0 ) {
195
- _feedlist = null ;
196
- }
197
- notifyListeners ();
198
- cprint ('Tweet deleted' );
192
+ _database.reference ().child ('feed' ).child (tweetId).remove ().then ((_) {
193
+ FeedModel deletedTweet;
194
+ if (_feedlist.any ((x) => x.key == tweetId)) {
195
+ /// Delete tweet if it is in home page tweet.
196
+ deletedTweet = _feedlist.firstWhere ((x) => x.key == tweetId);
197
+ _feedlist.remove (deletedTweet);
198
+ if (_feedlist.length == 0 ) {
199
+ _feedlist = null ;
199
200
}
200
- });
201
- _database.reference ().child ('comment' ).child (tweetId).remove ();
202
-
201
+ cprint ('Tweet deleted from home page tweet' );
202
+ }
203
+
204
+ /// Delete tweet if it is in nested tweet detail page
205
+ if (type == TweetType .Detail &&
206
+ _tweetDetailModel != null &&
207
+ _tweetDetailModel.length > 0 ) {
208
+ deletedTweet = _tweetDetailModel.firstWhere ((x) => x.key == tweetId);
209
+ _tweetDetailModel.remove (_tweetDetailModel);
210
+ if (_tweetDetailModel.length == 0 ) {
211
+ _tweetDetailModel = null ;
212
+ }
213
+
214
+ cprint ('Tweet deleted from nested tweet detail page tweet' );
215
+ }
216
+
217
+ /// Delete tweet if it is in nested tweet detail comment section page
218
+ if (parentkey != null &&
219
+ parentkey.isNotEmpty &&
220
+ tweetReplyMap != null &&
221
+ tweetReplyMap.length > 0 &&
222
+ tweetReplyMap.keys.any ((x) => x == parentkey)) {
223
+ // (type == TweetType.Reply || tweetReplyMap.length > 1) &&
224
+ deletedTweet =
225
+ tweetReplyMap[parentkey].firstWhere ((x) => x.key == tweetId);
226
+ tweetReplyMap[parentkey].remove (deletedTweet);
227
+ if (tweetReplyMap[parentkey].length == 0 ) {
228
+ tweetReplyMap[parentkey] = null ;
229
+ }
230
+ cprint (
231
+ 'Tweet deleted from nested ttweet detail comment section page' );
232
+ }
233
+
234
+ /// Delete tweet image from firebase if exist.
235
+ if (deletedTweet.imagePath != null &&
236
+ deletedTweet.imagePath.length > 0 ) {
237
+ deleteFile (deletedTweet.imagePath, 'feeds' );
238
+ }
239
+ notifyListeners ();
240
+ });
203
241
} catch (error) {
204
242
cprint (error);
205
243
}
206
244
}
245
+
207
246
/// upload [file] to firebase storage and return its path url
208
247
Future <String > uploadFile (File file) async {
209
248
try {
@@ -225,7 +264,8 @@ class FeedState extends AuthState {
225
264
return null ;
226
265
}
227
266
}
228
- /// [Delete file] from firebase storage
267
+
268
+ /// [Delete file] from firebase storage
229
269
Future <void > deleteFile (String url, String baseUrl) async {
230
270
try {
231
271
String filePath = url.replaceAll (
@@ -246,6 +286,7 @@ class FeedState extends AuthState {
246
286
cprint (error);
247
287
}
248
288
}
289
+
249
290
/// add [Like] to tweet
250
291
addLikeToComment ({String postId, FeedModel commentModel, String userId}) {
251
292
try {
@@ -278,6 +319,7 @@ class FeedState extends AuthState {
278
319
cprint (error);
279
320
}
280
321
}
322
+
281
323
/// [postId] is tweet id, [userId] is user's id
282
324
addLikeToTweet (FeedModel tweet, String userId) {
283
325
try {
@@ -307,17 +349,17 @@ class FeedState extends AuthState {
307
349
cprint ("[addLikeToTweet] $error " );
308
350
}
309
351
}
352
+
310
353
/// add [new comment tweet] to any tweet
311
354
addcommentToPost (String postId, FeedModel replyTweet) {
312
355
try {
313
356
isBusy = true ;
314
357
notifyListeners ();
315
358
if (postId != null ) {
316
359
FeedModel tweet = _feedlist.firstWhere ((x) => x.key == postId);
317
-
360
+
318
361
var json = replyTweet.toJson ();
319
362
_database.reference ().child ('feed' ).push ().set (json).then ((value) {
320
-
321
363
tweet.replyTweetKeyList.add (_feedlist.last.key);
322
364
_database.reference ().child ('feed' ).child (postId).set (tweet.toJson ());
323
365
});
@@ -341,25 +383,25 @@ class FeedState extends AuthState {
341
383
342
384
if (_tweetDetailModel != null && _tweetDetailModel.length > 0 ) {
343
385
if (_tweetDetailModel.any ((x) => x.key == model.key)) {
344
-
345
386
var oldEntry = _tweetDetailModel.singleWhere ((entry) {
346
- return entry.key == event.snapshot.key;
387
+ return entry.key == event.snapshot.key;
347
388
});
348
389
_tweetDetailModel[_tweetDetailModel.indexOf (oldEntry)] = model;
349
390
}
350
- if (tweetReplyMap != null && tweetReplyMap.length > 0 ){
351
- if (true ){
352
- var list = tweetReplyMap[model.parentkey];
353
- // var list = tweetReplyMap.values.firstWhere((x) => x.any((y) => y.key == model.key));
354
- if (list != null && list.length > 0 ){
355
- list.firstWhere ((x) => x.key == model.key).likeCount = model.likeCount;
356
- list. firstWhere ((x) => x.key == model.key).likeList = model.likeList ;
357
- }
358
- else {
359
- list = [];
360
- list. add (model) ;
361
- }
391
+ if (tweetReplyMap != null && tweetReplyMap.length > 0 ) {
392
+ if (true ) {
393
+ var list = tweetReplyMap[model.parentkey];
394
+ // var list = tweetReplyMap.values.firstWhere((x) => x.any((y) => y.key == model.key));
395
+ if (list != null && list.length > 0 ) {
396
+ list.firstWhere ((x) => x.key == model.key).likeCount =
397
+ model.likeCount ;
398
+ list. firstWhere ((x) => x.key == model.key).likeList =
399
+ model.likeList;
400
+ } else {
401
+ list = [] ;
402
+ list. add (model);
362
403
}
404
+ }
363
405
}
364
406
}
365
407
if (event.snapshot != null ) {
@@ -386,16 +428,15 @@ class FeedState extends AuthState {
386
428
}
387
429
388
430
_onCommentAdded (FeedModel tweet) {
389
- /// add [new tweet] comment to comment list
390
- if (tweetReplyMap != null && tweetReplyMap.length > 0 ){
391
- var list = tweetReplyMap[tweet.parentkey];
392
- if (list != null ){
393
- list.add (tweet);
394
- }
431
+ /// add [new tweet] comment to comment list
432
+ if (tweetReplyMap != null && tweetReplyMap.length > 0 ) {
433
+ var list = tweetReplyMap[tweet.parentkey];
434
+ if (list != null ) {
435
+ list.add (tweet);
436
+ }
395
437
}
396
- cprint ('Comment created' );
438
+ cprint ('Comment created' );
397
439
isBusy = false ;
398
440
notifyListeners ();
399
441
}
400
-
401
442
}
0 commit comments