@pi-spi/app 1.5.1 → 2.0.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 (180) hide show
  1. package/README.md +64 -30
  2. package/example/App.tsx +27 -24
  3. package/lib/module/core/assets.js +0 -7
  4. package/lib/module/core/assets.js.map +1 -1
  5. package/lib/module/core/di.js +17 -8
  6. package/lib/module/core/di.js.map +1 -1
  7. package/lib/module/core/pi_spi_custom_theme.js +22 -10
  8. package/lib/module/core/pi_spi_custom_theme.js.map +1 -1
  9. package/lib/module/core/pi_spi_sdk_config.js +22 -8
  10. package/lib/module/core/pi_spi_sdk_config.js.map +1 -1
  11. package/lib/module/core/theme.js +345 -225
  12. package/lib/module/core/theme.js.map +1 -1
  13. package/lib/module/index.js +1 -1
  14. package/lib/module/index.js.map +1 -1
  15. package/lib/module/l10n/app_localizations.js.map +1 -1
  16. package/lib/module/l10n/app_localizations_en.js +26 -1
  17. package/lib/module/l10n/app_localizations_en.js.map +1 -1
  18. package/lib/module/l10n/app_localizations_fr.js +26 -1
  19. package/lib/module/l10n/app_localizations_fr.js.map +1 -1
  20. package/lib/module/l10n/app_localizations_pt.js +26 -1
  21. package/lib/module/l10n/app_localizations_pt.js.map +1 -1
  22. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js +15 -19
  23. package/lib/module/modules/alias/presentation/pages/alias_delete_btn_widget.js.map +1 -1
  24. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js +4 -11
  25. package/lib/module/modules/alias/presentation/pages/alias_page_claim.js.map +1 -1
  26. package/lib/module/modules/compte/presentation/pages/compte_details_widget.js +6 -7
  27. package/lib/module/modules/compte/presentation/pages/compte_details_widget.js.map +1 -1
  28. package/lib/module/modules/config/domain/models/config_keys.js +3 -1
  29. package/lib/module/modules/config/domain/models/config_keys.js.map +1 -1
  30. package/lib/module/modules/config/domain/services/config_service.js +31 -2
  31. package/lib/module/modules/config/domain/services/config_service.js.map +1 -1
  32. package/lib/module/modules/home/presentation/pages/home_tab_compte.js +0 -1
  33. package/lib/module/modules/home/presentation/pages/home_tab_compte.js.map +1 -1
  34. package/lib/module/modules/home/presentation/pages/home_tab_compte_more_menu.js +38 -37
  35. package/lib/module/modules/home/presentation/pages/home_tab_compte_more_menu.js.map +1 -1
  36. package/lib/module/modules/profile/presentation/pages/compte/profile_compte_page.js +25 -11
  37. package/lib/module/modules/profile/presentation/pages/compte/profile_compte_page.js.map +1 -1
  38. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page.js +14 -20
  39. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page.js.map +1 -1
  40. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js +109 -103
  41. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.js.map +1 -1
  42. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js +55 -72
  43. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.js.map +1 -1
  44. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_qrcode.js +31 -45
  45. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_qrcode.js.map +1 -1
  46. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_theme.js +175 -203
  47. package/lib/module/modules/profile/presentation/pages/parametre/profile_parametre_page_theme.js.map +1 -1
  48. package/lib/module/modules/profile/presentation/pages/profile_app_bar.js +26 -0
  49. package/lib/module/modules/profile/presentation/pages/profile_app_bar.js.map +1 -0
  50. package/lib/module/modules/profile/presentation/pages/profile_menu.js +144 -34
  51. package/lib/module/modules/profile/presentation/pages/profile_menu.js.map +1 -1
  52. package/lib/module/modules/profile/presentation/pages/profile_page.js +95 -63
  53. package/lib/module/modules/profile/presentation/pages/profile_page.js.map +1 -1
  54. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js +97 -45
  55. package/lib/module/modules/profile/presentation/pages/profile_page_avatar.js.map +1 -1
  56. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js +9 -8
  57. package/lib/module/modules/profile/presentation/pages/profile_page_contacts.js.map +1 -1
  58. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js +26 -2
  59. package/lib/module/modules/search/presentation/pages/search_fonctionnalites.js.map +1 -1
  60. package/lib/module/modules/search/presentation/pages/search_page.js +0 -1
  61. package/lib/module/modules/search/presentation/pages/search_page.js.map +1 -1
  62. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_recu.js +3 -1
  63. package/lib/module/modules/transactions/presentation/pages/transaction_details/transaction_details_page_recu.js.map +1 -1
  64. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page.js +4 -11
  65. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page.js.map +1 -1
  66. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js +13 -10
  67. package/lib/module/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.js.map +1 -1
  68. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page_filters.js +5 -4
  69. package/lib/module/modules/transactions/presentation/pages/transaction_search/transaction_search_page_filters.js.map +1 -1
  70. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js +2 -2
  71. package/lib/module/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.js.map +1 -1
  72. package/lib/module/pi_spi_sdk_entry.js +7 -2
  73. package/lib/module/pi_spi_sdk_entry.js.map +1 -1
  74. package/lib/module/shared/utils/color.js +15 -0
  75. package/lib/module/shared/utils/color.js.map +1 -0
  76. package/lib/module/shared/widgets/custom_progressbar.js +3 -2
  77. package/lib/module/shared/widgets/custom_progressbar.js.map +1 -1
  78. package/lib/module/shared/widgets/error_card_widget.js +70 -0
  79. package/lib/module/shared/widgets/error_card_widget.js.map +1 -0
  80. package/lib/module/shared/widgets/selection.js +136 -0
  81. package/lib/module/shared/widgets/selection.js.map +1 -0
  82. package/lib/typescript/src/core/assets.d.ts +0 -7
  83. package/lib/typescript/src/core/assets.d.ts.map +1 -1
  84. package/lib/typescript/src/core/di.d.ts.map +1 -1
  85. package/lib/typescript/src/core/pi_spi_custom_theme.d.ts +17 -8
  86. package/lib/typescript/src/core/pi_spi_custom_theme.d.ts.map +1 -1
  87. package/lib/typescript/src/core/pi_spi_sdk_config.d.ts +22 -8
  88. package/lib/typescript/src/core/pi_spi_sdk_config.d.ts.map +1 -1
  89. package/lib/typescript/src/core/theme.d.ts +123 -53
  90. package/lib/typescript/src/core/theme.d.ts.map +1 -1
  91. package/lib/typescript/src/index.d.ts +1 -1
  92. package/lib/typescript/src/index.d.ts.map +1 -1
  93. package/lib/typescript/src/l10n/app_localizations.d.ts +50 -0
  94. package/lib/typescript/src/l10n/app_localizations.d.ts.map +1 -1
  95. package/lib/typescript/src/l10n/app_localizations_en.d.ts.map +1 -1
  96. package/lib/typescript/src/l10n/app_localizations_fr.d.ts.map +1 -1
  97. package/lib/typescript/src/l10n/app_localizations_pt.d.ts.map +1 -1
  98. package/lib/typescript/src/modules/alias/presentation/pages/alias_delete_btn_widget.d.ts.map +1 -1
  99. package/lib/typescript/src/modules/alias/presentation/pages/alias_page_claim.d.ts.map +1 -1
  100. package/lib/typescript/src/modules/compte/presentation/pages/compte_details_widget.d.ts.map +1 -1
  101. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts +3 -1
  102. package/lib/typescript/src/modules/config/domain/models/config_keys.d.ts.map +1 -1
  103. package/lib/typescript/src/modules/config/domain/services/config_service.d.ts +7 -0
  104. package/lib/typescript/src/modules/config/domain/services/config_service.d.ts.map +1 -1
  105. package/lib/typescript/src/modules/home/presentation/pages/home_tab_compte_more_menu.d.ts +2 -0
  106. package/lib/typescript/src/modules/home/presentation/pages/home_tab_compte_more_menu.d.ts.map +1 -1
  107. package/lib/typescript/src/modules/profile/presentation/pages/compte/profile_compte_page.d.ts.map +1 -1
  108. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page.d.ts.map +1 -1
  109. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.d.ts.map +1 -1
  110. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.d.ts.map +1 -1
  111. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page_qrcode.d.ts.map +1 -1
  112. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page_theme.d.ts +1 -1
  113. package/lib/typescript/src/modules/profile/presentation/pages/parametre/profile_parametre_page_theme.d.ts.map +1 -1
  114. package/lib/typescript/src/modules/profile/presentation/pages/profile_app_bar.d.ts +5 -0
  115. package/lib/typescript/src/modules/profile/presentation/pages/profile_app_bar.d.ts.map +1 -0
  116. package/lib/typescript/src/modules/profile/presentation/pages/profile_menu.d.ts +31 -4
  117. package/lib/typescript/src/modules/profile/presentation/pages/profile_menu.d.ts.map +1 -1
  118. package/lib/typescript/src/modules/profile/presentation/pages/profile_page.d.ts +4 -1
  119. package/lib/typescript/src/modules/profile/presentation/pages/profile_page.d.ts.map +1 -1
  120. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_avatar.d.ts +1 -1
  121. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_avatar.d.ts.map +1 -1
  122. package/lib/typescript/src/modules/profile/presentation/pages/profile_page_contacts.d.ts.map +1 -1
  123. package/lib/typescript/src/modules/search/presentation/pages/search_fonctionnalites.d.ts.map +1 -1
  124. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page.d.ts.map +1 -1
  125. package/lib/typescript/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.d.ts.map +1 -1
  126. package/lib/typescript/src/shared/utils/color.d.ts +7 -0
  127. package/lib/typescript/src/shared/utils/color.d.ts.map +1 -0
  128. package/lib/typescript/src/shared/widgets/custom_progressbar.d.ts.map +1 -1
  129. package/lib/typescript/src/shared/widgets/error_card_widget.d.ts +11 -0
  130. package/lib/typescript/src/shared/widgets/error_card_widget.d.ts.map +1 -0
  131. package/lib/typescript/src/shared/widgets/selection.d.ts +21 -0
  132. package/lib/typescript/src/shared/widgets/selection.d.ts.map +1 -0
  133. package/package.json +1 -1
  134. package/src/core/assets.ts +0 -7
  135. package/src/core/di.ts +13 -8
  136. package/src/core/pi_spi_custom_theme.ts +22 -15
  137. package/src/core/pi_spi_sdk_config.ts +27 -9
  138. package/src/core/theme.ts +381 -269
  139. package/src/index.ts +1 -1
  140. package/src/l10n/app_localizations.ts +50 -0
  141. package/src/l10n/app_localizations_en.ts +25 -0
  142. package/src/l10n/app_localizations_fr.ts +25 -0
  143. package/src/l10n/app_localizations_pt.ts +25 -0
  144. package/src/modules/alias/presentation/pages/alias_delete_btn_widget.tsx +13 -12
  145. package/src/modules/alias/presentation/pages/alias_page_claim.tsx +5 -4
  146. package/src/modules/compte/presentation/pages/compte_details_widget.tsx +3 -4
  147. package/src/modules/config/domain/models/config_keys.ts +3 -1
  148. package/src/modules/config/domain/services/config_service.ts +31 -2
  149. package/src/modules/home/presentation/pages/home_tab_compte.tsx +1 -1
  150. package/src/modules/home/presentation/pages/home_tab_compte_more_menu.tsx +34 -42
  151. package/src/modules/profile/presentation/pages/compte/profile_compte_page.tsx +15 -7
  152. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page.tsx +12 -17
  153. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications.tsx +89 -68
  154. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_notifications_son.tsx +84 -54
  155. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_qrcode.tsx +28 -24
  156. package/src/modules/profile/presentation/pages/parametre/profile_parametre_page_theme.tsx +121 -131
  157. package/src/modules/profile/presentation/pages/profile_app_bar.tsx +21 -0
  158. package/src/modules/profile/presentation/pages/profile_menu.tsx +126 -33
  159. package/src/modules/profile/presentation/pages/profile_page.tsx +90 -66
  160. package/src/modules/profile/presentation/pages/profile_page_avatar.tsx +69 -28
  161. package/src/modules/profile/presentation/pages/profile_page_contacts.tsx +5 -4
  162. package/src/modules/search/presentation/pages/search_fonctionnalites.ts +40 -7
  163. package/src/modules/search/presentation/pages/search_page.tsx +1 -1
  164. package/src/modules/transactions/presentation/pages/transaction_details/transaction_details_page_recu.tsx +3 -1
  165. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page.tsx +2 -4
  166. package/src/modules/transactions/presentation/pages/transaction_rtp/transaction_rtp_page_actions.tsx +13 -6
  167. package/src/modules/transactions/presentation/pages/transaction_search/transaction_search_page_filters.tsx +4 -4
  168. package/src/modules/transactions/presentation/pages/transaction_split/transaction_split_page_repartition.tsx +2 -2
  169. package/src/pi_spi_sdk_entry.tsx +9 -2
  170. package/src/shared/utils/color.ts +14 -0
  171. package/src/shared/widgets/custom_progressbar.tsx +3 -2
  172. package/src/shared/widgets/error_card_widget.tsx +58 -0
  173. package/src/shared/widgets/selection.tsx +98 -0
  174. package/assets/images/theme_light_blue.jpeg +0 -0
  175. package/assets/images/theme_light_green.jpeg +0 -0
  176. package/assets/images/theme_light_orange.jpeg +0 -0
  177. package/assets/images/theme_light_pink.jpeg +0 -0
  178. package/assets/images/theme_light_purple.jpeg +0 -0
  179. package/assets/images/theme_light_red.jpeg +0 -0
  180. package/assets/images/theme_light_yellow.jpeg +0 -0
