Skip to content

fix: npt refresh problems resolved. #1674

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
a000122
fix: text selection offset to text length to prevent text from being …
CurtlyCritchlow Jan 13, 2025
bb75706
fix: pinFocusNode moved to prevent being called after being disposed.
CurtlyCritchlow Jan 15, 2025
1d8f5a5
fix: atsign fields two character issue fixed.
CurtlyCritchlow Jan 15, 2025
a0b06e9
fix: padding added to profile relay quick button so the text field la…
CurtlyCritchlow Jan 15, 2025
794211c
fix: atsign fields refactored to ensure @ symbol is prefixed and no w…
CurtlyCritchlow Jan 15, 2025
a83619a
fix: error message is clearly show for relay text fields.
CurtlyCritchlow Jan 15, 2025
81e937e
fix: settings list items reorganized in order of importance and width…
CurtlyCritchlow Jan 15, 2025
79df17f
fix: removed the "-" from email and capitalize Back Up You Key in eng…
CurtlyCritchlow Jan 15, 2025
a9418f0
fix: refresh button remove from profile pop up menu item.
CurtlyCritchlow Jan 20, 2025
a93f2c0
fix: refresh button remove from profiles.
CurtlyCritchlow Jan 20, 2025
787e105
fix: sync progress listener added to refresh profiles when local and …
CurtlyCritchlow Jan 21, 2025
c13d4df
fix: localization added for "sync in progress.".
CurtlyCritchlow Jan 21, 2025
f6c050a
Merge branch 'trunk' into 1615-npt-desktop-refresh-button
CurtlyCritchlow Jan 21, 2025
c35008d
Merge branch 'trunk' into 1615-npt-desktop-refresh-button
CurtlyCritchlow Jan 21, 2025
276d279
fix: sync progress listener updates to ensure profile state is Profil…
CurtlyCritchlow Jan 21, 2025
794098b
chore: commented out code removed.
CurtlyCritchlow Jan 21, 2025
c5fd1be
fix: atsignify method updated to trim string before doing anything else.
CurtlyCritchlow Jan 21, 2025
19aec48
chore: build number updated.
CurtlyCritchlow Jan 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'dart:developer';

import 'package:at_client_mobile/at_client_mobile.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:npt_flutter/app.dart';
import 'package:npt_flutter/features/profile_list/bloc/profile_list_bloc.dart';

