flysoft-react-ui 1.2.4 → 1.2.5
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.
- package/AI_CONTEXT.md +1400 -217
- package/AI_INTEGRATION_GUIDE.md +343 -0
- package/INTEGRATION_GUIDE.md +60 -0
- package/README.md +5 -3
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/layout/Accordion.d.ts +1 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -1
- package/dist/components/layout/DataTable.d.ts.map +1 -1
- package/dist/components/layout/DropdownMenu.d.ts +2 -1
- package/dist/components/layout/DropdownMenu.d.ts.map +1 -1
- package/dist/components/layout/DropdownPanel.d.ts +2 -1
- package/dist/components/layout/DropdownPanel.d.ts.map +1 -1
- package/dist/components/layout/Filter.d.ts +1 -0
- package/dist/components/layout/Filter.d.ts.map +1 -1
- package/dist/components/layout/Menu.d.ts +2 -1
- package/dist/components/layout/Menu.d.ts.map +1 -1
- package/dist/components/layout/TabsGroup.d.ts +1 -0
- package/dist/components/layout/TabsGroup.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11889 -24
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.d.ts +1 -0
- package/dist/templates/forms/ContactForm.d.ts.map +1 -1
- package/dist/templates/forms/LoginForm.d.ts +1 -0
- package/dist/templates/forms/LoginForm.d.ts.map +1 -1
- package/dist/templates/forms/RegistrationForm.d.ts +1 -0
- package/dist/templates/forms/RegistrationForm.d.ts.map +1 -1
- package/dist/templates/layouts/DashboardLayout.d.ts +1 -0
- package/dist/templates/layouts/DashboardLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts +1 -0
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.d.ts +1 -0
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/ListPattern.d.ts +77 -0
- package/dist/templates/patterns/ListPattern.d.ts.map +1 -0
- package/package.json +6 -3
- package/dist/App.d.ts +0 -4
- package/dist/App.d.ts.map +0 -1
- package/dist/App.js +0 -30
- package/dist/components/ThemeSwitcher.js +0 -12
- package/dist/components/form-controls/AutocompleteInput.js +0 -680
- package/dist/components/form-controls/Button.js +0 -211
- package/dist/components/form-controls/Checkbox.js +0 -79
- package/dist/components/form-controls/CurrencyInput.js +0 -106
- package/dist/components/form-controls/DateInput.js +0 -578
- package/dist/components/form-controls/DatePicker.js +0 -144
- package/dist/components/form-controls/Input.js +0 -35
- package/dist/components/form-controls/LinkButton.js +0 -248
- package/dist/components/form-controls/Pagination.js +0 -23
- package/dist/components/form-controls/RadioButtonGroup.js +0 -220
- package/dist/components/form-controls/SearchSelectInput.js +0 -336
- package/dist/components/form-controls/index.js +0 -11
- package/dist/components/index.js +0 -7
- package/dist/components/layout/Accordion.js +0 -67
- package/dist/components/layout/AppLayout.js +0 -230
- package/dist/components/layout/Card.js +0 -54
- package/dist/components/layout/Collection.js +0 -18
- package/dist/components/layout/DataField.js +0 -38
- package/dist/components/layout/DataTable.js +0 -164
- package/dist/components/layout/DropdownMenu.js +0 -176
- package/dist/components/layout/DropdownPanel.js +0 -162
- package/dist/components/layout/Filter.js +0 -629
- package/dist/components/layout/Menu.js +0 -21
- package/dist/components/layout/TabPanel.js +0 -11
- package/dist/components/layout/TabsGroup.js +0 -52
- package/dist/components/layout/index.js +0 -12
- package/dist/components/utils/Avatar.js +0 -77
- package/dist/components/utils/Badge.js +0 -151
- package/dist/components/utils/Dialog.js +0 -44
- package/dist/components/utils/FiltersDialog.js +0 -104
- package/dist/components/utils/Loader.js +0 -44
- package/dist/components/utils/RoadMap.js +0 -139
- package/dist/components/utils/Skeleton.js +0 -10
- package/dist/components/utils/Snackbar.js +0 -136
- package/dist/components/utils/SnackbarContainer.js +0 -26
- package/dist/components/utils/iconUtils.js +0 -40
- package/dist/components/utils/index.js +0 -9
- package/dist/contexts/AppLayoutContext.js +0 -104
- package/dist/contexts/AuthContext.js +0 -224
- package/dist/contexts/CrudContext.js +0 -333
- package/dist/contexts/SnackbarContext.js +0 -41
- package/dist/contexts/ThemeContext.js +0 -197
- package/dist/contexts/index.js +0 -13
- package/dist/contexts/presets.js +0 -311
- package/dist/contexts/types.js +0 -1
- package/dist/docs/AccordionDocs.d.ts +0 -4
- package/dist/docs/AccordionDocs.d.ts.map +0 -1
- package/dist/docs/AccordionDocs.js +0 -21
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts +0 -13
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/AuthDocs.js +0 -18
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts +0 -2
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +0 -22
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +0 -24
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/mockAuthService.js +0 -78
- package/dist/docs/AutocompleteInputDocs.d.ts +0 -4
- package/dist/docs/AutocompleteInputDocs.d.ts.map +0 -1
- package/dist/docs/AutocompleteInputDocs.js +0 -84
- package/dist/docs/AvatarDocs.d.ts +0 -4
- package/dist/docs/AvatarDocs.d.ts.map +0 -1
- package/dist/docs/AvatarDocs.js +0 -7
- package/dist/docs/BadgeDocs.d.ts +0 -4
- package/dist/docs/BadgeDocs.d.ts.map +0 -1
- package/dist/docs/BadgeDocs.js +0 -9
- package/dist/docs/ButtonDocs.d.ts +0 -4
- package/dist/docs/ButtonDocs.d.ts.map +0 -1
- package/dist/docs/ButtonDocs.js +0 -7
- package/dist/docs/CardDocs.d.ts +0 -4
- package/dist/docs/CardDocs.d.ts.map +0 -1
- package/dist/docs/CardDocs.js +0 -22
- package/dist/docs/CheckboxDocs.d.ts +0 -4
- package/dist/docs/CheckboxDocs.d.ts.map +0 -1
- package/dist/docs/CheckboxDocs.js +0 -7
- package/dist/docs/CurrencyInputDocs.d.ts +0 -4
- package/dist/docs/CurrencyInputDocs.d.ts.map +0 -1
- package/dist/docs/CurrencyInputDocs.js +0 -22
- package/dist/docs/DataFieldDocs.d.ts +0 -4
- package/dist/docs/DataFieldDocs.d.ts.map +0 -1
- package/dist/docs/DataFieldDocs.js +0 -7
- package/dist/docs/DataTableDocs.d.ts +0 -4
- package/dist/docs/DataTableDocs.d.ts.map +0 -1
- package/dist/docs/DataTableDocs.js +0 -244
- package/dist/docs/DateInputDocs.d.ts +0 -5
- package/dist/docs/DateInputDocs.d.ts.map +0 -1
- package/dist/docs/DateInputDocs.js +0 -19
- package/dist/docs/DatePickerDocs.d.ts +0 -5
- package/dist/docs/DatePickerDocs.d.ts.map +0 -1
- package/dist/docs/DatePickerDocs.js +0 -16
- package/dist/docs/DialogDocs.d.ts +0 -4
- package/dist/docs/DialogDocs.d.ts.map +0 -1
- package/dist/docs/DialogDocs.js +0 -13
- package/dist/docs/DocAdmin.d.ts +0 -4
- package/dist/docs/DocAdmin.d.ts.map +0 -1
- package/dist/docs/DocAdmin.js +0 -68
- package/dist/docs/DocsMenu.d.ts +0 -2
- package/dist/docs/DocsMenu.d.ts.map +0 -1
- package/dist/docs/DocsMenu.js +0 -5
- package/dist/docs/DocsRouter.d.ts +0 -4
- package/dist/docs/DocsRouter.d.ts.map +0 -1
- package/dist/docs/DocsRouter.js +0 -39
- package/dist/docs/DropdownMenuDocs.d.ts +0 -4
- package/dist/docs/DropdownMenuDocs.d.ts.map +0 -1
- package/dist/docs/DropdownMenuDocs.js +0 -66
- package/dist/docs/DropdownPanelDocs.d.ts +0 -4
- package/dist/docs/DropdownPanelDocs.d.ts.map +0 -1
- package/dist/docs/DropdownPanelDocs.js +0 -7
- package/dist/docs/ExampleFormDocs.d.ts +0 -4
- package/dist/docs/ExampleFormDocs.d.ts.map +0 -1
- package/dist/docs/ExampleFormDocs.js +0 -153
- package/dist/docs/FilterDocs.d.ts +0 -4
- package/dist/docs/FilterDocs.d.ts.map +0 -1
- package/dist/docs/FilterDocs.js +0 -130
- package/dist/docs/InputDocs.d.ts +0 -4
- package/dist/docs/InputDocs.d.ts.map +0 -1
- package/dist/docs/InputDocs.js +0 -17
- package/dist/docs/LinkButtonDocs.d.ts +0 -4
- package/dist/docs/LinkButtonDocs.d.ts.map +0 -1
- package/dist/docs/LinkButtonDocs.js +0 -7
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +0 -47
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +0 -34
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +0 -66
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +0 -7
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +0 -10
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +0 -39
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +0 -57
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +0 -9
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +0 -30
- package/dist/docs/LoaderDocs.d.ts +0 -4
- package/dist/docs/LoaderDocs.d.ts.map +0 -1
- package/dist/docs/LoaderDocs.js +0 -33
- package/dist/docs/MenuDocs.d.ts +0 -4
- package/dist/docs/MenuDocs.d.ts.map +0 -1
- package/dist/docs/MenuDocs.js +0 -26
- package/dist/docs/PaginationDocs.d.ts +0 -4
- package/dist/docs/PaginationDocs.d.ts.map +0 -1
- package/dist/docs/PaginationDocs.js +0 -38
- package/dist/docs/RadioButtonGroupDocs.d.ts +0 -4
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +0 -1
- package/dist/docs/RadioButtonGroupDocs.js +0 -46
- package/dist/docs/RoadMapDocs.d.ts +0 -4
- package/dist/docs/RoadMapDocs.d.ts.map +0 -1
- package/dist/docs/RoadMapDocs.js +0 -171
- package/dist/docs/SearchSelectInputDocs.d.ts +0 -4
- package/dist/docs/SearchSelectInputDocs.d.ts.map +0 -1
- package/dist/docs/SearchSelectInputDocs.js +0 -168
- package/dist/docs/SkeletonDocs.d.ts +0 -4
- package/dist/docs/SkeletonDocs.d.ts.map +0 -1
- package/dist/docs/SkeletonDocs.js +0 -7
- package/dist/docs/SnackbarDocs.d.ts +0 -4
- package/dist/docs/SnackbarDocs.d.ts.map +0 -1
- package/dist/docs/SnackbarDocs.js +0 -69
- package/dist/docs/TabsGroupDocs.d.ts +0 -4
- package/dist/docs/TabsGroupDocs.d.ts.map +0 -1
- package/dist/docs/TabsGroupDocs.js +0 -38
- package/dist/docs/ThemeSwitcherDocs.d.ts +0 -4
- package/dist/docs/ThemeSwitcherDocs.d.ts.map +0 -1
- package/dist/docs/ThemeSwitcherDocs.js +0 -11
- package/dist/docs/docMockServices/empresaService.d.ts +0 -38
- package/dist/docs/docMockServices/empresaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/empresaService.js +0 -125
- package/dist/docs/docMockServices/index.d.ts +0 -9
- package/dist/docs/docMockServices/index.d.ts.map +0 -1
- package/dist/docs/docMockServices/index.js +0 -8
- package/dist/docs/docMockServices/initialData.d.ts +0 -6
- package/dist/docs/docMockServices/initialData.d.ts.map +0 -1
- package/dist/docs/docMockServices/initialData.js +0 -132
- package/dist/docs/docMockServices/interfaces.d.ts +0 -38
- package/dist/docs/docMockServices/interfaces.d.ts.map +0 -1
- package/dist/docs/docMockServices/interfaces.js +0 -1
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +0 -43
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/personaEmpresaService.js +0 -151
- package/dist/docs/docMockServices/personaService.d.ts +0 -39
- package/dist/docs/docMockServices/personaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/personaService.js +0 -190
- package/dist/helpers/currencyFormat.js +0 -3
- package/dist/helpers/getErrorMessage.js +0 -13
- package/dist/helpers/getInitialLetters.js +0 -5
- package/dist/helpers/getQueryString.js +0 -13
- package/dist/helpers/index.js +0 -9
- package/dist/helpers/mappers.js +0 -27
- package/dist/helpers/nameValueArrayToObject.js +0 -3
- package/dist/helpers/objectToQueryString.js +0 -3
- package/dist/helpers/queryStringToObject.js +0 -13
- package/dist/helpers/regularExpressions.js +0 -5
- package/dist/hooks/index.js +0 -6
- package/dist/hooks/useAsyncRequest.js +0 -53
- package/dist/hooks/useBreakpoint.js +0 -59
- package/dist/hooks/useElementScroll.js +0 -58
- package/dist/hooks/useEnum.js +0 -21
- package/dist/hooks/useGlobalThemeStyles.js +0 -40
- package/dist/hooks/useThemeOverride.js +0 -99
- package/dist/interfaces/index.js +0 -1
- package/dist/interfaces/name-value.interface.js +0 -1
- package/dist/interfaces/pagination.interface.js +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -6
- package/dist/services/apiClient.js +0 -216
- package/dist/services/index.js +0 -1
- package/dist/styles.d.ts +0 -2
- package/dist/styles.d.ts.map +0 -1
- package/dist/styles.js +0 -3
- package/dist/templates/forms/ContactForm.js +0 -58
- package/dist/templates/forms/LoginForm.js +0 -36
- package/dist/templates/forms/RegistrationForm.js +0 -54
- package/dist/templates/layouts/DashboardLayout.js +0 -26
- package/dist/templates/layouts/SidebarLayout.js +0 -28
- package/dist/templates/patterns/FormPattern.js +0 -68
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useEffect, useMemo, useRef, useState, useCallback, } from "react";
|
|
3
|
-
import { useSearchParams } from "react-router-dom";
|
|
4
|
-
import { Pagination } from "../components/form-controls/Pagination";
|
|
5
|
-
import { useAsyncRequest } from "../hooks/useAsyncRequest";
|
|
6
|
-
const createCrudContext = () => {
|
|
7
|
-
return createContext(undefined);
|
|
8
|
-
};
|
|
9
|
-
// Crear el contexto con un tipo genérico por defecto
|
|
10
|
-
// Los usuarios pueden crear su propio contexto con su tipo específico
|
|
11
|
-
export const CrudContext = createCrudContext();
|
|
12
|
-
export function CrudProvider({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], singleItemId, extraData: extraDataProp, }) {
|
|
13
|
-
const [extraData, setExtraData] = useState(extraDataProp);
|
|
14
|
-
const [list, setList] = useState(undefined);
|
|
15
|
-
const [item, setItem] = useState(undefined);
|
|
16
|
-
const [page, setPage] = useState(1);
|
|
17
|
-
const [pages, setPages] = useState(1);
|
|
18
|
-
const [total, setTotal] = useState(0);
|
|
19
|
-
const [searchParams, setSearchParams] = useSearchParams();
|
|
20
|
-
// Extraer funciones execute y opciones de las promises
|
|
21
|
-
const getPromiseExecute = getPromise
|
|
22
|
-
? typeof getPromise === "function"
|
|
23
|
-
? getPromise
|
|
24
|
-
: getPromise.execute
|
|
25
|
-
: undefined;
|
|
26
|
-
const getPromiseSuccessMessage = getPromise && typeof getPromise === "object"
|
|
27
|
-
? getPromise.successMessage
|
|
28
|
-
: undefined;
|
|
29
|
-
const getPromiseErrorMessage = getPromise && typeof getPromise === "object"
|
|
30
|
-
? getPromise.errorMessage
|
|
31
|
-
: undefined;
|
|
32
|
-
const postPromiseExecute = postPromise
|
|
33
|
-
? typeof postPromise === "function"
|
|
34
|
-
? postPromise
|
|
35
|
-
: postPromise.execute
|
|
36
|
-
: undefined;
|
|
37
|
-
const postPromiseSuccessMessage = postPromise && typeof postPromise === "object"
|
|
38
|
-
? postPromise.successMessage
|
|
39
|
-
: undefined;
|
|
40
|
-
const postPromiseErrorMessage = postPromise && typeof postPromise === "object"
|
|
41
|
-
? postPromise.errorMessage
|
|
42
|
-
: undefined;
|
|
43
|
-
const putPromiseExecute = putPromise
|
|
44
|
-
? typeof putPromise === "function"
|
|
45
|
-
? putPromise
|
|
46
|
-
: putPromise.execute
|
|
47
|
-
: undefined;
|
|
48
|
-
const putPromiseSuccessMessage = putPromise && typeof putPromise === "object"
|
|
49
|
-
? putPromise.successMessage
|
|
50
|
-
: undefined;
|
|
51
|
-
const putPromiseErrorMessage = putPromise && typeof putPromise === "object"
|
|
52
|
-
? putPromise.errorMessage
|
|
53
|
-
: undefined;
|
|
54
|
-
const deletePromiseExecute = deletePromise
|
|
55
|
-
? typeof deletePromise === "function"
|
|
56
|
-
? deletePromise
|
|
57
|
-
: deletePromise.execute
|
|
58
|
-
: undefined;
|
|
59
|
-
const deletePromiseSuccessMessage = deletePromise && typeof deletePromise === "object"
|
|
60
|
-
? deletePromise.successMessage
|
|
61
|
-
: undefined;
|
|
62
|
-
const deletePromiseErrorMessage = deletePromise && typeof deletePromise === "object"
|
|
63
|
-
? deletePromise.errorMessage
|
|
64
|
-
: undefined;
|
|
65
|
-
const getItemPromiseExecute = getItemPromise
|
|
66
|
-
? typeof getItemPromise === "function"
|
|
67
|
-
? getItemPromise
|
|
68
|
-
: getItemPromise.execute
|
|
69
|
-
: undefined;
|
|
70
|
-
const getItemPromiseSuccessMessage = getItemPromise && typeof getItemPromise === "object"
|
|
71
|
-
? getItemPromise.successMessage
|
|
72
|
-
: undefined;
|
|
73
|
-
const getItemPromiseErrorMessage = getItemPromise && typeof getItemPromise === "object"
|
|
74
|
-
? getItemPromise.errorMessage
|
|
75
|
-
: undefined;
|
|
76
|
-
const getPromiseRef = useRef(getPromiseExecute);
|
|
77
|
-
// Hooks para manejar las peticiones asíncronas con mensajes opcionales
|
|
78
|
-
const fetchDataAsync = useAsyncRequest({
|
|
79
|
-
successMessage: getPromiseSuccessMessage,
|
|
80
|
-
errorMessage: getPromiseErrorMessage,
|
|
81
|
-
});
|
|
82
|
-
const createItemAsync = useAsyncRequest({
|
|
83
|
-
successMessage: postPromiseSuccessMessage,
|
|
84
|
-
errorMessage: postPromiseErrorMessage,
|
|
85
|
-
});
|
|
86
|
-
const updateItemAsync = useAsyncRequest({
|
|
87
|
-
successMessage: putPromiseSuccessMessage,
|
|
88
|
-
errorMessage: putPromiseErrorMessage,
|
|
89
|
-
});
|
|
90
|
-
const deleteItemAsync = useAsyncRequest({
|
|
91
|
-
successMessage: deletePromiseSuccessMessage,
|
|
92
|
-
errorMessage: deletePromiseErrorMessage,
|
|
93
|
-
});
|
|
94
|
-
const fetchItemAsync = useAsyncRequest({
|
|
95
|
-
successMessage: getItemPromiseSuccessMessage,
|
|
96
|
-
errorMessage: getItemPromiseErrorMessage,
|
|
97
|
-
});
|
|
98
|
-
// El isLoading del contexto usa el hook de fetchData
|
|
99
|
-
const isLoading = fetchDataAsync.isLoading;
|
|
100
|
-
// Actualizar la referencia cuando cambie getPromise
|
|
101
|
-
useEffect(() => {
|
|
102
|
-
getPromiseRef.current = getPromiseExecute;
|
|
103
|
-
}, [getPromiseExecute]);
|
|
104
|
-
// Función para obtener los parámetros de la URL
|
|
105
|
-
const getUrlParams = useCallback(() => {
|
|
106
|
-
const params = { limit };
|
|
107
|
-
// Agregar pageParam si existe en la URL
|
|
108
|
-
const pageValue = searchParams.get(pageParam);
|
|
109
|
-
if (pageValue) {
|
|
110
|
-
const parsedPage = parseInt(pageValue, 10);
|
|
111
|
-
if (!isNaN(parsedPage)) {
|
|
112
|
-
params[pageParam] = parsedPage;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Agregar urlParams si existen en la URL
|
|
116
|
-
urlParams.forEach((paramName) => {
|
|
117
|
-
const paramValue = searchParams.get(paramName);
|
|
118
|
-
if (paramValue !== null) {
|
|
119
|
-
params[paramName] = paramValue;
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
return params;
|
|
123
|
-
}, [searchParams, pageParam, urlParams, limit]);
|
|
124
|
-
// Función para obtener los datos
|
|
125
|
-
const fetchData = useCallback(async (params) => {
|
|
126
|
-
if (!getPromiseExecute) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
// Obtener los parámetros que se van a usar
|
|
130
|
-
const requestParams = params || getUrlParams();
|
|
131
|
-
const result = await fetchDataAsync.execute(async () => {
|
|
132
|
-
return await getPromiseRef.current(requestParams);
|
|
133
|
-
});
|
|
134
|
-
// Solo procesar el resultado si no es undefined (undefined significa error)
|
|
135
|
-
if (result !== undefined) {
|
|
136
|
-
if (result && typeof result === "object" && "list" in result) {
|
|
137
|
-
// Es un PaginationInterface
|
|
138
|
-
const { list, page, pages, total } = result;
|
|
139
|
-
setList(list);
|
|
140
|
-
setPage(page);
|
|
141
|
-
setPages(pages);
|
|
142
|
-
setTotal(total);
|
|
143
|
-
}
|
|
144
|
-
else if (Array.isArray(result)) {
|
|
145
|
-
// Es un array simple
|
|
146
|
-
setList(result);
|
|
147
|
-
setPage(1);
|
|
148
|
-
setTotal(result.length);
|
|
149
|
-
setPages(Math.ceil(result.length / limit));
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
// Resultado null
|
|
153
|
-
setList(undefined);
|
|
154
|
-
setPage(1);
|
|
155
|
-
setPages(1);
|
|
156
|
-
setTotal(0);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}, [getUrlParams, limit, fetchDataAsync, getPromiseExecute]);
|
|
160
|
-
// Ref para almacenar los valores anteriores de urlParams
|
|
161
|
-
const prevUrlParamsValuesRef = useRef({});
|
|
162
|
-
// Memoizar los valores actuales de los urlParams
|
|
163
|
-
const urlParamsValues = useMemo(() => {
|
|
164
|
-
const values = {};
|
|
165
|
-
urlParams.forEach((paramName) => {
|
|
166
|
-
values[paramName] = searchParams.get(paramName);
|
|
167
|
-
});
|
|
168
|
-
return values;
|
|
169
|
-
}, [searchParams, urlParams]);
|
|
170
|
-
// Memoizar los parámetros de URL para evitar re-renders innecesarios
|
|
171
|
-
const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
|
|
172
|
-
// Memoizar solo los parámetros relevantes de la URL (urlParams + pageParam)
|
|
173
|
-
// para que el useEffect solo se ejecute cuando cambien estos parámetros
|
|
174
|
-
const relevantParamsKey = useMemo(() => {
|
|
175
|
-
const relevantParams = {};
|
|
176
|
-
// Agregar pageParam si existe
|
|
177
|
-
const pageValue = searchParams.get(pageParam);
|
|
178
|
-
if (pageValue) {
|
|
179
|
-
relevantParams[pageParam] = pageValue;
|
|
180
|
-
}
|
|
181
|
-
// Agregar urlParams si existen
|
|
182
|
-
urlParams.forEach((paramName) => {
|
|
183
|
-
const paramValue = searchParams.get(paramName);
|
|
184
|
-
if (paramValue !== null) {
|
|
185
|
-
relevantParams[paramName] = paramValue;
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
return JSON.stringify(relevantParams);
|
|
189
|
-
}, [searchParams, pageParam, urlParams]);
|
|
190
|
-
// Memoizar los parámetros actuales para exponerlos
|
|
191
|
-
const currentParams = useMemo(() => getUrlParams(),
|
|
192
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
193
|
-
[searchParams, pageParam, urlParamsKey, limit, urlParams]);
|
|
194
|
-
// Función para recargar los datos
|
|
195
|
-
const fetchItemsExecute = useCallback(async (params) => {
|
|
196
|
-
await fetchData(params);
|
|
197
|
-
}, [fetchData]);
|
|
198
|
-
// Función para obtener un item individual
|
|
199
|
-
const fetchItemExecute = useCallback(async (params) => {
|
|
200
|
-
if (!getItemPromiseExecute) {
|
|
201
|
-
throw new Error("getItemPromise is not defined. Please provide getItemPromise to CrudProvider.");
|
|
202
|
-
}
|
|
203
|
-
// Si no se pasan parámetros, usar singleItemId si está disponible
|
|
204
|
-
const finalParams = params !== undefined ? params : singleItemId;
|
|
205
|
-
if (finalParams === undefined) {
|
|
206
|
-
throw new Error("No parameters provided and singleItemId is not defined. Please provide parameters or set singleItemId in CrudProvider.");
|
|
207
|
-
}
|
|
208
|
-
const result = await fetchItemAsync.execute(async () => {
|
|
209
|
-
return await getItemPromiseExecute(finalParams);
|
|
210
|
-
});
|
|
211
|
-
if (result !== undefined) {
|
|
212
|
-
setItem(result);
|
|
213
|
-
}
|
|
214
|
-
return result;
|
|
215
|
-
}, [getItemPromiseExecute, fetchItemAsync, singleItemId]);
|
|
216
|
-
// Función para crear un item
|
|
217
|
-
const createItemExecute = useCallback(async (item) => {
|
|
218
|
-
if (!postPromiseExecute) {
|
|
219
|
-
throw new Error("postPromise is not defined. Please provide postPromise to CrudProvider.");
|
|
220
|
-
}
|
|
221
|
-
return await createItemAsync.execute(async () => {
|
|
222
|
-
return await postPromiseExecute(item);
|
|
223
|
-
});
|
|
224
|
-
}, [postPromiseExecute, createItemAsync]);
|
|
225
|
-
// Función para actualizar un item
|
|
226
|
-
const updateItemExecute = useCallback(async (item) => {
|
|
227
|
-
if (!putPromiseExecute) {
|
|
228
|
-
throw new Error("putPromise is not defined. Please provide putPromise to CrudProvider.");
|
|
229
|
-
}
|
|
230
|
-
return await updateItemAsync.execute(async () => {
|
|
231
|
-
return await putPromiseExecute(item);
|
|
232
|
-
});
|
|
233
|
-
}, [putPromiseExecute, updateItemAsync]);
|
|
234
|
-
// Función para eliminar un item
|
|
235
|
-
const deleteItemExecute = useCallback(async (item) => {
|
|
236
|
-
if (!deletePromiseExecute) {
|
|
237
|
-
throw new Error("deletePromise is not defined. Please provide deletePromise to CrudProvider.");
|
|
238
|
-
}
|
|
239
|
-
await deleteItemAsync.execute(async () => {
|
|
240
|
-
await deletePromiseExecute(item);
|
|
241
|
-
});
|
|
242
|
-
}, [deletePromiseExecute, deleteItemAsync]);
|
|
243
|
-
// useEffect para resetear pageParam a 1 cuando cambien los urlParams
|
|
244
|
-
useEffect(() => {
|
|
245
|
-
// Verificar si hay algún urlParam definido
|
|
246
|
-
if (urlParams.length === 0) {
|
|
247
|
-
prevUrlParamsValuesRef.current = {};
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
// Comparar valores actuales con los anteriores
|
|
251
|
-
const prevValues = prevUrlParamsValuesRef.current;
|
|
252
|
-
const hasChanged = urlParams.some((paramName) => prevValues[paramName] !== urlParamsValues[paramName]);
|
|
253
|
-
// Si los urlParams cambiaron, resetear pageParam a 1
|
|
254
|
-
if (hasChanged) {
|
|
255
|
-
const currentPage = searchParams.get(pageParam);
|
|
256
|
-
if (currentPage && currentPage !== "1") {
|
|
257
|
-
const newSearchParams = new URLSearchParams(searchParams);
|
|
258
|
-
newSearchParams.set(pageParam, "1");
|
|
259
|
-
setSearchParams(newSearchParams, { replace: true });
|
|
260
|
-
// No hacer fetchData aquí, se hará cuando cambien los searchParams
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// Actualizar los valores anteriores
|
|
265
|
-
prevUrlParamsValuesRef.current = { ...urlParamsValues };
|
|
266
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
267
|
-
}, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
|
|
268
|
-
// useEffect para ejecutar fetchData cuando cambian los parámetros relevantes o getPromise
|
|
269
|
-
useEffect(() => {
|
|
270
|
-
if (!getPromiseExecute) {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
const timeoutId = setTimeout(() => {
|
|
274
|
-
fetchData();
|
|
275
|
-
}, 0);
|
|
276
|
-
return () => clearTimeout(timeoutId);
|
|
277
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
278
|
-
}, [relevantParamsKey, getPromiseExecute]);
|
|
279
|
-
// useEffect para obtener el item individual cuando cambie singleItemId
|
|
280
|
-
useEffect(() => {
|
|
281
|
-
if (singleItemId !== undefined && getItemPromiseExecute) {
|
|
282
|
-
fetchItemExecute(singleItemId);
|
|
283
|
-
}
|
|
284
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
285
|
-
}, [singleItemId]);
|
|
286
|
-
// Sincronizar extraDataProp con el estado local
|
|
287
|
-
useEffect(() => {
|
|
288
|
-
setExtraData(extraDataProp);
|
|
289
|
-
}, [extraDataProp]);
|
|
290
|
-
const value = {
|
|
291
|
-
list,
|
|
292
|
-
item,
|
|
293
|
-
page,
|
|
294
|
-
pages,
|
|
295
|
-
total,
|
|
296
|
-
limit,
|
|
297
|
-
isLoading,
|
|
298
|
-
params: currentParams,
|
|
299
|
-
fetchItems: {
|
|
300
|
-
execute: fetchItemsExecute,
|
|
301
|
-
isLoading: fetchDataAsync.isLoading,
|
|
302
|
-
},
|
|
303
|
-
fetchItem: {
|
|
304
|
-
execute: fetchItemExecute,
|
|
305
|
-
isLoading: fetchItemAsync.isLoading,
|
|
306
|
-
},
|
|
307
|
-
createItem: {
|
|
308
|
-
execute: createItemExecute,
|
|
309
|
-
isLoading: createItemAsync.isLoading,
|
|
310
|
-
},
|
|
311
|
-
updateItem: {
|
|
312
|
-
execute: updateItemExecute,
|
|
313
|
-
isLoading: updateItemAsync.isLoading,
|
|
314
|
-
},
|
|
315
|
-
deleteItem: {
|
|
316
|
-
execute: deleteItemExecute,
|
|
317
|
-
isLoading: deleteItemAsync.isLoading,
|
|
318
|
-
},
|
|
319
|
-
pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
|
|
320
|
-
extraData,
|
|
321
|
-
setExtraData,
|
|
322
|
-
};
|
|
323
|
-
return _jsx(CrudContext.Provider, { value: value, children: children });
|
|
324
|
-
}
|
|
325
|
-
// Hook to use Crud context
|
|
326
|
-
// eslint-disable-next-line react-refresh/only-export-components
|
|
327
|
-
export function useCrud() {
|
|
328
|
-
const context = useContext(CrudContext);
|
|
329
|
-
if (context === undefined) {
|
|
330
|
-
throw new Error("useCrud must be used within a CrudProvider");
|
|
331
|
-
}
|
|
332
|
-
return context;
|
|
333
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import React, { createContext, useContext, useState, useCallback, useMemo, } from "react";
|
|
3
|
-
const SnackbarStateContext = createContext(undefined);
|
|
4
|
-
const SnackbarActionsContext = createContext(undefined);
|
|
5
|
-
export const SnackbarProvider = ({ children, }) => {
|
|
6
|
-
const [snackbars, setSnackbars] = useState([]);
|
|
7
|
-
const showSnackbar = useCallback((message, variant = "info", options) => {
|
|
8
|
-
const id = `snackbar-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
9
|
-
const newSnackbar = {
|
|
10
|
-
id,
|
|
11
|
-
message,
|
|
12
|
-
variant,
|
|
13
|
-
duration: options?.duration ?? 3000,
|
|
14
|
-
icon: options?.icon,
|
|
15
|
-
iconLabel: options?.iconLabel,
|
|
16
|
-
};
|
|
17
|
-
setSnackbars((prev) => [...prev, newSnackbar]);
|
|
18
|
-
}, []);
|
|
19
|
-
const removeSnackbar = useCallback((id) => {
|
|
20
|
-
setSnackbars((prev) => prev.filter((snackbar) => snackbar.id !== id));
|
|
21
|
-
}, []);
|
|
22
|
-
const actions = useMemo(() => ({
|
|
23
|
-
showSnackbar,
|
|
24
|
-
removeSnackbar,
|
|
25
|
-
}), [showSnackbar, removeSnackbar]);
|
|
26
|
-
return (_jsx(SnackbarActionsContext.Provider, { value: actions, children: _jsx(SnackbarStateContext.Provider, { value: snackbars, children: children }) }));
|
|
27
|
-
};
|
|
28
|
-
export const useSnackbar = () => {
|
|
29
|
-
const context = useContext(SnackbarActionsContext);
|
|
30
|
-
if (context === undefined) {
|
|
31
|
-
throw new Error("useSnackbar must be used within a SnackbarProvider");
|
|
32
|
-
}
|
|
33
|
-
return context;
|
|
34
|
-
};
|
|
35
|
-
export const useSnackbarState = () => {
|
|
36
|
-
const context = useContext(SnackbarStateContext);
|
|
37
|
-
if (context === undefined) {
|
|
38
|
-
throw new Error("useSnackbarState must be used within a SnackbarProvider");
|
|
39
|
-
}
|
|
40
|
-
return context;
|
|
41
|
-
};
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import React, { createContext, useContext, useEffect, useMemo, useState, } from "react";
|
|
3
|
-
import { themes, defaultTheme } from "./presets";
|
|
4
|
-
const ThemeContext = createContext(undefined);
|
|
5
|
-
const toKebabCase = (value) => value.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
6
|
-
const buildThemeResetStyles = (theme) => {
|
|
7
|
-
const cssVariables = {
|
|
8
|
-
"--flysoft-theme-name": theme.name,
|
|
9
|
-
};
|
|
10
|
-
Object.entries(theme.colors).forEach(([key, value]) => {
|
|
11
|
-
cssVariables[`--flysoft-${toKebabCase(key)}`] = value;
|
|
12
|
-
});
|
|
13
|
-
Object.entries(theme.shadows).forEach(([key, value]) => {
|
|
14
|
-
cssVariables[`--flysoft-shadow-${key}`] = value;
|
|
15
|
-
});
|
|
16
|
-
Object.entries(theme.radius).forEach(([key, value]) => {
|
|
17
|
-
cssVariables[`--flysoft-radius-${key}`] = value;
|
|
18
|
-
});
|
|
19
|
-
Object.entries(theme.spacing).forEach(([key, value]) => {
|
|
20
|
-
cssVariables[`--flysoft-spacing-${key}`] = value;
|
|
21
|
-
});
|
|
22
|
-
Object.entries(theme.fonts).forEach(([key, value]) => {
|
|
23
|
-
cssVariables[`--flysoft-font-${key}`] = value;
|
|
24
|
-
});
|
|
25
|
-
return {
|
|
26
|
-
color: theme.fonts.colorDefault ?? theme.colors.textPrimary,
|
|
27
|
-
//backgroundColor: theme.colors.bgDefault,
|
|
28
|
-
fontFamily: theme.fonts.default,
|
|
29
|
-
fontSize: theme.fonts.sizeDefault,
|
|
30
|
-
lineHeight: "1.5",
|
|
31
|
-
...cssVariables,
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
export const ThemeProvider = ({ children, initialTheme = "light", storageKey = "flysoft-theme", forceInitialTheme = false, onThemeChange, }) => {
|
|
35
|
-
// Almacenar el tema inicial para poder resetear a él
|
|
36
|
-
const getInitialTheme = () => {
|
|
37
|
-
if (typeof initialTheme === "string") {
|
|
38
|
-
return themes[initialTheme] || defaultTheme;
|
|
39
|
-
}
|
|
40
|
-
return initialTheme;
|
|
41
|
-
};
|
|
42
|
-
const [currentTheme, setCurrentTheme] = useState(() => {
|
|
43
|
-
// Si forceInitialTheme es true, usar siempre el initialTheme
|
|
44
|
-
if (forceInitialTheme) {
|
|
45
|
-
return getInitialTheme();
|
|
46
|
-
}
|
|
47
|
-
// Try to get theme from localStorage
|
|
48
|
-
if (typeof window !== "undefined") {
|
|
49
|
-
const savedTheme = localStorage.getItem(storageKey);
|
|
50
|
-
if (savedTheme) {
|
|
51
|
-
if (themes[savedTheme]) {
|
|
52
|
-
return themes[savedTheme];
|
|
53
|
-
}
|
|
54
|
-
// Try to parse as custom theme
|
|
55
|
-
try {
|
|
56
|
-
const parsed = JSON.parse(savedTheme);
|
|
57
|
-
if (parsed.name && parsed.colors) {
|
|
58
|
-
return parsed;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
// Invalid JSON, fallback to default
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Handle initialTheme prop
|
|
67
|
-
return getInitialTheme();
|
|
68
|
-
});
|
|
69
|
-
const [currentThemeName, setCurrentThemeName] = useState(currentTheme.name);
|
|
70
|
-
// Function to apply theme to CSS variables
|
|
71
|
-
const applyThemeToCSS = (theme) => {
|
|
72
|
-
if (typeof document === "undefined")
|
|
73
|
-
return;
|
|
74
|
-
const root = document.documentElement;
|
|
75
|
-
// Apply color variables
|
|
76
|
-
Object.entries(theme.colors).forEach(([key, value]) => {
|
|
77
|
-
const cssVarName = `--flysoft-${key
|
|
78
|
-
.replace(/([A-Z])/g, "-$1")
|
|
79
|
-
.toLowerCase()}`;
|
|
80
|
-
root.style.setProperty(cssVarName, value);
|
|
81
|
-
});
|
|
82
|
-
// Apply shadow variables
|
|
83
|
-
Object.entries(theme.shadows).forEach(([key, value]) => {
|
|
84
|
-
const cssVarName = `--flysoft-shadow-${key}`;
|
|
85
|
-
root.style.setProperty(cssVarName, value);
|
|
86
|
-
});
|
|
87
|
-
// Apply radius variables
|
|
88
|
-
Object.entries(theme.radius).forEach(([key, value]) => {
|
|
89
|
-
const cssVarName = `--flysoft-radius-${key}`;
|
|
90
|
-
root.style.setProperty(cssVarName, value);
|
|
91
|
-
});
|
|
92
|
-
// Apply spacing variables
|
|
93
|
-
Object.entries(theme.spacing).forEach(([key, value]) => {
|
|
94
|
-
const cssVarName = `--flysoft-spacing-${key}`;
|
|
95
|
-
root.style.setProperty(cssVarName, value);
|
|
96
|
-
});
|
|
97
|
-
// Apply font variables
|
|
98
|
-
Object.entries(theme.fonts).forEach(([key, value]) => {
|
|
99
|
-
const cssVarName = `--flysoft-font-${key}`;
|
|
100
|
-
root.style.setProperty(cssVarName, value);
|
|
101
|
-
});
|
|
102
|
-
// Set theme name as data attribute for CSS targeting
|
|
103
|
-
root.setAttribute("data-theme", theme.name);
|
|
104
|
-
// Apply background and text colors to body for better integration
|
|
105
|
-
const body = document.body;
|
|
106
|
-
if (body) {
|
|
107
|
-
//body.style.backgroundColor = theme.colors.bgDefault;
|
|
108
|
-
body.style.color = theme.colors.textPrimary;
|
|
109
|
-
body.style.fontFamily = theme.fonts.default;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
// Function to set theme
|
|
113
|
-
const setTheme = (theme) => {
|
|
114
|
-
let newTheme;
|
|
115
|
-
if (typeof theme === "string") {
|
|
116
|
-
if (themes[theme]) {
|
|
117
|
-
newTheme = themes[theme];
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
console.warn(`Theme "${theme}" not found, falling back to default`);
|
|
121
|
-
newTheme = defaultTheme;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
newTheme = theme;
|
|
126
|
-
}
|
|
127
|
-
setCurrentTheme(newTheme);
|
|
128
|
-
setCurrentThemeName(newTheme.name);
|
|
129
|
-
// Save to localStorage
|
|
130
|
-
if (typeof window !== "undefined") {
|
|
131
|
-
localStorage.setItem(storageKey, JSON.stringify(newTheme));
|
|
132
|
-
}
|
|
133
|
-
// Trigger external callback
|
|
134
|
-
onThemeChange?.(newTheme);
|
|
135
|
-
// Apply to CSS
|
|
136
|
-
applyThemeToCSS(newTheme);
|
|
137
|
-
};
|
|
138
|
-
// Function to update theme partially
|
|
139
|
-
const updateTheme = (updates) => {
|
|
140
|
-
setCurrentTheme((prev) => {
|
|
141
|
-
const newTheme = typeof updates === "function"
|
|
142
|
-
? updates(prev)
|
|
143
|
-
: {
|
|
144
|
-
...prev,
|
|
145
|
-
...updates,
|
|
146
|
-
colors: { ...prev.colors, ...updates.colors },
|
|
147
|
-
shadows: { ...prev.shadows, ...updates.shadows },
|
|
148
|
-
radius: { ...prev.radius, ...updates.radius },
|
|
149
|
-
spacing: { ...prev.spacing, ...updates.spacing },
|
|
150
|
-
fonts: { ...prev.fonts, ...updates.fonts },
|
|
151
|
-
};
|
|
152
|
-
// Save to localStorage
|
|
153
|
-
if (typeof window !== "undefined") {
|
|
154
|
-
localStorage.setItem(storageKey, JSON.stringify(newTheme));
|
|
155
|
-
}
|
|
156
|
-
// Trigger external callback
|
|
157
|
-
onThemeChange?.(newTheme);
|
|
158
|
-
return newTheme;
|
|
159
|
-
});
|
|
160
|
-
};
|
|
161
|
-
// Function to reset to initial theme (the one passed as initialTheme prop)
|
|
162
|
-
const resetToDefault = () => {
|
|
163
|
-
setTheme(getInitialTheme());
|
|
164
|
-
};
|
|
165
|
-
// Apply theme on mount and when theme changes
|
|
166
|
-
useEffect(() => {
|
|
167
|
-
applyThemeToCSS(currentTheme);
|
|
168
|
-
}, [currentTheme]);
|
|
169
|
-
// Check if current theme is dark
|
|
170
|
-
const isDark = currentTheme.name === "dark";
|
|
171
|
-
const themeResetStyles = useMemo(() => buildThemeResetStyles(currentTheme), [currentTheme]);
|
|
172
|
-
const value = {
|
|
173
|
-
theme: currentTheme,
|
|
174
|
-
setTheme,
|
|
175
|
-
updateTheme,
|
|
176
|
-
currentThemeName,
|
|
177
|
-
availableThemes: Object.keys(themes),
|
|
178
|
-
resetToDefault,
|
|
179
|
-
isDark,
|
|
180
|
-
};
|
|
181
|
-
return (_jsx(ThemeContext.Provider, { value: value, children: _jsx("div", { className: "flysoft-theme-reset", style: themeResetStyles, "data-theme": currentTheme.name, children: children }) }));
|
|
182
|
-
};
|
|
183
|
-
// Hook to use theme context
|
|
184
|
-
// eslint-disable-next-line react-refresh/only-export-components
|
|
185
|
-
export const useTheme = () => {
|
|
186
|
-
const context = useContext(ThemeContext);
|
|
187
|
-
if (context === undefined) {
|
|
188
|
-
throw new Error("useTheme must be used within a ThemeProvider");
|
|
189
|
-
}
|
|
190
|
-
return context;
|
|
191
|
-
};
|
|
192
|
-
// Hook to check if theme context is available
|
|
193
|
-
// eslint-disable-next-line react-refresh/only-export-components
|
|
194
|
-
export const useThemeContext = () => {
|
|
195
|
-
const context = useContext(ThemeContext);
|
|
196
|
-
return context !== undefined;
|
|
197
|
-
};
|
package/dist/contexts/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// Theme system exports
|
|
2
|
-
export { ThemeProvider, useTheme, useThemeContext } from "./ThemeContext";
|
|
3
|
-
export { useThemeOverride, useTemporaryOverride, } from "../hooks/useThemeOverride";
|
|
4
|
-
// Preset themes
|
|
5
|
-
export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
|
|
6
|
-
// Auth system exports
|
|
7
|
-
export { AuthProvider, AuthContext } from "./AuthContext";
|
|
8
|
-
// Crud system exports
|
|
9
|
-
export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
|
|
10
|
-
// AppLayout system exports
|
|
11
|
-
export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
|
|
12
|
-
// Snackbar system exports
|
|
13
|
-
export { SnackbarProvider, useSnackbar, useSnackbarState, } from "./SnackbarContext";
|