@pi-spi/app 2.1.0 → 2.2.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 (314) hide show
  1. package/lib/module/l10n/app_localizations.js.map +1 -1
  2. package/lib/module/l10n/app_localizations_en.js +32 -8
  3. package/lib/module/l10n/app_localizations_en.js.map +1 -1
  4. package/lib/module/l10n/app_localizations_fr.js +41 -14
  5. package/lib/module/l10n/app_localizations_fr.js.map +1 -1
  6. package/lib/module/l10n/app_localizations_pt.js +33 -7
  7. package/lib/module/l10n/app_localizations_pt.js.map +1 -1
  8. package/lib/module/modules/alias/domain/models/alias_revendication.js +4 -2
  9. package/lib/module/modules/alias/domain/models/alias_revendication.js.map +1 -1
  10. package/lib/module/modules/alias/infra/alias_output_local.js +11 -0
  11. package/lib/module/modules/alias/infra/alias_output_local.js.map +1 -1
  12. package/lib/module/modules/alias/infra/alias_output_repository.js +9 -8
  13. package/lib/module/modules/alias/infra/alias_output_repository.js.map +1 -1
  14. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js +14 -18
  15. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js.map +1 -1
  16. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js +113 -60
  17. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js.map +1 -1
  18. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_form.js +151 -76
  19. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_form.js.map +1 -1
  20. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_timer.js +38 -24
  21. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_timer.js.map +1 -1
  22. package/lib/module/modules/alias/presentation/pages/alias_page_create_options.js +28 -26
  23. package/lib/module/modules/alias/presentation/pages/alias_page_create_options.js.map +1 -1
  24. package/lib/module/modules/alias/presentation/pages/alias_page_otp.js +27 -110
  25. package/lib/module/modules/alias/presentation/pages/alias_page_otp.js.map +1 -1
  26. package/lib/module/modules/categorie/domain/services/categorie_service.js +2 -1
  27. package/lib/module/modules/categorie/domain/services/categorie_service.js.map +1 -1
  28. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js +38 -42
  29. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js.map +1 -1
  30. package/lib/module/modules/categorie/presentation/pages/categorie_form_pages.js +88 -80
  31. package/lib/module/modules/categorie/presentation/pages/categorie_form_pages.js.map +1 -1
  32. package/lib/module/modules/categorie/presentation/pages/categorie_icon.js +39 -0
  33. package/lib/module/modules/categorie/presentation/pages/categorie_icon.js.map +1 -1
  34. package/lib/module/modules/categorie/presentation/pages/categorie_liste_widget.js +55 -27
  35. package/lib/module/modules/categorie/presentation/pages/categorie_liste_widget.js.map +1 -1
  36. package/lib/module/modules/categorie/presentation/pages/categorie_select_page.js +21 -81
  37. package/lib/module/modules/categorie/presentation/pages/categorie_select_page.js.map +1 -1
  38. package/lib/module/modules/categorie/presentation/pages/categorie_select_widget.js +53 -16
  39. package/lib/module/modules/categorie/presentation/pages/categorie_select_widget.js.map +1 -1
  40. package/lib/module/modules/config/domain/models/config_keys.js +2 -0
  41. package/lib/module/modules/config/domain/models/config_keys.js.map +1 -1
  42. package/lib/module/modules/contacts/domain/contact_pi.js +3 -5
  43. package/lib/module/modules/contacts/domain/contact_pi.js.map +1 -1
  44. package/lib/module/modules/contacts/presentation/bloc/contact_bloc.js +30 -14
  45. package/lib/module/modules/contacts/presentation/bloc/contact_bloc.js.map +1 -1
  46. package/lib/module/modules/contacts/presentation/pages/contact_actions_sheet.js +106 -0
  47. package/lib/module/modules/contacts/presentation/pages/contact_actions_sheet.js.map +1 -0
  48. package/lib/module/modules/contacts/presentation/pages/contact_list_alias_widget.js +17 -7
  49. package/lib/module/modules/contacts/presentation/pages/contact_list_alias_widget.js.map +1 -1
  50. package/lib/module/modules/contacts/presentation/pages/contact_list_phone_widget.js +5 -4
  51. package/lib/module/modules/contacts/presentation/pages/contact_list_phone_widget.js.map +1 -1
  52. package/lib/module/modules/contacts/presentation/pages/contact_list_widget_item.js +76 -67
  53. package/lib/module/modules/contacts/presentation/pages/contact_list_widget_item.js.map +1 -1
  54. package/lib/module/modules/contacts/presentation/pages/contact_section.js +14 -4
  55. package/lib/module/modules/contacts/presentation/pages/contact_section.js.map +1 -1
  56. package/lib/module/modules/contacts/presentation/pages/contact_select_page.js +131 -110
  57. package/lib/module/modules/contacts/presentation/pages/contact_select_page.js.map +1 -1
  58. package/lib/module/modules/contacts/presentation/pages/create/contact_create_page.js +118 -59
  59. package/lib/module/modules/contacts/presentation/pages/create/contact_create_page.js.map +1 -1
  60. package/lib/module/modules/home/presentation/pages/home_page.js +3 -13
  61. package/lib/module/modules/home/presentation/pages/home_page.js.map +1 -1
  62. package/lib/module/modules/introduction/presentation/pages/introduction.js +17 -4
  63. package/lib/module/modules/introduction/presentation/pages/introduction.js.map +1 -1
  64. package/lib/module/modules/introduction/presentation/pages/introduction_footer.js +15 -53
  65. package/lib/module/modules/introduction/presentation/pages/introduction_footer.js.map +1 -1
  66. package/lib/module/modules/introduction/presentation/pages/introduction_page.js +22 -4
  67. package/lib/module/modules/introduction/presentation/pages/introduction_page.js.map +1 -1
  68. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js +2 -2
  69. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js.map +1 -1
  70. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js +1 -1
  71. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js.map +1 -1
  72. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js +2 -2
  73. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js.map +1 -1
  74. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js +14 -52
  75. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js.map +1 -1
  76. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js +11 -1
  77. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js.map +1 -1
  78. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js +3 -3
  79. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js.map +1 -1
  80. package/lib/module/modules/search/domain/models/fonctionnalite.js +51 -0
  81. package/lib/module/modules/search/domain/models/fonctionnalite.js.map +1 -1
  82. package/lib/module/modules/search/presentation/pages/search_btn_widget.js +136 -0
  83. package/lib/module/modules/search/presentation/pages/search_btn_widget.js.map +1 -0
  84. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js +21 -1
  85. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js.map +1 -1
  86. package/lib/module/modules/search/presentation/pages/search_page.js +266 -97
  87. package/lib/module/modules/search/presentation/pages/search_page.js.map +1 -1
  88. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page.js +5 -3
  89. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page.js.map +1 -1
  90. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.js +5 -6
  91. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.js.map +1 -1
  92. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js +3 -3
  93. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js.map +1 -1
  94. package/lib/module/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.js +1 -2
  95. package/lib/module/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.js.map +1 -1
  96. package/lib/module/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.js +17 -0
  97. package/lib/module/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.js.map +1 -1
  98. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.js +30 -23
  99. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.js.map +1 -1
  100. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js +6 -6
  101. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js.map +1 -1
  102. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js +6 -6
  103. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js.map +1 -1
  104. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page.js +16 -4
  105. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page.js.map +1 -1
  106. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.js +11 -9
  107. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.js.map +1 -1
  108. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js +9 -7
  109. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js.map +1 -1
  110. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.js +8 -10
  111. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.js.map +1 -1
  112. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js +127 -105
  113. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js.map +1 -1
  114. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page.js +9 -15
  115. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page.js.map +1 -1
  116. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js +5 -11
  117. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js.map +1 -1
  118. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.js +9 -9
  119. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.js.map +1 -1
  120. package/lib/module/shared/widgets/alias_widget.js +33 -12
  121. package/lib/module/shared/widgets/alias_widget.js.map +1 -1
  122. package/lib/module/shared/widgets/auth_code_field.js +89 -0
  123. package/lib/module/shared/widgets/auth_code_field.js.map +1 -0
  124. package/lib/module/shared/widgets/calendar_date_picker.js +21 -16
  125. package/lib/module/shared/widgets/calendar_date_picker.js.map +1 -1
  126. package/lib/module/shared/widgets/confirm_action_sheet_widget.js +20 -1
  127. package/lib/module/shared/widgets/confirm_action_sheet_widget.js.map +1 -1
  128. package/lib/module/shared/widgets/emoji_select_widget.js +34 -39
  129. package/lib/module/shared/widgets/emoji_select_widget.js.map +1 -1
  130. package/lib/module/shared/widgets/frequence_input_widget.js +18 -29
  131. package/lib/module/shared/widgets/frequence_input_widget.js.map +1 -1
  132. package/lib/module/shared/widgets/frequence_select_widget.js +233 -140
  133. package/lib/module/shared/widgets/frequence_select_widget.js.map +1 -1
  134. package/lib/module/shared/widgets/image_select_widget.js +4 -4
  135. package/lib/module/shared/widgets/image_select_widget.js.map +1 -1
  136. package/lib/module/shared/widgets/input_text.js +1 -1
  137. package/lib/module/shared/widgets/input_text.js.map +1 -1
  138. package/lib/module/shared/widgets/notification_dialog.js +3 -2
  139. package/lib/module/shared/widgets/notification_dialog.js.map +1 -1
  140. package/lib/module/shared/widgets/pin_entete.js +114 -0
  141. package/lib/module/shared/widgets/pin_entete.js.map +1 -0
  142. package/lib/module/shared/widgets/select_date_widget.js +74 -59
  143. package/lib/module/shared/widgets/select_date_widget.js.map +1 -1
  144. package/lib/module/shared/widgets/selection.js +21 -16
  145. package/lib/module/shared/widgets/selection.js.map +1 -1
  146. package/lib/typescript/src/l10n/app_localizations.d.ts +59 -11
  147. package/lib/typescript/src/l10n/app_localizations.d.ts.map +1 -1
  148. package/lib/typescript/src/l10n/app_localizations_en.d.ts.map +1 -1
  149. package/lib/typescript/src/l10n/app_localizations_fr.d.ts.map +1 -1
  150. package/lib/typescript/src/l10n/app_localizations_pt.d.ts.map +1 -1
  151. package/lib/typescript/src/modules/alias/domain/models/alias_revendication.d.ts.map +1 -1
  152. package/lib/typescript/src/modules/alias/infra/alias_output_local.d.ts +5 -0
  153. package/lib/typescript/src/modules/alias/infra/alias_output_local.d.ts.map +1 -1
  154. package/lib/typescript/src/modules/alias/infra/alias_output_repository.d.ts.map +1 -1
  155. package/lib/typescript/src/modules/alias/presentation/pages/alias_delete_btn_widget.d.ts.map +1 -1
  156. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_claim.d.ts.map +1 -1
  157. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_form.d.ts.map +1 -1
  158. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.d.ts +1 -1
  159. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.d.ts.map +1 -1
  160. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_options.d.ts +4 -1
  161. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_options.d.ts.map +1 -1
  162. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_otp.d.ts +9 -5
  163. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_otp.d.ts.map +1 -1
  164. package/lib/typescript/src/modules/categorie/domain/services/categorie_service.d.ts.map +1 -1
  165. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.d.ts +3 -0
  166. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.d.ts.map +1 -1
  167. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_form_pages.d.ts.map +1 -1
  168. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_icon.d.ts +9 -0
  169. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_icon.d.ts.map +1 -1
  170. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_liste_widget.d.ts +7 -2
  171. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_liste_widget.d.ts.map +1 -1
  172. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_page.d.ts.map +1 -1
  173. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_widget.d.ts +10 -2
  174. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_widget.d.ts.map +1 -1
  175. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts +3 -1
  176. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts.map +1 -1
  177. package/lib/typescript/src/modules/contacts/domain/contact_pi.d.ts +0 -2
  178. package/lib/typescript/src/modules/contacts/domain/contact_pi.d.ts.map +1 -1
  179. package/lib/typescript/src/modules/contacts/presentation/bloc/contact_bloc.d.ts +7 -0
  180. package/lib/typescript/src/modules/contacts/presentation/bloc/contact_bloc.d.ts.map +1 -1
  181. package/lib/typescript/src/modules/contacts/presentation/pages/contact_actions_sheet.d.ts +14 -0
  182. package/lib/typescript/src/modules/contacts/presentation/pages/contact_actions_sheet.d.ts.map +1 -0
  183. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_alias_widget.d.ts +4 -2
  184. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_alias_widget.d.ts.map +1 -1
  185. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_phone_widget.d.ts.map +1 -1
  186. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_widget_item.d.ts +6 -4
  187. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_widget_item.d.ts.map +1 -1
  188. package/lib/typescript/src/modules/contacts/presentation/pages/contact_section.d.ts +3 -1
  189. package/lib/typescript/src/modules/contacts/presentation/pages/contact_section.d.ts.map +1 -1
  190. package/lib/typescript/src/modules/contacts/presentation/pages/contact_select_page.d.ts.map +1 -1
  191. package/lib/typescript/src/modules/contacts/presentation/pages/create/contact_create_page.d.ts.map +1 -1
  192. package/lib/typescript/src/modules/home/presentation/pages/home_page.d.ts.map +1 -1
  193. package/lib/typescript/src/modules/introduction/presentation/pages/introduction.d.ts.map +1 -1
  194. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_footer.d.ts +5 -1
  195. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_footer.d.ts.map +1 -1
  196. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_page.d.ts.map +1 -1
  197. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts.d.ts.map +1 -1
  198. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts_actions.d.ts.map +1 -1
  199. package/lib/typescript/src/modules/search/domain/models/fonctionnalite.d.ts +20 -0
  200. package/lib/typescript/src/modules/search/domain/models/fonctionnalite.d.ts.map +1 -1
  201. package/lib/typescript/src/modules/search/presentation/pages/search_btn_widget.d.ts +11 -0
  202. package/lib/typescript/src/modules/search/presentation/pages/search_btn_widget.d.ts.map +1 -0
  203. package/lib/typescript/src/modules/search/presentation/pages/search_fonctionnalites.d.ts.map +1 -1
  204. package/lib/typescript/src/modules/search/presentation/pages/search_page.d.ts.map +1 -1
  205. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page.d.ts.map +1 -1
  206. package/lib/typescript/src/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.d.ts.map +1 -1
  207. package/lib/typescript/src/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.d.ts.map +1 -1
  208. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.d.ts +4 -1
  209. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.d.ts.map +1 -1
  210. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.d.ts +4 -0
  211. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.d.ts.map +1 -1
  212. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.d.ts.map +1 -1
  213. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.d.ts.map +1 -1
  214. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.d.ts.map +1 -1
  215. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_search/transaction_search_page.d.ts.map +1 -1
  216. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.d.ts.map +1 -1
  217. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.d.ts.map +1 -1
  218. package/lib/typescript/src/shared/widgets/alias_widget.d.ts +2 -2
  219. package/lib/typescript/src/shared/widgets/alias_widget.d.ts.map +1 -1
  220. package/lib/typescript/src/shared/widgets/auth_code_field.d.ts +17 -0
  221. package/lib/typescript/src/shared/widgets/auth_code_field.d.ts.map +1 -0
  222. package/lib/typescript/src/shared/widgets/calendar_date_picker.d.ts.map +1 -1
  223. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts +12 -1
  224. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts.map +1 -1
  225. package/lib/typescript/src/shared/widgets/emoji_select_widget.d.ts.map +1 -1
  226. package/lib/typescript/src/shared/widgets/frequence_input_widget.d.ts +6 -3
  227. package/lib/typescript/src/shared/widgets/frequence_input_widget.d.ts.map +1 -1
  228. package/lib/typescript/src/shared/widgets/frequence_select_widget.d.ts +23 -5
  229. package/lib/typescript/src/shared/widgets/frequence_select_widget.d.ts.map +1 -1
  230. package/lib/typescript/src/shared/widgets/image_select_widget.d.ts +1 -1
  231. package/lib/typescript/src/shared/widgets/input_text.d.ts +2 -0
  232. package/lib/typescript/src/shared/widgets/input_text.d.ts.map +1 -1
  233. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts +3 -1
  234. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts.map +1 -1
  235. package/lib/typescript/src/shared/widgets/pin_entete.d.ts +15 -0
  236. package/lib/typescript/src/shared/widgets/pin_entete.d.ts.map +1 -0
  237. package/lib/typescript/src/shared/widgets/select_date_widget.d.ts +4 -0
  238. package/lib/typescript/src/shared/widgets/select_date_widget.d.ts.map +1 -1
  239. package/lib/typescript/src/shared/widgets/selection.d.ts +11 -7
  240. package/lib/typescript/src/shared/widgets/selection.d.ts.map +1 -1
  241. package/package.json +1 -1
  242. package/src/l10n/app_localizations.ts +59 -11
  243. package/src/l10n/app_localizations_en.ts +32 -8
  244. package/src/l10n/app_localizations_fr.ts +38 -14
  245. package/src/l10n/app_localizations_pt.ts +31 -7
  246. package/src/modules/alias/domain/models/alias_revendication.ts +4 -2
  247. package/src/modules/alias/infra/alias_output_local.ts +11 -0
  248. package/src/modules/alias/infra/alias_output_repository.ts +9 -8
  249. package/src/modules/alias/presentation/pages/alias_delete_btn_widget.tsx +17 -24
  250. package/src/modules/alias/presentation/pages/alias_page_claim.tsx +76 -48
  251. package/src/modules/alias/presentation/pages/alias_page_create_mbno_form.tsx +113 -65
  252. package/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.tsx +34 -25
  253. package/src/modules/alias/presentation/pages/alias_page_create_options.tsx +29 -36
  254. package/src/modules/alias/presentation/pages/alias_page_otp.tsx +24 -88
  255. package/src/modules/categorie/domain/services/categorie_service.ts +2 -1
  256. package/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.tsx +38 -28
  257. package/src/modules/categorie/presentation/pages/categorie_form_pages.tsx +71 -41
  258. package/src/modules/categorie/presentation/pages/categorie_icon.tsx +26 -0
  259. package/src/modules/categorie/presentation/pages/categorie_liste_widget.tsx +45 -24
  260. package/src/modules/categorie/presentation/pages/categorie_select_page.tsx +10 -46
  261. package/src/modules/categorie/presentation/pages/categorie_select_widget.tsx +54 -13
  262. package/src/modules/config/domain/models/config_keys.ts +3 -0
  263. package/src/modules/contacts/domain/contact_pi.ts +3 -6
  264. package/src/modules/contacts/presentation/bloc/contact_bloc.ts +37 -20
  265. package/src/modules/contacts/presentation/pages/contact_actions_sheet.tsx +69 -0
  266. package/src/modules/contacts/presentation/pages/contact_list_alias_widget.tsx +26 -4
  267. package/src/modules/contacts/presentation/pages/contact_list_phone_widget.tsx +3 -0
  268. package/src/modules/contacts/presentation/pages/contact_list_widget_item.tsx +54 -65
  269. package/src/modules/contacts/presentation/pages/contact_section.tsx +13 -3
  270. package/src/modules/contacts/presentation/pages/contact_select_page.tsx +106 -74
  271. package/src/modules/contacts/presentation/pages/create/contact_create_page.tsx +86 -47
  272. package/src/modules/home/presentation/pages/home_page.tsx +2 -9
  273. package/src/modules/introduction/presentation/pages/introduction.tsx +8 -0
  274. package/src/modules/introduction/presentation/pages/introduction_footer.tsx +16 -36
  275. package/src/modules/introduction/presentation/pages/introduction_page.tsx +17 -5
  276. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.tsx +2 -2
  277. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.tsx +1 -1
  278. package/src/modules/profile/presentation/pages/profile_page_avatar.tsx +2 -2
  279. package/src/modules/profile/presentation/pages/profile_page_contacts.tsx +12 -19
  280. package/src/modules/profile/presentation/pages/profile_page_contacts_actions.tsx +10 -1
  281. package/src/modules/qrcode/presentation/pages/qrcode_alias_page_share.tsx +3 -3
  282. package/src/modules/search/domain/models/fonctionnalite.ts +56 -0
  283. package/src/modules/search/presentation/pages/search_btn_widget.tsx +91 -0
  284. package/src/modules/search/presentation/pages/search_fonctionnalites.ts +21 -1
  285. package/src/modules/search/presentation/pages/search_page.tsx +166 -57
  286. package/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page.tsx +4 -2
  287. package/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.tsx +5 -5
  288. package/src/modules/subscription/presentation/pages/subscription_menu_widget.tsx +3 -3
  289. package/src/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.ts +1 -2
  290. package/src/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.ts +17 -0
  291. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.tsx +26 -17
  292. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.tsx +9 -9
  293. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.tsx +9 -9
  294. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page.tsx +20 -2
  295. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.tsx +6 -8
  296. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.tsx +5 -5
  297. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.tsx +5 -7
  298. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.tsx +112 -103
  299. package/src/modules/transactions/presentation/pages/transaction_search/transaction_search_page.tsx +6 -10
  300. package/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.tsx +3 -6
  301. package/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.tsx +5 -5
  302. package/src/shared/widgets/alias_widget.tsx +45 -18
  303. package/src/shared/widgets/auth_code_field.tsx +89 -0
  304. package/src/shared/widgets/calendar_date_picker.tsx +12 -11
  305. package/src/shared/widgets/confirm_action_sheet_widget.tsx +19 -1
  306. package/src/shared/widgets/emoji_select_widget.tsx +31 -29
  307. package/src/shared/widgets/frequence_input_widget.tsx +18 -24
  308. package/src/shared/widgets/frequence_select_widget.tsx +237 -117
  309. package/src/shared/widgets/image_select_widget.tsx +4 -4
  310. package/src/shared/widgets/input_text.tsx +3 -0
  311. package/src/shared/widgets/notification_dialog.tsx +4 -1
  312. package/src/shared/widgets/pin_entete.tsx +74 -0
  313. package/src/shared/widgets/select_date_widget.tsx +66 -34
  314. package/src/shared/widgets/selection.tsx +23 -12
