@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,23 +1,26 @@
1
1
  import { Image } from 'expo-image';
2
2
  import { useRef } from 'react';
3
- import { Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
4
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
3
+ import { Pressable, ScrollView, StyleSheet, View } from 'react-native';
5
4
 
6
5
  import { Images } from '../../../../core/assets';
7
6
  import { useBloc } from '../../../../core/bloc_react';
8
- import { AppRouter, useAppRouter } from '../../../../core/router';
7
+ import { AppRouter, useAppRouter, type SdkRouter } from '../../../../core/router';
9
8
  import { useTheme } from '../../../../core/theme';
10
9
  import { useAppLocalizations } from '../../../../l10n/localizations';
11
10
  import { ElevatedButton } from '../../../../shared/material/buttons';
12
- import { Card } from '../../../../shared/material/card';
13
11
  import { showModalBottomSheet } from '../../../../shared/material/overlays';
14
12
  import { EmojiSelectWidget } from '../../../../shared/widgets/emoji_select_widget';
15
- import { MenuActionItem, MenuActionsWidget } from '../../../../shared/widgets/menu_actions_widget';
13
+ import { SelectionOption, SelectionBoutons, SelectionSheet } from '../../../../shared/widgets/selection';
16
14
  import { CategorieIconType } from '../../domain/models/categorie';
17
15
  import { CategorieBloc } from '../bloc/categorie_bloc';
18
16
  import { CategorieAddValidationEvent, CategorieEditValidationEvent } from '../bloc/categorie_event';
19
17
  import { CategorieCreationState, CategorieEditState } from '../bloc/categorie_state';
20
18
 
19
+ /** Ouvre la feuille de choix de l'icône d'une catégorie (emoji ou galerie). */
20
+ export function ouvrirIconeCategorie(router: SdkRouter) {
21
+ void showModalBottomSheet(router, { builder: () => <CategorieEditIconOptions /> });
22
+ }
23
+
21
24
  /** Bouton d'édition de l'icône d'une catégorie (création ou modification). */
22
25
  export function CategorieEditIconBtn() {
23
26
  const theme = useTheme();
@@ -25,7 +28,7 @@ export function CategorieEditIconBtn() {
25
28
  return (
26
29
  <Pressable
27
30
  accessibilityRole="button"
28
- onPress={() => void showModalBottomSheet(router, { themed: true, builder: () => <CategorieEditIconOptions /> })}
31
+ onPress={() => ouvrirIconeCategorie(router)}
29
32
  style={[styles.fab, { backgroundColor: theme.colorScheme.surface }]}
30
33
  >
31
34
  <Image source={Images.categorieImageSelect} style={styles.fabIcon} />
@@ -33,13 +36,10 @@ export function CategorieEditIconBtn() {
33
36
  );
34
37
  }
35
38
 
36
- /** Feuille des options d'icône : emoji (ou galerie, non disponible, comme en Flutter) */
39
+ /** Feuille des options d'icône : emoji (ou galerie, non disponible, comme en Flutter). */
37
40
  function CategorieEditIconOptions() {
38
41
  const traductions = useAppLocalizations();
39
- const theme = useTheme();
40
42
  const router = useAppRouter();
41
- const insets = useSafeAreaInsets();
42
- const { height } = useWindowDimensions();
43
43
  const categorieBloc = useBloc(CategorieBloc);
44
44
 
45
45
  const selectEmoji = async () => {
@@ -48,9 +48,9 @@ function CategorieEditIconOptions() {
48
48
  const edit = state instanceof CategorieEditState ? state : null;
49
49
  const command = creation?.command ?? edit?.command;
50
50
  if (!command) return;
51
+ // Nouvelle catégorie : pas encore d'icône ni de couleur
51
52
  const value = await showModalBottomSheet<{ emoji: string; color: number }>(router, {
52
- themed: true,
53
- builder: () => <CategorieEditIconEmoji icon={command.icon!} color={command.color!} />,
53
+ builder: () => <CategorieEditIconEmoji icon={command.icon ?? '🤩'} color={command.color ?? 0xfff9ebc2} />,
54
54
  });
55
55
  if (value == null) return;
56
56
  command.iconType = CategorieIconType.emoji;
@@ -63,58 +63,66 @@ function CategorieEditIconOptions() {
63
63
  };
64
64
 
65
65
  return (
66
- <View style={[styles.sheet, { maxHeight: height * 0.5, backgroundColor: theme.colorScheme.surface, paddingBottom: insets.bottom }]}>
67
- <ScrollView contentContainerStyle={styles.sheetContent}>
68
- <Text style={[theme.textTheme.headlineMedium, styles.title]}>{traductions.categorieFormIconSheetTitle}</Text>
69
- <Card>
70
- <MenuActionsWidget
71
- items={[
72
- // Emoji
73
- new MenuActionItem(Images.categorieIconEmoji, traductions.categorieFormIconSheetEmojiTitle, null, () => void selectEmoji(), {
74
- iconSize: 20,
75
- }),
76
- // Choisir dans la galerie (sans action, comme dans le SDK Flutter)
77
- new MenuActionItem(Images.categorieImageSelect, traductions.categorieFormIconSheetGalleryTitle, null, () => undefined, {
78
- iconSize: 20,
79
- }),
80
- ]}
66
+ <SelectionSheet
67
+ titre={traductions.categorieFormIconSheetTitle}
68
+ contenu={
69
+ <ScrollView bounces={false} contentContainerStyle={styles.optionsContent}>
70
+ {/* Emoji */}
71
+ <SelectionOption
72
+ image={Images.categorieIconEmoji}
73
+ titre={traductions.categorieFormIconSheetEmojiTitle}
74
+ onPress={() => void selectEmoji()}
81
75
  />
82
- </Card>
83
- </ScrollView>
84
- </View>
76
+ <View style={styles.gap10} />
77
+ {/* Choisir dans la galerie (sans action, comme dans le SDK Flutter) */}
78
+ <SelectionOption
79
+ image={Images.categorieImageSelect}
80
+ titre={traductions.categorieFormIconSheetGalleryTitle}
81
+ onPress={() => undefined}
82
+ />
83
+ </ScrollView>
84
+ }
85
+ />
85
86
  );
86
87
  }
87
88
 
88
- /** Feuille de choix de l'emoji et de la couleur ; retourne `{ emoji, color }`. */
89
+ /** Feuille de choix de l'emoji et de la couleur ; retourne `{ emoji, color }` à l'enregistrement. */
89
90
  function CategorieEditIconEmoji({ icon, color }: { icon: string; color: number }) {
90
91
  const traductions = useAppLocalizations();
91
- const theme = useTheme();
92
92
  const router = useAppRouter();
93
- const insets = useSafeAreaInsets();
94
- const { height } = useWindowDimensions();
95
93
  const selection = useRef<{ icon: string; color: number }>({ icon, color });
96
94
 
97
95
  return (
98
- <View style={[styles.sheet, { height: height * 0.8, backgroundColor: theme.colorScheme.surface, paddingBottom: insets.bottom }]}>
99
- <ScrollView contentContainerStyle={styles.sheetContent}>
100
- <EmojiSelectWidget icon={icon} color={color} onChanged={(value) => (selection.current = value)} />
101
- <View style={styles.saveBtn}>
102
- <ElevatedButton
103
- onPress={() => AppRouter.pop(router, { value: { emoji: selection.current.icon, color: selection.current.color } })}
104
- >
105
- {traductions.categorieFormSaveBtn}
106
- </ElevatedButton>
107
- </View>
108
- </ScrollView>
109
- </View>
96
+ <SelectionSheet
97
+ titre={traductions.categorieFormIconSheetEmojiTitle}
98
+ hauteurMax={0.9}
99
+ contenu={
100
+ <>
101
+ <ScrollView bounces={false} style={styles.flexShrink} contentContainerStyle={styles.sheetContent}>
102
+ {/* Emoji et couleur */}
103
+ <EmojiSelectWidget icon={icon} color={color} onChanged={(value) => (selection.current = value)} />
104
+ </ScrollView>
105
+ <SelectionBoutons
106
+ boutons={[
107
+ <ElevatedButton
108
+ key="enregistrer"
109
+ onPress={() => AppRouter.pop(router, { value: { emoji: selection.current.icon, color: selection.current.color } })}
110
+ >
111
+ {traductions.categorieFormSaveBtn}
112
+ </ElevatedButton>,
113
+ ]}
114
+ />
115
+ </>
116
+ }
117
+ />
110
118
  );
111
119
  }
112
120
 
113
121
  const styles = StyleSheet.create({
114
122
  fab: { width: 40, height: 40, borderRadius: 12, alignItems: 'center', justifyContent: 'center' },
115
123
  fabIcon: { width: 24, height: 24 },
116
- sheet: { borderRadius: 20, overflow: 'hidden' },
117
- sheetContent: { padding: 20 },
118
- title: { marginBottom: 20 },
119
- saveBtn: { paddingVertical: 20, paddingHorizontal: 4 },
124
+ flexShrink: { flexShrink: 1 },
125
+ sheetContent: { paddingHorizontal: 20, paddingTop: 4, paddingBottom: 12 },
126
+ optionsContent: { paddingHorizontal: 20, paddingTop: 8, paddingBottom: 16 },
127
+ gap10: { height: 10 },
120
128
  });
@@ -1,16 +1,15 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
- import { Image } from 'expo-image';
3
2
  import type { ReactNode } from 'react';
4
3
  import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
5
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
5
 
7
- import { Images } from '../../../../core/assets';
8
6
  import { useBloc, useBlocBuilder, useBlocListener } from '../../../../core/bloc_react';
9
7
  import { AppRouter, useAppRouter } from '../../../../core/router';
10
8
  import { useTheme } from '../../../../core/theme';
11
9
  import { useAppLocalizations } from '../../../../l10n/localizations';
12
10
  import { ElevatedButton } from '../../../../shared/material/buttons';
13
11
  import { CustomTextInput } from '../../../../shared/widgets/input_text';
12
+ import { SelectionBoutons } from '../../../../shared/widgets/selection';
14
13
  import { Categorie } from '../../domain/models/categorie';
15
14
  import { CategorieCreateCommandError, CategorieUpdateCommandError } from '../../domain/models/categorie_commands';
16
15
  import { argbToCss } from '../../domain/models/categorie_icons';
@@ -23,26 +22,38 @@ import {
23
22
  CategorieUpdateEvent,
24
23
  } from '../bloc/categorie_event';
25
24
  import { CategorieCreationState, CategorieEditState, CategorieInitialState } from '../bloc/categorie_state';
26
- import { CategorieEditIconBtn } from './categorie_edit_icon_btn';
27
- import { CategorieIcon } from './categorie_icon';
25
+ import { ouvrirIconeCategorie } from './categorie_edit_icon_btn';
26
+ import { CategoriePastille } from './categorie_icon';
28
27
 
29
- /** Squelette commun : en-tête coloré (icône + titre + bouton icône), formulaire, bouton. */
28
+ /** Couleur ARGB d'une catégorie avec l'opacité [alpha] (0 à 1), en CSS. */
29
+ function argbAvecAlpha(argb: number | null | undefined, alpha: number): string | undefined {
30
+ const rgb = (argb ?? 0xfff9ebc2) & 0xffffff;
31
+ return argbToCss(((Math.round(alpha * 255) << 24) | rgb) >>> 0);
32
+ }
33
+
34
+ /**
35
+ * Squelette commun : aperçu de l'icône (toucher pour la changer), titre,
36
+ * formulaire, puis bouton fixé en bas.
37
+ */
30
38
  function CategorieFormLayout({
31
- header,
39
+ icon,
40
+ couleur,
32
41
  title,
33
42
  form,
34
43
  button,
35
44
  }: {
36
- header: ReactNode;
45
+ icon?: string | null;
46
+ couleur?: number | null;
37
47
  title: string;
38
48
  form: ReactNode;
39
49
  button: ReactNode;
40
50
  }) {
41
51
  const theme = useTheme();
52
+ const router = useAppRouter();
42
53
  const insets = useSafeAreaInsets();
43
54
  const categorieBloc = useBloc(CategorieBloc);
44
55
  return (
45
- <View style={[styles.flex, { backgroundColor: theme.secondaryHeaderColor }]}>
56
+ <View style={[styles.flex, { paddingBottom: insets.bottom }]}>
46
57
  <View style={styles.backRow}>
47
58
  <Pressable
48
59
  accessibilityRole="button"
@@ -53,23 +64,22 @@ function CategorieFormLayout({
53
64
  <MaterialIcons name="arrow-back" size={24} color={theme.colorScheme.onSurface} />
54
65
  </Pressable>
55
66
  </View>
56
- {/* Icône et titre */}
57
- <View style={styles.header}>
58
- <View style={styles.center}>{header}</View>
59
- <View style={styles.titleRow}>
60
- <Text numberOfLines={1} style={[theme.textTheme.titleSmall, styles.flex]}>
61
- {title}
62
- </Text>
63
- <CategorieEditIconBtn />
64
- </View>
65
- </View>
66
- {/* Formulaire */}
67
- <ScrollView style={[styles.flex, { backgroundColor: theme.scaffoldBackgroundColor }]} contentContainerStyle={styles.form}>
67
+ <ScrollView style={styles.flex} contentContainerStyle={styles.form}>
68
+ {/* Aperçu de l'icône, toucher pour la changer */}
69
+ <Pressable accessibilityRole="button" onPress={() => ouvrirIconeCategorie(router)} style={styles.apercu}>
70
+ <CategoriePastille icon={icon} bgColor={couleur} taille={112} />
71
+ {/* Badge modifier */}
72
+ <View style={[styles.badge, { backgroundColor: theme.colorScheme.primary, borderColor: theme.scaffoldBackgroundColor }]}>
73
+ <MaterialIcons name="edit" size={16} color={theme.colorScheme.onPrimary} />
74
+ </View>
75
+ </Pressable>
76
+ {/* Titre */}
77
+ <Text numberOfLines={1} style={[theme.textTheme.titleSmall, styles.titre]}>
78
+ {title}
79
+ </Text>
68
80
  {form}
69
81
  </ScrollView>
70
- <View style={[styles.button, { backgroundColor: theme.scaffoldBackgroundColor, paddingBottom: 20 + insets.bottom }]}>
71
- {button}
72
- </View>
82
+ <SelectionBoutons boutons={[button]} />
73
83
  </View>
74
84
  );
75
85
  }
@@ -89,7 +99,8 @@ export function CategorieAddPage() {
89
99
 
90
100
  return (
91
101
  <CategorieFormLayout
92
- header={<Image source={Images.categorie} style={styles.addIllustration} contentFit="contain" />}
102
+ icon={command.icon}
103
+ couleur={command.color}
93
104
  title={traductions.categorieCustomAdd}
94
105
  form={
95
106
  <>
@@ -122,9 +133,16 @@ export function CategorieAddPage() {
122
133
  command.color = c.bgColor;
123
134
  categorieBloc.add(new CategorieAddValidationEvent(command));
124
135
  }}
125
- style={[styles.chip, { backgroundColor: theme.secondaryHeaderColor, borderRadius: theme.chipTheme.borderRadius }]}
136
+ style={[
137
+ styles.chip,
138
+ {
139
+ backgroundColor: argbAvecAlpha(c.bgColor, 0.18),
140
+ borderColor: argbAvecAlpha(c.bgColor, 0.6),
141
+ },
142
+ ]}
126
143
  >
127
- <Text style={theme.chipTheme.labelStyle}>{c.label}</Text>
144
+ <CategoriePastille icon={c.icon} bgColor={c.bgColor} taille={26} />
145
+ <Text style={[theme.textTheme.displayMedium, styles.chipTexte]}>{c.label}</Text>
128
146
  </Pressable>
129
147
  ))}
130
148
  </View>
@@ -132,6 +150,7 @@ export function CategorieAddPage() {
132
150
  }
133
151
  button={
134
152
  <ElevatedButton
153
+ key="creer"
135
154
  onPress={() => {
136
155
  if (command.isValid()) categorieBloc.add(new CategorieCreateEvent(command));
137
156
  }}
@@ -156,13 +175,7 @@ export function CategorieEditPage() {
156
175
  const { categorie, command } = state;
157
176
 
158
177
  return (
159
- <CategorieFormLayout
160
- header={
161
- <View style={[styles.editIcon, { backgroundColor: argbToCss(command.color) }]}>
162
- <CategorieIcon icon={command.icon!} size={96} emojiSize={64} />
163
- </View>
164
- }
165
- title={categorie.label}
178
+ <CategorieFormLayout icon={command.icon} couleur={command.color} title={categorie.label}
166
179
  form={
167
180
  <View style={styles.input}>
168
181
  <CustomTextInput
@@ -178,6 +191,7 @@ export function CategorieEditPage() {
178
191
  }
179
192
  button={
180
193
  <ElevatedButton
194
+ key="enregistrer"
181
195
  onPress={() => {
182
196
  if (command.isValid()) categorieBloc.add(new CategorieUpdateEvent(command, categorie));
183
197
  }}
@@ -193,14 +207,30 @@ const styles = StyleSheet.create({
193
207
  flex: { flex: 1 },
194
208
  backRow: { flexDirection: 'row' },
195
209
  back: { padding: 12 },
196
- header: { height: 200, paddingHorizontal: 20, paddingBottom: 20, justifyContent: 'space-between' },
197
- center: { alignItems: 'center' },
198
- titleRow: { flexDirection: 'row', alignItems: 'center' },
199
- addIllustration: { width: 128, height: 110 },
200
- editIcon: { borderRadius: 999, paddingVertical: 10, paddingHorizontal: 15, alignItems: 'center', justifyContent: 'center' },
201
210
  form: { paddingHorizontal: 20, paddingBottom: 20 },
202
- input: { paddingVertical: 20 },
211
+ apercu: { alignSelf: 'center' },
212
+ badge: {
213
+ position: 'absolute',
214
+ right: 0,
215
+ bottom: 0,
216
+ width: 36,
217
+ height: 36,
218
+ borderRadius: 18,
219
+ borderWidth: 3,
220
+ alignItems: 'center',
221
+ justifyContent: 'center',
222
+ },
223
+ titre: { textAlign: 'center', marginTop: 14 },
224
+ input: { paddingTop: 24, paddingBottom: 16 },
203
225
  chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
204
- chip: { paddingHorizontal: 12, paddingVertical: 8 },
205
- button: { padding: 20 },
226
+ chip: {
227
+ flexDirection: 'row',
228
+ alignItems: 'center',
229
+ paddingLeft: 4,
230
+ paddingRight: 12,
231
+ paddingVertical: 4,
232
+ borderRadius: 999,
233
+ borderWidth: 1,
234
+ },
235
+ chipTexte: { marginLeft: 8, fontWeight: '600' },
206
236
  });
@@ -1,6 +1,8 @@
1
1
  import { Image } from 'expo-image';
2
2
  import { StyleSheet, Text, View } from 'react-native';
3
3
 
4
+ import { Images } from '../../../../core/assets';
5
+ import { useTheme } from '../../../../core/theme';
4
6
  import { argbToCss, categorieIconSource, isAssetIcon } from '../../domain/models/categorie_icons';
5
7
 
6
8
  /** Icône d'une catégorie (image ou emoji), éventuellement dans un cercle coloré. */
@@ -33,6 +35,30 @@ export function CategorieIconCircle({ icon, bgColor }: { icon: string; bgColor?:
33
35
  );
34
36
  }
35
37
 
38
+ /**
39
+ * Pastille ronde d'une catégorie : [icon] (image ou emoji) sur sa
40
+ * [bgColor]. Sans [icon], l'illustration par défaut des catégories.
41
+ */
42
+ export function CategoriePastille({ icon, bgColor, taille = 44 }: { icon?: string | null; bgColor?: number | null; taille?: number }) {
43
+ const theme = useTheme();
44
+ return (
45
+ <View
46
+ style={[
47
+ styles.pastille,
48
+ { width: taille, height: taille, borderRadius: taille / 2 },
49
+ { backgroundColor: bgColor != null ? argbToCss(bgColor) : theme.colorScheme.surface },
50
+ ]}
51
+ >
52
+ {icon == null ? (
53
+ <Image source={Images.categorie} style={{ width: taille * 0.7, height: taille * 0.7 }} contentFit="contain" />
54
+ ) : (
55
+ <CategorieIcon icon={icon} size={taille * 0.5} emojiSize={taille * 0.48} />
56
+ )}
57
+ </View>
58
+ );
59
+ }
60
+
36
61
  const styles = StyleSheet.create({
62
+ pastille: { alignItems: 'center', justifyContent: 'center' },
37
63
  circle: { width: 45, height: 45, borderRadius: 22.5, alignItems: 'center', justifyContent: 'center' },
38
64
  });
@@ -5,27 +5,34 @@ import { Pressable, StyleSheet, Text, View } from 'react-native';
5
5
  import { useBloc } from '../../../../core/bloc_react';
6
6
  import { Themer, useTheme } from '../../../../core/theme';
7
7
  import { useAppLocalizations } from '../../../../l10n/localizations';
8
- import { TextButton } from '../../../../shared/material/buttons';
9
8
  import { Card } from '../../../../shared/material/card';
9
+ import { withAlpha } from '../../../../shared/utils/color';
10
10
  import type { Categorie } from '../../domain/models/categorie';
11
11
  import { CategorieBloc } from '../bloc/categorie_bloc';
12
12
  import { CategorieEditEvent } from '../bloc/categorie_event';
13
- import { CategorieIconCircle } from './categorie_icon';
13
+ import { CategoriePastille } from './categorie_icon';
14
14
 
15
- /** Liste de catégories à cocher (avec bouton « Modifier » si [editable]). */
15
+ /**
16
+ * Liste de catégories dans une carte : pastille, nom, bouton de
17
+ * modification si [editable] et, en sélection multiple, rond coché. En
18
+ * [selectionUnique], toucher une ligne la choisit (sans rond).
19
+ */
16
20
  export function CategorieListeWidget({
17
21
  liste,
18
22
  defaultSelectedCategories,
19
23
  onSelectionChanged,
20
24
  editable,
25
+ selectionUnique = false,
21
26
  }: {
22
27
  liste: readonly Categorie[];
23
28
  defaultSelectedCategories: string[];
24
29
  onSelectionChanged: (categorie: Categorie, checked: boolean) => void;
25
30
  editable?: boolean;
31
+ selectionUnique?: boolean;
26
32
  }) {
27
33
  const traductions = useAppLocalizations();
28
34
  const theme = useTheme();
35
+ const primaire = theme.colorScheme.primary;
29
36
  const categorieBloc = useBloc(CategorieBloc);
30
37
  // Catégories sélectionnées
31
38
  const [selected, setSelected] = useState<string[]>(() =>
@@ -33,39 +40,51 @@ export function CategorieListeWidget({
33
40
  );
34
41
 
35
42
  return (
36
- <Card>
43
+ <Card style={styles.carte}>
37
44
  <View style={styles.list}>
38
45
  {liste.map((categorie) => {
39
46
  const checked = selected.includes(categorie.id);
47
+ const marquee = checked && !selectionUnique;
40
48
  return (
41
49
  <Pressable
42
50
  key={categorie.id}
43
- accessibilityRole="checkbox"
51
+ accessibilityRole={selectionUnique ? 'button' : 'checkbox'}
44
52
  accessibilityState={{ checked }}
45
53
  onPress={() => {
46
- const value = !checked;
54
+ const value = selectionUnique ? true : !checked;
47
55
  setSelected((s) => (value ? [...s, categorie.id] : s.filter((id) => id !== categorie.id)));
48
56
  onSelectionChanged(categorie, value);
49
57
  }}
50
- style={styles.row}
58
+ style={({ pressed }) => [
59
+ styles.row,
60
+ { backgroundColor: marquee ? withAlpha(primaire, 0.08) : pressed ? theme.colorScheme.secondary : 'transparent' },
61
+ ]}
51
62
  >
52
- <MaterialIcons
53
- name={checked ? 'check-box' : 'check-box-outline-blank'}
54
- size={24}
55
- color={checked ? theme.colorScheme.primary : Themer.neural02Color}
56
- />
57
- <View style={styles.gap12} />
58
- <CategorieIconCircle icon={categorie.icon} bgColor={categorie.bgColor} />
59
- <View style={styles.gap12} />
63
+ <CategoriePastille icon={categorie.icon} bgColor={categorie.bgColor} />
60
64
  {/* Libellé */}
61
- <Text numberOfLines={1} style={[theme.textTheme.headlineSmall, styles.flex]}>
62
- {` ${categorie.label}`}
65
+ <Text numberOfLines={1} style={[theme.textTheme.displayLarge, styles.label, { fontWeight: marquee ? '700' : '500' }]}>
66
+ {categorie.label}
63
67
  </Text>
64
68
  {/* Bouton modifier */}
65
69
  {editable === true && (
66
- <TextButton onPress={() => categorieBloc.add(new CategorieEditEvent(categorie))}>
67
- {traductions.categorieEditBtn}
68
- </TextButton>
70
+ <Pressable
71
+ accessibilityRole="button"
72
+ accessibilityLabel={traductions.categorieEditBtn}
73
+ hitSlop={8}
74
+ style={styles.modifier}
75
+ onPress={() => categorieBloc.add(new CategorieEditEvent(categorie))}
76
+ >
77
+ <MaterialIcons name="edit" size={20} color={Themer.neural03Color} />
78
+ </Pressable>
79
+ )}
80
+ {/* Sélection multiple : rond coché */}
81
+ {!selectionUnique && (
82
+ <MaterialIcons
83
+ name={checked ? 'check-circle' : 'radio-button-unchecked'}
84
+ size={22}
85
+ color={checked ? primaire : Themer.neural03Color}
86
+ style={styles.coche}
87
+ />
69
88
  )}
70
89
  </Pressable>
71
90
  );
@@ -76,8 +95,10 @@ export function CategorieListeWidget({
76
95
  }
77
96
 
78
97
  const styles = StyleSheet.create({
79
- list: { paddingVertical: 8 },
80
- row: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 8 },
81
- gap12: { width: 12 },
82
- flex: { flex: 1 },
98
+ carte: { margin: 0 },
99
+ list: { padding: 6 },
100
+ row: { flexDirection: 'row', alignItems: 'center', marginVertical: 1, paddingHorizontal: 8, paddingVertical: 8, borderRadius: 14 },
101
+ label: { flex: 1, marginLeft: 14 },
102
+ modifier: { padding: 8 },
103
+ coche: { marginHorizontal: 4 },
83
104
  });
@@ -2,17 +2,15 @@ import { MaterialIcons } from '@expo/vector-icons';
2
2
  import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
- import { useBloc, useBlocBuilder, useBlocListener } from '../../../../core/bloc_react';
5
+ import { useBloc, useBlocListener } from '../../../../core/bloc_react';
6
6
  import { AppRouter, useAppRouter } from '../../../../core/router';
7
- import { Themer, useTheme } from '../../../../core/theme';
7
+ import { useTheme } from '../../../../core/theme';
8
8
  import { useAppLocalizations } from '../../../../l10n/localizations';
9
- import { Card } from '../../../../shared/material/card';
10
- import { Divider } from '../../../../shared/material/divider';
11
- import { Categorie } from '../../domain/models/categorie';
9
+ import type { Categorie } from '../../domain/models/categorie';
12
10
  import { CategorieBloc } from '../bloc/categorie_bloc';
13
- import { CategorieAddEvent, CategorieListEvent } from '../bloc/categorie_event';
11
+ import { CategorieListEvent } from '../bloc/categorie_event';
14
12
  import { CategorieCreationState, CategorieEditState, CategorieInitialState } from '../bloc/categorie_state';
15
- import { CategorieListeWidget } from './categorie_liste_widget';
13
+ import { CategorieSelectWidget } from './categorie_select_widget';
16
14
 
17
15
  /** Choix d'une catégorie : la catégorie choisie est retournée à l'écran appelant. */
18
16
  export function CategorieSelectPage() {
@@ -21,7 +19,6 @@ export function CategorieSelectPage() {
21
19
  const router = useAppRouter();
22
20
  const insets = useSafeAreaInsets();
23
21
  const categorieBloc = useBloc(CategorieBloc);
24
- const state = useBlocBuilder(categorieBloc);
25
22
 
26
23
  useBlocListener(
27
24
  categorieBloc,
@@ -54,39 +51,10 @@ export function CategorieSelectPage() {
54
51
  <MaterialIcons name="arrow-back" size={24} color={theme.colorScheme.onSurface} />
55
52
  </Pressable>
56
53
  </View>
54
+ {/* Titre */}
55
+ <Text style={[theme.textTheme.headlineLarge, styles.titre]}>{traductions.categorieSelectionUniqueTitle}</Text>
57
56
  <ScrollView contentContainerStyle={styles.content}>
58
- {/* Catégories personnalisées */}
59
- <Text style={theme.textTheme.headlineSmall}>{traductions.categorieCustomTitle}</Text>
60
- <View style={styles.gap14} />
61
- <Card>
62
- {/* Bouton ajouter */}
63
- <Pressable accessibilityRole="button" onPress={() => categorieBloc.add(new CategorieAddEvent())} style={styles.addRow}>
64
- <View style={[styles.addIcon, { backgroundColor: theme.colorScheme.surface }]}>
65
- <MaterialIcons name="add" size={24} color={theme.colorScheme.onSurface} />
66
- </View>
67
- <Text style={theme.textTheme.headlineSmall}>{traductions.categorieCustomAdd}</Text>
68
- </Pressable>
69
- {/* Catégories personnalisées */}
70
- {state.categories.length > 0 && (
71
- <>
72
- <View style={styles.divider}>
73
- <Divider color={Themer.neural01Color} />
74
- </View>
75
- <CategorieListeWidget
76
- key={state.categories.map((c) => c.id + c.label).join()}
77
- liste={state.categories}
78
- editable
79
- defaultSelectedCategories={[]}
80
- onSelectionChanged={onSelected}
81
- />
82
- </>
83
- )}
84
- </Card>
85
- <View style={styles.gap32} />
86
- {/* Catégories par défaut */}
87
- <Text style={theme.textTheme.headlineSmall}>{traductions.categorieDefaultTitle}</Text>
88
- <View style={styles.gap14} />
89
- <CategorieListeWidget liste={Categorie.defaultListe} defaultSelectedCategories={[]} onSelectionChanged={onSelected} />
57
+ <CategorieSelectWidget canAdd editable showTitles selectionUnique selectedCategories={[]} onSelectionChanged={onSelected} />
90
58
  </ScrollView>
91
59
  </View>
92
60
  );
@@ -96,10 +64,6 @@ const styles = StyleSheet.create({
96
64
  flex: { flex: 1 },
97
65
  backRow: { flexDirection: 'row' },
98
66
  back: { padding: 12 },
99
- content: { paddingHorizontal: 12, paddingTop: 12 },
100
- addRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 16, gap: 16 },
101
- addIcon: { width: 45, height: 45, borderRadius: 14, alignItems: 'center', justifyContent: 'center' },
102
- divider: { paddingHorizontal: 16 },
103
- gap14: { height: 14 },
104
- gap32: { height: 32 },
67
+ titre: { paddingHorizontal: 20, paddingBottom: 16 },
68
+ content: { paddingHorizontal: 16, paddingBottom: 20 },
105
69
  });