@@ -1,4 +1,3 @@
1
- import { MaterialIcons } from '@expo/vector-icons';
2
1
  import { Image } from 'expo-image';
3
2
  import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
4
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
@@ -10,12 +9,13 @@ import { AppRouter, useAppRouter } from '../../../../../core/router';
10
9
  import { Themer, useTheme } from '../../../../../core/theme';
11
10
  import { useAppLocalizations } from '../../../../../l10n/localizations';
12
11
  import { Card } from '../../../../../shared/material/card';
13
- import { MenuActionItem, MenuActionsWidget } from '../../../../../shared/widgets/menu_actions_widget';
12
+ import { AppBar } from '../../../../../shared/material/scaffold';
14
13
  import { ConfigBloc } from '../../../../config/adapters/ui/bloc/config_bloc';
15
14
  import { ConfigChangeEvent } from '../../../../config/adapters/ui/bloc/config_event';
16
15
  import { ConfigLoadedState } from '../../../../config/adapters/ui/bloc/config_state';
17
16
  import { ConfigKey } from '../../../../config/domain/models/config_keys';
18
- import { SettingToggle } from './settings_widgets';
17
+ import { ProfileMenuTile, ProfilePageMenu, ProfileSectionTitre } from '../profile_menu';
18
+ import { SwitchThemed } from './settings_widgets';
19
19
 
