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.4KB

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