@pi-spi/app 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/lib/module/core/api.js +14 -5
  2. package/lib/module/core/api.js.map +1 -1
  3. package/lib/module/l10n/app_localizations.js.map +1 -1
  4. package/lib/module/l10n/app_localizations_en.js +8 -0
  5. package/lib/module/l10n/app_localizations_en.js.map +1 -1
  6. package/lib/module/l10n/app_localizations_fr.js +8 -0
  7. package/lib/module/l10n/app_localizations_fr.js.map +1 -1
  8. package/lib/module/l10n/app_localizations_pt.js +8 -0
  9. package/lib/module/l10n/app_localizations_pt.js.map +1 -1
  10. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js +25 -35
  11. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js.map +1 -1
  12. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js +6 -28
  13. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js.map +1 -1
  14. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js +0 -1
  15. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js.map +1 -1
  16. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js +122 -162
  17. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js.map +1 -1
  18. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page.js +0 -1
  19. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page.js.map +1 -1
  20. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js +26 -38
  21. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js.map +1 -1
  22. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page.js +0 -1
  23. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page.js.map +1 -1
  24. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.js +0 -1
  25. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.js.map +1 -1
  26. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.js +38 -93
  27. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.js.map +1 -1
  28. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.js +0 -1
  29. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.js.map +1 -1
  30. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.js +0 -1
  31. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.js.map +1 -1
  32. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js +23 -42
  33. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js.map +1 -1
  34. package/lib/module/modules/transactions/infra/transaction_output_remote.js +2 -1
  35. package/lib/module/modules/transactions/infra/transaction_output_remote.js.map +1 -1
  36. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.js +0 -1
  37. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.js.map +1 -1
  38. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.js +34 -61
  39. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.js.map +1 -1
  40. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.js +49 -62
  41. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.js.map +1 -1
  42. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.js +68 -88
  43. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.js.map +1 -1
  44. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js +77 -0
  45. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js.map +1 -0
  46. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js +49 -155
  47. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js.map +1 -1
  48. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js +8 -28
  49. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js.map +1 -1
  50. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js +0 -1
  51. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js.map +1 -1
  52. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.js +50 -42
  53. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.js.map +1 -1
  54. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.js +0 -1
  55. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.js.map +1 -1
  56. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js +0 -1
  57. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js.map +1 -1
  58. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.js +37 -67
  59. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.js.map +1 -1
  60. package/lib/module/shared/widgets/confirm_action_sheet_widget.js +34 -67
  61. package/lib/module/shared/widgets/confirm_action_sheet_widget.js.map +1 -1
  62. package/lib/module/shared/widgets/image_select_widget.js +43 -107
  63. package/lib/module/shared/widgets/image_select_widget.js.map +1 -1
  64. package/lib/module/shared/widgets/notification_dialog.js +25 -35
  65. package/lib/module/shared/widgets/notification_dialog.js.map +1 -1
  66. package/lib/module/shared/widgets/selection.js +381 -5
  67. package/lib/module/shared/widgets/selection.js.map +1 -1
  68. package/lib/typescript/src/core/api.d.ts +6 -0
  69. package/lib/typescript/src/core/api.d.ts.map +1 -1
  70. package/lib/typescript/src/l10n/app_localizations.d.ts +16 -0
  71. package/lib/typescript/src/l10n/app_localizations.d.ts.map +1 -1
  72. package/lib/typescript/src/l10n/app_localizations_en.d.ts.map +1 -1
  73. package/lib/typescript/src/l10n/app_localizations_fr.d.ts.map +1 -1
  74. package/lib/typescript/src/l10n/app_localizations_pt.d.ts.map +1 -1
  75. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.d.ts.map +1 -1
  76. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_avatar.d.ts.map +1 -1
  77. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts.d.ts.map +1 -1
  78. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts_actions.d.ts.map +1 -1
  79. package/lib/typescript/src/modules/qrcode/presentation/pages/qrcode_alias_page.d.ts.map +1 -1
  80. package/lib/typescript/src/modules/qrcode/presentation/pages/qrcode_alias_page_share.d.ts.map +1 -1
  81. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page.d.ts.map +1 -1
  82. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.d.ts.map +1 -1
  83. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.d.ts +2 -2
  84. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.d.ts.map +1 -1
  85. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_menu_widget.d.ts.map +1 -1
  86. package/lib/typescript/src/modules/transactions/infra/transaction_output_remote.d.ts.map +1 -1
  87. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.d.ts.map +1 -1
  88. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.d.ts.map +1 -1
  89. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.d.ts.map +1 -1
  90. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.d.ts +17 -0
  91. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.d.ts.map +1 -0
  92. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.d.ts +6 -2
  93. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.d.ts.map +1 -1
  94. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.d.ts.map +1 -1
  95. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.d.ts.map +1 -1
  96. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.d.ts.map +1 -1
  97. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.d.ts.map +1 -1
  98. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.d.ts.map +1 -1
  99. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts +4 -1
  100. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts.map +1 -1
  101. package/lib/typescript/src/shared/widgets/image_select_widget.d.ts +6 -4
  102. package/lib/typescript/src/shared/widgets/image_select_widget.d.ts.map +1 -1
  103. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts +2 -2
  104. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts.map +1 -1
  105. package/lib/typescript/src/shared/widgets/selection.d.ts +69 -2
  106. package/lib/typescript/src/shared/widgets/selection.d.ts.map +1 -1
  107. package/package.json +1 -1
  108. package/src/core/api.ts +11 -2
  109. package/src/l10n/app_localizations.ts +16 -0
  110. package/src/l10n/app_localizations_en.ts +8 -0
  111. package/src/l10n/app_localizations_fr.ts +8 -0
  112. package/src/l10n/app_localizations_pt.ts +8 -0
  113. package/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.tsx +25 -27
  114. package/src/modules/profile/presentation/pages/profile_page_avatar.tsx +6 -12
  115. package/src/modules/profile/presentation/pages/profile_page_contacts.tsx +0 -1
  116. package/src/modules/profile/presentation/pages/profile_page_contacts_actions.tsx +111 -117
  117. package/src/modules/qrcode/presentation/pages/qrcode_alias_page.tsx +0 -1
  118. package/src/modules/qrcode/presentation/pages/qrcode_alias_page_share.tsx +32 -40
  119. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page.tsx +0 -1
  120. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.tsx +0 -1
  121. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.tsx +20 -59
  122. package/src/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.tsx +1 -1
  123. package/src/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.tsx +1 -1
  124. package/src/modules/subscription/presentation/pages/subscription_menu_widget.tsx +25 -39
  125. package/src/modules/transactions/infra/transaction_output_remote.ts +6 -1
  126. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.tsx +0 -1
  127. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.tsx +39 -41
  128. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.tsx +41 -46
  129. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.tsx +46 -40
  130. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.tsx +92 -0
  131. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.tsx +48 -94
  132. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.tsx +4 -17
  133. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.tsx +0 -1
  134. package/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.tsx +49 -42
  135. package/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.tsx +1 -1
  136. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.tsx +0 -1
  137. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.tsx +47 -48
  138. package/src/shared/widgets/confirm_action_sheet_widget.tsx +30 -34
  139. package/src/shared/widgets/image_select_widget.tsx +46 -61
  140. package/src/shared/widgets/notification_dialog.tsx +66 -70
  141. package/src/shared/widgets/selection.tsx +292 -4
  142. package/lib/module/modules/transactions/presentation/pages/transaction_details/sheet_box.js +0 -47
  143. package/lib/module/modules/transactions/presentation/pages/transaction_details/sheet_box.js.map +0 -1
  144. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/sheet_box.d.ts +0 -10
  145. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/sheet_box.d.ts.map +0 -1
  146. package/src/modules/transactions/presentation/pages/transaction_details/sheet_box.tsx +0 -30
