From 7782cc1f2dade4888cbe9c4ce7b69da5c17946cf Mon Sep 17 00:00:00 2001 From: Ahmed Fawzy <99263226+belfooz@users.noreply.github.com> Date: Fri, 23 Dec 2022 21:01:21 +0200 Subject: [PATCH 1/3] Add files via upload --- pubspec.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index bd6b0d2f..d785e900 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,9 @@ dependencies: responsive_sizer: ^3.1.1 intl: ^0.17.0 provider: ^6.0.3 + animated_tree_view: ^1.0.0 + buttons_tabbar: ^1.3.6 + flutter_staggered_grid_view: ^0.6.2 mockito: ^5.3.2 build_runner: ^2.3.2 dartdoc: ^6.1.2 @@ -87,9 +90,8 @@ dependencies: url: https://github.com/Amr146/link_preview_generator.git expandable_page_view: ^1.0.17 flutter_html: ^2.1.1 - animated_tree_view: ^1.0.0 - buttons_tabbar: ^1.3.6 - flutter_staggered_grid_view: ^0.6.2 + responsive_framework: ^0.2.0 + device_preview: ^1.1.0 dev_dependencies: test_cov_console: ^0.2.2 @@ -226,6 +228,7 @@ flutter: - assets/images/up-arrow.png - assets/images/default-img.png - assets/images/reddit.png + - assets/images/ # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg @@ -253,4 +256,7 @@ flutter: # weight: 700 # # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages \ No newline at end of file + # see https://flutter.dev/custom-fonts/#from-packages + + + From fb4dc9c46eb5586683e9830da9a2808b4194553e Mon Sep 17 00:00:00 2001 From: Ahmed Fawzy <99263226+belfooz@users.noreply.github.com> Date: Fri, 23 Dec 2022 21:03:28 +0200 Subject: [PATCH 2/3] Add files via upload --- lib/home/controller/home_controller.dart | 202 ++--- lib/home/models/flairs.dart | 62 +- lib/home/models/test_post_model.dart | 448 ++++----- lib/home/screens/all.dart | 850 +++++++++++------- lib/home/screens/history.dart | 471 +++++----- lib/home/screens/home_layout.dart | 383 ++++++-- lib/home/screens/saved.dart | 138 +-- lib/home/screens/saved_comments.dart | 177 ++-- lib/home/screens/saved_posts.dart | 171 ++-- lib/home/widgets/buttom_nav_bar.dart | 5 +- lib/home/widgets/comment_layout.dart | 20 +- .../container_in_recently_visited.dart | 96 +- lib/home/widgets/custom_upper_bar.dart | 371 ++++++++ lib/home/widgets/end_drawer.dart | 309 +++---- lib/home/widgets/new_drawer.dart | 2 +- lib/home/widgets/recently_visited_list.dart | 148 +-- 16 files changed, 2336 insertions(+), 1517 deletions(-) create mode 100644 lib/home/widgets/custom_upper_bar.dart diff --git a/lib/home/controller/home_controller.dart b/lib/home/controller/home_controller.dart index f6d30f0f..b1d59cc5 100644 --- a/lib/home/controller/home_controller.dart +++ b/lib/home/controller/home_controller.dart @@ -1,41 +1,47 @@ +import 'dart:collection'; +import 'dart:io'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; +import 'package:post/create_community/screens/post.dart'; import 'package:post/createpost/model/subreddits_of_user.dart'; import 'package:post/myprofile/models/myprofile_data.dart'; import 'package:post/networks/const_endpoint_data.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../comments/models/comment_model.dart'; +import '../../createpost/controllers/posts_controllers.dart'; import '../../networks/dio_client.dart'; import '../../post/models/post_model.dart'; class HomeController extends GetxController with StateMixin> { - RxString sortHistoryBy = "upvoted".obs; - RxString sortHomePostsBy = "best".obs; - RxString sortAllBy = "hot".obs; - - Rx allIcon = Icons.local_fire_department_rounded.obs; - RxInt pageNumber = 1.obs; - List homePosts = [].obs; - List allPosts = [].obs; - List userSavedPosts = [].obs; - List userSavedComments = [].obs; + RxString sortHistoryBy="upvoted".obs; + RxString sortHomePostsBy="best".obs; + RxString sortAllBy="hot".obs; + + RxallIcon=Icons.local_fire_department_rounded.obs; + RxInt pageNumber=1.obs; + ListhomePosts=[].obs; + ListallPosts=[].obs; + ListuserSavedPosts=[].obs; + ListuserSavedComments=[].obs; // ListupvotedPosts=[].obs; // ListdownvotedPosts=[].obs; // ListhiddenPosts=[].obs; - List historyPosts = [].obs; - RxBool isRecentlyVisitedDrawer = false.obs; - List recentlyVisited = [].obs; + ListhistoryPosts=[].obs; + RxBool isRecentlyVisitedDrawer=false.obs; + List recentlyVisited = [ + ].obs; //ListmyCommunities=[].obs; List following = [].obs; RxBool isRecentlyVisitedPannelExpanded = true.obs; RxBool isModeratingPannelExpanded = true.obs; RxBool isFollowingPannelExpanded = true.obs; RxBool isYourCommunitiesPannelExpanded = true.obs; - MyProfileData? myProfile; + MyProfileData? myProfile ; - ///////// for scrol in home////////////////////////// - ScrollController myScroll = ScrollController(); + ///////// for scrol in home////////////////////////// + ScrollController myScroll =ScrollController(); /// true when posts are loading. RxBool isLoading = false.obs; @@ -43,25 +49,22 @@ class HomeController extends GetxController with StateMixin> { /// true when error occurred RxBool error = false.obs; ///////////////////////for in all////////////// - ScrollController myScrollAll = ScrollController(); - RxInt pageNumberAll = 1.obs; - + ScrollController myScrollAll =ScrollController(); +RxInt pageNumberAll=1.obs; /// true when posts are loading. RxBool isLoadingAll = false.obs; /// true when error occurred RxBool errorAll = false.obs; //////History////////////// - RxInt pageNumberHistory = 1.obs; - + RxInt pageNumberHistory=1.obs; /// true when posts are loading. RxBool isLoadingHistory = false.obs; /// true when error occurred RxBool errorHistory = false.obs; //////////////SAVED///////////// - RxInt pageNumberSaved = 1.obs; - + RxInt pageNumberSaved=1.obs; /// true when posts are loading. RxBool isLoadingSaved = false.obs; @@ -69,20 +72,19 @@ class HomeController extends GetxController with StateMixin> { RxBool errorSaved = false.obs; //////////////SAVEDCOMMENTS///////////// - RxInt pageNumberComment = 1.obs; - + RxInt pageNumberComment=1.obs; /// true when posts are loading. RxBool isLoadingCommetns = false.obs; /// true when error occurred RxBool errorComment = false.obs; + @override void onInit() { getInfoOfMe(); super.onInit(); } - Future getInfoOfMe() async { try { final prefs = await SharedPreferences.getInstance(); @@ -92,106 +94,111 @@ class HomeController extends GetxController with StateMixin> { myProfile = MyProfileData.fromJson(response.data['user']); }); } catch (error) { - print( - "there is an error in fetching the data of my profile the error is -> $error"); + print("there is an error in fetching the data of my profile the error is -> $error"); } } - - Future getSavedPosts() async { + Future getSavedPosts({required int p,}) async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - final response = await DioClient.get( - path: '/users/saved?page=${pageNumberSaved}&limit=20', + final response =await DioClient.get( + path:'/users/saved?page=${p}&limit=20', ); - if (response.statusCode == 200) { - for (var post in response.data['savedPosts']) { - PostModel temp = PostModel(); + if(response.statusCode==200) + { + for (var post in response.data['savedPosts']) + { + PostModel temp =PostModel(); await temp.fromJson(post); userSavedPosts.add(temp); } - } else { + } + else { await showToast(response.statusMessage.toString()); - errorSaved.value = true; + errorSaved.value=true; } - isLoadingSaved.value = false; + isLoadingSaved.value=false; } catch (error) { print("error in fetching history posts $error"); change([], status: RxStatus.error(error.toString())); } } - - Future getSavedComments() async { + Future getSavedComments({required int p}) async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - final response = await DioClient.get( - path: '/users/saved?page=${pageNumberComment}&limit=20', + final response =await DioClient.get( + path:'/users/saved?page=${p}&limit=20', ); - if (response.statusCode == 200) { - for (var comment in response.data['savedComments']) { + if(response.statusCode==200) + { + for (var comment in response.data['savedComments']) + { userSavedComments.add(CommentModel.fromJson(comment)); } - } else { + } + else { await showToast(response.statusMessage.toString()); - errorComment.value = true; + errorComment.value=true; } - isLoadingCommetns.value = false; + isLoadingCommetns.value=false; } catch (error) { print("error in fetching saved comments $error"); change([], status: RxStatus.error(error.toString())); } } - - Future getHistory() async { + Future getHistory({required String sort,required int p}) async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - final response = await DioClient.get( - path: '/users/${sortHistoryBy}?page=${pageNumberHistory}&limit=20', + final response =await DioClient.get( + path:'/users/${sort}?page=${p}&limit=20', ); - if (response.statusCode == 200) { - for (var post in response.data['posts']) { - PostModel temp = PostModel(); + if(response.statusCode==200) + { + for (var post in response.data['posts']) + { + PostModel temp =PostModel(); await temp.fromJson(post); historyPosts.add(temp); } - } else { + } + else { await showToast(response.statusMessage.toString()); - errorHistory.value = true; + errorHistory.value=true; } - isLoadingHistory.value = false; + isLoadingHistory.value=false; } catch (error) { print("error in fetching history posts $error"); change([], status: RxStatus.error(error.toString())); } } - - Future getPosts() async { - isLoading.value = true; - error.value = false; + Future getPosts({required String sort,required int p}) async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - final response = await DioClient.get( - path: '/users/${sortHomePostsBy}?page=${pageNumberAll}&limit=20', + final response =await DioClient.get( + path:'/users/${sort}?page=${p}&limit=20', ); - if (response.statusCode == 200) { - for (var post in response.data['data']) { - PostModel temp = PostModel(); - await temp.fromJson(post); - homePosts.add(temp); + if(response.statusCode==200) + { + for (var post in response.data['data']) + { + PostModel temp =PostModel(); + await temp.fromJson(post); + homePosts.add(temp); + } + // response.data["data"].forEach((value1) async{ + // PostModel temp =PostModel(); + // await temp.fromJson(value1); + // homePosts.add(temp); + // }); } - // response.data["data"].forEach((value1) async{ - // PostModel temp =PostModel(); - // await temp.fromJson(value1); - // homePosts.add(temp); - // }); - } else { + else { await showToast(response.statusMessage.toString()); - error.value = true; + error.value=true; } - isLoading.value = false; + isLoading.value=false; print("the length of returned list in home is ${homePosts.length}"); print("${homePosts[0]}"); } catch (error) { @@ -199,41 +206,29 @@ class HomeController extends GetxController with StateMixin> { change([], status: RxStatus.error(error.toString())); } } - - Future getPostsInAll() async { + Future getPostsInAll({required String sort,required int p}) async { // isLoading.value=true; // error.value=false; final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - final response = await DioClient.get( - path: '/users/${sortAllBy}?page=${pageNumber}&limit=20', + final response =await DioClient.get( + path:'/users/${sort}?page=${p}&limit=20', ); - // .then((value) { - // print(value); - // // List data = value.data.map((e) => PostModel.fromJson(value)); - // // change(data, status: RxStatus.success()); - // value.data["data"].forEach((value1){ - // homePosts.add(PostModel.fromJson(value1)); - // }); - // }); - - if (response.statusCode == 200) { - for (var post in response.data['data']) { - PostModel temp = PostModel(); - await temp.fromJson(post); - allPosts.add(temp); - } - // response.data["data"].forEach((value1) async{ - // PostModel temp =PostModel(); - // await temp.fromJson(value1); - // allPosts.add(temp); - // }); - } else { + if(response.statusCode==200) + { + for (var post in response.data['data']) + { + PostModel temp =PostModel(); + await temp.fromJson(post); + allPosts.add(temp); + } + } + else { await showToast(response.statusMessage.toString()); - error.value = true; + error.value=true; } - isLoading.value = false; + isLoading.value=false; print("the length of returned list in all is ${homePosts.length}"); print("${homePosts[0]}"); } catch (error) { @@ -241,7 +236,6 @@ class HomeController extends GetxController with StateMixin> { change([], status: RxStatus.error(error.toString())); } } - Future showToast(final String msg) async { await Fluttertoast.showToast( msg: msg, diff --git a/lib/home/models/flairs.dart b/lib/home/models/flairs.dart index 099dc044..e87a3b1d 100644 --- a/lib/home/models/flairs.dart +++ b/lib/home/models/flairs.dart @@ -1,32 +1,32 @@ -class FlairModel { - String? sId; - String? text; - String? backgroundColor; - String? textColor; - String? permissions; - - FlairModel( - {this.sId, - this.text, - this.backgroundColor, - this.textColor, - this.permissions}); - - FlairModel.fromJson(Map json) { - sId = json['_id']; - text = json['text']; - backgroundColor = json['backgroundColor']; - textColor = json['textColor']; - permissions = json['permissions']; - } - - Map toJson() { - final Map data = new Map(); - data['_id'] = this.sId; - data['text'] = this.text; - data['backgroundColor'] = this.backgroundColor; - data['textColor'] = this.textColor; - data['permissions'] = this.permissions; - return data; - } +class FlairModel { + String? sId; + String? text; + String? backgroundColor; + String? textColor; + String? permissions; + + FlairModel( + {this.sId, + this.text, + this.backgroundColor, + this.textColor, + this.permissions}); + + FlairModel.fromJson(Map json) { + sId = json['_id']; + text = json['text']; + backgroundColor = json['backgroundColor']; + textColor = json['textColor']; + permissions = json['permissions']; + } + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + data['text'] = this.text; + data['backgroundColor'] = this.backgroundColor; + data['textColor'] = this.textColor; + data['permissions'] = this.permissions; + return data; + } } \ No newline at end of file diff --git a/lib/home/models/test_post_model.dart b/lib/home/models/test_post_model.dart index 55c0f9b0..535885bf 100644 --- a/lib/home/models/test_post_model.dart +++ b/lib/home/models/test_post_model.dart @@ -1,225 +1,225 @@ -class Data { - String? sId; - Author? author; - String? ownerType; - Owner? owner; - List? replies; - FlairId? flairId; - String? flairText; - String? sharedFrom; - String? title; - String? kind; - String? text; - List? images; - String? video; - String? createdAt; - bool? locked; - bool? isDeleted; - bool? sendReplies; - bool? nsfw; - bool? spoiler; - int? votes; - int? views; - int? commentCount; - int? shareCount; - String? suggestedSort; - bool? scheduled; - int? sortOnHot; - int? sortOnBest; - bool? isSpam; - String? url; - bool? isSaved; - int? postVoteStatus; - - Data( - {this.sId, - this.author, - this.ownerType, - this.owner, - this.replies, - this.flairId, - this.flairText, - this.sharedFrom, - this.title, - this.kind, - this.text, - this.images, - this.video, - this.createdAt, - this.locked, - this.isDeleted, - this.sendReplies, - this.nsfw, - this.spoiler, - this.votes, - this.views, - this.commentCount, - this.shareCount, - this.suggestedSort, - this.scheduled, - this.sortOnHot, - this.sortOnBest, - this.isSpam, - this.url, - this.isSaved, - this.postVoteStatus}); - - Data.fromJson(Map json) { - sId = json['_id']; - author = - json['author'] != null ? new Author.fromJson(json['author']) : null; - ownerType = json['ownerType']; - owner = json['owner'] != null ? new Owner.fromJson(json['owner']) : null; - replies = json['replies'].cast(); - flairId = - json['flairId'] != null ? new FlairId.fromJson(json['flairId']) : null; - flairText = json['flairText']; - sharedFrom = json['sharedFrom']; - title = json['title']; - kind = json['kind']; - text = json['text']; - // if (json['images'] != null) { - // images = []; - // json['images'].forEach((v) { - // images!.add(new Null.fromJson(v)); - // }); - // } - video = json['video']; - createdAt = json['createdAt']; - locked = json['locked']; - isDeleted = json['isDeleted']; - sendReplies = json['sendReplies']; - nsfw = json['nsfw']; - spoiler = json['spoiler']; - votes = json['votes']; - views = json['views']; - commentCount = json['commentCount']; - shareCount = json['shareCount']; - suggestedSort = json['suggestedSort']; - scheduled = json['scheduled']; - sortOnHot = json['sortOnHot']; - sortOnBest = json['sortOnBest']; - isSpam = json['isSpam']; - url = json['url']; - isSaved = json['isSaved']; - postVoteStatus = json['postVoteStatus']; - } - - Map toJson() { - final Map data = new Map(); - data['_id'] = this.sId; - if (this.author != null) { - data['author'] = this.author!.toJson(); - } - data['ownerType'] = this.ownerType; - if (this.owner != null) { - data['owner'] = this.owner!.toJson(); - } - data['replies'] = this.replies; - if (this.flairId != null) { - data['flairId'] = this.flairId!.toJson(); - } - data['flairText'] = this.flairText; - data['sharedFrom'] = this.sharedFrom; - data['title'] = this.title; - data['kind'] = this.kind; - data['text'] = this.text; - // if (this.images != null) { - // data['images'] = this.images!.map((v) => v.toJson()).toList(); - // } - data['video'] = this.video; - data['createdAt'] = this.createdAt; - data['locked'] = this.locked; - data['isDeleted'] = this.isDeleted; - data['sendReplies'] = this.sendReplies; - data['nsfw'] = this.nsfw; - data['spoiler'] = this.spoiler; - data['votes'] = this.votes; - data['views'] = this.views; - data['commentCount'] = this.commentCount; - data['shareCount'] = this.shareCount; - data['suggestedSort'] = this.suggestedSort; - data['scheduled'] = this.scheduled; - data['sortOnHot'] = this.sortOnHot; - data['sortOnBest'] = this.sortOnBest; - data['isSpam'] = this.isSpam; - data['url'] = this.url; - data['isSaved'] = this.isSaved; - data['postVoteStatus'] = this.postVoteStatus; - return data; - } -} - -class Author { - String? sId; - String? name; - - Author({this.sId, this.name}); - - Author.fromJson(Map json) { - sId = json['_id']; - name = json['name']; - } - - Map toJson() { - final Map data = new Map(); - data['_id'] = this.sId; - data['name'] = this.name; - return data; - } -} - -class Owner { - String? sId; - String? name; - String? icon; - - Owner({this.sId, this.name, this.icon}); - - Owner.fromJson(Map json) { - sId = json['_id']; - name = json['name']; - icon = json['icon']; - } - - Map toJson() { - final Map data = new Map(); - data['_id'] = this.sId; - data['name'] = this.name; - data['icon'] = this.icon; - return data; - } -} - -class FlairId { - String? sId; - String? text; - String? backgroundColor; - String? textColor; - String? permissions; - - FlairId( - {this.sId, - this.text, - this.backgroundColor, - this.textColor, - this.permissions}); - - FlairId.fromJson(Map json) { - sId = json['_id']; - text = json['text']; - backgroundColor = json['backgroundColor']; - textColor = json['textColor']; - permissions = json['permissions']; - } - - Map toJson() { - final Map data = new Map(); - data['_id'] = this.sId; - data['text'] = this.text; - data['backgroundColor'] = this.backgroundColor; - data['textColor'] = this.textColor; - data['permissions'] = this.permissions; - return data; - } +class Data { + String? sId; + Author? author; + String? ownerType; + Owner? owner; + List? replies; + FlairId? flairId; + String? flairText; + String? sharedFrom; + String? title; + String? kind; + String? text; + List? images; + String? video; + String? createdAt; + bool? locked; + bool? isDeleted; + bool? sendReplies; + bool? nsfw; + bool? spoiler; + int? votes; + int? views; + int? commentCount; + int? shareCount; + String? suggestedSort; + bool? scheduled; + int? sortOnHot; + int? sortOnBest; + bool? isSpam; + String? url; + bool? isSaved; + int? postVoteStatus; + + Data( + {this.sId, + this.author, + this.ownerType, + this.owner, + this.replies, + this.flairId, + this.flairText, + this.sharedFrom, + this.title, + this.kind, + this.text, + this.images, + this.video, + this.createdAt, + this.locked, + this.isDeleted, + this.sendReplies, + this.nsfw, + this.spoiler, + this.votes, + this.views, + this.commentCount, + this.shareCount, + this.suggestedSort, + this.scheduled, + this.sortOnHot, + this.sortOnBest, + this.isSpam, + this.url, + this.isSaved, + this.postVoteStatus}); + + Data.fromJson(Map json) { + sId = json['_id']; + author = + json['author'] != null ? new Author.fromJson(json['author']) : null; + ownerType = json['ownerType']; + owner = json['owner'] != null ? new Owner.fromJson(json['owner']) : null; + replies = json['replies'].cast(); + flairId = + json['flairId'] != null ? new FlairId.fromJson(json['flairId']) : null; + flairText = json['flairText']; + sharedFrom = json['sharedFrom']; + title = json['title']; + kind = json['kind']; + text = json['text']; + // if (json['images'] != null) { + // images = []; + // json['images'].forEach((v) { + // images!.add(new Null.fromJson(v)); + // }); + // } + video = json['video']; + createdAt = json['createdAt']; + locked = json['locked']; + isDeleted = json['isDeleted']; + sendReplies = json['sendReplies']; + nsfw = json['nsfw']; + spoiler = json['spoiler']; + votes = json['votes']; + views = json['views']; + commentCount = json['commentCount']; + shareCount = json['shareCount']; + suggestedSort = json['suggestedSort']; + scheduled = json['scheduled']; + sortOnHot = json['sortOnHot']; + sortOnBest = json['sortOnBest']; + isSpam = json['isSpam']; + url = json['url']; + isSaved = json['isSaved']; + postVoteStatus = json['postVoteStatus']; + } + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + if (this.author != null) { + data['author'] = this.author!.toJson(); + } + data['ownerType'] = this.ownerType; + if (this.owner != null) { + data['owner'] = this.owner!.toJson(); + } + data['replies'] = this.replies; + if (this.flairId != null) { + data['flairId'] = this.flairId!.toJson(); + } + data['flairText'] = this.flairText; + data['sharedFrom'] = this.sharedFrom; + data['title'] = this.title; + data['kind'] = this.kind; + data['text'] = this.text; + // if (this.images != null) { + // data['images'] = this.images!.map((v) => v.toJson()).toList(); + // } + data['video'] = this.video; + data['createdAt'] = this.createdAt; + data['locked'] = this.locked; + data['isDeleted'] = this.isDeleted; + data['sendReplies'] = this.sendReplies; + data['nsfw'] = this.nsfw; + data['spoiler'] = this.spoiler; + data['votes'] = this.votes; + data['views'] = this.views; + data['commentCount'] = this.commentCount; + data['shareCount'] = this.shareCount; + data['suggestedSort'] = this.suggestedSort; + data['scheduled'] = this.scheduled; + data['sortOnHot'] = this.sortOnHot; + data['sortOnBest'] = this.sortOnBest; + data['isSpam'] = this.isSpam; + data['url'] = this.url; + data['isSaved'] = this.isSaved; + data['postVoteStatus'] = this.postVoteStatus; + return data; + } +} + +class Author { + String? sId; + String? name; + + Author({this.sId, this.name}); + + Author.fromJson(Map json) { + sId = json['_id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + data['name'] = this.name; + return data; + } +} + +class Owner { + String? sId; + String? name; + String? icon; + + Owner({this.sId, this.name, this.icon}); + + Owner.fromJson(Map json) { + sId = json['_id']; + name = json['name']; + icon = json['icon']; + } + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + data['name'] = this.name; + data['icon'] = this.icon; + return data; + } +} + +class FlairId { + String? sId; + String? text; + String? backgroundColor; + String? textColor; + String? permissions; + + FlairId( + {this.sId, + this.text, + this.backgroundColor, + this.textColor, + this.permissions}); + + FlairId.fromJson(Map json) { + sId = json['_id']; + text = json['text']; + backgroundColor = json['backgroundColor']; + textColor = json['textColor']; + permissions = json['permissions']; + } + + Map toJson() { + final Map data = new Map(); + data['_id'] = this.sId; + data['text'] = this.text; + data['backgroundColor'] = this.backgroundColor; + data['textColor'] = this.textColor; + data['permissions'] = this.permissions; + return data; + } } \ No newline at end of file diff --git a/lib/home/screens/all.dart b/lib/home/screens/all.dart index 990a6eb4..f731bf42 100644 --- a/lib/home/screens/all.dart +++ b/lib/home/screens/all.dart @@ -1,305 +1,545 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:post/home/widgets/buttom_nav_bar.dart'; -import 'package:responsive_sizer/responsive_sizer.dart'; -import '../../icons/icon_broken.dart'; -import '../../post/widgets/post_list.dart'; -import '../../widgets/loading_reddit.dart'; -import '../controller/home_controller.dart'; - -class All extends StatefulWidget { - const All({Key? key}) : super(key: key); - @override - State createState() => _AllState(); -} - -class _AllState extends State with TickerProviderStateMixin { - final HomeController controller = Get.put(HomeController()); - late AnimationController loadingSpinnerAnimationController; - @override - void initState() { - super.initState(); - loadingSpinnerAnimationController = - AnimationController(duration: const Duration(seconds: 2), vsync: this); - loadingSpinnerAnimationController.repeat(); - if (controller.allPosts.isEmpty) { - controller.getPostsInAll(); - } - } - - void dispose() { - loadingSpinnerAnimationController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Obx( - () => Scaffold( - bottomNavigationBar: const buttomNavBar( - fromProfile: 0, - icon: '', - nameOfSubreddit: '', - x: 1, - ), - backgroundColor: Colors.grey[300], - appBar: AppBar( - elevation: 1, - leading: IconButton( - icon: const Icon(IconBroken.Arrow___Left_2), - onPressed: () { - Get.back(); - }, - ), - title: const Text( - "All", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w700), - ), - ), - body: RefreshIndicator( - backgroundColor: Colors.white, - color: Colors.blue[900], - onRefresh: () async { - controller.allPosts.clear(); - controller.pageNumberAll.value = 1; - controller.pageNumber.update((val) {}); - controller.getPostsInAll(); - controller.update(); - }, - child: controller.isLoadingAll.value - ? Center( - child: CircularProgressIndicator( - valueColor: loadingSpinnerAnimationController.drive( - ColorTween( - //begin: Colors.blueAccent, - end: Colors.blueAccent, - ), - ), - ), - ) - : controller.error.value - ? ListView( - children: const [ - Padding( - padding: EdgeInsets.all(150), - child: Text("Unexpected Error Try Again.."), - ), - ], - ) - : controller.allPosts.isEmpty - ? LoadingReddit() - : PostList( - userName: '${controller.myProfile!.userName}', - updateData: () { - controller.pageNumberAll.value++; - controller.pageNumberAll.update((val) {}); - controller.getPostsInAll(); - }, - data: controller.allPosts, - topOfTheList: Padding( - padding: const EdgeInsetsDirectional.only( - start: 15, top: 5), - child: Row( - children: [ - Icon( - controller.allIcon.value, - color: Colors.grey, - size: 20, - ), - ElevatedButton.icon( - onPressed: () { - showModalBottomSheet( - backgroundColor: Colors.transparent, - context: context, - builder: (context) => GestureDetector( - onTap: () {}, - child: Container( - padding: - const EdgeInsets.all(30), - height: 30.h, - width: 30.w, - margin: const EdgeInsets.all(5), - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular( - 5), - color: Colors.white), - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisSize: - MainAxisSize.min, - children: [ - const Text('SORT POSTS BY', - style: TextStyle( - color: Colors.grey, - )), - const Divider( - height: 5, - ), - ListTile( - onTap: () { - controller.sortAllBy - .value = "hot"; - controller - .allIcon.value = - Icons - .local_fire_department_rounded; - controller.sortHistoryBy - .update((val) {}); - Get.back(); - // Get.forceAppUpdate(); - }, - leading: Icon( - Icons - .local_fire_department_rounded, - color: (controller - .sortAllBy - .value == - "hot") - ? Colors.black - : Colors - .grey[500]), - title: Text( - "Hot", - style: TextStyle( - color: (controller - .sortAllBy - .value == - "hot") - ? Colors.black - : Colors - .grey[500]), - ), - trailing: (controller - .sortAllBy - .value == - "hot") - ? Icon( - Icons.done, - color: - Colors.green, - ) - : null, - ), - ListTile( - onTap: () { - controller.sortAllBy - .value = "new"; - controller - .allIcon.value = - Icons - .brightness_low; - controller.sortHistoryBy - .update((val) {}); - Get.back(); - // Get.forceAppUpdate(); - }, - leading: Icon( - Icons.brightness_low, - color: (controller - .sortAllBy - .value == - "new") - ? Colors.black - : Colors - .grey[500]), - title: Text( - "New", - style: TextStyle( - color: (controller - .sortAllBy - .value == - "new") - ? Colors.black - : Colors - .grey[500]), - ), - trailing: (controller - .sortAllBy - .value == - "new") - ? Icon( - Icons.done, - color: - Colors.green, - ) - : null, - ), - ListTile( - onTap: () { - controller.sortAllBy - .value = "top"; - controller - .allIcon.value = - Icons - .turn_sharp_right_sharp; - controller.sortHistoryBy - .update((val) {}); - Get.back(); - // Get.forceAppUpdate(); - }, - leading: Icon( - Icons - .turn_sharp_right_sharp, - color: (controller - .sortAllBy - .value == - "top") - ? Colors.black - : Colors - .grey[500]), - title: Text( - "Top", - style: TextStyle( - color: (controller - .sortAllBy - .value == - "top") - ? Colors.black - : Colors - .grey[500]), - ), - trailing: (controller - .sortAllBy - .value == - "top") - ? Icon( - Icons.done, - color: - Colors.green, - ) - : null, - ), - ], - ), - ), - )); - }, - icon: Text( - "${controller.sortAllBy.value.toUpperCase()}", - style: const TextStyle(color: Colors.grey), - ), - label: const Icon( - IconBroken.Arrow___Down_2, - color: Colors.grey, - size: 15, - ), - style: ButtonStyle( - elevation: - MaterialStateProperty.all(0), - backgroundColor: MaterialStateProperty.all( - Colors.grey[300]), - ), - ), - ], - ), - ), - ), - ), - ), - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttericon/typicons_icons.dart'; +import 'package:get/get.dart'; +import 'package:post/home/widgets/buttom_nav_bar.dart'; +import 'package:responsive_sizer/responsive_sizer.dart'; +import '../../create_community/screens/create_community.dart'; +import '../../createpost/controllers/posts_controllers.dart'; +import '../../createpost/screens/createpost.dart'; +import '../../icons/icon_broken.dart'; +import '../../post/widgets/post.dart'; +import '../../post/widgets/post_list.dart'; +import '../../widgets/loading_reddit.dart'; +import '../controller/home_controller.dart'; +import '../widgets/custom_upper_bar.dart'; +import 'home_layout.dart'; + +class All extends StatefulWidget { + const All({Key? key}) : super(key: key); + @override + State createState() => _AllState(); +} + +class _AllState extends State with TickerProviderStateMixin { + final HomeController controller = Get.put( + HomeController(), + ); + final PostController controllerForPost = Get.put( + PostController(), + ); + late AnimationController loadingSpinnerAnimationController; + @override + void initState() { + super.initState(); + loadingSpinnerAnimationController = + AnimationController(duration: const Duration(seconds: 2), vsync: this); + loadingSpinnerAnimationController.repeat(); + if (controller.allPosts.isEmpty) { + controller.getPostsInAll(sort: controller.sortAllBy.value,p: controller.pageNumberAll.value); + } + } + void dispose() { + loadingSpinnerAnimationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + + double ScreenSizeWidth = MediaQuery.of(context).size.width; + + final isDesktop = ScreenSizeWidth >= 700; + final isMobile = ScreenSizeWidth < 700; + + if (isDesktop) { + return + Obx(()=> + Scaffold( + appBar: PreferredSize( + preferredSize: Size(700, 60), + child: UpBar(controller: controller, controllerForCreatePost: controllerForPost,)), + backgroundColor: const Color(0xA2D4E4FA), + body: + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + Row( + children: [ + Padding( + padding: EdgeInsetsDirectional.only(start: 200), + child: Column( + children: [ + SizedBox(height: 2,), + Container( + color: Colors.white, + height: 50, + width: 650, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Image.asset('assets/images/1.png'), + height: 40, + width: 40, + ), + ), + Container( + width: 450.0, + height: 35.0, + color: const Color(0xA2F2F4F6), + child: TextFormField( + onTap: ()=> Get.to(CreatePostSCreen()), + enabled: false, + decoration: const InputDecoration( + border: InputBorder.none, + labelText: 'Create Post', + labelStyle: TextStyle( + color: Colors.grey, + fontSize: 18.0, + ), + ), + ), + ), + SizedBox(width: 10,), + IconButton( + icon:Icon(Icons.photo), + onPressed: () { + Get.to(CreatePostSCreen(), arguments: [ + 0, 0, + 0 + ]); + }, + + ), + const SizedBox( + width: 20, + ), + IconButton( + onPressed: () + { + Get.to(CreatePostSCreen(), arguments: [ + 0, 0, + 0 + ]); + }, + icon:Icon(Icons.insert_link)), + ], + ), + ), + SizedBox(height: 10,), + Container( + color: Colors.white, + height: 50, + width: 650, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="best"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.add_alert_rounded, + size: 15.0, + ), + label: Text('Best'), // <-- Text + ), + height: 80, + width: 80, + ), + ), + + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="hot"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.fireplace, + size: 15.0, + ), + label: Text('Hot'), // <-- Text + ), + SizedBox( + width: 10, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder(),shadowColor: Colors.blue), + onPressed: () { + controller.sortHomePostsBy.value="new"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.new_releases_outlined, + size: 15.0, + ), + label: Text('New'), // <-- Text + ), + SizedBox( + width: 10, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="top"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.topic, + size: 15.0, + ), + label: Text('Top'), // <-- Text + ), + SizedBox( + width: 50, + ), + + ], + ), + ), + ], + ), + ), + SizedBox(width:100 ,), + Container( + margin:EdgeInsetsDirectional.only(top: 100) , + height: 300, + width: 350, + color: Colors.white, + child: Column(mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(30), + child: Text("Your personal Reddit frontpage. Come here to check in with your favorite communities."), + ), + SizedBox(height: 50,), + Container( + width: 300, + child: ElevatedButton( + onPressed: () { + Get.to(CreatePostSCreen(),arguments: [0,0,0]); + }, + child: Text(' Create post ',style: TextStyle(color: Colors.white),), + style: ElevatedButton.styleFrom(shape: StadiumBorder(),backgroundColor: Colors.blue), + ), + ), + SizedBox(height: 10,), + Container( + width: 300, + child: OutlinedButton( + onPressed: () { + Get.to(CreateCommunity()); + }, + child: Text('Create Community',style: TextStyle(color: Colors.blue),), + style: OutlinedButton.styleFrom( + shape: StadiumBorder(), + side: BorderSide(width: 2.0, color: Colors.blue), + + ), + ), + ) + ],), + ) + ], + ), + RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.allPosts.clear(); + controller.pageNumberAll.value = 1; + controller.pageNumberAll.update((val) {}); + controller.getPostsInAll(sort: controller.sortAllBy.value,p: controller.pageNumberAll.value); + controller.update(); + }, + child: controller.isLoading.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.error.value + ? Text("Unexpected Error Try Again..") + : controller.homePosts.isEmpty + ? LoadingReddit() + //const Text( "No Posts to show") + : PostList( + leftMargin: 200.0, + rightMargin: 650.0, + userName: '${controller.myProfile!.userName}', + updateData: () + { + controller.pageNumberAll.value++; + controller.pageNumberAll.update((val) { }); + }, + data: controller.homePosts, + ), + ), + ], + ), + ), + floatingActionButtonLocation:FloatingActionButtonLocation.miniEndFloat , + floatingActionButton: Padding( + padding: const EdgeInsetsDirectional.only(end: 320.0), + child: ElevatedButton( + onPressed: () { + Get.to(HomeLayoutScreen()); + }, + child: Text(' Back to top ',style: TextStyle(color: Colors.white),), + style: ElevatedButton.styleFrom(shape: StadiumBorder(),backgroundColor: Colors.blue), + ), + ), + + + ), + ); + } + return + Obx(()=> Scaffold( + bottomNavigationBar: const buttomNavBar( + fromProfile: 0, + icon: '', + nameOfSubreddit: '', x: 1, + ), + backgroundColor: Colors.grey[300], + appBar: AppBar( + elevation: 1, + leading: IconButton( + icon: const Icon(IconBroken.Arrow___Left_2), + onPressed: () { + Get.back(); + }, + ), + title: const Text( + "All", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w700), + ), + ), + body: + RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.allPosts.clear(); + controller.pageNumberAll.value = 1; + controller.pageNumberAll.update((val) {}); + controller.getPostsInAll(sort: controller.sortAllBy.value, p: controller.pageNumberAll.value); + controller.update(); + }, + child: controller.isLoadingAll.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.error.value + ? ListView( + children: const [ + Padding( + padding: EdgeInsets.all(150), + child: Text("Unexpected Error Try Again.."), + ), + ], + ) + : controller.allPosts.isEmpty + ? LoadingReddit() + : + PostList( + userName: '${controller.myProfile!.userName}', updateData: (){ + controller.pageNumberAll.value++; + controller.pageNumberAll.update((val) { }); + controller.getPostsInAll(sort: controller.sortAllBy.value,p: controller.pageNumberAll.value); + }, data: controller.allPosts, + topOfTheList: + Padding( + padding: const EdgeInsetsDirectional.only(start: 15, top: 5), + child: Row( + children: [ + Icon( + controller.allIcon.value, + color: Colors.grey, + size: 20, + ), + ElevatedButton.icon( + onPressed: () { + showModalBottomSheet( + backgroundColor: Colors.transparent, + context: context, + builder: (context) => GestureDetector( + onTap: () {}, + child: Container( + padding: const EdgeInsets.all(30), + height: 30.h, + width: 30.w, + margin: const EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: Colors.white), + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text('SORT POSTS BY', + style: TextStyle( + color: Colors.grey, + )), + const Divider( + height: 5, + ), + ListTile( + onTap: () { + controller.sortAllBy.value = "hot"; + controller.allIcon.value = Icons + .local_fire_department_rounded; + controller.sortHistoryBy.update((val) { }); + Get.back(); + // Get.forceAppUpdate(); + + }, + leading: Icon( + Icons + .local_fire_department_rounded, + color: + (controller.sortAllBy.value == + "hot") + ? Colors.black + : Colors.grey[500]), + title: Text( + "Hot", + style: TextStyle( + color: (controller + .sortAllBy.value == + "hot") + ? Colors.black + : Colors.grey[500]), + ), + trailing: + (controller.sortAllBy.value == + "hot") + ? Icon( + Icons.done, + color: Colors.green, + ) + : null, + ), + ListTile( + onTap: () { + controller.sortAllBy.value = "new"; + controller.allIcon.value = + Icons.brightness_low; + controller.sortHistoryBy.update((val) { }); + Get.back(); + // Get.forceAppUpdate(); + + }, + leading: Icon(Icons.brightness_low, + color: + (controller.sortAllBy.value == + "new") + ? Colors.black + : Colors.grey[500]), + title: Text( + "New", + style: TextStyle( + color: (controller + .sortAllBy.value == + "new") + ? Colors.black + : Colors.grey[500]), + ), + trailing: + (controller.sortAllBy.value == + "new") + ? Icon( + Icons.done, + color: Colors.green, + ) + : null, + ), + ListTile( + onTap: () { + controller.sortAllBy.value = "top"; + controller.allIcon.value = + Icons.turn_sharp_right_sharp; + controller.sortHistoryBy.update((val) { }); + Get.back(); + // Get.forceAppUpdate(); + + }, + leading: Icon( + Icons.turn_sharp_right_sharp, + color: + (controller.sortAllBy.value == + "top") + ? Colors.black + : Colors.grey[500]), + title: Text( + "Top", + style: TextStyle( + color: (controller + .sortAllBy.value == + "top") + ? Colors.black + : Colors.grey[500]), + ), + trailing: + (controller.sortAllBy.value == + "top") + ? Icon( + Icons.done, + color: Colors.green, + ) + : null, + ), + ], + ), + ), + )); + }, + icon: Text( + "${controller.sortAllBy.value.toUpperCase()}", + style: const TextStyle(color: Colors.grey), + ), + label: const Icon( + IconBroken.Arrow___Down_2, + color: Colors.grey, + size: 15, + ), + style: ButtonStyle( + elevation: MaterialStateProperty.all(0), + backgroundColor: + MaterialStateProperty.all(Colors.grey[300]), + ), + ), + ], + ), + ), + ), + ), + + + ), + ); + } +} diff --git a/lib/home/screens/history.dart b/lib/home/screens/history.dart index e031c7d6..0da51c6f 100644 --- a/lib/home/screens/history.dart +++ b/lib/home/screens/history.dart @@ -1,231 +1,240 @@ -import 'package:flutter/material.dart'; -import 'package:fluttericon/typicons_icons.dart'; -import 'package:get/get.dart'; -import 'package:post/home/controller/home_controller.dart'; -import 'package:post/icons/icon_broken.dart'; -import 'package:responsive_sizer/responsive_sizer.dart'; -import '../../post/widgets/post_list.dart'; -import '../../widgets/loading_reddit.dart'; -class History extends StatefulWidget { - History({Key? key}) : super(key: key); - - @override - State createState() => _HistoryState(); -} - - -class _HistoryState extends Statewith TickerProviderStateMixin { - final HomeController controller = Get.put( - HomeController(), - ); - late AnimationController loadingSpinnerAnimationController; - @override - void initState() { - super.initState(); - loadingSpinnerAnimationController = - AnimationController(duration: const Duration(seconds: 2), vsync: this); - loadingSpinnerAnimationController.repeat(); - if (controller.allPosts.isEmpty) { - controller.getHistory(); - } - } - void dispose() { - loadingSpinnerAnimationController.dispose(); - super.dispose(); - } - @override - Widget build(BuildContext context) { - return Obx(()=> - Scaffold( - backgroundColor: Colors.grey[300], - appBar: AppBar( - elevation: 1, - leading: IconButton( - icon:const Icon( IconBroken.Arrow___Left_2), - onPressed: () - { - Get.back(); - }, - ), - title: const Text("History", - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w700 - ), - ), - actions: [ - PopupMenuButton( - onSelected: (value){}, - itemBuilder: (BuildContext context) { - return {'Clear History'}.map((String choice) { - return PopupMenuItem( - value: choice, - child: ListTile( - leading: Icon(Icons.close_outlined), - title: Text(choice), - ), - ); - }).toList(); - }, - ), - ], - ), - body: RefreshIndicator( - backgroundColor: Colors.white, - color: Colors.blue[900], - onRefresh: () async { - controller.historyPosts.clear(); - controller.pageNumberHistory.value = 1; - controller.pageNumberHistory.update((val) {}); - controller.getHistory(); - controller.update(); - //Get.forceAppUpdate(); - }, - child: controller.isLoadingHistory.value - ? Center( - child: CircularProgressIndicator( - valueColor: loadingSpinnerAnimationController.drive( - ColorTween( - //begin: Colors.blueAccent, - end: Colors.blueAccent, - ), - ), - ), - ) - : controller.errorHistory.value - ? ListView( - children: const [ - Padding( - padding: EdgeInsets.all(150), - child: Text("Unexpected Error Try Again.."), - ), - ], - ) - : controller.historyPosts.isEmpty - ? LoadingReddit() - : - PostList( - userName: '${controller.myProfile!.userName}', updateData: (){ - controller.pageNumberHistory.value++; - controller.pageNumberHistory.update((val) { }); - controller.getHistory(); - }, data: controller.historyPosts, - topOfTheList: - Padding( - padding: const EdgeInsetsDirectional.only(start: 15,top: 5), - child: Row( - children: [ - const Icon(Icons.access_time_outlined,color: Colors.grey,size: 20,), - ElevatedButton.icon( - onPressed: () { - showModalBottomSheet( - backgroundColor: Colors.transparent, - context: context, - builder: (context) => GestureDetector( - onTap: () {}, - child: Container( - padding: const EdgeInsets.all(30), - height: 30.h, - width: 30.w, - margin: const EdgeInsets.all(5), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5), color: Colors.white), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - const Text('SORT HISTORY BY', - style: TextStyle( - color: Colors.grey, - )), - const Divider(height: 5,), - ListTile( - onTap: () - { - controller.sortHistoryBy.value="upvoted"; - controller.sortHistoryBy.update((val) { }); - Get.back(); - - }, - leading: Icon( - Typicons.up_outline, - color: (controller.sortHistoryBy.value=="upvoted")?Colors.black:Colors.grey[500] - ) , - title: Text( - "Upvoted", - style: TextStyle( - color: (controller.sortHistoryBy.value=="upvoted")?Colors.black:Colors.grey[500] - ), - ) , - trailing:(controller.sortHistoryBy.value=="upvoted")? Icon(Icons.done,color: Colors.green,):null , - ), - ListTile( - onTap: () - { - controller.sortHistoryBy.value="downvoted"; - controller.sortHistoryBy.update((val) { }); - Get.back(); - }, - leading: Icon( - Typicons.down_outline, - color: (controller.sortHistoryBy.value=="downvoted")?Colors.black:Colors.grey[500] - ) , - title: Text( - "Downvoted", - style: TextStyle( - color: (controller.sortHistoryBy.value=="downvoted")?Colors.black:Colors.grey[500] - ), - ) , - trailing:(controller.sortHistoryBy.value=="downvoted")? Icon(Icons.done,color: Colors.green,):null , - ), - ListTile( - onTap: () - { - controller.sortHistoryBy.value="hidden"; - controller.sortHistoryBy.update((val) { }); - Get.back(); - }, - leading: Icon( - Icons.visibility_off, - color: (controller.sortHistoryBy.value=="hidden")?Colors.black:Colors.grey[500] - ) , - title: Text( - "Hidden", - style: TextStyle( - color: (controller.sortHistoryBy.value=="hidden")?Colors.black:Colors.grey[500] - ), - ) , - trailing:(controller.sortHistoryBy.value=="hidden")? Icon(Icons.done,color: Colors.green,):null , - ), - ], - ), - ), - ) - ); - }, - icon: Text( - "${controller.sortHistoryBy.value.toUpperCase()}", - style: const TextStyle(color: Colors.grey), - ), - label: const Icon( - IconBroken.Arrow___Down_2, - color: Colors.grey, - size: 15, - ), - style: ButtonStyle( - elevation: MaterialStateProperty.all(0), - backgroundColor: - MaterialStateProperty.all(Colors.grey[300]), - ), - ), - ], - ), - ), - ), - ) , - ), - - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttericon/typicons_icons.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:post/home/controller/home_controller.dart'; +import 'package:post/icons/icon_broken.dart'; +import 'package:responsive_sizer/responsive_sizer.dart'; +import '../../post/widgets/post_list.dart'; +import '../../widgets/loading_reddit.dart'; +import '../controller/home_controller.dart'; +class History extends StatefulWidget { + History({Key? key}) : super(key: key); + + @override + State createState() => _HistoryState(); +} + + +class _HistoryState extends Statewith TickerProviderStateMixin { + final HomeController controller = Get.put( + HomeController(), + ); + late AnimationController loadingSpinnerAnimationController; + @override + void initState() { + super.initState(); + loadingSpinnerAnimationController = + AnimationController(duration: const Duration(seconds: 2), vsync: this); + loadingSpinnerAnimationController.repeat(); + if (controller.allPosts.isEmpty) { + controller.getHistory(sort: controller.sortHistoryBy.value, p: controller.pageNumberHistory.value,); + } + } + void dispose() { + loadingSpinnerAnimationController.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + return Obx(()=> + Scaffold( + backgroundColor: Colors.grey[300], + appBar: AppBar( + elevation: 1, + leading: IconButton( + icon:const Icon( IconBroken.Arrow___Left_2), + onPressed: () + { + Get.back(); + }, + ), + title: const Text("History", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w700 + ), + ), + actions: [ + PopupMenuButton( + onSelected: (value){}, + itemBuilder: (BuildContext context) { + return {'Clear History'}.map((String choice) { + return PopupMenuItem( + value: choice, + child: ListTile( + onTap: () + { + controller.historyPosts.clear(); + }, + leading: Icon(Icons.close_outlined), + title: Text(choice), + ), + ); + }).toList(); + }, + ), + ], + ), + body: RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.historyPosts.clear(); + controller.pageNumberHistory.value = 1; + controller.pageNumberHistory.update((val) {}); + controller.getHistory(sort: controller.sortHistoryBy.value, p: controller.pageNumberHistory.value,); + controller.update(); + //Get.forceAppUpdate(); + }, + child: controller.isLoadingHistory.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.errorHistory.value + ? ListView( + children: const [ + Padding( + padding: EdgeInsets.all(150), + child: Text("Unexpected Error Try Again.."), + ), + ], + ) + : controller.historyPosts.isEmpty + ? LoadingReddit() + : + PostList( + userName: '${controller.myProfile!.userName}', updateData: (){ + controller.pageNumberHistory.value++; + controller.pageNumberHistory.update((val) { }); + controller.getHistory(sort: controller.sortHistoryBy.value, p: controller.pageNumberHistory.value,); + }, data: controller.historyPosts, + topOfTheList: + Padding( + padding: const EdgeInsetsDirectional.only(start: 15,top: 5), + child: Row( + children: [ + const Icon(Icons.access_time_outlined,color: Colors.grey,size: 20,), + ElevatedButton.icon( + onPressed: () { + showModalBottomSheet( + backgroundColor: Colors.transparent, + context: context, + builder: (context) => GestureDetector( + onTap: () {}, + child: Container( + padding: const EdgeInsets.all(30), + height: 30.h, + width: 30.w, + margin: const EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), color: Colors.white), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text('SORT HISTORY BY', + style: TextStyle( + color: Colors.grey, + )), + const Divider(height: 5,), + ListTile( + onTap: () + { + controller.sortHistoryBy.value="upvoted"; + controller.sortHistoryBy.update((val) { }); + Get.back(); + + }, + leading: Icon( + Typicons.up_outline, + color: (controller.sortHistoryBy.value=="upvoted")?Colors.black:Colors.grey[500] + ) , + title: Text( + "Upvoted", + style: TextStyle( + color: (controller.sortHistoryBy.value=="upvoted")?Colors.black:Colors.grey[500] + ), + ) , + trailing:(controller.sortHistoryBy.value=="upvoted")? Icon(Icons.done,color: Colors.green,):null , + ), + ListTile( + onTap: () + { + controller.sortHistoryBy.value="downvoted"; + controller.sortHistoryBy.update((val) { }); + Get.back(); + }, + leading: Icon( + Typicons.down_outline, + color: (controller.sortHistoryBy.value=="downvoted")?Colors.black:Colors.grey[500] + ) , + title: Text( + "Downvoted", + style: TextStyle( + color: (controller.sortHistoryBy.value=="downvoted")?Colors.black:Colors.grey[500] + ), + ) , + trailing:(controller.sortHistoryBy.value=="downvoted")? Icon(Icons.done,color: Colors.green,):null , + ), + ListTile( + onTap: () + { + controller.sortHistoryBy.value="hidden"; + controller.sortHistoryBy.update((val) { }); + Get.back(); + }, + leading: Icon( + Icons.visibility_off, + color: (controller.sortHistoryBy.value=="hidden")?Colors.black:Colors.grey[500] + ) , + title: Text( + "Hidden", + style: TextStyle( + color: (controller.sortHistoryBy.value=="hidden")?Colors.black:Colors.grey[500] + ), + ) , + trailing:(controller.sortHistoryBy.value=="hidden")? Icon(Icons.done,color: Colors.green,):null , + ), + ], + ), + ), + ) + ); + }, + icon: Text( + "${controller.sortHistoryBy.value.toUpperCase()}", + style: const TextStyle(color: Colors.grey), + ), + label: const Icon( + IconBroken.Arrow___Down_2, + color: Colors.grey, + size: 15, + ), + style: ButtonStyle( + elevation: MaterialStateProperty.all(0), + backgroundColor: + MaterialStateProperty.all(Colors.grey[300]), + ), + ), + ], + ), + ), + ), + ) , + ), + + ); + } +} diff --git a/lib/home/screens/home_layout.dart b/lib/home/screens/home_layout.dart index 06271396..3d3e6142 100644 --- a/lib/home/screens/home_layout.dart +++ b/lib/home/screens/home_layout.dart @@ -1,16 +1,24 @@ +import 'package:custom_refresh_indicator/custom_refresh_indicator.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:post/create_community/screens/create_community.dart'; import 'package:post/createpost/controllers/posts_controllers.dart'; +import 'package:post/createpost/screens/createpost.dart'; import 'package:post/home/controller/home_controller.dart'; +import 'package:post/home/widgets/community_container.dart'; import 'package:post/home/widgets/new_drawer.dart'; +import 'package:post/post/models/post_model.dart'; import 'package:post/widgets/loading_reddit.dart'; import '../../icons/icon_broken.dart'; +import '../../post/widgets/post.dart'; import '../../post/widgets/post_list.dart'; import '../widgets/buttom_nav_bar.dart'; +import '../widgets/custom_upper_bar.dart'; import '../widgets/end_drawer.dart'; +import '../controller/home_controller.dart'; +import '../../createpost/controllers/posts_controllers.dart'; import '../widgets/recently_visited_list.dart'; -import '../../search/screens/search.dart'; class HomeLayoutScreen extends StatefulWidget { static const routeName = '/homepage'; @@ -69,7 +77,7 @@ class _HomeLayoutScreenState extends State AnimationController(duration: const Duration(seconds: 2), vsync: this); loadingSpinnerAnimationController.repeat(); if (controller.homePosts.isEmpty) { - controller.getPosts(); + controller.getPosts(sort: controller.sortHomePostsBy.value,p: controller.pageNumber.value); } } @@ -78,32 +86,286 @@ class _HomeLayoutScreenState extends State super.dispose(); } - void updateData() { - controller.pageNumber.value++; - controller.getPosts(); - } + // for dropdown list - String dropValue = "Home"; - // Lists for DropDown Menu at appBar List dropdownItems = [ DropdownMenuItem( child: ButtonBar( - children: [Text("Home")], - )), + children: [Text("Home")], + )), DropdownMenuItem( child: ButtonBar( - children: [Text("Popular")], - )) + children: [Text("Popular")], + )) ]; @override Widget build(BuildContext context) { + double ScreenSizeWidth = MediaQuery.of(context).size.width; + + final isDesktop = ScreenSizeWidth >= 700; + final isMobile = ScreenSizeWidth < 700; + + if (isDesktop) { + return + Obx(()=> + Scaffold( + appBar: PreferredSize( + preferredSize: Size(700, 60), + child: UpBar(controller: controller, controllerForCreatePost: controllerForPost,)), + backgroundColor: const Color(0xA2D4E4FA), + body:SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + Row( + children: [ + Padding( + padding: EdgeInsetsDirectional.only(start: 200), + child: Column( + children: [ + SizedBox(height: 2,), + Container( + color: Colors.white, + height: 50, + width: 650, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Image.asset('assets/images/1.png'), + height: 40, + width: 40, + ), + ), + Container( + width: 450.0, + height: 35.0, + color: const Color(0xA2F2F4F6), + child: TextFormField( + onTap: ()=> Get.to(CreatePostSCreen()), + enabled: false, + decoration: const InputDecoration( + border: InputBorder.none, + labelText: 'Create Post', + labelStyle: TextStyle( + color: Colors.grey, + fontSize: 18.0, + ), + ), + ), + ), + SizedBox(width: 10,), + IconButton( + icon:Icon(Icons.photo), + onPressed: () { + Get.to(CreatePostSCreen(), arguments: [ + 0, 0, + 0 + ]); + }, + + ), + const SizedBox( + width: 20, + ), + IconButton( + onPressed: () + { + Get.to(CreatePostSCreen(), arguments: [ + 0, 0, + 0 + ]); + }, + icon:Icon(Icons.insert_link)), + ], + ), + ), + SizedBox(height: 10,), + Container( + color: Colors.white, + height: 50, + width: 650, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="best"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.add_alert_rounded, + size: 15.0, + ), + label: Text('Best'), // <-- Text + ), + height: 80, + width: 80, + ), + ), + + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="hot"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.fireplace, + size: 15.0, + ), + label: Text('Hot'), // <-- Text + ), + SizedBox( + width: 10, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder(),shadowColor: Colors.blue), + onPressed: () { + controller.sortHomePostsBy.value="new"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.new_releases_outlined, + size: 15.0, + ), + label: Text('New'), // <-- Text + ), + SizedBox( + width: 10, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + onPressed: () { + controller.sortHomePostsBy.value="top"; + controller.sortHomePostsBy.update((val) { }); + }, + icon: Icon( // <-- Icon + Icons.topic, + size: 15.0, + ), + label: Text('Top'), // <-- Text + ), + SizedBox( + width: 50, + ), + + ], + ), + ), + ], + ), + ), + SizedBox(width:100 ,), + Container( + margin:EdgeInsetsDirectional.only(top: 100) , + height: 300, + width: 350, + color: Colors.white, + child: Column(mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(30), + child: Text("Your personal Reddit frontpage. Come here to check in with your favorite communities."), + ), + SizedBox(height: 50,), + Container( + width: 300, + child: ElevatedButton( + onPressed: () { + Get.to(CreatePostSCreen(),arguments: [0,0,0]); + }, + child: Text(' Create post ',style: TextStyle(color: Colors.white),), + style: ElevatedButton.styleFrom(shape: StadiumBorder(),backgroundColor: Colors.blue), + ), + ), + SizedBox(height: 10,), + Container( + width: 300, + child: OutlinedButton( + onPressed: () { + Get.to(CreateCommunity()); + }, + child: Text('Create Community',style: TextStyle(color: Colors.blue),), + style: OutlinedButton.styleFrom( + shape: StadiumBorder(), + side: BorderSide(width: 2.0, color: Colors.blue), + + ), + ), + ) + ],), + ) + ], + ), + RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.homePosts.clear(); + controller.pageNumber.value = 1; + controller.pageNumber.update((val) {}); + controller.getPosts(sort: controller.sortHomePostsBy.value,p: controller.pageNumber.value); + controller.update(); + }, + child: controller.isLoading.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.error.value + ? Text("Unexpected Error Try Again..") + : controller.homePosts.isEmpty + ? LoadingReddit() + //const Text( "No Posts to show") + : PostList( + leftMargin: 200.0, + rightMargin: 650.0, + userName: '${controller.myProfile!.userName}', + updateData: () + { + controller.pageNumber.value++; + controller.pageNumber.update((val) { }); + }, + data: controller.homePosts, + ), + ), + ], + ), + ), + floatingActionButtonLocation:FloatingActionButtonLocation.miniEndFloat , + floatingActionButton: Padding( + padding: const EdgeInsetsDirectional.only(end: 320.0), + child: ElevatedButton( + onPressed: () { + Get.to(HomeLayoutScreen()); + }, + child: Text(' Back to top ',style: TextStyle(color: Colors.white),), + style: ElevatedButton.styleFrom(shape: StadiumBorder(),backgroundColor: Colors.blue), + ), + ), + + + ), + ); + } return Obx( - () => Scaffold( + () => Scaffold( appBar: AppBar( - // To make style for status bar - systemOverlayStyle: SystemUiOverlayStyle( + // To make style for status bar + systemOverlayStyle: const SystemUiOverlayStyle( statusBarColor: Colors.white, statusBarIconBrightness: Brightness.dark, ), @@ -131,14 +393,14 @@ class _HomeLayoutScreenState extends State "modsub length ${controllerForPost.moderatedSubreddits.length}"); print("name of ${controllerForPost.moderatedSubreddits[0]}"); }, - icon: Text( + icon: const Text( "Home", style: TextStyle( color: Colors.black, fontSize: 17.0, fontWeight: FontWeight.w600), ), - label: Icon( + label: const Icon( IconBroken.Arrow___Down_2, color: Colors.black, ), @@ -150,9 +412,7 @@ class _HomeLayoutScreenState extends State ), actions: [ IconButton( - onPressed: () { - Navigator.pushNamed(context, Search.routeName); - }, + onPressed: () {}, icon: Icon( IconBroken.Search, color: Colors.black87, @@ -198,13 +458,13 @@ class _HomeLayoutScreenState extends State controller: controller, ), drawer: //RecentlyVisitedDrawer(controller: this.controller,), - (controller.isRecentlyVisitedDrawer.value == true) - ? RecentlyVisitedDrawer( - controller: this.controller, - ) - : MyDrawer( - controller: this.controller, - controllerForCreatePost: this.controllerForPost), + (controller.isRecentlyVisitedDrawer.value == true) + ? RecentlyVisitedDrawer( + controller: this.controller, + ) + : MyDrawer( + controller: this.controller, + controllerForCreatePost: this.controllerForPost), body: RefreshIndicator( backgroundColor: Colors.white, color: Colors.blue[900], @@ -212,50 +472,41 @@ class _HomeLayoutScreenState extends State controller.homePosts.clear(); controller.pageNumber.value = 1; controller.pageNumber.update((val) {}); - controller.getPosts(); + controller.getPosts(sort: controller.sortHomePostsBy.value,p: controller.pageNumber.value); controller.update(); }, child: controller.isLoading.value ? Center( - child: CircularProgressIndicator( - valueColor: loadingSpinnerAnimationController.drive( - ColorTween( - //begin: Colors.blueAccent, - end: Colors.blueAccent, - ), - ), - ), - ) + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) : controller.error.value - ? ListView( - children: const [ - Padding( - padding: EdgeInsets.all(150), - child: Text("Unexpected Error Try Again.."), - ), - ], - ) - : controller.homePosts.isEmpty - ? LoadingReddit() - //const Text( "No Posts to show") - : PostList( - userName: '${controller.myProfile!.userName}', - updateData: updateData, - data: controller.homePosts, - ), - - // : ListView.builder( - // controller: controller.myScroll, - // itemCount: controller.homePosts.length, - // itemBuilder: ( - // final BuildContext ctx, - // final int index, - // ) { - // return Post.home( - // data: controller.homePosts[index], - // ); - // }, - // ), + ? ListView( + children: const [ + Padding( + padding: EdgeInsets.all(150), + child: Text("Unexpected Error Try Again.."), + ), + ], + ) + : controller.homePosts.isEmpty + ? LoadingReddit() + //const Text( "No Posts to show") + : PostList( + userName: '${controller.myProfile!.userName}', + updateData: () + { + controller.pageNumber.value++; + controller.getPosts(sort: controller.sortHomePostsBy.value,p: controller.pageNumber.value); + }, + data: controller.homePosts, + ), ), ), ); diff --git a/lib/home/screens/saved.dart b/lib/home/screens/saved.dart index 79a7b4ae..00ee1f90 100644 --- a/lib/home/screens/saved.dart +++ b/lib/home/screens/saved.dart @@ -1,67 +1,71 @@ -import 'package:flutter/material.dart'; -import 'package:post/home/screens/saved_comments.dart'; -import 'package:post/home/screens/saved_posts.dart'; - -class Saved extends StatelessWidget { - const Saved({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - late TabController controller; - return DefaultTabController( - length: 2, - child: Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(100), - child: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) => [ - SliverAppBar( - backgroundColor: Colors.white, - titleSpacing: 0, - elevation: 2, - titleTextStyle: const TextStyle( - color: Colors.black, - fontWeight: FontWeight.w500, - fontSize: 18), - shadowColor: Colors.white, - title: const Text('Saved'), - bottom: PreferredSize( - preferredSize: const Size.fromHeight(40), - child: TabBar( - indicatorWeight: 3, - indicatorColor: Colors.blue, - indicatorSize: TabBarIndicatorSize.tab, - labelPadding: const EdgeInsets.symmetric(horizontal: 60), - isScrollable: true, - labelStyle: const TextStyle( - fontWeight: FontWeight.w700, fontSize: 14), - labelColor: Colors.black, - unselectedLabelColor: Colors.grey, - tabs: [ - Text( - 'Posts', - style: TextStyle(fontSize: 15), - ), - const Padding( - padding: EdgeInsets.only(bottom: 6), - child: Text( - 'Comments', - ), - ), - ], - ), - ), - ), - ], - body: SizedBox(), - ), - ), - body: TabBarView(children: [ - SavedPosts(), - SavedCommentView(), - ]), - ), - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:post/home/screens/saved_comments.dart'; +import 'package:post/home/screens/saved_posts.dart'; + + +class Saved extends StatelessWidget { + const Saved({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + late TabController controller; + return + DefaultTabController( + length: 2, + child: Scaffold( + appBar: PreferredSize( + preferredSize: const Size.fromHeight(100), + child: NestedScrollView( + headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) =>[ + SliverAppBar( + backgroundColor: Colors.white, + titleSpacing: 0, + elevation: 2, + titleTextStyle: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.w500, + fontSize: 18), + shadowColor: Colors.white, + title: const Text('Saved'), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(40), + child: TabBar( + indicatorWeight: 3, + indicatorColor: Colors.blue, + indicatorSize: TabBarIndicatorSize.tab, + labelPadding: const EdgeInsets.symmetric(horizontal: 60), + isScrollable: true, + labelStyle: const TextStyle( + fontWeight: FontWeight.w700, fontSize: 14), + labelColor: Colors.black, + unselectedLabelColor: Colors.grey, + tabs: [ + Text( + 'Posts', + style: TextStyle(fontSize: 15), + ), + const Padding( + padding: EdgeInsets.only(bottom: 6), + child: Text( + 'Comments', + ), + ), + ], + ), + ), + ), + ], + body: SizedBox(), + ), + ), + + body: TabBarView( + children: [ + SavedPosts(), + SavedCommentView(), + ]), + ), + ); + } +} diff --git a/lib/home/screens/saved_comments.dart b/lib/home/screens/saved_comments.dart index adcd89bf..5e3e0c5f 100644 --- a/lib/home/screens/saved_comments.dart +++ b/lib/home/screens/saved_comments.dart @@ -1,85 +1,92 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:post/comments/widgets/comment.dart'; -import '../../widgets/loading_reddit.dart'; -import '../controller/home_controller.dart'; - -class SavedCommentView extends StatefulWidget { - SavedCommentView({Key? key}) : super(key: key); - - @override - State createState() => _SavedCommentViewState(); -} - -class _SavedCommentViewState extends State - with TickerProviderStateMixin { - final HomeController controller = Get.put(HomeController()); - late AnimationController loadingSpinnerAnimationController; - @override - void initState() { - super.initState(); - loadingSpinnerAnimationController = - AnimationController(duration: const Duration(seconds: 2), vsync: this); - loadingSpinnerAnimationController.repeat(); - if (controller.userSavedComments.isEmpty) { - controller.getSavedComments(); - } - } - - void dispose() { - loadingSpinnerAnimationController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Obx( - () => Scaffold( - body: RefreshIndicator( - backgroundColor: Colors.white, - color: Colors.blue[900], - onRefresh: () async { - controller.userSavedComments.clear(); - controller.pageNumberComment.value = 1; - controller.pageNumberComment.update((val) {}); - controller.getSavedComments(); - controller.update(); - //Get.forceAppUpdate(); - }, - child: controller.isLoadingCommetns.value - ? Center( - child: CircularProgressIndicator( - valueColor: loadingSpinnerAnimationController.drive( - ColorTween( - //begin: Colors.blueAccent, - end: Colors.blueAccent, - ), - ), - ), - ) - : controller.errorComment.value - ? ListView( - children: const [ - Padding( - padding: EdgeInsets.all(150), - child: Text("Unexpected Error Try Again.."), - ), - ], - ) - : controller.userSavedComments.isEmpty - ? LoadingReddit() - : ListView.builder( - itemCount: controller.userSavedComments.length, - itemBuilder: ( - final BuildContext ctx, - final int index, - ) { - return Comment( - data: controller.userSavedComments[index], - userName: '${controller.myProfile!.userName}'); - }, - ), - )), - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:post/comments/widgets/comment.dart'; +import 'package:responsive_sizer/responsive_sizer.dart'; + + +import '../../networks/const_endpoint_data.dart'; +import '../../post/widgets/post.dart'; +import '../../post/widgets/post_list.dart'; +import '../../widgets/loading_reddit.dart'; +import '../controller/home_controller.dart'; + +class SavedCommentView extends StatefulWidget { + SavedCommentView({Key? key}) : super(key: key); + + @override + State createState() => _SavedCommentViewState(); +} + +class _SavedCommentViewState extends State with TickerProviderStateMixin{ + final HomeController controller = Get.put(HomeController()); + late AnimationController loadingSpinnerAnimationController; + @override + void initState() + { + super.initState(); + loadingSpinnerAnimationController = + AnimationController(duration: const Duration(seconds: 2), vsync: this); + loadingSpinnerAnimationController.repeat(); + if (controller.userSavedComments.isEmpty) { + controller.getSavedComments(p: controller.pageNumberComment.value, ); + } + } + void dispose() { + loadingSpinnerAnimationController.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + return Obx(()=> + Scaffold( + body: + RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.userSavedComments.clear(); + controller.pageNumberComment.value = 1; + controller.pageNumberComment.update((val) {}); + controller.getSavedComments(p: controller.pageNumberComment.value, ); + controller.update(); + //Get.forceAppUpdate(); + }, + child: controller.isLoadingCommetns.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.errorComment.value + ? ListView( + children: const [ + Padding( + padding: EdgeInsets.all(150), + child: Text("Unexpected Error Try Again.."), + ), + ], + ) + : controller.userSavedComments.isEmpty + ? LoadingReddit() + + : ListView.builder( + itemCount: controller.userSavedComments.length, + itemBuilder: ( + final BuildContext ctx, + final int index, + ) { + return Comment(data:controller.userSavedComments[index], userName: '${controller.myProfile!.userName}' + ); + }, + ), + ) + ), + ); + } +} diff --git a/lib/home/screens/saved_posts.dart b/lib/home/screens/saved_posts.dart index eca4e9d1..cec6e372 100644 --- a/lib/home/screens/saved_posts.dart +++ b/lib/home/screens/saved_posts.dart @@ -1,83 +1,88 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import '../../post/widgets/post_list.dart'; -import '../../widgets/loading_reddit.dart'; -import '../controller/home_controller.dart'; - -class SavedPosts extends StatefulWidget { - SavedPosts({Key? key}) : super(key: key); - - @override - State createState() => _SavedPostsState(); -} - -class _SavedPostsState extends State with TickerProviderStateMixin { - final HomeController controller = Get.put(HomeController()); - late AnimationController loadingSpinnerAnimationController; - @override - void initState() { - super.initState(); - loadingSpinnerAnimationController = - AnimationController(duration: const Duration(seconds: 2), vsync: this); - loadingSpinnerAnimationController.repeat(); - if (controller.userSavedPosts.isEmpty) { - controller.getSavedPosts(); - } - } - - void dispose() { - loadingSpinnerAnimationController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Obx( - () => Scaffold( - body: RefreshIndicator( - backgroundColor: Colors.white, - color: Colors.blue[900], - onRefresh: () async { - controller.userSavedPosts.clear(); - controller.pageNumberSaved.value = 1; - controller.pageNumberSaved.update((val) {}); - controller.getSavedPosts(); - controller.update(); - //Get.forceAppUpdate(); - }, - child: controller.isLoadingSaved.value - ? Center( - child: CircularProgressIndicator( - valueColor: loadingSpinnerAnimationController.drive( - ColorTween( - //begin: Colors.blueAccent, - end: Colors.blueAccent, - ), - ), - ), - ) - : controller.errorSaved.value - ? ListView( - children: const [ - Padding( - padding: EdgeInsets.all(150), - child: Text("Unexpected Error Try Again.."), - ), - ], - ) - : controller.userSavedPosts.isEmpty - ? LoadingReddit() - : PostList( - userName: '${controller.myProfile!.userName}', - updateData: () { - controller.pageNumberSaved.value++; - controller.pageNumberSaved.update((val) {}); - controller.getSavedPosts(); - }, - data: controller.userSavedPosts, - ), - ), - ), - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:responsive_sizer/responsive_sizer.dart'; + + +import '../../post/widgets/post.dart'; +import '../../post/widgets/post_list.dart'; +import '../../widgets/loading_reddit.dart'; +import '../controller/home_controller.dart'; + +class SavedPosts extends StatefulWidget { + SavedPosts({Key? key}) : super(key: key); + + @override + State createState() => _SavedPostsState(); +} + +class _SavedPostsState extends State with TickerProviderStateMixin{ + final HomeController controller = Get.put(HomeController()); + late AnimationController loadingSpinnerAnimationController; + @override + void initState() + { + super.initState(); + loadingSpinnerAnimationController = + AnimationController(duration: const Duration(seconds: 2), vsync: this); + loadingSpinnerAnimationController.repeat(); + if (controller.userSavedPosts.isEmpty) { + controller.getSavedPosts(p: controller.pageNumberSaved.value, ); + } + } + void dispose() { + loadingSpinnerAnimationController.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + return Obx(()=> + Scaffold( + body: + RefreshIndicator( + backgroundColor: Colors.white, + color: Colors.blue[900], + onRefresh: () async { + controller.userSavedPosts.clear(); + controller.pageNumberSaved.value = 1; + controller.pageNumberSaved.update((val) {}); + controller.getSavedPosts(p: controller.pageNumberSaved.value,); + controller.update(); + //Get.forceAppUpdate(); + }, + child: controller.isLoadingSaved.value + ? Center( + child: CircularProgressIndicator( + valueColor: loadingSpinnerAnimationController.drive( + ColorTween( + //begin: Colors.blueAccent, + end: Colors.blueAccent, + ), + ), + ), + ) + : controller.errorSaved.value + ? ListView( + children: const [ + Padding( + padding: EdgeInsets.all(150), + child: Text("Unexpected Error Try Again.."), + ), + ], + ) + : controller.userSavedPosts.isEmpty + ? LoadingReddit() + : + PostList( + userName: '${controller.myProfile!.userName}', updateData: (){ + controller.pageNumberSaved.value++; + controller.pageNumberSaved.update((val) { }); + controller.getSavedPosts(p: controller.pageNumberSaved.value,); + }, data: controller.userSavedPosts, + ), + ) , + + ), + ); + } +} diff --git a/lib/home/widgets/buttom_nav_bar.dart b/lib/home/widgets/buttom_nav_bar.dart index 8ccf952b..3bf4908d 100644 --- a/lib/home/widgets/buttom_nav_bar.dart +++ b/lib/home/widgets/buttom_nav_bar.dart @@ -8,7 +8,6 @@ import '../../notification/screens/notifications_screen.dart'; import '../../icons/icon_broken.dart'; import '../controller/home_controller.dart'; import '../screens/home_layout.dart'; -import '../../discover/screens/discover_screen.dart'; class buttomNavBar extends StatefulWidget { const buttomNavBar( @@ -50,13 +49,13 @@ class _buttomNavBarState extends State { // duration: Duration(seconds: 2), // curve: Curves.easeOut); // } else { - Get.to(HomeLayoutScreen()); + Get.to(HomeLayoutScreen()); //} } break; case 1: { - Get.to(DiscoverScreen()); + Get.to(HomeLayoutScreen()); } break; case 2: diff --git a/lib/home/widgets/comment_layout.dart b/lib/home/widgets/comment_layout.dart index a2ca2531..38f6a7dc 100644 --- a/lib/home/widgets/comment_layout.dart +++ b/lib/home/widgets/comment_layout.dart @@ -1,10 +1,10 @@ -import 'package:flutter/cupertino.dart'; - -class SavedCommentView extends StatelessWidget { - const SavedCommentView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(); - } -} +import 'package:flutter/cupertino.dart'; + +class SavedCommentView extends StatelessWidget { + const SavedCommentView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/home/widgets/container_in_recently_visited.dart b/lib/home/widgets/container_in_recently_visited.dart index cb7fe372..fb3b4033 100644 --- a/lib/home/widgets/container_in_recently_visited.dart +++ b/lib/home/widgets/container_in_recently_visited.dart @@ -1,48 +1,48 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:get/get_core/src/get_main.dart'; -import 'package:post/home/controller/home_controller.dart'; -import 'package:post/subreddit/screens/subreddit_screen.dart'; - -import '../../create_community/screens/create_community.dart'; -import '../../moderated_subreddit/screens/moderated_subreddit_screen.dart'; -class RecentlyVisitedContainer extends StatelessWidget { - - String nameOfSubreddit=""; - String iconOfSubreddit=''; - RecentlyVisitedContainer( - { - required this.nameOfSubreddit, - required this.iconOfSubreddit, - } - ); - @override - Widget build(BuildContext context) { - return ListTile( - horizontalTitleGap: 0.0, - leading: CircleAvatar(radius: 13,backgroundColor: Colors.blue, - backgroundImage: NetworkImage( - "$iconOfSubreddit" - ), - ), - title: Text("$nameOfSubreddit"), - trailing: IconButton( - onPressed: (){ - - }, - icon: Icon( - Icons.close, - color: Colors.grey, - size: 20 - ), - ), - onTap: () => - Navigator.of(context).pushNamed( - SubredditScreen.routeName, - arguments: nameOfSubreddit) - - - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:post/home/controller/home_controller.dart'; +import 'package:post/subreddit/screens/subreddit_screen.dart'; + +import '../../create_community/screens/create_community.dart'; +import '../../moderated_subreddit/screens/moderated_subreddit_screen.dart'; +class RecentlyVisitedContainer extends StatelessWidget { + + String nameOfSubreddit=""; + String iconOfSubreddit=''; + RecentlyVisitedContainer( + { + required this.nameOfSubreddit, + required this.iconOfSubreddit, + } + ); + @override + Widget build(BuildContext context) { + return ListTile( + horizontalTitleGap: 0.0, + leading: CircleAvatar(radius: 13,backgroundColor: Colors.blue, + backgroundImage: NetworkImage( + "$iconOfSubreddit" + ), + ), + title: Text("$nameOfSubreddit"), + trailing: IconButton( + onPressed: (){ + + }, + icon: Icon( + Icons.close, + color: Colors.grey, + size: 20 + ), + ), + onTap: () => + Navigator.of(context).pushNamed( + SubredditScreen.routeName, + arguments: nameOfSubreddit) + + + ); + } +} diff --git a/lib/home/widgets/custom_upper_bar.dart b/lib/home/widgets/custom_upper_bar.dart new file mode 100644 index 00000000..5d306232 --- /dev/null +++ b/lib/home/widgets/custom_upper_bar.dart @@ -0,0 +1,371 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:post/create_community/screens/create_community.dart'; +import 'package:post/createpost/screens/createpost.dart'; +import 'package:post/logins/screens/login.dart'; +import 'package:post/notification/screens/notifications_screen.dart'; +import 'package:post/settings/screens/settings.dart'; +import '../../logins/providers/authentication.dart'; +import '../../createpost/controllers/posts_controllers.dart'; +import '../../icons/icon_broken.dart'; +import '../../logins/providers/authentication.dart'; +import '../../myprofile/screens/myprofile_screen.dart'; +import '../../search/screens/search.dart'; +import '../controller/home_controller.dart'; +import '../screens/all.dart'; +import '../screens/home_layout.dart'; +import 'community_container.dart'; + +class UpBar extends StatelessWidget { + final HomeController controller ; + final PostController controllerForCreatePost ; + UpBar({ + Key? key, + required this.controller, + required this.controllerForCreatePost, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: Colors.white, + elevation: 0, + + leading: GestureDetector(child: Padding( + padding: const EdgeInsetsDirectional.only(start: 20.0), + child: Image.asset('assets/images/redditlogo.png'), + )) , + title: Row( + children: [ + const Text( + 'Reddit', + style: TextStyle( + fontSize: 20.0, fontWeight: FontWeight.bold), + ), + const SizedBox( + width: 30, + ), + Container( + width: 220, + child: PopupMenuButton( + child: Row( + children: [ + Icon(Icons.home_filled), + SizedBox(width: 20,), + Text("Home"), + SizedBox(width: 80,), + Icon(Icons.arrow_drop_down_sharp) + ], + ), + elevation: 0, + color: Colors.white, + offset:Offset(0,43) , + itemBuilder: (context)=>[ + PopupMenuItem( + value:1, + child: Container(width:220,child: Text("MODERATING",style: TextStyle(color: Colors.grey,fontSize: 10),)), + + ), + PopupMenuItem( + value:2, + child: Container(width:220,child:Column( + children: List.generate(controllerForCreatePost.moderatedSubreddits.length, (index) => + CommunityContainer( + nameOfSubreddit: controllerForCreatePost + .moderatedSubreddits[index] + .subredditName!, + iconOfSubreddit: (controllerForCreatePost + .moderatedSubreddits[index] + .icon != + null) + ? controllerForCreatePost + .moderatedSubreddits[index].icon! + : '') + ), + )), + + ), + PopupMenuItem( + value:3, + child: Container(width:220,child: Text("YOUR COMMUNITIES",style: TextStyle(color: Colors.grey,fontSize: 10),)), + ), + PopupMenuItem( + value:4, + child: ListTile( + onTap: () + { + Get.to(CreateCommunity()); + }, + horizontalTitleGap: 0, + leading: Icon(Icons.add,color: Colors.grey,), + title: Text("Create Community",style: TextStyle(color: Colors.grey),), + ), + ), + PopupMenuItem( + value:5, + child: Container(width:220,child:Column( + children: List.generate(controllerForCreatePost.subscribedSubreddits.length, (index) => + CommunityContainer( + nameOfSubreddit: controllerForCreatePost + .subscribedSubreddits[index] + .subredditName!, + iconOfSubreddit: (controllerForCreatePost + .subscribedSubreddits[index] + .icon != + null) + ? controllerForCreatePost + .subscribedSubreddits[index].icon! + : '') + ), + )), + + ), + PopupMenuItem( + value:6, + child: Container(width:220,child: Text("FEEDS",style: TextStyle(color: Colors.grey,fontSize: 10),)), + + ), + PopupMenuItem( + value:7, + child: Column( + children: [ + ListTile( + onTap: () + { + Get.to(HomeLayoutScreen()); + }, + horizontalTitleGap:0, + leading: Icon(Icons.home_filled), + title: Text("Home"), + ), + ListTile( + onTap: () + { + Get.to(All()); + }, + horizontalTitleGap:0, + leading: Icon(Icons.stacked_bar_chart), + title: Text("All"), + ) + ], + ) + ), + ], + ) + ), + Expanded( + child: Container( + width: 350.0, + height: 35.0, + child: TextFormField( + onTap: () + { + Get.to(Search()); + }, + enabled: false, + decoration: const InputDecoration( + border: OutlineInputBorder(borderRadius: BorderRadius.all(Radius.circular(20))), + labelText: 'Search Reddit', + prefixIcon: Icon(Icons.search), + labelStyle: TextStyle( + color: Colors.grey, + fontSize: 18.0, + ), + ), + ), + ), + ), + const SizedBox( + width: 20, + ), + IconButton( + onPressed: () { + Get.to(All()); + }, + icon: const Icon(Icons.arrow_circle_up,size: 25,)), + const SizedBox( + width: 20, + ), + IconButton( + onPressed: () { + Get.to(NotificationScreen()); + }, + icon: const Icon(IconBroken.Notification,size: 25,)), + const SizedBox( + width: 20, + ), + IconButton( + onPressed: () { + Get.to(CreatePostSCreen(),arguments: [0,0,0]); + }, + icon: const Icon(Icons.add_sharp,size: 25,)), + const SizedBox( + width: 20, + ), + ], + ), + actions: [ + + Container( + padding: EdgeInsetsDirectional.only(end: 20,start: 10), + child: PopupMenuButton( + + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.black54,width: 0.25) + ), + width: 270, + height: 20, + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 10.0), + child: Row( + children: [ + Stack( + alignment: AlignmentDirectional.bottomEnd, + children: const [ + CircleAvatar( + backgroundImage: AssetImage( + "assets/images/reddit.gif"), + radius: 18.0, + ) + , + CircleAvatar( + backgroundColor: Colors.white, + radius: 6, + ), + Padding( + padding: EdgeInsetsDirectional.only(end: 2, bottom: 2), + child: CircleAvatar( + backgroundColor: Colors.green, + radius: 4, + ), + ) + ], + ),const SizedBox(width: 10,), + Padding( + padding: const EdgeInsetsDirectional.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text("Ahmed"), + Text("karma"), + ], + ), + ), + const SizedBox(width: 100,), + const Icon(IconBroken.Arrow___Down_2) + ], + ), + ), + ), + itemBuilder: (context) => [ + PopupMenuItem( + value: 1, + child: Container( + padding: EdgeInsetsDirectional.only(end: 80), + height: 40, + width: 220, + child: ListTile( + horizontalTitleGap: 0, + leading: Icon(IconBroken.Profile,color: Colors.grey,), + title: Text("My Stuff",style: TextStyle(color: Colors.grey),), + ), + ), + ), + PopupMenuItem( + value: 2, + child: Container( + padding: EdgeInsetsDirectional.only(start: 30,bottom: 10), + height: 30, + width: 220, + child: ListTile( + onTap: (){ + Get.to(MyProfileScreen()); + }, + title: Text("Profile",style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold),), + ), + ), + ), + PopupMenuItem( + value: 3, + child: Container( + padding: EdgeInsetsDirectional.only(start: 30,bottom: 10), + height: 30, + width: 220, + child: ListTile( + onTap: () + { + Get.to(Settings()); + }, + title: Text("User settings",style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold),), + ), + ), + ), + PopupMenuItem(child: Divider()), + PopupMenuItem( + value: 4, + child: Container( + padding: EdgeInsetsDirectional.only(end: 0), + height: 40, + width: 220, + child: ListTile( + onTap: () + { + Get.to(CreateCommunity()); + }, + horizontalTitleGap: 0, + leading: Padding( + padding: const EdgeInsetsDirectional.only(top: 12.0), + child: Icon(Icons.r_mobiledata_outlined,color: Colors.black,size: 30,), + ), + title: Text("Create a Community",style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold),), + ), + ), + ), + PopupMenuItem( + value: 5, + child: Container( + padding: EdgeInsetsDirectional.only(start: 40), + height: 40, + width: 220, + child: ListTile( + horizontalTitleGap: 0, + title: Text("Privacy Policy",style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold,fontSize: 16),), + ), + ), + ), + PopupMenuItem(child: Divider()), + PopupMenuItem( + value: 6, + child: Container( + padding: EdgeInsetsDirectional.only(start: 10,bottom: 1), + height: 30, + width: 220, + child: ListTile( + onTap: () + { + Auth().logOut(context); + Navigator.of(context).pushNamed(Login.routeName); + + }, + horizontalTitleGap: 0, + leading: Icon(Icons.logout,size: 25,color: Colors.black,), + title: Text("Log out",style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold),), + ), + ), + ), + PopupMenuItem(child: Divider()), + ] + , + offset: Offset(0, 59), + color: Colors.white, + elevation: 0, + + + ), + ), + ], + ); + } +} diff --git a/lib/home/widgets/end_drawer.dart b/lib/home/widgets/end_drawer.dart index b44eea49..b7228032 100644 --- a/lib/home/widgets/end_drawer.dart +++ b/lib/home/widgets/end_drawer.dart @@ -4,7 +4,6 @@ import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:post/home/controller/home_controller.dart'; import 'package:post/home/screens/saved.dart'; -import 'package:post/logins/screens/login.dart'; import 'package:responsive_sizer/responsive_sizer.dart'; import '../../home/screens/history.dart'; import '../../create_community/screens/create_community.dart'; @@ -12,10 +11,11 @@ import '../../icons/icon_broken.dart'; import '../../myprofile/screens/myprofile_screen.dart'; import '../../settings/screens/settings.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../logins/providers/authentication.dart'; - class endDrawer extends StatelessWidget { - endDrawer({required this.controller, Key? key}) : super(key: key); + + endDrawer({ + required this.controller + ,Key? key}) : super(key: key); final HomeController controller; bool isOnline = true; @@ -84,17 +84,17 @@ class endDrawer extends StatelessWidget { icon: CircleAvatar( radius: 4, backgroundColor: - isOnline ? Colors.green : Colors.grey[200], + isOnline ? Colors.green : Colors.grey[200], ), style: ButtonStyle( elevation: MaterialStateProperty.all(0), backgroundColor: - MaterialStateProperty.all(Colors.grey[200]), + MaterialStateProperty.all(Colors.grey[200]), shape: MaterialStateProperty.all< - RoundedRectangleBorder>( + RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: - BorderRadius.circular(20.0), + BorderRadius.circular(20.0), side: BorderSide( color: isOnline ? Colors.green @@ -103,7 +103,7 @@ class endDrawer extends StatelessWidget { "Online Status: " + "${isOnline ? "On" : "Off"}", style: TextStyle( color: - isOnline ? Colors.green : Colors.black54), + isOnline ? Colors.green : Colors.black54), ), ), ), @@ -122,172 +122,121 @@ class endDrawer extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - GestureDetector( - onTap: () { - showDialog( - context: context, - builder: (ctx) => AlertDialog( - content: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - ), - width: - MediaQuery.of(context).size.width / 1, - height: - MediaQuery.of(context).size.height / 2, - child: (Column( - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - SizedBox( - height: 30, - ), - CircleAvatar( - radius: 70, - backgroundImage: NetworkImage( - "${controller.myProfile!.profilePicture}"), - ), - SizedBox( - height: 130, - ), - Padding( - padding: - const EdgeInsetsDirectional.only( - end: 30), - child: Text( - 'u/${controller.myProfile!.displayName}', - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.w500), - ), - ), - SizedBox( - height: 10, - ), - Expanded( - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - "${controller.myProfile!.postKarma}"), - Text( - "Post Karma", - style: TextStyle( - color: - Colors.grey[400], - fontSize: 14), - ), - ], - ), - ), - SizedBox( - width: 20, - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - "${controller.myProfile!.commentkarma}"), - Text( - "Comment Karma", - style: TextStyle( - color: Colors.grey[400], - fontSize: 14), - ), - ], - ), - ], - ), - ), - SizedBox( - height: 10, - ), - Padding( - padding: - const EdgeInsetsDirectional.only( - end: 10), - child: ListTile( - onTap: () { - Navigator.of(context).pushNamed( - MyProfileScreen.routeName, - arguments: userName); - }, - leading: Icon( - Icons.account_circle, - color: Colors.black, - ), - title: Text( - "View profile", - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600), - ), - horizontalTitleGap: 0, - ), - ) - ], - )))), - ); - }, - child: Row( - children: [ - Icon( - Icons.ac_unit_outlined, - color: Colors.blue[700], - ), - SizedBox( - width: 5, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "${controller.myProfile!.postKarma}", - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold), - ), - Text( - "karma", - style: TextStyle(color: Colors.grey), - ) - ], - ) - ], - )), - SizedBox( - width: 10, - ), - SizedBox( - width: 10, - ), - GestureDetector( - child: Row( + GestureDetector( + onTap: (){ + showDialog( + context: context, + builder: (ctx) => AlertDialog( + content: Container( + decoration: BoxDecoration( + borderRadius:BorderRadius.circular(20), + ), + width: MediaQuery.of(context).size.width/1, + height: MediaQuery.of(context).size.height/2, + child: ( + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 30,), + CircleAvatar( + radius:70, + backgroundImage: NetworkImage("${controller.myProfile!.profilePicture}"), + ), + SizedBox(height: 130,), + Padding( + padding: const EdgeInsetsDirectional.only(end: 30), + child: Text( + 'u/${controller.myProfile!.displayName}', + style: TextStyle(fontSize: 17, fontWeight: FontWeight.w500), + ), + ), + SizedBox(height: 10,), + Expanded( + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("${controller.myProfile!.postKarma}"), + Text("Post Karma", + style: TextStyle( + color: Colors.grey[400], + fontSize: 14 + ), + ), + ], + ), + ), + SizedBox(width:20,), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("${controller.myProfile!.commentkarma}"), + Text("Comment Karma", + style: TextStyle( + color: Colors.grey[400], + fontSize: 14 + ), + ), + ], + ), + ], + ), + ), + SizedBox(height: 10,), + Padding( + padding: const EdgeInsetsDirectional.only(end: 10), + child: ListTile( + onTap: () + { + Navigator.of(context).pushNamed(MyProfileScreen.routeName, + arguments: userName); + }, + leading: Icon(Icons.account_circle,color: Colors.black,), + title: Text("View profile",style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.w600),), + horizontalTitleGap: 0, + ), + ) + ], + ) + ) + ) + ), + ); + }, + child: Row( + children: [ + Icon(Icons.ac_unit_outlined,color: Colors.blue[700],), + SizedBox(width: 5,), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("${controller.myProfile!.postKarma}",style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),), + Text("karma", + style: TextStyle( + color: Colors.grey + ), + ) + ], + ) + ], + )), + SizedBox(width: 10,), + + SizedBox(width: 10,), + GestureDetector(child: Row( children: [ - Icon( - Icons.text_snippet_rounded, - color: Colors.blue[700], - ), + Icon(Icons.text_snippet_rounded,color: Colors.blue[700],), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - "1m 2d", + Text("1m 2d",style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),), + Text("Reddit ago", style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold), - ), - Text( - "Reddit ago", - style: TextStyle(color: Colors.grey), + color: Colors.grey + ), ) ], ) @@ -321,6 +270,7 @@ class endDrawer extends StatelessWidget { onTap: () { Navigator.of(context).pushNamed(CreateCommunity.routeName); // Navigator.pop(context); + }, ), ListTile( @@ -331,7 +281,7 @@ class endDrawer extends StatelessWidget { style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600), ), onTap: () { - Get.to(Saved()); + Get.to(Saved()); }, ), ListTile( @@ -342,24 +292,13 @@ class endDrawer extends StatelessWidget { style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600), ), onTap: () { - Get.to(History()); + Get.to(History()); }, ), SizedBox( height: 20.h, ), - ListTile( - horizontalTitleGap: 3, - leading: Icon(IconBroken.Setting), - title: Text( - 'Log out', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600), - ), - onTap: () { - Auth().logOut(context); - Navigator.of(context).pushNamed(Login.routeName); - }, - ), + ListTile( horizontalTitleGap: 3, leading: Icon(IconBroken.Setting), @@ -377,4 +316,4 @@ class endDrawer extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/lib/home/widgets/new_drawer.dart b/lib/home/widgets/new_drawer.dart index f1667eab..3eff29a3 100644 --- a/lib/home/widgets/new_drawer.dart +++ b/lib/home/widgets/new_drawer.dart @@ -245,4 +245,4 @@ class MyDrawer extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/lib/home/widgets/recently_visited_list.dart b/lib/home/widgets/recently_visited_list.dart index 1d7f0caa..44a3c739 100644 --- a/lib/home/widgets/recently_visited_list.dart +++ b/lib/home/widgets/recently_visited_list.dart @@ -1,74 +1,74 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:get/get_core/src/get_main.dart'; -import 'package:post/home/controller/home_controller.dart'; -import 'package:post/home/widgets/community_container.dart'; -import 'package:post/home/widgets/subscribed_community_container.dart'; -import 'package:post/networks/const_endpoint_data.dart'; - -import '../../create_community/screens/create_community.dart'; -import '../../createpost/controllers/posts_controllers.dart'; -import '../../icons/icon_broken.dart'; -import 'container_in_recently_visited.dart'; - -class RecentlyVisitedDrawer extends StatelessWidget { - - final HomeController controller; - const RecentlyVisitedDrawer({ - Key? key, - required this.controller, - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Drawer( - elevation: 20.0, - child: SingleChildScrollView( - child: Column( - children: [ - const SizedBox( - height: 40, - ), - const Divider( - height: 3, - ), - Row( - children: [ - IconButton(onPressed: (){ - controller.isRecentlyVisitedDrawer.value=false; - }, icon: Icon(IconBroken.Arrow___Left_2)), - SizedBox(width: 5,), - Text( - "Recently Visited", - style: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 16, - color: Colors.black), - ), - Spacer(), - TextButton( - onPressed: (){ - controller.recentlyVisited.clear(); - }, child: - Text("Clear all", - style: TextStyle( - color: Colors.grey, - fontSize: 14 - ), - ) - ), - ], - ), - SizedBox(height: 8,), - Column( - children: - List.generate(4, (index) => - RecentlyVisitedContainer(nameOfSubreddit: "coross", iconOfSubreddit: "https://png.pngtree.com/element_our/20190530/ourmid/pngtree-correct-icon-image_1267804.jpg") - ) - ) - ], - ), - ), - ); - } -} +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:post/home/controller/home_controller.dart'; +import 'package:post/home/widgets/community_container.dart'; +import 'package:post/home/widgets/subscribed_community_container.dart'; +import 'package:post/networks/const_endpoint_data.dart'; + +import '../../create_community/screens/create_community.dart'; +import '../../createpost/controllers/posts_controllers.dart'; +import '../../icons/icon_broken.dart'; +import 'container_in_recently_visited.dart'; + +class RecentlyVisitedDrawer extends StatelessWidget { + + final HomeController controller; + const RecentlyVisitedDrawer({ + Key? key, + required this.controller, + }) : super(key: key); + @override + Widget build(BuildContext context) { + return Drawer( + elevation: 20.0, + child: SingleChildScrollView( + child: Column( + children: [ + const SizedBox( + height: 40, + ), + const Divider( + height: 3, + ), + Row( + children: [ + IconButton(onPressed: (){ + controller.isRecentlyVisitedDrawer.value=false; + }, icon: Icon(IconBroken.Arrow___Left_2)), + SizedBox(width: 5,), + Text( + "Recently Visited", + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16, + color: Colors.black), + ), + Spacer(), + TextButton( + onPressed: (){ + controller.recentlyVisited.clear(); + }, child: + Text("Clear all", + style: TextStyle( + color: Colors.grey, + fontSize: 14 + ), + ) + ), + ], + ), + SizedBox(height: 8,), + Column( + children: + List.generate(4, (index) => + RecentlyVisitedContainer(nameOfSubreddit: "coross", iconOfSubreddit: "https://png.pngtree.com/element_our/20190530/ourmid/pngtree-correct-icon-image_1267804.jpg") + ) + ) + ], + ), + ), + ); + } +} From fbe35425982ed332ffb3d03eaee43ae2d7b6dad1 Mon Sep 17 00:00:00 2001 From: Ahmed Fawzy <99263226+belfooz@users.noreply.github.com> Date: Fri, 23 Dec 2022 21:04:38 +0200 Subject: [PATCH 3/3] Add files via upload --- .../controllers/posts_controllers.dart | 153 +-- lib/createpost/screens/createpost.dart | 1085 +++++++++++------ lib/createpost/screens/finalpost.dart | 614 +++++----- lib/createpost/services/post_services.dart | 22 +- lib/createpost/widgets/type_of_post_web.dart | 265 ++++ 5 files changed, 1361 insertions(+), 778 deletions(-) create mode 100644 lib/createpost/widgets/type_of_post_web.dart diff --git a/lib/createpost/controllers/posts_controllers.dart b/lib/createpost/controllers/posts_controllers.dart index 3f7c3857..ee03ba31 100644 --- a/lib/createpost/controllers/posts_controllers.dart +++ b/lib/createpost/controllers/posts_controllers.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; @@ -18,21 +19,21 @@ class PostController extends GetxController { List moderatedSubreddits = [].obs; RxString subredditToSubmitPost = "".obs; - RxString iconOfSubredditToSubmittPost = "".obs; - RxString idOfSubredditToSubmittPost = "".obs; - RxBool showMore = false.obs; + RxString iconOfSubredditToSubmittPost="".obs; + RxString idOfSubredditToSubmittPost="".obs; + RxBool showMore=false.obs; RxBool isPostSpoiler = false.obs; RxBool isPostNSFW = false.obs; RxBool isLoading = true.obs; final services = PostServices(); Rx postTitle = TextEditingController().obs; - Rx textPost = quill.QuillController.basic().obs; + Rx textPost=quill.QuillController.basic().obs; Rx urlPost = TextEditingController().obs; RxString typeOfPost = ''.obs; GlobalKey formKey = GlobalKey(); GlobalKey formKeyUrl = GlobalKey(); - List? imageFileList = [].obs; + List? imageFileList = [].obs; Future? initializeVideoPlayerFuture; @@ -40,23 +41,22 @@ class PostController extends GetxController { final videoFile = Rx(null); final videoController = Rx(null); //Flairs belonging to subreddit - List flairsOfSubreddit = [].obs; - RxString idOfFlair = "".obs; - RxString textOfFlair = "".obs; - RxString textColorOfFlair = "None".obs; - RxString backgroundColorOfFlair = "None".obs; - RxBool isSubredditHasFlair = false.obs; - RxBool isFromHomeDirect = true.obs; - List checking = [].obs; - RxInt checkFromWhich = 0.obs; + ListflairsOfSubreddit=[].obs; + RxString idOfFlair="".obs; + RxString textOfFlair="".obs; + RxString textColorOfFlair="None".obs; + RxString backgroundColorOfFlair="None".obs; + RxBool isSubredditHasFlair=false.obs; + RxBool isFromHomeDirect=true.obs; + Listchecking=[].obs; + RxInt checkFromWhich=0.obs; dynamic argumentData = Get.arguments; @override - void onInit() { - _fetchHouses(); + void onInit() + { getSubreddits(); super.onInit(); } - // @override // onClose() // { @@ -64,33 +64,32 @@ class PostController extends GetxController { // typeOfPost.value=''; // super.onClose(); // } - getFlairsOfSubreddit() async { + getFlairsOfSubreddit() async{ final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); - try { + try{ print('/subreddit/${subredditToSubmitPost}/flairs'); - await DioClient.get(path: '/subreddits/${subredditToSubmitPost}/flair') - .then((value) { + await DioClient.get(path:'/subreddits/${subredditToSubmitPost}/flair').then((value){ print("Flairs returned are $value"); - value.data['data'].forEach((val) { + value.data['data'].forEach((val) + { flairsOfSubreddit.add(FlairModel.fromJson(val)); }); }); - checking = List.filled(flairsOfSubreddit.length + 1, false); - print( - "the size of returned list of flairs of subreddit is ${flairsOfSubreddit.length}"); + checking = List.filled(flairsOfSubreddit.length+1, false); + print("the size of returned list of flairs of subreddit is ${flairsOfSubreddit.length}"); print("the size of checking list is ${checking.length}"); - } catch (e) { - print( - "error in fetching the flairs of ${subredditToSubmitPost} subreddit -> $e"); } - } + catch(e){ + print("error in fetching the flairs of ${subredditToSubmitPost} subreddit -> $e"); + } + } getSubreddits() async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); try { - await DioClient.get(path: '$mySubreddits/subscriber').then((value) { + await DioClient.get(path:'$mySubreddits/subscriber').then((value) { print("subs list $value"); value.data['data'].forEach((value1) { subscribedSubreddits.add(userSubredditsResponse.fromJson(value1)); @@ -98,7 +97,7 @@ class PostController extends GetxController { }); }); - await DioClient.get(path: '$mySubreddits/moderator').then((value) { + await DioClient.get(path:'$mySubreddits/moderator').then((value) { print("moderator list $value"); value.data['data'].forEach((value1) { moderatedSubreddits.add(userSubredditsResponse.fromJson(value1)); @@ -111,66 +110,73 @@ class PostController extends GetxController { print("error in fething subreddits of user $error"); } } - - sendPost(BuildContext context) async { + Future sendPost(BuildContext context, {required String title,required String text,required String kind ,required String url,required String owner,required String ownerType,required bool nsfw,required bool spoiler}) async { final prefs = await SharedPreferences.getInstance(); DioClient.init(prefs); - var response; + var response ; try { - response = await DioClient.post(path: "/posts", data: { - "title": "AHMED", - //postTitle.value.text , - "kind": typeOfPost.value as String, - "text": "KKKK", - //(DeltaToHTML.encodeJson(textPost.value.document.toDelta().toJson())) as String, - //"url":urlPost.value.text as String , - "owner": idOfSubredditToSubmittPost.value as String, - "ownerType": - (subredditToSubmitPost.value == "Myprofile") ? "User" : "Subreddit", - // "nsfw": isPostNSFW.value , - // "spoiler": isPostSpoiler.value , + response= await DioClient.post(path: "/posts", data:{ + "title": title , + "kind": kind, + "text":text, + "url":url, + "owner":owner, + "ownerType": ownerType, + "nsfw": nsfw , + "spoiler": spoiler , "sendReplies": true, - - // "flairId":idOfFlair.value as String , - // "flairText":textOfFlair.value as String, - - // "title": "post", - // "kind": "self", - // "text": "Test comment count", - // "owner": "63a193ffe3d2b7ad4a939978", - // "ownerType": "User", - // "nsfw": false, - // "spoiler": true, - // "sendReplies": true + "suggestedSort":"hot" }); - print("YA RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"); if (response.statusCode == 200 || response.statusCode == 201) { - print("response of sending post ${response.data}"); ScaffoldMessenger.of(context).showSnackBar( - SnackBar( + const SnackBar( content: Text("sent successfuly", style: TextStyle(color: Colors.white)), backgroundColor: Colors.green), ); - print(response.statusCode); - print("the id of post created ${response.data["data"]["_id"]}"); - //print(json.decode(response.data)['message']); } - // return response.data["data"]["_id"]; + return response.data["data"]["_id"]; } catch (e) { print("error in sending the post -> $e"); - // return 0; + return ""; } } - - Future _fetchHouses() async { + Future sendPostWithFlair(BuildContext context, {required String title,required String text,required String kind ,required String url,required String owner,required String ownerType,required bool nsfw,required bool spoiler,required String textFlair,required String idFlair}) async { + final prefs = await SharedPreferences.getInstance(); + DioClient.init(prefs); + var response ; try { - ///here fitch Your Posts - } finally { - isLoading(false); + response = await DioClient.post(path: "/posts", data: { + "title": title, + "kind": kind, + "text": text, + "url": url, + "owner": owner, + "ownerType": ownerType, + "nsfw": nsfw, + "spoiler": spoiler, + "sendReplies": true, + "flairId": idOfFlair, + "flairText": textOfFlair, + "suggestedSort":"hot" + }); + if (response.statusCode == 200 || response.statusCode == 201) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text("sent successfuly", + style: TextStyle(color: Colors.white)), + backgroundColor: Colors.green), + ); + } + return response.data["data"]["_id"]; + } + catch (e) { + print("error in sending the post -> $e"); + return ""; } } + Future createPost() async { try { isLoading.value = true; @@ -183,10 +189,9 @@ class PostController extends GetxController { isLoading(false); } } - Future getVideo() async { Future videoFiles = - ImagePicker().pickVideo(source: ImageSource.gallery); + ImagePicker().pickVideo(source: ImageSource.gallery); videoFiles.then((file) async { videoFile.value = File(file!.path); videoController.value = VideoPlayerController.file(videoFile.value!); @@ -219,4 +224,6 @@ class PostController extends GetxController { typeOfPost.close(); super.dispose(); } + + } diff --git a/lib/createpost/screens/createpost.dart b/lib/createpost/screens/createpost.dart index 38e8b99c..8e968364 100644 --- a/lib/createpost/screens/createpost.dart +++ b/lib/createpost/screens/createpost.dart @@ -1,22 +1,34 @@ ///////////////////////BY ME/////////////////////////////////////////// import 'dart:convert'; +import 'dart:io'; import 'package:post/delta_to_html.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; -// import 'package:post/discover/discover.dart'; +import 'package:multi_image_picker/multi_image_picker.dart'; +import 'package:post/discover/discover.dart'; import 'package:post/home/screens/home_layout.dart'; import 'dart:async'; +import '../../home/controller/home_controller.dart'; +import '../../home/widgets/community_container.dart'; +import '../../home/widgets/custom_upper_bar.dart'; import '../../icons/icon_broken.dart'; import '../controllers/posts_controllers.dart'; import '../screens/posttocommunity.dart'; import '../widgets/type_of_post.dart'; +import '../widgets/type_of_post_web.dart'; import 'finalpost.dart'; + + import 'package:flutter_quill/flutter_quill.dart' as quill; + class CreatePostSCreen extends StatefulWidget { + // const CreatePostSCreen({ // Key? key, // this.name="", @@ -26,443 +38,756 @@ class CreatePostSCreen extends StatefulWidget { // final String name; @override State createState() => _CreatePostSCreenState(); + } class _CreatePostSCreenState extends State { // const CreatePostSCreen({super.key}); final ImagePicker imagePicker = ImagePicker(); final ImagePicker videoPicker = ImagePicker(); - final PostController controller = Get.put(PostController(), permanent: false); - + final PostController controller = Get.put( + PostController(),permanent: false + ); + final HomeController controllerForHome = Get.put( + HomeController(),permanent: false + ); Future? initializeVideoPlayerFuture; @override - void initState() { + void initState() + { + // TODO: implement initState - if (Get.arguments[0] == 0) { - controller.isFromHomeDirect.value = true; - } else { - controller.isFromHomeDirect.value = false; - controller.iconOfSubredditToSubmittPost.value = Get.arguments[1]; - controller.subredditToSubmitPost.value = Get.arguments[2]; + if(Get.arguments[0]==0) + { + controller.isFromHomeDirect.value=true; + } + else + { + controller.isFromHomeDirect.value=false; + controller.iconOfSubredditToSubmittPost.value=Get.arguments[1] ; + controller.subredditToSubmitPost.value=Get.arguments[2] ; } super.initState(); } @override Widget build(BuildContext context) { - return Obx( - () => WillPopScope( - onWillPop: () async { - final value = (controller.imageFileList!.length > 0 || - controller.videoFile.value != null || - controller.urlPost.value.text != "") - ? await showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - ), - width: MediaQuery.of(context).size.width / 0.001, - height: MediaQuery.of(context).size.height / 10, - child: (Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Discard Post Submission?', - style: TextStyle( - fontSize: 17, fontWeight: FontWeight.w500), - ), - SizedBox( - height: 10, - ), - Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () { - Get.back(); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Colors.grey[200], - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(30), - ), - ), - child: const Text( - 'Cancel', - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.w600, - ), - ), + double ScreenSizeWidth = MediaQuery.of(context).size.width; + + final isDesktop = ScreenSizeWidth >= 700; + final isMobile = ScreenSizeWidth < 700; + if (isDesktop){ + return Obx(()=> + Scaffold( + backgroundColor: const Color(0xA2D4E4FA), + appBar: PreferredSize( preferredSize: Size(700, 60),child: UpBar(controller: controllerForHome, controllerForCreatePost: controller,)), + body:SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + SizedBox(height: 70,), + Padding( + padding: const EdgeInsetsDirectional.only(end: 600.0), + child: Text("Create a Post",style: TextStyle(fontSize: 18,fontWeight: FontWeight.bold),), + ), + SizedBox(height: 10,), + Padding( + padding: const EdgeInsetsDirectional.only(end: 600.0), + child: Container( + width: 300, + height: 50, + color: Colors.white, + child:PopupMenuButton( + + child: Row( + children: [ + // Icon(Icons.home_filled), + SizedBox(width: 20,), + Text("choose a community"), + SizedBox(width: 80,), + Icon(Icons.arrow_drop_down_sharp) + ], + ), + elevation: 0, + color: Colors.white, + offset:Offset(0,35) , + itemBuilder: (context)=>[ + PopupMenuItem( + value:1, + child: Container( + width: 300, + child: Column( + children:List.generate(controller.moderatedSubreddits.length, (index) => CommunityContainer(nameOfSubreddit: controller.moderatedSubreddits[index].subredditName!, iconOfSubreddit: controller.moderatedSubreddits[index].icon!)) ), - ), - SizedBox( - width: 5, - ), - Expanded( - child: ElevatedButton( - onPressed: () { - controller.textPost.value.clear(); - controller.postTitle.value.clear(); - controller.imageFileList!.clear(); - controller.videoFile.value = null; - controller.videoController.value = null; - controller.urlPost.value.clear(); - Get.to(HomeLayoutScreen()); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Colors.red[700], - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(30), - ), - ), - child: const Text( - 'Discard', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.w600, - ), - ), + ) + + ), + PopupMenuItem( + value:2, + child: Container( + width: 300, + child: Column( + children:List.generate(controller.subscribedSubreddits.length, (index) => CommunityContainer(nameOfSubreddit: controller.subscribedSubreddits[index].subredditName!, iconOfSubreddit: controller.subscribedSubreddits[index].icon!)) ), - ), - ], - ) + ) + + ), ], - ))), - ); - }) - : null; - - if (value != null) { - return Future.value(value); - } else { - return Future.value(true); - } - }, - child: Scaffold( - backgroundColor: Colors.white, - body: Form( - key: controller.formKey, - child: Column( - children: [ - const SizedBox(height: 40.0), - Row( - children: [ - IconButton( - onPressed: () { - // Get.delete(); - Get.back(); - }, - color: Colors.black45, - icon: Icon( - Icons.close, - size: 32.0, + ) ), ), - const Spacer(), + SizedBox(height: 20,), Padding( - padding: const EdgeInsetsDirectional.only(end: 20.0), - child: controller.isLoading.value - ? const CircularProgressIndicator( - color: Colors.blue, - ) - : MaterialButton( - onPressed: () { - if (controller.formKeyUrl.currentState! - .validate() && - controller.postTitle.value.text != "") { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Processing Data')), - ); - if (controller.isFromHomeDirect.value == - true) { - Get.to(BuildSubreddit()); - } else { - Get.to(FinalPost()); - } - } - }, - elevation: 0.0, - height: 35.0, - minWidth: 80.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20.0)), - color: controller.postTitle.value.text == "" - ? Colors.grey[100] - : Colors.blue[900], - child: Text( - "Next", - style: TextStyle( - color: Colors.grey[400], + padding: const EdgeInsetsDirectional.only(start: 150), + child: Row( + children: [ + + InkWell( + onTap: (){ + controller.typeOfPost.value = "self"; + controller.typeOfPost.update((val) { }); + + }, + child: Container( + padding: EdgeInsetsDirectional.only(start: 10), + height: 50, + width: 100, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.black,width: 0.5) + ), + child: Center( + + child: Row( + children: [ + Icon( + Icons.post_add, + color: Colors.black, + ), + const SizedBox(width: 3,), + Text( + "Post", + style: TextStyle( + color: Colors.black + ) + ) + ], ), ), ), - ), - ], - ), - SizedBox( - height: 10, - ), - Visibility( - visible: !controller.isFromHomeDirect.value, - child: Padding( - padding: const EdgeInsetsDirectional.only(start: 14), - child: Row( - children: [ - GestureDetector( - onTap: () { - Get.to(BuildSubreddit()); - }, - child: Row( - children: [ - CircleAvatar( - backgroundImage: NetworkImage( - '${controller.iconOfSubredditToSubmittPost}'), - radius: 16.0, - ), - SizedBox( - width: 4.0, + ), + InkWell( + onTap: (){ + controller.imageFileList!.clear(); + selectImages(); + print( + "lenght of list is ${controller.imageFileList!.length}"); + controller.typeOfPost.value = "image"; + }, + child: Container( + padding: EdgeInsetsDirectional.only(start: 10), + height: 50, + width: 180, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.black,width: 0.5) ), - ElevatedButton.icon( - onPressed: () { - Get.to(BuildSubreddit()); - }, - icon: Text( - controller.subredditToSubmitPost.value, - style: const TextStyle(color: Colors.black), + child: Center( + + child: Row( + children: [ + Icon( + Icons.camera_alt, + color: Colors.black, + ), + const SizedBox(width: 3,), + Text( + "Images ", + style: TextStyle( + color: Colors.black + ) + ) + ], ), - label: const Icon( - IconBroken.Arrow___Down_2, - color: Colors.black, - size: 15, + ), + ), + ), + InkWell( + onTap: (){ + controller.videoFile.value=null; + controller.videoController.value=null; + controller.getVideo(); + controller.typeOfPost.value = "video"; + }, + child: Container( + padding: EdgeInsetsDirectional.only(start: 10), + height: 50, + width: 180, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.black,width: 0.5) + ), + child: Center( + + child: Row( + children: [ + Icon( + Icons.video_camera_back_outlined, + color: Colors.black, + ), + const SizedBox(width: 3,), + Text( + "Video", + style: TextStyle( + color: Colors.black + ) + ) + ], ), - style: ButtonStyle( - elevation: - MaterialStateProperty.all(0), - backgroundColor: - MaterialStateProperty.all(Colors.white), + ), + ), + ), + InkWell( + onTap: (){ + controller.typeOfPost.value = "link"; + controller.typeOfPost.update((val) { }); + }, + child: Container( + padding: EdgeInsetsDirectional.only(start: 10), + height: 50, + width: 100, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.black,width: 0.5) + ), + child: Center( + + child: Row( + children: [ + Icon( + Icons.link, + color: Colors.black, + ), + const SizedBox(width: 3,), + Text( + "Link", + style: TextStyle( + color: Colors.black + ) + ) + ], ), ), - ], + ), ), - ), - const Spacer(), - TextButton( - onPressed: () => showModalBottomSheet( - context: context, - builder: (context) => Center( - child: Column( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - const Expanded( - child: Center( - child: Text( - "Community Standards"))), - ElevatedButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - Colors.blue[900], - ), - ), - onPressed: () { - Navigator.pop(context); - }, - child: Text( - "understand", - style: TextStyle( - color: Colors.white, - ), - ), - ) - ], - ), - )), - child: const Text( - "Rules", - style: TextStyle(color: Colors.blue), - )) - ], + + ], + ), ), - ), - ), - const SizedBox( - height: 10, - ), - Padding( - padding: const EdgeInsetsDirectional.only(start: 10.0), - child: TextFormField( - onChanged: (value) { - controller.postTitle.refresh(); - }, - validator: ((value) { - if (value == null || value.isEmpty) { - return 'Please enter some text'; - } - return null; - }), - controller: controller.postTitle.value, - enabled: true, - style: const TextStyle( - fontSize: 20.0, fontWeight: FontWeight.w700), - showCursor: true, - cursorColor: Colors.blue, - cursorHeight: 20.0, - textAlign: TextAlign.start, - decoration: const InputDecoration( - hintText: "An interesting title", - border: InputBorder.none), - ), - ), - const SizedBox( - height: 10.0, - ), - const SizedBox( - height: 10.0, - ), - Expanded( - child: BuildFormType( - controller: controller, - )), - MaterialButton( - child: Text("press"), - onPressed: () { - print(controller.textPost.value.document - .toDelta() - .toJson()); - print( - "==============================================================="); - print((DeltaToHTML.encodeJson(controller - .textPost.value.document - .toDelta() - .toJson()))); - print((jsonEncode(controller.textPost.value.document - .toDelta() - .toJson())) - .toString() - .runtimeType); - print(controller.textPost.value.getPlainText); - print(controller.textPost.value.getPlainText()); - print(controller.textPost.value.document.toPlainText()); - print(controller.textPost.value.document); - print(controller.urlPost.value.text); - print(controller.textPost.value.document - .toPlainText() - .runtimeType); - print(controller.textPost.value.document.runtimeType); - print(controller.textPost.value.runtimeType); - }), - Padding( - padding: - const EdgeInsetsDirectional.only(start: 20, bottom: 10), - child: Row( - children: [ - IconButton( - onPressed: () { - controller.typeOfPost.value = "self"; - }, - icon: const Icon(IconBroken.Document), + SizedBox(height: 10,), + Container( + width: 1000, + height: 50, + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: Colors.white, ), - IconButton( - onPressed: () async { - controller.imageFileList!.clear(); - selectImages(); - print( - "lenght of list is ${controller.imageFileList!.length}"); - controller.typeOfPost.value = "image"; - }, - icon: const Icon(IconBroken.Image_2)), - IconButton( - onPressed: () { - controller.videoFile.value = null; - controller.videoController.value = null; - controller.getVideo(); - controller.typeOfPost.value = "video"; + + child:TextFormField( + onChanged: (value) { + controller.postTitle.refresh(); }, - icon: const Icon(IconBroken.Video), + validator: ((value) { + if (value == null || value.isEmpty) { + return 'Please enter some text'; + } + return null; + }), + controller: controller.postTitle.value, + enabled: true, + style: const TextStyle( + fontSize: 20.0, fontWeight: FontWeight.w700), + showCursor: true, + cursorColor: Colors.blue, + cursorHeight: 20.0, + textAlign: TextAlign.start, + decoration: const InputDecoration( + hintText: "Title", + border:OutlineInputBorder( + borderSide: BorderSide(width: 20,color: Colors.black) + )), ), - IconButton( - onPressed: () { - controller.typeOfPost.value = "link"; - }, - icon: const Icon(IconBroken.Bookmark), + ), + SizedBox(height: 20,), + BuildFormTypeWeb(controller:controller), + SizedBox(height: 10,), + Padding( + padding: const EdgeInsetsDirectional.only(start: 20.0), + child: Row( + children: [ + /// Spoiler + InkWell( + onTap: (){ + if (controller.isPostSpoiler.value == false) { + controller.isPostSpoiler.value = true; + controller.isPostSpoiler.refresh(); + } else { + controller.isPostSpoiler.value = false; + controller.isPostSpoiler.refresh(); + } + + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20,vertical: 5), + decoration: BoxDecoration( + color:(controller.isPostSpoiler.value==true)? Colors.red:Colors.white, + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: Colors.grey + ) + ), + child: Row( + children: [ + Icon(Icons.add, + color: Colors.black, + size: 20,), + const SizedBox(width: 5,), + Text( + "Spoiler", + style:TextStyle(color: Colors.black) + ) + ], + ), + ), + ), + const SizedBox(width: 5,), + /// NSFW + InkWell( + onTap: (){ + if (controller.isPostNSFW.value == false) { + controller.isPostNSFW.value = true; + controller.isPostNSFW.refresh(); + } else { + controller.isPostNSFW.value = false; + controller.isPostNSFW.refresh(); + } + }, + + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20,vertical: 5), + decoration: BoxDecoration( + color:(controller.isPostNSFW.value==true)? Colors.red:Colors.white, + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: Colors.black + ) + ), + child: Row( + children: const [ + Icon(Icons.add, + color: Colors.black,size: 20,), + SizedBox(width: 5,), + Text( + "NSFW", + style: TextStyle(color: Colors.black), + ) + ], + ), + ), + ), + const SizedBox(width: 700,), + InkWell( + onTap: (){ + if(controller.postTitle.value.text!=""&&controller.formKeyUrl.currentState!.validate()) + { + controller.sendPost(context, + title: controller.postTitle.value.text, + text: (DeltaToHTML.encodeJson(controller.textPost.value.document.toDelta().toJson())).toString(), + kind: controller.typeOfPost.value, + url: controller.urlPost.value.text, + owner: (controller.idOfSubredditToSubmittPost.value), + ownerType:"Subreddit" , + nsfw: controller.isPostNSFW.value, + spoiler: controller.isPostSpoiler.value, + ); + controller.postTitle.value.clear(); + controller.urlPost.value.clear(); + controller.textPost.value.clear(); + controller.isPostSpoiler.value=false; + controller.isPostNSFW.value=false; + // Navigator.pop(context); + Get.to(HomeLayoutScreen()); + } + else return; + }, + + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20,vertical: 5), + decoration: BoxDecoration( + color:(controller.postTitle.value.text=="")? Colors.white:Colors.blue, + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: Colors.black + ) + ), + child: Row( + children: const [ + SizedBox(width: 5,), + Text( + "Post", + style: TextStyle(color: Colors.black), + ) + ], + ), + ), + ), + ], ), - ], - ), - ), - const SizedBox( - height: 10.0, - ), - const SizedBox( - height: 10.0, + ), + SizedBox(height: 100,) + ], ), - Expanded( - child: BuildFormType( - controller: controller, - )), - Padding( - padding: - const EdgeInsetsDirectional.only(start: 20, bottom: 10), - child: Row( + ) + ), + ); + } + return Obx(()=> + WillPopScope( + onWillPop: () async { + final value = ( controller.imageFileList!.length>0 || controller.videoFile.value != null || controller.urlPost.value.text != "")?await + showDialog(context: context, + builder: (context) + { + return AlertDialog( + content: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + ), + width: MediaQuery + .of(context) + .size + .width / 0.001, + height: MediaQuery + .of(context) + .size + .height / 10, + child: ( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Discard Post Submission?', + style: TextStyle( + fontSize: 17, fontWeight: FontWeight.w500), + ), + SizedBox(height: 10,), + Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.grey[200], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 30), + ), + ), + child: + const Text( + 'Cancel', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + SizedBox(width: 5,), + Expanded( + child: ElevatedButton( + onPressed: () { + controller.textPost.value.clear(); + controller.postTitle.value.clear(); + controller.imageFileList!.clear(); + controller.videoFile.value=null; + controller.videoController.value=null; + controller.urlPost.value.clear(); + Get.to(HomeLayoutScreen()); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red[700], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 30), + ), + ), + child: + const Text( + 'Discard', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ], + ) + ], + ) + ) + ), + ); + } + ) : null ; + + if (value!=null) + { + return Future.value(value); + }else + { + return Future.value(true); + } + }, + child: Scaffold( + backgroundColor: Colors.white, + body: Form( + key: controller.formKey, + child: Column( + children: [ + const SizedBox(height: 40.0), + Row( children: [ IconButton( onPressed: () { - controller.typeOfPost.value = "text"; + // Get.delete(); + Get.back(); }, - icon: const Icon(IconBroken.Document), + color: Colors.black45, icon: Icon( + Icons.close, + size: 32.0, ), - IconButton( - onPressed: () async { - controller.imageFileList!.clear(); - selectImages(); - print( - "lenght of list is ${controller.imageFileList!.length}"); - controller.typeOfPost.value = "image"; - }, - icon: const Icon(IconBroken.Image_2)), - IconButton( - onPressed: () { - controller.videoFile.value = null; - controller.videoController.value = null; - controller.getVideo(); - controller.typeOfPost.value = "video"; - }, - icon: const Icon(IconBroken.Video), ), - IconButton( - onPressed: () { - controller.typeOfPost.value = "url"; - }, - icon: const Icon(IconBroken.Bookmark), + const Spacer(), + Padding( + padding: const EdgeInsetsDirectional.only(end: 20.0), + child: controller.isLoading.value + ? const CircularProgressIndicator( + color: Colors.blue, + ) + : MaterialButton( + onPressed: () { + if ( controller.formKeyUrl.currentState!.validate() && controller.postTitle.value.text !="") { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Processing Data')), + ); + if(controller.isFromHomeDirect.value==true) + { + Get.to(BuildSubreddit()); + } + else + { + Get.to(FinalPost()); + } + } + }, + elevation: 0.0, + height: 35.0, + minWidth: 80.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0)), + color: controller.postTitle.value.text == "" + ? Colors.grey[100] + : Colors.blue[900], + child: Text( + "Next", + style: TextStyle( + color: Colors.grey[400], + ), + ), + ), ), + ], ), - ), - ], + SizedBox(height: 10,), + Visibility( + visible: !controller.isFromHomeDirect.value, + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 14), + child: Row( + children: [ + GestureDetector( + onTap: () + { + Get.to(BuildSubreddit()); + }, + child: Row( + children: [ + CircleAvatar( + backgroundImage: NetworkImage('${controller.iconOfSubredditToSubmittPost}'), + radius: 16.0, + ), + SizedBox( + width: 4.0, + ), + ElevatedButton.icon( + onPressed: () { + Get.to(BuildSubreddit()); + }, + icon: Text( + controller.subredditToSubmitPost.value, + style: const TextStyle(color: Colors.black), + ), + label: const Icon( + IconBroken.Arrow___Down_2, + color: Colors.black, + size: 15, + ), + style: ButtonStyle( + elevation: MaterialStateProperty.all(0), + backgroundColor: + MaterialStateProperty.all(Colors.white), + ), + ), + ], + ), + ), + const Spacer(), + TextButton( + onPressed: () => showModalBottomSheet( + context: context, + builder: (context) => Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Expanded( + child: Center( + child: Text( + "Community Standards"))), + ElevatedButton( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + Colors.blue[900], + ), + ), + onPressed: () { + Navigator.pop(context); + }, + child: Text( + "understand", + style: TextStyle( + color: Colors.white, + ), + ), + ) + ], + ), + )), + child: const Text( + "Rules", + style: TextStyle(color: Colors.blue), + )) + ], + ), + ), + ), + const SizedBox(height: 10,), + Padding( + padding: const EdgeInsetsDirectional.only(start: 10.0), + child: TextFormField( + onChanged: (value) { + controller.postTitle.refresh(); + }, + validator: ((value) { + if (value == null || value.isEmpty) { + return 'Please enter some text'; + } + return null; + }), + controller: controller.postTitle.value, + enabled: true, + style: const TextStyle( + fontSize: 20.0, fontWeight: FontWeight.w700), + showCursor: true, + cursorColor: Colors.blue, + cursorHeight: 20.0, + textAlign: TextAlign.start, + decoration: const InputDecoration( + hintText: "An interesting title", + border: InputBorder.none), + ), + ), + + const SizedBox( + height: 10.0, + ), + + const SizedBox( + height: 10.0, + ), + Expanded(child: BuildFormType(controller: controller,)), + Padding( + padding: const EdgeInsetsDirectional.only(start: 20, bottom: 10), + child: Row( + children: [ + IconButton( + onPressed: () { + controller.typeOfPost.value = "self"; + }, + icon: const Icon(IconBroken.Document), + ), + IconButton( + onPressed: () async { + controller.imageFileList!.clear(); + selectImages(); + print( + "lenght of list is ${controller.imageFileList!.length}"); + controller.typeOfPost.value = "image"; + }, + icon: const Icon(IconBroken.Image_2)), + IconButton( + onPressed: () { + controller.videoFile.value=null; + controller.videoController.value=null; + controller.getVideo(); + controller.typeOfPost.value = "video"; + }, + icon: const Icon(IconBroken.Video), + ), + IconButton( + onPressed: () { + controller.typeOfPost.value = "link"; + }, + icon: const Icon(IconBroken.Bookmark), + ), + ], + ), + ), + + + + ], + ), ), ), ), - ), ); } - @override void dispose() { // TODO: implement dispose Get.delete(); super.dispose(); } - void selectImages() async { - final List? selectedImages = await imagePicker.pickMultiImage(); + final List? selectedImages = (await imagePicker.pickMultiImage()).cast(); if (selectedImages!.isNotEmpty) { controller.imageFileList!.addAll(selectedImages); } diff --git a/lib/createpost/screens/finalpost.dart b/lib/createpost/screens/finalpost.dart index e1f60995..f2c1673b 100644 --- a/lib/createpost/screens/finalpost.dart +++ b/lib/createpost/screens/finalpost.dart @@ -1,5 +1,8 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:post/createpost/model/send_post_model.dart'; import '../../delta_to_html.dart'; @@ -8,6 +11,7 @@ import '../../icons/icon_broken.dart'; import '../controllers/posts_controllers.dart'; import 'package:responsive_sizer/responsive_sizer.dart'; +import '../services/post_services.dart'; import 'flair_list.dart'; class FinalPost extends StatefulWidget { @@ -17,347 +21,331 @@ class FinalPost extends StatefulWidget { class _FinalPostState extends State { // const FinalPost({Key? key}) : super(key: key); - final PostController controller = Get.put(PostController(), permanent: false); - + final PostController controller = Get.put( + PostController(),permanent: false + ); + final services = PostServices(); @override Widget build(BuildContext context) { return Obx(() => Scaffold( - backgroundColor: Colors.white, - body: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), - child: Column( + backgroundColor: Colors.white, + body: Padding( + padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), + child: Column( + children: [ + // SizedBox(height: 40.0), + Row( children: [ - // SizedBox(height: 40.0), - Row( - children: [ - Padding( - padding: const EdgeInsetsDirectional.only(start: 10.0), - child: IconButton( - color: Colors.black, - onPressed: () { - Get.back(); - }, - icon: Icon(IconBroken.Arrow___Left_2, size: 32.0), - ), - ), - SizedBox( - width: 250.0, - ), - Padding( - padding: EdgeInsetsDirectional.only(end: 1.w), - child: MaterialButton( - onPressed: () { - print(controller.postTitle.value.text); - print((controller.postTitle.value.text as String) - .runtimeType); - print(controller.typeOfPost.value); - print((DeltaToHTML.encodeJson(controller - .textPost.value.document - .toDelta() - .toJson())) - .toString()); - print(controller.urlPost.value.text); - print(controller.idOfSubredditToSubmittPost.value); - print((controller.subredditToSubmitPost.value == - "Myprofile") - ? "User" - : "Subreddit"); - print(controller.isPostNSFW.value); - print(controller.isPostSpoiler.value); - print("send replies ->true"); - print("flair id ${controller.idOfFlair.value}"); - print( - "text of flair ${controller.textOfFlair.value}"); - print("suggested sort hot"); - print("scheduled false"); - print("print data on submit"); - controller.sendPost(context); - controller.postTitle.value.clear(); - controller.urlPost.value.clear(); - controller.textPost.value.clear(); - controller.isPostSpoiler.value = false; - controller.isPostNSFW.value = false; - // Navigator.pop(context); - Get.to(HomeLayoutScreen()); - }, - elevation: 0.0, - height: 40.0, - minWidth: 80.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20.0)), - color: Colors.blue[900], - child: Text( - "post", - style: TextStyle( - color: Colors.white, - ), - ), - ), - ) - ], - ), - SizedBox( - height: 25.0, - ), Padding( - padding: const EdgeInsetsDirectional.only(start: 20.0), - child: Row( - children: [ - Row( - children: [ - CircleAvatar( - backgroundImage: NetworkImage( - '${controller.iconOfSubredditToSubmittPost}'), - radius: 16.0, - ), - SizedBox( - width: 4.0, - ), - ElevatedButton.icon( - onPressed: () { - Get.back(); - controller.isPostNSFW.value = false; - controller.isPostSpoiler.value = false; - }, - icon: Text( - controller.subredditToSubmitPost.value, - style: TextStyle(color: Colors.black), - ), - label: Icon( - IconBroken.Arrow___Down_2, - color: Colors.black, - size: 15, - ), - style: ButtonStyle( - elevation: MaterialStateProperty.all(0), - backgroundColor: - MaterialStateProperty.all(Colors.white), - ), - ), - ], - ), - Spacer(), - TextButton( - onPressed: () => showModalBottomSheet( - context: context, - builder: (context) => Center( - child: Column( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Expanded( - child: Center( - child: Text( - "Community Standards"))), - ElevatedButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - Colors.blue[900], - ), - ), - onPressed: () { - Navigator.pop(context); - }, - child: Text( - "understand", - style: TextStyle( - color: Colors.white, - ), - ), - ) - ], - ), - )), - child: Text( - "Rules", - style: TextStyle(color: Colors.blue), - )) - ], + padding: const EdgeInsetsDirectional.only(start: 10.0), + child: IconButton( + + color: Colors.black, onPressed: () { + Get.back(); + }, icon:Icon( IconBroken.Arrow___Left_2,size: 32.0), ), ), + SizedBox( + width: 250.0, + ), Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - onChanged: (value) { - controller.postTitle.value; + padding: EdgeInsetsDirectional.only(end: 1.w), + child: MaterialButton( + onPressed: () { + print( controller.postTitle.value.text); + print(( controller.postTitle.value.text as String).runtimeType); + print(controller.typeOfPost.value); + print((DeltaToHTML.encodeJson(controller.textPost.value.document.toDelta().toJson())).toString()); + print(controller.urlPost.value.text); + print(controller.idOfSubredditToSubmittPost.value); + print((controller.subredditToSubmitPost.value == "Myprofile")?"User":"Subreddit"); + print(controller.isPostNSFW.value); + print(controller.isPostSpoiler.value); + print("send replies ->true"); + print("flair id ${controller.idOfFlair.value}"); + print("text of flair ${controller.textOfFlair.value}"); + print("suggested sort hot"); + print("scheduled false"); + print("print data on submit"); + Future str; + if(controller.idOfFlair.value=="") + { + str=controller.sendPost(context, + title: controller.postTitle.value.text, + text: (DeltaToHTML.encodeJson( + controller.textPost.value.document.toDelta() + .toJson())).toString(), + kind: controller.typeOfPost.value, + url: controller.urlPost.value.text, + owner: (controller.idOfSubredditToSubmittPost + .value), + ownerType: controller.subredditToSubmitPost.value=="Myprofile"?"User":"Subreddit", + nsfw: controller.isPostNSFW.value, + spoiler: controller.isPostSpoiler.value, + ); + } + else + { + str= controller.sendPostWithFlair(context, + title: controller.postTitle.value.text, + text: (DeltaToHTML.encodeJson( + controller.textPost.value.document.toDelta() + .toJson())).toString(), + kind: controller.typeOfPost.value, + url: controller.urlPost.value.text, + owner: (controller.idOfSubredditToSubmittPost + .value), + ownerType:controller.subredditToSubmitPost.value=="Myprofile"?"User":"Subreddit", + nsfw: controller.isPostNSFW.value, + spoiler: controller.isPostSpoiler.value, textFlair: controller.textOfFlair.value, idFlair: controller.idOfFlair.value, + ); + } + if(controller.typeOfPost.value=="image") + { + for(int i=0;i(0), - fixedSize: - MaterialStateProperty.all(Size(130.0, 20.0)), - backgroundColor: (controller.isPostNSFW.value) - ? MaterialStateProperty.all( - Colors.black87, - ) - : MaterialStateProperty.all( - Colors.grey[100], - ), - ), - label: Text( - "NSFW", - style: TextStyle( - color: Colors.grey[400], - ), + backgroundColor: + MaterialStateProperty.all(Colors.white), ), - icon: Text( - "18", - style: TextStyle( - color: Colors.grey[400], - ), - )), - SizedBox( - width: 10.0, - ), - ElevatedButton.icon( - onPressed: () { - if (controller.isPostSpoiler.value == false) { - controller.isPostSpoiler.value = true; - controller.isPostSpoiler.refresh(); - } else { - controller.isPostSpoiler.value = false; - controller.isPostSpoiler.refresh(); - } - }, - style: ButtonStyle( - elevation: MaterialStateProperty.all(0), - fixedSize: MaterialStateProperty.all(Size(122.0, 20.0)), - backgroundColor: (controller.isPostSpoiler.value) - ? MaterialStateProperty.all( - Colors.black87, - ) - : MaterialStateProperty.all( - Colors.grey[100], - ), ), - label: Text( - "Spoiler", - style: TextStyle( - color: Colors.grey[400], - ), + ], + ), + Spacer(), + TextButton( + onPressed: () => showModalBottomSheet( + context: context, + builder: (context) => Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Expanded( + child: Center( + child: Text( + "Community Standards"))), + ElevatedButton( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + Colors.blue[900], + ), + ), + onPressed: () { + Navigator.pop(context); + }, + child: Text( + "understand", + style: TextStyle( + color: Colors.white, + ), + ), + ) + ], + ), + )), + child: Text( + "Rules", + style: TextStyle(color: Colors.blue), + )) + ], + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: TextFormField( + onChanged: (value) { + controller.postTitle.value; + }, + controller: controller.postTitle.value, + readOnly: true, + style: TextStyle(fontSize: 20.0), + maxLines: 2, + decoration: InputDecoration( + contentPadding: const EdgeInsets.all(10.0), + border: OutlineInputBorder( + borderSide: BorderSide(color: Colors.black), + borderRadius: BorderRadius.circular(50.0), + )), + ), + ), + Row( + children: [ + SizedBox( + width: 20.0, + ), + ElevatedButton.icon( + onPressed: () { + if (controller.isPostNSFW.value == false) { + controller.isPostNSFW.value = true; + controller.isPostNSFW.refresh(); + } else { + controller.isPostNSFW.value = false; + controller.isPostNSFW.refresh(); + } + }, + style: ButtonStyle( + elevation: MaterialStateProperty.all(0), + fixedSize: + MaterialStateProperty.all(Size(130.0, 20.0)), + backgroundColor: (controller.isPostNSFW.value) + ? MaterialStateProperty.all( + Colors.black87, + ) + : MaterialStateProperty.all( + Colors.grey[100], ), - icon: Icon( - IconBroken.Danger, + ), + label: Text( + "NSFW", + style: TextStyle( color: Colors.grey[400], ), ), - ], - ), + icon: Text( + "18", + style: TextStyle( + color: Colors.grey[400], + ), + )), SizedBox( - height: 8.0, + width: 10.0, ), - Obx( - () => Visibility( - visible: (controller.flairsOfSubreddit.length > 0) - ? true - : false, - child: ListTile( - onTap: () { - Get.to(FlairList()); - }, - horizontalTitleGap: 0.0, - title: Text( - controller.textOfFlair.isEmpty - ? "Add Flar" - : controller.textOfFlair.value, - style: TextStyle( - color: controller.textColorOfFlair.value == "None" - ? Colors.black87 - : HexColor(controller.textColorOfFlair.value), - backgroundColor: - controller.backgroundColorOfFlair.value == "None" - ? Colors.white - : HexColor( - controller.backgroundColorOfFlair.value), - ), - ), - // Text("Add flair"), - leading: Icon(IconBroken.Edit), - trailing: Icon(IconBroken.Arrow___Right_2), + ElevatedButton.icon( + onPressed: () { + if (controller.isPostSpoiler.value == false) { + controller.isPostSpoiler.value = true; + controller.isPostSpoiler.refresh(); + } else { + controller.isPostSpoiler.value = false; + controller.isPostSpoiler.refresh(); + } + }, + style: ButtonStyle( + elevation: MaterialStateProperty.all(0), + fixedSize: MaterialStateProperty.all(Size(122.0, 20.0)), + backgroundColor: (controller.isPostSpoiler.value) + ? MaterialStateProperty.all( + Colors.black87, + ) + : MaterialStateProperty.all( + Colors.grey[100], ), ), - ), - const Divider( - height: 10.0, - color: Colors.grey, + label: Text( + "Spoiler", + style: TextStyle( + color: Colors.grey[400], + ), + ), + icon: Icon( + IconBroken.Danger, + color: Colors.grey[400], + ), ), ], ), - ), - )); - } - - savePost() async { - print(controller.postTitle.value.text); - print(controller.typeOfPost.value); - print((DeltaToHTML.encodeJson( - controller.textPost.value.document.toDelta().toJson())) - .toString()); - print(controller.urlPost.value.text); - print(controller.idOfSubredditToSubmittPost.value); - print((controller.subredditToSubmitPost.value == "Myprofile") - ? "User" - : "Subreddit"); - print(controller.isPostNSFW.value); - print(controller.isPostSpoiler.value); - print("send replies ->true"); - print("flair id ${controller.idOfFlair.value}"); - print("text of flair ${controller.textOfFlair.value}"); - print("suggested sort hot"); - print("scheduled false"); - - final model = SendPostModel( - title: controller.postTitle.value.text, - kind: controller.typeOfPost.value, - text: (DeltaToHTML.encodeJson( - controller.textPost.value.document.toDelta().toJson())) - .toString(), - url: (controller.typeOfPost.value == "link") - ? controller.urlPost.value.text - : "", - owner: controller.idOfSubredditToSubmittPost.value, - ownerType: (controller.subredditToSubmitPost.value == "Myprofile") - ? "User" - : "Subreddit", - nsfw: controller.isPostNSFW.value, - spoiler: controller.isPostSpoiler.value, - sendReplies: true, - flairId: controller.idOfFlair.value, - flairText: controller.textOfFlair.value, - suggestedSort: "hot", - scheduled: false, - ); - print("AFTER TO JASON ${model.toJson()}"); - Get.to(HomeLayoutScreen()); + SizedBox( + height: 8.0, + ), + Obx(()=> + Visibility( + visible: (controller.flairsOfSubreddit.length>0)?true:false, + child: ListTile( + onTap: () + { + Get.to(FlairList()); + }, + horizontalTitleGap: 0.0, + title:Text(controller.textOfFlair.isEmpty?"Add Flar": + controller.textOfFlair.value, + style: TextStyle( + color: controller.textColorOfFlair.value=="None"? + Colors.black87: + HexColor(controller.textColorOfFlair.value), + backgroundColor: controller.backgroundColorOfFlair.value=="None"? + Colors.white: + HexColor(controller.backgroundColorOfFlair.value), + ), + ), + // Text("Add flair"), + leading: Icon(IconBroken.Edit), + trailing: Icon(IconBroken.Arrow___Right_2), + ), + ), + ), + const Divider( + height: 10.0, + color: Colors.grey, + ), + ], + ), + ), + )); } - @override void dispose() { // TODO: implement dispose diff --git a/lib/createpost/services/post_services.dart b/lib/createpost/services/post_services.dart index bfaa06b3..0f821bfb 100644 --- a/lib/createpost/services/post_services.dart +++ b/lib/createpost/services/post_services.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; @@ -5,10 +7,8 @@ import 'package:shared_preferences/shared_preferences.dart'; import '../../networks/const_endpoint_data.dart'; import '../../networks/dio_client.dart'; import '../model/send_post_model.dart'; - -class PostServices { - // were final instead of static var - +class PostServices +{ static var dio = Dio(); //static var client =http.Client(); sendPost(SendPostModel model, BuildContext context) async { @@ -16,29 +16,27 @@ class PostServices { DioClient.init(prefs); try { final response = - await DioClient.post(path: createPost, data: model.toJson()); + await DioClient.post(path: createPost, data: model.toJson()); if (response.statusCode == 200 || response.statusCode == 201) { print("response of sending post ${response.data}"); ScaffoldMessenger.of(context).showSnackBar( - SnackBar( + const SnackBar( content: Text("sent successfuly", style: TextStyle(color: Colors.white)), backgroundColor: Colors.green), ); - - // print(response.statusCode); - // print(json.decode(response.data)['message']); } } catch (e) { print("error in sending the post -> $e"); } } - - Future uploadImage(XFile file, String id) async { + Future uploadImage(File file,Future id) async { String fileName = file.path.split('/').last; FormData formData = FormData.fromMap({ - "fileName": await MultipartFile.fromFile(file.path, filename: fileName), + "file": + await MultipartFile.fromFile(file.path, filename:fileName), }); final response = await dio.post("/posts/$id/images", data: formData); } + } diff --git a/lib/createpost/widgets/type_of_post_web.dart b/lib/createpost/widgets/type_of_post_web.dart new file mode 100644 index 00000000..a94f4a1e --- /dev/null +++ b/lib/createpost/widgets/type_of_post_web.dart @@ -0,0 +1,265 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_quill/flutter_quill.dart' as quill; +import 'package:get/get.dart'; +import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart'; +// import 'package:html_editor_enhanced/html_editor.dart'; +import 'package:video_player/video_player.dart'; +import '../../createpost/controllers/posts_controllers.dart'; + +class BuildFormTypeWeb extends StatelessWidget { + BuildFormTypeWeb({ + Key? key, + required this.controller, + }) : super(key: key); + + final PostController controller; + @override + Widget build(BuildContext context) { + + return Obx( + () => Form( + key: controller.formKeyUrl, + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 10.0), + child: controller.typeOfPost.value == "link" + ? Padding( + padding: const EdgeInsetsDirectional.only(start: 10.0), + child: Container( + width: 1000, + height: 50, + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: Colors.white, + ), + + child: TextFormField( + keyboardType: TextInputType.url, + // inputFormatters: [ + // FilteringTextInputFormatter.allow( + // RegExp(r'^[a-zA-Z0-9_\-=@,\.;]+$')) + // ], + onChanged: (value) { + controller.urlPost.refresh(); + }, + validator: (value) { + // String pattern = + // r"((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?"; + RegExp regExp = RegExp( + "((http|https)://)(www.)?[a-zA-Z0-9@:%._\\+~#?&//=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)"); + if (value!.isEmpty) { + return "Please enter your website"; + } else if (!(regExp.hasMatch(value))) { + return "Website Url must be started from www"; + } else { + return null; + } + }, + controller: controller.urlPost.value, + enabled: true, + style: const TextStyle(fontSize: 14.0), + showCursor: true, + cursorColor: Colors.blue, + cursorHeight: 20.0, + toolbarOptions: const ToolbarOptions( + copy: true, cut: true, paste: true), + textAlign: TextAlign.start, + decoration: const InputDecoration( + hintText: "URL", border: InputBorder.none + //onfieldsubmitted : (string value ) {}دي بتاخد انونيمس فانكشن عشان لو اما اضغط علي سابمت يعمل اكشن معين + ), + ), + ), + ) + : controller.typeOfPost.value == "image" + ? (controller.imageFileList!.length == 0) + ? SizedBox() + : Container( + width: 1000, + height: 500, + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: Colors.white, + ), + + child: ListView.separated( + physics: BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + separatorBuilder: (BuildContext context, index) => + const SizedBox( + width: 20, + ), + itemBuilder: (BuildContext context, index) => + SizedBox( + height: 250, + width: 120, + child: Stack( + //alignment: AlignmentDirectional.topEnd, + children: [ + SizedBox( + height: 200, + width: 100, + ), + Container( + width: 100, + height: 150, + child: Image.file( + File(controller + .imageFileList![index].path), + fit: BoxFit.cover, + )), + Positioned( + top: -20, + right: -15, + child: IconButton( + onPressed: () { + controller.imageFileList! + .removeAt(index); + }, + icon: Icon( + Icons.close, + color: Colors.black, + size: 30, + )), + ), + ], + ), + ), + itemCount: controller.imageFileList!.length, + ), + ) + : (controller.typeOfPost == "video") + ? (controller.videoController.value != null) + ? Container( + width: 1000, + height: 500, + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: Colors.white, + ), + + child: FutureBuilder( + future: controller.initializeVideoPlayerFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == + ConnectionState.done) { + // If the VideoPlayerController has finished initialization, use + // the data it provides to limit the aspect ratio of the video. + return AspectRatio( + aspectRatio: controller.videoController + .value!.value.aspectRatio, + // Use the VideoPlayer widget to display the video. + child: Stack( + alignment: + AlignmentDirectional.topEnd, + children: [ + Stack( + children: [ + VideoPlayer(controller + .videoController.value!), + Center( + child: IconButton( + onPressed: () { + controller.playVideo(); + }, + icon: controller + .videoController + .value! + .value + .isPlaying + ? const Icon( + Icons.pause, + color: Colors.white, + size: 30, + ) + : const Icon( + Icons.play_arrow, + color: Colors.white, + size: 30, + ), + ), + ) + ], + ), + IconButton(onPressed: (){ + controller.videoFile.value=null; + controller.videoController.value=null; + }, icon: Icon(Icons.close)) + ]), + ); + } else { + // If the VideoPlayerController is still initializing, show a + // loading spinner. + return const Center( + child: CircularProgressIndicator()); + } + }, + ), + ) + : SizedBox() + : (controller.typeOfPost == "self") + ? Padding( + padding: const EdgeInsetsDirectional.only( + start: 10.0), + child: Container( + width: 1000, + height: 500, + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: Colors.white, + ), + child: Column( + children: [ + quill.QuillToolbar.basic( + multiRowsDisplay: true, + controller: controller.textPost.value, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(30.0), + child: quill.QuillEditor( + customStyles: quill.DefaultStyles( + color: Colors.red), + showCursor: true, + paintCursorAboveText: true, + focusNode: FocusNode(), + scrollController: ScrollController(), + scrollable: true, + padding: EdgeInsetsDirectional.only( + start: 10.0), + autoFocus: true, + expands: true, + controller: controller.textPost.value, + readOnly: false, + ), + ), + ) + ], + ), + ) + + // child: TextFormField( + // controller: controller.textPost.value, + // enabled: true, + // style: const TextStyle(fontSize: 16.0), + // showCursor: true, + // cursorColor: Colors.blue, + // cursorHeight: 20.0, + // toolbarOptions: + // const ToolbarOptions(copy: true, cut: true, paste: true), + // keyboardType: TextInputType.multiline, + // textInputAction: TextInputAction.newline, + // autofocus: true, + // maxLines: null, + // textAlign: TextAlign.start, + // decoration: const InputDecoration( + // hintText: "Add optional body text", + // border: InputBorder.none), + // ), + ) + : SizedBox()), + ), + ); + } +}