@soulbatical/tetra-ui 0.1.0
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/dist/components/AutoCard.d.ts +41 -0
- package/dist/components/AutoCard.d.ts.map +1 -0
- package/dist/components/AutoCard.js +73 -0
- package/dist/components/AutoCard.js.map +1 -0
- package/dist/components/CookieConsent.d.ts +15 -0
- package/dist/components/CookieConsent.d.ts.map +1 -0
- package/dist/components/CookieConsent.js +27 -0
- package/dist/components/CookieConsent.js.map +1 -0
- package/dist/components/GenericListLayout.d.ts +48 -0
- package/dist/components/GenericListLayout.d.ts.map +1 -0
- package/dist/components/GenericListLayout.js +18 -0
- package/dist/components/GenericListLayout.js.map +1 -0
- package/dist/components/ListGenerator.d.ts +41 -0
- package/dist/components/ListGenerator.d.ts.map +1 -0
- package/dist/components/ListGenerator.js +40 -0
- package/dist/components/ListGenerator.js.map +1 -0
- package/dist/components/LoadingStates.d.ts +38 -0
- package/dist/components/LoadingStates.d.ts.map +1 -0
- package/dist/components/LoadingStates.js +51 -0
- package/dist/components/LoadingStates.js.map +1 -0
- package/dist/components/OrgSwitcher.d.ts +15 -0
- package/dist/components/OrgSwitcher.d.ts.map +1 -0
- package/dist/components/OrgSwitcher.js +36 -0
- package/dist/components/OrgSwitcher.js.map +1 -0
- package/dist/components/PageHeader.d.ts +16 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PageHeader.js +10 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/ProtectedRoute.d.ts +9 -0
- package/dist/components/ProtectedRoute.d.ts.map +1 -0
- package/dist/components/ProtectedRoute.js +30 -0
- package/dist/components/ProtectedRoute.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +15 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/components/StatusBadge.js +79 -0
- package/dist/components/StatusBadge.js.map +1 -0
- package/dist/components/ThemeToggle.d.ts +14 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -0
- package/dist/components/ThemeToggle.js +20 -0
- package/dist/components/ThemeToggle.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +17 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/useAuth.d.ts +34 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +156 -0
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/hooks/useCacheInvalidation.d.ts +25 -0
- package/dist/hooks/useCacheInvalidation.d.ts.map +1 -0
- package/dist/hooks/useCacheInvalidation.js +57 -0
- package/dist/hooks/useCacheInvalidation.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +2 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +15 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useDialog.d.ts +26 -0
- package/dist/hooks/useDialog.d.ts.map +1 -0
- package/dist/hooks/useDialog.js +37 -0
- package/dist/hooks/useDialog.js.map +1 -0
- package/dist/hooks/useFilterConfigs.d.ts +81 -0
- package/dist/hooks/useFilterConfigs.d.ts.map +1 -0
- package/dist/hooks/useFilterConfigs.js +68 -0
- package/dist/hooks/useFilterConfigs.js.map +1 -0
- package/dist/hooks/useFormSubmit.d.ts +79 -0
- package/dist/hooks/useFormSubmit.d.ts.map +1 -0
- package/dist/hooks/useFormSubmit.js +57 -0
- package/dist/hooks/useFormSubmit.js.map +1 -0
- package/dist/hooks/useGenericList.d.ts +62 -0
- package/dist/hooks/useGenericList.d.ts.map +1 -0
- package/dist/hooks/useGenericList.js +75 -0
- package/dist/hooks/useGenericList.js.map +1 -0
- package/dist/hooks/useGenericListWithConfig.d.ts +65 -0
- package/dist/hooks/useGenericListWithConfig.d.ts.map +1 -0
- package/dist/hooks/useGenericListWithConfig.js +98 -0
- package/dist/hooks/useGenericListWithConfig.js.map +1 -0
- package/dist/hooks/useInfiniteScroll.d.ts +11 -0
- package/dist/hooks/useInfiniteScroll.d.ts.map +1 -0
- package/dist/hooks/useInfiniteScroll.js +63 -0
- package/dist/hooks/useInfiniteScroll.js.map +1 -0
- package/dist/hooks/useOrganizations.d.ts +27 -0
- package/dist/hooks/useOrganizations.d.ts.map +1 -0
- package/dist/hooks/useOrganizations.js +56 -0
- package/dist/hooks/useOrganizations.js.map +1 -0
- package/dist/hooks/usePageContext.d.ts +29 -0
- package/dist/hooks/usePageContext.d.ts.map +1 -0
- package/dist/hooks/usePageContext.js +32 -0
- package/dist/hooks/usePageContext.js.map +1 -0
- package/dist/hooks/usePersistedQueryState.d.ts +35 -0
- package/dist/hooks/usePersistedQueryState.d.ts.map +1 -0
- package/dist/hooks/usePersistedQueryState.js +187 -0
- package/dist/hooks/usePersistedQueryState.js.map +1 -0
- package/dist/hooks/useQueryState.d.ts +40 -0
- package/dist/hooks/useQueryState.d.ts.map +1 -0
- package/dist/hooks/useQueryState.js +246 -0
- package/dist/hooks/useQueryState.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/providers/QueryProvider.d.ts +9 -0
- package/dist/providers/QueryProvider.d.ts.map +1 -0
- package/dist/providers/QueryProvider.js +20 -0
- package/dist/providers/QueryProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.d.ts +15 -0
- package/dist/providers/ThemeProvider.d.ts.map +1 -0
- package/dist/providers/ThemeProvider.js +13 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/dist/services/apiClient.d.ts +20 -0
- package/dist/services/apiClient.d.ts.map +1 -0
- package/dist/services/apiClient.js +85 -0
- package/dist/services/apiClient.js.map +1 -0
- package/dist/types/index.d.ts +119 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +68 -0
- package/src/styles/dark-mode.css +135 -0
- package/src/styles/theme.css +105 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSearchParams, useRouter, usePathname } from 'next/navigation.js';
|
|
3
|
+
import { useCallback, useMemo } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Helper to update URL search params in Next.js App Router.
|
|
6
|
+
* Returns new URLSearchParams instance (immutable pattern).
|
|
7
|
+
*/
|
|
8
|
+
function updateSearchParams(current, updater) {
|
|
9
|
+
const next = new URLSearchParams(current.toString());
|
|
10
|
+
return updater(next);
|
|
11
|
+
}
|
|
12
|
+
export function useQueryState(defaultValues) {
|
|
13
|
+
const searchParams = useSearchParams();
|
|
14
|
+
const router = useRouter();
|
|
15
|
+
const pathname = usePathname();
|
|
16
|
+
/** Push new search params to URL */
|
|
17
|
+
const pushParams = useCallback((next) => {
|
|
18
|
+
const qs = next.toString();
|
|
19
|
+
router.replace(`${pathname}${qs ? `?${qs}` : ''}`, { scroll: false });
|
|
20
|
+
}, [router, pathname]);
|
|
21
|
+
// Parse a single parameter with type coercion
|
|
22
|
+
const parseParam = useCallback((key) => {
|
|
23
|
+
const value = searchParams.get(String(key));
|
|
24
|
+
if (value === null)
|
|
25
|
+
return undefined;
|
|
26
|
+
// Try to parse as JSON first (for objects/arrays)
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(value);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// If it's a number string, parse it
|
|
32
|
+
if (/^\d+$/.test(value)) {
|
|
33
|
+
return Number(value);
|
|
34
|
+
}
|
|
35
|
+
// Otherwise return as string
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
}, [searchParams]);
|
|
39
|
+
// Set a single parameter
|
|
40
|
+
const setParam = useCallback((key, value) => {
|
|
41
|
+
const next = new URLSearchParams(searchParams.toString());
|
|
42
|
+
if (value === undefined || value === '' || value === null) {
|
|
43
|
+
next.delete(String(key));
|
|
44
|
+
}
|
|
45
|
+
else if (typeof value === 'object') {
|
|
46
|
+
next.set(String(key), JSON.stringify(value));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
next.set(String(key), String(value));
|
|
50
|
+
}
|
|
51
|
+
pushParams(next);
|
|
52
|
+
}, [searchParams, pushParams]);
|
|
53
|
+
// Set multiple parameters at once
|
|
54
|
+
const setParams = useCallback((params) => {
|
|
55
|
+
const next = new URLSearchParams(searchParams.toString());
|
|
56
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
57
|
+
if (value === undefined || value === '' || value === null) {
|
|
58
|
+
next.delete(key);
|
|
59
|
+
}
|
|
60
|
+
else if (typeof value === 'object') {
|
|
61
|
+
next.set(key, JSON.stringify(value));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
next.set(key, String(value));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
pushParams(next);
|
|
68
|
+
}, [searchParams, pushParams]);
|
|
69
|
+
// Clear a single parameter
|
|
70
|
+
const clearParam = useCallback((key) => {
|
|
71
|
+
const next = new URLSearchParams(searchParams.toString());
|
|
72
|
+
next.delete(String(key));
|
|
73
|
+
pushParams(next);
|
|
74
|
+
}, [searchParams, pushParams]);
|
|
75
|
+
// Clear all parameters
|
|
76
|
+
const clearParams = useCallback(() => {
|
|
77
|
+
pushParams(new URLSearchParams());
|
|
78
|
+
}, [pushParams]);
|
|
79
|
+
// Pagination helpers
|
|
80
|
+
const pagination = useMemo(() => {
|
|
81
|
+
const page = Number(searchParams.get('page')) || 1;
|
|
82
|
+
const perPage = Number(searchParams.get('perPage')) || 20;
|
|
83
|
+
return {
|
|
84
|
+
page,
|
|
85
|
+
perPage,
|
|
86
|
+
setPage: (newPage) => setParam('page', newPage),
|
|
87
|
+
setPerPage: (newPerPage) => setParam('perPage', newPerPage),
|
|
88
|
+
};
|
|
89
|
+
}, [searchParams, setParam]);
|
|
90
|
+
// Sorting helpers
|
|
91
|
+
const sorting = useMemo(() => {
|
|
92
|
+
const sort = searchParams.get('sort') || undefined;
|
|
93
|
+
const order = (searchParams.get('order') || 'asc');
|
|
94
|
+
return {
|
|
95
|
+
sort,
|
|
96
|
+
order,
|
|
97
|
+
setSort: (field, newOrder = 'asc') => {
|
|
98
|
+
if (field) {
|
|
99
|
+
setParams({
|
|
100
|
+
sort: field,
|
|
101
|
+
order: newOrder,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
clearParam('sort');
|
|
106
|
+
clearParam('order');
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}, [searchParams, setParams, clearParam]);
|
|
111
|
+
// Search helpers
|
|
112
|
+
const search = useMemo(() => {
|
|
113
|
+
const query = searchParams.get('search') || undefined;
|
|
114
|
+
return {
|
|
115
|
+
query,
|
|
116
|
+
setQuery: (newQuery) => setParam('search', newQuery),
|
|
117
|
+
};
|
|
118
|
+
}, [searchParams, setParam]);
|
|
119
|
+
// Parse all filters (excluding pagination, sorting, search)
|
|
120
|
+
const filters = useMemo(() => {
|
|
121
|
+
const result = {};
|
|
122
|
+
const excludeKeys = ['page', 'perPage', 'sort', 'order', 'search'];
|
|
123
|
+
searchParams.forEach((value, key) => {
|
|
124
|
+
if (!excludeKeys.includes(key)) {
|
|
125
|
+
try {
|
|
126
|
+
result[key] = JSON.parse(value);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
result[key] = /^\d+$/.test(value) ? Number(value) : value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
return result;
|
|
134
|
+
}, [searchParams]);
|
|
135
|
+
// Set multiple filters at once
|
|
136
|
+
const setFilters = useCallback((newFilters) => {
|
|
137
|
+
const next = new URLSearchParams(searchParams.toString());
|
|
138
|
+
// Preserve pagination, sorting, search
|
|
139
|
+
const preserved = {
|
|
140
|
+
page: searchParams.get('page'),
|
|
141
|
+
perPage: searchParams.get('perPage'),
|
|
142
|
+
sort: searchParams.get('sort'),
|
|
143
|
+
order: searchParams.get('order'),
|
|
144
|
+
search: searchParams.get('search'),
|
|
145
|
+
};
|
|
146
|
+
// Clear all params
|
|
147
|
+
Array.from(next.keys()).forEach((key) => next.delete(key));
|
|
148
|
+
// Restore preserved params
|
|
149
|
+
Object.entries(preserved).forEach(([key, value]) => {
|
|
150
|
+
if (value)
|
|
151
|
+
next.set(key, value);
|
|
152
|
+
});
|
|
153
|
+
// Set new filters
|
|
154
|
+
Object.entries(newFilters).forEach(([key, value]) => {
|
|
155
|
+
if (value !== undefined && value !== '' && value !== null) {
|
|
156
|
+
if (typeof value === 'object') {
|
|
157
|
+
next.set(key, JSON.stringify(value));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
next.set(key, String(value));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
pushParams(next);
|
|
165
|
+
}, [searchParams, pushParams]);
|
|
166
|
+
// Clear all filters (preserve pagination, sorting, search)
|
|
167
|
+
const clearFilters = useCallback(() => {
|
|
168
|
+
const next = new URLSearchParams();
|
|
169
|
+
// Preserve these params
|
|
170
|
+
['page', 'perPage', 'sort', 'order', 'search'].forEach((key) => {
|
|
171
|
+
const value = searchParams.get(key);
|
|
172
|
+
if (value)
|
|
173
|
+
next.set(key, value);
|
|
174
|
+
});
|
|
175
|
+
pushParams(next);
|
|
176
|
+
}, [searchParams, pushParams]);
|
|
177
|
+
// Check if any filters are active
|
|
178
|
+
const hasFilters = useMemo(() => {
|
|
179
|
+
const excludeKeys = ['page', 'perPage', 'sort', 'order', 'search'];
|
|
180
|
+
return Array.from(searchParams.keys()).some((key) => !excludeKeys.includes(key));
|
|
181
|
+
}, [searchParams]);
|
|
182
|
+
// Build query string for API calls
|
|
183
|
+
const buildQueryString = useCallback(() => {
|
|
184
|
+
return searchParams.toString();
|
|
185
|
+
}, [searchParams]);
|
|
186
|
+
// Hooks for simplified interface (always called, conditionally used)
|
|
187
|
+
const currentFilters = useMemo(() => {
|
|
188
|
+
if (!defaultValues)
|
|
189
|
+
return {};
|
|
190
|
+
const result = { ...defaultValues };
|
|
191
|
+
Object.keys(defaultValues).forEach((key) => {
|
|
192
|
+
const value = searchParams.get(key);
|
|
193
|
+
if (value !== null) {
|
|
194
|
+
try {
|
|
195
|
+
result[key] = JSON.parse(value);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Keep as string - don't convert to number
|
|
199
|
+
result[key] = value;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return result;
|
|
204
|
+
}, [searchParams, defaultValues]);
|
|
205
|
+
const setFilter = useCallback((key, value) => {
|
|
206
|
+
setParam(key, value);
|
|
207
|
+
}, [setParam]);
|
|
208
|
+
const resetFilters = useCallback(() => {
|
|
209
|
+
if (!defaultValues)
|
|
210
|
+
return;
|
|
211
|
+
const next = new URLSearchParams();
|
|
212
|
+
// Preserve non-filter params
|
|
213
|
+
searchParams.forEach((value, key) => {
|
|
214
|
+
if (!Object.keys(defaultValues).includes(key)) {
|
|
215
|
+
next.set(key, value);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
pushParams(next);
|
|
219
|
+
}, [searchParams, pushParams, defaultValues]);
|
|
220
|
+
// If defaultValues are provided, return a simplified interface
|
|
221
|
+
if (defaultValues) {
|
|
222
|
+
return {
|
|
223
|
+
filters: currentFilters,
|
|
224
|
+
setFilter,
|
|
225
|
+
resetFilters,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Original return for no defaultValues
|
|
229
|
+
return {
|
|
230
|
+
params: searchParams,
|
|
231
|
+
setParam,
|
|
232
|
+
setParams,
|
|
233
|
+
getParam: parseParam,
|
|
234
|
+
clearParam,
|
|
235
|
+
clearParams,
|
|
236
|
+
pagination,
|
|
237
|
+
sorting,
|
|
238
|
+
search,
|
|
239
|
+
filters,
|
|
240
|
+
setFilters,
|
|
241
|
+
clearFilters,
|
|
242
|
+
hasFilters,
|
|
243
|
+
buildQueryString,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=useQueryState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQueryState.js","sourceRoot":"","sources":["../../src/hooks/useQueryState.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type { TetraConfig, AuthUser as TetraAuthUser, Organization as TetraOrganization, FilterConfig, SortFieldConfig, FeatureDisplayConfig, PageDisplayConfig, ListDisplayConfig, CardDisplayConfig, ApiResponse, ListParams, } from "./types/index.js";
|
|
2
|
+
export { cn } from "./lib/utils.js";
|
|
3
|
+
export { ThemeProvider, useTheme } from "./providers/ThemeProvider.js";
|
|
4
|
+
export { QueryProvider } from "./providers/QueryProvider.js";
|
|
5
|
+
export { useAuth, getAccessToken, waitForAuthReady, configureAuth, } from "./hooks/useAuth.js";
|
|
6
|
+
export { useOrganizations, type Organization, } from "./hooks/useOrganizations.js";
|
|
7
|
+
export { apiClient, configureApiClient, type GetAccessTokenFn, } from "./services/apiClient.js";
|
|
8
|
+
export { ThemeToggle } from "./components/ThemeToggle.js";
|
|
9
|
+
export { OrgSwitcher } from "./components/OrgSwitcher.js";
|
|
10
|
+
export { ProtectedRoute } from "./components/ProtectedRoute.js";
|
|
11
|
+
export { PageHeader } from "./components/PageHeader.js";
|
|
12
|
+
export { GenericListLayout, type SortOption, type GenericListLayoutProps, } from "./components/GenericListLayout.js";
|
|
13
|
+
export { generateList, BaseGrid } from "./components/ListGenerator.js";
|
|
14
|
+
export { LoadingCard, LoadingSpinner, Skeleton, SkeletonCard, } from "./components/LoadingStates.js";
|
|
15
|
+
export { StatusBadge } from "./components/StatusBadge.js";
|
|
16
|
+
export { AutoCard, type CardConfig, type AutoCardProps, type LinkComponent } from "./components/AutoCard.js";
|
|
17
|
+
export { CookieConsent, type CookieConsentProps } from "./components/CookieConsent.js";
|
|
18
|
+
export { useDebounce } from "./hooks/useDebounce.js";
|
|
19
|
+
export { useDialog } from "./hooks/useDialog.js";
|
|
20
|
+
export { useIsMobile } from "./hooks/use-mobile.js";
|
|
21
|
+
export { useInfiniteScroll } from "./hooks/useInfiniteScroll.js";
|
|
22
|
+
export { useCacheInvalidation } from "./hooks/useCacheInvalidation.js";
|
|
23
|
+
export { useFormSubmit } from "./hooks/useFormSubmit.js";
|
|
24
|
+
export { useQueryState } from "./hooks/useQueryState.js";
|
|
25
|
+
export { usePersistedQueryState, clearAllPersistedFilters, getPersistedFilters, } from "./hooks/usePersistedQueryState.js";
|
|
26
|
+
export { useFilterConfigs, generateSortOptions, type FilterConfigsResponse, type PaginationConfig, } from "./hooks/useFilterConfigs.js";
|
|
27
|
+
export { usePageContext, PageContextProvider, type PageContext, } from "./hooks/usePageContext.js";
|
|
28
|
+
export { useGenericList } from "./hooks/useGenericList.js";
|
|
29
|
+
export { useGenericListWithConfig } from "./hooks/useGenericListWithConfig.js";
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,WAAW,EACX,QAAQ,IAAI,aAAa,EACzB,YAAY,IAAI,iBAAiB,EACjC,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,sBAAsB,GAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGvF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// @tetra/ui — Shared React frontend framework
|
|
3
|
+
// ============================================
|
|
4
|
+
// Utilities
|
|
5
|
+
export { cn } from "./lib/utils.js";
|
|
6
|
+
// Providers
|
|
7
|
+
export { ThemeProvider, useTheme } from "./providers/ThemeProvider.js";
|
|
8
|
+
export { QueryProvider } from "./providers/QueryProvider.js";
|
|
9
|
+
// Auth
|
|
10
|
+
export { useAuth, getAccessToken, waitForAuthReady, configureAuth, } from "./hooks/useAuth.js";
|
|
11
|
+
// Multi-tenant
|
|
12
|
+
export { useOrganizations, } from "./hooks/useOrganizations.js";
|
|
13
|
+
// Services
|
|
14
|
+
export { apiClient, configureApiClient, } from "./services/apiClient.js";
|
|
15
|
+
// Components
|
|
16
|
+
export { ThemeToggle } from "./components/ThemeToggle.js";
|
|
17
|
+
export { OrgSwitcher } from "./components/OrgSwitcher.js";
|
|
18
|
+
export { ProtectedRoute } from "./components/ProtectedRoute.js";
|
|
19
|
+
// Config-driven page components (ported from SparkBuddy)
|
|
20
|
+
export { PageHeader } from "./components/PageHeader.js";
|
|
21
|
+
export { GenericListLayout, } from "./components/GenericListLayout.js";
|
|
22
|
+
export { generateList, BaseGrid } from "./components/ListGenerator.js";
|
|
23
|
+
export { LoadingCard, LoadingSpinner, Skeleton, SkeletonCard, } from "./components/LoadingStates.js";
|
|
24
|
+
export { StatusBadge } from "./components/StatusBadge.js";
|
|
25
|
+
export { AutoCard } from "./components/AutoCard.js";
|
|
26
|
+
export { CookieConsent } from "./components/CookieConsent.js";
|
|
27
|
+
// Hooks — utility
|
|
28
|
+
export { useDebounce } from "./hooks/useDebounce.js";
|
|
29
|
+
export { useDialog } from "./hooks/useDialog.js";
|
|
30
|
+
export { useIsMobile } from "./hooks/use-mobile.js";
|
|
31
|
+
export { useInfiniteScroll } from "./hooks/useInfiniteScroll.js";
|
|
32
|
+
export { useCacheInvalidation } from "./hooks/useCacheInvalidation.js";
|
|
33
|
+
export { useFormSubmit } from "./hooks/useFormSubmit.js";
|
|
34
|
+
// Hooks — query state & filters
|
|
35
|
+
export { useQueryState } from "./hooks/useQueryState.js";
|
|
36
|
+
export { usePersistedQueryState, clearAllPersistedFilters, getPersistedFilters, } from "./hooks/usePersistedQueryState.js";
|
|
37
|
+
export { useFilterConfigs, generateSortOptions, } from "./hooks/useFilterConfigs.js";
|
|
38
|
+
// Page context (for sidebars that read page state)
|
|
39
|
+
export { usePageContext, PageContextProvider, } from "./hooks/usePageContext.js";
|
|
40
|
+
// Hooks — generic list
|
|
41
|
+
export { useGenericList } from "./hooks/useGenericList.js";
|
|
42
|
+
export { useGenericListWithConfig } from "./hooks/useGenericListWithConfig.js";
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8CAA8C;AAC9C,+CAA+C;AAiB/C,YAAY;AACZ,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO;AACP,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,EACL,gBAAgB,GAEjB,MAAM,6BAA6B,CAAC;AAErC,WAAW;AACX,OAAO,EACL,SAAS,EACT,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;AAEjC,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,yDAAyD;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,iBAAiB,GAGlB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAA2D,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AAEvF,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AAErC,mDAAmD;AACnD,OAAO,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AAEnC,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Standard React Query provider for all VCA projects.
|
|
4
|
+
* Default: 60s staleTime, 1 retry.
|
|
5
|
+
*/
|
|
6
|
+
export declare function QueryProvider({ children }: {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=QueryProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryProvider.d.ts","sourceRoot":"","sources":["../../src/providers/QueryProvider.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAgBlE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
5
|
+
/**
|
|
6
|
+
* Standard React Query provider for all VCA projects.
|
|
7
|
+
* Default: 60s staleTime, 1 retry.
|
|
8
|
+
*/
|
|
9
|
+
export function QueryProvider({ children }) {
|
|
10
|
+
const [queryClient] = useState(() => new QueryClient({
|
|
11
|
+
defaultOptions: {
|
|
12
|
+
queries: {
|
|
13
|
+
staleTime: 60 * 1000,
|
|
14
|
+
retry: 1,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
return (_jsx(QueryClientProvider, { client: queryClient, children: children }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=QueryProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryProvider.js","sourceRoot":"","sources":["../../src/providers/QueryProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAC5B,GAAG,EAAE,CACH,IAAI,WAAW,CAAC;QACd,cAAc,EAAE;YACd,OAAO,EAAE;gBACP,SAAS,EAAE,EAAE,GAAG,IAAI;gBACpB,KAAK,EAAE,CAAC;aACT;SACF;KACF,CAAC,CACL,CAAC;IAEF,OAAO,CACL,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YAAG,QAAQ,GAAuB,CAC3E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
interface ThemeProviderProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
/** Default theme (default: "dark") */
|
|
5
|
+
defaultTheme?: "light" | "dark" | "system";
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Standard theme provider for all VCA projects.
|
|
9
|
+
* Uses next-themes. Sets .dark class on <html> for Tailwind.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ThemeProvider({ children, defaultTheme, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/** Re-export next-themes useTheme — one import for consumers */
|
|
13
|
+
export declare const useTheme: () => import("next-themes").UseThemeProps;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=ThemeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAqB,GACtB,EAAE,kBAAkB,2CAMpB;AAED,gEAAgE;AAChE,eAAO,MAAM,QAAQ,2CAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ThemeProvider as NextThemesProvider, useTheme as useNextTheme } from "next-themes";
|
|
4
|
+
/**
|
|
5
|
+
* Standard theme provider for all VCA projects.
|
|
6
|
+
* Uses next-themes. Sets .dark class on <html> for Tailwind.
|
|
7
|
+
*/
|
|
8
|
+
export function ThemeProvider({ children, defaultTheme = "dark", }) {
|
|
9
|
+
return (_jsx(NextThemesProvider, { attribute: "class", defaultTheme: defaultTheme, enableSystem: true, children: children }));
|
|
10
|
+
}
|
|
11
|
+
/** Re-export next-themes useTheme — one import for consumers */
|
|
12
|
+
export const useTheme = useNextTheme;
|
|
13
|
+
//# sourceMappingURL=ThemeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.js","sourceRoot":"","sources":["../../src/providers/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ5F;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAY,GAAG,MAAM,GACF;IACnB,OAAO,CACL,KAAC,kBAAkB,IAAC,SAAS,EAAC,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,YAAY,kBAC3E,QAAQ,GACU,CACtB,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard API client for all VCA projects.
|
|
3
|
+
* Injects Bearer token from auth module.
|
|
4
|
+
* Configure with createApiClient(baseUrl, getAccessToken).
|
|
5
|
+
*/
|
|
6
|
+
export type GetAccessTokenFn = () => string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Initialize the API client. Call once at app startup.
|
|
9
|
+
* @param baseUrl - API base URL (e.g., from NEXT_PUBLIC_API_URL)
|
|
10
|
+
* @param getAccessToken - Function that returns the current access token
|
|
11
|
+
*/
|
|
12
|
+
export declare function configureApiClient(baseUrl: string, getAccessToken: GetAccessTokenFn): void;
|
|
13
|
+
export declare const apiClient: {
|
|
14
|
+
get<T>(path: string): Promise<T>;
|
|
15
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
16
|
+
put<T>(path: string, body: unknown): Promise<T>;
|
|
17
|
+
patch<T>(path: string, body: unknown): Promise<T>;
|
|
18
|
+
delete<T>(path: string): Promise<T>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=apiClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/services/apiClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,gBAAgB,QAIjC;AA4BD,eAAO,MAAM,SAAS;QACV,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;SAM3B,CAAC,QAAQ,MAAM,SAAS,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;QAU7C,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;UAUzC,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;WAU1C,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ1C,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard API client for all VCA projects.
|
|
3
|
+
* Injects Bearer token from auth module.
|
|
4
|
+
* Configure with createApiClient(baseUrl, getAccessToken).
|
|
5
|
+
*/
|
|
6
|
+
let _baseUrl = "";
|
|
7
|
+
let _getAccessToken = () => null;
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the API client. Call once at app startup.
|
|
10
|
+
* @param baseUrl - API base URL (e.g., from NEXT_PUBLIC_API_URL)
|
|
11
|
+
* @param getAccessToken - Function that returns the current access token
|
|
12
|
+
*/
|
|
13
|
+
export function configureApiClient(baseUrl, getAccessToken) {
|
|
14
|
+
_baseUrl = baseUrl;
|
|
15
|
+
_getAccessToken = getAccessToken;
|
|
16
|
+
}
|
|
17
|
+
async function throwIfError(res) {
|
|
18
|
+
if (res.ok)
|
|
19
|
+
return;
|
|
20
|
+
let detail = "";
|
|
21
|
+
try {
|
|
22
|
+
const body = await res.json();
|
|
23
|
+
detail = body.detail || body.error || body.message || "";
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// no JSON body
|
|
27
|
+
}
|
|
28
|
+
const msg = detail
|
|
29
|
+
? `API ${res.status}: ${detail}`
|
|
30
|
+
: `API error: ${res.status}`;
|
|
31
|
+
throw new Error(msg);
|
|
32
|
+
}
|
|
33
|
+
function getHeaders() {
|
|
34
|
+
const headers = {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
};
|
|
37
|
+
const token = _getAccessToken();
|
|
38
|
+
if (token) {
|
|
39
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
40
|
+
}
|
|
41
|
+
return headers;
|
|
42
|
+
}
|
|
43
|
+
export const apiClient = {
|
|
44
|
+
async get(path) {
|
|
45
|
+
const res = await fetch(`${_baseUrl}${path}`, { headers: getHeaders() });
|
|
46
|
+
await throwIfError(res);
|
|
47
|
+
return res.json();
|
|
48
|
+
},
|
|
49
|
+
async post(path, body) {
|
|
50
|
+
const res = await fetch(`${_baseUrl}${path}`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: getHeaders(),
|
|
53
|
+
body: body != null ? JSON.stringify(body) : undefined,
|
|
54
|
+
});
|
|
55
|
+
await throwIfError(res);
|
|
56
|
+
return res.json();
|
|
57
|
+
},
|
|
58
|
+
async put(path, body) {
|
|
59
|
+
const res = await fetch(`${_baseUrl}${path}`, {
|
|
60
|
+
method: "PUT",
|
|
61
|
+
headers: getHeaders(),
|
|
62
|
+
body: JSON.stringify(body),
|
|
63
|
+
});
|
|
64
|
+
await throwIfError(res);
|
|
65
|
+
return res.json();
|
|
66
|
+
},
|
|
67
|
+
async patch(path, body) {
|
|
68
|
+
const res = await fetch(`${_baseUrl}${path}`, {
|
|
69
|
+
method: "PATCH",
|
|
70
|
+
headers: getHeaders(),
|
|
71
|
+
body: JSON.stringify(body),
|
|
72
|
+
});
|
|
73
|
+
await throwIfError(res);
|
|
74
|
+
return res.json();
|
|
75
|
+
},
|
|
76
|
+
async delete(path) {
|
|
77
|
+
const res = await fetch(`${_baseUrl}${path}`, {
|
|
78
|
+
method: "DELETE",
|
|
79
|
+
headers: getHeaders(),
|
|
80
|
+
});
|
|
81
|
+
await throwIfError(res);
|
|
82
|
+
return res.json();
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=apiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/services/apiClient.ts"],"names":[],"mappings":"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"}
|