Application Android et IOS pour l'amicale des élèves https://play.google.com/store/apps/details?id=fr.amicaleinsat.application
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PreferencesProvider.tsx 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import React, { useState } from 'react';
  2. import {
  3. defaultMascotPreferences,
  4. defaultPlanexPreferences,
  5. defaultPreferences,
  6. defaultProxiwashPreferences,
  7. GeneralPreferenceKeys,
  8. GeneralPreferencesType,
  9. MascotPreferenceKeys,
  10. MascotPreferencesType,
  11. PlanexPreferenceKeys,
  12. PlanexPreferencesType,
  13. PreferenceKeys,
  14. PreferencesType,
  15. ProxiwashPreferenceKeys,
  16. ProxiwashPreferencesType,
  17. setPreference,
  18. } from '../../utils/asyncStorage';
  19. import {
  20. MascotPreferencesContext,
  21. PlanexPreferencesContext,
  22. PreferencesContext,
  23. PreferencesContextType,
  24. ProxiwashPreferencesContext,
  25. } from '../../context/preferencesContext';
  26. function updateState<T extends Partial<PreferencesType>, K extends string>(
  27. key: K,
  28. value: number | string | boolean | object | Array<any>,
  29. prevState: PreferencesContextType<T, K>
  30. ) {
  31. const prevPreferences = { ...prevState.preferences };
  32. const newPrefs = setPreference(key as PreferenceKeys, value, prevPreferences);
  33. const newSate = {
  34. ...prevState,
  35. preferences: { ...newPrefs },
  36. };
  37. return newSate;
  38. }
  39. function resetState<
  40. T extends Partial<PreferencesType>,
  41. K extends Partial<PreferenceKeys>
  42. >(
  43. keys: Array<PreferenceKeys>,
  44. defaults: T,
  45. prevState: PreferencesContextType<T, K>
  46. ) {
  47. const prevPreferences = { ...prevState.preferences };
  48. let newPreferences = { ...prevPreferences };
  49. keys.forEach((key) => {
  50. newPreferences = setPreference(key, defaults[key], prevPreferences);
  51. });
  52. const newSate = {
  53. ...prevState,
  54. preferences: { ...newPreferences },
  55. };
  56. return newSate;
  57. }
  58. function usePreferencesProvider<
  59. T extends Partial<PreferencesType>,
  60. K extends Partial<PreferenceKeys>
  61. >(initialPreferences: T, defaults: T, keys: Array<K>) {
  62. const updatePreferences = (
  63. key: K,
  64. value: number | string | boolean | object | Array<any>
  65. ) => {
  66. setPreferencesState((prevState) => updateState(key, value, prevState));
  67. };
  68. const resetPreferences = () => {
  69. setPreferencesState((prevState) => resetState(keys, defaults, prevState));
  70. };
  71. const [preferencesState, setPreferencesState] = useState<
  72. PreferencesContextType<T, K>
  73. >({
  74. preferences: { ...initialPreferences },
  75. updatePreferences: updatePreferences,
  76. resetPreferences: resetPreferences,
  77. });
  78. return preferencesState;
  79. }
  80. type PreferencesProviderProps<
  81. T extends Partial<PreferencesType>,
  82. K extends Partial<PreferenceKeys>
  83. > = {
  84. children: React.ReactChild;
  85. initialPreferences: T;
  86. defaults: T;
  87. keys: Array<K>;
  88. Context: React.Context<PreferencesContextType<T, K>>;
  89. };
  90. function PreferencesProvider<
  91. T extends Partial<PreferencesType>,
  92. K extends Partial<PreferenceKeys>
  93. >(props: PreferencesProviderProps<T, K>) {
  94. const { Context } = props;
  95. const preferencesState = usePreferencesProvider<T, K>(
  96. props.initialPreferences,
  97. props.defaults,
  98. Object.values(props.keys)
  99. );
  100. return (
  101. <Context.Provider value={preferencesState}>
  102. {props.children}
  103. </Context.Provider>
  104. );
  105. }
  106. type Props<T> = {
  107. children: React.ReactChild;
  108. initialPreferences: T;
  109. };
  110. export function GeneralPreferencesProvider(
  111. props: Props<GeneralPreferencesType>
  112. ) {
  113. return (
  114. <PreferencesProvider
  115. Context={PreferencesContext}
  116. initialPreferences={props.initialPreferences}
  117. defaults={defaultPreferences}
  118. keys={Object.values(GeneralPreferenceKeys)}
  119. >
  120. {props.children}
  121. </PreferencesProvider>
  122. );
  123. }
  124. export function PlanexPreferencesProvider(props: Props<PlanexPreferencesType>) {
  125. return (
  126. <PreferencesProvider
  127. Context={PlanexPreferencesContext}
  128. initialPreferences={props.initialPreferences}
  129. defaults={defaultPlanexPreferences}
  130. keys={Object.values(PlanexPreferenceKeys)}
  131. >
  132. {props.children}
  133. </PreferencesProvider>
  134. );
  135. }
  136. export function ProxiwashPreferencesProvider(
  137. props: Props<ProxiwashPreferencesType>
  138. ) {
  139. return (
  140. <PreferencesProvider
  141. Context={ProxiwashPreferencesContext}
  142. initialPreferences={props.initialPreferences}
  143. defaults={defaultProxiwashPreferences}
  144. keys={Object.values(ProxiwashPreferenceKeys)}
  145. >
  146. {props.children}
  147. </PreferencesProvider>
  148. );
  149. }
  150. export function MascotPreferencesProvider(props: Props<MascotPreferencesType>) {
  151. return (
  152. <PreferencesProvider
  153. Context={MascotPreferencesContext}
  154. initialPreferences={props.initialPreferences}
  155. defaults={defaultMascotPreferences}
  156. keys={Object.values(MascotPreferenceKeys)}
  157. >
  158. {props.children}
  159. </PreferencesProvider>
  160. );
  161. }