@pi-spi/app 2.0.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 (389) hide show
  1. package/lib/module/core/api.js +14 -5
  2. package/lib/module/core/api.js.map +1 -1
  3. package/lib/module/l10n/app_localizations.js.map +1 -1
  4. package/lib/module/l10n/app_localizations_en.js +40 -8
  5. package/lib/module/l10n/app_localizations_en.js.map +1 -1
  6. package/lib/module/l10n/app_localizations_fr.js +49 -14
  7. package/lib/module/l10n/app_localizations_fr.js.map +1 -1
  8. package/lib/module/l10n/app_localizations_pt.js +41 -7
  9. package/lib/module/l10n/app_localizations_pt.js.map +1 -1
  10. package/lib/module/modules/alias/domain/models/alias_revendication.js +4 -2
  11. package/lib/module/modules/alias/domain/models/alias_revendication.js.map +1 -1
  12. package/lib/module/modules/alias/infra/alias_output_local.js +11 -0
  13. package/lib/module/modules/alias/infra/alias_output_local.js.map +1 -1
  14. package/lib/module/modules/alias/infra/alias_output_repository.js +9 -8
  15. package/lib/module/modules/alias/infra/alias_output_repository.js.map +1 -1
  16. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js +14 -18
  17. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js.map +1 -1
  18. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js +113 -60
  19. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js.map +1 -1
  20. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_form.js +151 -76
  21. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_form.js.map +1 -1
  22. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_timer.js +38 -24
  23. package/lib/module/modules/alias/presentation/pages/alias_page_create_mbno_timer.js.map +1 -1
  24. package/lib/module/modules/alias/presentation/pages/alias_page_create_options.js +28 -26
  25. package/lib/module/modules/alias/presentation/pages/alias_page_create_options.js.map +1 -1
  26. package/lib/module/modules/alias/presentation/pages/alias_page_otp.js +27 -110
  27. package/lib/module/modules/alias/presentation/pages/alias_page_otp.js.map +1 -1
  28. package/lib/module/modules/categorie/domain/services/categorie_service.js +2 -1
  29. package/lib/module/modules/categorie/domain/services/categorie_service.js.map +1 -1
  30. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js +58 -72
  31. package/lib/module/modules/categorie/presentation/pages/categorie_edit_icon_btn.js.map +1 -1
  32. package/lib/module/modules/categorie/presentation/pages/categorie_form_pages.js +88 -80
  33. package/lib/module/modules/categorie/presentation/pages/categorie_form_pages.js.map +1 -1
  34. package/lib/module/modules/categorie/presentation/pages/categorie_icon.js +39 -0
  35. package/lib/module/modules/categorie/presentation/pages/categorie_icon.js.map +1 -1
  36. package/lib/module/modules/categorie/presentation/pages/categorie_liste_widget.js +55 -27
  37. package/lib/module/modules/categorie/presentation/pages/categorie_liste_widget.js.map +1 -1
  38. package/lib/module/modules/categorie/presentation/pages/categorie_select_page.js +21 -81
  39. package/lib/module/modules/categorie/presentation/pages/categorie_select_page.js.map +1 -1
  40. package/lib/module/modules/categorie/presentation/pages/categorie_select_widget.js +53 -16
  41. package/lib/module/modules/categorie/presentation/pages/categorie_select_widget.js.map +1 -1
  42. package/lib/module/modules/config/domain/models/config_keys.js +2 -0
  43. package/lib/module/modules/config/domain/models/config_keys.js.map +1 -1
  44. package/lib/module/modules/contacts/domain/contact_pi.js +3 -5
  45. package/lib/module/modules/contacts/domain/contact_pi.js.map +1 -1
  46. package/lib/module/modules/contacts/presentation/bloc/contact_bloc.js +30 -14
  47. package/lib/module/modules/contacts/presentation/bloc/contact_bloc.js.map +1 -1
  48. package/lib/module/modules/contacts/presentation/pages/contact_actions_sheet.js +106 -0
  49. package/lib/module/modules/contacts/presentation/pages/contact_actions_sheet.js.map +1 -0
  50. package/lib/module/modules/contacts/presentation/pages/contact_list_alias_widget.js +17 -7
  51. package/lib/module/modules/contacts/presentation/pages/contact_list_alias_widget.js.map +1 -1
  52. package/lib/module/modules/contacts/presentation/pages/contact_list_phone_widget.js +5 -4
  53. package/lib/module/modules/contacts/presentation/pages/contact_list_phone_widget.js.map +1 -1
  54. package/lib/module/modules/contacts/presentation/pages/contact_list_widget_item.js +76 -67
  55. package/lib/module/modules/contacts/presentation/pages/contact_list_widget_item.js.map +1 -1
  56. package/lib/module/modules/contacts/presentation/pages/contact_section.js +14 -4
  57. package/lib/module/modules/contacts/presentation/pages/contact_section.js.map +1 -1
  58. package/lib/module/modules/contacts/presentation/pages/contact_select_page.js +131 -110
  59. package/lib/module/modules/contacts/presentation/pages/contact_select_page.js.map +1 -1
  60. package/lib/module/modules/contacts/presentation/pages/create/contact_create_page.js +118 -59
  61. package/lib/module/modules/contacts/presentation/pages/create/contact_create_page.js.map +1 -1
  62. package/lib/module/modules/home/presentation/pages/home_page.js +3 -13
  63. package/lib/module/modules/home/presentation/pages/home_page.js.map +1 -1
  64. package/lib/module/modules/introduction/presentation/pages/introduction.js +17 -4
  65. package/lib/module/modules/introduction/presentation/pages/introduction.js.map +1 -1
  66. package/lib/module/modules/introduction/presentation/pages/introduction_footer.js +15 -53
  67. package/lib/module/modules/introduction/presentation/pages/introduction_footer.js.map +1 -1
  68. package/lib/module/modules/introduction/presentation/pages/introduction_page.js +22 -4
  69. package/lib/module/modules/introduction/presentation/pages/introduction_page.js.map +1 -1
  70. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js +2 -2
  71. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js.map +1 -1
  72. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js +1 -1
  73. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js.map +1 -1
  74. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js +6 -28
  75. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js.map +1 -1
  76. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js +14 -53
  77. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js.map +1 -1
  78. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js +131 -161
  79. package/lib/module/modules/profile/presentation/pages/profile_page_contacts_actions.js.map +1 -1
  80. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page.js +0 -1
  81. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page.js.map +1 -1
  82. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js +26 -38
  83. package/lib/module/modules/qrcode/presentation/pages/qrcode_alias_page_share.js.map +1 -1
  84. package/lib/module/modules/search/domain/models/fonctionnalite.js +51 -0
  85. package/lib/module/modules/search/domain/models/fonctionnalite.js.map +1 -1
  86. package/lib/module/modules/search/presentation/pages/search_btn_widget.js +136 -0
  87. package/lib/module/modules/search/presentation/pages/search_btn_widget.js.map +1 -0
  88. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js +21 -1
  89. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js.map +1 -1
  90. package/lib/module/modules/search/presentation/pages/search_page.js +266 -97
  91. package/lib/module/modules/search/presentation/pages/search_page.js.map +1 -1
  92. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page.js +5 -3
  93. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page.js.map +1 -1
  94. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.js +5 -6
  95. package/lib/module/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.js.map +1 -1
  96. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page.js +0 -1
  97. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page.js.map +1 -1
  98. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.js +0 -1
  99. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.js.map +1 -1
  100. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.js +38 -93
  101. package/lib/module/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.js.map +1 -1
  102. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.js +0 -1
  103. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.js.map +1 -1
  104. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.js +0 -1
  105. package/lib/module/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.js.map +1 -1
  106. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js +23 -42
  107. package/lib/module/modules/subscription/presentation/pages/subscription_menu_widget.js.map +1 -1
  108. package/lib/module/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.js +1 -2
  109. package/lib/module/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.js.map +1 -1
  110. package/lib/module/modules/transactions/infra/transaction_output_remote.js +2 -1
  111. package/lib/module/modules/transactions/infra/transaction_output_remote.js.map +1 -1
  112. package/lib/module/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.js +17 -0
  113. package/lib/module/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.js.map +1 -1
  114. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.js +0 -1
  115. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.js.map +1 -1
  116. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.js +34 -61
  117. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.js.map +1 -1
  118. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.js +49 -62
  119. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.js.map +1 -1
  120. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.js +68 -88
  121. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.js.map +1 -1
  122. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.js +30 -23
  123. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.js.map +1 -1
  124. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js +77 -0
  125. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.js.map +1 -0
  126. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js +49 -155
  127. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.js.map +1 -1
  128. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page.js +16 -4
  129. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page.js.map +1 -1
  130. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.js +11 -9
  131. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.js.map +1 -1
  132. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js +17 -35
  133. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.js.map +1 -1
  134. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.js +8 -10
  135. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.js.map +1 -1
  136. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js +127 -106
  137. package/lib/module/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.js.map +1 -1
  138. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.js +50 -42
  139. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.js.map +1 -1
  140. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.js +0 -1
  141. package/lib/module/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.js.map +1 -1
  142. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js +0 -1
  143. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js.map +1 -1
  144. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.js +37 -67
  145. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.js.map +1 -1
  146. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page.js +9 -15
  147. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page.js.map +1 -1
  148. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js +5 -11
  149. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js.map +1 -1
  150. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.js +9 -9
  151. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.js.map +1 -1
  152. package/lib/module/shared/widgets/alias_widget.js +33 -12
  153. package/lib/module/shared/widgets/alias_widget.js.map +1 -1
  154. package/lib/module/shared/widgets/auth_code_field.js +89 -0
  155. package/lib/module/shared/widgets/auth_code_field.js.map +1 -0
  156. package/lib/module/shared/widgets/calendar_date_picker.js +21 -16
  157. package/lib/module/shared/widgets/calendar_date_picker.js.map +1 -1
  158. package/lib/module/shared/widgets/confirm_action_sheet_widget.js +53 -67
  159. package/lib/module/shared/widgets/confirm_action_sheet_widget.js.map +1 -1
  160. package/lib/module/shared/widgets/emoji_select_widget.js +34 -39
  161. package/lib/module/shared/widgets/emoji_select_widget.js.map +1 -1
  162. package/lib/module/shared/widgets/frequence_input_widget.js +18 -29
  163. package/lib/module/shared/widgets/frequence_input_widget.js.map +1 -1
  164. package/lib/module/shared/widgets/frequence_select_widget.js +233 -140
  165. package/lib/module/shared/widgets/frequence_select_widget.js.map +1 -1
  166. package/lib/module/shared/widgets/image_select_widget.js +43 -107
  167. package/lib/module/shared/widgets/image_select_widget.js.map +1 -1
  168. package/lib/module/shared/widgets/input_text.js +1 -1
  169. package/lib/module/shared/widgets/input_text.js.map +1 -1
  170. package/lib/module/shared/widgets/notification_dialog.js +28 -37
  171. package/lib/module/shared/widgets/notification_dialog.js.map +1 -1
  172. package/lib/module/shared/widgets/pin_entete.js +114 -0
  173. package/lib/module/shared/widgets/pin_entete.js.map +1 -0
  174. package/lib/module/shared/widgets/select_date_widget.js +74 -59
  175. package/lib/module/shared/widgets/select_date_widget.js.map +1 -1
  176. package/lib/module/shared/widgets/selection.js +387 -6
  177. package/lib/module/shared/widgets/selection.js.map +1 -1
  178. package/lib/typescript/src/core/api.d.ts +6 -0
  179. package/lib/typescript/src/core/api.d.ts.map +1 -1
  180. package/lib/typescript/src/l10n/app_localizations.d.ts +75 -11
  181. package/lib/typescript/src/l10n/app_localizations.d.ts.map +1 -1
  182. package/lib/typescript/src/l10n/app_localizations_en.d.ts.map +1 -1
  183. package/lib/typescript/src/l10n/app_localizations_fr.d.ts.map +1 -1
  184. package/lib/typescript/src/l10n/app_localizations_pt.d.ts.map +1 -1
  185. package/lib/typescript/src/modules/alias/domain/models/alias_revendication.d.ts.map +1 -1
  186. package/lib/typescript/src/modules/alias/infra/alias_output_local.d.ts +5 -0
  187. package/lib/typescript/src/modules/alias/infra/alias_output_local.d.ts.map +1 -1
  188. package/lib/typescript/src/modules/alias/infra/alias_output_repository.d.ts.map +1 -1
  189. package/lib/typescript/src/modules/alias/presentation/pages/alias_delete_btn_widget.d.ts.map +1 -1
  190. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_claim.d.ts.map +1 -1
  191. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_form.d.ts.map +1 -1
  192. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.d.ts +1 -1
  193. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.d.ts.map +1 -1
  194. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_options.d.ts +4 -1
  195. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_create_options.d.ts.map +1 -1
  196. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_otp.d.ts +9 -5
  197. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_otp.d.ts.map +1 -1
  198. package/lib/typescript/src/modules/categorie/domain/services/categorie_service.d.ts.map +1 -1
  199. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.d.ts +3 -0
  200. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.d.ts.map +1 -1
  201. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_form_pages.d.ts.map +1 -1
  202. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_icon.d.ts +9 -0
  203. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_icon.d.ts.map +1 -1
  204. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_liste_widget.d.ts +7 -2
  205. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_liste_widget.d.ts.map +1 -1
  206. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_page.d.ts.map +1 -1
  207. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_widget.d.ts +10 -2
  208. package/lib/typescript/src/modules/categorie/presentation/pages/categorie_select_widget.d.ts.map +1 -1
  209. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts +3 -1
  210. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts.map +1 -1
  211. package/lib/typescript/src/modules/contacts/domain/contact_pi.d.ts +0 -2
  212. package/lib/typescript/src/modules/contacts/domain/contact_pi.d.ts.map +1 -1
  213. package/lib/typescript/src/modules/contacts/presentation/bloc/contact_bloc.d.ts +7 -0
  214. package/lib/typescript/src/modules/contacts/presentation/bloc/contact_bloc.d.ts.map +1 -1
  215. package/lib/typescript/src/modules/contacts/presentation/pages/contact_actions_sheet.d.ts +14 -0
  216. package/lib/typescript/src/modules/contacts/presentation/pages/contact_actions_sheet.d.ts.map +1 -0
  217. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_alias_widget.d.ts +4 -2
  218. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_alias_widget.d.ts.map +1 -1
  219. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_phone_widget.d.ts.map +1 -1
  220. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_widget_item.d.ts +6 -4
  221. package/lib/typescript/src/modules/contacts/presentation/pages/contact_list_widget_item.d.ts.map +1 -1
  222. package/lib/typescript/src/modules/contacts/presentation/pages/contact_section.d.ts +3 -1
  223. package/lib/typescript/src/modules/contacts/presentation/pages/contact_section.d.ts.map +1 -1
  224. package/lib/typescript/src/modules/contacts/presentation/pages/contact_select_page.d.ts.map +1 -1
  225. package/lib/typescript/src/modules/contacts/presentation/pages/create/contact_create_page.d.ts.map +1 -1
  226. package/lib/typescript/src/modules/home/presentation/pages/home_page.d.ts.map +1 -1
  227. package/lib/typescript/src/modules/introduction/presentation/pages/introduction.d.ts.map +1 -1
  228. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_footer.d.ts +5 -1
  229. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_footer.d.ts.map +1 -1
  230. package/lib/typescript/src/modules/introduction/presentation/pages/introduction_page.d.ts.map +1 -1
  231. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_avatar.d.ts.map +1 -1
  232. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts.d.ts.map +1 -1
  233. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts_actions.d.ts.map +1 -1
  234. package/lib/typescript/src/modules/qrcode/presentation/pages/qrcode_alias_page.d.ts.map +1 -1
  235. package/lib/typescript/src/modules/qrcode/presentation/pages/qrcode_alias_page_share.d.ts.map +1 -1
  236. package/lib/typescript/src/modules/search/domain/models/fonctionnalite.d.ts +20 -0
  237. package/lib/typescript/src/modules/search/domain/models/fonctionnalite.d.ts.map +1 -1
  238. package/lib/typescript/src/modules/search/presentation/pages/search_btn_widget.d.ts +11 -0
  239. package/lib/typescript/src/modules/search/presentation/pages/search_btn_widget.d.ts.map +1 -0
  240. package/lib/typescript/src/modules/search/presentation/pages/search_fonctionnalites.d.ts.map +1 -1
  241. package/lib/typescript/src/modules/search/presentation/pages/search_page.d.ts.map +1 -1
  242. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page.d.ts.map +1 -1
  243. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page.d.ts.map +1 -1
  244. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.d.ts.map +1 -1
  245. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.d.ts +2 -2
  246. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.d.ts.map +1 -1
  247. package/lib/typescript/src/modules/subscription/presentation/pages/subscription_menu_widget.d.ts.map +1 -1
  248. package/lib/typescript/src/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.d.ts.map +1 -1
  249. package/lib/typescript/src/modules/transactions/infra/transaction_output_remote.d.ts.map +1 -1
  250. package/lib/typescript/src/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.d.ts.map +1 -1
  251. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.d.ts.map +1 -1
  252. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.d.ts.map +1 -1
  253. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.d.ts.map +1 -1
  254. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.d.ts +4 -1
  255. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.d.ts.map +1 -1
  256. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.d.ts +17 -0
  257. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.d.ts.map +1 -0
  258. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.d.ts +6 -2
  259. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.d.ts.map +1 -1
  260. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.d.ts +4 -0
  261. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.d.ts.map +1 -1
  262. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.d.ts.map +1 -1
  263. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.d.ts.map +1 -1
  264. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.d.ts.map +1 -1
  265. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.d.ts.map +1 -1
  266. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.d.ts.map +1 -1
  267. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.d.ts.map +1 -1
  268. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_search/transaction_search_page.d.ts.map +1 -1
  269. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.d.ts.map +1 -1
  270. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.d.ts.map +1 -1
  271. package/lib/typescript/src/shared/widgets/alias_widget.d.ts +2 -2
  272. package/lib/typescript/src/shared/widgets/alias_widget.d.ts.map +1 -1
  273. package/lib/typescript/src/shared/widgets/auth_code_field.d.ts +17 -0
  274. package/lib/typescript/src/shared/widgets/auth_code_field.d.ts.map +1 -0
  275. package/lib/typescript/src/shared/widgets/calendar_date_picker.d.ts.map +1 -1
  276. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts +16 -2
  277. package/lib/typescript/src/shared/widgets/confirm_action_sheet_widget.d.ts.map +1 -1
  278. package/lib/typescript/src/shared/widgets/emoji_select_widget.d.ts.map +1 -1
  279. package/lib/typescript/src/shared/widgets/frequence_input_widget.d.ts +6 -3
  280. package/lib/typescript/src/shared/widgets/frequence_input_widget.d.ts.map +1 -1
  281. package/lib/typescript/src/shared/widgets/frequence_select_widget.d.ts +23 -5
  282. package/lib/typescript/src/shared/widgets/frequence_select_widget.d.ts.map +1 -1
  283. package/lib/typescript/src/shared/widgets/image_select_widget.d.ts +6 -4
  284. package/lib/typescript/src/shared/widgets/image_select_widget.d.ts.map +1 -1
  285. package/lib/typescript/src/shared/widgets/input_text.d.ts +2 -0
  286. package/lib/typescript/src/shared/widgets/input_text.d.ts.map +1 -1
  287. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts +5 -3
  288. package/lib/typescript/src/shared/widgets/notification_dialog.d.ts.map +1 -1
  289. package/lib/typescript/src/shared/widgets/pin_entete.d.ts +15 -0
  290. package/lib/typescript/src/shared/widgets/pin_entete.d.ts.map +1 -0
  291. package/lib/typescript/src/shared/widgets/select_date_widget.d.ts +4 -0
  292. package/lib/typescript/src/shared/widgets/select_date_widget.d.ts.map +1 -1
  293. package/lib/typescript/src/shared/widgets/selection.d.ts +74 -3
  294. package/lib/typescript/src/shared/widgets/selection.d.ts.map +1 -1
  295. package/package.json +1 -1
  296. package/src/core/api.ts +11 -2
  297. package/src/l10n/app_localizations.ts +75 -11
  298. package/src/l10n/app_localizations_en.ts +40 -8
  299. package/src/l10n/app_localizations_fr.ts +46 -14
  300. package/src/l10n/app_localizations_pt.ts +39 -7
  301. package/src/modules/alias/domain/models/alias_revendication.ts +4 -2
  302. package/src/modules/alias/infra/alias_output_local.ts +11 -0
  303. package/src/modules/alias/infra/alias_output_repository.ts +9 -8
  304. package/src/modules/alias/presentation/pages/alias_delete_btn_widget.tsx +17 -24
  305. package/src/modules/alias/presentation/pages/alias_page_claim.tsx +76 -48
  306. package/src/modules/alias/presentation/pages/alias_page_create_mbno_form.tsx +113 -65
  307. package/src/modules/alias/presentation/pages/alias_page_create_mbno_timer.tsx +34 -25
  308. package/src/modules/alias/presentation/pages/alias_page_create_options.tsx +29 -36
  309. package/src/modules/alias/presentation/pages/alias_page_otp.tsx +24 -88
  310. package/src/modules/categorie/domain/services/categorie_service.ts +2 -1
  311. package/src/modules/categorie/presentation/pages/categorie_edit_icon_btn.tsx +58 -50
  312. package/src/modules/categorie/presentation/pages/categorie_form_pages.tsx +71 -41
  313. package/src/modules/categorie/presentation/pages/categorie_icon.tsx +26 -0
  314. package/src/modules/categorie/presentation/pages/categorie_liste_widget.tsx +45 -24
  315. package/src/modules/categorie/presentation/pages/categorie_select_page.tsx +10 -46
  316. package/src/modules/categorie/presentation/pages/categorie_select_widget.tsx +54 -13
  317. package/src/modules/config/domain/models/config_keys.ts +3 -0
  318. package/src/modules/contacts/domain/contact_pi.ts +3 -6
  319. package/src/modules/contacts/presentation/bloc/contact_bloc.ts +37 -20
  320. package/src/modules/contacts/presentation/pages/contact_actions_sheet.tsx +69 -0
  321. package/src/modules/contacts/presentation/pages/contact_list_alias_widget.tsx +26 -4
  322. package/src/modules/contacts/presentation/pages/contact_list_phone_widget.tsx +3 -0
  323. package/src/modules/contacts/presentation/pages/contact_list_widget_item.tsx +54 -65
  324. package/src/modules/contacts/presentation/pages/contact_section.tsx +13 -3
  325. package/src/modules/contacts/presentation/pages/contact_select_page.tsx +106 -74
  326. package/src/modules/contacts/presentation/pages/create/contact_create_page.tsx +86 -47
  327. package/src/modules/home/presentation/pages/home_page.tsx +2 -9
  328. package/src/modules/introduction/presentation/pages/introduction.tsx +8 -0
  329. package/src/modules/introduction/presentation/pages/introduction_footer.tsx +16 -36
  330. package/src/modules/introduction/presentation/pages/introduction_page.tsx +17 -5
  331. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.tsx +2 -2
  332. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.tsx +1 -1
  333. package/src/modules/profile/presentation/pages/profile_page_avatar.tsx +6 -12
  334. package/src/modules/profile/presentation/pages/profile_page_contacts.tsx +12 -20
  335. package/src/modules/profile/presentation/pages/profile_page_contacts_actions.tsx +120 -117
  336. package/src/modules/qrcode/presentation/pages/qrcode_alias_page.tsx +0 -1
  337. package/src/modules/qrcode/presentation/pages/qrcode_alias_page_share.tsx +32 -40
  338. package/src/modules/search/domain/models/fonctionnalite.ts +56 -0
  339. package/src/modules/search/presentation/pages/search_btn_widget.tsx +91 -0
  340. package/src/modules/search/presentation/pages/search_fonctionnalites.ts +21 -1
  341. package/src/modules/search/presentation/pages/search_page.tsx +166 -57
  342. package/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page.tsx +4 -2
  343. package/src/modules/subscription/presentation/pages/subscription_create/subscription_create_page_list.tsx +5 -5
  344. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page.tsx +0 -1
  345. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_actions.tsx +0 -1
  346. package/src/modules/subscription/presentation/pages/subscription_details/subscription_details_page_note_sheet.tsx +20 -59
  347. package/src/modules/subscription/presentation/pages/subscription_list/subscription_list_empty_widget.tsx +1 -1
  348. package/src/modules/subscription/presentation/pages/subscription_list/subscription_list_widget.tsx +1 -1
  349. package/src/modules/subscription/presentation/pages/subscription_menu_widget.tsx +25 -39
  350. package/src/modules/transactions/domain/models/transaction_send/transaction_send_command_othr.ts +1 -2
  351. package/src/modules/transactions/infra/transaction_output_remote.ts +6 -1
  352. package/src/modules/transactions/presentation/bloc/transaction_send/transaction_send_bloc.ts +17 -0
  353. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions.tsx +0 -1
  354. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_cancel.tsx +39 -41
  355. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_actions_return.tsx +41 -46
  356. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_ticket.tsx +46 -40
  357. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_date.tsx +26 -17
  358. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_pays.tsx +92 -0
  359. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_input_psp.tsx +48 -94
  360. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page.tsx +20 -2
  361. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_alias.tsx +6 -8
  362. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_othr.tsx +9 -22
  363. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_schedule.tsx +5 -7
  364. package/src/modules/transactions/presentation/pages/transaction_form/transaction_form_page_verification.tsx +112 -104
  365. package/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_nombre_widget.tsx +49 -42
  366. package/src/modules/transactions/presentation/pages/transaction_recents/transaction_recents_widget.tsx +1 -1
  367. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.tsx +0 -1
  368. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions_reject.tsx +47 -48
  369. package/src/modules/transactions/presentation/pages/transaction_search/transaction_search_page.tsx +6 -10
  370. package/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.tsx +3 -6
  371. package/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_tx.tsx +5 -5
  372. package/src/shared/widgets/alias_widget.tsx +45 -18
  373. package/src/shared/widgets/auth_code_field.tsx +89 -0
  374. package/src/shared/widgets/calendar_date_picker.tsx +12 -11
  375. package/src/shared/widgets/confirm_action_sheet_widget.tsx +49 -35
  376. package/src/shared/widgets/emoji_select_widget.tsx +31 -29
  377. package/src/shared/widgets/frequence_input_widget.tsx +18 -24
  378. package/src/shared/widgets/frequence_select_widget.tsx +237 -117
  379. package/src/shared/widgets/image_select_widget.tsx +46 -61
  380. package/src/shared/widgets/input_text.tsx +3 -0
  381. package/src/shared/widgets/notification_dialog.tsx +70 -71
  382. package/src/shared/widgets/pin_entete.tsx +74 -0
  383. package/src/shared/widgets/select_date_widget.tsx +66 -34
  384. package/src/shared/widgets/selection.tsx +304 -5
  385. package/lib/module/modules/transactions/presentation/pages/transaction_details/sheet_box.js +0 -47
  386. package/lib/module/modules/transactions/presentation/pages/transaction_details/sheet_box.js.map +0 -1
  387. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/sheet_box.d.ts +0 -10
  388. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_details/sheet_box.d.ts.map +0 -1
  389. package/src/modules/transactions/presentation/pages/transaction_details/sheet_box.tsx +0 -30