@@ -1,5 +1,5 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
- import { useEffect } from 'react';
2
+ import { useEffect, type ReactNode } from 'react';
3
3
  import { Keyboard, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
5
 
@@ -11,9 +11,11 @@ import type { AppLocalizations } from '../../../../l10n/app_localizations';
11
11
  import { useAppLocalizations } from '../../../../l10n/localizations';
12
12
  import { ElevatedButton, FilledTonalButton } from '../../../../shared/material/buttons';
13
13
  import { Card } from '../../../../shared/material/card';
14
- import { showDialog, showModalBottomSheet } from '../../../../shared/material/overlays';
14
+ import { showModalBottomSheet } from '../../../../shared/material/overlays';
15
+ import { Divider } from '../../../../shared/material/divider';
16
+ import { withAlpha } from '../../../../shared/utils/color';
15
17
  import { DateFormat } from '../../../../shared/utils/date_format';
16
- import { CustomAlertDialog } from '../../../../shared/widgets/custom_alert_dialog';
18
+ import { showConfirmActionSheet } from '../../../../shared/widgets/confirm_action_sheet_widget';
17
19
  import { ErrorCardWidget } from '../../../../shared/widgets/error_card_widget';
18
20
  import { CustomLoadingDialog, LoadingPage } from '../../../../shared/widgets/loading_page';
19
21
  import type { Alias } from '../../domain/models/alias';
@@ -32,6 +34,7 @@ import {
32
34
  AliasClaimNotFoundState,
33
35
  AliasExistState,
34
36
  } from '../bloc/alias_state';
37
+ import { PinEntete } from '../../../../shared/widgets/pin_entete';
35
38
  import { AliasMBNOCountdownTimer } from './alias_page_create_mbno_timer';
36
39
  import { AliasPageError } from './alias_page_error';
37
40
  import { AliasPageOtp } from './alias_page_otp';
@@ -114,10 +117,11 @@ export function AliasPageClaim({ id }: { id: string }) {
114
117
  const rejecting = aliasState instanceof AliasClaimHandlingSuccessState ? false : aliasState.rejecting;
115
118
  const error = aliasState instanceof AliasClaimHandlingErrorState ? aliasState.error : null;
116
119
  const goHome = () => AppRouter.pushReplacement(router, AppRouter.home);
120
+ // Fermeture, en haut à droite : retour à l'accueil
117
121
  const back = (
118
122
  <View style={styles.backRow}>
119
123
  <Pressable accessibilityRole="button" hitSlop={12} onPress={goHome} style={styles.backButton}>
120
- <MaterialIcons name="arrow-back" size={24} color={theme.colorScheme.onSurface} />
124
+ <MaterialIcons name="close" size={24} color={theme.colorScheme.onSurface} />
121
125
  </Pressable>
122
126
  </View>
123
127
  );
@@ -129,8 +133,9 @@ export function AliasPageClaim({ id }: { id: string }) {
129
133
  <ScrollView style={styles.padded} keyboardShouldPersistTaps="handled">
130
134
  <AliasPageOtp
131
135
  pinLength={AliasMbnoOtpCommand.otpSize}
132
- title={traductions.verifyPhoneNumberPageTitle}
133
- subtitle={traductions.verifyPhoneNumberPageSubTitle(claim.alias)}
136
+ icone="verified-user"
137
+ title={traductions.aliasClaimRefusOtpTitle}
138
+ subtitle={traductions.aliasClaimRefusOtpSubTitle(claim.alias)}
134
139
  errorMessage={error === AliasError.invalidOtpCode ? traductions.aliaMBNOInvalidOtpMessage : null}
135
140
  countdownTimer={
136
141
  aliasBloc.state instanceof AliasClaimHandlingState ? (
@@ -181,48 +186,46 @@ function ClaimDetails({
181
186
  : traductions.statutRejete;
182
187
 
183
188
  const confirm = () => {
184
- void showDialog(router, {
185
- builder: () => (
186
- <CustomAlertDialog
187
- title={traductions.aliasClaimAcceptDialogTitle}
188
- description={traductions.aliasClaimAcceptDialogMessage(claim.alias)}
189
- confirmBtnText={traductions.btnTextConfirm}
190
- confirmBtnAction={() => {
191
- AppRouter.pop(router);
192
- aliasBloc.add(new AliasClaimRespondEvent(id, alias, claim, true, null));
193
- }}
194
- cancelBtnText={traductions.btnTextCancel}
195
- cancelBtnAction={() => AppRouter.pop(router)}
196
- />
197
- ),
189
+ // Confirmation, comme la suppression d'un appareil
190
+ void showConfirmActionSheet(router, {
191
+ title: traductions.aliasClaimAcceptDialogTitle,
192
+ subtitle: traductions.aliasClaimAcceptDialogMessage(claim.alias),
193
+ confirmTitle: traductions.btnTextConfirm,
194
+ cancelTitle: traductions.btnTextCancel,
195
+ }).then((confirme) => {
196
+ if (confirme) aliasBloc.add(new AliasClaimRespondEvent(id, alias, claim, true, null));
198
197
  });
199
198
  };
200
199
 
201
200
  return (
202
201
  <View style={styles.flex}>
203
202
  {/* Détails de la revendication */}
204
- <ScrollView style={styles.padded}>
205
- {/* Header: titre et numéro de téléphone */}
206
- <Text numberOfLines={1} style={theme.textTheme.titleSmall}>
207
- {traductions.aliasClaimDetailsHeadTitle}
208
- </Text>
209
- <Text numberOfLines={1} style={[styles.subtitle, { color: theme.colorScheme.primary }]}>
210
- {traductions.aliasClaimDetailsHeadSubTitle}
211
- </Text>
212
- <Text style={{ color: theme.colorScheme.onSurface }}>{claim.alias}</Text>
213
- <View style={styles.gap20} />
203
+ <ScrollView style={styles.padded} contentContainerStyle={styles.contenu}>
204
+ {/* En-tête : pastille, titre et sous-titre centrés */}
205
+ <PinEntete
206
+ icone="gpp-maybe"
207
+ titre={traductions.aliasClaimDetailsHeadTitle}
208
+ sousTitre={traductions.aliasClaimDetailsHeadSubTitle}
209
+ />
210
+ <View style={styles.gap12} />
211
+ {/* Alias réclamé, en évidence */}
212
+ <View style={[styles.alias, { backgroundColor: withAlpha(theme.colorScheme.primary, 0.08) }]}>
213
+ <Text style={[theme.textTheme.displayLarge, styles.aliasTexte]}>{claim.alias}</Text>
214
+ </View>
215
+ <View style={styles.gap24} />
214
216
 
215
217
  {/* Détails : statut et dates */}
216
218
  <Card>
217
219
  <View style={styles.card}>
220
+ {/* Statut en badge coloré */}
221
+ <Detail title={traductions.statutLabel} valeur={<BadgeStatut statut={claim.statut} texte={statut} />} />
222
+ <Divider height={24} />
218
223
  <Detail
219
224
  title={traductions.aliasClaimDetailsDateDemande}
220
225
  subtitle={new DateFormat('d MMM, HH:mm', locale).format(claim.dateDemande)}
221
226
  />
222
- <View style={styles.gap10} />
223
- <Detail title={traductions.statutLabel} subtitle={statut} />
224
- <View style={styles.gap10} />
225
227
  {/* Date acceptation ou rejet */}
228
+ {claim.dateAction != null && <Divider height={24} />}
226
229
  {claim.dateAction != null && (
227
230
  <Detail
228
231
  title={
@@ -235,7 +238,7 @@ function ClaimDetails({
235
238
  )}
236
239
  </View>
237
240
  </Card>
238
- <View style={styles.gap10} />
241
+ <View style={styles.gap12} />
239
242
 
240
243
  {/* Avertissement délai de traitement */}
241
244
  {initiee && (
@@ -267,32 +270,57 @@ function ClaimDetails({
267
270
  );
268
271
  }
269
272
 
270
- /** Affiche un détail de la revendication */
271
- function Detail({ title, subtitle }: { title: string; subtitle: string }) {
273
+ /** Affiche un détail de la revendication : [subtitle] ou [valeur] */
274
+ function Detail({ title, subtitle, valeur }: { title: string; subtitle?: string; valeur?: ReactNode }) {
272
275
  const theme = useTheme();
273
276
  return (
274
277
  <View style={styles.detail}>
275
- <Text numberOfLines={1} style={theme.textTheme.bodyLarge}>
278
+ <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, { color: Themer.neural03Color }]}>
276
279
  {title}
277
280
  </Text>
278
- <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, styles.detailValue, { color: Themer.neural03Color }]}>
279
- {subtitle}
280
- </Text>
281
+ <View style={styles.detailValue}>
282
+ {valeur ?? (
283
+ <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, styles.detailTexte]}>
284
+ {subtitle}
285
+ </Text>
286
+ )}
287
+ </View>
288
+ </View>
289
+ );
290
+ }
291
+
292
+ /** Statut en badge coloré : en attente, acceptée ou rejetée */
293
+ function BadgeStatut({ statut, texte }: { statut: AliasRevendicationStatut; texte: string }) {
294
+ const theme = useTheme();
295
+ const couleur =
296
+ statut === AliasRevendicationStatut.initiee
297
+ ? Themer.amberColor
298
+ : statut === AliasRevendicationStatut.acceptee
299
+ ? Themer.successColor
300
+ : theme.colorScheme.error;
301
+ return (
302
+ <View style={[styles.badge, { backgroundColor: withAlpha(couleur, 0.12) }]}>
303
+ <Text style={[theme.textTheme.displaySmall, styles.badgeTexte, { color: couleur }]}>{texte}</Text>
281
304
  </View>
282
305
  );
283
306
  }
284
307
 
285
308
  const styles = StyleSheet.create({
286
309
  flex: { flex: 1 },
287
- backRow: { flexDirection: 'row' },
310
+ backRow: { flexDirection: 'row', justifyContent: 'flex-end' },
288
311
  backButton: { padding: 12 },
289
- padded: { paddingHorizontal: 12 },
290
- subtitle: { paddingBottom: 4 },
291
- gap10: { height: 10 },
292
- gap20: { height: 20 },
312
+ padded: { paddingHorizontal: 20 },
313
+ contenu: { paddingBottom: 16 },
314
+ alias: { alignSelf: 'center', paddingHorizontal: 16, paddingVertical: 8, borderRadius: 20 },
315
+ aliasTexte: { fontWeight: '700', letterSpacing: 0.5 },
316
+ gap12: { height: 12 },
317
+ gap24: { height: 24 },
293
318
  gap16w: { width: 16 },
294
- card: { paddingVertical: 10, paddingHorizontal: 15 },
319
+ card: { paddingVertical: 14, paddingHorizontal: 16 },
295
320
  detail: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
296
- detailValue: { flex: 1, textAlign: 'right' },
297
- actions: { flexDirection: 'row', paddingVertical: 10, paddingHorizontal: 10 },
321
+ detailValue: { flex: 1, marginLeft: 12, alignItems: 'flex-end' },
322
+ detailTexte: { fontWeight: '600', textAlign: 'right' },
323
+ badge: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 12 },
324
+ badgeTexte: { fontWeight: '700' },
325
+ actions: { flexDirection: 'row', paddingTop: 8, paddingBottom: 16, paddingHorizontal: 20 },
298
326
  });
@@ -1,16 +1,20 @@
1
- import { Keyboard, Pressable, StyleSheet, Text, View } from 'react-native';
1
+ import { MaterialIcons } from '@expo/vector-icons';
2
+ import { Keyboard, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
2
3
 
3
4
  import { useBloc } from '../../../../core/bloc_react';
4
5
  import { Di } from '../../../../core/di';
5
- import { useTheme } from '../../../../core/theme';
6
+ import { AppRouter, useAppRouter } from '../../../../core/router';
7
+ import { Themer, useTheme } from '../../../../core/theme';
6
8
  import type { AppLocalizations } from '../../../../l10n/app_localizations';
7
9
  import { useAppLocalizations } from '../../../../l10n/localizations';
8
10
  import { ElevatedButton } from '../../../../shared/material/buttons';
9
- import { DropdownButton } from '../../../../shared/material/dropdown';
11
+ import { showModalBottomSheet } from '../../../../shared/material/overlays';
10
12
  import { AliasPI } from '../../../../shared/models/alias_pi';
11
13
  import { UEMOACountry } from '../../../../shared/models/uemoa_countries';
12
14
  import { CustomTextInput } from '../../../../shared/widgets/input_text';
13
15
  import { MyPageContainer } from '../../../../shared/widgets/my_page_container';
16
+ import { SelectionLigne, SelectionSheet } from '../../../../shared/widgets/selection';
17
+ import { PinEntete } from '../../../../shared/widgets/pin_entete';
14
18
  import {
15
19
  AliasCreateCommandPhoneNumber,
16
20
  AliasCreateCommandPhoneNumberError,
@@ -21,7 +25,7 @@ import type { AliasMBNOCreationState } from '../bloc/alias_state';
21
25
 
22
26
  export function AliasPageCreateMBNOForm({ aliasState }: { aliasState: AliasMBNOCreationState }) {
23
27
  const localisation = useAppLocalizations();
24
- const theme = useTheme();
28
+ const router = useAppRouter();
25
29
  const aliasBloc = useBloc(AliasBloc);
26
30
  // Identité fournie par l'application hôte
27
31
  const user = Di.config.user;
@@ -38,67 +42,66 @@ export function AliasPageCreateMBNOForm({ aliasState }: { aliasState: AliasMBNOC
38
42
  const phoneText = aliasValue.phoneNumber?.phone != null ? AliasPI.formatPhoneNumber(aliasValue.phoneNumber.phone) : '';
39
43
  const phoneError = aliasValue.phoneNumber?.error;
40
44
 
45
+ const indicatif = aliasValue.phoneNumber?.indicatif;
46
+ const pays = UEMOACountry.liste.find((c) => c.phoneCode === indicatif);
47
+
48
+ // Envoi du code de vérification
49
+ const continuer = () => {
50
+ if (!aliasValue.isValid()) return;
51
+ Keyboard.dismiss();
52
+ aliasBloc.add(new AskPhoneNumberVerificationEvent(aliasValue));
53
+ };
54
+
55
+ // Feuille de choix de l'indicatif : drapeau, pays et indicatif
56
+ const choisirIndicatif = async () => {
57
+ Keyboard.dismiss();
58
+ const choisi = await showModalBottomSheet<UEMOACountry>(router, {
59
+ builder: () => <SelectIndicatif selected={pays} />,
60
+ });
61
+ if (choisi == null) return;
62
+ aliasValue.phoneNumber = new AliasCreateCommandPhoneNumber({
63
+ indicatif: choisi.phoneCode,
64
+ phone: aliasValue.phoneNumber?.phone,
65
+ });
66
+ aliasBloc.add(new CreateAliasMBNOValidationEvent(aliasValue));
67
+ };
68
+
41
69
  return (
42
70
  <MyPageContainer>
43
71
  <Pressable style={styles.column} onPress={Keyboard.dismiss} accessible={false}>
44
- <View>
45
- {/* Titre de la page */}
46
- <Text style={theme.textTheme.titleSmall}>{localisation.addPhoneNumberPageTitle}</Text>
47
- <View style={styles.gap8} />
48
- {/* Sous titre de la page */}
49
- <Text style={theme.textTheme.displaySmall}>{localisation.addPhoneNumberPageSubTitle}</Text>
72
+ <ScrollView contentContainerStyle={styles.contenu} keyboardShouldPersistTaps="handled">
73
+ {/* En-tête : pastille, titre et sous-titre centrés */}
74
+ <PinEntete
75
+ icone="phone-iphone"
76
+ titre={localisation.addPhoneNumberPageTitle}
77
+ sousTitre={localisation.addPhoneNumberPageSubTitle}
78
+ />
50
79
  <View style={styles.gap32} />
51
80
 
52
- {/* Select indicatif - Champ numéro de téléphone */}
53
- <View style={styles.row}>
54
- {/* - champ indicatif */}
55
- <View style={[styles.indicatif, { backgroundColor: theme.cardTheme.color }]}>
56
- <DropdownButton
57
- value={aliasValue.phoneNumber?.indicatif}
58
- items={UEMOACountry.liste.map((c) => ({ value: c.phoneCode, label: `${c.flag} ${c.phoneCode}` }))}
59
- onChanged={(value) => {
60
- aliasValue.phoneNumber = new AliasCreateCommandPhoneNumber({
61
- indicatif: value,
62
- phone: aliasValue.phoneNumber?.phone,
63
- });
64
- aliasBloc.add(new CreateAliasMBNOValidationEvent(aliasValue));
65
- }}
66
- />
67
- </View>
68
- <View style={styles.gap8w} />
69
- {/* - champ numéro de téléphone */}
70
- <View style={styles.expanded}>
71
- <CustomTextInput
72
- value={phoneText}
73
- hintText={localisation.addPhoneNumberFormHint}
74
- keyboardType="phone-pad"
75
- // Message d'erreur à afficher
76
- messageError={phoneError != null ? getPhoneNumberErrorMessage(phoneError, localisation) : null}
77
- // Quand le texte change
78
- onChange={(value) => {
79
- aliasValue.phoneNumber = new AliasCreateCommandPhoneNumber({
80
- indicatif: aliasValue.phoneNumber?.indicatif,
81
- phone: value.replace(/ /g, ''),
82
- });
83
- aliasBloc.add(new CreateAliasMBNOValidationEvent(aliasValue));
84
- }}
85
- />
86
- </View>
87
- </View>
88
- </View>
89
- {/* Bouton continuer */}
81
+ {/* Champ numéro de téléphone, avec l'indicatif au début */}
82
+ <CustomTextInput
83
+ value={phoneText}
84
+ hintText={localisation.addPhoneNumberFormHint}
85
+ keyboardType="phone-pad"
86
+ textInputAction="done"
87
+ onEditingComplete={continuer}
88
+ prefixIcon={<Indicatif pays={pays} onPress={choisirIndicatif} />}
89
+ // Message d'erreur à afficher
90
+ messageError={phoneError != null ? getPhoneNumberErrorMessage(phoneError, localisation) : null}
91
+ // Quand le texte change
92
+ onChange={(value) => {
93
+ aliasValue.phoneNumber = new AliasCreateCommandPhoneNumber({
94
+ indicatif: aliasValue.phoneNumber?.indicatif,
95
+ phone: value.replace(/ /g, ''),
96
+ });
97
+ aliasBloc.add(new CreateAliasMBNOValidationEvent(aliasValue));
98
+ }}
99
+ />
100
+ </ScrollView>
101
+ {/* Bouton continuer, fixé en bas */}
90
102
  <View style={styles.bottom}>
91
- <ElevatedButton
92
- onPress={
93
- aliasValue.isValid()
94
- ? () => {
95
- Keyboard.dismiss();
96
- aliasBloc.add(new AskPhoneNumberVerificationEvent(aliasValue));
97
- }
98
- : undefined
99
- }
100
- >
101
- {localisation.loginFormBtnConnexion}
103
+ <ElevatedButton onPress={aliasValue.isValid() ? continuer : undefined}>
104
+ {localisation.addPhoneNumberFormBtnContinuer}
102
105
  </ElevatedButton>
103
106
  </View>
104
107
  </Pressable>
@@ -106,6 +109,48 @@ export function AliasPageCreateMBNOForm({ aliasState }: { aliasState: AliasMBNOC
106
109
  );
107
110
  }
108
111
 
112
+ /** Indicatif choisi (drapeau et code) au début du champ, séparé du numéro par un trait */
113
+ function Indicatif({ pays, onPress }: { pays?: UEMOACountry; onPress: () => void }) {
114
+ const theme = useTheme();
115
+ return (
116
+ <Pressable accessibilityRole="button" onPress={onPress} style={styles.indicatif}>
117
+ <Text style={styles.drapeau}>{pays?.flag ?? ''}</Text>
118
+ <Text style={[theme.textTheme.bodyLarge, styles.code]}>{pays?.phoneCode ?? ''}</Text>
119
+ <MaterialIcons name="keyboard-arrow-down" size={22} color={theme.colorScheme.primary} />
120
+ <View style={[styles.trait, { backgroundColor: Themer.neural01Color }]} />
121
+ </Pressable>
122
+ );
123
+ }
124
+
125
+ /** Feuille de choix de l'indicatif ; renvoie le pays choisi */
126
+ function SelectIndicatif({ selected }: { selected?: UEMOACountry }) {
127
+ const localisation = useAppLocalizations();
128
+ const router = useAppRouter();
129
+ return (
130
+ <SelectionSheet
131
+ titre={localisation.addPhoneNumberIndicatifSheetTitle}
132
+ contenu={
133
+ <ScrollView contentContainerStyle={styles.liste}>
134
+ {UEMOACountry.liste.map((p) => (
135
+ <SelectionLigne
136
+ key={p.iso}
137
+ pastille={
138
+ <View style={styles.pastilleDrapeau}>
139
+ <Text style={styles.drapeauListe}>{p.flag}</Text>
140
+ </View>
141
+ }
142
+ texte={p.name}
143
+ detail={p.phoneCode}
144
+ choisie={p.phoneCode === selected?.phoneCode}
145
+ onPress={() => AppRouter.pop(router, { value: p })}
146
+ />
147
+ ))}
148
+ </ScrollView>
149
+ }
150
+ />
151
+ );
152
+ }
153
+
109
154
  function getPhoneNumberErrorMessage(
110
155
  error: AliasCreateCommandPhoneNumberError,
111
156
  traductions: AppLocalizations,
@@ -117,11 +162,14 @@ function getPhoneNumberErrorMessage(
117
162
 
118
163
  const styles = StyleSheet.create({
119
164
  column: { flex: 1, justifyContent: 'space-between' },
120
- gap8: { height: 8 },
121
- gap8w: { width: 8 },
122
165
  gap32: { height: 32 },
123
- row: { flexDirection: 'row', alignItems: 'flex-start' },
124
- indicatif: { paddingHorizontal: 10, borderRadius: 14, minHeight: 50, justifyContent: 'center' },
125
- expanded: { flex: 1 },
126
- bottom: { marginBottom: 10 },
166
+ contenu: { paddingTop: 8, paddingBottom: 16 },
167
+ indicatif: { flexDirection: 'row', alignItems: 'center', alignSelf: 'stretch', paddingRight: 8 },
168
+ drapeau: { fontSize: 20 },
169
+ code: { marginLeft: 6 },
170
+ trait: { width: 1, height: 24, marginLeft: 4 },
171
+ liste: { paddingHorizontal: 12, paddingBottom: 16 },
172
+ pastilleDrapeau: { width: 48, alignItems: 'center' },
173
+ drapeauListe: { fontSize: 26 },
174
+ bottom: { paddingTop: 8, paddingBottom: 16 },
127
175
  });
@@ -1,12 +1,12 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
- import { StyleSheet, Text, View } from 'react-native';
3
+ import { Pressable, StyleSheet, Text } from 'react-native';
4
4
 
5
- import { useTheme } from '../../../../core/theme';
5
+ import { Themer, useTheme } from '../../../../core/theme';
6
6
  import { useAppLocalizations } from '../../../../l10n/localizations';
7
- import { TextButton } from '../../../../shared/material/buttons';
7
+ import { withAlpha } from '../../../../shared/utils/color';
8
8
 
9
- /** Compte à rebours d'une minute avant de pouvoir renvoyer le code OTP. */
9
+ /** « Renvoyer le code » en pastille : désactivé pendant une minute après chaque envoi, avec le temps restant. */
10
10
  export function AliasMBNOCountdownTimer({ onResendOtp }: { onResendOtp: () => void }) {
11
11
  const localisation = useAppLocalizations();
12
12
  const theme = useTheme();
@@ -35,36 +35,45 @@ export function AliasMBNOCountdownTimer({ onResendOtp }: { onResendOtp: () => vo
35
35
  };
36
36
  }, [startTimer]);
37
37
 
38
- const done = remaining === 0;
38
+ const attente = remaining > 0;
39
39
  // Temps restant
40
40
  const minutes = Math.floor(remaining / 60);
41
41
  const seconds = remaining % 60;
42
42
  const timing = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
43
- const color = theme.textButtonTheme.foregroundColor;
43
+ const primaire = theme.colorScheme.primary;
44
+ const couleur = attente ? Themer.neural03Color : primaire;
44
45
 
46
+ // Pastille : fond teinté quand le renvoi est possible
45
47
  return (
46
- <TextButton
47
- onPress={
48
- done
49
- ? () => {
50
- startTimer();
51
- // renvoyer code OTP
52
- onResendOtp();
53
- }
54
- : undefined
55
- }
48
+ <Pressable
49
+ accessibilityRole="button"
50
+ disabled={attente}
51
+ onPress={() => {
52
+ startTimer();
53
+ // renvoyer code OTP
54
+ onResendOtp();
55
+ }}
56
+ style={({ pressed }) => [
57
+ styles.pastille,
58
+ { backgroundColor: attente ? 'transparent' : withAlpha(primaire, pressed ? 0.16 : 0.08) },
59
+ ]}
56
60
  >
57
- <View style={styles.row}>
58
- <Text style={[theme.textButtonTheme.textStyle, done ? null : styles.disabled]}>
59
- {done ? `${localisation.aliaMBNOResendMessageBtn} ` : `${localisation.aliaMBNOResendMessage(timing)} `}
60
- </Text>
61
- {done && <MaterialIcons name="refresh" size={20} color={color} />}
62
- </View>
63
- </TextButton>
61
+ <MaterialIcons name={attente ? 'schedule' : 'refresh'} size={18} color={couleur} />
62
+ <Text style={[theme.textTheme.displayMedium, styles.texte, { color: couleur }]}>
63
+ {attente ? localisation.aliaMBNOResendMessage(timing) : localisation.aliaMBNOResendMessageBtn}
64
+ </Text>
65
+ </Pressable>
64
66
  );
65
67
  }
66
68
 
67
69
  const styles = StyleSheet.create({
68
- row: { flexDirection: 'row', alignItems: 'center' },
69
- disabled: { opacity: 0.38 },
70
+ pastille: {
71
+ flexDirection: 'row',
72
+ alignItems: 'center',
73
+ alignSelf: 'center',
74
+ paddingHorizontal: 16,
75
+ paddingVertical: 10,
76
+ borderRadius: 999,
77
+ },
78
+ texte: { marginLeft: 8, fontWeight: '600' },
70
79
  });
@@ -1,55 +1,48 @@
1
- import { ScrollView, StyleSheet, Text, View } from 'react-native';
1
+ import { ScrollView, StyleSheet, View } from 'react-native';
2
2
 
3
3
  import { Images } from '../../../../core/assets';
4
4
  import { useBloc } from '../../../../core/bloc_react';
5
- import { useTheme } from '../../../../core/theme';
6
5
  import { useAppLocalizations } from '../../../../l10n/localizations';
7
- import { MenuActionItem, MenuActionsWidget } from '../../../../shared/widgets/menu_actions_widget';
8
6
  import { MyPageContainer } from '../../../../shared/widgets/my_page_container';
7
+ import { SelectionOption } from '../../../../shared/widgets/selection';
8
+ import { PinEntete } from '../../../../shared/widgets/pin_entete';
9
9
  import { AliasBloc } from '../bloc/alias_bloc';
10
10
  import { CreateAliasMBNOEvent, CreateAliasSHIDEvent } from '../bloc/alias_event';
11
11
 
12
- /** Choix du type d'alias à créer (SHID ou numéro de téléphone) pour [compte]. */
12
+ /**
13
+ * Choix du type d'alias à créer pour [compte] : adresse de paiement (SHID)
14
+ * ou numéro de téléphone (MBNO).
15
+ */
13
16
  export function AliasPageCreateOptions({ compte }: { compte: string }) {
14
17
  const traductions = useAppLocalizations();
15
- const theme = useTheme();
16
18
  const aliasBloc = useBloc(AliasBloc);
17
19
 
18
20
  return (
19
21
  <MyPageContainer>
20
- <ScrollView>
21
- {/* Titre de la page */}
22
- <Text style={theme.textTheme.titleSmall}>{traductions.aliasCreatePageTitle}</Text>
23
- <View style={styles.gap5} />
24
- {/* Sous titre de la page */}
25
- <Text style={theme.textTheme.displaySmall}>{traductions.aliasCreatePageSubTitle}</Text>
22
+ <ScrollView contentContainerStyle={styles.contenu}>
23
+ {/* En-tête : pastille, titre et sous-titre centrés */}
24
+ <PinEntete
25
+ icone="alternate-email"
26
+ titre={traductions.aliasCreatePageTitle}
27
+ sousTitre={traductions.aliasCreatePageSubTitle}
28
+ />
26
29
  <View style={styles.gap32} />
27
30
 
28
- {/* Bouton créer alias SHID */}
29
- <MenuActionsWidget
30
- items={[
31
- new MenuActionItem(
32
- Images.aliasIconUser,
33
- traductions.aliasCreateSHIDTitle,
34
- traductions.aliasCreateSHIDSubTitle,
35
- () => aliasBloc.add(new CreateAliasSHIDEvent(compte)),
36
- { iconSize: 20 },
37
- ),
38
- ]}
31
+ {/* Adresse de paiement (SHID) */}
32
+ <SelectionOption
33
+ image={Images.aliasIconUser}
34
+ titre={traductions.aliasCreateSHIDTitle}
35
+ sousTitre={traductions.aliasCreateSHIDSubTitle}
36
+ onPress={() => aliasBloc.add(new CreateAliasSHIDEvent(compte))}
39
37
  />
40
- <View style={styles.gap20} />
38
+ <View style={styles.gap12} />
41
39
 
42
- {/* - type MBNO */}
43
- <MenuActionsWidget
44
- items={[
45
- new MenuActionItem(
46
- Images.aliasIconPhone,
47
- traductions.aliasCreateMBNOTitle,
48
- traductions.aliasCreateMBNOSubTitle,
49
- () => aliasBloc.add(new CreateAliasMBNOEvent(compte)),
50
- { iconSize: 20 },
51
- ),
52
- ]}
40
+ {/* Numéro de téléphone (MBNO) */}
41
+ <SelectionOption
42
+ image={Images.aliasIconPhone}
43
+ titre={traductions.aliasCreateMBNOTitle}
44
+ sousTitre={traductions.aliasCreateMBNOSubTitle}
45
+ onPress={() => aliasBloc.add(new CreateAliasMBNOEvent(compte))}
53
46
  />
54
47
  </ScrollView>
55
48
  </MyPageContainer>
@@ -57,7 +50,7 @@ export function AliasPageCreateOptions({ compte }: { compte: string }) {
57
50
  }
58
51
 
59
52
  const styles = StyleSheet.create({
60
- gap5: { height: 5 },
61
- gap20: { height: 20 },
53
+ contenu: { paddingTop: 8, paddingBottom: 24 },
54
+ gap12: { height: 12 },
62
55
  gap32: { height: 32 },
63
56
  });