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.

preferencesContext.tsx 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { useNavigation } from '@react-navigation/core';
  2. import React, { useContext } from 'react';
  3. import { Appearance } from 'react-native-appearance';
  4. import {
  5. defaultMascotPreferences,
  6. defaultPlanexPreferences,
  7. defaultPreferences,
  8. defaultProxiwashPreferences,
  9. getPreferenceBool,
  10. getPreferenceObject,
  11. MascotPreferenceKeys,
  12. MascotPreferencesType,
  13. PlanexPreferenceKeys,
  14. PlanexPreferencesType,
  15. GeneralPreferenceKeys,
  16. GeneralPreferencesType,
  17. ProxiwashPreferenceKeys,
  18. ProxiwashPreferencesType,
  19. isValidMascotPreferenceKey,
  20. PreferencesType,
  21. } from '../utils/asyncStorage';
  22. import {
  23. getAmicaleServices,
  24. getINSAServices,
  25. getSpecialServices,
  26. getStudentServices,
  27. } from '../utils/Services';
  28. const colorScheme = Appearance.getColorScheme();
  29. export type PreferencesContextType<
  30. T extends Partial<PreferencesType>,
  31. K extends string
  32. > = {
  33. preferences: T;
  34. updatePreferences: (
  35. key: K,
  36. value: number | string | boolean | object | Array<any>
  37. ) => void;
  38. resetPreferences: () => void;
  39. };
  40. // CONTEXTES
  41. // Preferences are separated into several contextes to improve performances
  42. export const PreferencesContext = React.createContext<
  43. PreferencesContextType<GeneralPreferencesType, GeneralPreferenceKeys>
  44. >({
  45. preferences: defaultPreferences,
  46. updatePreferences: () => undefined,
  47. resetPreferences: () => undefined,
  48. });
  49. export const PlanexPreferencesContext = React.createContext<
  50. PreferencesContextType<PlanexPreferencesType, PlanexPreferenceKeys>
  51. >({
  52. preferences: defaultPlanexPreferences,
  53. updatePreferences: () => undefined,
  54. resetPreferences: () => undefined,
  55. });
  56. export const ProxiwashPreferencesContext = React.createContext<
  57. PreferencesContextType<ProxiwashPreferencesType, ProxiwashPreferenceKeys>
  58. >({
  59. preferences: defaultProxiwashPreferences,
  60. updatePreferences: () => undefined,
  61. resetPreferences: () => undefined,
  62. });
  63. export const MascotPreferencesContext = React.createContext<
  64. PreferencesContextType<MascotPreferencesType, MascotPreferenceKeys>
  65. >({
  66. preferences: defaultMascotPreferences,
  67. updatePreferences: () => undefined,
  68. resetPreferences: () => undefined,
  69. });
  70. // Context Hooks
  71. export function usePreferences() {
  72. return useContext(PreferencesContext);
  73. }
  74. export function usePlanexPreferences() {
  75. return useContext(PlanexPreferencesContext);
  76. }
  77. export function useProxiwashPreferences() {
  78. return useContext(ProxiwashPreferencesContext);
  79. }
  80. export function useMascotPreferences() {
  81. return useContext(MascotPreferencesContext);
  82. }
  83. // Custom Hooks
  84. export function useShouldShowMascot(route: string) {
  85. const { preferences, updatePreferences } = useMascotPreferences();
  86. const key = route + 'ShowMascot';
  87. let shouldShow = false;
  88. if (isValidMascotPreferenceKey(key)) {
  89. shouldShow = getPreferenceBool(key, preferences) !== false;
  90. }
  91. const setShouldShow = (show: boolean) => {
  92. if (isValidMascotPreferenceKey(key)) {
  93. updatePreferences(key, show);
  94. } else {
  95. console.log('Invalid preference key: ' + key);
  96. }
  97. };
  98. return { shouldShow, setShouldShow };
  99. }
  100. export function useDarkTheme() {
  101. const { preferences } = usePreferences();
  102. return (
  103. (getPreferenceBool(GeneralPreferenceKeys.nightMode, preferences) !==
  104. false &&
  105. (getPreferenceBool(
  106. GeneralPreferenceKeys.nightModeFollowSystem,
  107. preferences
  108. ) === false ||
  109. colorScheme === 'no-preference')) ||
  110. (getPreferenceBool(
  111. GeneralPreferenceKeys.nightModeFollowSystem,
  112. preferences
  113. ) !== false &&
  114. colorScheme === 'dark')
  115. );
  116. }
  117. export function useCurrentDashboard() {
  118. const { preferences, updatePreferences } = usePreferences();
  119. const navigation = useNavigation();
  120. const dashboardIdList = getPreferenceObject(
  121. GeneralPreferenceKeys.dashboardItems,
  122. preferences
  123. ) as Array<string>;
  124. const updateCurrentDashboard = (newList: Array<string>) => {
  125. updatePreferences(GeneralPreferenceKeys.dashboardItems, newList);
  126. };
  127. const allDatasets = [
  128. ...getAmicaleServices(navigation.navigate),
  129. ...getStudentServices(navigation.navigate),
  130. ...getINSAServices(navigation.navigate),
  131. ...getSpecialServices(navigation.navigate),
  132. ];
  133. return {
  134. currentDashboard: allDatasets.filter((item) =>
  135. dashboardIdList.includes(item.key)
  136. ),
  137. currentDashboardIdList: dashboardIdList,
  138. updateCurrentDashboard: updateCurrentDashboard,
  139. };
  140. }