20
20
  const NOTIFICATION_KEYS = [
21
21
  ConfigKey.notificationStatus,
@@ -58,88 +58,107 @@ export function ProfileParametrePageNotifications() {
58
58
  },
59
59
  ];
60
60
 
61
+ const basculerNotifications = () =>
62
+ configBloc.add(new ConfigChangeEvent(ConfigKey.notificationStatus, enabled ? 'disabled' : 'enabled'));
63
+ const basculerVibration = () =>
64
+ configBloc.add(new ConfigChangeEvent(ConfigKey.notificationAlertVibration, vibrationEnabled ? 'disabled' : 'enabled'));
65
+
61
66
  return (
62
67
  <View style={[styles.flex, { paddingBottom: insets.bottom }]}>
63
- <View style={styles.backRow}>
64
- <Pressable accessibilityRole="button" hitSlop={12} style={styles.back} onPress={() => AppRouter.pop(router)}>
65
- <MaterialIcons name="arrow-back" size={24} color={theme.colorScheme.onSurface} />
66
- </Pressable>
67
- </View>
68
+ {/* Titre dans la barre, comme les autres pages (dans la feuille : fond de la feuille) */}
69
+ <AppBar
70
+ backgroundColor="transparent"
71
+ onBack={() => AppRouter.pop(router)}
72
+ title={
73
+ <Text numberOfLines={1} style={theme.textTheme.headlineMedium}>
74
+ {traductions.appSettingPageMenuNotificationTitle}
75
+ </Text>
76
+ }
77
+ />
68
78
  <ScrollView style={styles.flex} contentContainerStyle={styles.content}>
69
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationTitle}</Text>
70
- <View style={styles.gap20} />
71
79
  {/* Activer les notifications */}
