From 91cb888427cacb8a89cbda8a6e0fd8b2aff46913 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Tue, 4 Mar 2025 20:38:11 +0530 Subject: [PATCH 1/3] add user agent for linkedin profiles and improve error widget positioning --- app/lib/pages/apps/list_item.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/lib/pages/apps/list_item.dart b/app/lib/pages/apps/list_item.dart index cc5b174e62..250e8bc75b 100644 --- a/app/lib/pages/apps/list_item.dart +++ b/app/lib/pages/apps/list_item.dart @@ -34,6 +34,10 @@ class AppListItem extends StatelessWidget { children: [ CachedNetworkImage( imageUrl: app.getImageUrl(), + httpHeaders: const { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + }, imageBuilder: (context, imageProvider) => Container( width: 48, height: 48, @@ -50,7 +54,14 @@ class AppListItem extends StatelessWidget { valueColor: AlwaysStoppedAnimation(Colors.white), ), ), - errorWidget: (context, url, error) => const Icon(Icons.error), + errorWidget: (context, url, error) => const SizedBox( + width: 48, + height: 48, + child: Icon( + Icons.error, + color: Colors.white, + ), + ), ), const SizedBox(width: 14), Expanded( From 6cf2fc684bd363982a4e9864f0536b43dc8f3200 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Tue, 4 Mar 2025 20:38:41 +0530 Subject: [PATCH 2/3] handle app author names with special chars --- app/lib/pages/apps/app_detail/app_detail.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/pages/apps/app_detail/app_detail.dart b/app/lib/pages/apps/app_detail/app_detail.dart index fd2cd213a5..bf798e098d 100644 --- a/app/lib/pages/apps/app_detail/app_detail.dart +++ b/app/lib/pages/apps/app_detail/app_detail.dart @@ -294,7 +294,7 @@ class _AppDetailPageState extends State { ), const SizedBox(height: 4), Text( - app.author, + app.author.decodeString, style: const TextStyle(color: Colors.grey, fontSize: 14), ), ], From 2042e3ab407d261b68ac53b57ec3ee598d2b10d2 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Thu, 6 Mar 2025 15:56:32 +0530 Subject: [PATCH 3/3] remove unused persona widgets and cleanup --- app/lib/pages/apps/explore_install_page.dart | 3 - .../apps/widgets/create_options_sheet.dart | 2 - .../apps/widgets/show_app_options_sheet.dart | 3 - app/lib/pages/capture/widgets/widgets.dart | 1 - app/lib/pages/chat/clone_chat_page.dart | 4 +- .../conversations/conversations_page.dart | 1 - .../pages/conversations/widgets/capture.dart | 2 - .../conversations/widgets/local_sync.dart | 3 - .../widgets/processing_capture.dart | 3 - app/lib/pages/home/page.dart | 4 +- app/lib/pages/persona/add_persona.dart | 432 ------------------ app/lib/pages/persona/persona_profile.dart | 12 +- .../twitter/verify_identity_screen.dart | 1 - app/lib/pages/persona/update_persona.dart | 328 ------------- app/lib/services/notifications.dart | 1 - 15 files changed, 11 insertions(+), 789 deletions(-) delete mode 100644 app/lib/pages/persona/add_persona.dart delete mode 100644 app/lib/pages/persona/update_persona.dart diff --git a/app/lib/pages/apps/explore_install_page.dart b/app/lib/pages/apps/explore_install_page.dart index c55c1cdf68..43891e96f5 100644 --- a/app/lib/pages/apps/explore_install_page.dart +++ b/app/lib/pages/apps/explore_install_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:friend_private/backend/auth.dart'; import 'package:friend_private/backend/schema/app.dart'; import 'package:friend_private/pages/apps/providers/add_app_provider.dart'; import 'package:friend_private/pages/apps/widgets/app_section_card.dart'; @@ -7,10 +6,8 @@ import 'package:friend_private/pages/apps/widgets/filter_sheet.dart'; import 'package:friend_private/pages/apps/list_item.dart'; import 'package:friend_private/providers/app_provider.dart'; import 'package:friend_private/providers/home_provider.dart'; -import 'package:friend_private/utils/other/temp.dart'; import 'package:provider/provider.dart'; -import '../persona/twitter/social_profile.dart'; import 'widgets/create_options_sheet.dart'; String filterValueToString(dynamic value) { diff --git a/app/lib/pages/apps/widgets/create_options_sheet.dart b/app/lib/pages/apps/widgets/create_options_sheet.dart index 9c4036dcd0..cb10e5abf9 100644 --- a/app/lib/pages/apps/widgets/create_options_sheet.dart +++ b/app/lib/pages/apps/widgets/create_options_sheet.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:friend_private/pages/apps/add_app.dart'; -import 'package:friend_private/pages/persona/add_persona.dart'; -import 'package:friend_private/pages/persona/persona_profile.dart'; import 'package:friend_private/pages/persona/persona_provider.dart'; import 'package:friend_private/providers/home_provider.dart'; import 'package:provider/provider.dart'; diff --git a/app/lib/pages/apps/widgets/show_app_options_sheet.dart b/app/lib/pages/apps/widgets/show_app_options_sheet.dart index 6d75fcef00..bf385c9b5a 100644 --- a/app/lib/pages/apps/widgets/show_app_options_sheet.dart +++ b/app/lib/pages/apps/widgets/show_app_options_sheet.dart @@ -1,15 +1,12 @@ import 'package:flutter/material.dart'; import 'package:friend_private/backend/schema/app.dart'; import 'package:friend_private/pages/apps/update_app.dart'; -import 'package:friend_private/pages/persona/persona_profile.dart'; import 'package:friend_private/pages/persona/persona_provider.dart'; import 'package:friend_private/providers/home_provider.dart'; import 'package:provider/provider.dart'; -import 'package:friend_private/pages/persona/update_persona.dart'; import 'package:friend_private/providers/app_provider.dart'; import 'package:friend_private/utils/other/temp.dart'; import 'package:friend_private/widgets/dialog.dart'; -import 'package:provider/provider.dart'; class ShowAppOptionsSheet extends StatelessWidget { final App app; diff --git a/app/lib/pages/capture/widgets/widgets.dart b/app/lib/pages/capture/widgets/widgets.dart index 5f21251b81..456ed5650b 100644 --- a/app/lib/pages/capture/widgets/widgets.dart +++ b/app/lib/pages/capture/widgets/widgets.dart @@ -7,7 +7,6 @@ import 'package:friend_private/pages/speech_profile/page.dart'; import 'package:friend_private/providers/capture_provider.dart'; import 'package:friend_private/providers/device_provider.dart'; import 'package:friend_private/providers/home_provider.dart'; -import 'package:friend_private/utils/analytics/intercom.dart'; import 'package:friend_private/utils/analytics/mixpanel.dart'; import 'package:friend_private/utils/enums.dart'; import 'package:friend_private/utils/other/temp.dart'; diff --git a/app/lib/pages/chat/clone_chat_page.dart b/app/lib/pages/chat/clone_chat_page.dart index 0319e1de29..459f4ecd4d 100644 --- a/app/lib/pages/chat/clone_chat_page.dart +++ b/app/lib/pages/chat/clone_chat_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:friend_private/utils/analytics/mixpanel.dart'; +import 'package:friend_private/gen/assets.gen.dart'; import 'package:friend_private/backend/preferences.dart'; import 'package:friend_private/backend/schema/app.dart'; import 'package:friend_private/pages/chat/page.dart'; @@ -70,7 +70,7 @@ class CloneChatPageState extends State { IconButton( padding: const EdgeInsets.all(8.0), icon: SvgPicture.asset( - 'assets/images/ic_persona_profile.svg', + Assets.images.icPersonaProfile.path, width: 28, height: 28, ), diff --git a/app/lib/pages/conversations/conversations_page.dart b/app/lib/pages/conversations/conversations_page.dart index fb91073556..03e2912e12 100644 --- a/app/lib/pages/conversations/conversations_page.dart +++ b/app/lib/pages/conversations/conversations_page.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:friend_private/backend/schema/conversation.dart'; import 'package:friend_private/pages/capture/widgets/widgets.dart'; -import 'package:friend_private/pages/conversations/widgets/local_sync.dart'; import 'package:friend_private/pages/conversations/widgets/processing_capture.dart'; import 'package:friend_private/pages/conversations/widgets/search_result_header_widget.dart'; import 'package:friend_private/pages/conversations/widgets/search_widget.dart'; diff --git a/app/lib/pages/conversations/widgets/capture.dart b/app/lib/pages/conversations/widgets/capture.dart index 6faa9e46e8..a7fbd43a68 100644 --- a/app/lib/pages/conversations/widgets/capture.dart +++ b/app/lib/pages/conversations/widgets/capture.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; -import 'package:flutter_provider_utilities/flutter_provider_utilities.dart'; import 'package:friend_private/backend/schema/bt_device/bt_device.dart'; import 'package:friend_private/pages/capture/widgets/widgets.dart'; import 'package:friend_private/providers/capture_provider.dart'; @@ -9,7 +8,6 @@ import 'package:friend_private/providers/device_provider.dart'; import 'package:friend_private/providers/onboarding_provider.dart'; import 'package:friend_private/services/services.dart'; import 'package:friend_private/utils/audio/wav_bytes.dart'; -import 'package:friend_private/widgets/dialog.dart'; import 'package:provider/provider.dart'; class LiteCaptureWidget extends StatefulWidget { diff --git a/app/lib/pages/conversations/widgets/local_sync.dart b/app/lib/pages/conversations/widgets/local_sync.dart index ba83db2582..f8fde653ca 100644 --- a/app/lib/pages/conversations/widgets/local_sync.dart +++ b/app/lib/pages/conversations/widgets/local_sync.dart @@ -1,12 +1,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:friend_private/pages/conversations/sync_page.dart'; import 'package:friend_private/pages/sdcard/sdcard_transfer_progress.dart'; import 'package:friend_private/providers/capture_provider.dart'; import 'package:friend_private/providers/conversation_provider.dart'; -import 'package:friend_private/utils/other/string_utils.dart'; -import 'package:friend_private/utils/other/temp.dart'; import 'package:provider/provider.dart'; class LocalSyncWidget extends StatefulWidget { diff --git a/app/lib/pages/conversations/widgets/processing_capture.dart b/app/lib/pages/conversations/widgets/processing_capture.dart index 8312fee8a6..ee74b8723f 100644 --- a/app/lib/pages/conversations/widgets/processing_capture.dart +++ b/app/lib/pages/conversations/widgets/processing_capture.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:friend_private/backend/preferences.dart'; import 'package:friend_private/backend/schema/conversation.dart'; @@ -9,7 +7,6 @@ import 'package:friend_private/pages/conversation_capturing/page.dart'; import 'package:friend_private/pages/processing_conversations/page.dart'; import 'package:friend_private/providers/capture_provider.dart'; import 'package:friend_private/providers/connectivity_provider.dart'; -import 'package:friend_private/providers/developer_mode_provider.dart'; import 'package:friend_private/providers/device_provider.dart'; import 'package:friend_private/utils/analytics/mixpanel.dart'; import 'package:friend_private/utils/enums.dart'; diff --git a/app/lib/pages/home/page.dart b/app/lib/pages/home/page.dart index 8a08138e6b..60e873a39d 100644 --- a/app/lib/pages/home/page.dart +++ b/app/lib/pages/home/page.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:friend_private/gen/assets.gen.dart'; import 'package:friend_private/pages/persona/persona_provider.dart'; import 'package:friend_private/backend/http/api/users.dart'; import 'package:friend_private/backend/preferences.dart'; @@ -16,7 +17,6 @@ import 'package:friend_private/pages/conversations/conversations_page.dart'; import 'package:friend_private/pages/facts/page.dart'; import 'package:friend_private/pages/home/widgets/chat_apps_dropdown_widget.dart'; import 'package:friend_private/pages/persona/persona_profile.dart'; -import 'package:friend_private/pages/persona/persona_provider.dart'; import 'package:friend_private/pages/home/widgets/speech_language_sheet.dart'; import 'package:friend_private/pages/settings/page.dart'; import 'package:friend_private/providers/app_provider.dart'; @@ -532,7 +532,7 @@ class _HomePageState extends State with WidgetsBindingObserver, Ticker IconButton( padding: const EdgeInsets.all(8.0), icon: SvgPicture.asset( - 'assets/images/ic_persona_profile.svg', + Assets.images.icPersonaProfile.path, width: 28, height: 28, ), diff --git a/app/lib/pages/persona/add_persona.dart b/app/lib/pages/persona/add_persona.dart deleted file mode 100644 index 97d26185eb..0000000000 --- a/app/lib/pages/persona/add_persona.dart +++ /dev/null @@ -1,432 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:friend_private/backend/preferences.dart'; -import 'package:friend_private/gen/assets.gen.dart'; -import 'package:friend_private/pages/persona/persona_provider.dart'; -import 'package:friend_private/providers/app_provider.dart'; -import 'package:friend_private/utils/alerts/app_snackbar.dart'; -import 'package:friend_private/utils/other/temp.dart'; -import 'package:friend_private/widgets/animated_loading_button.dart'; -import 'package:provider/provider.dart'; - -import 'twitter/social_profile.dart'; - -class AddPersonaPage extends StatefulWidget { - const AddPersonaPage({super.key}); - - @override - State createState() => _AddPersonaPageState(); -} - -class _AddPersonaPageState extends State { - void _showSuccessDialog(String url) { - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return Dialog( - backgroundColor: Colors.grey[900], - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - child: Container( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 80, - height: 80, - decoration: BoxDecoration( - color: Colors.grey[800], - shape: BoxShape.circle, - ), - child: const Icon( - Icons.check, - color: Colors.white, - size: 40, - ), - ), - const SizedBox(height: 24), - const Text( - 'Your Omi Persona is live!', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 12), - const Text( - 'Share it with anyone who\nneeds to hear back from you', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.grey, - fontSize: 16, - ), - ), - const SizedBox(height: 24), - GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData(text: "https://$url")); - AppSnackbar.showSnackbarSuccess('Persona link copied to clipboard'); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(8), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon( - Icons.link, - color: Colors.grey, - size: 20, - ), - const SizedBox(width: 8), - Text( - url, - style: const TextStyle( - color: Colors.white, - fontSize: 16, - ), - ), - ], - ), - ), - ), - const SizedBox(height: 24), - TextButton( - onPressed: () { - Navigator.of(context).pop(); - context.read().getApps(); - context.read().resetForm(); - Navigator.of(context).pop(); - }, - child: Container( - width: double.infinity, - padding: const EdgeInsets.symmetric(vertical: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: const Text( - 'Done', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - ], - ), - ), - ); - }, - ); - } - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - final provider = Provider.of(context, listen: false); - provider.nameController.text = SharedPreferencesUtil().givenName; - provider.onShowSuccessDialog = _showSuccessDialog; - }); - } - - @override - Widget build(BuildContext context) { - return PopScope( - onPopInvoked: (_) { - final provider = Provider.of(context, listen: false); - provider.resetForm(); - }, - child: Consumer(builder: (context, provider, child) { - return Scaffold( - backgroundColor: Colors.black, - appBar: AppBar( - backgroundColor: Colors.transparent, - title: const Text('Create Persona', style: TextStyle(color: Colors.white)), - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.white), - onPressed: () => Navigator.pop(context), - ), - ), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Form( - key: provider.formKey, - onChanged: () { - provider.validateForm(); - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: GestureDetector( - onTap: () async { - await provider.pickImage(); - }, - child: Container( - width: 120, - height: 120, - decoration: BoxDecoration( - color: Colors.grey.shade900, - borderRadius: BorderRadius.circular(60), - border: Border.all(color: Colors.grey.shade800), - ), - child: provider.selectedImage != null - ? ClipRRect( - borderRadius: BorderRadius.circular(60), - child: Image.file( - provider.selectedImage!, - fit: BoxFit.cover, - ), - ) - : Icon( - Icons.add_a_photo, - size: 40, - color: Colors.grey.shade400, - ), - ), - ), - ), - const SizedBox(height: 32), - Container( - decoration: BoxDecoration( - color: Colors.grey.shade900, - borderRadius: BorderRadius.circular(12.0), - ), - padding: const EdgeInsets.all(14.0), - margin: const EdgeInsets.only(top: 22), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - 'Persona Name', - style: TextStyle(color: Colors.grey.shade300, fontSize: 16), - ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0), - margin: const EdgeInsets.only(left: 2.0, right: 2.0, top: 10, bottom: 6), - decoration: BoxDecoration( - color: Colors.grey.shade800, - borderRadius: BorderRadius.circular(10.0), - ), - width: double.infinity, - child: TextFormField( - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter a username to access the persona'; - } - return null; - }, - controller: provider.nameController, - decoration: const InputDecoration( - isDense: true, - border: InputBorder.none, - hintText: 'Nik AI', - ), - ), - ), - const SizedBox( - height: 24, - ), - ], - ), - ), - const SizedBox(height: 22), - Container( - padding: const EdgeInsets.only(left: 14.0), - child: Row( - children: [ - Text( - 'Make Persona Public', - style: TextStyle(color: Colors.grey.shade400), - ), - const Spacer(), - Switch( - value: provider.makePersonaPublic, - onChanged: (value) { - provider.setPersonaPublic(value); - }, - activeColor: Colors.deepPurple, - ), - ], - ), - ), - const SizedBox(height: 24), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0, bottom: 12), - child: Text( - 'Connected Knowledge Data', - style: TextStyle( - color: Colors.grey[600], - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.grey[900], - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - Image.asset( - Assets.images.xLogoMini.path, - width: 24, - height: 24, - ), - const SizedBox(width: 12), - Text( - provider.hasTwitterConnection - ? (provider.twitterProfile['name'] ?? '') - : 'Connect Twitter', - style: const TextStyle( - color: Colors.white, - fontSize: 16, - ), - ), - const Spacer(), - if (!provider.hasTwitterConnection) - GestureDetector( - onTap: () { - routeToPage(context, const SocialHandleScreen()); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(16), - ), - child: const Text( - 'Connect', - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ) - else - GestureDetector( - onTap: () => provider.disconnectTwitter(), - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(16), - ), - child: const Text( - 'Disconnect', - style: TextStyle( - color: Colors.red, - fontSize: 12, - ), - ), - ), - ), - ], - ), - ), - const SizedBox(height: 12), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.grey[900], - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - Image.asset( - Assets.images.logoTransparent.path, - width: 24, - height: 24, - ), - const SizedBox(width: 12), - const Text( - 'Connect Omi', - style: TextStyle( - color: Colors.white, - fontSize: 16, - ), - ), - const Spacer(), - GestureDetector( - onTap: () { - if (!provider.hasOmiConnection) { - provider.toggleOmiConnection(true); - } else { - provider.disconnectOmi(); - } - provider.validateForm(); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(16), - ), - child: Text( - provider.hasOmiConnection ? 'Disconnect' : 'Connect', - style: TextStyle( - color: provider.hasOmiConnection ? Colors.red : Colors.white, - fontSize: 12, - ), - ), - ), - ), - ], - ), - ), - ], - ), - ], - ), - ), - ), - ), - bottomNavigationBar: Padding( - padding: const EdgeInsets.only(left: 24, right: 24, bottom: 52), - child: SizedBox( - width: double.infinity, - child: AnimatedLoadingButton( - onPressed: !provider.isFormValid - ? () async {} - : () async { - await provider.createPersona(); - }, - color: provider.isFormValid ? Colors.white : Colors.grey[800]!, - loaderColor: Colors.black, - text: "Create Persona", - textStyle: const TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - ); - }), - ); - } -} diff --git a/app/lib/pages/persona/persona_profile.dart b/app/lib/pages/persona/persona_profile.dart index 13daec7e94..75a84dffea 100644 --- a/app/lib/pages/persona/persona_profile.dart +++ b/app/lib/pages/persona/persona_profile.dart @@ -114,7 +114,7 @@ class _PersonaProfilePageState extends State { actions: [ // Only show settings icon for create_my_clone or home routing Consumer(builder: (context, personaProvider, _) { - if (personaProvider.routing == PersonaProfileRouting.no_device) + if (personaProvider.routing == PersonaProfileRouting.no_device) { return Padding( padding: const EdgeInsets.all(8.0), child: GestureDetector( @@ -122,14 +122,15 @@ class _PersonaProfilePageState extends State { await routeToPage(context, const SettingsPage(mode: SettingsMode.no_device)); }, child: SvgPicture.asset( - 'assets/images/ic_setting_persona.svg', + Assets.images.icSettingPersona.path, width: 44, height: 44, ), ), ); + } if (personaProvider.routing == PersonaProfileRouting.create_my_clone || - personaProvider.routing == PersonaProfileRouting.home) + personaProvider.routing == PersonaProfileRouting.home) { return Padding( padding: const EdgeInsets.all(8.0), child: GestureDetector( @@ -148,12 +149,13 @@ class _PersonaProfilePageState extends State { } }, child: SvgPicture.asset( - 'assets/images/ic_setting_persona.svg', + Assets.images.icSettingPersona.path, width: 44, height: 44, ), ), ); + } return const SizedBox.shrink(); }), ], @@ -364,7 +366,7 @@ class _PersonaProfilePageState extends State { children: [ Positioned.fill( child: Image.asset( - 'assets/images/new_background.png', + Assets.images.newBackground.path, fit: BoxFit.cover, ), ), diff --git a/app/lib/pages/persona/twitter/verify_identity_screen.dart b/app/lib/pages/persona/twitter/verify_identity_screen.dart index 64f7b46454..8b3ae529ca 100644 --- a/app/lib/pages/persona/twitter/verify_identity_screen.dart +++ b/app/lib/pages/persona/twitter/verify_identity_screen.dart @@ -1,4 +1,3 @@ -import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:friend_private/backend/http/api/apps.dart'; import 'package:friend_private/backend/preferences.dart'; diff --git a/app/lib/pages/persona/update_persona.dart b/app/lib/pages/persona/update_persona.dart deleted file mode 100644 index 54e2158d95..0000000000 --- a/app/lib/pages/persona/update_persona.dart +++ /dev/null @@ -1,328 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:friend_private/backend/schema/app.dart'; -import 'package:friend_private/gen/assets.gen.dart'; -import 'package:friend_private/main.dart'; -import 'package:friend_private/pages/persona/persona_provider.dart'; -import 'package:friend_private/pages/persona/twitter/social_profile.dart'; -import 'package:friend_private/utils/other/debouncer.dart'; -import 'package:friend_private/utils/other/temp.dart'; -import 'package:friend_private/widgets/animated_loading_button.dart'; -import 'package:provider/provider.dart'; - -class UpdatePersonaPage extends StatefulWidget { - final App? app; - final bool fromNewFlow; - const UpdatePersonaPage({super.key, this.app, required this.fromNewFlow}); - - @override - State createState() => _UpdatePersonaPageState(); -} - -class _UpdatePersonaPageState extends State { - final _debouncer = Debouncer(delay: const Duration(milliseconds: 500)); - - @override - void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) async { - if (widget.app == null) { - // TODO: Check why we need this one, previous getUserPersona() - await context.read().getVerifiedUserPersona(); - var app = context.read().userPersona; - context.read().prepareUpdatePersona(app!); - } else { - context.read().prepareUpdatePersona(widget.app!); - } - }); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Consumer(builder: (context, provider, child) { - return PopScope( - onPopInvoked: (didPop) { - if (didPop) { - context.read().resetForm(); - if (widget.fromNewFlow) { - Future.delayed(Duration.zero, () { - routeToPage(context, DeciderWidget(), replace: true); - }); - } else { - Future.delayed(Duration.zero, () { - Navigator.pop(context); - }); - } - } - }, - child: Scaffold( - backgroundColor: Colors.black, - appBar: AppBar( - backgroundColor: Colors.transparent, - title: const Text('Update Persona', style: TextStyle(color: Colors.white)), - ), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Form( - key: provider.formKey, - onChanged: () { - provider.validateForm(); - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: GestureDetector( - onTap: () async { - await provider.pickImage(); - }, - child: Container( - width: 120, - height: 120, - decoration: BoxDecoration( - color: Colors.grey.shade900, - borderRadius: BorderRadius.circular(60), - border: Border.all(color: Colors.grey.shade800), - ), - // child: provider.selectedImage != null - // ? ClipRRect( - // borderRadius: BorderRadius.circular(60), - // child: Image.file( - // provider.selectedImage!, - // fit: BoxFit.cover, - // ), - // ) - // : Icon( - // Icons.add_a_photo, - // size: 40, - // color: Colors.grey.shade400, - // ), - child: provider.selectedImage != null || provider.selectedImageUrl != null - ? (provider.selectedImageUrl == null - ? ClipRRect( - borderRadius: BorderRadius.circular(60), - child: Image.file(provider.selectedImage!, fit: BoxFit.cover)) - : ClipRRect( - borderRadius: BorderRadius.circular(60), - child: CachedNetworkImage(imageUrl: provider.selectedImageUrl!), - )) - : const Icon(Icons.add_a_photo, color: Colors.grey, size: 32), - ), - ), - ), - const SizedBox(height: 32), - Container( - decoration: BoxDecoration( - color: Colors.grey.shade900, - borderRadius: BorderRadius.circular(12.0), - ), - padding: const EdgeInsets.all(14.0), - margin: const EdgeInsets.only(top: 22), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - 'Persona Name', - style: TextStyle(color: Colors.grey.shade300, fontSize: 16), - ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0), - margin: const EdgeInsets.only(left: 2.0, right: 2.0, top: 10, bottom: 6), - decoration: BoxDecoration( - color: Colors.grey.shade800, - borderRadius: BorderRadius.circular(10.0), - ), - width: double.infinity, - child: TextFormField( - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter a valid name for your persona'; - } - return null; - }, - controller: provider.nameController, - decoration: const InputDecoration( - isDense: true, - border: InputBorder.none, - hintText: 'Nik AI', - ), - ), - ), - ], - ), - ), - const SizedBox(height: 22), - Container( - padding: const EdgeInsets.only(left: 14.0), - child: Row( - children: [ - Text( - 'Make Persona Public', - style: TextStyle(color: Colors.grey.shade400), - ), - const Spacer(), - Switch( - value: provider.makePersonaPublic, - onChanged: (value) { - provider.setPersonaPublic(value); - }, - activeColor: Colors.deepPurple, - ), - ], - ), - ), - const SizedBox(height: 24), - Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0, bottom: 12), - child: Text( - 'Connected Knowledge Data', - style: TextStyle( - color: Colors.grey[600], - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.grey[900], - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - Image.asset( - Assets.images.xLogoMini.path, - width: 24, - height: 24, - ), - const SizedBox(width: 12), - Text( - provider.hasTwitterConnection - ? (provider.twitterProfile['name'] ?? provider.twitterProfile['username']) - : 'Connect Twitter', - style: const TextStyle( - color: Colors.white, - fontSize: 16, - ), - ), - const Spacer(), - GestureDetector( - onTap: () { - if (!provider.hasTwitterConnection) { - routeToPage(context, const SocialHandleScreen()); - } else { - provider.disconnectTwitter(); - } - provider.validateForm(); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(16), - ), - child: Text( - provider.hasTwitterConnection ? 'Disconnect' : 'Connect', - style: TextStyle( - color: provider.hasTwitterConnection ? Colors.red : Colors.white, - fontSize: 12, - ), - ), - ), - ) - ], - ), - ), - const SizedBox(height: 12), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.grey[900], - borderRadius: BorderRadius.circular(12), - ), - child: Row( - children: [ - const Icon( - Icons.person_outline, - size: 24, - color: Colors.white, - ), - const SizedBox(width: 12), - const Text( - 'Connect Omi', - style: TextStyle( - color: Colors.white, - fontSize: 16, - ), - ), - const Spacer(), - GestureDetector( - onTap: () { - if (!provider.hasOmiConnection) { - provider.toggleOmiConnection(true); - } else { - provider.disconnectOmi(); - } - provider.validateForm(); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.grey[800], - borderRadius: BorderRadius.circular(16), - ), - child: Text( - provider.hasOmiConnection ? 'Disconnect' : 'Connect', - style: TextStyle( - color: provider.hasOmiConnection ? Colors.red : Colors.white, - fontSize: 12, - ), - ), - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ), - ), - bottomNavigationBar: Padding( - padding: const EdgeInsets.only(left: 24, right: 24, bottom: 52), - child: SizedBox( - width: double.infinity, - child: AnimatedLoadingButton( - onPressed: !provider.isFormValid - ? () async {} - : () async { - await provider.updatePersona(); - }, - color: provider.isFormValid ? Colors.white : Colors.grey[800]!, - loaderColor: Colors.black, - text: "Update Persona", - textStyle: const TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - ), - ); - }); - } -} diff --git a/app/lib/services/notifications.dart b/app/lib/services/notifications.dart index 31ac5a6831..20d9390ffa 100644 --- a/app/lib/services/notifications.dart +++ b/app/lib/services/notifications.dart @@ -11,7 +11,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_timezone/flutter_timezone.dart'; import 'package:friend_private/backend/http/api/notifications.dart'; -import 'package:friend_private/backend/preferences.dart'; import 'package:friend_private/backend/schema/message.dart'; import 'package:friend_private/main.dart'; import 'package:friend_private/pages/home/page.dart';