@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,8 +1,9 @@
1
1
  /* eslint-disable @typescript-eslint/no-require-imports */
2
2
  import { MaterialIcons } from '@expo/vector-icons';
3
+ import { Image } from 'expo-image';
3
4
  import { createAudioPlayer, type AudioPlayer } from 'expo-audio';
4
5
  import { ExpoSpeechRecognitionModule, useSpeechRecognitionEvent } from 'expo-speech-recognition';
5
- import { useEffect, useMemo, useRef, useState } from 'react';
6
+ import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';
6
7
  import { Keyboard, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';
7
8
 
8
9
  import { AppRouter, useAppRouter } from '../../../../core/router';
@@ -12,9 +13,8 @@ import { useAppLocalizations } from '../../../../l10n/localizations';
12
13
  import { Card } from '../../../../shared/material/card';
13
14
  import { AppBar, Scaffold } from '../../../../shared/material/scaffold';
14
15
  import { CustomSnackBar } from '../../../../shared/widgets/custom_snack_bar';
15
- import { MenuActionItem, MenuActionsWidget } from '../../../../shared/widgets/menu_actions_widget';
16
- import { MyPageContainer } from '../../../../shared/widgets/my_page_container';
17
- import { Fonctionnalite } from '../../domain/models/fonctionnalite';
16
+ import { withAlpha } from '../../../../shared/utils/color';
17
+ import { Fonctionnalite, FonctionnaliteRubrique } from '../../domain/models/fonctionnalite';
18
18
  import { SearchPageVoiceButton } from './search_page_voice_button';
19
19
 
20
20
  /**
@@ -214,55 +214,151 @@ export function SearchPage({
214
214
  const resultats = Fonctionnalite.rechercher(fonctionnalites, recherche);
215
215
  const voixActive = ecoute || annonce;
216
216
 
217
- /** Ligne de résultat : ferme la recherche en renvoyant [item]. */
218
- const ligne = (item: Fonctionnalite) =>
219
- new MenuActionItem(item.icon, item.titre, item.sousTitre, () => AppRouter.pop(router, { value: item }), {
220
- iconSize: 20,
221
- trailing: (
222
- <MaterialIcons
223
- name={Platform.OS === 'ios' ? 'arrow-forward-ios' : 'arrow-forward'}
224
- size={16}
225
- color={Themer.neural03Color}
226
- />
227
- ),
217
+ const primaire = theme.colorScheme.primary;
218
+ const saisie = recherche.trim().length > 0;
219
+ const [focus, setFocus] = useState(false);
220
+ const actif = focus || voixActive;
221
+ const fermer = (item: Fonctionnalite) => AppRouter.pop(router, { value: item });
222
+
223
+ /** [texte] avec les parties qui correspondent à la saisie en gras, de la couleur principale. */
224
+ const surligner = (texte: string) => {
225
+ const parties = Fonctionnalite.correspondances(texte, recherche);
226
+ if (parties.length === 0) return texte;
227
+ const morceaux: ReactNode[] = [];
228
+ let position = 0;
229
+ parties.forEach(([debut, fin], i) => {
230
+ if (debut > position) morceaux.push(texte.substring(position, debut));
231
+ morceaux.push(
232
+ <Text key={i} style={[styles.gras, { color: primaire }]}>
233
+ {texte.substring(debut, fin)}
234
+ </Text>,
235
+ );
236
+ position = fin;
228
237
  });
238
+ if (position < texte.length) morceaux.push(texte.substring(position));
239
+ return morceaux;
240
+ };
241
+
242
+ /** Ligne de fonctionnalité : pastille, titre (partie trouvée en gras), sous-titre ; ferme la recherche en renvoyant [item]. */
243
+ const ligne = (item: Fonctionnalite) => (
244
+ <Pressable
245
+ key={item.titre}
246
+ accessibilityRole="button"
247
+ onPress={() => fermer(item)}
248
+ style={({ pressed }) => [styles.ligne, pressed ? { backgroundColor: theme.colorScheme.secondary } : null]}
249
+ >
250
+ <View style={[styles.pastille, { backgroundColor: withAlpha(primaire, 0.1) }]}>
251
+ <Image source={item.icon} style={styles.pastilleIcone} tintColor={primaire} contentFit="contain" />
252
+ </View>
253
+ <View style={styles.textes}>
254
+ <Text numberOfLines={2} style={[theme.textTheme.displayLarge, styles.titreLigne]}>
255
+ {surligner(item.titre)}
256
+ </Text>
257
+ {item.sousTitre != null && item.sousTitre.length > 0 && (
258
+ <Text numberOfLines={2} style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>
259
+ {item.sousTitre}
260
+ </Text>
261
+ )}
262
+ </View>
263
+ <MaterialIcons name={Platform.OS === 'ios' ? 'arrow-forward-ios' : 'arrow-forward'} size={16} color={Themer.neural03Color} />
264
+ </Pressable>
265
+ );
266
+
267
+ /** Liste de fonctionnalités dans une carte */
268
+ const liste = (items: Fonctionnalite[]) => (
269
+ <Card style={styles.carte}>
270
+ <View style={styles.carteContenu}>{items.map(ligne)}</View>
271
+ </Card>
272
+ );
273
+
274
+ /** Titre de rubrique */
275
+ const titre = (texte: string) => (
276
+ <Text style={[theme.textTheme.displayMedium, styles.titreRubrique, { color: Themer.neural03Color }]}>{texte}</Text>
277
+ );
278
+
279
+ /** Avant toute saisie : raccourcis en pastilles, puis toutes les fonctionnalités groupées par rubrique. */
280
+ const accueil = () => {
281
+ const raccourcis = fonctionnalites.filter((item) => item.raccourci);
282
+ const libelles: Record<FonctionnaliteRubrique, string> = {
283
+ [FonctionnaliteRubrique.paiements]: traductions.searchRubriquePaiements,
284
+ [FonctionnaliteRubrique.abonnements]: traductions.searchRubriqueAbonnements,
285
+ [FonctionnaliteRubrique.servicesBancaires]: traductions.searchRubriqueServicesBancaires,
286
+ [FonctionnaliteRubrique.profil]: traductions.searchRubriqueProfil,
287
+ };
288
+ return (
289
+ <>
290
+ {raccourcis.length > 0 && (
291
+ <>
292
+ {titre(traductions.searchShortcutsTitle)}
293
+ <View style={styles.raccourcis}>
294
+ {raccourcis.map((item) => (
295
+ <Pressable
296
+ key={item.titre}
297
+ accessibilityRole="button"
298
+ onPress={() => fermer(item)}
299
+ style={({ pressed }) => [
300
+ styles.raccourci,
301
+ { backgroundColor: withAlpha(primaire, pressed ? 0.16 : 0.08), borderColor: withAlpha(primaire, 0.15) },
302
+ ]}
303
+ >
304
+ <Image source={item.icon} style={styles.raccourciIcone} tintColor={primaire} contentFit="contain" />
305
+ <Text style={[theme.textTheme.displayMedium, styles.raccourciTexte]}>{item.titre}</Text>
306
+ </Pressable>
307
+ ))}
308
+ </View>
309
+ <View style={styles.gap24} />
310
+ </>
311
+ )}
312
+ {Object.values(FonctionnaliteRubrique).map((rubrique) => {
313
+ const items = fonctionnalites.filter((item) => item.rubrique === rubrique);
314
+ if (items.length === 0) return null;
315
+ return (
316
+ <View key={rubrique}>
317
+ {titre(libelles[rubrique])}
318
+ {liste(items)}
319
+ <View style={styles.gap24} />
320
+ </View>
321
+ );
322
+ })}
323
+ </>
324
+ );
325
+ };
229
326
 
230
327
  return (
231
328
  <Scaffold
232
329
  appBar={
233
330
  <AppBar
234
- title={<Text style={theme.textTheme.headlineMedium}>{traductions.searchTitle}</Text>}
235
331
  onBack={() => AppRouter.pop(router)}
236
- />
237
- }
238
- >
239
- <MyPageContainer>
240
- <Pressable accessible={false} style={styles.flex} onPress={Keyboard.dismiss}>
241
- <View style={styles.gap10} />
242
- {/* Champ de recherche : loupe à gauche ; à droite, la croix pour effacer (hors voix) et le bouton micro */}
243
- <Card>
244
- <View style={[styles.champ, { backgroundColor: theme.inputDecorationTheme.fillColor }]}>
245
- <MaterialIcons name="search" size={18} color={Themer.neural03Color} />
332
+ centerTitle={false}
333
+ title={
334
+ // Champ de recherche à la place du titre : loupe à gauche ; à droite, la croix pour effacer (hors voix) et le bouton micro
335
+ <View
336
+ style={[
337
+ styles.champ,
338
+ {
339
+ backgroundColor: theme.cardColor,
340
+ borderColor: actif ? primaire : withAlpha(Themer.neural03Color, 0.2),
341
+ borderWidth: actif ? 1.5 : 1,
342
+ },
343
+ ]}
344
+ >
345
+ <MaterialIcons name="search" size={20} color={actif ? primaire : Themer.neural03Color} />
246
346
  <TextInput
247
347
  value={recherche}
248
348
  onChangeText={setRecherche}
249
349
  autoFocus
350
+ onFocus={() => setFocus(true)}
351
+ onBlur={() => setFocus(false)}
250
352
  style={[theme.textTheme.displayLarge, styles.input]}
251
353
  // Le texte d'aide suit l'état de la voix.
252
354
  placeholder={
253
- annonce
254
- ? traductions.searchVoicePrompt
255
- : ecoute
256
- ? traductions.searchVoiceListening
257
- : traductions.searchHint
355
+ annonce ? traductions.searchVoicePrompt : ecoute ? traductions.searchVoiceListening : traductions.searchTitle
258
356
  }
259
357
  placeholderTextColor={Themer.neural03Color}
260
358
  returnKeyType="search"
261
359
  // « Entrée » ouvre le résultat le plus pertinent.
262
360
  onSubmitEditing={() => {
263
- if (recherche.trim().length > 0 && resultats.length > 0) {
264
- AppRouter.pop(router, { value: resultats[0] });
265
- }
361
+ if (saisie && resultats.length > 0) fermer(resultats[0]);
266
362
  }}
267
363
  />
268
364
  {recherche.length > 0 && !voixActive && (
@@ -277,38 +373,51 @@ export function SearchPage({
277
373
  onPress={() => void basculerEcoute()}
278
374
  />
279
375
  </View>
280
- </Card>
281
- <View style={styles.gap16} />
282
- <View style={styles.flex}>
283
- {resultats.length === 0 ? (
284
- <View style={styles.vide}>
285
- <MaterialIcons name="search-off" size={40} color={Themer.neural03Color} />
286
- <View style={styles.gap12} />
287
- <Text style={[theme.textTheme.displayMedium, styles.centre, { color: Themer.neural04Color }]}>
288
- {traductions.searchEmpty(recherche.trim())}
289
- </Text>
290
- </View>
291
- ) : (
292
- <ScrollView keyboardShouldPersistTaps="handled" contentContainerStyle={styles.liste}>
293
- <MenuActionsWidget items={resultats.map(ligne)} />
294
- </ScrollView>
295
- )}
376
+ }
377
+ />
378
+ }
379
+ >
380
+ <Pressable accessible={false} style={styles.flex} onPress={Keyboard.dismiss}>
381
+ {saisie && resultats.length === 0 ? (
382
+ <View style={styles.vide}>
383
+ <MaterialIcons name="search-off" size={40} color={Themer.neural03Color} />
384
+ <View style={styles.gap12} />
385
+ <Text style={[theme.textTheme.displayMedium, styles.centre, { color: Themer.neural04Color }]}>
386
+ {traductions.searchEmpty(recherche.trim())}
387
+ </Text>
296
388
  </View>
297
- </Pressable>
298
- </MyPageContainer>
389
+ ) : (
390
+ <ScrollView keyboardShouldPersistTaps="handled" contentContainerStyle={styles.liste}>
391
+ {/* Avant toute saisie : raccourcis puis rubriques */}
392
+ {saisie ? liste(resultats) : accueil()}
393
+ </ScrollView>
394
+ )}
395
+ </Pressable>
299
396
  </Scaffold>
300
397
  );
301
398
  }
302
399
 
303
400
  const styles = StyleSheet.create({
304
401
  flex: { flex: 1 },
305
- gap10: { height: 10 },
306
402
  gap12: { height: 12 },
307
- gap16: { height: 16 },
308
- champ: { height: 40, flexDirection: 'row', alignItems: 'center', paddingLeft: 12, paddingRight: 4 },
403
+ gap24: { height: 24 },
404
+ champ: { alignSelf: 'stretch', height: 48, borderRadius: 14, flexDirection: 'row', alignItems: 'center', paddingLeft: 12, paddingRight: 4 },
309
405
  input: { flex: 1, marginLeft: 8, paddingVertical: 0 },
310
406
  effacer: { paddingHorizontal: 6 },
311
- vide: { paddingTop: 32, alignItems: 'center' },
407
+ vide: { paddingTop: 32, paddingHorizontal: 20, alignItems: 'center' },
312
408
  centre: { textAlign: 'center' },
313
- liste: { paddingBottom: 20 },
409
+ liste: { paddingHorizontal: 20, paddingTop: 12, paddingBottom: 20 },
410
+ titreRubrique: { fontWeight: '700', paddingHorizontal: 4, paddingBottom: 10 },
411
+ raccourcis: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
412
+ raccourci: { flexDirection: 'row', alignItems: 'center', paddingLeft: 12, paddingRight: 14, paddingVertical: 9, borderRadius: 999, borderWidth: 1 },
413
+ raccourciIcone: { width: 18, height: 18 },
414
+ raccourciTexte: { marginLeft: 8, fontWeight: '600' },
415
+ carte: { margin: 0 },
416
+ carteContenu: { padding: 6 },
417
+ ligne: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 8, paddingVertical: 10, borderRadius: 14 },
418
+ pastille: { width: 40, height: 40, borderRadius: 12, alignItems: 'center', justifyContent: 'center' },
419
+ pastilleIcone: { width: 20, height: 20 },
420
+ textes: { flex: 1, marginHorizontal: 14 },
421
+ titreLigne: { fontWeight: '500' },
422
+ gras: { fontWeight: '800' },
314
423
  });
@@ -5,7 +5,7 @@ import { useBloc, useBlocListener } from '../../../../../core/bloc_react';
5
5
  import { Di } from '../../../../../core/di';
6
6
  import { AppRouter, useAppRouter } from '../../../../../core/router';
7
7
  import { showModalBottomSheet } from '../../../../../shared/material/overlays';
8
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
8
+ import { Scaffold } from '../../../../../shared/material/scaffold';
9
9
  import { Frequence, FrequenceCommand } from '../../../../../shared/models/frequence_command';
10
10
  import { CustomLoadingDialog } from '../../../../../shared/widgets/loading_page';
11
11
  import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
@@ -25,6 +25,8 @@ import { TransactionSendPageError } from '../../../../transactions/presentation/
25
25
  import { TransactionSendPageSuccess } from '../../../../transactions/presentation/pages/transaction_send/transaction_send_page_succes';
26
26
  import { Subscription } from '../../../domain/models/subscription';
27
27
  import { SubscriptionCreatePageList } from './subscription_create_page_list';
28
+ import { useAppLocalizations } from '../../../../../l10n/localizations';
29
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
28
30
 
29
31
  /** Souscrire à un abonnement à partir d'un paiement passé (route `subscriptionSubscribe`) */
30
32
  export function SubscriptionCreatePage() {
@@ -92,7 +94,7 @@ export function SubscriptionCreatePage() {
92
94
  };
93
95
 
94
96
  return (
95
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
97
+ <Scaffold appBar={<ProfileAppBar titre={useAppLocalizations().subscriptionMenuSubscribeTitle} />}>
96
98
  <MyPageContainer>
97
99
  <View style={styles.flex}>
98
100
  <SubscriptionCreatePageList selectTransaction={selectTransaction} />
@@ -3,7 +3,7 @@ import { StyleSheet, Text, View } from 'react-native';
3
3
 
4
4
  import { BlocProvider, useCreateBloc } from '../../../../../core/bloc_react';
5
5
  import { Di } from '../../../../../core/di';
6
- import { useTheme } from '../../../../../core/theme';
6
+ import { Themer, useTheme } from '../../../../../core/theme';
7
7
  import { useAppLocalizations } from '../../../../../l10n/localizations';
8
8
  import { TransactionSens, type Transaction } from '../../../../transactions/domain/models/transaction';
9
9
  import { TransactionSearchCommand } from '../../../../transactions/domain/models/transaction_search/transaction_search_command';
@@ -33,11 +33,11 @@ export function SubscriptionCreatePageList({ selectTransaction }: { selectTransa
33
33
  return (
34
34
  <BlocProvider blocs={[searchBloc]}>
35
35
  <View style={styles.flex}>
36
- {/* Titre */}
37
- <Text style={theme.textTheme.titleSmall}>{traductions.subscriptionMenuSubscribeTitle}</Text>
36
+ {/* Sous-titre (titre dans la barre du haut) */}
38
37
  <View style={styles.gap8} />
39
- {/* Sous-titre */}
40
- <Text style={theme.textTheme.displaySmall}>{traductions.subscriptionMenuSubscribeSubtitle2}</Text>
38
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>
39
+ {traductions.subscriptionMenuSubscribeSubtitle2}
40
+ </Text>
41
41
  <View style={styles.gap16} />
42
42
  {/* Liste des transactions */}
43
43
  <TransactionSearchPageListe
@@ -3,7 +3,7 @@ import { ScrollView, StyleSheet, View } from 'react-native';
3
3
  import { Images } from '../../../../core/assets';
4
4
  import { AppRouter, useAppRouter } from '../../../../core/router';
5
5
  import { useAppLocalizations } from '../../../../l10n/localizations';
6
- import { SbSelectionOption, SelectionSheet } from '../../../../shared/widgets/selection';
6
+ import { SelectionOption, SelectionSheet } from '../../../../shared/widgets/selection';
7
7
 
8
8
  /** Menu de création : programmer un paiement ou souscrire à un abonnement (feuille du bas) */
9
9
  export function SubscriptionMenuWidget() {
@@ -20,7 +20,7 @@ export function SubscriptionMenuWidget() {
20
20
  contenu={
21
21
  <ScrollView bounces={false} contentContainerStyle={styles.content}>
22
22
  {/* Programmer */}
23
- <SbSelectionOption
23
+ <SelectionOption
24
24
  image={Images.homeFooterTransfer}
25
25
  titre={traductions.subscriptionMenuScheduleTitle}
26
26
  sousTitre={traductions.subscriptionMenuScheduleSubtitle}
@@ -28,7 +28,7 @@ export function SubscriptionMenuWidget() {
28
28
  />
29
29
  <View style={styles.gap10} />
30
30
  {/* Souscrire à un abonnement */}
31
- <SbSelectionOption
31
+ <SelectionOption
32
32
  image={Images.iconRepeat}
33
33
  titre={traductions.subscriptionMenuSubscribeTitle}
34
34
  sousTitre={traductions.subscriptionMenuSubscribeSubtitle}
@@ -26,8 +26,7 @@ export class TransactionSendCommandOthr {
26
26
 
27
27
  isValid(): boolean {
28
28
  const compte = this.compte();
29
- // `else if` ici : en Dart, l'erreur « vide » était aussitôt écrasée
30
- // (et un compte absent faisait planter le test de longueur).
29
+ // Un compte vide ou absent est refusé (« vide »), avant le test de longueur
31
30
  if (compte == null || compte.length === 0) {
32
31
  this.error = TransactionSendCommandOthrError.empty;
33
32
  } else if (compte.length > 34) {
@@ -125,6 +125,20 @@ export class TransactionSendBloc extends Bloc<TransactionSendEvent, TransactionS
125
125
  }
126
126
  this.state.participants = await this.participantInputPort.search();
127
127
  }
128
+ // Formulaire affiché : le solde vient d'arriver (récupéré après
129
+ // l'ouverture), on revalide le montant déjà rempli (formulaire
130
+ // prérempli depuis une transaction) pour afficher « solde
131
+ // insuffisant » et désactiver « Continuer ». Seul le montant est
132
+ // revalidé : un formulaire vierge ne doit pas afficher d'erreurs.
133
+ const current = this.state;
134
+ if (solde != null && current instanceof TransactionSendFormInputState && current.command.amount?.value != null) {
135
+ const form = current.command;
136
+ form.solde = current.solde ?? undefined;
137
+ form.amount!.solde = current.solde ?? undefined;
138
+ form.amount!.isValid();
139
+ emit(new TransactionSendFormInputState(form, this.data()));
140
+ return;
141
+ }
128
142
  this.emitUpdated(emit);
129
143
  } catch {
130
144
  // On garde l'état courant
@@ -169,6 +183,9 @@ export class TransactionSendBloc extends Bloc<TransactionSendEvent, TransactionS
169
183
  private onFormChanged(event: TransactionSendFormChangedEvent, emit: Emitter<TransactionSendState>) {
170
184
  const form = event.command;
171
185
  form.solde = this.state.solde ?? undefined;
186
+ // Le contrôle du solde se fait sur le montant : un montant prérempli
187
+ // (envoi depuis une transaction) n'a pas encore de solde
188
+ if (form.amount != null) form.amount.solde = form.solde;
172
189
  if (form.othr != null) {
173
190
  form.method = form.othr.isValidIban() ? TransactionSendMethod.iban : TransactionSendMethod.othr;
174
191
  }
@@ -1,20 +1,22 @@
1
- import { MaterialIcons } from '@expo/vector-icons';
2
- import { Pressable, View } from 'react-native';
1
+ import { StyleSheet, Text, View } from 'react-native';
3
2
 
4
3
  import { useBloc } from '../../../../../core/bloc_react';
5
4
  import { useAppRouter } from '../../../../../core/router';
6
- import { useTheme } from '../../../../../core/theme';
5
+ import { Themer, useTheme } from '../../../../../core/theme';
7
6
  import { useAppLocalizations } from '../../../../../l10n/localizations';
8
7
  import { DateFormat } from '../../../../../shared/utils/date_format';
9
- import { CustomTextInput } from '../../../../../shared/widgets/input_text';
10
8
  import { plageText, showSelectDate, showSelectDateRange } from '../../../../../shared/widgets/select_date_widget';
9
+ import { SelectionPastille, SelectionChamp } from '../../../../../shared/widgets/selection';
11
10
  import type { Transaction } from '../../../domain/models/transaction';
12
11
  import type { TransactionSendCommand } from '../../../domain/models/transaction_send/transaction_send_command';
13
12
  import { TransactionSendCommandScheduleError } from '../../../domain/models/transaction_send/transaction_send_command_schedule';
14
13
  import { TransactionSendBloc } from '../../bloc/transaction_send/transaction_send_bloc';
15
14
  import { TransactionSendScheduleEvent } from '../../bloc/transaction_send/transaction_send_event';
16
15
 
17
- /** Date (une fois) ou plage de dates (fréquence) de la programmation, à partir de demain. */
16
+ /**
17
+ * Date (une fois) ou plage de dates (fréquence) de la programmation, à
18
+ * partir de demain : carte qui ouvre le calendrier.
19
+ */
18
20
  export function TransactionSendFormInputDate({
19
21
  command,
20
22
  transaction,
@@ -32,7 +34,7 @@ export function TransactionSendFormInputDate({
32
34
  const schedule = command.schedule!;
33
35
  const withFrequence = schedule.frequence?.value != null;
34
36
 
35
- let text = '';
37
+ let text: string | null = null;
36
38
  if (schedule.dateDebut != null) {
37
39
  text = withFrequence ? plageText(traductions, formatter, schedule.dateDebut, schedule.dateFin) : formatter.format(schedule.dateDebut);
38
40
  }
@@ -68,17 +70,24 @@ export function TransactionSendFormInputDate({
68
70
  bloc.add(new TransactionSendScheduleEvent(command, transaction));
69
71
  };
70
72
 
73
+ const erreur = schedule.error === TransactionSendCommandScheduleError.debutEmpty ? traductions.aliasFormEmpty : '';
74
+
71
75
  return (
72
- <Pressable onPress={() => void select()}>
73
- <View pointerEvents="none">
74
- <CustomTextInput
75
- labelText={withFrequence ? traductions.transactionFormScheduleDateRangeLabel : traductions.transactionFormScheduleDateLabel}
76
- value={text}
77
- readOnly
78
- suffixIcon={<MaterialIcons name="date-range" size={24} color={theme.colorScheme.onSurface} />}
79
- messageError={schedule.error === TransactionSendCommandScheduleError.debutEmpty ? traductions.aliasFormEmpty : ''}
80
- />
81
- </View>
82
- </Pressable>
76
+ <View>
77
+ <SelectionChamp
78
+ libelle={withFrequence ? traductions.transactionFormScheduleDateRangeLabel : traductions.transactionFormScheduleDateLabel}
79
+ valeur={text}
80
+ pastille={<SelectionPastille icone={withFrequence ? 'date-range' : 'event'} />}
81
+ onPress={() => void select()}
82
+ />
83
+ {/* Message d'erreur */}
84
+ {erreur.length > 0 && (
85
+ <Text style={[theme.textTheme.displaySmall, styles.erreur, { color: Themer.systemErrorColor }]}>{erreur}</Text>
86
+ )}
87
+ </View>
83
88
  );
84
89
  }
90
+
91
+ const styles = StyleSheet.create({
92
+ erreur: { paddingHorizontal: 16, paddingTop: 4 },
93
+ });
@@ -5,10 +5,10 @@ import { useAppLocalizations } from '../../../../../l10n/localizations';
5
5
  import { showModalBottomSheet } from '../../../../../shared/material/overlays';
6
6
  import { UEMOACountry } from '../../../../../shared/models/uemoa_countries';
7
7
  import {
8
- SbSelectionLigne,
9
- SbSelectionListe,
10
- SbSelectionPastille,
11
- SbSelectionRecherche,
8
+ SelectionLigne,
9
+ SelectionListe,
10
+ SelectionPastille,
11
+ SelectionRecherche,
12
12
  selectionContient,
13
13
  SelectionChamp,
14
14
  SelectionSheet,
@@ -49,7 +49,7 @@ export function TransactionSendFormInputPays({
49
49
  <SelectionChamp
50
50
  libelle={traductions.transactionFormOthrPaysLabel}
51
51
  valeur={selected?.name}
52
- pastille={selected != null ? <SbSelectionPastille code={selected.iso3} /> : undefined}
52
+ pastille={selected != null ? <SelectionPastille code={selected.iso3} /> : undefined}
53
53
  onPress={() => void select()}
54
54
  />
55
55
  );
@@ -72,14 +72,14 @@ export function SelectPays({ selected }: { selected?: UEMOACountry }) {
72
72
  return (
73
73
  <SelectionSheet
74
74
  titre={traductions.transactionFormOthrPaysLabel}
75
- entete={<SbSelectionRecherche hintText={traductions.transactionFormOthrPaysRecherche} onChanged={setRecherche} />}
75
+ entete={<SelectionRecherche hintText={traductions.transactionFormOthrPaysRecherche} onChanged={setRecherche} />}
76
76
  contenu={
77
- <SbSelectionListe
77
+ <SelectionListe
78
78
  vide={traductions.transactionFormOthrPaysAucun}
79
79
  lignes={pays.map((p) => (
80
- <SbSelectionLigne
80
+ <SelectionLigne
81
81
  key={p.iso}
82
- pastille={<SbSelectionPastille code={p.iso3} choisie={p.iso === selected?.iso} />}
82
+ pastille={<SelectionPastille code={p.iso3} choisie={p.iso === selected?.iso} />}
83
83
  texte={p.name}
84
84
  choisie={p.iso === selected?.iso}
85
85
  onPress={() => AppRouter.pop(router, { value: p })}
@@ -5,10 +5,10 @@ import { AppRouter, useAppRouter } from '../../../../../core/router';
5
5
  import { useAppLocalizations } from '../../../../../l10n/localizations';
6
6
  import { showModalBottomSheet } from '../../../../../shared/material/overlays';
7
7
  import {
8
- SbSelectionLigne,
9
- SbSelectionListe,
10
- SbSelectionPastille,
11
- SbSelectionRecherche,
8
+ SelectionLigne,
9
+ SelectionListe,
10
+ SelectionPastille,
11
+ SelectionRecherche,
12
12
  selectionContient,
13
13
  SelectionChamp,
14
14
  SelectionSheet,
@@ -47,7 +47,7 @@ export function TransactionSendFormInputPsp({
47
47
  <SelectionChamp
48
48
  libelle={traductions.transactionFormOthrNomLabel}
49
49
  valeur={psp?.nomMembre}
50
- pastille={psp != null ? <SbSelectionPastille icone="account-balance" /> : undefined}
50
+ pastille={psp != null ? <SelectionPastille icone="account-balance" /> : undefined}
51
51
  onPress={() => void select()}
52
52
  />
53
53
  );
@@ -82,17 +82,17 @@ export function SelectPsp({
82
82
  return (
83
83
  <SelectionSheet
84
84
  titre={traductions.transactionFormOthrNomLabel}
85
- entete={<SbSelectionRecherche hintText={traductions.transactionFormOthrPspRecherche} onChanged={setRecherche} />}
85
+ entete={<SelectionRecherche hintText={traductions.transactionFormOthrPspRecherche} onChanged={setRecherche} />}
86
86
  contenu={
87
- <SbSelectionListe
87
+ <SelectionListe
88
88
  vide={traductions.transactionFormOthrPspAucune}
89
89
  lignes={psps.map((psp) => {
90
90
  const choisie = psp.codeMembre === selected?.codeMembre;
91
91
  const indisponible = !canSelectDisablePsp && psp.isDisable();
92
92
  return (
93
93
  <View key={psp.codeMembre} style={indisponible ? styles.indisponible : null}>
94
- <SbSelectionLigne
95
- pastille={<SbSelectionPastille icone="account-balance" choisie={choisie} />}
94
+ <SelectionLigne
95
+ pastille={<SelectionPastille icone="account-balance" choisie={choisie} />}
96
96
  texte={psp.nomMembre}
97
97
  detail={indisponible ? traductions.indisponible : undefined}
98
98
  choisie={choisie}
@@ -30,7 +30,7 @@ import {
30
30
  } from '../../bloc/transaction_send/transaction_send_state';
31
31
  import { TransactionSendPageError } from '../transaction_send/transaction_send_page_error';
32
32
  import { TransactionSendPageSuccess } from '../transaction_send/transaction_send_page_succes';
33
- import { TransactionFormPageAlias } from './transaction_form_page_alias';
33
+ import { pageTitle, TransactionFormPageAlias } from './transaction_form_page_alias';
34
34
  import { TransactionFormPageOthr } from './transaction_form_page_othr';
35
35
 
36
36
  export function showTransactionError(router: SdkRouter, error: string, method?: TransactionSendMethod | null) {
@@ -144,9 +144,27 @@ export function TransactionFormPage() {
144
144
  /** Barre du haut : le destinataire choisi parmi les contacts (nom, alias, photo) */
145
145
  function FormAppBar({ command: cmd, onBack: back }: { command: TransactionSendCommand; onBack: () => void }) {
146
146
  const theme = useTheme();
147
+ const traductions = useAppLocalizations();
147
148
  const contact = cmd.contact;
148
149
  // Destinataire choisi parmi les contacts : son nom, son alias et sa photo
149
- if (contact == null || cmd.method !== TransactionSendMethod.alias) return <AppBar onBack={back} />;
150
+ if (contact == null || cmd.method !== TransactionSendMethod.alias) {
151
+ // Titre de la page dans la barre du haut
152
+ const titre = [TransactionSendMethod.iban, TransactionSendMethod.othr].includes(cmd.method)
153
+ ? traductions.transactionsSendFormOthrTitle
154
+ : pageTitle(traductions, cmd);
155
+ return (
156
+ <AppBar
157
+ onBack={back}
158
+ title={
159
+ titre.length === 0 ? undefined : (
160
+ <Text numberOfLines={1} style={[theme.textTheme.headlineMedium, { color: theme.appBarTheme.foregroundColor }]}>
161
+ {titre}
162
+ </Text>
163
+ )
164
+ }
165
+ />
166
+ );
167
+ }
150
168
  return (
151
169
  <AppBar
152
170
  onBack={back}
@@ -72,16 +72,12 @@ export function TransactionFormPageAlias() {
72
72
  return (
73
73
  <View>
74
74
  {/* Titre de la page */}
75
- {cmd.contact == null && (
76
- <>
77
- <Text style={theme.textTheme.titleSmall}>{pageTitle(traductions, cmd)}</Text>
78
- <View style={styles.gap5} />
79
- </>
80
- )}
75
+ {/* Titre dans la barre du haut (voir pageTitle, utilisé par TransactionFormPage) */}
76
+ {cmd.contact == null && <View style={styles.gap8} />}
81
77
  {cmd.contact == null && cmd.method !== TransactionSendMethod.qrcode ? (
82
78
  <>
83
79
  {/* Sous-titre de la page */}
84
- <Text style={theme.textTheme.displaySmall}>{traductions.transactionsSendFormAliasSubtitle}</Text>
80
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.transactionsSendFormAliasSubtitle}</Text>
85
81
  <View style={showAmount ? styles.gap32 : styles.gap10} />
86
82
  {/* Alias */}
87
83
  <TransactionFormInputAlias
@@ -138,7 +134,8 @@ export function TransactionFormPageAlias() {
138
134
  );
139
135
  }
140
136
 
141
- function pageTitle(traductions: AppLocalizations, cmd: TransactionSendCommand): string {
137
+ /** Titre de la page, affiché dans la barre du haut par TransactionFormPage (vide pour un envoi à un contact) */
138
+ export function pageTitle(traductions: AppLocalizations, cmd: TransactionSendCommand): string {
142
139
  if (cmd.contact != null) return '';
143
140
  if (cmd.action === TransactionSendCommand.actionSendNow || cmd.action === TransactionSendCommand.actionSendSchedule) {
144
141
  if (cmd.method === TransactionSendMethod.qrcode) {
@@ -157,6 +154,7 @@ function pageTitle(traductions: AppLocalizations, cmd: TransactionSendCommand):
157
154
  }
158
155
 
159
156
  const styles = StyleSheet.create({
157
+ gap8: { height: 8 },
160
158
  gap5: { height: 5 },
161
159
  gap6: { height: 6 },
162
160
  gap10: { height: 10 },