@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
@@ -3,7 +3,7 @@ import { Keyboard, StyleSheet, Text, useWindowDimensions, View } from 'react-nat
3
3
 
4
4
  import { AppEnv } from '../../../../../core/env';
5
5
  import { useBloc, useBlocBuilder } from '../../../../../core/bloc_react';
6
- import { useTheme } from '../../../../../core/theme';
6
+ import { Themer, useTheme } from '../../../../../core/theme';
7
7
  import type { AppLocalizations } from '../../../../../l10n/app_localizations';
8
8
  import { useAppLocalizations } from '../../../../../l10n/localizations';
9
9
  import { CompteValidator } from '../../../../../shared/models/compte_validator';
@@ -48,11 +48,10 @@ export function TransactionFormPageOthr() {
48
48
 
49
49
  return (
50
50
  <View>
51
- {/* Titre de la page */}
52
- <Text style={[theme.textTheme.titleSmall, styles.title]}>{traductions.transactionsSendFormOthrTitle}</Text>
53
- <View style={styles.gap5} />
51
+ {/* Titre dans la barre du haut (TransactionFormPage) */}
52
+ <View style={styles.gap8} />
54
53
  {/* Sous-titre de la page */}
55
- <Text style={theme.textTheme.displaySmall}>{traductions.transactionsSendFormOthrSubtitle}</Text>
54
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.transactionsSendFormOthrSubtitle}</Text>
56
55
  <View style={showDetails ? styles.gap32 : styles.gap10} />
57
56
 
58
57
  {/* Compte */}
@@ -171,6 +170,7 @@ function pspError(traductions: AppLocalizations, participants: Participant[], cm
171
170
  }
172
171
 
173
172
  const styles = StyleSheet.create({
173
+ gap8: { height: 8 },
174
174
  title: { fontSize: 25 },
175
175
  gap5: { height: 5 },
176
176
  gap6: { height: 6 },
@@ -3,11 +3,11 @@ import { ScrollView, StyleSheet, Text, View } from 'react-native';
3
3
  import { useBloc, useBlocBuilder, useBlocListener } from '../../../../../core/bloc_react';
4
4
  import { Di } from '../../../../../core/di';
5
5
  import { AppRouter, useAppRouter } from '../../../../../core/router';
6
- import { useTheme } from '../../../../../core/theme';
6
+ import { Themer, useTheme } from '../../../../../core/theme';
7
7
  import { useAppLocalizations } from '../../../../../l10n/localizations';
8
8
  import { ElevatedButton } from '../../../../../shared/material/buttons';
9
9
  import { showModalBottomSheet } from '../../../../../shared/material/overlays';
10
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
10
+ import { Scaffold } from '../../../../../shared/material/scaffold';
11
11
  import { FrequenceInputWidget } from '../../../../../shared/widgets/frequence_input_widget';
12
12
  import { CustomLoadingDialog, LoadingPage } from '../../../../../shared/widgets/loading_page';
13
13
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
@@ -24,6 +24,7 @@ import {
24
24
  import { TransactionSendPageError } from '../transaction_send/transaction_send_page_error';
25
25
  import { TransactionSendPageSuccess } from '../transaction_send/transaction_send_page_succes';
26
26
  import { TransactionSendFormInputDate } from './transaction_form_input_date';
27
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
27
28
 
28
29
  /** Programmation d'un transfert : fréquence et dates (route `transactionFormSchedule`). */
29
30
  export function TransactionFormPageSchedule({
@@ -99,14 +100,11 @@ export function TransactionFormPageSchedule({
99
100
  };
100
101
 
101
102
  return (
102
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
103
+ <Scaffold appBar={<ProfileAppBar titre={traductions.transactionFormScheduleTitle} />}>
103
104
  <MyPageContainer>
104
105
  <ScrollView style={styles.flex}>
105
- {/* Titre de la page */}
106
- <Text style={theme.textTheme.titleSmall}>{traductions.transactionFormScheduleTitle}</Text>
107
- <View style={styles.gap5} />
108
106
  {/* Sous-titre de la page */}
109
- <Text style={theme.textTheme.displaySmall}>{traductions.transactionFormScheduleSubtitle}</Text>
107
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.transactionFormScheduleSubtitle}</Text>
110
108
  <View style={styles.gap32} />
111
109
  {/* Fréquence */}
112
110
  <FrequenceInputWidget
@@ -1,18 +1,20 @@
1
- import { ScrollView, StyleSheet, Switch, Text, View } from 'react-native';
1
+ import { MaterialIcons } from '@expo/vector-icons';
2
+ import type { ComponentProps, ReactNode } from 'react';
3
+ import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
2
4
 
3
5
  import { useBloc, useBlocBuilder, useBlocListener } from '../../../../../core/bloc_react';
4
6
  import { AppRouter, useAppRouter } from '../../../../../core/router';
5
- import { useTheme } from '../../../../../core/theme';
7
+ import { Themer, useTheme } from '../../../../../core/theme';
6
8
  import { useAppLocalizations } from '../../../../../l10n/localizations';
7
9
  import { showModalBottomSheet } from '../../../../../shared/material/overlays';
8
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
10
+ import { Scaffold } from '../../../../../shared/material/scaffold';
9
11
  import { UEMOACountry } from '../../../../../shared/models/uemoa_countries';
10
12
  import { formatMontant } from '../../../../../shared/widgets/amount_widget';
11
13
  import { ConfirmActionSheetWidget } from '../../../../../shared/widgets/confirm_action_sheet_widget';
12
- import { CustomTextInput } from '../../../../../shared/widgets/input_text';
13
- import { CustomTextMultipleInput } from '../../../../../shared/widgets/input_text_multiple';
14
14
  import { CustomLoadingDialog, LoadingPage } from '../../../../../shared/widgets/loading_page';
15
15
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
16
+ import { SelectionChamp, SelectionPastille } from '../../../../../shared/widgets/selection';
17
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
16
18
  import { ContactPI } from '../../../../contacts/domain/contact_pi';
17
19
  import { ContactBloc } from '../../../../contacts/presentation/bloc/contact_bloc';
18
20
  import { TransactionSendCommand } from '../../../domain/models/transaction_send/transaction_send_command';
@@ -93,13 +95,14 @@ export function TransactionVerificationPage() {
93
95
 
94
96
  /** Proposer d'enregistrer l'alias dans les contacts (s'il n'y est pas) */
95
97
  const aliasValue = command.alias?.alias();
96
- const addAliasSwitch =
98
+ const enregistrerAlias =
97
99
  aliasValue != null && !contactBloc.isContactExist(aliasValue) ? (
98
- <Switch
99
- value={false}
100
- trackColor={{ false: theme.switchTheme.inactiveTrackColor, true: theme.switchTheme.activeTrackColor }}
101
- thumbColor={theme.switchTheme.thumbColor}
102
- onValueChange={async () => {
100
+ <Pressable
101
+ accessibilityRole="button"
102
+ accessibilityLabel={traductions.contactAliasSaveText}
103
+ hitSlop={8}
104
+ style={styles.action}
105
+ onPress={async () => {
103
106
  const confirmed = await showModalBottomSheet<boolean>(router, {
104
107
  builder: () => (
105
108
  <ConfirmActionSheetWidget
@@ -116,105 +119,94 @@ export function TransactionVerificationPage() {
116
119
  });
117
120
  }
118
121
  }}
119
- />
122
+ >
123
+ <MaterialIcons name="person-add-alt-1" size={20} color={theme.colorScheme.primary} />
124
+ </Pressable>
120
125
  ) : null;
121
126
 
127
+ const compte = command.method === TransactionSendMethod.iban || command.method === TransactionSendMethod.othr;
128
+ const pays = UEMOACountry.get(transaction.clientPays);
129
+ const motif = command.motif?.value ?? '';
130
+ const soldeValide = command.isSoldeValid(transaction.montantFrais);
131
+
132
+ // Informations, dans l'ordre du formulaire, chacune dans un champ comme
133
+ // le pays et l'institution
134
+ const champs: ReactNode[] = [
135
+ command.alias != null && (
136
+ <Champ key="alias" libelle={traductions.aliasFormLabel} valeur={aliasValue ?? ''} icone="alternate-email" suffixe={enregistrerAlias} />
137
+ ),
138
+ command.alias != null && psp != null && (
139
+ <Champ key="psp" libelle={traductions.transactionFormOthrNomLabel} valeur={psp.nomMembre} icone="account-balance" />
140
+ ),
141
+ compte && (
142
+ <Champ
143
+ key="compte"
144
+ libelle={command.method === TransactionSendMethod.iban ? traductions.transactionFormIbanHint : traductions.transactionFormOthrLabel}
145
+ valeur={command.othr?.compte() ?? ''}
146
+ icone="credit-card"
147
+ />
148
+ ),
149
+ compte && (
150
+ <Champ
151
+ key="banque"
152
+ libelle={command.method === TransactionSendMethod.iban ? traductions.transactionFormIbanNomLabel : traductions.transactionFormOthrNomLabel}
153
+ valeur={command.pspNom ?? ''}
154
+ icone="account-balance"
155
+ />
156
+ ),
157
+ // Pays de l'institution, avec son code comme dans le formulaire
158
+ pays != null && (
159
+ <SelectionChamp
160
+ key="pays"
161
+ libelle={traductions.transactionFormOthrPaysLabel}
162
+ valeur={pays.name}
163
+ pastille={<SelectionPastille code={pays.iso3} />}
164
+ />
165
+ ),
166
+ <Champ key="nom" libelle={traductions.transactionFormVerificationClientName} valeur={transaction.clientNom} icone="person" />,
167
+ transaction.facture != null && (
168
+ <Champ key="facture" libelle={traductions.transactionDetailsFacture} valeur={transaction.facture} icone="receipt-long" />
169
+ ),
170
+ transaction.txId != null && (
171
+ <Champ key="ref" libelle={traductions.transactionDetailsReference} valeur={transaction.txId} icone="tag" />
172
+ ),
173
+ // Montant, et l'erreur si le solde ne suffit pas
174
+ <View key="montant">
175
+ <Champ
176
+ libelle={traductions.transactionFormAmountHint}
177
+ valeur={`${formatMontant(command.amount?.value ?? 0, locale)} FCFA`}
178
+ icone="payments"
179
+ />
180
+ {!soldeValide && (
181
+ <Text style={[theme.inputDecorationTheme.errorStyle, styles.erreur]}>{`⚠ ${traductions.transactionFormAmountInvalid}`}</Text>
182
+ )}
183
+ </View>,
184
+ <Champ
185
+ key="frais"
186
+ libelle={traductions.transactionDetailsRecuInfoFrais}
187
+ valeur={montantFrais !== 0 ? `${formatMontant(montantFrais, locale)} FCFA` : traductions.transactionDetailsRecuInfoFraisDefault}
188
+ icone="receipt"
189
+ />,
190
+ motif.length > 0 && <Champ key="motif" libelle={traductions.transactionFormMotifLabel} valeur={motif} icone="notes" />,
191
+ ].filter(Boolean);
192
+
122
193
  return (
123
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
194
+ <Scaffold appBar={<ProfileAppBar titre={traductions.transactionFormVerificationTitle} />}>
124
195
  <MyPageContainer>
125
196
  <ScrollView style={styles.flex}>
126
- {/* Titre de la page */}
127
- <Text style={theme.textTheme.titleSmall}>{traductions.transactionFormVerificationTitle}</Text>
128
- <View style={styles.gap5} />
197
+ <View style={styles.gap8} />
129
198
  {/* Sous-titre de la page */}
130
- <Text style={theme.textTheme.displaySmall}>
199
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>
131
200
  {command.action === TransactionSendCommand.actionSendSchedule
132
201
  ? traductions.transactionFormVerificationAbnmSubtitle
133
202
  : traductions.transactionFormVerificationSubtitle}
134
203
  </Text>
135
- <View style={styles.gap32} />
136
-
137
- {/* Alias */}
138
- {command.alias != null && (
139
- <>
140
- <CustomTextInput labelText={traductions.aliasFormLabel} value={aliasValue ?? ''} readOnly suffixIcon={addAliasSwitch} />
141
- {/* Institution */}
142
- {psp != null && (
143
- <>
144
- <View style={styles.gap16} />
145
- <CustomTextInput labelText={traductions.transactionFormOthrNomLabel} value={psp.nomMembre} readOnly />
146
- </>
147
- )}
148
- </>
149
- )}
150
-
151
- {/* IBAN ou autre compte */}
152
- {(command.method === TransactionSendMethod.iban || command.method === TransactionSendMethod.othr) && (
153
- <>
154
- <CustomTextInput
155
- labelText={
156
- command.method === TransactionSendMethod.iban
157
- ? traductions.transactionFormIbanHint
158
- : traductions.transactionFormOthrLabel
159
- }
160
- value={command.othr?.compte() ?? ''}
161
- readOnly
162
- />
163
- <View style={styles.gap16} />
164
- <CustomTextInput
165
- labelText={
166
- command.method === TransactionSendMethod.iban
167
- ? traductions.transactionFormIbanNomLabel
168
- : traductions.transactionFormOthrNomLabel
169
- }
170
- value={command.pspNom ?? ''}
171
- readOnly
172
- />
173
- </>
174
- )}
175
-
176
- <View style={styles.gap16} />
177
- {/* Pays de l'institution */}
178
- <CustomTextInput
179
- labelText={traductions.transactionFormOthrPaysLabel}
180
- value={UEMOACountry.get(transaction.clientPays)?.name ?? ''}
181
- readOnly
182
- />
183
- <View style={styles.gap16} />
184
- {/* Nom du client */}
185
- <CustomTextInput labelText={traductions.transactionFormVerificationClientName} value={transaction.clientNom} readOnly />
186
- <View style={styles.gap16} />
187
- {/* Facture */}
188
- {transaction.facture != null && (
189
- <>
190
- <CustomTextInput labelText={traductions.transactionDetailsFacture} value={transaction.facture} readOnly />
191
- <View style={styles.gap16} />
192
- </>
193
- )}
194
- {/* Référence */}
195
- {transaction.txId != null && (
196
- <>
197
- <CustomTextInput labelText={traductions.transactionDetailsReference} value={transaction.txId} readOnly />
198
- <View style={styles.gap16} />
199
- </>
200
- )}
201
- {/* Montant */}
202
- <CustomTextInput
203
- labelText={traductions.transactionFormAmountHint}
204
- value={formatMontant(command.amount?.value ?? 0, locale)}
205
- readOnly
206
- messageError={!command.isSoldeValid(transaction.montantFrais) ? traductions.transactionFormAmountInvalid : null}
207
- />
208
- <View style={styles.gap16} />
209
- {/* Frais */}
210
- <CustomTextInput
211
- labelText={traductions.transactionDetailsRecuInfoFrais}
212
- value={montantFrais !== 0 ? formatMontant(montantFrais, locale) : traductions.transactionDetailsRecuInfoFraisDefault}
213
- readOnly
214
- />
215
- <View style={styles.gap16} />
216
- {/* Motif */}
217
- <CustomTextMultipleInput labelText={traductions.transactionFormMotifLabel} defaultValue={command.motif?.value ?? ''} readOnly />
204
+ <View style={styles.gap24} />
205
+ {champs.map((champ, i) => (
206
+ <View key={i} style={i > 0 ? styles.gap12 : null}>
207
+ {champ}
208
+ </View>
209
+ ))}
218
210
  <View style={styles.gap64} />
219
211
  </ScrollView>
220
212
  {/* Bouton de confirmation, rejet ou programmation */}
@@ -226,11 +218,28 @@ export function TransactionVerificationPage() {
226
218
  );
227
219
  }
228
220
 
221
+ /** Information en lecture seule : pastille avec [icone], libellé et valeur */
222
+ function Champ({
223
+ libelle,
224
+ valeur,
225
+ icone,
226
+ suffixe,
227
+ }: {
228
+ libelle: string;
229
+ valeur: string;
230
+ icone: ComponentProps<typeof MaterialIcons>['name'];
231
+ suffixe?: ReactNode;
232
+ }) {
233
+ return <SelectionChamp libelle={libelle} valeur={valeur} pastille={<SelectionPastille icone={icone} />} suffixe={suffixe} />;
234
+ }
235
+
229
236
  const styles = StyleSheet.create({
230
237
  flex: { flex: 1 },
231
238
  bottom: { paddingVertical: 16 },
232
- gap5: { height: 5 },
233
- gap16: { height: 16 },
234
- gap32: { height: 32 },
239
+ gap8: { height: 8 },
240
+ gap12: { marginTop: 12 },
241
+ gap24: { height: 24 },
235
242
  gap64: { height: 64 },
243
+ action: { padding: 4, marginLeft: 8 },
244
+ erreur: { marginLeft: 8, marginTop: 4 },
236
245
  });
@@ -1,11 +1,9 @@
1
- import { Keyboard, Pressable, StyleSheet, Text, View } from 'react-native';
1
+ import { Keyboard, Pressable, StyleSheet, View } from 'react-native';
2
2
 
3
3
  import { BlocProvider, useCreateBloc } from '../../../../../core/bloc_react';
4
4
  import { Di } from '../../../../../core/di';
5
- import { AppRouter, useAppRouter } from '../../../../../core/router';
6
- import { useTheme } from '../../../../../core/theme';
7
5
  import { useAppLocalizations } from '../../../../../l10n/localizations';
8
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
6
+ import { Scaffold } from '../../../../../shared/material/scaffold';
9
7
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
10
8
  import { TransactionSens } from '../../../domain/models/transaction';
11
9
  import { TransactionSearchCommand } from '../../../domain/models/transaction_search/transaction_search_command';
@@ -14,12 +12,11 @@ import { TransactionSearchBloc } from '../../bloc/transaction_search/transaction
14
12
  import { TransactionSearchListEvent } from '../../bloc/transaction_search/transaction_search_event';
15
13
  import { TransactionSearchPageInput } from './transaction_search_page_input';
16
14
  import { TransactionSearchPageListe } from './transaction_search_page_liste';
15
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
17
16
 
18
17
  /** Recherche dans toutes les transactions du compte actif (route `transactionSearch`). */
19
18
  export function TransactionSearchPage() {
20
19
  const traductions = useAppLocalizations();
21
- const theme = useTheme();
22
- const router = useAppRouter();
23
20
  const bloc = useCreateBloc(() => {
24
21
  const created = new TransactionSearchBloc(Di.getTransactionInputPort());
25
22
  created.add(
@@ -34,12 +31,11 @@ export function TransactionSearchPage() {
34
31
  });
35
32
 
36
33
  return (
37
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
34
+ <Scaffold appBar={<ProfileAppBar titre={traductions.transactionSearchTitle} />}>
38
35
  <BlocProvider blocs={[bloc]}>
39
36
  <MyPageContainer>
40
37
  <Pressable style={styles.flex} onPress={Keyboard.dismiss} accessible={false}>
41
- <Text style={theme.textTheme.titleSmall}>{traductions.transactionSearchTitle}</Text>
42
- <View style={styles.gap16} />
38
+ <View style={styles.gap8} />
43
39
  {/* Barre de filtre : champ et bouton */}
44
40
  <TransactionSearchPageInput />
45
41
  <View style={styles.gap32} />
@@ -54,6 +50,6 @@ export function TransactionSearchPage() {
54
50
 
55
51
  const styles = StyleSheet.create({
56
52
  flex: { flex: 1 },
57
- gap16: { height: 16 },
53
+ gap8: { height: 8 },
58
54
  gap32: { height: 32 },
59
55
  });
@@ -4,18 +4,18 @@ import { useState } from 'react';
4
4
  import { ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';
5
5
 
6
6
  import { Images } from '../../../../../core/assets';
7
- import { AppRouter, useAppRouter } from '../../../../../core/router';
8
7
  import { Themer, useTheme } from '../../../../../core/theme';
9
8
  import { useAppLocalizations } from '../../../../../l10n/localizations';
10
9
  import { TextButton } from '../../../../../shared/material/buttons';
11
10
  import { Card } from '../../../../../shared/material/card';
12
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
11
+ import { Scaffold } from '../../../../../shared/material/scaffold';
13
12
  import { CircleAvatarWidget } from '../../../../../shared/widgets/circle_avatar_widget';
14
13
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
15
14
  import { ContactPI } from '../../../../contacts/domain/contact_pi';
16
15
  import type { Transaction } from '../../../domain/models/transaction';
17
16
  import { TransactionListItemWidget } from '../transaction_list_item_widget';
18
17
  import { SPLIT_SELF, TransactionSplitPageConfirm } from './transaction_split_page_confirm';
18
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
19
19
 
20
20
  /**
21
21
  * Partage de dépense, dernière étape : répartition du montant entre le
@@ -24,7 +24,6 @@ import { SPLIT_SELF, TransactionSplitPageConfirm } from './transaction_split_pag
24
24
  export function TransactionSplitPageRepartition({ transaction, contacts }: { transaction: Transaction; contacts: ContactPI[] }) {
25
25
  const traductions = useAppLocalizations();
26
26
  const theme = useTheme();
27
- const router = useAppRouter();
28
27
  // Le client en tête de liste
29
28
  const [selectedItems] = useState(() => [new ContactPI({ name: SPLIT_SELF, phoneNumber: '', alias: SPLIT_SELF }), ...contacts]);
30
29
  // Répartition par défaut : parts égales, le reste pour le client
@@ -39,10 +38,8 @@ export function TransactionSplitPageRepartition({ transaction, contacts }: { tra
39
38
  });
40
39
 
41
40
  return (
42
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
41
+ <Scaffold appBar={<ProfileAppBar titre={traductions.transactionSplitRepartitionTitle} />}>
43
42
  <MyPageContainer>
44
- <Text style={theme.textTheme.titleSmall}>{traductions.transactionSplitRepartitionTitle}</Text>
45
- <View style={styles.gap10} />
46
43
  <ScrollView style={styles.flex} keyboardShouldPersistTaps="handled">
47
44
  {/* Détails du paiement partagé */}
48
45
  <Text style={theme.textTheme.headlineSmall}>{traductions.transactionSplitRepartitionSubtitle1}</Text>
@@ -4,10 +4,10 @@ import { Keyboard, StyleSheet, Text, View } from 'react-native';
4
4
  import { BlocProvider, useCreateBloc } from '../../../../../core/bloc_react';
5
5
  import { Di } from '../../../../../core/di';
6
6
  import { AppRouter, useAppRouter } from '../../../../../core/router';
7
- import { useTheme } from '../../../../../core/theme';
7
+ import { Themer, useTheme } from '../../../../../core/theme';
8
8
  import { useAppLocalizations } from '../../../../../l10n/localizations';
9
9
  import { ElevatedButton } from '../../../../../shared/material/buttons';
10
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
10
+ import { Scaffold } from '../../../../../shared/material/scaffold';
11
11
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
12
12
  import type { ContactPI } from '../../../../contacts/domain/contact_pi';
13
13
  import { TransactionSens, type Transaction } from '../../../domain/models/transaction';
@@ -16,6 +16,7 @@ import { TransactionSearchFilter } from '../../../domain/models/transaction_sear
16
16
  import { TransactionSearchBloc } from '../../bloc/transaction_search/transaction_search_bloc';
17
17
  import { TransactionSearchListEvent } from '../../bloc/transaction_search/transaction_search_event';
18
18
  import { TransactionSearchPageListe } from '../transaction_search/transaction_search_page_liste';
19
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
19
20
 
20
21
  /** Partage de dépense, étape 1 : choisir le paiement émis à partager. */
21
22
  export function TransactionSplitPageTx() {
@@ -37,13 +38,12 @@ export function TransactionSplitPageTx() {
37
38
  });
38
39
 
39
40
  return (
40
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
41
+ <Scaffold appBar={<ProfileAppBar titre={traductions.transactionSplitSelectTxPageTitle} />}>
41
42
  <BlocProvider blocs={[searchBloc]}>
42
43
  <MyPageContainer>
43
44
  <View style={styles.flex}>
44
- <Text style={theme.textTheme.titleSmall}>{traductions.transactionSplitSelectTxPageTitle}</Text>
45
45
  <View style={styles.gap8} />
46
- <Text style={theme.textTheme.displaySmall}>{traductions.transactionSplitSelectTxPageSubtitle}</Text>
46
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.transactionSplitSelectTxPageSubtitle}</Text>
47
47
  <View style={styles.gap20} />
48
48
  {/* Liste des transactions */}
49
49
  <TransactionSearchPageListe
@@ -13,8 +13,8 @@ import { ClipboardWidget } from './clipboard_widget';
13
13
 
14
14
  /**
15
15
  * Pour afficher l'alias dans l'app : formaté, avec un bouton pour le
16
- * copier. Si l'alias n'est pas encore dans les contacts du téléphone, un
17
- * appui long propose de l'y enregistrer.
16
+ * copier. Si l'alias n'est pas encore dans les contacts du téléphone, une
17
+ * icône visible (et l'appui long) propose de l'y enregistrer.
18
18
  */
19
19
  export function AliasWidget({
20
20
  alias,
@@ -33,25 +33,54 @@ export function AliasWidget({
33
33
  const contactBloc = useBloc(ContactBloc);
34
34
  useBlocBuilder(contactBloc);
35
35
 
36
+ const inconnu = !contactBloc.isContactExist(alias);
37
+ const enregistrer = () =>
38
+ void AppRouter.push(router, AppRouter.profileContacts, {
39
+ params: new ContactPI({ name: name ?? '', alias }),
40
+ });
41
+
36
42
  const style = [theme.textTheme.bodyLarge, { color: Themer.neural03Color, textAlign }];
37
43
  const text = (
38
- <Text numberOfLines={1} style={[style, canCopy ? styles.flex : null]}>
44
+ <Text numberOfLines={1} style={[style, canCopy || inconnu ? styles.flex : null]}>
39
45
  {AliasPI.formatPhoneNumber(alias)}
40
46
  </Text>
41
47
  );
42
- const content = canCopy ? (
43
- <View style={styles.row}>
44
- {text}
45
- <Pressable accessibilityRole="button" hitSlop={8} onPress={() => void ClipboardWidget.setData(alias)}>
46
- <MaterialIcons name="content-copy" size={16} color={theme.colorScheme.onSurface} />
47
- </Pressable>
48
- </View>
49
- ) : (
50
- text
51
- );
48
+ const content =
49
+ canCopy || inconnu ? (
50
+ <View style={styles.row}>
51
+ {text}
52
+ {/* Enregistrer dans les contacts (alias inconnu) */}
53
+ {inconnu && (
54
+ <Pressable
55
+ accessibilityRole="button"
56
+ accessibilityLabel={traductions.contactAliasSaveText}
57
+ hitSlop={8}
58
+ onPress={enregistrer}
59
+ style={styles.icone}
60
+ >
61
+ <MaterialIcons name="person-add-alt-1" size={20} color={theme.colorScheme.primary} />
62
+ </Pressable>
63
+ )}
64
+ {/* Copier l'alias */}
65
+ {canCopy && (
66
+ <Pressable
67
+ accessibilityRole="button"
68
+ accessibilityLabel={traductions.aliasWidgetCopyTooltip}
69
+ hitSlop={8}
70
+ onPress={() => void ClipboardWidget.setData(alias)}
71
+ style={styles.icone}
72
+ >
73
+ <MaterialIcons name="content-copy" size={16} color={theme.colorScheme.onSurface} />
74
+ </Pressable>
75
+ )}
76
+ </View>
77
+ ) : (
78
+ text
79
+ );
52
80
 
53
- if (contactBloc.isContactExist(alias)) return content;
81
+ if (!inconnu) return content;
54
82
 
83
+ // Appui long : raccourci vers l'enregistrement, en plus de l'icône visible
55
84
  const showLightMenu = (event: GestureResponderEvent) => {
56
85
  void showPopupMenu(router, {
57
86
  x: event.nativeEvent.pageX,
@@ -61,10 +90,7 @@ export function AliasWidget({
61
90
  icon: 'person-add',
62
91
  iconSize: 16,
63
92
  label: traductions.contactAliasSaveText,
64
- onTap: () =>
65
- void AppRouter.push(router, AppRouter.profileContacts, {
66
- params: new ContactPI({ name: name ?? '', alias }),
67
- }),
93
+ onTap: enregistrer,
68
94
  },
69
95
  ],
70
96
  });
@@ -76,4 +102,5 @@ export function AliasWidget({
76
102
  const styles = StyleSheet.create({
77
103
  flex: { flex: 1 },
78
104
  row: { flexDirection: 'row', alignItems: 'center' },
105
+ icone: { paddingHorizontal: 6, paddingVertical: 4 },
79
106
  });
@@ -0,0 +1,89 @@
1
+ import { useRef, useState } from 'react';
2
+ import { Pressable, StyleSheet, Text, TextInput, View, type TextInputInstance } from 'react-native';
3
+
4
+ import { useTheme } from '../../core/theme';
5
+
6
+ /**
7
+ * Champ du code de vérification reçu par SMS ou e-mail : une case par
8
+ * chiffre, au-dessus d'un vrai champ (invisible) qui reçoit la saisie, le
9
+ * collage et la suggestion automatique du code par le clavier (code à
10
+ * usage unique).
11
+ */
12
+ export function AuthCodeField({
13
+ onChanged,
14
+ longueur = 6,
15
+ erreur = false,
16
+ onComplete,
17
+ autoFocus = false,
18
+ }: {
19
+ onChanged: (code: string) => void;
20
+ /** Nombre de chiffres du code */
21
+ longueur?: number;
22
+ erreur?: boolean;
23
+ /** Appelé quand tous les chiffres sont saisis */
24
+ onComplete?: (code: string) => void;
25
+ /** Ouvre le clavier dès l'affichage */
26
+ autoFocus?: boolean;
27
+ }) {
28
+ const theme = useTheme();
29
+ const champ = useRef<TextInputInstance | null>(null);
30
+ const [code, setCode] = useState('');
31
+ const [focus, setFocus] = useState(autoFocus);
32
+ const primaire = theme.colorScheme.primary;
33
+ // Case en cours de saisie
34
+ const courante = Math.min(code.length, longueur - 1);
35
+
36
+ return (
37
+ <Pressable onPress={() => champ.current?.focus()} accessibilityRole="none">
38
+ {/* Vrai champ, invisible : saisie, collage, code suggéré */}
39
+ <TextInput
40
+ ref={champ}
41
+ value={code}
42
+ autoFocus={autoFocus}
43
+ keyboardType="number-pad"
44
+ textContentType="oneTimeCode"
45
+ autoComplete="sms-otp"
46
+ maxLength={longueur}
47
+ caretHidden
48
+ onFocus={() => setFocus(true)}
49
+ onBlur={() => setFocus(false)}
50
+ onChangeText={(texte) => {
51
+ const valeur = texte.replace(/\D/g, '').slice(0, longueur);
52
+ setCode(valeur);
53
+ onChanged(valeur);
54
+ if (valeur.length === longueur) onComplete?.(valeur);
55
+ }}
56
+ style={styles.cache}
57
+ />
58
+ {/* Cases, une par chiffre */}
59
+ <View style={styles.cases} pointerEvents="none">
60
+ {Array.from({ length: longueur }, (_, i) => (
61
+ <View
62
+ key={i}
63
+ style={[
64
+ styles.case,
65
+ i > 0 ? styles.ecart : null,
66
+ {
67
+ backgroundColor: theme.inputDecorationTheme.fillColor,
68
+ borderColor: erreur
69
+ ? theme.colorScheme.error
70
+ : focus && i === courante
71
+ ? primaire
72
+ : 'transparent',
73
+ },
74
+ ]}
75
+ >
76
+ <Text style={theme.textTheme.headlineMedium}>{i < code.length ? code[i] : ''}</Text>
77
+ </View>
78
+ ))}
79
+ </View>
80
+ </Pressable>
81
+ );
82
+ }
83
+
84
+ const styles = StyleSheet.create({
85
+ cache: { position: 'absolute', opacity: 0, width: 1, height: 1 },
86
+ cases: { flexDirection: 'row' },
87
+ case: { flex: 1, height: 56, borderRadius: 14, borderWidth: 1.5, alignItems: 'center', justifyContent: 'center' },
88
+ ecart: { marginLeft: 8 },
89
+ });