@addev-be/ui 0.15.0 → 0.15.1

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 (215) hide show
  1. package/assets/icons/arrow-down-1-9.svg +1 -1
  2. package/assets/icons/arrow-down-a-z.svg +1 -1
  3. package/assets/icons/arrow-up-z-a.svg +1 -1
  4. package/assets/icons/check.svg +1 -1
  5. package/assets/icons/circle-check.svg +1 -1
  6. package/assets/icons/down.svg +1 -1
  7. package/assets/icons/filter-full.svg +1 -1
  8. package/assets/icons/filter.svg +1 -1
  9. package/assets/icons/hashtag.svg +1 -1
  10. package/assets/icons/image-slash.svg +1 -1
  11. package/assets/icons/left.svg +1 -1
  12. package/assets/icons/magnifier.svg +1 -1
  13. package/assets/icons/phone.svg +1 -1
  14. package/assets/icons/right.svg +1 -1
  15. package/assets/icons/sort-calendar-ascending.svg +5 -5
  16. package/assets/icons/spinner-third.svg +1 -1
  17. package/assets/icons/table-columns.svg +1 -1
  18. package/assets/icons/table-footer-slash.svg +4 -4
  19. package/assets/icons/table-footer.svg +3 -3
  20. package/assets/icons/up.svg +1 -1
  21. package/assets/icons/user-tie.svg +1 -1
  22. package/assets/icons/x-bar.svg +3 -3
  23. package/dist/components/auth/LoginForm.js +0 -1
  24. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +10 -0
  25. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +173 -0
  26. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +13 -0
  27. package/dist/components/data/DataGrid/FilterValuesScroller.js +73 -0
  28. package/dist/components/data/DataGrid/VirtualScroller.d.ts +11 -0
  29. package/dist/components/data/DataGrid/VirtualScroller.js +41 -0
  30. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +12 -0
  31. package/dist/components/data/DataGrid/helpers/advancedRequests.js +53 -0
  32. package/dist/components/data/DataGrid/helpers.d.ts +28 -0
  33. package/dist/components/data/DataGrid/helpers.js +436 -0
  34. package/dist/config/types.d.ts +11 -0
  35. package/dist/config/types.js +2 -0
  36. package/dist/providers/AuthenticationProvider/index.d.ts +0 -1
  37. package/dist/providers/AuthenticationProvider/index.js +14 -28
  38. package/dist/services/advancedRequests.d.ts +1 -1
  39. package/dist/services/requests/userPermissions.d.ts +4 -0
  40. package/dist/services/requests/userPermissions.js +20 -0
  41. package/dist/services/sqlRequests.d.ts +1 -1
  42. package/package.json +1 -1
  43. package/src/Icons.tsx +134 -134
  44. package/src/components/auth/LoginForm.tsx +84 -84
  45. package/src/components/auth/LoginPage.tsx +32 -32
  46. package/src/components/auth/PasswordRecoveryForm.tsx +52 -52
  47. package/src/components/auth/PasswordResetForm.tsx +112 -112
  48. package/src/components/auth/index.ts +4 -4
  49. package/src/components/auth/styles.ts +14 -14
  50. package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +93 -93
  51. package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +262 -262
  52. package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +2 -2
  53. package/src/components/data/AdvancedRequestDataGrid/index.tsx +267 -267
  54. package/src/components/data/AdvancedRequestDataGrid/types.ts +47 -47
  55. package/src/components/data/DataGrid/DataGridCell.tsx +83 -77
  56. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  57. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  58. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  59. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  60. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +38 -38
  61. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +39 -39
  62. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +68 -68
  63. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +38 -38
  64. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -105
  65. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -0
  66. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +17 -15
  67. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +131 -131
  68. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  69. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +376 -376
  70. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  71. package/src/components/data/DataGrid/DataGridFooter.tsx +45 -45
  72. package/src/components/data/DataGrid/DataGridHeader.tsx +173 -173
  73. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +115 -115
  74. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +80 -78
  75. package/src/components/data/DataGrid/FilterModalContent/index.tsx +136 -136
  76. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  77. package/src/components/data/DataGrid/constants.ts +6 -6
  78. package/src/components/data/DataGrid/helpers/columns.tsx +384 -384
  79. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  80. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  81. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  82. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +378 -378
  83. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +56 -56
  84. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  85. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  86. package/src/components/data/DataGrid/index.tsx +110 -110
  87. package/src/components/data/DataGrid/styles.ts +369 -390
  88. package/src/components/data/DataGrid/types.ts +367 -367
  89. package/src/components/data/SmartQueryDataGrid/helpers/columns.tsx +333 -333
  90. package/src/components/data/SmartQueryDataGrid/helpers/hooks.ts +41 -41
  91. package/src/components/data/SmartQueryDataGrid/helpers/index.ts +2 -2
  92. package/src/components/data/SmartQueryDataGrid/helpers/smartQueries.ts +17 -17
  93. package/src/components/data/SmartQueryDataGrid/hooks.ts +75 -75
  94. package/src/components/data/SmartQueryDataGrid/index.tsx +338 -338
  95. package/src/components/data/SmartQueryDataGrid/types.ts +45 -45
  96. package/src/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.tsx +16 -16
  97. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +478 -407
  98. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  99. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  100. package/src/components/data/SqlRequestDataGrid/index.tsx +402 -402
  101. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  102. package/src/components/data/SqlRequestDataGrid/types.ts +74 -71
  103. package/src/components/data/SqlRequestForeignList/index.tsx +259 -201
  104. package/src/components/data/SqlRequestForeignList/styles.ts +42 -38
  105. package/src/components/data/SqlRequestForeignList/types.ts +34 -31
  106. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +110 -110
  107. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  108. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  109. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  110. package/src/components/data/SqlRequestGrid/index.tsx +316 -316
  111. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  112. package/src/components/data/SqlRequestGrid/types.ts +75 -75
  113. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  114. package/src/components/data/VirtualScroller/index.tsx +91 -89
  115. package/src/components/data/VirtualScroller/styles.ts +58 -58
  116. package/src/components/data/VirtualScroller/types.ts +12 -12
  117. package/src/components/data/index.ts +23 -23
  118. package/src/components/forms/AutoTextArea.tsx +41 -41
  119. package/src/components/forms/Button.tsx +133 -133
  120. package/src/components/forms/Form/Checkbox.tsx +13 -13
  121. package/src/components/forms/Form/FormGroup.tsx +27 -27
  122. package/src/components/forms/Form/Input.tsx +13 -13
  123. package/src/components/forms/Form/InputWithLabel.tsx +18 -18
  124. package/src/components/forms/Form/Select.tsx +76 -67
  125. package/src/components/forms/Form/TextArea.tsx +13 -13
  126. package/src/components/forms/Form/index.tsx +37 -37
  127. package/src/components/forms/Form/styles.ts +101 -101
  128. package/src/components/forms/Form/types.ts +7 -7
  129. package/src/components/forms/IconButton.tsx +57 -57
  130. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  131. package/src/components/forms/Select.tsx +35 -35
  132. package/src/components/forms/VerticalLabel.tsx +20 -20
  133. package/src/components/forms/index.ts +8 -8
  134. package/src/components/forms/styles.ts +31 -31
  135. package/src/components/index.ts +6 -6
  136. package/src/components/layout/Columns.ts +20 -20
  137. package/src/components/layout/Dropdown/index.tsx +113 -113
  138. package/src/components/layout/Dropdown/styles.ts +45 -45
  139. package/src/components/layout/Grid/index.tsx +8 -8
  140. package/src/components/layout/Grid/styles.ts +34 -34
  141. package/src/components/layout/Loading/index.tsx +29 -29
  142. package/src/components/layout/Loading/styles.ts +29 -29
  143. package/src/components/layout/Masonry/index.tsx +29 -29
  144. package/src/components/layout/Masonry/styles.ts +20 -20
  145. package/src/components/layout/Modal/index.tsx +51 -51
  146. package/src/components/layout/Modal/styles.ts +121 -121
  147. package/src/components/layout/index.ts +6 -6
  148. package/src/components/search/HighlightedText.tsx +37 -37
  149. package/src/components/search/QuickSearchBar.tsx +86 -86
  150. package/src/components/search/QuickSearchResults.tsx +86 -86
  151. package/src/components/search/index.ts +9 -9
  152. package/src/components/search/styles.ts +96 -96
  153. package/src/components/search/types.ts +26 -26
  154. package/src/components/ui/Avatar/index.tsx +54 -54
  155. package/src/components/ui/Card/index.tsx +14 -14
  156. package/src/components/ui/Card/styles.ts +37 -37
  157. package/src/components/ui/ContextMenu/index.tsx +79 -79
  158. package/src/components/ui/ContextMenu/styles.ts +119 -119
  159. package/src/components/ui/Ellipsis.tsx +32 -0
  160. package/src/components/ui/Label.tsx +90 -90
  161. package/src/components/ui/Message/index.tsx +57 -57
  162. package/src/components/ui/Message/styles.ts +40 -40
  163. package/src/components/ui/index.ts +6 -5
  164. package/src/config/index.ts +14 -14
  165. package/src/helpers/dates.ts +17 -17
  166. package/src/helpers/getScrollbarSize.ts +14 -14
  167. package/src/helpers/index.ts +3 -3
  168. package/src/helpers/numbers.ts +63 -63
  169. package/src/helpers/text.ts +13 -13
  170. package/src/hooks/index.ts +3 -3
  171. package/src/hooks/useElementSize.ts +24 -24
  172. package/src/hooks/useShowArchived.ts +28 -28
  173. package/src/hooks/useWindowSize.ts +20 -20
  174. package/src/index.ts +9 -9
  175. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  176. package/src/providers/AuthenticationProvider/index.tsx +243 -243
  177. package/src/providers/LoadingProvider/index.tsx +47 -47
  178. package/src/providers/PortalsProvider/index.tsx +54 -54
  179. package/src/providers/PortalsProvider/styles.ts +31 -31
  180. package/src/providers/SettingsProvider/index.tsx +70 -70
  181. package/src/providers/ThemeProvider/ThemeProvider.ts +63 -63
  182. package/src/providers/ThemeProvider/defaultTheme.ts +457 -457
  183. package/src/providers/ThemeProvider/helpers.ts +11 -11
  184. package/src/providers/ThemeProvider/index.ts +4 -4
  185. package/src/providers/ThemeProvider/types.ts +131 -131
  186. package/src/providers/TrackingProvider/index.tsx +71 -71
  187. package/src/providers/UiProviders/index.tsx +68 -68
  188. package/src/providers/UiProviders/styles.ts +10 -10
  189. package/src/providers/hooks.ts +12 -12
  190. package/src/providers/index.ts +8 -8
  191. package/src/services/HttpService.ts +92 -92
  192. package/src/services/WebSocketService.ts +137 -137
  193. package/src/services/advancedRequests.ts +102 -102
  194. package/src/services/base.ts +23 -23
  195. package/src/services/globalSearch.ts +29 -29
  196. package/src/services/hooks.ts +44 -44
  197. package/src/services/index.ts +21 -21
  198. package/src/services/requests/auth.ts +44 -44
  199. package/src/services/requests/generic.ts +62 -62
  200. package/src/services/requests/tracking.ts +12 -12
  201. package/src/services/requests/userProfiles.ts +35 -35
  202. package/src/services/requests/users.ts +28 -28
  203. package/src/services/smartQueries.ts +122 -122
  204. package/src/services/sqlRequests.ts +111 -111
  205. package/src/services/types/auth.ts +131 -131
  206. package/src/services/types/base.ts +10 -10
  207. package/src/services/types/generic.ts +96 -96
  208. package/src/services/types/tracking.ts +39 -39
  209. package/src/services/types/userProfiles.ts +107 -107
  210. package/src/services/types/users.ts +106 -106
  211. package/src/services/updateSqlRequests.ts +34 -34
  212. package/src/styles/animations.scss +30 -30
  213. package/src/styles/index.scss +42 -42
  214. package/src/typings.d.ts +13 -13
  215. package/tsconfig.json +18 -18
