diff --git a/lib/global_widgets/expandable_text_widget.dart b/lib/global_widgets/expandable_text_widget.dart new file mode 100644 index 0000000..c834a09 --- /dev/null +++ b/lib/global_widgets/expandable_text_widget.dart @@ -0,0 +1,134 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:social_media_app/constants/colors.dart'; +import 'package:social_media_app/constants/styles.dart'; +import 'package:social_media_app/helpers/utils.dart'; + +class NxExpandableText extends StatefulWidget { + const NxExpandableText({ + super.key, + required this.text, + }); + + final String text; + + @override + NxExpandableTextState createState() => NxExpandableTextState(); +} + +class NxExpandableTextState extends State { + String? text; + bool canExpand = false; + bool isExpand = false; + + @override + Widget build(BuildContext context) { + canExpand = widget.text.length >= 200; + text = canExpand + ? (isExpand ? widget.text : widget.text.substring(0, 200)) + : (widget.text); + + return AnimatedSize( + duration: const Duration(milliseconds: 400), + child: canExpand + ? buildTextWithLinks(text!.trim()) + : RichText( + text: TextSpan( + text: text, + style: AppStyles.style14Normal.copyWith( + color: Theme.of(context).textTheme.bodyText1!.color, + height: 1.25, + ), + ), + ), + ); + } + + Text buildTextWithLinks(String textToLink, {String? text}) => Text.rich( + TextSpan( + children: [ + ...linkify(textToLink), + TextSpan( + text: isExpand ? ' ...show less' : ' ...show more', + style: AppStyles.style14Bold.copyWith( + color: ColorValues.primaryColor, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + setState(() { + isExpand = !isExpand; + }); + }, + ), + ], + style: AppStyles.style14Normal.copyWith( + color: Theme.of(context).textTheme.bodyText1!.color, + height: 1.25, + ), + ), + ); +} + +const String urlPattern = + r"(https?|http)://([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?"; +const String emailPattern = r'\S+@\S+'; +const String phonePattern = r'[\d-]{9,}'; +final RegExp linkRegExp = RegExp( + '($urlPattern)|($emailPattern)|($phonePattern)', + caseSensitive: false); + +WidgetSpan buildLinkComponent(String text, String linkToOpen) => WidgetSpan( + child: InkWell( + child: Text( + text, + style: AppStyles.style14Normal.copyWith( + color: ColorValues.primaryColor, + decoration: TextDecoration.underline, + ), + ), + onTap: () => AppUtils.openUrl(Uri.parse(linkToOpen)), + ), + ); + +List linkify(String text) { + final list = []; + final match = linkRegExp.firstMatch(text); + if (match == null) { + list.add( + TextSpan( + text: text, + style: AppStyles.style14Normal.copyWith( + color: Theme.of(Get.context!).textTheme.bodyText1!.color, + ), + ), + ); + return list; + } + + if (match.start > 0) { + list.add( + TextSpan( + text: text.substring(0, match.start), + style: AppStyles.style14Normal.copyWith( + color: Theme.of(Get.context!).textTheme.bodyText1!.color, + ), + ), + ); + } + + final linkText = match.group(0); + if (linkText!.contains(RegExp(urlPattern, caseSensitive: false))) { + list.add(buildLinkComponent(linkText, linkText)); + } else if (linkText.contains(RegExp(emailPattern, caseSensitive: false))) { + list.add(buildLinkComponent(linkText, 'mailto:$linkText')); + } else if (linkText.contains(RegExp(phonePattern, caseSensitive: false))) { + list.add(buildLinkComponent(linkText, 'tel:$linkText')); + } else { + throw Exception('Unexpected match: $linkText'); + } + + list.addAll(linkify(text.substring(match.start + linkText.length))); + + return list; +} diff --git a/lib/helpers/utils.dart b/lib/helpers/utils.dart index 58ae8fa..2a66af4 100644 --- a/lib/helpers/utils.dart +++ b/lib/helpers/utils.dart @@ -21,11 +21,34 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:video_compress/video_compress.dart'; abstract class AppUtils { + /// Close any open snack bar. + + static void closeSnackBar() { + if (Get.isSnackbarOpen) Get.back(); + } + + /// Close any open dialog. + + static void closeDialog() { + if (Get.isDialogOpen!) Get.back(); + } + + /// Close any open bottom sheet. + + static void closeBottomSheet() { + if (Get.isBottomSheetOpen ?? false) Get.back(); + } + + static void closeFocus() { + if (FocusManager.instance.primaryFocus!.hasFocus) { + FocusManager.instance.primaryFocus?.unfocus(); + } + } + /// Show Loading Dialog - static void showLoadingDialog({double? value}) { - closeDialog(); - Get.dialog( + static void showLoadingDialog({double? value, bool? barrierDismissible}) { + Get.dialog( WillPopScope( onWillPop: () async => false, child: Scaffold( @@ -53,7 +76,7 @@ abstract class AppUtils { Dimens.boxHeight12, Text( 'Please wait...', - style: AppStyles.style16Bold.copyWith( + style: AppStyles.style16Normal.copyWith( color: Theme.of(Get.context!).textTheme.bodyText1!.color, ), ), @@ -63,7 +86,7 @@ abstract class AppUtils { ), ), ), - barrierDismissible: false, + barrierDismissible: barrierDismissible ?? false, ); } @@ -116,7 +139,6 @@ abstract class AppUtils { static void showError(String message) { closeSnackBar(); - closeDialog(); closeBottomSheet(); if (message.isEmpty) return; Get.rawSnackbar( @@ -148,7 +170,6 @@ abstract class AppUtils { WillPopScope( onWillPop: () async => false, child: Scaffold( - backgroundColor: Colors.black26, body: Padding( padding: Dimens.edgeInsets16, child: Column( @@ -165,7 +186,7 @@ abstract class AppUtils { 'No Internet!', textAlign: TextAlign.center, style: AppStyles.style24Bold.copyWith( - color: ColorValues.whiteColor, + color: ColorValues.errorColor, ), ), ], @@ -290,27 +311,6 @@ abstract class AppUtils { return CupertinoIcons.info_circle_fill; } - /// Close any open snack bar. - static void closeSnackBar() { - if (Get.isSnackbarOpen) Get.back(); - } - - /// Close any open dialog. - static void closeDialog() { - if (Get.isDialogOpen ?? false) Get.back(); - } - - /// Close any open bottom sheet. - static void closeBottomSheet() { - if (Get.isBottomSheetOpen ?? false) Get.back(); - } - - static void closeFocus() { - if (FocusManager.instance.primaryFocus!.hasFocus) { - FocusManager.instance.primaryFocus?.unfocus(); - } - } - static Future saveLoginDataToLocalStorage( String token, int expiresAt) async { final storage = GetStorage(); diff --git a/lib/modules/home/views/widgets/post_widget.dart b/lib/modules/home/views/widgets/post_widget.dart index bac2d1c..c328511 100644 --- a/lib/modules/home/views/widgets/post_widget.dart +++ b/lib/modules/home/views/widgets/post_widget.dart @@ -4,16 +4,15 @@ import 'package:flutter_carousel_widget/flutter_carousel_widget.dart'; import 'package:get/get.dart'; import 'package:get_time_ago/get_time_ago.dart'; import 'package:social_media_app/apis/models/entities/post.dart'; -import 'package:social_media_app/constants/assets.dart'; import 'package:social_media_app/constants/colors.dart'; import 'package:social_media_app/constants/dimens.dart'; import 'package:social_media_app/constants/strings.dart'; import 'package:social_media_app/constants/styles.dart'; import 'package:social_media_app/extensions/string_extensions.dart'; +import 'package:social_media_app/global_widgets/avatar_widget.dart'; import 'package:social_media_app/global_widgets/cached_network_image.dart'; -import 'package:social_media_app/global_widgets/circular_asset_image.dart'; -import 'package:social_media_app/global_widgets/circular_network_image.dart'; import 'package:social_media_app/global_widgets/elevated_card.dart'; +import 'package:social_media_app/global_widgets/expandable_text_widget.dart'; import 'package:social_media_app/global_widgets/primary_icon_btn.dart'; import 'package:social_media_app/global_widgets/primary_text_btn.dart'; import 'package:social_media_app/global_widgets/video_player_widget.dart'; @@ -70,51 +69,23 @@ class _PostWidgetState extends State { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ - (widget.post.owner.avatar != null && - widget.post.owner.avatar?.url != null) - ? GestureDetector( - onTap: () => RouteManagement.goToUserProfileView( - widget.post.owner.id), - child: NxCircleNetworkImage( - imageUrl: widget.post.owner.avatar!.url!, - radius: Dimens.twenty, - ), - ) - : GestureDetector( - onTap: () => RouteManagement.goToUserProfileView( - widget.post.owner.id), - child: NxCircleAssetImage( - imgAsset: AssetValues.avatar, - radius: Dimens.twenty, - ), - ), + GestureDetector( + onTap: () => RouteManagement.goToUserProfileView( + widget.post.owner.id, + ), + child: AvatarWidget( + avatar: widget.post.owner.avatar, + size: Dimens.twenty, + ), + ), Dimens.boxWidth8, Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - GestureDetector( - onTap: () => RouteManagement.goToUserProfileView( - widget.post.owner.id), - child: Text( - "${widget.post.owner.fname} ${widget.post.owner.lname}", - style: AppStyles.style14Bold, - ), - ), - GestureDetector( - onTap: () => RouteManagement.goToUserProfileView( - widget.post.owner.id), - child: Text( - "@${widget.post.owner.uname}", - style: TextStyle( - color: Theme.of(Get.context!) - .textTheme - .subtitle1! - .color, - ), - ), - ) + _buildFullName(), + _buildUsername(), ], ), ], @@ -134,6 +105,7 @@ class _PostWidgetState extends State { NxIconButton( icon: CupertinoIcons.ellipsis_vertical, iconSize: Dimens.twenty, + iconColor: Theme.of(context).textTheme.bodyText1!.color, onTap: _showHeaderOptionBottomSheet, ), ], @@ -144,6 +116,46 @@ class _PostWidgetState extends State { ), ); + Widget _buildFullName() => GestureDetector( + onTap: () => RouteManagement.goToUserProfileView( + widget.post.owner.id, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + RichText( + text: TextSpan( + text: '${widget.post.owner.fname} ${widget.post.owner.lname}', + style: AppStyles.style14Bold.copyWith( + color: Theme.of(Get.context!).textTheme.bodyText1!.color, + ), + ), + maxLines: 1, + ), + if (widget.post.owner.isVerified) Dimens.boxWidth4, + if (widget.post.owner.isVerified) + Icon( + CupertinoIcons.checkmark_seal_fill, + color: Theme.of(Get.context!).brightness == Brightness.dark + ? Theme.of(Get.context!).textTheme.bodyText1?.color + : ColorValues.primaryColor, + size: Dimens.fourteen, + ) + ], + ), + ); + + Widget _buildUsername() => GestureDetector( + onTap: () => RouteManagement.goToUserProfileView(widget.post.owner.id), + child: Text( + "@${widget.post.owner.uname}", + style: TextStyle( + color: Theme.of(Get.context!).textTheme.subtitle1!.color, + ), + ), + ); + Widget _buildPostBody() { return Column( mainAxisSize: MainAxisSize.min, @@ -228,13 +240,8 @@ class _PostWidgetState extends State { if (widget.post.caption != null && widget.post.caption!.isNotEmpty) Dimens.boxHeight4, if (widget.post.caption != null && widget.post.caption!.isNotEmpty) - RichText( - text: TextSpan( - text: widget.post.caption!, - style: AppStyles.style14Normal.copyWith( - color: Theme.of(Get.context!).textTheme.bodyText1!.color, - ), - ), + NxExpandableText( + text: widget.post.caption!, ), Dimens.dividerWithHeight, Padding( diff --git a/lib/modules/post/views/widgets/comment_widget.dart b/lib/modules/post/views/widgets/comment_widget.dart index a0f709e..d44ea62 100644 --- a/lib/modules/post/views/widgets/comment_widget.dart +++ b/lib/modules/post/views/widgets/comment_widget.dart @@ -5,6 +5,7 @@ import 'package:social_media_app/apis/models/entities/comment.dart'; import 'package:social_media_app/constants/dimens.dart'; import 'package:social_media_app/constants/styles.dart'; import 'package:social_media_app/global_widgets/avatar_widget.dart'; +import 'package:social_media_app/global_widgets/expandable_text_widget.dart'; class CommentWidget extends StatelessWidget { const CommentWidget({Key? key, required this.comment}) : super(key: key); @@ -54,12 +55,8 @@ class CommentWidget extends StatelessWidget { ], ), Dimens.boxHeight4, - RichText( - text: TextSpan( - text: comment.comment, - style: AppStyles.style14Normal.copyWith( - color: Theme.of(context).textTheme.bodyText1!.color, - )), + NxExpandableText( + text: comment.comment, ), ], ), diff --git a/lib/modules/settings/bindings/privacy_settings_binding.dart b/lib/modules/settings/bindings/privacy_settings_binding.dart index 77169b3..4fbdf5d 100644 --- a/lib/modules/settings/bindings/privacy_settings_binding.dart +++ b/lib/modules/settings/bindings/privacy_settings_binding.dart @@ -1,9 +1,9 @@ import 'package:get/get.dart'; -import 'package:social_media_app/modules/settings/controllers/account_type_controller.dart'; +import 'package:social_media_app/modules/settings/controllers/account_privacy_controller.dart'; class PrivacySettingBinding extends Bindings { @override void dependencies() { - Get.lazyPut(AccountTypeController.new); + Get.lazyPut(AccountPrivacyController.new); } } diff --git a/lib/modules/settings/controllers/account_type_controller.dart b/lib/modules/settings/controllers/account_privacy_controller.dart similarity index 73% rename from lib/modules/settings/controllers/account_type_controller.dart rename to lib/modules/settings/controllers/account_privacy_controller.dart index f5f05de..8774626 100644 --- a/lib/modules/settings/controllers/account_type_controller.dart +++ b/lib/modules/settings/controllers/account_privacy_controller.dart @@ -10,8 +10,8 @@ import 'package:social_media_app/constants/strings.dart'; import 'package:social_media_app/helpers/utils.dart'; import 'package:social_media_app/modules/profile/controllers/profile_controller.dart'; -class AccountTypeController extends GetxController { - static AccountTypeController get find => Get.find(); +class AccountPrivacyController extends GetxController { + static AccountPrivacyController get find => Get.find(); final _profile = ProfileController.find; final _auth = AuthService.find; @@ -22,16 +22,16 @@ class AccountTypeController extends GetxController { bool get isLoading => _isLoading.value; - Future _updateAccountType(String accountType) async { - if (accountType.isEmpty) { + Future _changeAccountPrivacy(String accountPrivacy) async { + if (accountPrivacy.isEmpty) { return; } final body = { - 'accountPrivacy': accountType, + 'accountPrivacy': accountPrivacy, }; - AppUtils.printLog("Update Account Type Request..."); + AppUtils.printLog("Update AccountPrivacy Request"); AppUtils.showLoadingDialog(); _isLoading.value = true; update(); @@ -41,16 +41,20 @@ class AccountTypeController extends GetxController { final decodedData = jsonDecode(utf8.decode(response.bodyBytes)); + AppUtils.printLog(response.statusCode); + if (response.statusCode == 200) { - await _profile.fetchProfileDetails(); + await _profile.fetchProfileDetails(fetchPost: false); AppUtils.closeDialog(); _isLoading.value = false; update(); + AppUtils.printLog("Update AccountPrivacy Success"); AppUtils.showSnackBar( StringValues.updateProfileSuccessful, StringValues.success, ); } else { + AppUtils.printLog("Update AccountPrivacy Error"); AppUtils.closeDialog(); _isLoading.value = false; update(); @@ -63,19 +67,21 @@ class AccountTypeController extends GetxController { AppUtils.closeDialog(); _isLoading.value = false; update(); + AppUtils.printLog("Update AccountPrivacy Error"); AppUtils.printLog(StringValues.internetConnError); AppUtils.showSnackBar(StringValues.internetConnError, StringValues.error); } on TimeoutException { AppUtils.closeDialog(); _isLoading.value = false; update(); - AppUtils.printLog(StringValues.connTimedOut); + AppUtils.printLog("Update AccountPrivacy Error"); AppUtils.printLog(StringValues.connTimedOut); AppUtils.showSnackBar(StringValues.connTimedOut, StringValues.error); } on FormatException catch (e) { AppUtils.closeDialog(); _isLoading.value = false; update(); + AppUtils.printLog("Update AccountPrivacy Error"); AppUtils.printLog(StringValues.formatExcError); AppUtils.printLog(e); AppUtils.showSnackBar(StringValues.errorOccurred, StringValues.error); @@ -83,14 +89,15 @@ class AccountTypeController extends GetxController { AppUtils.closeDialog(); _isLoading.value = false; update(); + AppUtils.printLog("Update AccountPrivacy Error"); AppUtils.printLog(StringValues.errorOccurred); AppUtils.printLog(exc); AppUtils.showSnackBar(StringValues.errorOccurred, StringValues.error); } } - Future updateAccountType(String accountType) async { + Future changeAccountPrivacy(String accountPrivacy) async { AppUtils.closeFocus(); - await _updateAccountType(accountType.trim()); + await _changeAccountPrivacy(accountPrivacy.trim()); } } diff --git a/lib/modules/settings/views/pages/privacy/account_privacy_view.dart b/lib/modules/settings/views/pages/privacy/account_privacy_view.dart new file mode 100644 index 0000000..404a342 --- /dev/null +++ b/lib/modules/settings/views/pages/privacy/account_privacy_view.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:social_media_app/constants/dimens.dart'; +import 'package:social_media_app/constants/strings.dart'; +import 'package:social_media_app/extensions/string_extensions.dart'; +import 'package:social_media_app/global_widgets/custom_app_bar.dart'; +import 'package:social_media_app/global_widgets/custom_radio_tile.dart'; +import 'package:social_media_app/modules/profile/controllers/profile_controller.dart'; +import 'package:social_media_app/modules/settings/controllers/account_privacy_controller.dart'; + +class AccountPrivacyView extends StatelessWidget { + const AccountPrivacyView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: SizedBox( + width: Dimens.screenWidth, + height: Dimens.screenHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + NxAppBar( + title: StringValues.accountPrivacy, + padding: Dimens.edgeInsets8_16, + ), + Dimens.boxHeight16, + _buildBody(), + ], + ), + ), + ), + ); + } + + Widget _buildBody() { + return Expanded( + child: Padding( + padding: Dimens.edgeInsets0_16, + child: SingleChildScrollView( + child: GetBuilder( + builder: (logic) => Column( + children: [ + /// Public + + NxRadioTile( + padding: Dimens.edgeInsets8, + bgColor: Theme.of(Get.context!).dialogBackgroundColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(Dimens.eight), + topRight: Radius.circular(Dimens.eight), + ), + onTap: () => logic.changeAccountPrivacy(StringValues.public), + onChanged: (v) => + logic.changeAccountPrivacy(StringValues.public), + title: StringValues.public.toTitleCase(), + value: StringValues.public, + groupValue: ProfileController + .find.profileDetails.user!.accountPrivacy, + ), + + Dimens.divider, + + /// Private + + NxRadioTile( + padding: Dimens.edgeInsets8, + bgColor: Theme.of(Get.context!).dialogBackgroundColor, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(Dimens.eight), + bottomRight: Radius.circular(Dimens.eight), + ), + onTap: () => logic.changeAccountPrivacy(StringValues.private), + onChanged: (v) => + logic.changeAccountPrivacy(StringValues.private), + title: StringValues.private.toTitleCase(), + value: StringValues.private, + groupValue: ProfileController + .find.profileDetails.user!.accountPrivacy, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/modules/settings/views/pages/privacy_settings_view.dart b/lib/modules/settings/views/pages/privacy_settings_view.dart index 3ef2dcf..a2c9713 100644 --- a/lib/modules/settings/views/pages/privacy_settings_view.dart +++ b/lib/modules/settings/views/pages/privacy_settings_view.dart @@ -3,14 +3,10 @@ import 'package:get/get.dart'; import 'package:social_media_app/constants/dimens.dart'; import 'package:social_media_app/constants/strings.dart'; import 'package:social_media_app/constants/styles.dart'; -import 'package:social_media_app/extensions/string_extensions.dart'; import 'package:social_media_app/global_widgets/custom_app_bar.dart'; import 'package:social_media_app/global_widgets/custom_list_tile.dart'; -import 'package:social_media_app/global_widgets/custom_radio_tile.dart'; -import 'package:social_media_app/global_widgets/primary_icon_btn.dart'; -import 'package:social_media_app/helpers/utils.dart'; import 'package:social_media_app/modules/profile/controllers/profile_controller.dart'; -import 'package:social_media_app/modules/settings/controllers/account_type_controller.dart'; +import 'package:social_media_app/routes/route_management.dart'; class PrivacySettingsView extends StatelessWidget { const PrivacySettingsView({Key? key}) : super(key: key); @@ -67,7 +63,7 @@ class PrivacySettingsView extends StatelessWidget { StringValues.accountPrivacy, style: AppStyles.style14Bold, ), - onTap: () => _showAccountPrivacyDialog(logic), + onTap: RouteManagement.goToChangeAccountPrivacyView, ), ), @@ -135,75 +131,4 @@ class PrivacySettingsView extends StatelessWidget { ), ); } - - void _showAccountPrivacyDialog(ProfileController logic) { - AppUtils.showSimpleDialog( - GetBuilder( - init: AccountTypeController(), - builder: (con) => Padding( - padding: Dimens.edgeInsets16, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - children: [ - Text( - StringValues.accountPrivacy, - style: AppStyles.style16Bold, - ), - const Spacer(), - NxIconButton( - icon: Icons.close, - iconSize: Dimens.thirtyTwo, - onTap: AppUtils.closeDialog, - ), - ], - ), - Dimens.boxHeight24, - Column( - children: [ - NxRadioTile( - padding: Dimens.edgeInsets8, - bgColor: Theme.of(Get.context!).dialogBackgroundColor, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.eight), - topRight: Radius.circular(Dimens.eight), - ), - onTap: () => con.updateAccountType(StringValues.public), - onChanged: (value) { - con.updateAccountType(StringValues.public); - }, - title: StringValues.public.toTitleCase(), - titleStyle: AppStyles.style14Bold, - value: StringValues.public, - groupValue: logic.profileDetails.user!.accountPrivacy, - ), - Dimens.divider, - NxRadioTile( - padding: Dimens.edgeInsets8, - bgColor: Theme.of(Get.context!).dialogBackgroundColor, - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(Dimens.eight), - bottomRight: Radius.circular(Dimens.eight), - ), - onTap: () => con.updateAccountType(StringValues.public), - onChanged: (value) { - con.updateAccountType(StringValues.public); - }, - title: StringValues.public.toTitleCase(), - titleStyle: AppStyles.style14Bold, - value: StringValues.public, - groupValue: logic.profileDetails.user!.accountPrivacy, - ), - ], - ), - Dimens.boxHeight24, - ], - ), - ), - ), - ); - } } diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index f2da960..6746bf9 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -43,6 +43,7 @@ import 'package:social_media_app/modules/settings/bindings/setting_bindings.dart import 'package:social_media_app/modules/settings/views/pages/about_settings_view.dart'; import 'package:social_media_app/modules/settings/views/pages/account_settings_view.dart'; import 'package:social_media_app/modules/settings/views/pages/help_settings_view.dart'; +import 'package:social_media_app/modules/settings/views/pages/privacy/account_privacy_view.dart'; import 'package:social_media_app/modules/settings/views/pages/privacy_settings_view.dart'; import 'package:social_media_app/modules/settings/views/pages/security/change_password_view.dart'; import 'package:social_media_app/modules/settings/views/pages/security/login_activity_view.dart'; @@ -120,7 +121,9 @@ abstract class AppPages { transition: defaultTransition, ), - /// -------------------------------------------------------------- + /// ------------------------------------------------------------------------ + + /// Edit Profile Pages ----------------------------------------------------- GetPage( name: _Routes.changePassword, @@ -129,6 +132,7 @@ abstract class AppPages { binding: ChangePasswordBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editProfile, page: ProfileDetailsView.new, @@ -136,6 +140,7 @@ abstract class AppPages { binding: EditProfileBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editName, page: EditNameView.new, @@ -143,6 +148,7 @@ abstract class AppPages { binding: NameBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editUsername, page: EditUsernameView.new, @@ -150,6 +156,7 @@ abstract class AppPages { binding: UsernameBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editAbout, page: EditAboutView.new, @@ -157,6 +164,7 @@ abstract class AppPages { binding: AboutBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editDob, page: EditDOBView.new, @@ -164,6 +172,7 @@ abstract class AppPages { binding: DOBBinding(), transition: defaultTransition, ), + GetPage( name: _Routes.editGender, page: EditGenderView.new, @@ -172,7 +181,10 @@ abstract class AppPages { transition: defaultTransition, ), - /// Post Pages + /// ------------------------------------------------------------------------ + + /// Post Pages ------------------------------------------------------------- + GetPage( name: _Routes.createPost, page: CreatePostView.new, @@ -204,6 +216,16 @@ abstract class AppPages { transition: defaultTransition, ), + GetPage( + name: _Routes.postDetails, + page: PostDetailsView.new, + binding: PostDetailsBinding(), + transitionDuration: transitionDuration, + transition: defaultTransition, + ), + + /// ------------------------------------------------------------------------ + GetPage( name: _Routes.followers, page: FollowersListView.new, @@ -211,6 +233,7 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.following, page: FollowingListView.new, @@ -218,6 +241,7 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: "${_Routes.userProfile}/:userId", page: UserProfileView.new, @@ -225,15 +249,10 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), - GetPage( - name: _Routes.postDetails, - page: PostDetailsView.new, - binding: PostDetailsBinding(), - transitionDuration: transitionDuration, - transition: defaultTransition, - ), - // SETTINGS PAGES + /// ------------------------------------------------------------------------ + + /// Settings Pages -------------------------------------------------------- GetPage( name: _Routes.settings, @@ -242,12 +261,14 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.accountSettings, page: AccountSettingsView.new, transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.securitySettings, page: SecuritySettingsView.new, @@ -255,6 +276,7 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.privacySettings, page: PrivacySettingsView.new, @@ -262,18 +284,21 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.helpSettings, page: HelpSettingsView.new, transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.aboutSettings, page: AboutSettingsView.new, transitionDuration: transitionDuration, transition: defaultTransition, ), + GetPage( name: _Routes.themeSettings, page: ThemeSettingsView.new, @@ -281,7 +306,9 @@ abstract class AppPages { transition: defaultTransition, ), - // SECURITY SETTINGS + /// ------------------------------------------------------------------------ + + /// SECURITY SETTINGS ----------------------------------------------------- GetPage( name: _Routes.loginActivitySettings, page: LoginActivityView.new, @@ -290,6 +317,20 @@ abstract class AppPages { transition: defaultTransition, ), + /// ------------------------------------------------------------------------ + + /// Privacy Settings ------------------------------------------------------- + + GetPage( + name: _Routes.accountPrivacySettings, + page: AccountPrivacyView.new, + binding: PrivacySettingBinding(), + transitionDuration: transitionDuration, + transition: defaultTransition, + ), + + /// ------------------------------------------------------------------------ + /// App Update ------------------------------------------------------------- GetPage( name: _Routes.appUpdate, @@ -297,5 +338,7 @@ abstract class AppPages { transitionDuration: transitionDuration, transition: defaultTransition, ), + + /// ------------------------------------------------------------------------ ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 67b0f90..01826f8 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -18,6 +18,17 @@ abstract class AppRoutes { static const themeSettings = _Routes.themeSettings; static const loginActivitySettings = _Routes.loginActivitySettings; + static const accountPrivacySettings = _Routes.accountPrivacySettings; + static const twoFASettings = _Routes.twoFASettings; + static const postSettings = _Routes.postSettings; + static const commentsSettings = _Routes.commentsSettings; + static const momentsSettings = _Routes.momentsSettings; + static const blockedUsersSettings = _Routes.blockedUsersSettings; + static const changeEmailSettings = _Routes.changeEmailSettings; + static const changePhoneSettings = _Routes.changePhoneSettings; + static const applyForSelfVerifySettings = _Routes.applyForSelfVerifySettings; + static const applyForBlueTickSettings = _Routes.applyForBlueTickSettings; + static const deactivateAccountSettings = _Routes.deactivateAccountSettings; static const forgotPassword = _Routes.forgotPassword; static const resetPassword = _Routes.resetPassword; @@ -66,7 +77,18 @@ abstract class _Routes { static const aboutSettings = "/about_settings"; static const themeSettings = "/theme_settings"; - static const loginActivitySettings = '/login_activity'; + static const accountPrivacySettings = '/account_privacy_settings'; + static const twoFASettings = '/two_fa_settings'; + static const postSettings = '/post_settings'; + static const commentsSettings = '/comments_settings'; + static const momentsSettings = '/moments_settings'; + static const blockedUsersSettings = '/blocked_users_settings'; + static const loginActivitySettings = '/login_activity_settings'; + static const changeEmailSettings = '/change_email_settings'; + static const changePhoneSettings = '/change_phone_settings'; + static const applyForSelfVerifySettings = '/apply_for_self_verify_settings'; + static const applyForBlueTickSettings = '/apply_for_blue_tick_settings'; + static const deactivateAccountSettings = '/deactivate_account_settings'; static const forgotPassword = '/forgot_password'; static const resetPassword = '/reset_password'; diff --git a/lib/routes/route_management.dart b/lib/routes/route_management.dart index 3ab6553..b139b66 100644 --- a/lib/routes/route_management.dart +++ b/lib/routes/route_management.dart @@ -105,7 +105,7 @@ abstract class RouteManagement { Get.toNamed(AppRoutes.postDetails, arguments: [postId, post]); } - // SETTINGS + /// Settings Pages ----------------------------------------------------------- static void goToSettingsView() { Get.toNamed(AppRoutes.settings); @@ -135,17 +135,37 @@ abstract class RouteManagement { Get.toNamed(AppRoutes.themeSettings); } - /// Go to App Update View + /// -------------------------------------------------------------------------- + + /// Go to App Update View ---------------------------------------------------- + static void goToAppUpdateView() { Get.offAllNamed(AppRoutes.appUpdate); } - // SECURITY SETTINGS + /// -------------------------------------------------------------------------- + + /// Security Settings Pages -------------------------------------------------- + static void goToLoginActivityView() { Get.toNamed(AppRoutes.loginActivitySettings); } + /// -------------------------------------------------------------------------- + + /// Privacy Settings Pages -------------------------------------------------- + + static void goToChangeAccountPrivacyView() { + Get.toNamed(AppRoutes.accountPrivacySettings); + } + + /// -------------------------------------------------------------------------- + + /// Go to back Page / Close Pages -------------------------------------------- + static void goToBack() { Get.back(); } + + /// -------------------------------------------------------------------------- } diff --git a/pubspec.lock b/pubspec.lock index 0bd67d0..9645bb1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -425,7 +425,7 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "9.9.0" + version: "9.9.1" flutter_local_notifications_linux: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c6118a7..1d5200b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A social media app using Flutter, Dart, GetX, and REST API that all publish_to: "none" -version: 1.0.1+02 +version: 1.0.1+03 environment: sdk: ">=2.17.0 <3.0.0" @@ -21,7 +21,7 @@ dependencies: image_picker: ^0.8.5+3 image_cropper: ^3.0.0 - cached_network_image: ^3.2.1 + cached_network_image: ^3.2.2 photo_view: ^0.14.0 flutter_carousel_widget: ^1.1.0 @@ -36,13 +36,13 @@ dependencies: animations: ^2.0.4 flutter_linkify: ^5.0.2 share: ^2.0.4 - flutter_local_notifications: ^9.9.0 + flutter_local_notifications: ^9.9.1 emoji_picker_flutter: ^1.3.1 file_picker: ^5.0.1 path_provider: ^2.0.11 video_compress: ^3.1.1 better_player: ^0.0.83 - path: ^1.8.1 + path: ^1.8.2 flutter_screenutil: ^5.5.4 permission_handler: ^10.0.0