72
- <SettingToggle
73
- icon={Images.iconsCloche}
74
- title={traductions.notificationPageTitle}
75
- value={enabled}
76
- onChange={() => configBloc.add(new ConfigChangeEvent(ConfigKey.notificationStatus, enabled ? 'disabled' : 'enabled'))}
80
+ <ProfilePageMenu
81
+ items={[
82
+ <ProfileMenuTile
83
+ key="notifications"
84
+ image={Images.iconsCloche}
85
+ titre={traductions.notificationPageTitle}
86
+ onPress={basculerNotifications}
87
+ trailing={<SwitchThemed value={enabled} onChange={basculerNotifications} />}
88
+ />,
89
+ ]}
77
90
  />
91
+
78
92
  {/* Style de notification */}
79
- <View style={styles.gap10} />
80
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationStyleTitle}</Text>
81
- <View style={styles.gap10} />
82
- <Card>
83
- <View style={styles.wrap}>
84
- {styles_.map((item) => {
85
- const active = (!enabled && item.style == null) || currentStyle === item.style;
93
+ <View style={styles.gap24} />
94
+ <ProfileSectionTitre titre={traductions.appSettingPageMenuNotificationStyleTitle} />
95
+ <Card style={styles.card}>
96
+ <View style={styles.row}>
97
+ {styles_.map((item, i) => {
98
+ // « Aucun » quand les notifications sont désactivées
99
+ const choisi = enabled ? currentStyle === item.style : item.style == null;
86
100
  return (
87
101
  <Pressable
88
102
  key={item.title}
89
103
  accessibilityRole="button"
104
+ accessibilityState={{ selected: choisi }}
90
105
  disabled={!(enabled && item.style != null && currentStyle !== item.style)}
91
106
  onPress={() => configBloc.add(new ConfigChangeEvent(ConfigKey.notificationStyle, item.style!))}
92
- style={styles.styleItem}
107
+ style={[styles.style, i > 0 ? styles.styleGap : null]}
93
108
  >
94
- <Image
95
- source={item.icon}
96
- style={[styles.stylePreview, { backgroundColor: theme.colorScheme.surface }]}
97
- contentFit="cover"
98
- tintColor={active ? 'black' : undefined}
99
- />
100
- <View style={styles.gap10} />
101
- <View style={[styles.badge, { backgroundColor: active ? theme.colorScheme.onSurface : theme.colorScheme.secondary }]}>
102
- <Text style={[theme.textTheme.displayMedium, { color: active ? theme.colorScheme.surface : theme.colorScheme.onSecondary }]}>
103
- {item.title}
104
- </Text>
109
+ {/* Aperçu, entouré quand il est choisi */}
110
+ <View style={[styles.cadre, { borderColor: choisi ? theme.colorScheme.primary : 'transparent' }]}>
111
+ <Image
112
+ source={item.icon}
113
+ style={[styles.apercu, { backgroundColor: theme.colorScheme.surface }]}
114
+ contentFit="cover"
115
+ />
105
116
  </View>
117
+ <Text
118
+ style={[
119
+ theme.textTheme.displayMedium,
120
+ styles.libelle,
121
+ { fontWeight: choisi ? '700' : '500' },
122
+ choisi ? null : { color: Themer.neural03Color },
123
+ ]}
124
+ >
125
+ {item.title}
126
+ </Text>
106
127
  </Pressable>
107
128
  );
108
129
  })}
109
130
  </View>
110
131
  </Card>
132
+ {/* Description des styles de notification */}
111
133
  <View style={styles.gap10} />
112
- <Text style={[theme.textTheme.displayLarge, { color: Themer.neural04Color }]}>
134
+ <Text style={[theme.textTheme.displaySmall, styles.description, { color: Themer.neural03Color }]}>
113
135
  {traductions.appSettingPageMenuNotificationStyleDialogDesc}
114
136
  </Text>
115
- {/* Son */}
116
- <View style={styles.gap20} />
117
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationSonTitle}</Text>
118
- <View style={styles.gap10} />
119
- <MenuActionsWidget
137
+
138
+ {/* Son et vibration */}
139
+ <View style={styles.gap24} />
140
+ <ProfilePageMenu
141
+ titre={traductions.appSettingPageMenuNotificationSonTitle}
120
142
  items={[
121
- new MenuActionItem(
122
- Images.iconsCloche,
123
- traductions.notificationPageTitle,
124
- sonEnabled ? traductions.statutActive : traductions.statutDesactive,
125
- () => void AppRouter.push(router, AppRouter.profileParametreNotificationsSon),
126
- { iconSize: 20 },
127
- ),
143
+ // Son des notifications
144
+ <ProfileMenuTile
145
+ key="son"
146
+ image={Images.iconsCloche}
147
+ titre={traductions.notificationPageTitle}
148
+ sousTitre={sonEnabled ? traductions.statutActive : traductions.statutDesactive}
149
+ onPress={() => void AppRouter.push(router, AppRouter.profileParametreNotificationsSon)}
150
+ />,
151
+ // Vibration des notifications
152
+ <ProfileMenuTile
153
+ key="vibration"
154
+ icone="vibration"
155
+ titre={traductions.appSettingPageMenuNotificationVibrTitle}
156
+ sousTitre={traductions.appSettingPageMenuNotificationVibrSubtitle}
157
+ onPress={basculerVibration}
158
+ trailing={<SwitchThemed value={vibrationEnabled} onChange={basculerVibration} />}
159
+ />,
128
160
  ]}
129
161
  />
130
- {/* Vibration */}
131
- <View style={styles.gap20} />
132
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationVibrTitle}</Text>
133
- <View style={styles.gap10} />
134
- <SettingToggle
135
- icon={Images.iconsCloche}
136
- title={traductions.appSettingPageMenuNotificationVibrTitle}
137
- subtitle={traductions.appSettingPageMenuNotificationVibrSubtitle}
138
- value={vibrationEnabled}
139
- onChange={() =>
140
- configBloc.add(new ConfigChangeEvent(ConfigKey.notificationAlertVibration, vibrationEnabled ? 'disabled' : 'enabled'))
141
- }
142
- />
143
162
  </ScrollView>
144
163
  </View>
145
164
  );