@@ -39,6 +39,10 @@ export interface AppLocalizations {
39
39
  readonly errorDialogOk: string;
40
40
  /** Unavailable */
41
41
  readonly indisponible: string;
42
+ /** Take a photo */
43
+ readonly imageSelectCamera: string;
44
+ /** Choose from gallery */
45
+ readonly imageSelectGalerie: string;
42
46
  /** It seems that you haven’t granted PI-SPI permission to access your location! */
43
47
  readonly locationErrorMessage: string;
44
48
  /** It seems that you haven't granted PI-SPI permission to send you notifications! */
@@ -603,6 +607,14 @@ export interface AppLocalizations {
603
607
  readonly transactionFormOthrPaysLabel: string;
604
608
  /** Financial institution */
605
609
  readonly transactionFormOthrNomLabel: string;
610
+ /** Search for a country */
611
+ readonly transactionFormOthrPaysRecherche: string;
612
+ /** No country found */
613
+ readonly transactionFormOthrPaysAucun: string;
614
+ /** Search for an institution */
615
+ readonly transactionFormOthrPspRecherche: string;
616
+ /** No institution found */
617
+ readonly transactionFormOthrPspAucune: string;
606
618
  /** Continue */
607
619
  readonly transactionFormContinueBtn: string;
608
620
  /** Save and make transfer */
@@ -871,6 +883,8 @@ export interface AppLocalizations {
871
883
  readonly transactionDetailsTicketCaisse: string;
872
884
  /** You can share the receipt */
873
885
  readonly transactionDetailsTicketCaisseSubtitle: string;
886
+ /** Share */
887
+ readonly transactionDetailsTicketPartager: string;
874
888
  /** Account */
875
889
  readonly transactionDetailsCompte: string;
876
890
  /** Institution */
@@ -1051,6 +1065,8 @@ export interface AppLocalizations {
1051
1065
  readonly qrcodePagePartageAliasTitle: string;
1052
1066
  /** Alias sharing */
1053
1067
  readonly qrcodePagePartageAliasSubTitle: string;
1068
+ /** Add my number */
1069
+ readonly qrcodePagePartageContactAjouterHint: string;
1054
1070
  /** Your contact */
1055
1071
  readonly qrcodePagePartageContactTitle: string;
1056
1072
  /** Share your alias contact */
@@ -19,6 +19,8 @@ export const AppLocalizationsEn: AppLocalizations = {
19
19
  reessayer: `Retry`,
20
20
  errorDialogOk: `Ok`,
21
21
  indisponible: `Unavailable`,
22
+ imageSelectCamera: `Take a photo`,
23
+ imageSelectGalerie: `Choose from gallery`,
22
24
  locationErrorMessage: `It seems that you haven’t granted PI-SPI permission to access your location!`,
23
25
  notificationErrorMessage: `It seems that you haven't granted PI-SPI permission to send you notifications!`,
24
26
  contactErrorMessage: `It looks like you haven't granted PI-SPI permission to access your contacts!`,
@@ -302,6 +304,10 @@ Check your Wi-Fi or mobile data, then tap Retry.`,
302
304
  transactionFormOthrMax: `The account number must not exceed 34 characters`,
303
305
  transactionFormOthrPaysLabel: `Country`,
304
306
  transactionFormOthrNomLabel: `Financial institution`,
307
+ transactionFormOthrPaysRecherche: `Search for a country`,
308
+ transactionFormOthrPaysAucun: `No country found`,
309
+ transactionFormOthrPspRecherche: `Search for an institution`,
310
+ transactionFormOthrPspAucune: `No institution found`,
305
311
  transactionFormContinueBtn: `Continue`,
306
312
  transactionFormSaveContactBtn: `Save and make transfer`,
307
313
  transactionFormVerificationTitle: `Confirmation`,
@@ -441,6 +447,7 @@ If this request comes from someone you trust, simply add their alias to your con
441
447
  transactionDetailsRecuPaiementPDFSousTitre: `You can download or share the PDF file`,
442
448
  transactionDetailsTicketCaisse: `Transaction Statement`,
443
449
  transactionDetailsTicketCaisseSubtitle: `You can share the receipt`,
450
+ transactionDetailsTicketPartager: `Share`,
444
451
  transactionDetailsCompte: `Account`,
445
452
  transactionDetailsInstitution: `Institution`,
446
453
  transactionDetailsRejet: `Reason for rejection`,
@@ -536,6 +543,7 @@ Please try again later.`,
536
543
  qrcodePagePartageQrCodeSubTitle: `Share as picture`,
537
544
  qrcodePagePartageAliasTitle: `Share the alias`,
538
545
  qrcodePagePartageAliasSubTitle: `Alias sharing`,
546
+ qrcodePagePartageContactAjouterHint: `Add my number`,
539
547
  qrcodePagePartageContactTitle: `Your contact`,
540
548
  qrcodePagePartageContactSubTitle: `Share your alias contact`,
541
549
  qrcodePagePartageAliasMessage: (name: string) => `PI Alias of ${name}`,
@@ -19,6 +19,8 @@ export const AppLocalizationsFr: AppLocalizations = {
19
19
  reessayer: `Réessayez`,
20
20
  errorDialogOk: `Compris`,
21
21
  indisponible: `Indisponible`,
22
+ imageSelectCamera: `Prendre une photo`,
23
+ imageSelectGalerie: `Choisir dans la galerie`,
22
24
  locationErrorMessage: `Il semble que vous n’ayez pas accordé à PI-SPI l’autorisation d’accéder à votre localisation!`,
23
25
  notificationErrorMessage: `Il semble que vous n’ayez pas accordé à PI-SPI l’autorisation de vous envoyer des notifications!`,
24
26
  contactErrorMessage: `Il semble que vous n’ayez pas accordé à PI-SPI l’autorisation d’accéder à vos contacts!`,
@@ -302,6 +304,10 @@ Vérifiez votre Wi-Fi ou vos données mobiles puis appuyez sur Réessayer.`,
302
304
  transactionFormOthrMax: `Le numéro de compte ne doit pas excéder 34 caractères`,
303
305
  transactionFormOthrPaysLabel: `Pays`,
304
306
  transactionFormOthrNomLabel: `Institution financière`,
307
+ transactionFormOthrPaysRecherche: `Rechercher un pays`,
308
+ transactionFormOthrPaysAucun: `Aucun pays trouvé`,
309
+ transactionFormOthrPspRecherche: `Rechercher une institution`,
310
+ transactionFormOthrPspAucune: `Aucune institution trouvée`,
305
311
  transactionFormContinueBtn: `Continuer`,
306
312
  transactionFormSaveContactBtn: `Enregistrer et faire un transfert`,
307
313
  transactionFormVerificationTitle: `Confirmation`,
@@ -441,6 +447,7 @@ Si cette demande provient d'une personne de confiance, il vous suffit d'ajouter
441
447
  transactionDetailsRecuPaiementPDFSousTitre: `Vous pouvez partager ou télécharger le PDF`,
442
448
  transactionDetailsTicketCaisse: `Reçu réglé`,
443
449
  transactionDetailsTicketCaisseSubtitle: `Vous pouvez partager le ticket de caisse`,
450
+ transactionDetailsTicketPartager: `Partager`,
444
451
  transactionDetailsCompte: `Compte`,
445
452
  transactionDetailsInstitution: `Institution`,
446
453
  transactionDetailsRejet: `Raison du rejet`,
@@ -535,6 +542,7 @@ Merci de votre compréhension.`,
535
542
  qrcodePagePartageQrCodeSubTitle: `Partage de l’image`,
536
543
  qrcodePagePartageAliasTitle: `Votre alias`,
537
544
  qrcodePagePartageAliasSubTitle: `Partage de l’alias`,
545
+ qrcodePagePartageContactAjouterHint: `Ajouter mon numéro`,
538
546
  qrcodePagePartageContactTitle: `Votre contact`,
539
547
  qrcodePagePartageContactSubTitle: `Partager le contact de votre alias`,
540
548
  qrcodePagePartageAliasMessage: (name: string) => `Alias PI de ${name}`,
@@ -19,6 +19,8 @@ export const AppLocalizationsPt: AppLocalizations = {
19
19
  reessayer: `Tente novamente`,
20
20
  errorDialogOk: `Entendi`,
21
21
  indisponible: `Indisponível`,
22
+ imageSelectCamera: `Tirar uma foto`,
23
+ imageSelectGalerie: `Escolher da galeria`,
22
24
  locationErrorMessage: `Parece que você não concedeu permissão para que o PI-SPI acesse a sua localização!`,
23
25
  notificationErrorMessage: `Parece que você não concedeu permissão ao PI-SPI para lhe enviar notificações!`,
24
26
  contactErrorMessage: `Parece que você não concedeu ao PI-SPI permissão para aceder aos seus contatos!`,
@@ -302,6 +304,10 @@ Verifique o Wi-Fi ou os dados móveis e toque em Tentar novamente.`,
302
304
  transactionFormOthrMax: `O número de conta não deve exceder 34 caracteres`,
303
305
  transactionFormOthrPaysLabel: `País`,
304
306
  transactionFormOthrNomLabel: `Instituição financeira`,
307
+ transactionFormOthrPaysRecherche: `Pesquisar um país`,
308
+ transactionFormOthrPaysAucun: `Nenhum país encontrado`,
309
+ transactionFormOthrPspRecherche: `Pesquisar uma instituição`,
310
+ transactionFormOthrPspAucune: `Nenhuma instituição encontrada`,
305
311
  transactionFormContinueBtn: `Continuar`,
306
312
  transactionFormSaveContactBtn: `Salvar e fazer um transferência`,
307
313
  transactionFormVerificationTitle: `Confirmação`,
@@ -441,6 +447,7 @@ Se este pedido for de uma pessoa de confiança, basta adicionar o alias aos seus
441
447
  transactionDetailsRecuPaiementPDFSousTitre: `Você pode compartilhar ou baixar o PDF`,
442
448
  transactionDetailsTicketCaisse: `Recebido pago`,
443
449
  transactionDetailsTicketCaisseSubtitle: `Você pode compartilhar o recibo`,
450
+ transactionDetailsTicketPartager: `Partilhar`,
444
451
  transactionDetailsCompte: `Conta`,
445
452
  transactionDetailsInstitution: `Instituição`,
446
453
  transactionDetailsRejet: `Motivo da rejeição`,
@@ -536,6 +543,7 @@ Por favor, tente novamente mais tarde`,
536
543
  qrcodePagePartageQrCodeSubTitle: `Compartilhar a imagem`,
537
544
  qrcodePagePartageAliasTitle: `Seu alias`,
538
545
  qrcodePagePartageAliasSubTitle: `Compartilhamento de alias`,
546
+ qrcodePagePartageContactAjouterHint: `Adicionar o meu número`,
539
547
  qrcodePagePartageContactTitle: `Seu contato`,
540
548
  qrcodePagePartageContactSubTitle: `Compartilhar o contato do seu alias`,
541
549
  qrcodePagePartageAliasMessage: (name: string) => `Alias PI de ${name}`,
@@ -1,6 +1,6 @@
1
1
  import { Image } from 'expo-image';
2
2
  import { useRef } from 'react';
3
- import { Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
3
+ import { Pressable, ScrollView, StyleSheet, useWindowDimensions, View } from 'react-native';
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
5
 
6
6
  import { Images } from '../../../../core/assets';
@@ -9,10 +9,9 @@ import { AppRouter, useAppRouter } from '../../../../core/router';
9
9
  import { useTheme } from '../../../../core/theme';
10
10
  import { useAppLocalizations } from '../../../../l10n/localizations';
11
11
  import { ElevatedButton } from '../../../../shared/material/buttons';
12
- import { Card } from '../../../../shared/material/card';
13
12
  import { showModalBottomSheet } from '../../../../shared/material/overlays';
14
13
  import { EmojiSelectWidget } from '../../../../shared/widgets/emoji_select_widget';
15
- import { MenuActionItem, MenuActionsWidget } from '../../../../shared/widgets/menu_actions_widget';
14
+ import { SbSelectionOption, SelectionSheet } from '../../../../shared/widgets/selection';
16
15
  import { CategorieIconType } from '../../domain/models/categorie';
17
16
  import { CategorieBloc } from '../bloc/categorie_bloc';
18
17
  import { CategorieAddValidationEvent, CategorieEditValidationEvent } from '../bloc/categorie_event';
@@ -25,7 +24,7 @@ export function CategorieEditIconBtn() {
25
24
  return (
26
25
  <Pressable
27
26
  accessibilityRole="button"
28
- onPress={() => void showModalBottomSheet(router, { themed: true, builder: () => <CategorieEditIconOptions /> })}
27
+ onPress={() => void showModalBottomSheet(router, { builder: () => <CategorieEditIconOptions /> })}
29
28
  style={[styles.fab, { backgroundColor: theme.colorScheme.surface }]}
30
29
  >
31
30
  <Image source={Images.categorieImageSelect} style={styles.fabIcon} />
@@ -33,13 +32,10 @@ export function CategorieEditIconBtn() {
33
32
  );
34
33
  }
35
34
 
36
- /** Feuille des options d'icône : emoji (ou galerie, non disponible, comme en Flutter) */
35
+ /** Feuille des options d'icône : emoji (ou galerie, non disponible, comme en Flutter). */
37
36
  function CategorieEditIconOptions() {
38
37
  const traductions = useAppLocalizations();
39
- const theme = useTheme();
40
38
  const router = useAppRouter();
41
- const insets = useSafeAreaInsets();
42
- const { height } = useWindowDimensions();
43
39
  const categorieBloc = useBloc(CategorieBloc);
44
40
 
45
41
  const selectEmoji = async () => {
@@ -63,25 +59,26 @@ function CategorieEditIconOptions() {
63
59
  };
64
60
 
65
61
  return (
66
- <View style={[styles.sheet, { maxHeight: height * 0.5, backgroundColor: theme.colorScheme.surface, paddingBottom: insets.bottom }]}>
67
- <ScrollView contentContainerStyle={styles.sheetContent}>
68
- <Text style={[theme.textTheme.headlineMedium, styles.title]}>{traductions.categorieFormIconSheetTitle}</Text>
69
- <Card>
70
- <MenuActionsWidget
71
- items={[
72
- // Emoji
73
- new MenuActionItem(Images.categorieIconEmoji, traductions.categorieFormIconSheetEmojiTitle, null, () => void selectEmoji(), {
74
- iconSize: 20,
75
- }),
76
- // Choisir dans la galerie (sans action, comme dans le SDK Flutter)
77
- new MenuActionItem(Images.categorieImageSelect, traductions.categorieFormIconSheetGalleryTitle, null, () => undefined, {
78
- iconSize: 20,
79
- }),
80
- ]}
62
+ <SelectionSheet
63
+ titre={traductions.categorieFormIconSheetTitle}
64
+ contenu={
65
+ <ScrollView bounces={false} contentContainerStyle={styles.optionsContent}>
66
+ {/* Emoji */}
67
+ <SbSelectionOption
68
+ image={Images.categorieIconEmoji}
69
+ titre={traductions.categorieFormIconSheetEmojiTitle}
70
+ onPress={() => void selectEmoji()}
81
71
  />
82
- </Card>
83
- </ScrollView>
84
- </View>
72
+ <View style={styles.gap10} />
73
+ {/* Choisir dans la galerie (sans action, comme dans le SDK Flutter) */}
74
+ <SbSelectionOption
75
+ image={Images.categorieImageSelect}
76
+ titre={traductions.categorieFormIconSheetGalleryTitle}
77
+ onPress={() => undefined}
78
+ />
79
+ </ScrollView>
80
+ }
81
+ />
85
82
  );
86
83
  }
87
84
 
@@ -115,6 +112,7 @@ const styles = StyleSheet.create({
115
112
  fabIcon: { width: 24, height: 24 },
116
113
  sheet: { borderRadius: 20, overflow: 'hidden' },
117
114
  sheetContent: { padding: 20 },
118
- title: { marginBottom: 20 },
115
+ optionsContent: { paddingHorizontal: 20, paddingTop: 8, paddingBottom: 16 },
116
+ gap10: { height: 10 },
119
117
  saveBtn: { paddingVertical: 20, paddingHorizontal: 4 },
120
118
  });
@@ -15,6 +15,7 @@ import { withAlpha } from '../../../../shared/utils/color';
15
15
  import { AvatarWidget } from '../../../../shared/widgets/avatar_widget';
16
16
  import { ClipboardWidget } from '../../../../shared/widgets/clipboard_widget';
17
17
  import { ImageSelectWidget } from '../../../../shared/widgets/image_select_widget';
18
+ import { SbSelectionOption } from '../../../../shared/widgets/selection';
18
19
  import { AliasBloc } from '../../../alias/presentation/bloc/alias_bloc';
19
20
  import { AliasExistState } from '../../../alias/presentation/bloc/alias_state';
20
21
  import { ProfileAvatar } from '../../domain/profile_avatar';
@@ -45,21 +46,16 @@ export function ProfilePageAvatar() {
45
46
  otherActions={
46
47
  avatar != null
47
48
  ? [
48
- <Pressable
49
+ <SbSelectionOption
49
50
  key="delete"
50
- accessibilityRole="button"
51
- style={styles.deleteTile}
51
+ icone="delete-forever"
52
+ titre={traductions.btnTextDelete}
53
+ couleur={Themer.systemErrorColor}
52
54
  onPress={() => {
53
55
  AppRouter.pop(router);
54
56
  void ProfileAvatar.remove();
55
57
  }}
56
- >
57
- <MaterialIcons name="delete-forever" size={24} color={Themer.systemErrorColor} />
58
- <Text style={[theme.textTheme.bodyLarge, styles.deleteText, { color: Themer.systemErrorColor }]}>
59
- {traductions.btnTextDelete}
60
- </Text>
61
- <MaterialIcons name="arrow-forward-ios" size={16} color={Themer.systemErrorColor} />
62
- </Pressable>,
58
+ />,
63
59
  ]
64
60
  : []
65
61
  }
@@ -147,6 +143,4 @@ const styles = StyleSheet.create({
147
143
  maxWidth: '100%',
148
144
  },
149
145
  aliasTexte: { flexShrink: 1, marginHorizontal: 6 },
150
- deleteTile: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, minHeight: 56 },
151
- deleteText: { flex: 1, marginHorizontal: 16 },
152
146
  });
@@ -36,7 +36,6 @@ export function ProfilePageContacts({ contactPI }: { contactPI?: ContactPI | nul
36
36
 
37
37
  const onSelect = async (contact: PhoneContact | null, alias: string | null) => {
38
38
  const value = await showModalBottomSheet<boolean>(router, {
39
- themed: true,
40
39
  builder: () => <ProfilePageContactsActions alias={alias} contact={contact} contactPI={contactPI} />,
41
40
  });
42
41
  if (value != null && contactPI != null) AppRouter.pop(router);
@@ -1,8 +1,6 @@
1
- import { Image } from 'expo-image';
2
1
  import { MaterialIcons } from '@expo/vector-icons';
3
- import { useEffect, useRef, useState } from 'react';
4
- import { Animated, Easing, Keyboard, Platform, Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
5
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
2
+ import { useState } from 'react';
3
+ import { Keyboard, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
6
4
 
7
5
  import { Images } from '../../../../core/assets';
8
6
  import { useBloc, useBlocListener, useCreateBloc } from '../../../../core/bloc_react';
@@ -11,11 +9,12 @@ import { Themer, useTheme } from '../../../../core/theme';
11
9
  import { useAppLocalizations } from '../../../../l10n/localizations';
12
10
  import { ElevatedButton, FilledTonalButton } from '../../../../shared/material/buttons';
13
11
  import { AliasPI } from '../../../../shared/models/alias_pi';
14
- import { useKeyboardVisible } from '../../../../shared/utils/use_keyboard_visible';
12
+ import { withAlpha } from '../../../../shared/utils/color';
15
13
  import { ClipboardWidget } from '../../../../shared/widgets/clipboard_widget';
16
14
  import { InputAliasWidget } from '../../../../shared/widgets/input_alias_widget';
17
15
  import { CustomTextInput } from '../../../../shared/widgets/input_text';
18
16
  import { CustomLoadingDialog } from '../../../../shared/widgets/loading_page';
17
+ import { SelectionBoutons, SelectionSheet } from '../../../../shared/widgets/selection';
19
18
  import { ContactPI } from '../../../contacts/domain/contact_pi';
20
19
  import { contactIdOf, type PhoneContact } from '../../../contacts/domain/phone_contact';
21
20
  import { ContactBloc } from '../../../contacts/presentation/bloc/contact_bloc';
@@ -27,6 +26,7 @@ import {
27
26
  ContactCreateLoadingState,
28
27
  ContactCreateSuccessState,
29
28
  } from '../../../contacts/presentation/bloc/create/contact_create_state';
29
+ import { ProfileMenuTile, ProfilePageMenu } from './profile_menu';
30
30
 
31
31
  function fullName(contact: PhoneContact): string {
32
32
  return `${contact.firstName} ${contact.lastName}`.trim();
@@ -50,9 +50,6 @@ export function ProfilePageContactsActions({
50
50
  const traductions = useAppLocalizations();
51
51
  const theme = useTheme();
52
52
  const router = useAppRouter();
53
- const insets = useSafeAreaInsets();
54
- const { height } = useWindowDimensions();
55
- const isKeyboardVisible = useKeyboardVisible();
56
53
  const contactListBloc = useBloc(ContactBloc);
57
54
  const contactBloc = useCreateBloc(() => new ContactCreateBloc());
58
55
 
@@ -107,127 +104,124 @@ export function ProfilePageContactsActions({
107
104
  };
108
105
 
109
106
  const canSave = command.isValid() && command.value !== alias && name != null && name.length > 0;
110
- // Comme en Flutter, la feuille a une hauteur fixe (35 % ou 50 % de l'écran)
111
- // qui passe à 70 % ou 80 % quand le clavier est affiché, pour que le
112
- // formulaire reste au-dessus du clavier. Sur iOS, la feuille est déjà
113
- // remontée au-dessus du clavier par l'OverlayHost : elle garde sa hauteur.
114
- const keyboardOpen = isKeyboardVisible && Platform.OS !== 'ios';
115
- const ratio = !keyboardOpen ? (contact != null ? 0.35 : 0.5) : contact != null ? 0.7 : 0.8;
116
- const sheetHeight = useRef(new Animated.Value(height * ratio)).current;
117
- useEffect(() => {
118
- Animated.timing(sheetHeight, {
119
- toValue: height * ratio,
120
- duration: 300,
121
- easing: Easing.inOut(Easing.ease),
122
- useNativeDriver: false,
123
- }).start();
124
- }, [height, ratio, sheetHeight]);
107
+ const primaire = theme.colorScheme.primary;
108
+ const initiale = contact != null && name != null && name.trim().length > 0 ? name.trim()[0].toUpperCase() : null;
125
109
 
110
+ // La feuille remonte d'elle-même au-dessus du clavier
126
111
  return (
127
- <Animated.View style={[styles.sheet, { backgroundColor: theme.colorScheme.surface, height: sheetHeight, paddingBottom: insets.bottom }]}>
128
- <View style={styles.content}>
129
- <View style={styles.gap20} />
130
- {/* Titre */}
131
- <Text style={theme.textTheme.headlineMedium}>{name ?? traductions.contactCreateTitle}</Text>
132
- {alias != null && alias.length > 0 ? (
133
- <>
134
- <View style={styles.gap10} />
112
+ <SelectionSheet
113
+ hauteurMax={0.9}
114
+ contenu={
115
+ <>
116
+ <ScrollView keyboardShouldPersistTaps="handled" bounces={false} style={styles.defile} contentContainerStyle={styles.content}>
117
+ {/* Pastille, nom du contact (ou « Ajouter un contact ») et alias à copier (ou sous-titre de la création) */}
135
118
  <View style={styles.row}>
136
- <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, styles.flex, { color: Themer.neural03Color }]}>
137
- {AliasPI.formatPhoneNumber(alias)}
138
- </Text>
139
- <Pressable accessibilityRole="button" hitSlop={8} onPress={() => void ClipboardWidget.setData(alias)}>
140
- <MaterialIcons name="content-copy" size={16} color={theme.colorScheme.onSurface} />
141
- </Pressable>
142
- </View>
143
- </>
144
- ) : contact == null ? (
145
- <>
146
- <View style={styles.gap10} />
147
- <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, { color: Themer.neural03Color }]}>
148
- {traductions.contactCreateSubtitle}
149
- </Text>
150
- </>
151
- ) : null}
152
- <View style={styles.gap20} />
153
-
154
- {canEdit ? (
155
- <>
156
- {/* Formulaire */}
157
- <ScrollView style={styles.flex} keyboardShouldPersistTaps="handled">
158
- {contact == null && (
159
- <>
160
- <CustomTextInput
161
- defaultValue={name ?? ''}
162
- labelText={traductions.contactCreateNameLabel}
163
- messageError={name == null || name.length === 0 ? traductions.contactCreateNameErrorEmpty : null}
164
- onChange={setName}
165
- />
166
- <View style={styles.gap10} />
167
- </>
168
- )}
169
- <InputAliasWidget command={command} onChange={rebuild} />
170
- </ScrollView>
171
- <View style={styles.gap20} />
172
- {/* Annuler / Enregistrer */}
173
- <View style={styles.buttons}>
174
- <View style={styles.flex}>
175
- <FilledTonalButton onPress={cancel}>{traductions.btnTextCancel}</FilledTonalButton>
119
+ <View style={[styles.avatar, { backgroundColor: withAlpha(primaire, 0.12) }]}>
120
+ {initiale != null ? (
121
+ <Text style={[theme.textTheme.headlineMedium, styles.initiale, { color: primaire }]}>{initiale}</Text>
122
+ ) : (
123
+ <MaterialIcons name="person-add-alt-1" size={24} color={primaire} />
124
+ )}
176
125
  </View>
177
- <View style={styles.gap16} />
178
- <View style={styles.flex}>
179
- <ElevatedButton onPress={canSave ? () => saveAlias(command.value!) : undefined}>{traductions.btnTextSave}</ElevatedButton>
126
+ <View style={styles.entete}>
127
+ <Text numberOfLines={1} style={theme.textTheme.headlineMedium}>
128
+ {contact != null && name != null ? name : traductions.contactCreateTitle}
129
+ </Text>
130
+ <View style={styles.gap2} />
131
+ {alias != null && alias.length > 0 ? (
132
+ <View style={styles.row}>
133
+ <Text numberOfLines={1} style={[theme.textTheme.displayMedium, styles.flexShrink, { color: Themer.neural03Color }]}>
134
+ {AliasPI.formatPhoneNumber(alias)}
135
+ </Text>
136
+ <Pressable
137
+ accessibilityRole="button"
138
+ hitSlop={8}
139
+ style={styles.copier}
140
+ onPress={() => void ClipboardWidget.setData(alias)}
141
+ >
142
+ <MaterialIcons name="content-copy" size={16} color={primaire} />
143
+ </Pressable>
144
+ </View>
145
+ ) : contact == null ? (
146
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.contactCreateSubtitle}</Text>
147
+ ) : null}
180
148
  </View>
181
149
  </View>
182
- </>
183
- ) : contact != null && alias != null ? (
184
- <>
185
- {/* Modifier */}
186
- <Action
187
- icon={Images.iconEdit}
188
- title={traductions.profileContactPageaActionEdit}
189
- onPress={() => {
190
- command.value = alias;
191
- setCanEdit(true);
192
- }}
193
- />
194
- {/* Supprimer */}
195
- <Action
196
- icon={Images.iconDelete}
197
- title={traductions.profileContactPageaActionDelete}
198
- onPress={() => contactBloc.add(new ContactDeleteSubmitEvent(contactIdOf(contact), alias))}
199
- />
200
- </>
201
- ) : null}
202
- </View>
203
- </Animated.View>
204
- );
205
- }
150
+ <View style={styles.gap20} />
206
151
 
207
- function Action({ icon, title, onPress }: { icon: number; title: string; onPress: () => void }) {
208
- const theme = useTheme();
209
- return (
210
- <Pressable accessibilityRole="button" onPress={onPress} style={styles.action}>
211
- <View style={[styles.actionIcon, { backgroundColor: theme.colorScheme.surface }]}>
212
- <Image source={icon} style={styles.icon} tintColor={theme.colorScheme.onSurface} />
213
- </View>
214
- <Text style={[theme.textTheme.headlineSmall, styles.actionText]}>{title}</Text>
215
- </Pressable>
152
+ {canEdit ? (
153
+ <>
154
+ {/* Champs nom et alias */}
155
+ {contact == null && (
156
+ <>
157
+ <CustomTextInput
158
+ defaultValue={name ?? ''}
159
+ labelText={traductions.contactCreateNameLabel}
160
+ messageError={name == null || name.length === 0 ? traductions.contactCreateNameErrorEmpty : null}
161
+ onChange={setName}
162
+ />
163
+ <View style={styles.gap12} />
164
+ </>
165
+ )}
166
+ <InputAliasWidget command={command} onChange={rebuild} />
167
+ </>
168
+ ) : contact != null && alias != null ? (
169
+ // Actions sur l'alias du contact
170
+ <ProfilePageMenu
171
+ items={[
172
+ // Modifier
173
+ <ProfileMenuTile
174
+ key="modifier"
175
+ image={Images.iconEdit}
176
+ titre={traductions.profileContactPageaActionEdit}
177
+ onPress={() => {
178
+ command.value = alias;
179
+ setCanEdit(true);
180
+ }}
181
+ />,
182
+ // Supprimer
183
+ <ProfileMenuTile
184
+ key="supprimer"
185
+ image={Images.iconDelete}
186
+ titre={traductions.profileContactPageaActionDelete}
187
+ couleur={theme.colorScheme.error}
188
+ trailing={<View />}
189
+ onPress={() => contactBloc.add(new ContactDeleteSubmitEvent(contactIdOf(contact), alias))}
190
+ />,
191
+ ]}
192
+ />
193
+ ) : null}
194
+ </ScrollView>
195
+
196
+ {/* Annuler / Enregistrer, fixés en bas */}
197
+ {canEdit && (
198
+ <SelectionBoutons
199
+ boutons={[
200
+ <FilledTonalButton key="annuler" onPress={cancel}>
201
+ {traductions.btnTextCancel}
202
+ </FilledTonalButton>,
203
+ <ElevatedButton key="enregistrer" onPress={canSave ? () => saveAlias(command.value!) : undefined}>
204
+ {traductions.btnTextSave}
205
+ </ElevatedButton>,
206
+ ]}
207
+ />
208
+ )}
209
+ </>
210
+ }
211
+ />
216
212
  );
217
213
  }
218
214
 
219
215
  const styles = StyleSheet.create({
220
- sheet: { borderTopLeftRadius: 20, borderTopRightRadius: 20, overflow: 'hidden' },
221
- content: { paddingHorizontal: 20, flex: 1 },
222
- flex: { flex: 1 },
216
+ defile: { flexShrink: 1 },
217
+ content: { paddingHorizontal: 20, paddingTop: 4, paddingBottom: 20 },
223
218
  flexShrink: { flexShrink: 1 },
224
219
  row: { flexDirection: 'row', alignItems: 'center' },
225
- buttons: { flexDirection: 'row', paddingVertical: 16 },
226
- action: { flexDirection: 'row', alignItems: 'center', minHeight: 64 },
227
- actionIcon: { width: 45, height: 45, borderRadius: 14, alignItems: 'center', justifyContent: 'center' },
228
- icon: { width: 20, height: 20 },
229
- actionText: { marginLeft: 16 },
230
- gap10: { height: 10 },
231
- gap16: { width: 16 },
220
+ avatar: { width: 52, height: 52, borderRadius: 26, alignItems: 'center', justifyContent: 'center' },
221
+ initiale: { fontWeight: '700' },
222
+ entete: { flex: 1, marginLeft: 14 },
223
+ copier: { padding: 4, marginLeft: 6 },
224
+ gap2: { height: 2 },
225
+ gap12: { height: 12 },
232
226
  gap20: { height: 20 },
233
227
  });
@@ -88,7 +88,6 @@ export function QrCodeAliasPage() {
88
88
  style={styles.icon}
89
89
  onPress={() =>
90
90
  void showModalBottomSheet(router, {
91
- themed: true,
92
91
  builder: () => <QrcodeAliasPageShare username={user.nomComplet()} alias={aliasCle} shareQrcode={() => void shareQRCode()} />,
93
92
  })
94
93
  }