@@ -1,47 +1,47 @@
1
- import {
2
- FC,
3
- PropsWithChildren,
4
- createContext,
5
- useCallback,
6
- useMemo,
7
- useState,
8
- } from 'react';
9
-
10
- import { Loading } from '../../components';
11
-
12
- export type LoadingContextType = {
13
- startLoading: () => void;
14
- stopLoading: () => void;
15
- };
16
-
17
- export const LoadingContext = createContext<LoadingContextType>({
18
- startLoading: () => {},
19
- stopLoading: () => {},
20
- });
21
-
22
- export const LoadingProvider: FC<PropsWithChildren> = ({ children }) => {
23
- const [loadingCount, setLoadingCount] = useState(0);
24
-
25
- const startLoading = useCallback(() => {
26
- setLoadingCount((count) => count + 1);
27
- }, []);
28
-
29
- const stopLoading = useCallback(() => {
30
- setLoadingCount((count) => count - 1);
31
- }, []);
32
-
33
- const value = useMemo(
34
- () => ({
35
- startLoading,
36
- stopLoading,
37
- }),
38
- [startLoading, stopLoading]
39
- );
40
-
41
- return (
42
- <LoadingContext.Provider value={value}>
43
- <Loading visible={loadingCount > 0}>Chargement ...</Loading>
44
- {children}
45
- </LoadingContext.Provider>
46
- );
47
- };
1
+ import {
2
+ FC,
3
+ PropsWithChildren,
4
+ createContext,
5
+ useCallback,
6
+ useMemo,
7
+ useState,
8
+ } from 'react';
9
+
10
+ import { Loading } from '../../components';
11
+
12
+ export type LoadingContextType = {
13
+ startLoading: () => void;
14
+ stopLoading: () => void;
15
+ };
16
+
17
+ export const LoadingContext = createContext<LoadingContextType>({
18
+ startLoading: () => {},
19
+ stopLoading: () => {},
20
+ });
21
+
22
+ export const LoadingProvider: FC<PropsWithChildren> = ({ children }) => {
23
+ const [loadingCount, setLoadingCount] = useState(0);
24
+
25
+ const startLoading = useCallback(() => {
26
+ setLoadingCount((count) => count + 1);
27
+ }, []);
28
+
29
+ const stopLoading = useCallback(() => {
30
+ setLoadingCount((count) => count - 1);
31
+ }, []);
32
+
33
+ const value = useMemo(
34
+ () => ({
35
+ startLoading,
36
+ stopLoading,
37
+ }),
38
+ [startLoading, stopLoading]
39
+ );
40
+
41
+ return (
42
+ <LoadingContext.Provider value={value}>
43
+ <Loading visible={loadingCount > 0}>Chargement ...</Loading>
44
+ {children}
45
+ </LoadingContext.Provider>
46
+ );
47
+ };
@@ -1,54 +1,54 @@
1
- import * as styles from './styles';
2
-
3
- import {
4
- FC,
5
- PropsWithChildren,
6
- ReactNode,
7
- ReactPortal,
8
- createContext,
9
- useCallback,
10
- useMemo,
11
- useRef,
12
- } from 'react';
13
-
14
- import { createPortal } from 'react-dom';
15
-
16
- export type PortalProps = {
17
- key: string;
18
- children: ReactNode;
19
- };
20
-
21
- export type PortalsContextType = {
22
- createPortal: (children: ReactNode) => ReactPortal | null;
23
- };
24
-
25
- export const PortalsContext = createContext<PortalsContextType>({
26
- createPortal: () => null,
27
- });
28
-
29
- export const PortalsProvider: FC<PropsWithChildren> = ({ children }) => {
30
- const containerRef = useRef<HTMLDivElement | null>(null);
31
-
32
- const createLocalPortal = useCallback(
33
- (children: ReactNode) =>
34
- createPortal(
35
- <styles.PortalContainer>{children}</styles.PortalContainer>,
36
- containerRef.current!
37
- ) ?? null,
38
- []
39
- );
40
-
41
- const value = useMemo(
42
- () => ({
43
- createPortal: createLocalPortal,
44
- }),
45
- [createLocalPortal]
46
- );
47
-
48
- return (
49
- <PortalsContext.Provider value={value}>
50
- {children}
51
- <styles.PortalsWrapper ref={containerRef} />
52
- </PortalsContext.Provider>
53
- );
54
- };
1
+ import * as styles from './styles';
2
+
3
+ import {
4
+ FC,
5
+ PropsWithChildren,
6
+ ReactNode,
7
+ ReactPortal,
8
+ createContext,
9
+ useCallback,
10
+ useMemo,
11
+ useRef,
12
+ } from 'react';
13
+
14
+ import { createPortal } from 'react-dom';
15
+
16
+ export type PortalProps = {
17
+ key: string;
18
+ children: ReactNode;
19
+ };
20
+
21
+ export type PortalsContextType = {
22
+ createPortal: (children: ReactNode) => ReactPortal | null;
23
+ };
24
+
25
+ export const PortalsContext = createContext<PortalsContextType>({
26
+ createPortal: () => null,
27
+ });
28
+
29
+ export const PortalsProvider: FC<PropsWithChildren> = ({ children }) => {
30
+ const containerRef = useRef<HTMLDivElement | null>(null);
31
+
32
+ const createLocalPortal = useCallback(
33
+ (children: ReactNode) =>
34
+ createPortal(
35
+ <styles.PortalContainer>{children}</styles.PortalContainer>,
36
+ containerRef.current!
37
+ ) ?? null,
38
+ []
39
+ );
40
+
41
+ const value = useMemo(
42
+ () => ({
43
+ createPortal: createLocalPortal,
44
+ }),
45
+ [createLocalPortal]
46
+ );
47
+
48
+ return (
49
+ <PortalsContext.Provider value={value}>
50
+ {children}
51
+ <styles.PortalsWrapper ref={containerRef} />
52
+ </PortalsContext.Provider>
53
+ );
54
+ };
@@ -1,31 +1,31 @@
1
- import styled from 'styled-components';
2
-
3
- export const BackdropContainer = styled.div.attrs({
4
- className: 'BackdropContainer',
5
- })`
6
- position: fixed;
7
- top: 0;
8
- left: 0;
9
- right: 0;
10
- bottom: 0;
11
- z-index: 1000;
12
- background-color: rgba(0, 0, 0, 0.5);
13
- display: flex;
14
- justify-content: center;
15
- align-items: center;
16
- `;
17
-
18
- export const PortalsWrapper = styled.div.attrs({
19
- className: 'PortalsWrapper',
20
- })`
21
- width: 0;
22
- height: 0;
23
- `;
24
-
25
- export const PortalContainer = styled.div.attrs({
26
- className: 'PortalContainer',
27
- })`
28
- z-index: 9999;
29
- position: fixed;
30
- inset: 0;
31
- `;
1
+ import styled from 'styled-components';
2
+
3
+ export const BackdropContainer = styled.div.attrs({
4
+ className: 'BackdropContainer',
5
+ })`
6
+ position: fixed;
7
+ top: 0;
8
+ left: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ z-index: 1000;
12
+ background-color: rgba(0, 0, 0, 0.5);
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ `;
17
+
18
+ export const PortalsWrapper = styled.div.attrs({
19
+ className: 'PortalsWrapper',
20
+ })`
21
+ width: 0;
22
+ height: 0;
23
+ `;
24
+
25
+ export const PortalContainer = styled.div.attrs({
26
+ className: 'PortalContainer',
27
+ })`
28
+ z-index: 9999;
29
+ position: fixed;
30
+ inset: 0;
31
+ `;
@@ -1,70 +1,70 @@
1
- import {
2
- FC,
3
- PropsWithChildren,
4
- createContext,
5
- useCallback,
6
- useEffect,
7
- useMemo,
8
- useState,
9
- } from 'react';
10
-
11
- export type Settings = Record<string, string | undefined>;
12
-
13
- export type SettingsContextProps = {
14
- settings: Settings;
15
- updateSettings: (partialSettings: Settings) => void;
16
- };
17
-
18
- export const SettingsContext = createContext<SettingsContextProps>({
19
- settings: {},
20
- updateSettings: () => {},
21
- });
22
-
23
- export const SettingsProvider: FC<PropsWithChildren> = ({ children }) => {
24
- const [settings, setSettings] = useState({});
25
- const getSettings = useCallback(() => {
26
- try {
27
- const settingsJson = localStorage.getItem('settings');
28
- return settingsJson ? JSON.parse(settingsJson) : {};
29
- } catch (error) {
30
- console.warn('Settings load error', error);
31
- return {};
32
- }
33
- }, []);
34
-
35
- const saveSettings = useCallback((settingsToSave: Settings) => {
36
- try {
37
- localStorage.setItem('settings', JSON.stringify(settingsToSave));
38
- } catch (error) {
39
- console.error('Settings save error', error);
40
- }
41
- }, []);
42
-
43
- const updateSettings = useCallback(
44
- (partialSettings: Settings) => {
45
- const newSettings = {
46
- ...settings,
47
- ...partialSettings,
48
- };
49
- setSettings(newSettings);
50
- saveSettings(newSettings);
51
- },
52
- [saveSettings, settings]
53
- );
54
-
55
- useEffect(() => {
56
- const readSettings = getSettings();
57
- setSettings(readSettings);
58
- }, [getSettings]);
59
-
60
- const contextValue = useMemo(
61
- () => ({ settings, updateSettings }),
62
- [settings, updateSettings]
63
- );
64
-
65
- return (
66
- <SettingsContext.Provider value={contextValue}>
67
- {children}
68
- </SettingsContext.Provider>
69
- );
70
- };
1
+ import {
2
+ FC,
3
+ PropsWithChildren,
4
+ createContext,
5
+ useCallback,
6
+ useEffect,
7
+ useMemo,
8
+ useState,
9
+ } from 'react';
10
+
11
+ export type Settings = Record<string, string | undefined>;
12
+
13
+ export type SettingsContextProps = {
14
+ settings: Settings;
15
+ updateSettings: (partialSettings: Settings) => void;
16
+ };
17
+
18
+ export const SettingsContext = createContext<SettingsContextProps>({
19
+ settings: {},
20
+ updateSettings: () => {},
21
+ });
22
+
23
+ export const SettingsProvider: FC<PropsWithChildren> = ({ children }) => {
24
+ const [settings, setSettings] = useState({});
25
+ const getSettings = useCallback(() => {
26
+ try {
27
+ const settingsJson = localStorage.getItem('settings');
28
+ return settingsJson ? JSON.parse(settingsJson) : {};
29
+ } catch (error) {
30
+ console.warn('Settings load error', error);
31
+ return {};
32
+ }
33
+ }, []);
34
+
35
+ const saveSettings = useCallback((settingsToSave: Settings) => {
36
+ try {
37
+ localStorage.setItem('settings', JSON.stringify(settingsToSave));
38
+ } catch (error) {
39
+ console.error('Settings save error', error);
40
+ }
41
+ }, []);
42
+
43
+ const updateSettings = useCallback(
44
+ (partialSettings: Settings) => {
45
+ const newSettings = {
46
+ ...settings,
47
+ ...partialSettings,
48
+ };
49
+ setSettings(newSettings);
50
+ saveSettings(newSettings);
51
+ },
52
+ [saveSettings, settings]
53
+ );
54
+
55
+ useEffect(() => {
56
+ const readSettings = getSettings();
57
+ setSettings(readSettings);
58
+ }, [getSettings]);
59
+
60
+ const contextValue = useMemo(
61
+ () => ({ settings, updateSettings }),
62
+ [settings, updateSettings]
63
+ );
64
+
65
+ return (
66
+ <SettingsContext.Provider value={contextValue}>
67
+ {children}
68
+ </SettingsContext.Provider>
69
+ );
70
+ };
@@ -1,63 +1,63 @@
1
- import { Theme } from './types';
2
- import { defaultTheme } from './defaultTheme';
3
- import styled from 'styled-components';
4
-
5
- type ThemeProviderProps = {
6
- $theme?: Theme;
7
- $darkMode?: boolean;
8
- };
9
-
10
- const getThemeValuesCss = (
11
- prefix: string,
12
- obj: Record<string, string> | undefined
13
- ) => {
14
- return Object.entries(obj ?? {})
15
- .map(([key, value]) => {
16
- return `--${prefix}-${key}: ${value};`;
17
- })
18
- .join('');
19
- };
20
-
21
- const getThemeColorsCss = (colors: Theme['colors'], darkMode = false) => {
22
- return Object.entries(colors ?? {})
23
- .map(([color, intensities]) =>
24
- Object.entries(
25
- (typeof intensities === 'string'
26
- ? (colors ?? {})[intensities] ??
27
- (defaultTheme.colors ?? {})[intensities]
28
- : intensities) ?? {}
29
- )
30
- .map(
31
- ([intensity, value]) =>
32
- `--color-${color}-${
33
- darkMode ? 1000 - Number(intensity) : intensity
34
- }: ${value};`
35
- )
36
- .join('')
37
- )
38
- .join('');
39
- };
40
-
41
- export const ThemeProvider = styled.div<ThemeProviderProps>`
42
- display: contents;
43
- ${({ $theme = {}, $darkMode }) => {
44
- return [
45
- getThemeColorsCss($theme.colors, $darkMode),
46
- getThemeValuesCss('font', $theme.fonts),
47
- getThemeValuesCss('text', $theme.texts),
48
- getThemeValuesCss('weight', $theme.weights),
49
- getThemeValuesCss('space', $theme.spaces),
50
- getThemeValuesCss('size', $theme.sizes),
51
- getThemeValuesCss('rounded', $theme.rounded),
52
- getThemeValuesCss('shadow', $theme.shadows),
53
- ].join('');
54
- }}
55
-
56
- a, a:visited {
57
- color: var(--color-primary-500);
58
- }
59
- a:active,
60
- a:hover {
61
- color: var(--color-primary-700);
62
- }
63
- `;
1
+ import { Theme } from './types';
2
+ import { defaultTheme } from './defaultTheme';
3
+ import styled from 'styled-components';
4
+
5
+ type ThemeProviderProps = {
6
+ $theme?: Theme;
7
+ $darkMode?: boolean;
8
+ };
9
+
10
+ const getThemeValuesCss = (
11
+ prefix: string,
12
+ obj: Record<string, string> | undefined
13
+ ) => {
14
+ return Object.entries(obj ?? {})
15
+ .map(([key, value]) => {
16
+ return `--${prefix}-${key}: ${value};`;
17
+ })
18
+ .join('');
19
+ };
20
+
21
+ const getThemeColorsCss = (colors: Theme['colors'], darkMode = false) => {
22
+ return Object.entries(colors ?? {})
23
+ .map(([color, intensities]) =>
24
+ Object.entries(
25
+ (typeof intensities === 'string'
26
+ ? (colors ?? {})[intensities] ??
27
+ (defaultTheme.colors ?? {})[intensities]
28
+ : intensities) ?? {}
29
+ )
30
+ .map(
31
+ ([intensity, value]) =>
32
+ `--color-${color}-${
33
+ darkMode ? 1000 - Number(intensity) : intensity
34
+ }: ${value};`
35
+ )
36
+ .join('')
37
+ )
38
+ .join('');
39
+ };
40
+
41
+ export const ThemeProvider = styled.div<ThemeProviderProps>`
42
+ display: contents;
43
+ ${({ $theme = {}, $darkMode }) => {
44
+ return [
45
+ getThemeColorsCss($theme.colors, $darkMode),
46
+ getThemeValuesCss('font', $theme.fonts),
47
+ getThemeValuesCss('text', $theme.texts),
48
+ getThemeValuesCss('weight', $theme.weights),
49
+ getThemeValuesCss('space', $theme.spaces),
50
+ getThemeValuesCss('size', $theme.sizes),
51
+ getThemeValuesCss('rounded', $theme.rounded),
52
+ getThemeValuesCss('shadow', $theme.shadows),
53
+ ].join('');
54
+ }}
55
+
56
+ a, a:visited {
57
+ color: var(--color-primary-500);
58
+ }
59
+ a:active,
60
+ a:hover {
61
+ color: var(--color-primary-700);
62
+ }
63
+ `;