@@ -147,13 +166,15 @@ export function ProfileParametrePageNotifications() {
147
166
 
148
167
  const styles = StyleSheet.create({
149
168
  flex: { flex: 1 },
150
- backRow: { flexDirection: 'row' },
151
- back: { padding: 12 },
152
- content: { paddingTop: 12, paddingHorizontal: 12, paddingBottom: 20 },
153
- wrap: { padding: 20, flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-between', rowGap: 10, columnGap: 10 },
154
- styleItem: { alignItems: 'center' },
155
- stylePreview: { width: 60, height: 120, borderRadius: 8 },
156
- badge: { borderRadius: 10, paddingHorizontal: 10, paddingVertical: 5 },
169
+ content: { paddingTop: 8, paddingHorizontal: 20, paddingBottom: 24 },
170
+ card: { margin: 0 },
171
+ row: { flexDirection: 'row', alignItems: 'flex-start', padding: 14 },
172
+ style: { flex: 1, alignItems: 'center', borderRadius: 14 },
173
+ styleGap: { marginLeft: 12 },
174
+ cadre: { alignSelf: 'stretch', padding: 3, borderWidth: 2, borderRadius: 14 },
175
+ apercu: { width: '100%', aspectRatio: 0.55, borderRadius: 10 },
176
+ libelle: { marginTop: 8, textAlign: 'center' },
177
+ description: { paddingHorizontal: 4 },
157
178
  gap10: { height: 10 },
158
- gap20: { height: 20 },
179
+ gap24: { height: 24 },
159
180
  });
@@ -1,6 +1,6 @@
1
1
  import { MaterialIcons } from '@expo/vector-icons';
2
- import { useState } from 'react';
3
- import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
2
+ import { useState, type ComponentProps } from 'react';
3
+ import { ScrollView, StyleSheet, Text, View } from 'react-native';
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
5
 
6
6
  import { Images } from '../../../../../core/assets';
@@ -10,11 +10,12 @@ import { SoundManager } from '../../../../../core/sounds';
10
10
  import { useTheme } from '../../../../../core/theme';
11
11
  import { useAppLocalizations } from '../../../../../l10n/localizations';
12
12
  import { TextButton } from '../../../../../shared/material/buttons';
13
- import { Card } from '../../../../../shared/material/card';
13
+ import { AppBar } from '../../../../../shared/material/scaffold';
14
14
  import { ConfigBloc } from '../../../../config/adapters/ui/bloc/config_bloc';
15
15
  import { ConfigChangeEvent } from '../../../../config/adapters/ui/bloc/config_event';
16
16
  import { ConfigKey } from '../../../../config/domain/models/config_keys';
17
- import { SettingToggle } from './settings_widgets';
17
+ import { ProfileMenuTile, ProfilePageMenu } from '../profile_menu';
18
+ import { SwitchThemed } from './settings_widgets';
18
19
 
19
20
  const NONE = 'NONE';
20
21
 
@@ -44,77 +45,106 @@ export function ProfileParametrePageNotificationsSon() {
44
45
  }
45
46
  };
46
47
 
48
+ const basculer = () => setSelectedSound(enabled ? NONE : (SoundManager.liste[0]?.path ?? null));
49
+
47
50
  return (
48
51
  <View style={[styles.flex, { paddingBottom: insets.bottom }]}>
49
- <View style={styles.bar}>
50
- <Pressable accessibilityRole="button" hitSlop={12} style={styles.back} onPress={() => AppRouter.pop(router)}>
51
- <MaterialIcons name="arrow-back" size={24} color={theme.colorScheme.onSurface} />
52
- </Pressable>
53
- <View style={styles.save}>
54
- <TextButton onPress={save}>{traductions.btnTextSave}</TextButton>
55
- </View>
56
- </View>
52
+ {/* Titre dans la barre, comme les autres pages (dans la feuille : fond de la feuille) */}
53
+ <AppBar
54
+ backgroundColor="transparent"
55
+ onBack={() => AppRouter.pop(router)}
56
+ title={
57
+ <Text numberOfLines={1} style={theme.textTheme.headlineMedium}>
58
+ {traductions.appSettingPageMenuNotificationSonPageTitle}
59
+ </Text>
60
+ }
61
+ actions={
62
+ <View style={styles.save}>
63
+ <TextButton onPress={save}>{traductions.btnTextSave}</TextButton>
64
+ </View>
65
+ }
66
+ />
57
67
  <ScrollView style={styles.flex} contentContainerStyle={styles.content}>
58
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationSonPageTitle}</Text>
59
- <View style={styles.gap20} />
60
68
  {/* Son activé ou non */}
61
- <SettingToggle
62
- icon={Images.iconsCloche}
63
- title={traductions.notificationPageTitle}
64
- value={enabled}
65
- onChange={(value) => setSelectedSound(value ? (SoundManager.liste[0]?.path ?? null) : NONE)}
69
+ <ProfilePageMenu
70
+ items={[
71
+ <ProfileMenuTile
72
+ key="son"
73
+ image={Images.iconsCloche}
74
+ titre={traductions.notificationPageTitle}
75
+ onPress={basculer}
76
+ trailing={<SwitchThemed value={enabled} onChange={basculer} />}
77
+ />,
78
+ ]}
66
79
  />
80
+
67
81
  {/* Sons disponibles */}
68
- <View style={styles.gap20} />
69
- <Text style={theme.textTheme.headlineMedium}>{traductions.appSettingPageMenuNotificationSonTitle}</Text>
70
- <View style={styles.gap10} />
71
- <Card>
72
- {/* Aucun */}
73
- <SoundRow
74
- label={traductions.appSettingPageMenuNotificationStyleNone}
75
- checked={selectedSound === NONE}
76
- onPress={() => setSelectedSound(NONE)}
77
- />
78
- {SoundManager.liste.map((sound) => (
82
+ <View style={styles.gap24} />
83
+ <ProfilePageMenu
84
+ titre={traductions.appSettingPageMenuNotificationSonTitle}
85
+ items={[
86
+ // Aucun
79
87
  <SoundRow
80
- key={sound.path}
81
- label={sound.name}
82
- checked={selectedSound === sound.path}
83
- onPress={() => {
84
- void SoundManager.playSound(sound.path);
85
- setSelectedSound(sound.path);
86
- }}
87
- />
88
- ))}
89
- </Card>
88
+ key={NONE}
89
+ icone="music-off"
90
+ label={traductions.appSettingPageMenuNotificationStyleNone}
91
+ checked={selectedSound === NONE}
92
+ onPress={() => setSelectedSound(NONE)}
93
+ />,
94
+ ...SoundManager.liste.map((sound) => (
95
+ <SoundRow
96
+ key={sound.path}
97
+ icone="music-note"
98
+ label={sound.name}
99
+ checked={selectedSound === sound.path}
100
+ onPress={() => {
101
+ void SoundManager.playSound(sound.path);
102
+ setSelectedSound(sound.path);
103
+ }}
104
+ />
105
+ )),
106
+ ]}
107
+ />
90
108
  <View style={styles.gap20} />
91
109
  </ScrollView>
92
110
  </View>
93
111
  );