class ProfileProgressListener extends SyncProgressListener {
@override
void onSyncProgressEvent(SyncProgress syncProgress) {
final profileListBlock = App.navState.currentContext!.read<ProfileListBloc>();

if (syncProgress.syncStatus == SyncStatus.success &&
(profileListBlock.state is ProfileListLoaded &&
(profileListBlock.state as ProfileListLoaded).profiles.isEmpty)) {
profileListBlock.add(const ProfileListLoadEvent());
log('ProfileProgressListener: ProfileListLoadEvent triggered to reload profiles');
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ class _ActivateAtsignDialogState extends State<ActivateAtsignDialog> {
setState(() {
status = ActivationStatus.otpWait;
});
// pinFocusNode.
if (!pinFocusNode.hasFocus) {
pinFocusNode.requestFocus();
}
} else {
if (!mounted) return;
if (status == ActivationStatus.preparing) {
Expand All @@ -148,9 +152,6 @@ class _ActivateAtsignDialogState extends State<ActivateAtsignDialog> {
),
);
}
if (!pinFocusNode.hasFocus) {
pinFocusNode.requestFocus();
}
}

Widget get cancelButton => TextButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class _AtDirectorySelectorState extends State<AtDirectorySelector> {
Widget build(BuildContext context) {
final rootDomains = Constants.getRootDomains(context);
return BlocBuilder<OnboardingCubit, OnboardingState>(builder: (context, state) {
controller.value = TextEditingValue(text: state.rootDomain);
controller.value =
TextEditingValue(text: state.rootDomain, selection: TextSelection.collapsed(offset: state.rootDomain.length));
return TextFormField(
enabled: !widget.options.containsKey(state.atSign),
controller: controller,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ class _AtsignSelectorState extends State<AtsignSelector> {
@override
Widget build(BuildContext context) {
return BlocBuilder<OnboardingCubit, OnboardingState>(builder: (context, state) {
controller.value = TextEditingValue(text: state.atSign);
controller.value =
TextEditingValue(text: state.atSign, selection: TextSelection.collapsed(offset: state.atSign.length));
return TextFormField(
controller: controller,
onChanged: (atsign) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:npt_flutter/constants.dart';
import 'package:npt_flutter/features/onboarding/onboarding.dart';
import 'package:npt_flutter/features/onboarding/util/atsign_manager.dart';
import 'package:npt_flutter/features/onboarding/util/onboarding_util.dart';
import 'package:npt_flutter/features/onboarding/util/profile_progress_listener.dart';
import 'package:npt_flutter/features/onboarding/widgets/activate_atsign_dialog.dart';
import 'package:npt_flutter/features/onboarding/widgets/onboarding_dialog.dart';
import 'package:npt_flutter/routes.dart';
Expand Down Expand Up @@ -136,13 +137,15 @@ class _OnboardingButtonState extends State<OnboardingButton> {
switch (onboardingResult?.status ?? AtOnboardingResultStatus.cancel) {
case AtOnboardingResultStatus.success:
await initializeContactsService(rootDomain: rootDomain);
AtClientManager.getInstance().atClient.syncService.addProgressListener(ProfileProgressListener());
postOnboard(onboardingResult!.atsign!, rootDomain);
final result = await saveAtsignInformation(
AtsignInformation(
atSign: onboardingResult.atsign!,
rootDomain: rootDomain,
),
);

log('atsign result is:$result');

if (!mounted) return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,6 @@ class ProfilePopupMenuButton extends StatelessWidget {
strings.yaml: Export.getExportCallback(ExportableProfileFiletype.yaml, [json]),
}));
}),
PopupMenuItem(
child: Row(
children: [
PhosphorIcon(PhosphorIcons.arrowClockwise()),
gapW10,
Text(strings.refresh),
],
),
onTap: () {
context.read<ProfileBloc>().add(const ProfileLoadEvent(useCache: false));
}),
PopupMenuItem(
child: Row(
children: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ class _ProfileDeviceAtSignTextFieldState extends State<ProfileDeviceAtSignTextFi
},
builder: (BuildContext context, String? state) {
if (state == null) return gap0;
Future.microtask(() => controller.text = state);
Future.microtask(() => controller.value =
TextEditingValue(text: state, selection: TextSelection.collapsed(offset: state.length)));
return SizedBox(
width: Sizes.p300,
height: Sizes.p80,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:npt_flutter/features/profile/profile.dart';
import 'package:npt_flutter/styles/sizes.dart';
import 'package:npt_flutter/util/form_validator.dart';
import 'package:npt_flutter/util/general_extensions.dart';

class ProfileRelayAtSignTextField extends StatefulWidget {
const ProfileRelayAtSignTextField({super.key});
Expand All @@ -25,7 +26,8 @@ class _ProfileRelayAtSignTextFieldState extends State<ProfileRelayAtSignTextFiel
},
builder: (BuildContext context, String? relayAtsign) {
if (relayAtsign == null) return gap0;
Future.microtask(() => controller.text = relayAtsign);
Future.microtask(() => controller.value =
TextEditingValue(text: relayAtsign, selection: TextSelection.collapsed(offset: relayAtsign.length)));
return SizedBox(
width: Sizes.p200,
height: Sizes.p70,
Expand All @@ -38,9 +40,9 @@ class _ProfileRelayAtSignTextFieldState extends State<ProfileRelayAtSignTextFiel
),
validator: FormValidator.validateEmptyRelayField,
onChanged: (value) {
if (!value.startsWith('@')) {
value = '@$value';
}
value = value.atsignify();
controller.value =
TextEditingValue(text: value, selection: TextSelection.collapsed(offset: value.length));
var bloc = context.read<ProfileBloc>();
bloc.add(ProfileEditEvent(
profile: (bloc.state as ProfileLoadedState).profile.copyWith(relayAtsign: value),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ class ProfileRelayQuickButtons extends StatelessWidget {
),
),
),
const ProfileRelayAtSignTextField(),
const Padding(
padding: EdgeInsets.only(top: Sizes.p4),
child: ProfileRelayAtSignTextField(),
),
],
),
)),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import 'dart:developer';

import 'package:at_client_mobile/at_client_mobile.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Expand Down Expand Up @@ -46,7 +49,8 @@ class ProfileListView extends StatelessWidget {

final profiles = state.profiles.toList();
final isFullProfile = profiles.isNotEmpty;

log('profile: isFullProfile: $isFullProfile');
AtClientManager.getInstance().atClient.syncService.isInSync();
return Stack(
children: [
Align(
Expand All @@ -68,8 +72,6 @@ class ProfileListView extends StatelessWidget {
gapW10,
ProfileListImportButton(),
gapW10,
ProfileListRefreshButton(),
gapW10,
ProfileSelectedExportButton(),
gapW10,
ProfileSelectedDeleteButton(),
Expand Down Expand Up @@ -106,13 +108,34 @@ class ProfileListView extends StatelessWidget {
alignment: Alignment.center,
child: SvgPicture.asset('assets/empty_state_profile_bg.svg'),
),
Align(
alignment: Alignment.bottomCenter,
child: Text(
strings.emptyProfileMessage,
textAlign: TextAlign.center,
),
),
FutureBuilder(
future: AtClientManager.getInstance().atClient.syncService.isInSync(),
builder: (context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasData && snapshot.data == false) {
return Align(
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
strings.syncInProgress,
textAlign: TextAlign.center,
),
],
),
);
}
return Align(
alignment: Alignment.bottomCenter,
child: Text(
strings.emptyProfileMessage,
textAlign: TextAlign.center,
),
);
}),
],
),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,13 @@ class SettingsView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// gapH30,
CustomTextButton.discord(),
CustomTextButton.email(),
gapH10,
CustomTextButton.backUpYourKey(),
CustomTextButton.faq(),
CustomTextButton.privacyPolicy(),
CustomTextButton.email(),
CustomTextButton.discord(),
CustomTextButton.feedback(),
CustomTextButton.backUpYourKey(),
CustomTextButton.privacyPolicy(),
CustomTextButton.signOut(),
ContactListTile(),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,18 @@ class ContactListTile extends StatelessWidget {
builder: ((context, snapshot) {
if (snapshot.hasData) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 13.0),
padding: const EdgeInsets.symmetric(horizontal: Sizes.p15),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(Sizes.p10),
color: AppColor.cardColorDark,
),
child: ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: Sizes.p30),
dense: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(Sizes.p8.toFont),
),
leading: CircleAvatar(
radius: Sizes.p18.toFont,
backgroundColor: AppColor.primaryColor,
backgroundImage: snapshot.data!['image'] != null ? MemoryImage(snapshot.data!['image']) : null,
),
title: Text(
snapshot.data?['name'] ?? '',
style: bodyMedium.copyWith(fontSize: 8.toFont),
Expand All @@ -48,9 +45,6 @@ class ContactListTile extends StatelessWidget {
);
} else {
return ListTile(
leading: const CircleAvatar(
child: Icon(Icons.person),
),
title: Text(strings.noName),
subtitle: Text(strings.noAtsign),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:npt_flutter/features/settings/settings.dart';
import 'package:npt_flutter/styles/sizes.dart';
import 'package:npt_flutter/util/form_validator.dart';
import 'package:npt_flutter/util/general_extensions.dart';

class SettingsRelayAtSignTextField extends StatefulWidget {
const SettingsRelayAtSignTextField({super.key});
Expand All @@ -25,18 +26,23 @@ class _SettingsRelayAtSignTextFieldState extends State<SettingsRelayAtSignTextFi
},
builder: (BuildContext context, String? relayAtsign) {
if (relayAtsign == null) return gap0;
Future.microtask(() => controller.text = relayAtsign);
Future.microtask(() => controller.value =
TextEditingValue(text: relayAtsign, selection: TextSelection.collapsed(offset: relayAtsign.length)));
return SizedBox(
width: Sizes.p200,
height: Sizes.p70,
child: TextFormField(
controller: controller,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormValidator.validateRequiredAtsignField,
validator: FormValidator.validateEmptyRelayField,
decoration: InputDecoration(
labelText: AppLocalizations.of(context)!.custom,
errorMaxLines: 2,
),
onChanged: (value) {
value = value.atsignify();
controller.value =
TextEditingValue(text: value, selection: TextSelection.collapsed(offset: value.length));
var bloc = context.read<SettingsBloc>();
bloc.add(SettingsEditEvent(
settings: (bloc.state as SettingsLoadedState).settings.copyWith(relayAtsign: value),
Expand Down
3 changes: 2 additions & 1 deletion packages/dart/npt_flutter/lib/localization/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"atsignDialogTitle": "AtSign",
"back": "Back",
"backupKeyDialogTitle": "Please select a file to export to:",
"backupYourKey": "Back up your Key",
"backupYourKey": "Back Up Your Key",
"cancel": "Cancel",
"confirm": "Confirm",
"connected": "Connected",
Expand Down Expand Up @@ -128,6 +128,7 @@
"status": "Status",
"stopping": "Stopping",
"submit": "Submit",
"syncInProgress": "Sync in progress.",
"validationErrorAtsignField": "Field must be a valid atsign that starts with @",
"validationErrorDeviceNameField": "Field can only contain lowercase letters, digits, underscores.",
"validationErrorEmptyField": "This field cannot be left blank",
Expand Down
1 change: 1 addition & 0 deletions packages/dart/npt_flutter/lib/localization/app_es.arb
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
"status": "Estado",
"stopping": "Apagando",
"submit": "Enviar",
"syncInProgress": "Sincronización en curso.",
"validationErrorAtsignField": "El campo debe ser un atSign válido que comience con @",
"validationErrorDeviceNameField": "El campo solo puede contener letras minúsculas, dígitos, guiones bajos.",
"validationErrorEmptyField": "Este campo no puede quedar vacío",
Expand Down
5 changes: 3 additions & 2 deletions packages/dart/npt_flutter/lib/localization/app_pt.arb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
"done": "Concluído",
"duplicate": "Duplicar",
"edit": "Editar",
"email": "Suporte por E-mail",
"email": "Suporte por Email",
"emptyProfileMessage": "Nenhum perfil encontrado\nCrie ou importe um perfil para começar a usar NoPorts.",
"enableLogging": "Habilitar Log",
"errorAtKeySaveFailed": "Falha ao salvar o arquivo atKeys: {error}",
Expand Down Expand Up @@ -70,7 +70,7 @@
"minimal": "Simples",
"next": "Próximo",
"noAtsign": "Sem atSign",
"noEmailClientAvailable": "Nenhum cliente de e-mail disponível",
"noEmailClientAvailable": "Nenhum cliente de email disponível",
"noName": "Sem Nome",
"noPorts": "NoPorts",
"onboard": "Integrar",
Expand Down Expand Up @@ -128,6 +128,7 @@
"status": "Status",
"stopping": "Desligando",
"submit": "Enviar",
"syncInProgress": "Sincronização em andamento.",
"validationErrorAtsignField": "O campo deve ser um atSign válido que comece com @",
"validationErrorDeviceNameField": "O campo só pode conter letras minúsculas, dígitos e underscores.",
"validationErrorEmptyField": "Este campo não pode ser deixado em branco",
Expand Down
5 changes: 3 additions & 2 deletions packages/dart/npt_flutter/lib/localization/app_pt_BR.arb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
"done": "Concluído",
"duplicate": "Duplicar",
"edit": "Editar",
"email": "Suporte por E-mail",
"email": "Suporte por Email",
"emptyProfileMessage": "Nenhum perfil encontrado\nCrie ou importe um perfil para começar a usar NoPorts.",
"enableLogging": "Habilitar Log",
"errorAtKeySaveFailed": "Falha ao salvar o arquivo atKeys: {error}",
Expand Down Expand Up @@ -70,7 +70,7 @@
"minimal": "Simples",
"next": "Próximo",
"noAtsign": "Sem atSign",
"noEmailClientAvailable": "Nenhum cliente de e-mail disponível",
"noEmailClientAvailable": "Nenhum cliente de email disponível",
"noName": "Sem Nome",
"noPorts": "NoPorts",
"onboard": "Integrar",
Expand Down Expand Up @@ -128,6 +128,7 @@
"status": "Status",
"stopping": "Desligando",
"submit": "Enviar",
"syncInProgress": "Sincronização em andamento.",
"validationErrorAtsignField": "O campo deve ser um atSign válido que comece com @",
"validationErrorDeviceNameField": "O campo só pode conter letras minúsculas, dígitos e underscores.",
"validationErrorEmptyField": "Este campo não pode ser deixado em branco",
Expand Down
1 change: 1 addition & 0 deletions packages/dart/npt_flutter/lib/localization/app_zh.arb
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
"status": "状态",
"stopping": "正在关闭",
"submit": "提交",
"syncInProgress": "同步进行中。",
"validationErrorAtsignField": "字段必须是以 @ 开头的有效 atsign",
"validationErrorDeviceNameField": "字段只能包含小写字母、数字和下划线。",
"validationErrorEmptyField": "此字段不能为空",
Expand Down
Loading
Loading