@@ -1,7 +1,6 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
- import { Image } from 'expo-image';
3
2
  import { useState } from 'react';
4
- import { Keyboard, Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
3
+ import { Keyboard, Pressable, StyleSheet, TextInput, View } from 'react-native';
5
4
 
6
5
  import { Images } from '../../../../core/assets';
7
6
  import { useBloc } from '../../../../core/bloc_react';
@@ -11,6 +10,7 @@ import { useAppLocalizations } from '../../../../l10n/localizations';
11
10
  import { Card } from '../../../../shared/material/card';
12
11
  import { showModalBottomSheet } from '../../../../shared/material/overlays';
13
12
  import { Scaffold } from '../../../../shared/material/scaffold';
13
+ import { SelectionOption } from '../../../../shared/widgets/selection';
14
14
  import { MyPageContainer } from '../../../../shared/widgets/my_page_container';
15
15
  import type { ContactPI } from '../../../contacts/domain/contact_pi';
16
16
  import type { PhoneContact } from '../../../contacts/domain/phone_contact';
@@ -36,7 +36,6 @@ export function ProfilePageContacts({ contactPI }: { contactPI?: ContactPI | nul
36
36
 
37
37
  const onSelect = async (contact: PhoneContact | null, alias: string | null) => {
38
38
  const value = await showModalBottomSheet<boolean>(router, {
39
- themed: true,
40
39
  builder: () => <ProfilePageContactsActions alias={alias} contact={contact} contactPI={contactPI} />,
41
40
  });
42
41
  if (value != null && contactPI != null) AppRouter.pop(router);
@@ -68,18 +67,13 @@ export function ProfilePageContacts({ contactPI }: { contactPI?: ContactPI | nul
68
67
  {/* Nouveau contact */}
69
68
  {!hasInputSearchFocused && searchKeyword == null && (
70
69
  <>
71
- <Card>
72
- <Pressable accessibilityRole="button" onPress={() => void onSelect(null, null)} style={styles.action}>
73
- <View style={[styles.actionIcon, { backgroundColor: theme.colorScheme.surface }]}>
74
- <Image source={Images.iconTransactionSendByNewContact} style={styles.icon} tintColor={theme.colorScheme.onSurface} />
75
- </View>
76
- <View style={styles.texts}>
77
- <Text style={theme.textTheme.headlineSmall}>{traductions.profileContactPageaActionAdd}</Text>
78
- <Text style={theme.textTheme.displaySmall}>{traductions.profileContactPageaActionAddSubtitle}</Text>
79
- </View>
80
- </Pressable>
81
- </Card>
82
- <View style={styles.gap10} />
70
+ <SelectionOption
71
+ image={Images.iconTransactionSendByNewContact}
72
+ titre={traductions.profileContactPageaActionAdd}
73
+ sousTitre={traductions.profileContactPageaActionAddSubtitle}
74
+ onPress={() => void onSelect(null, null)}
75
+ />
76
+ <View style={styles.gap16} />
83
77
  </>
84
78
  )}
85
79
  {/* Contacts (la recherche est transmise à la pagination : le SDK
@@ -89,6 +83,8 @@ export function ProfilePageContacts({ contactPI }: { contactPI?: ContactPI | nul
89
83
  hideTitle
90
84
  expanded
91
85
  searchKeyword={searchKeyword}
86
+ // Le toucher ouvre déjà la feuille du contact
87
+ showActions={false}
92
88
  onSelect={(contact, alias) => void onSelect(contact, alias)}
93
89
  />
94
90
  </View>
@@ -103,10 +99,6 @@ const styles = StyleSheet.create({
103
99
  flex: { flex: 1 },
104
100
  search: { height: 36, flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12 },
105
101
  input: { flex: 1, marginLeft: 8, paddingVertical: 0 },
106
- action: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 10 },
107
- actionIcon: { width: 45, height: 45, borderRadius: 14, alignItems: 'center', justifyContent: 'center' },
108
- icon: { width: 20, height: 20 },
109
- texts: { flex: 1, marginLeft: 16 },
110
- gap10: { height: 10 },
102
+ gap16: { height: 16 },
111
103
  gap20: { height: 20 },
112
104
  });
@@ -1,8 +1,6 @@
1
- import { Image } from 'expo-image';
2
1
  import { MaterialIcons } from '@expo/vector-icons';
3
- import { useEffect, useRef, useState } from 'react';
4
- import { Animated, Easing, Keyboard, Platform, Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
5
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
2
+ import { useState } from 'react';
3
+ import { Keyboard, Platform, Pressable, ScrollView, Share, StyleSheet, Text, View } from 'react-native';
6
4
 
7
5
  import { Images } from '../../../../core/assets';
8
6
  import { useBloc, useBlocListener, useCreateBloc } from '../../../../core/bloc_react';
@@ -11,11 +9,12 @@ import { Themer, useTheme } from '../../../../core/theme';
11
9
  import { useAppLocalizations } from '../../../../l10n/localizations';
12
10
  import { ElevatedButton, FilledTonalButton } from '../../../../shared/material/buttons';
13
11
  import { AliasPI } from '../../../../shared/models/alias_pi';
14
- import { useKeyboardVisible } from '../../../../shared/utils/use_keyboard_visible';
12
+ import { withAlpha } from '../../../../shared/utils/color';
15
13
  import { ClipboardWidget } from '../../../../shared/widgets/clipboard_widget';
16
14
  import { InputAliasWidget } from '../../../../shared/widgets/input_alias_widget';
17
15
  import { CustomTextInput } from '../../../../shared/widgets/input_text';
18
16
  import { CustomLoadingDialog } from '../../../../shared/widgets/loading_page';
17
+ import { SelectionBoutons, SelectionSheet } from '../../../../shared/widgets/selection';
19
18
  import { ContactPI } from '../../../contacts/domain/contact_pi';
20
19
  import { contactIdOf, type PhoneContact } from '../../../contacts/domain/phone_contact';
21
20
  import { ContactBloc } from '../../../contacts/presentation/bloc/contact_bloc';
@@ -27,6 +26,7 @@ import {
27
26
  ContactCreateLoadingState,
28
27
  ContactCreateSuccessState,
29
28
  } from '../../../contacts/presentation/bloc/create/contact_create_state';
29
+ import { ProfileMenuTile, ProfilePageMenu } from './profile_menu';
30
30
 
31
31
  function fullName(contact: PhoneContact): string {
32
32
  return `${contact.firstName} ${contact.lastName}`.trim();
@@ -50,9 +50,6 @@ export function ProfilePageContactsActions({
50
50
  const traductions = useAppLocalizations();
51
51
  const theme = useTheme();
52
52
  const router = useAppRouter();
53
- const insets = useSafeAreaInsets();
54
- const { height } = useWindowDimensions();
55
- const isKeyboardVisible = useKeyboardVisible();
56
53
  const contactListBloc = useBloc(ContactBloc);
57
54
  const contactBloc = useCreateBloc(() => new ContactCreateBloc());
58
55
 
@@ -107,127 +104,133 @@ export function ProfilePageContactsActions({
107
104
  };
108
105
 
109
106
  const canSave = command.isValid() && command.value !== alias && name != null && name.length > 0;
110
- // Comme en Flutter, la feuille a une hauteur fixe (35 % ou 50 % de l'écran)
111
- // qui passe à 70 % ou 80 % quand le clavier est affiché, pour que le
112
- // formulaire reste au-dessus du clavier. Sur iOS, la feuille est déjà
113
- // remontée au-dessus du clavier par l'OverlayHost : elle garde sa hauteur.
114
- const keyboardOpen = isKeyboardVisible && Platform.OS !== 'ios';
115
- const ratio = !keyboardOpen ? (contact != null ? 0.35 : 0.5) : contact != null ? 0.7 : 0.8;
116
- const sheetHeight = useRef(new Animated.Value(height * ratio)).current;
117
- useEffect(() => {
118
- Animated.timing(sheetHeight, {
119
- toValue: height * ratio,
120
- duration: 300,
121
- easing: Easing.inOut(Easing.ease),
122
- useNativeDriver: false,
123
- }).start();
124
- }, [height, ratio, sheetHeight]);
107
+ const primaire = theme.colorScheme.primary;
108
+ const initiale = contact != null && name != null && name.trim().length > 0 ? name.trim()[0].toUpperCase() : null;
125
109
 
110
+ // La feuille remonte d'elle-même au-dessus du clavier
126
111
  return (
127
- <Animated.View style={[styles.sheet, { backgroundColor: theme.colorScheme.surface, height: sheetHeight, paddingBottom: insets.bottom }]}>
128
- <View style={styles.content}>
129
- <View style={styles.gap20} />
130
- {/* Titre */}
131
- <Text style={theme.textTheme.headlineMedium}>{name ?? traductions.contactCreateTitle}</Text>
132
- {alias != null && alias.length > 0 ? (
133
- <>
134
- <View style={styles.gap10} />
112
+ <SelectionSheet
113
+ hauteurMax={0.9}
114
+ contenu={
115
+ <>
116
+ <ScrollView keyboardShouldPersistTaps="handled" bounces={false} style={styles.defile} contentContainerStyle={styles.content}>
117
+ {/* Pastille, nom du contact (ou « Ajouter un contact ») et alias à copier (ou sous-titre de la création) */}
135
118
  <View style={styles.row}>
136
- <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, styles.flex, { color: Themer.neural03Color }]}>
137
- {AliasPI.formatPhoneNumber(alias)}
138
- </Text>
139
- <Pressable accessibilityRole="button" hitSlop={8} onPress={() => void ClipboardWidget.setData(alias)}>
140
- <MaterialIcons name="content-copy" size={16} color={theme.colorScheme.onSurface} />
141
- </Pressable>
142
- </View>
143
- </>
144
- ) : contact == null ? (
145
- <>
146
- <View style={styles.gap10} />
147
- <Text numberOfLines={1} style={[theme.textTheme.bodyLarge, { color: Themer.neural03Color }]}>
148
- {traductions.contactCreateSubtitle}
149
- </Text>
150
- </>
151
- ) : null}
152
- <View style={styles.gap20} />
153
-
154
- {canEdit ? (
155
- <>
156
- {/* Formulaire */}
157
- <ScrollView style={styles.flex} keyboardShouldPersistTaps="handled">
158
- {contact == null && (
159
- <>
160
- <CustomTextInput
161
- defaultValue={name ?? ''}
162
- labelText={traductions.contactCreateNameLabel}
163
- messageError={name == null || name.length === 0 ? traductions.contactCreateNameErrorEmpty : null}
164
- onChange={setName}
165
- />
166
- <View style={styles.gap10} />
167
- </>
168
- )}
169
- <InputAliasWidget command={command} onChange={rebuild} />
170
- </ScrollView>
171
- <View style={styles.gap20} />
172
- {/* Annuler / Enregistrer */}
173
- <View style={styles.buttons}>
174
- <View style={styles.flex}>
175
- <FilledTonalButton onPress={cancel}>{traductions.btnTextCancel}</FilledTonalButton>
119
+ <View style={[styles.avatar, { backgroundColor: withAlpha(primaire, 0.12) }]}>
120
+ {initiale != null ? (
121
+ <Text style={[theme.textTheme.headlineMedium, styles.initiale, { color: primaire }]}>{initiale}</Text>
122
+ ) : (
123
+ <MaterialIcons name="person-add-alt-1" size={24} color={primaire} />
124
+ )}
176
125
  </View>
177
- <View style={styles.gap16} />
178
- <View style={styles.flex}>
179
- <ElevatedButton onPress={canSave ? () => saveAlias(command.value!) : undefined}>{traductions.btnTextSave}</ElevatedButton>
126
+ <View style={styles.entete}>
127
+ <Text numberOfLines={1} style={theme.textTheme.headlineMedium}>
128
+ {contact != null && name != null ? name : traductions.contactCreateTitle}
129
+ </Text>
130
+ <View style={styles.gap2} />
131
+ {alias != null && alias.length > 0 ? (
132
+ <View style={styles.row}>
133
+ <Text numberOfLines={1} style={[theme.textTheme.displayMedium, styles.flexShrink, { color: Themer.neural03Color }]}>
134
+ {AliasPI.formatPhoneNumber(alias)}
135
+ </Text>
136
+ <Pressable
137
+ accessibilityRole="button"
138
+ hitSlop={8}
139
+ style={styles.copier}
140
+ onPress={() => void ClipboardWidget.setData(alias)}
141
+ >
142
+ <MaterialIcons name="content-copy" size={16} color={primaire} />
143
+ </Pressable>
144
+ </View>
145
+ ) : contact == null ? (
146
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>{traductions.contactCreateSubtitle}</Text>
147
+ ) : null}
180
148
  </View>
181
149
  </View>
182
- </>
183
- ) : contact != null && alias != null ? (
184
- <>
185
- {/* Modifier */}
186
- <Action
187
- icon={Images.iconEdit}
188
- title={traductions.profileContactPageaActionEdit}
189
- onPress={() => {
190
- command.value = alias;
191
- setCanEdit(true);
192
- }}
193
- />
194
- {/* Supprimer */}
195
- <Action
196
- icon={Images.iconDelete}
197
- title={traductions.profileContactPageaActionDelete}
198
- onPress={() => contactBloc.add(new ContactDeleteSubmitEvent(contactIdOf(contact), alias))}
199
- />
200
- </>
201
- ) : null}
202
- </View>
203
- </Animated.View>
204
- );
205
- }
150
+ <View style={styles.gap20} />
206
151
 
207
- function Action({ icon, title, onPress }: { icon: number; title: string; onPress: () => void }) {
208
- const theme = useTheme();
209
- return (
210
- <Pressable accessibilityRole="button" onPress={onPress} style={styles.action}>
211
- <View style={[styles.actionIcon, { backgroundColor: theme.colorScheme.surface }]}>
212
- <Image source={icon} style={styles.icon} tintColor={theme.colorScheme.onSurface} />
213
- </View>
214
- <Text style={[theme.textTheme.headlineSmall, styles.actionText]}>{title}</Text>
215
- </Pressable>
152
+ {canEdit ? (
153
+ <>
154
+ {/* Champs nom et alias */}
155
+ {contact == null && (
156
+ <>
157
+ <CustomTextInput
158
+ defaultValue={name ?? ''}
159
+ labelText={traductions.contactCreateNameLabel}
160
+ messageError={name == null || name.length === 0 ? traductions.contactCreateNameErrorEmpty : null}
161
+ onChange={setName}
162
+ />
163
+ <View style={styles.gap12} />
164
+ </>
165
+ )}
166
+ <InputAliasWidget command={command} onChange={rebuild} />
167
+ </>
168
+ ) : contact != null && alias != null ? (
169
+ // Actions sur l'alias du contact
170
+ <ProfilePageMenu
171
+ items={[
172
+ // Modifier
173
+ <ProfileMenuTile
174
+ key="modifier"
175
+ image={Images.iconEdit}
176
+ titre={traductions.profileContactPageaActionEdit}
177
+ onPress={() => {
178
+ command.value = alias;
179
+ setCanEdit(true);
180
+ }}
181
+ />,
182
+ // Partager
183
+ <ProfileMenuTile
184
+ key="partager"
185
+ icone={Platform.OS === 'ios' ? 'ios-share' : 'share'}
186
+ titre={traductions.profileContactPageaActionShare}
187
+ onPress={() =>
188
+ void Share.share({ title: traductions.qrcodePagePartageAliasMessage(name ?? ''), message: alias })
189
+ }
190
+ />,
191
+ // Supprimer
192
+ <ProfileMenuTile
193
+ key="supprimer"
194
+ image={Images.iconDelete}
195
+ titre={traductions.profileContactPageaActionDelete}
196
+ couleur={theme.colorScheme.error}
197
+ trailing={<View />}
198
+ onPress={() => contactBloc.add(new ContactDeleteSubmitEvent(contactIdOf(contact), alias))}
199
+ />,
200
+ ]}
201
+ />
202
+ ) : null}
203
+ </ScrollView>
204
+
205
+ {/* Annuler / Enregistrer, fixés en bas */}
206
+ {canEdit && (
207
+ <SelectionBoutons
208
+ boutons={[
209
+ <FilledTonalButton key="annuler" onPress={cancel}>
210
+ {traductions.btnTextCancel}
211
+ </FilledTonalButton>,
212
+ <ElevatedButton key="enregistrer" onPress={canSave ? () => saveAlias(command.value!) : undefined}>
213
+ {traductions.btnTextSave}
214
+ </ElevatedButton>,
215
+ ]}
216
+ />
217
+ )}
218
+ </>
219
+ }
220
+ />
216
221
  );
217
222
  }
218
223
 
219
224
  const styles = StyleSheet.create({
220
- sheet: { borderTopLeftRadius: 20, borderTopRightRadius: 20, overflow: 'hidden' },
221
- content: { paddingHorizontal: 20, flex: 1 },
222
- flex: { flex: 1 },
225
+ defile: { flexShrink: 1 },
226
+ content: { paddingHorizontal: 20, paddingTop: 4, paddingBottom: 20 },
223
227
  flexShrink: { flexShrink: 1 },
224
228
  row: { flexDirection: 'row', alignItems: 'center' },
225
- buttons: { flexDirection: 'row', paddingVertical: 16 },
226
- action: { flexDirection: 'row', alignItems: 'center', minHeight: 64 },
227
- actionIcon: { width: 45, height: 45, borderRadius: 14, alignItems: 'center', justifyContent: 'center' },
228
- icon: { width: 20, height: 20 },
229
- actionText: { marginLeft: 16 },
230
- gap10: { height: 10 },
231
- gap16: { width: 16 },
229
+ avatar: { width: 52, height: 52, borderRadius: 26, alignItems: 'center', justifyContent: 'center' },
230
+ initiale: { fontWeight: '700' },
231
+ entete: { flex: 1, marginLeft: 14 },
232
+ copier: { padding: 4, marginLeft: 6 },
233
+ gap2: { height: 2 },
234
+ gap12: { height: 12 },
232
235
  gap20: { height: 20 },
233
236
  });
@@ -88,7 +88,6 @@ export function QrCodeAliasPage() {
88
88
  style={styles.icon}
89
89
  onPress={() =>
90
90
  void showModalBottomSheet(router, {
91
- themed: true,
92
91
  builder: () => <QrcodeAliasPageShare username={user.nomComplet()} alias={aliasCle} shareQrcode={() => void shareQRCode()} />,
93
92
  })
94
93
  }
@@ -1,11 +1,9 @@
1
- import { ScrollView, Share, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
2
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
1
+ import { ScrollView, Share, StyleSheet, View } from 'react-native';
3
2
 
4
3
  import { Images } from '../../../../core/assets';
5
4
  import { AppRouter, useAppRouter } from '../../../../core/router';
6
- import { useTheme } from '../../../../core/theme';
7
5
  import { useAppLocalizations } from '../../../../l10n/localizations';
8
- import { MenuActionItem, MenuActionsWidget } from '../../../../shared/widgets/menu_actions_widget';
6
+ import { SelectionOption, SelectionSheet } from '../../../../shared/widgets/selection';
9
7
 
10
8
  /** Feuille « Partager » : le QR code (image) ou l'alias (texte). */
11
9
  export function QrcodeAliasPageShare({
@@ -18,47 +16,41 @@ export function QrcodeAliasPageShare({
18
16
  shareQrcode: () => void;
19
17
  }) {
20
18
  const traductions = useAppLocalizations();
21
- const theme = useTheme();
22
19
  const router = useAppRouter();
23
- const insets = useSafeAreaInsets();
24
- const { height } = useWindowDimensions();
25
20
 
26
21
  return (
27
- <View style={[styles.box, { backgroundColor: theme.colorScheme.surface, maxHeight: height * 0.6 }]}>
28
- <ScrollView contentContainerStyle={[styles.content, { paddingBottom: 20 + insets.bottom }]}>
29
- <Text style={theme.textTheme.headlineMedium}>{traductions.qrcodePagePartageTitle}</Text>
30
- <View style={styles.gap20} />
31
- <MenuActionsWidget
32
- items={[
33
- new MenuActionItem(
34
- Images.homeFooterQrcode,
35
- traductions.qrcodePagePartageQrCodeTitle,
36
- traductions.qrcodePagePartageQrCodeSubTitle,
37
- () => {
38
- AppRouter.pop(router);
39
- shareQrcode();
40
- },
41
- { iconSize: 20 },
42
- ),
43
- new MenuActionItem(
44
- Images.iconsCircleUser,
45
- traductions.qrcodePagePartageAliasTitle,
46
- traductions.qrcodePagePartageAliasSubTitle,
47
- () => {
48
- AppRouter.pop(router);
49
- void Share.share({ title: traductions.qrcodePagePartageAliasMessage(username), message: alias });
50
- },
51
- { iconSize: 20 },
52
- ),
53
- ]}
54
- />
55
- </ScrollView>
56
- </View>
22
+ <SelectionSheet
23
+ titre={traductions.qrcodePagePartageTitle}
24
+ contenu={
25
+ <ScrollView bounces={false} contentContainerStyle={styles.content}>
26
+ {/* Partager le QR code */}
27
+ <SelectionOption
28
+ image={Images.homeFooterQrcode}
29
+ titre={traductions.qrcodePagePartageQrCodeTitle}
30
+ sousTitre={traductions.qrcodePagePartageQrCodeSubTitle}
31
+ onPress={() => {
32
+ AppRouter.pop(router);
33
+ shareQrcode();
34
+ }}
35
+ />
36
+ <View style={styles.gap10} />
37
+ {/* Partager l'alias */}
38
+ <SelectionOption
39
+ image={Images.iconsCircleUser}
40
+ titre={traductions.qrcodePagePartageAliasTitle}
41
+ sousTitre={traductions.qrcodePagePartageAliasSubTitle}
42
+ onPress={() => {
43
+ AppRouter.pop(router);
44
+ void Share.share({ title: traductions.qrcodePagePartageAliasMessage(username), message: alias });
45
+ }}
46
+ />
47
+ </ScrollView>
48
+ }
49
+ />
57
50
  );
58
51
  }
59
52
 
60
53
  const styles = StyleSheet.create({
61
- box: { borderRadius: 20, overflow: 'hidden' },
62
- content: { padding: 20 },
63
- gap20: { height: 20 },
54
+ content: { paddingHorizontal: 20, paddingTop: 8, paddingBottom: 16 },
55
+ gap10: { height: 10 },
64
56
  });
@@ -30,6 +30,14 @@ const ACCENTS: Record<string, string> = {
30
30
  æ: 'ae',
31
31
  };
32
32
 
33
+ /** Rubrique d'une fonctionnalité, pour grouper la liste quand rien n'est encore saisi. */
34
+ export enum FonctionnaliteRubrique {
35
+ paiements = 'paiements',
36
+ abonnements = 'abonnements',
37
+ servicesBancaires = 'servicesBancaires',
38
+ profil = 'profil',
39
+ }
40
+
33
41
  /**
34
42
  * Une fonctionnalité de l'application que l'utilisateur peut retrouver
35
43
  * depuis la recherche.
@@ -59,18 +67,66 @@ export class Fonctionnalite {
59
67
  */
60
68
  readonly ouvrir: () => void;
61
69
 
70
+ /** Rubrique sous laquelle elle est listée avant toute saisie. */
71
+ readonly rubrique: FonctionnaliteRubrique;
72
+
73
+ /** Proposée en raccourci en haut de la recherche, avant toute saisie. */
74
+ readonly raccourci: boolean;
75
+
62
76
  constructor(options: {
63
77
  icon: number;
64
78
  titre: string;
65
79
  sousTitre?: string;
66
80
  motsCles?: readonly string[];
67
81
  ouvrir: () => void;
82
+ rubrique?: FonctionnaliteRubrique;
83
+ raccourci?: boolean;
68
84
  }) {
69
85
  this.icon = options.icon;
70
86
  this.titre = options.titre;
71
87
  this.sousTitre = options.sousTitre;
72
88
  this.motsCles = options.motsCles ?? [];
73
89
  this.ouvrir = options.ouvrir;
90
+ this.rubrique = options.rubrique ?? FonctionnaliteRubrique.paiements;
91
+ this.raccourci = options.raccourci ?? false;
92
+ }
93
+
94
+ /**
95
+ * Parties de [texte] à mettre en évidence pour [recherche] : débuts de
96
+ * mots qui commencent par un mot saisi, sans tenir compte des accents ni
97
+ * des majuscules. Renvoie des intervalles [début, fin[ dans [texte],
98
+ * triés et sans chevauchement.
99
+ */
100
+ static correspondances(texte: string, recherche: string): [number, number][] {
101
+ const saisis = Fonctionnalite.normaliser(recherche)
102
+ .split(/[^a-z0-9]+/)
103
+ .filter((mot) => mot.length >= 2);
104
+ if (saisis.length === 0) return [];
105
+ // Texte normalisé caractère par caractère, avec la position d'origine
106
+ let t = '';
107
+ const origine: number[] = [];
108
+ for (let i = 0; i < texte.length; i++) {
109
+ // Espace et ponctuation deviennent un séparateur
110
+ const lettre = Fonctionnalite.normaliser(texte[i]);
111
+ const n = lettre.length === 0 ? ' ' : lettre;
112
+ for (const c of n) {
113
+ t += c;
114
+ origine.push(i);
115
+ }
116
+ }
117
+ const intervalles: [number, number][] = [];
118
+ for (const mot of t.matchAll(/[a-z0-9]+/g)) {
119
+ const debut = mot.index ?? 0;
120
+ const fin = debut + mot[0].length;
121
+ for (const saisi of saisis) {
122
+ if (t.startsWith(saisi, debut) || saisi.startsWith(mot[0])) {
123
+ const longueur = Math.min(saisi.length, fin - debut);
124
+ intervalles.push([origine[debut], origine[debut + longueur - 1] + 1]);
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ return intervalles;
74
130
  }
75
131
 
76
132
  /**
@@ -0,0 +1,91 @@
1
+ import { MaterialIcons } from '@expo/vector-icons';
2
+ import { useEffect, useRef } from 'react';
3
+ import { Animated, Easing, Pressable, StyleSheet, View } from 'react-native';
4
+
5
+ import { useBloc } from '../../../../core/bloc_react';
6
+ import { useTheme } from '../../../../core/theme';
7
+ import { useAppLocalizations } from '../../../../l10n/localizations';
8
+ import { withAlpha } from '../../../../shared/utils/color';
9
+ import { ConfigBloc } from '../../../config/adapters/ui/bloc/config_bloc';
10
+ import { ConfigChangeEvent } from '../../../config/adapters/ui/bloc/config_event';
11
+ import { ConfigLoadedState } from '../../../config/adapters/ui/bloc/config_state';
12
+ import { ConfigKey } from '../../../config/domain/models/config_keys';
13
+
14
+ /** Nombre de premiers affichages de l'accueil où la pastille pulse. */
15
+ const AFFICHAGES_AVEC_PULSATION = 3;
16
+
17
+ /**
18
+ * Bouton de recherche des fonctionnalités de la barre de l'accueil : loupe
19
+ * dans une pastille teintée, libellé d'accessibilité (et infobulle au
20
+ * toucher long sur le web). Aux trois premiers affichages de l'accueil, la
21
+ * pastille pulse deux fois pour attirer l'œil ; plus du tout une fois la
22
+ * recherche utilisée. [onPress] absent : bouton grisé.
23
+ */
24
+ export function SearchBtnWidget({ onPress }: { onPress?: () => void }) {
25
+ const traductions = useAppLocalizations();
26
+ const theme = useTheme();
27
+ const primaire = theme.colorScheme.primary;
28
+ const configBloc = useBloc(ConfigBloc);
29
+ const pulsation = useRef(new Animated.Value(0)).current;
30
+
31
+ useEffect(() => {
32
+ if (!(configBloc.state instanceof ConfigLoadedState)) return;
33
+ const vus = Number.parseInt(configBloc.getParamValue(ConfigKey.searchHintCount) ?? '', 10) || 0;
34
+ if (vus >= AFFICHAGES_AVEC_PULSATION) return;
35
+ configBloc.add(new ConfigChangeEvent(ConfigKey.searchHintCount, String(vus + 1)));
36
+ // Deux pulsations, une fois l'accueil affiché
37
+ const une = () =>
38
+ Animated.sequence([
39
+ Animated.timing(pulsation, { toValue: 1, duration: 900, easing: Easing.out(Easing.ease), useNativeDriver: true }),
40
+ Animated.timing(pulsation, { toValue: 0, duration: 0, useNativeDriver: true }),
41
+ ]);
42
+ const animation = Animated.sequence([Animated.delay(800), une(), une()]);
43
+ animation.start();
44
+ return () => animation.stop();
45
+ }, [configBloc, pulsation]);
46
+
47
+ // Léger grossissement au milieu de la pulsation ; onde qui s'élargit et s'efface
48
+ const scale = pulsation.interpolate({ inputRange: [0, 0.5, 1], outputRange: [1, 1.12, 1] });
49
+ const ondeScale = pulsation.interpolate({ inputRange: [0, 1], outputRange: [1, 1.4] });
50
+ const ondeOpacite = pulsation.interpolate({ inputRange: [0, 0.01, 1], outputRange: [0, 0.25, 0] });
51
+
52
+ return (
53
+ <View style={styles.zone}>
54
+ <Animated.View
55
+ pointerEvents="none"
56
+ style={[styles.onde, { backgroundColor: primaire, opacity: ondeOpacite, transform: [{ scale: ondeScale }] }]}
57
+ />
58
+ <Animated.View style={{ transform: [{ scale }] }}>
59
+ <Pressable
60
+ accessibilityRole="button"
61
+ accessibilityLabel={traductions.homePageSearchTooltip}
62
+ accessibilityState={{ disabled: onPress == null }}
63
+ disabled={onPress == null}
64
+ hitSlop={6}
65
+ onPress={() => {
66
+ // Recherche utilisée : plus de pulsation
67
+ if (
68
+ configBloc.state instanceof ConfigLoadedState &&
69
+ configBloc.getParamValue(ConfigKey.searchHintCount) !== String(AFFICHAGES_AVEC_PULSATION)
70
+ ) {
71
+ configBloc.add(new ConfigChangeEvent(ConfigKey.searchHintCount, String(AFFICHAGES_AVEC_PULSATION)));
72
+ }
73
+ onPress?.();
74
+ }}
75
+ style={({ pressed }) => [
76
+ styles.pastille,
77
+ { backgroundColor: withAlpha(primaire, pressed ? 0.22 : 0.12), opacity: onPress == null ? 0.4 : 1 },
78
+ ]}
79
+ >
80
+ <MaterialIcons name="search" size={22} color={primaire} />
81
+ </Pressable>
82
+ </Animated.View>
83
+ </View>
84
+ );
85
+ }
86
+
87
+ const styles = StyleSheet.create({
88
+ zone: { width: 48, height: 48, alignItems: 'center', justifyContent: 'center' },
89
+ onde: { position: 'absolute', width: 40, height: 40, borderRadius: 20 },
90
+ pastille: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center' },
91
+ });