94
112
  }
95
113
 
96
- function SoundRow({ label, checked, onPress }: { label: string; checked: boolean; onPress: () => void }) {
114
+ /** Son de la liste, coché quand il est choisi */
115
+ function SoundRow({
116
+ icone,
117
+ label,
118
+ checked,
119
+ onPress,
120
+ }: {
121
+ icone: ComponentProps<typeof MaterialIcons>['name'];
122
+ label: string;
123
+ checked: boolean;
124
+ onPress: () => void;
125
+ }) {
97
126
  const theme = useTheme();
98
127
  return (
99
- <Pressable
100
- accessibilityRole="radio"
101
- accessibilityState={{ checked }}
128
+ <ProfileMenuTile
129
+ icone={icone}
130
+ titre={label}
102
131
  onPress={onPress}
103
- style={({ pressed }) => [styles.row, pressed ? { backgroundColor: theme.colorScheme.secondary } : null]}
104
- >
105
- <Text style={[theme.textTheme.bodyLarge, styles.flex]}>{label}</Text>
106
- {checked && <MaterialIcons name="check" size={18} color={theme.colorScheme.onSurface} />}
107
- </Pressable>
132
+ trailing={
133
+ checked ? (
134
+ <MaterialIcons name="check-circle" size={22} color={theme.colorScheme.primary} />
135
+ ) : (
136
+ <View style={styles.vide} />
137
+ )
138
+ }
139
+ />
108
140
  );
109
141
  }
110
142
 
111
143
  const styles = StyleSheet.create({
112
144
  flex: { flex: 1 },
113
- bar: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },
114
- back: { padding: 12 },
115
145
  save: { paddingRight: 12 },
116
- content: { paddingTop: 12, paddingHorizontal: 12 },
117
- row: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, minHeight: 52 },
118
- gap10: { height: 10 },
146
+ content: { paddingTop: 8, paddingHorizontal: 20 },
147
+ vide: { width: 22 },
119
148
  gap20: { height: 20 },
149
+ gap24: { height: 24 },
120
150
  });
