@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
@@ -12,24 +12,31 @@ export function ContactSection({
12
12
  onSelect,
13
13
  selectedContacts,
14
14
  smallItem = false,
15
+ showActions = true,
15
16
  }: {
16
17
  group: ContactList;
17
18
  onSelect?: ContactSelectHandler;
18
19
  selectedContacts?: ContactPI[] | null;
19
20
  smallItem?: boolean;
21
+ /** Bouton « ⋯ » vers les actions sur l'alias de chaque contact */
22
+ showActions?: boolean;
20
23
  }) {
21
24
  const theme = useTheme();
22
25
  return (
23
26
  <View>
24
27
  {/* Section header */}
25
28
  <Text
26
- style={[smallItem ? theme.textTheme.displaySmall : theme.textTheme.displayLarge, { color: Themer.neural03Color }]}
29
+ style={[
30
+ smallItem ? theme.textTheme.displaySmall : theme.textTheme.displayMedium,
31
+ styles.header,
32
+ { color: Themer.neural03Color },
33
+ ]}
27
34
  >
28
35
  {group.header}
29
36
  </Text>
30
37
  <View style={styles.gap8} />
31
38
  {/* Contacts in the section */}
32
- <Card>
39
+ <Card style={styles.carte}>
33
40
  <View style={styles.padding}>
34
41
  {group.contacts.map((contact) => {
35
42
  const alias = ContactPI.getAlias(contact);
@@ -42,6 +49,7 @@ export function ContactSection({
42
49
  showCheckbox={selectedContacts != null}
43
50
  isSelected={isSelected}
44
51
  smallItem={smallItem}
52
+ showActions={showActions}
45
53
  />
46
54
  );
47
55
  })}
@@ -53,7 +61,9 @@ export function ContactSection({
53
61
  }
54
62
 
55
63
  const styles = StyleSheet.create({
56
- padding: { paddingHorizontal: 16 },
64
+ padding: { padding: 6 },
65
+ carte: { margin: 0 },
66
+ header: { fontWeight: '700', paddingHorizontal: 4 },
57
67
  gap8: { height: 8 },
58
68
  gap16: { height: 16 },
59
69
  });
@@ -1,18 +1,20 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
2
  import { useState } from 'react';
3
- import { Keyboard, Pressable, ScrollView, StyleSheet, Text, TextInput, useWindowDimensions, View } from 'react-native';
3
+ import { Keyboard, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';
4
4
 
5
5
  import { useBloc } from '../../../../core/bloc_react';
6
6
  import { AppRouter, useAppRouter } from '../../../../core/router';
7
7
  import { Themer, useTheme } from '../../../../core/theme';
8
8
  import { useAppLocalizations } from '../../../../l10n/localizations';
9
9
  import { ElevatedButton } from '../../../../shared/material/buttons';
10
- import { Card } from '../../../../shared/material/card';
11
- import { AppBar, Scaffold } from '../../../../shared/material/scaffold';
10
+ import { Scaffold } from '../../../../shared/material/scaffold';
12
11
  import { AliasPI } from '../../../../shared/models/alias_pi';
12
+ import { withAlpha } from '../../../../shared/utils/color';
13
13
  import { CircleAvatarWidget } from '../../../../shared/widgets/circle_avatar_widget';
14
14
  import { CustomSnackBar } from '../../../../shared/widgets/custom_snack_bar';
15
15
  import { MyPageContainer } from '../../../../shared/widgets/my_page_container';
16
+ import { SelectionBoutons } from '../../../../shared/widgets/selection';
17
+ import { ProfileAppBar } from '../../../profile/presentation/pages/profile_app_bar';
16
18
  import { ContactPI } from '../../domain/contact_pi';
17
19
  import type { PhoneContact } from '../../domain/phone_contact';
18
20
  import { ContactBloc } from '../bloc/contact_bloc';
@@ -36,7 +38,6 @@ export function ContactSelectPage({ onContinue, title, minSelected, maxSelected,
36
38
  const traductions = useAppLocalizations();
37
39
  const theme = useTheme();
38
40
  const router = useAppRouter();
39
- const window = useWindowDimensions();
40
41
  const contactBloc = useBloc(ContactBloc);
41
42
  const [selectedContacts, setSelectedContacts] = useState<ContactPI[]>([]);
42
43
  const [searchHasFocus, setSearchHasFocus] = useState(false);
@@ -96,16 +97,28 @@ export function ContactSelectPage({ onContinue, title, minSelected, maxSelected,
96
97
 
97
98
  const canContinue = selectedContacts.length >= (minSelected ?? 1);
98
99
 
100
+ const primaire = theme.colorScheme.primary;
101
+
99
102
  return (
100
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
101
- <MyPageContainer>
102
- <Text style={theme.textTheme.titleSmall}>{title ?? traductions.transactionSplitTitle}</Text>
103
- <View style={styles.gap10} />
104
- {/* Recherche */}
105
- <Card>
106
- <View style={[styles.search, { backgroundColor: theme.inputDecorationTheme.fillColor }]}>
107
- <MaterialIcons name="search" size={24} color={Themer.neural03Color} />
103
+ // Titre dans la barre, comme dans le profil
104
+ <Scaffold appBar={<ProfileAppBar titre={title ?? traductions.transactionSplitTitle} />}>
105
+ <View style={styles.flex}>
106
+ <MyPageContainer>
107
+ <View style={styles.gap8} />
108
+ {/* Recherche : contour de la couleur principale quand elle a le focus */}
109
+ <View
110
+ style={[
111
+ styles.search,
112
+ {
113
+ backgroundColor: theme.cardColor,
114
+ borderColor: searchHasFocus ? primaire : withAlpha(Themer.neural03Color, 0.2),
115
+ borderWidth: searchHasFocus ? 1.5 : 1,
116
+ },
117
+ ]}
118
+ >
119
+ <MaterialIcons name="search" size={22} color={searchHasFocus ? primaire : Themer.neural03Color} />
108
120
  <TextInput
121
+ value={searchKeyword ?? ''}
109
122
  style={[theme.textTheme.displayLarge, styles.searchInput]}
110
123
  placeholder={traductions.transactionsSendInputHint}
111
124
  placeholderTextColor={Themer.neural03Color}
@@ -116,79 +129,98 @@ export function ContactSelectPage({ onContinue, title, minSelected, maxSelected,
116
129
  setSearchKeyword(value.length > 0 ? value : null);
117
130
  }}
118
131
  />
132
+ {(searchKeyword ?? '').length > 0 && (
133
+ <Pressable
134
+ accessibilityRole="button"
135
+ hitSlop={8}
136
+ style={styles.effacer}
137
+ onPress={() => {
138
+ contactBloc.add(new ContactSearchEvent(''));
139
+ setSearchKeyword(null);
140
+ }}
141
+ >
142
+ <MaterialIcons name="close" size={18} color={Themer.neural03Color} />
143
+ </Pressable>
144
+ )}
145
+ </View>
146
+ {/* Contacts sélectionnés : rangée d'avatars sur un fond léger */}
147
+ {hasSelection && (
148
+ <ScrollView
149
+ horizontal
150
+ showsHorizontalScrollIndicator={false}
151
+ style={[styles.selected, { backgroundColor: withAlpha(primaire, 0.06) }]}
152
+ contentContainerStyle={styles.selectedList}
153
+ >
154
+ {selectedContacts.map((contact) => (
155
+ <View key={contact.alias ?? contact.name} style={styles.chip}>
156
+ <View>
157
+ <CircleAvatarWidget nom={contact.name} rounded radius={44} />
158
+ <Pressable
159
+ accessibilityRole="button"
160
+ hitSlop={8}
161
+ onPress={() => removeContact(contact.alias!)}
162
+ style={[styles.remove, { backgroundColor: theme.colorScheme.error, borderColor: theme.colorScheme.surface }]}
163
+ >
164
+ <MaterialIcons name="close" size={12} color="white" />
165
+ </Pressable>
166
+ </View>
167
+ <View style={styles.gap4} />
168
+ <Text numberOfLines={1} style={[theme.textTheme.displaySmall, styles.chipName]}>
169
+ {contact.name}
170
+ </Text>
171
+ </View>
172
+ ))}
173
+ </ScrollView>
174
+ )}
175
+ <View style={styles.gap12} />
176
+ {/* Liste des contacts */}
177
+ <View style={styles.flex}>
178
+ <ContactAliasListWidget
179
+ hideTitle
180
+ expanded
181
+ selectedContacts={selectedContacts}
182
+ onSelect={(contact, alias, isSelected) => void handleContactSelected(contact, alias, isSelected)}
183
+ searchKeyword={searchKeyword}
184
+ />
119
185
  </View>
120
- </Card>
121
- <View style={styles.gap10} />
122
- {/* Contacts sélectionnés */}
186
+ </MyPageContainer>
187
+ {/* Continuer (avec le nombre de contacts choisis), fixé en bas */}
123
188
  {hasSelection && (
124
- <>
125
- <View style={{ height: window.height * 0.12 }}>
126
- <Card style={styles.selectedCard}>
127
- <ScrollView horizontal contentContainerStyle={styles.selectedList} showsHorizontalScrollIndicator={false}>
128
- {selectedContacts.map((contact) => (
129
- <View key={contact.alias ?? contact.name} style={styles.chip}>
130
- <View>
131
- <CircleAvatarWidget nom={contact.name} rounded radius={32} />
132
- <Pressable
133
- accessibilityRole="button"
134
- hitSlop={8}
135
- onPress={() => removeContact(contact.alias!)}
136
- style={[styles.remove, { backgroundColor: theme.colorScheme.error, borderColor: theme.colorScheme.surface }]}
137
- >
138
- <MaterialIcons name="close" size={12} color="white" />
139
- </Pressable>
140
- </View>
141
- <View style={styles.gap6} />
142
- <Text numberOfLines={1} style={[theme.textTheme.bodySmall, styles.chipName]}>
143
- {contact.name}
144
- </Text>
145
- </View>
146
- ))}
147
- </ScrollView>
148
- </Card>
149
- </View>
150
- <View style={styles.gap10} />
151
- </>
152
- )}
153
- {/* Liste des contacts */}
154
- <View style={styles.flex}>
155
- <ContactAliasListWidget
156
- hideTitle
157
- expanded
158
- selectedContacts={selectedContacts}
159
- onSelect={(contact, alias, isSelected) => void handleContactSelected(contact, alias, isSelected)}
160
- searchKeyword={searchKeyword}
189
+ <SelectionBoutons
190
+ boutons={[
191
+ <ElevatedButton
192
+ key="continuer"
193
+ onPress={
194
+ canContinue
195
+ ? () => {
196
+ Keyboard.dismiss();
197
+ onContinue(selectedContacts);
198
+ }
199
+ : undefined
200
+ }
201
+ >
202
+ {traductions.contactSelectBtnContinue(String(selectedContacts.length))}
203
+ </ElevatedButton>,
204
+ ]}
161
205
  />
162
- </View>
163
- {hasSelection && (
164
- <ElevatedButton
165
- onPress={
166
- canContinue
167
- ? () => {
168
- Keyboard.dismiss();
169
- onContinue(selectedContacts);
170
- }
171
- : undefined
172
- }
173
- >
174
- {traductions.btnTextContinue}
175
- </ElevatedButton>
176
206
  )}
177
- </MyPageContainer>
207
+ </View>
178
208
  </Scaffold>
179
209
  );
180
210
  }
181
211
 
182
212
  const styles = StyleSheet.create({
183
213
  flex: { flex: 1 },
184
- gap6: { height: 6 },
185
- gap10: { height: 10 },
186
- search: { height: 36, flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12 },
214
+ gap4: { height: 4 },
215
+ gap8: { height: 8 },
216
+ gap12: { height: 12 },
217
+ search: { height: 48, borderRadius: 14, flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12 },
187
218
  searchInput: { flex: 1, marginLeft: 8, paddingVertical: 0 },
188
- selectedCard: { flex: 1, marginHorizontal: 8, borderRadius: 16, elevation: 1 },
189
- selectedList: { padding: 8, alignItems: 'center' },
190
- chip: { alignItems: 'center', marginRight: 12 },
191
- chipName: { width: 70, textAlign: 'center', fontWeight: '500' },
219
+ effacer: { paddingHorizontal: 4 },
220
+ selected: { flexGrow: 0, marginTop: 12, borderRadius: 16 },
221
+ selectedList: { paddingHorizontal: 12, paddingVertical: 10, alignItems: 'center' },
222
+ chip: { width: 56, alignItems: 'center', marginRight: 14 },
223
+ chipName: { width: 56, textAlign: 'center', fontWeight: '500' },
192
224
  remove: {
193
225
  position: 'absolute',
194
226
  right: -4,
@@ -1,18 +1,22 @@
1
+ import { MaterialIcons } from '@expo/vector-icons';
1
2
  import { useReducer, useState } from 'react';
2
3
  import { Keyboard, ScrollView, StyleSheet, Text, View } from 'react-native';
3
4
 
4
5
  import { useBloc, useBlocBuilder, useBlocListener, useCreateBloc } from '../../../../../core/bloc_react';
5
6
  import { AppRouter, useAppRouter } from '../../../../../core/router';
6
- import { useTheme } from '../../../../../core/theme';
7
+ import { Themer, useTheme } from '../../../../../core/theme';
7
8
  import type { AppLocalizations } from '../../../../../l10n/app_localizations';
8
9
  import { useAppLocalizations } from '../../../../../l10n/localizations';
9
10
  import { ElevatedButton } from '../../../../../shared/material/buttons';
10
- import { AppBar, Scaffold } from '../../../../../shared/material/scaffold';
11
+ import { Scaffold } from '../../../../../shared/material/scaffold';
11
12
  import { AliasPI } from '../../../../../shared/models/alias_pi';
13
+ import { withAlpha } from '../../../../../shared/utils/color';
14
+ import { CircleAvatarWidget } from '../../../../../shared/widgets/circle_avatar_widget';
12
15
  import { InputAliasWidget } from '../../../../../shared/widgets/input_alias_widget';
13
16
  import { CustomTextInput } from '../../../../../shared/widgets/input_text';
14
17
  import { CustomLoadingDialog } from '../../../../../shared/widgets/loading_page';
15
- import { MyPageContainer } from '../../../../../shared/widgets/my_page_container';
18
+ import { SelectionBoutons } from '../../../../../shared/widgets/selection';
19
+ import { ProfileAppBar } from '../../../../profile/presentation/pages/profile_app_bar';
16
20
  import { ContactPI } from '../../../domain/contact_pi';
17
21
  import { contactIdOf, type PhoneContact } from '../../../domain/phone_contact';
18
22
  import { ContactBloc } from '../../bloc/contact_bloc';
@@ -87,28 +91,54 @@ export function ContactCreatePage({ contact: phoneContact, contactAlias, mbnoFor
87
91
  !(s instanceof ContactCreateLoadingState) && contact.name.length > 0 && aliasCommand.isValid();
88
92
  const valid = isFormValid(state);
89
93
 
94
+ const nom = contact.name.trim();
95
+ const primaire = theme.colorScheme.primary;
96
+
90
97
  return (
91
- <Scaffold appBar={<AppBar onBack={() => AppRouter.pop(router)} />}>
92
- <MyPageContainer>
93
- <ScrollView style={styles.flex} keyboardShouldPersistTaps="handled">
94
- {/* Titre de la page */}
95
- <Text style={theme.textTheme.titleSmall}>{title(traductions, phoneContact, contactAlias)}</Text>
96
- <View style={styles.gap5} />
97
- {/* Sous titre de la page */}
98
- <Text style={theme.textTheme.displaySmall}>{subtitle(traductions, phoneContact, contactAlias)}</Text>
99
- <View style={styles.gap32} />
100
- {/* Champ Nom du contact */}
101
- <CustomTextInput
102
- readOnly={phoneContact != null}
103
- defaultValue={contact.name}
104
- labelText={traductions.contactCreateNameLabel}
105
- messageError={contact.name.length === 0 ? traductions.contactCreateNameErrorEmpty : ''}
106
- onChange={(value) => {
107
- contact.name = value;
108
- rebuild();
109
- }}
110
- />
111
- <View style={styles.gap16} />
98
+ // Titre dans la barre, comme dans le profil
99
+ <Scaffold appBar={<ProfileAppBar titre={title(traductions, phoneContact, contactAlias)} />}>
100
+ <View style={styles.flex}>
101
+ <ScrollView style={styles.flex} contentContainerStyle={styles.content} keyboardShouldPersistTaps="handled">
102
+ {/* Avatar (photo ou initiales du nom saisi), nom en modification, sous-titre */}
103
+ <View style={styles.entete}>
104
+ {nom.length === 0 ? (
105
+ <View style={[styles.pastille, { backgroundColor: withAlpha(primaire, 0.12) }]}>
106
+ <MaterialIcons name="person-add-alt-1" size={32} color={primaire} />
107
+ </View>
108
+ ) : (
109
+ <CircleAvatarWidget nom={nom} photo={phoneContact?.photo} rounded radius={72} />
110
+ )}
111
+ {phoneContact != null && nom.length > 0 ? (
112
+ <>
113
+ <View style={styles.gap12} />
114
+ <Text numberOfLines={2} style={[theme.textTheme.headlineSmall, styles.centre, styles.nom]}>
115
+ {nom}
116
+ </Text>
117
+ <View style={styles.gap4} />
118
+ </>
119
+ ) : (
120
+ <View style={styles.gap12} />
121
+ )}
122
+ <Text style={[theme.textTheme.displaySmall, styles.centre, { color: Themer.neural03Color }]}>
123
+ {subtitle(traductions, phoneContact, contactAlias)}
124
+ </Text>
125
+ </View>
126
+ <View style={styles.gap28} />
127
+ {/* Champ Nom du contact (création seulement ; en modification, le nom est sous l'avatar) */}
128
+ {phoneContact == null && (
129
+ <>
130
+ <CustomTextInput
131
+ defaultValue={contact.name}
132
+ labelText={traductions.contactCreateNameLabel}
133
+ messageError={contact.name.length === 0 ? traductions.contactCreateNameErrorEmpty : ''}
134
+ onChange={(value) => {
135
+ contact.name = value;
136
+ rebuild();
137
+ }}
138
+ />
139
+ <View style={styles.gap16} />
140
+ </>
141
+ )}
112
142
  {/* Champ Alias */}
113
143
  <InputAliasWidget
114
144
  command={aliasCommand}
@@ -118,26 +148,30 @@ export function ContactCreatePage({ contact: phoneContact, contactAlias, mbnoFor
118
148
  }}
119
149
  />
120
150
  </ScrollView>
121
- <View style={styles.bottom}>
122
- <ElevatedButton
123
- onPress={
124
- valid
125
- ? () => {
126
- Keyboard.dismiss();
127
- contactBloc.add(
128
- new ContactCreateSubmitEvent(contact, {
129
- contactId: phoneContact != null ? contactIdOf(phoneContact) : null,
130
- contactOldAlias: contactAlias,
131
- }),
132
- );
133
- }
134
- : undefined
135
- }
136
- >
137
- {traductions.contactBtnSave}
138
- </ElevatedButton>
139
- </View>
140
- </MyPageContainer>
151
+ {/* Enregistrer, fixé en bas */}
152
+ <SelectionBoutons
153
+ boutons={[
154
+ <ElevatedButton
155
+ key="enregistrer"
156
+ onPress={
157
+ valid
158
+ ? () => {
159
+ Keyboard.dismiss();
160
+ contactBloc.add(
161
+ new ContactCreateSubmitEvent(contact, {
162
+ contactId: phoneContact != null ? contactIdOf(phoneContact) : null,
163
+ contactOldAlias: contactAlias,
164
+ }),
165
+ );
166
+ }
167
+ : undefined
168
+ }
169
+ >
170
+ {traductions.contactBtnSave}
171
+ </ElevatedButton>,
172
+ ]}
173
+ />
174
+ </View>
141
175
  </Scaffold>
142
176
  );
143
177
  }
@@ -156,8 +190,13 @@ function subtitle(traductions: AppLocalizations, contact?: PhoneContact | null,
156
190
 
157
191
  const styles = StyleSheet.create({
158
192
  flex: { flex: 1 },
159
- gap5: { height: 5 },
193
+ content: { paddingHorizontal: 20, paddingTop: 8, paddingBottom: 16 },
194
+ entete: { alignItems: 'center' },
195
+ pastille: { width: 72, height: 72, borderRadius: 36, alignItems: 'center', justifyContent: 'center' },
196
+ centre: { textAlign: 'center' },
197
+ nom: { fontWeight: '600' },
198
+ gap4: { height: 4 },
199
+ gap12: { height: 12 },
160
200
  gap16: { height: 16 },
161
- gap32: { height: 32 },
162
- bottom: { paddingVertical: 16 },
201
+ gap28: { height: 28 },
163
202
  });
@@ -26,6 +26,7 @@ import { ContactListEvent } from '../../../contacts/presentation/bloc/contact_ev
26
26
  import { ParametreHideAmountBloc } from '../../../profile/presentation/bloc/hide_amount/hide_amount_bloc';
27
27
  import { ParametreHideAmountInitEvent } from '../../../profile/presentation/bloc/hide_amount/hide_amount_event';
28
28
  import type { Fonctionnalite } from '../../../search/domain/models/fonctionnalite';
29
+ import { SearchBtnWidget } from '../../../search/presentation/pages/search_btn_widget';
29
30
  import { fonctionnalitesRecherchables } from '../../../search/presentation/pages/search_fonctionnalites';
30
31
  import { TransactionSendBloc } from '../../../transactions/presentation/bloc/transaction_send/transaction_send_bloc';
31
32
  import { TransactionSendUpdateStateEvent } from '../../../transactions/presentation/bloc/transaction_send/transaction_send_event';
@@ -108,15 +109,7 @@ export function HomePage({ selectedTab }: { selectedTab?: number }) {
108
109
  <HomeToolbarLeading user={Di.config.user} enabled={hasAlias} />
109
110
  <View style={styles.actions}>
110
111
  {/* Recherche dans les fonctionnalités (grisé si le compte actif n'a pas d'alias) */}
111
- <Pressable
112
- accessibilityRole="button"
113
- accessibilityLabel={traductions.searchTitle}
114
- disabled={!hasAlias}
115
- onPress={() => void ouvrirRecherche()}
116
- style={[styles.action, { opacity: hasAlias ? 1 : 0.38 }]}
117
- >
118
- <MaterialIcons name="search" size={24} color={theme.appBarTheme.foregroundColor} />
119
- </Pressable>
112
+ <SearchBtnWidget onPress={hasAlias ? () => void ouvrirRecherche() : undefined} />
120
113
  {/* Notifications (grisé si le compte actif n'a pas d'alias) */}
121
114
  <NotificationBtnOpenWidget enabled={hasAlias} />
122
115
  </View>
@@ -10,6 +10,7 @@ import {
10
10
  import { SafeAreaView } from 'react-native-safe-area-context';
11
11
 
12
12
  import { Themer } from '../../../../core/theme';
13
+ import { TextButton } from '../../../../shared/material/buttons';
13
14
  import type { SupportedLocaleCode } from '../../../../l10n/app_localizations';
14
15
  import { useAppLocalizations } from '../../../../l10n/localizations';
15
16
  import { IntroductionItem } from './introduction_item';
@@ -104,10 +105,17 @@ export function IntroductionPage() {
104
105
  />
105
106
  )}
106
107
  />
108
+ {/* Passer : directement au dernier écran */}
109
+ {currentPage < nbItems - 1 && (
110
+ <TextButton style={styles.passer} textStyle={{ color: Themer.whiteColor }} onPress={() => goTo(nbItems - 1)}>
111
+ {localizations.introductionPasser}
112
+ </TextButton>
113
+ )}
107
114
  </SafeAreaView>
108
115
  );
109
116
  }
110
117
 
111
118
  const styles = StyleSheet.create({
112
119
  page: { flex: 1, backgroundColor: Themer.brownColor },
120
+ passer: { position: 'absolute', top: 40, right: 8 },
113
121
  });
@@ -1,8 +1,5 @@
1
- import { StyleSheet, Text, View } from 'react-native';
2
-
3
1
  import { useBloc } from '../../../../core/bloc_react';
4
2
  import { AppRouter, useAppRouter } from '../../../../core/router';
5
- import { Themer, useTheme } from '../../../../core/theme';
6
3
  import type { AppLocalizations } from '../../../../l10n/app_localizations';
7
4
  import { ElevatedButton } from '../../../../shared/material/buttons';
8
5
  import { ConfigBloc } from '../../../config/adapters/ui/bloc/config_bloc';
@@ -10,48 +7,31 @@ import { ConfigChangeEvent } from '../../../config/adapters/ui/bloc/config_event
10
7
  import { ConfigKey } from '../../../config/domain/models/config_keys';
11
8
  import type { IntroductionItem } from './introduction_item';
12
9
 
10
+ /**
11
+ * Pied de chaque écran de l'introduction : « Continuer », toujours visible,
12
+ * pour ne pas obliger à faire défiler toutes les vidéos.
13
+ */
13
14
  export function IntroductionFooter({
14
- item,
15
- pageSize,
16
15
  traductions,
17
16
  }: {
18
17
  item: IntroductionItem;
19
18
  pageSize: number;
20
19
  traductions: AppLocalizations;
21
20
  }) {
22
- const theme = useTheme();
23
21
  const router = useAppRouter();
24
22
  const configBloc = useBloc(ConfigBloc);
25
-
26
- if (item.position === pageSize - 1) {
27
- return (
28
- <ElevatedButton
29
- style={styles.button}
30
- onPress={() => {
31
- configBloc.add(new ConfigChangeEvent(ConfigKey.introductionPassed, '1'));
32
- // Contrairement à l'app de référence (qui enchaîne sur la
33
- // connexion/session), le SDK n'a pas de login : l'utilisateur est
34
- // déjà authentifié par l'hôte, donc on enchaîne directement sur
35
- // la demande de permission contacts.
36
- AppRouter.pushReplacement(router, AppRouter.permissions);
37
- }}
38
- >
39
- <Text style={[theme.textTheme.titleSmall, styles.center]}>{traductions.btnTextContinue}</Text>
40
- </ElevatedButton>
41
- );
42
- }
43
23
  return (
44
- <View style={styles.column}>
45
- <Text style={[theme.textTheme.bodyLarge, { color: Themer.whiteColor }]}>{traductions.introductionFooterTitle}</Text>
46
- <View style={styles.gap5} />
47
- <Text style={[theme.textTheme.bodyLarge, { color: Themer.amberColor }]}>{traductions.introductionFooterSubtitle}</Text>
48
- </View>
24
+ <ElevatedButton
25
+ onPress={() => {
26
+ configBloc.add(new ConfigChangeEvent(ConfigKey.introductionPassed, '1'));
27
+ // Contrairement à l'app de référence (qui enchaîne sur la
28
+ // connexion/session), le SDK n'a pas de login : l'utilisateur est
29
+ // déjà authentifié par l'hôte, donc on enchaîne directement sur
30
+ // la demande de permission contacts.
31
+ AppRouter.pushReplacement(router, AppRouter.permissions);
32
+ }}
33
+ >
34
+ {traductions.btnTextContinue}
35
+ </ElevatedButton>
49
36
  );
50
37
  }
51
-
52
- const styles = StyleSheet.create({
53
- button: { minHeight: 60 },
54
- center: { textAlign: 'center' },
55
- column: { alignItems: 'center', justifyContent: 'center' },
56
- gap5: { height: 5 },
57
- });
@@ -47,18 +47,30 @@ export function IntroductionPageItem({
47
47
  }
48
48
  }, [active, videoPlayer]);
49
49
 
50
+ // Appui long : la vidéo se met en pause, et reprend au relâchement
51
+ const [enPause, setEnPause] = useState(false);
52
+ const pause = () => {
53
+ setEnPause(true);
54
+ videoPlayer.pause();
55
+ };
56
+ const reprendre = () => {
57
+ if (!enPause) return;
58
+ setEnPause(false);
59
+ if (active) videoPlayer.play();
60
+ };
61
+
50
62
  return (
51
63
  <View style={{ width }}>
52
64
  {/* Zones cliquables invisibles sur les côtés, sous le contenu : les
53
65
  touches qui ne tombent pas sur le contenu (ex. bouton Continuer)
54
66
  les atteignent, et le glissement horizontal reste possible. */}
55
67
  <View style={[StyleSheet.absoluteFill, styles.row]}>
56
- {/* Zone gauche (25%) */}
57
- <Pressable style={styles.side} onPress={onPrevious} />
58
- {/* Zone centrale (50% - non cliquable) */}
59
- <View style={styles.middle} />
68
+ {/* Zone gauche (25%) ; appui long n'importe où : pause de la vidéo */}
69
+ <Pressable style={styles.side} onPress={onPrevious} onLongPress={pause} onPressOut={reprendre} />
70
+ {/* Zone centrale (50%) : seulement la pause à l'appui long */}
71
+ <Pressable style={styles.middle} onLongPress={pause} onPressOut={reprendre} />
60
72
  {/* Zone droite (25%) */}
61
- <Pressable style={styles.side} onPress={onNext} />
73
+ <Pressable style={styles.side} onPress={onNext} onLongPress={pause} onPressOut={reprendre} />
62
74
  </View>
63
75
  <View style={styles.page} pointerEvents="box-none">
64
76
  {/* barre de progression */}
@@ -82,7 +82,7 @@ export function ProfileParametrePageNotifications() {
82
82
  <ProfileMenuTile
83
83
  key="notifications"
84
84
  image={Images.iconsCloche}
85
- titre={traductions.notificationPageTitle}
85
+ titre={traductions.appSettingPageMenuNotificationSonActiveTitle}
86
86
  onPress={basculerNotifications}
87
87
  trailing={<SwitchThemed value={enabled} onChange={basculerNotifications} />}
88
88
  />,
@@ -144,7 +144,7 @@ export function ProfileParametrePageNotifications() {
144
144
  <ProfileMenuTile
145
145
  key="son"
146
146
  image={Images.iconsCloche}
147
- titre={traductions.notificationPageTitle}
147
+ titre={traductions.appSettingPageMenuNotificationSonActiveTitle}
148
148
  sousTitre={sonEnabled ? traductions.statutActive : traductions.statutDesactive}
149
149
  onPress={() => void AppRouter.push(router, AppRouter.profileParametreNotificationsSon)}
150
150
  />,
@@ -71,7 +71,7 @@ export function ProfileParametrePageNotificationsSon() {
71
71
  <ProfileMenuTile
72
72
  key="son"
73
73
  image={Images.iconsCloche}
74
- titre={traductions.notificationPageTitle}
74
+ titre={traductions.appSettingPageMenuNotificationSonActiveTitle}
75
75
  onPress={basculer}
76
76
  trailing={<SwitchThemed value={enabled} onChange={basculer} />}
77
77
  />,