@@ -1,52 +1,56 @@
1
- import { ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';
2
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
1
+ import { StyleSheet, Text, View } from 'react-native';
3
2
 
4
3
  import { Images } from '../../../../../core/assets';
5
4
  import { useBloc, useBlocBuilder } from '../../../../../core/bloc_react';
6
- import { useTheme } from '../../../../../core/theme';
5
+ import { Themer, useTheme } from '../../../../../core/theme';
7
6
  import { useAppLocalizations } from '../../../../../l10n/localizations';
7
+ import { SelectionSheet } from '../../../../../shared/widgets/selection';
8
8
  import { ConfigBloc } from '../../../../config/adapters/ui/bloc/config_bloc';
9
9
  import { ConfigChangeEvent } from '../../../../config/adapters/ui/bloc/config_event';
10
10
  import { ConfigLoadedState } from '../../../../config/adapters/ui/bloc/config_state';
11
11
  import { ConfigKey } from '../../../../config/domain/models/config_keys';
12
- import { SettingToggle } from './settings_widgets';
12
+ import { ProfileMenuTile, ProfilePageMenu } from '../profile_menu';
13
+ import { SwitchThemed } from './settings_widgets';
13
14
 
14
15
  /** Feuille « Mon QR code » : afficher ou non le QR code de l'alias sur l'accueil. */
15
16
  export function ProfileParametrePageQRcode() {
16
17
  const traductions = useAppLocalizations();
17
18
  const theme = useTheme();
18
- const insets = useSafeAreaInsets();
19
- const { height } = useWindowDimensions();
20
19
  const configBloc = useBloc(ConfigBloc);
21
20
  const state = useBlocBuilder(
22
21
  configBloc,
23
22
  (_p, current) => current instanceof ConfigLoadedState && current.updatedKey === ConfigKey.showQRcode,
24
23
  );
25
24
  const showQRcode = state.configParams.params[ConfigKey.showQRcode] !== '0';
25
+ const basculer = () => configBloc.add(new ConfigChangeEvent(ConfigKey.showQRcode, showQRcode ? '0' : '1'));
26
26
 
27
27
  return (
28
- <View style={[styles.box, { backgroundColor: theme.colorScheme.surface, maxHeight: height * 0.5 }]}>
29
- <ScrollView contentContainerStyle={[styles.content, { paddingBottom: 20 + insets.bottom }]}>
30
- <Text style={theme.textTheme.headlineLarge}>{traductions.appSettingPageMenuQrCodeTitle}</Text>
31
- <View style={styles.gap8} />
32
- <Text style={theme.textTheme.displaySmall}>
28
+ <SelectionSheet
29
+ titre={traductions.appSettingPageMenuQrCodeTitle}
30
+ entete={
31
+ <Text style={[theme.textTheme.displaySmall, { color: Themer.neural03Color }]}>
33
32
  {showQRcode ? traductions.appSettingPageMenuQrCodeDeselectTitle : traductions.appSettingPageMenuQrCodeSelectTitle}
34
33
  </Text>
35
- <View style={styles.gap15} />
36
- <SettingToggle
37
- icon={Images.homeFooterQrcode}
38
- title={traductions.appSettingPageMenuQrCodeTitle}
39
- value={showQRcode}
40
- onChange={() => configBloc.add(new ConfigChangeEvent(ConfigKey.showQRcode, showQRcode ? '0' : '1'))}
41
- />
42
- </ScrollView>
43
- </View>
34
+ }
35
+ contenu={
36
+ <View style={styles.contenu}>
37
+ <ProfilePageMenu
38
+ items={[
39
+ <ProfileMenuTile
40
+ key="qrcode"
41
+ image={Images.homeFooterQrcode}
42
+ titre={traductions.appSettingPageMenuQrCodeTitle}
43
+ onPress={basculer}
44
+ trailing={<SwitchThemed value={showQRcode} onChange={basculer} />}
45
+ />,
46
+ ]}
47
+ />
48
+ </View>
49
+ }
50
+ />
44
51
  );
45
52
  }
46
53
 
47
54
  const styles = StyleSheet.create({
48
- box: { borderRadius: 20, overflow: 'hidden' },
49
- content: { padding: 20 },
50
- gap8: { height: 8 },
51
- gap15: { height: 15 },
55
+ contenu: { paddingHorizontal: 20, paddingTop: 8, paddingBottom: 20 },
52
56
  });