shelflife-react-hooks 1.0.2 → 1.0.4
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/index.cjs.js +37 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.esm.js +38 -2
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/context/AuthContext.tsx +45 -2
- package/src/context/UserContext.tsx +1 -1
- package/src/context/api/userApi.ts +2 -2
- package/src/type/auth.ts +8 -1
package/dist/index.cjs.js
CHANGED
|
@@ -184,12 +184,47 @@ var logoutRequest = async (config) => runWithRequestState(
|
|
|
184
184
|
// src/context/AuthContext.tsx
|
|
185
185
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
186
186
|
var AuthContext = (0, import_react.createContext)(void 0);
|
|
187
|
-
var AuthProvider = ({
|
|
188
|
-
|
|
187
|
+
var AuthProvider = ({
|
|
188
|
+
baseUrl,
|
|
189
|
+
children,
|
|
190
|
+
initialToken = null,
|
|
191
|
+
tokenStorage,
|
|
192
|
+
storageKey = "auth_token"
|
|
193
|
+
}) => {
|
|
194
|
+
const [token, setTokenState] = (0, import_react.useState)(initialToken);
|
|
189
195
|
const [user, setUser] = (0, import_react.useState)(null);
|
|
190
196
|
const [isLoading, setIsLoading] = (0, import_react.useState)(false);
|
|
191
197
|
const [isError, setIsError] = (0, import_react.useState)(false);
|
|
192
198
|
const [error, setError] = (0, import_react.useState)(null);
|
|
199
|
+
(0, import_react.useEffect)(() => {
|
|
200
|
+
if (tokenStorage && !initialToken) {
|
|
201
|
+
const loadToken = async () => {
|
|
202
|
+
try {
|
|
203
|
+
const storedToken = await tokenStorage.getItem(storageKey);
|
|
204
|
+
if (storedToken) {
|
|
205
|
+
setTokenState(storedToken);
|
|
206
|
+
}
|
|
207
|
+
} catch (err) {
|
|
208
|
+
console.error("Failed to load token from storage:", err);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
loadToken();
|
|
212
|
+
}
|
|
213
|
+
}, [tokenStorage, storageKey, initialToken]);
|
|
214
|
+
const setToken = (0, import_react.useCallback)(async (newToken) => {
|
|
215
|
+
setTokenState(newToken);
|
|
216
|
+
if (tokenStorage) {
|
|
217
|
+
try {
|
|
218
|
+
if (newToken) {
|
|
219
|
+
await tokenStorage.setItem(storageKey, newToken);
|
|
220
|
+
} else {
|
|
221
|
+
await tokenStorage.removeItem(storageKey);
|
|
222
|
+
}
|
|
223
|
+
} catch (err) {
|
|
224
|
+
console.error("Failed to persist token to storage:", err);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}, [tokenStorage, storageKey]);
|
|
193
228
|
const getToken = (0, import_react.useCallback)(() => token, [token]);
|
|
194
229
|
const apiConfig = (0, import_react.useMemo)(() => ({
|
|
195
230
|
baseUrl,
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/context/AuthContext.tsx","../src/context/http.ts","../src/context/api/requestState.ts","../src/context/api/authApi.ts","../src/context/InviteContext.tsx","../src/context/api/inviteApi.ts","../src/context/ProductContext.tsx","../src/context/api/productApi.ts","../src/context/RunningLowContext.tsx","../src/context/api/runningLowApi.ts","../src/context/StorageContext.tsx","../src/context/api/storageApi.ts","../src/context/StorageItemContext.tsx","../src/context/api/storageItemApi.ts","../src/context/StorageMemberContext.tsx","../src/context/api/storageMemberApi.ts","../src/context/UserContext.tsx","../src/context/api/userApi.ts"],"sourcesContent":["export * from './type/auth.js';\nexport * from './type/base.js';\nexport * from './type/models.js';\nexport * from './type/product.js';\nexport * from './type/runninglow.js';\nexport * from './type/requests.js';\nexport * from './type/storage.js';\nexport * from './type/user.js';\nexport * from './context/AuthContext.js';\nexport * from './context/http.js';\nexport * from './context/InviteContext.js';\nexport * from './context/ProductContext.js';\nexport * from './context/RunningLowContext.js';\nexport * from './context/StorageContext.js';\nexport * from './context/StorageItemContext.js';\nexport * from './context/StorageMemberContext.js';\nexport * from './context/UserContext.js';","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type {\n ChangePasswordRequest,\n LoginRequest,\n SignupRequest,\n User\n} from '../type/auth.js';\nimport {\n changePasswordRequest,\n getMeRequest,\n loginRequest,\n logoutRequest,\n signupRequest\n} from './api/authApi.js';\n\nexport type AuthContextValue = {\n token: string | null;\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n login: (dto: LoginRequest) => Promise<void>;\n signup: (dto: SignupRequest) => Promise<User>;\n changePassword: (dto: ChangePasswordRequest) => Promise<void>;\n getMe: () => Promise<User | null>;\n logout: () => Promise<void>;\n getToken: () => string | null;\n};\n\ntype AuthProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n initialToken?: string | null;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport const AuthProvider = ({ baseUrl, children, initialToken = null }: AuthProviderProps) => {\n const [token, setToken] = useState<string | null>(initialToken);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getToken = useCallback(() => token, [token]);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setToken,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const login = useCallback((dto: LoginRequest) => loginRequest(apiConfig, dto), [apiConfig]);\n const signup = useCallback((dto: SignupRequest) => signupRequest(apiConfig, dto), [apiConfig]);\n const changePassword = useCallback(\n (dto: ChangePasswordRequest) => changePasswordRequest(apiConfig, dto),\n [apiConfig]\n );\n const getMe = useCallback(() => getMeRequest(apiConfig), [apiConfig]);\n const logout = useCallback(() => logoutRequest(apiConfig), [apiConfig]);\n\n const value = useMemo<AuthContextValue>(() => ({\n token,\n user,\n isLoading,\n isError,\n error,\n login,\n signup,\n changePassword,\n getMe,\n logout,\n getToken\n }), [\n changePassword,\n error,\n getMe,\n getToken,\n isError,\n isLoading,\n login,\n logout,\n signup,\n token,\n user\n ]);\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport const useAuth = (): AuthContextValue => {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return context;\n};\n","export const normalizeBaseUrl = (baseUrl: string): string => baseUrl.replace(/\\/+$/, '');\n\nexport const buildAuthHeaders = (token: string | null): HeadersInit => {\n if (!token) {\n return {};\n }\n\n return {\n Authorization: `Bearer ${token}`\n };\n};\n\nexport const readJson = async <T,>(response: Response): Promise<T | null> => {\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return null;\n }\n\n return (await response.json()) as T;\n};\n\nexport const readArrayBuffer = async (response: Response): Promise<ArrayBuffer> => response.arrayBuffer();\n","export type RequestStateHandlers = {\n setIsLoading: (value: boolean) => void;\n setIsError: (value: boolean) => void;\n setError: (error: Error | null) => void;\n};\n\nexport const runWithRequestState = async <T>(\n handlers: RequestStateHandlers,\n request: () => Promise<T>\n): Promise<T> => {\n handlers.setIsLoading(true);\n handlers.setIsError(false);\n handlers.setError(null);\n\n try {\n return await request();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n handlers.setIsError(true);\n handlers.setError(error);\n throw error;\n } finally {\n handlers.setIsLoading(false);\n }\n};\n","import type {\n ChangePasswordRequest,\n LoginRequest,\n LoginResponse,\n SignupRequest,\n User\n} from '../../type/auth.js';\nimport type { ErrorResponse } from '../../type/base.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype AuthApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setToken: (token: string | null) => void;\n setUser: (user: User | null) => void;\n};\n\nexport const loginRequest = async (\n config: AuthApiConfig,\n dto: LoginRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Login failed');\n }\n\n const payload = await readJson<LoginResponse>(response);\n if (!payload || !('token' in payload)) {\n throw new Error('Login response missing token');\n }\n\n config.setToken(payload.token);\n\n const meResponse = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(payload.token)\n });\n\n if (meResponse.ok) {\n const mePayload = await readJson<User>(meResponse);\n if (mePayload) {\n config.setUser(mePayload);\n }\n }\n});\n\nexport const signupRequest = async (\n config: AuthApiConfig,\n dto: SignupRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/signup`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Signup failed');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Signup response missing user');\n }\n\n config.setUser(payload);\n return payload;\n});\n\nexport const changePasswordRequest = async (\n config: AuthApiConfig,\n dto: ChangePasswordRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/password/change`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Change password failed');\n }\n});\n\nexport const getMeRequest = async (config: AuthApiConfig): Promise<User | null> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n config.setUser(null);\n return null;\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n config.setUser(null);\n return null;\n }\n\n config.setUser(payload);\n return payload;\n }\n);\n\nexport const logoutRequest = async (config: AuthApiConfig): Promise<void> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n if (config.token) {\n await fetch(`${normalizedBaseUrl}/api/auth/logout`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n }\n\n config.setToken(null);\n config.setUser(null);\n }\n);\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n acceptInviteRequest,\n declineInviteRequest,\n fetchInvitesRequest\n} from './api/inviteApi.js';\n\ntype InviteContextValue = {\n invites: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchInvites: () => Promise<StorageMember[]>;\n acceptInvite: (id: number) => Promise<void>;\n declineInvite: (id: number) => Promise<void>;\n};\n\ntype InviteProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst InviteContext = createContext<InviteContextValue | undefined>(undefined);\n\nexport const InviteProvider = ({ baseUrl, children }: InviteProviderProps) => {\n const { token } = useAuth();\n const [invites, setInvites] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setInvites,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchInvites = useCallback(() => fetchInvitesRequest(apiConfig), [apiConfig]);\n const acceptInvite = useCallback((id: number) => acceptInviteRequest(apiConfig, id), [apiConfig]);\n const declineInvite = useCallback((id: number) => declineInviteRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<InviteContextValue>(() => ({\n invites,\n isLoading,\n isError,\n error,\n fetchInvites,\n acceptInvite,\n declineInvite\n }), [acceptInvite, declineInvite, error, fetchInvites, isError, isLoading, invites]);\n\n return <InviteContext.Provider value={value}>{children}</InviteContext.Provider>;\n};\n\nexport const useInvites = (): InviteContextValue => {\n const context = useContext(InviteContext);\n if (!context) {\n throw new Error('useInvites must be used within an InviteProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype InviteApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setInvites: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchInvitesRequest = async (config: InviteApiConfig): Promise<StorageMember[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch invites');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setInvites(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const acceptInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to accept invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n\nexport const declineInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to decline invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Product } from '../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createProductRequest,\n deleteProductRequest,\n fetchProductRequest,\n fetchProductsRequest,\n getProductIconRequest,\n updateProductRequest,\n uploadProductIconRequest\n} from './api/productApi.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductContextValue = {\n products: Product[];\n product: Product | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchProducts: (query?: ProductQuery) => Promise<Product[]>;\n fetchProduct: (id: number) => Promise<Product | null>;\n createProduct: (dto: CreateProductRequest) => Promise<Product>;\n updateProduct: (id: number, dto: UpdateProductRequest) => Promise<Product>;\n deleteProduct: (id: number) => Promise<void>;\n getProductIcon: (id: number) => Promise<ArrayBuffer>;\n uploadProductIcon: (id: number, file: Blob) => Promise<void>;\n};\n\ntype ProductProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ProductContext = createContext<ProductContextValue | undefined>(undefined);\n\nexport const ProductProvider = ({ baseUrl, children }: ProductProviderProps) => {\n const { token } = useAuth();\n const [products, setProducts] = useState<Product[]>([]);\n const [product, setProduct] = useState<Product | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setProducts,\n setProduct,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchProducts = useCallback(\n (query?: ProductQuery) => fetchProductsRequest(apiConfig, query),\n [apiConfig]\n );\n const fetchProduct = useCallback((id: number) => fetchProductRequest(apiConfig, id), [apiConfig]);\n const createProduct = useCallback(\n (dto: CreateProductRequest) => createProductRequest(apiConfig, dto),\n [apiConfig]\n );\n const updateProduct = useCallback(\n (id: number, dto: UpdateProductRequest) => updateProductRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteProduct = useCallback((id: number) => deleteProductRequest(apiConfig, id), [apiConfig]);\n const getProductIcon = useCallback((id: number) => getProductIconRequest(apiConfig, id), [apiConfig]);\n const uploadProductIcon = useCallback(\n (id: number, file: Blob) => uploadProductIconRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<ProductContextValue>(() => ({\n products,\n product,\n isLoading,\n isError,\n error,\n fetchProducts,\n fetchProduct,\n createProduct,\n updateProduct,\n deleteProduct,\n getProductIcon,\n uploadProductIcon\n }), [\n createProduct,\n deleteProduct,\n error,\n fetchProduct,\n fetchProducts,\n getProductIcon,\n isError,\n isLoading,\n product,\n products,\n updateProduct,\n uploadProductIcon\n ]);\n\n return <ProductContext.Provider value={value}>{children}</ProductContext.Provider>;\n};\n\nexport const useProducts = (): ProductContextValue => {\n const context = useContext(ProductContext);\n if (!context) {\n throw new Error('useProducts must be used within a ProductProvider');\n }\n\n return context;\n};\n","import type { Product } from '../../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setProducts: (value: Product[] | ((items: Product[]) => Product[])) => void;\n setProduct: (value: Product | null | ((prev: Product | null) => Product | null)) => void;\n};\n\nconst updateById = (items: Product[], updated: Product): Product[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchProductsRequest = async (\n config: ProductApiConfig,\n query?: ProductQuery\n): Promise<Product[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const params = new URLSearchParams();\n if (query?.barcode) {\n params.set('barcode', query.barcode);\n }\n if (query?.name) {\n params.set('name', query.name);\n }\n if (query?.category) {\n params.set('category', query.category);\n }\n\n const url = params.toString()\n ? `${normalizedBaseUrl}/api/products?${params.toString()}`\n : `${normalizedBaseUrl}/api/products`;\n\n const response = await fetch(url, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch products');\n }\n\n const payload = await readJson<Product[]>(response);\n if (payload) {\n config.setProducts(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<Product | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setProduct(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Product response missing data');\n }\n\n config.setProduct(payload);\n config.setProducts((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createProductRequest = async (\n config: ProductApiConfig,\n dto: CreateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Create product response missing data');\n }\n\n config.setProducts((previous) => [payload, ...previous]);\n config.setProduct(payload);\n return payload;\n});\n\nexport const updateProductRequest = async (\n config: ProductApiConfig,\n id: number,\n dto: UpdateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Update product response missing data');\n }\n\n config.setProducts((previous) => updateById(previous, payload));\n config.setProduct(payload);\n return payload;\n});\n\nexport const deleteProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete product');\n }\n\n config.setProducts((previous) => previous.filter((item) => item.id !== id));\n config.setProduct((current) => (current?.id === id ? null : current));\n});\n\nexport const getProductIconRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch product icon');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadProductIconRequest = async (\n config: ProductApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload product icon');\n }\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowSetting } from '../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createSettingRequest,\n deleteSettingRequest,\n editSettingRequest,\n fetchSettingsRequest\n} from './api/runningLowApi.js';\n\ntype RunningLowContextValue = {\n settings: RunningLowSetting[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchSettings: (storageId: number) => Promise<RunningLowSetting[]>;\n createSetting: (storageId: number, dto: CreateSettingRequest) => Promise<RunningLowSetting>;\n editSetting: (storageId: number, id: number, dto: EditSettingRequest) => Promise<RunningLowSetting>;\n deleteSetting: (storageId: number, id: number) => Promise<void>;\n};\n\ntype RunningLowProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst RunningLowContext = createContext<RunningLowContextValue | undefined>(undefined);\n\nexport const RunningLowProvider = ({ baseUrl, children }: RunningLowProviderProps) => {\n const { token } = useAuth();\n const [settings, setSettings] = useState<RunningLowSetting[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setSettings,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchSettings = useCallback(\n (storageId: number) => fetchSettingsRequest(apiConfig, storageId),\n [apiConfig]\n );\n const createSetting = useCallback(\n (storageId: number, dto: CreateSettingRequest) => createSettingRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editSetting = useCallback(\n (storageId: number, id: number, dto: EditSettingRequest) => editSettingRequest(apiConfig, storageId, id, dto),\n [apiConfig]\n );\n const deleteSetting = useCallback(\n (storageId: number, id: number) => deleteSettingRequest(apiConfig, storageId, id),\n [apiConfig]\n );\n\n const value = useMemo<RunningLowContextValue>(() => ({\n settings,\n isLoading,\n isError,\n error,\n fetchSettings,\n createSetting,\n editSetting,\n deleteSetting\n }), [\n createSetting,\n deleteSetting,\n editSetting,\n error,\n fetchSettings,\n isError,\n isLoading,\n settings\n ]);\n\n return <RunningLowContext.Provider value={value}>{children}</RunningLowContext.Provider>;\n};\n\nexport const useRunningLow = (): RunningLowContextValue => {\n const context = useContext(RunningLowContext);\n if (!context) {\n throw new Error('useRunningLow must be used within a RunningLowProvider');\n }\n\n return context;\n};\n","import type { RunningLowSetting } from '../../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype RunningLowApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setSettings: (value: RunningLowSetting[] | ((items: RunningLowSetting[]) => RunningLowSetting[])) => void;\n};\n\nconst updateById = (items: RunningLowSetting[], updated: RunningLowSetting): RunningLowSetting[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchSettingsRequest = async (\n config: RunningLowApiConfig,\n storageId: number\n): Promise<RunningLowSetting[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low settings');\n }\n\n const payload = await readJson<RunningLowSetting[]>(response);\n if (payload) {\n config.setSettings(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n dto: CreateSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to create running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Create running low response missing data');\n }\n\n config.setSettings((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number,\n dto: EditSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'PUT',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to edit running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Edit running low response missing data');\n }\n\n config.setSettings((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to delete running low setting');\n }\n\n config.setSettings((previous) => previous.filter((item) => item.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Storage } from '../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n changeStorageNameRequest,\n createStorageRequest,\n deleteStorageRequest,\n fetchStorageRequest,\n fetchStoragesRequest\n} from './api/storageApi.js';\n\ntype StorageContextValue = {\n storages: Storage[];\n storage: Storage | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchStorages: () => Promise<Storage[]>;\n fetchStorage: (id: number) => Promise<Storage | null>;\n createStorage: (dto: CreateStorageRequest) => Promise<Storage>;\n changeStorageName: (id: number, dto: ChangeStorageNameRequest) => Promise<Storage>;\n deleteStorage: (id: number) => Promise<void>;\n};\n\ntype StorageProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageContext = createContext<StorageContextValue | undefined>(undefined);\n\nexport const StorageProvider = ({ baseUrl, children }: StorageProviderProps) => {\n const { token } = useAuth();\n const [storages, setStorages] = useState<Storage[]>([]);\n const [storage, setStorage] = useState<Storage | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setStorages,\n setStorage,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchStorages = useCallback(() => fetchStoragesRequest(apiConfig), [apiConfig]);\n const fetchStorage = useCallback((id: number) => fetchStorageRequest(apiConfig, id), [apiConfig]);\n const createStorage = useCallback(\n (dto: CreateStorageRequest) => createStorageRequest(apiConfig, dto),\n [apiConfig]\n );\n const changeStorageName = useCallback(\n (id: number, dto: ChangeStorageNameRequest) => changeStorageNameRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteStorage = useCallback((id: number) => deleteStorageRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<StorageContextValue>(() => ({\n storages,\n storage,\n isLoading,\n isError,\n error,\n fetchStorages,\n fetchStorage,\n createStorage,\n changeStorageName,\n deleteStorage\n }), [\n changeStorageName,\n createStorage,\n deleteStorage,\n error,\n fetchStorage,\n fetchStorages,\n isError,\n isLoading,\n storage,\n storages\n ]);\n\n return <StorageContext.Provider value={value}>{children}</StorageContext.Provider>;\n};\n\nexport const useStorages = (): StorageContextValue => {\n const context = useContext(StorageContext);\n if (!context) {\n throw new Error('useStorages must be used within a StorageProvider');\n }\n\n return context;\n};\n","import type { Storage } from '../../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setStorages: (value: Storage[] | ((items: Storage[]) => Storage[])) => void;\n setStorage: (value: Storage | null | ((prev: Storage | null) => Storage | null)) => void;\n};\n\nconst updateById = (items: Storage[], updated: Storage): Storage[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchStoragesRequest = async (config: StorageApiConfig): Promise<Storage[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storages');\n }\n\n const payload = await readJson<Storage[]>(response);\n if (payload) {\n config.setStorages(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<Storage | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setStorage(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Storage response missing data');\n }\n\n config.setStorage(payload);\n config.setStorages((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createStorageRequest = async (\n config: StorageApiConfig,\n dto: CreateStorageRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Create storage response missing data');\n }\n\n config.setStorages((previous) => [payload, ...previous]);\n config.setStorage(payload);\n return payload;\n});\n\nexport const changeStorageNameRequest = async (\n config: StorageApiConfig,\n id: number,\n dto: ChangeStorageNameRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Update storage response missing data');\n }\n\n config.setStorages((previous) => updateById(previous, payload));\n config.setStorage(payload);\n return payload;\n});\n\nexport const deleteStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage');\n }\n\n config.setStorages((previous) => previous.filter((item) => item.id !== id));\n config.setStorage((current) => (current?.id === id ? null : current));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowNotification, StorageItem } from '../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n addItemRequest,\n deleteItemRequest,\n editItemRequest,\n fetchAboutToExpireRequest,\n fetchExpiredRequest,\n fetchItemsRequest,\n fetchRunningLowRequest\n} from './api/storageItemApi.js';\n\ntype StorageItemContextValue = {\n items: StorageItem[];\n expiredItems: StorageItem[];\n aboutToExpireItems: StorageItem[];\n runningLow: RunningLowNotification[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<StorageItem[]>;\n addItem: (storageId: number, dto: AddItemRequest) => Promise<StorageItem>;\n editItem: (storageId: number, itemId: number, dto: EditItemRequest) => Promise<StorageItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n fetchExpired: (storageId: number) => Promise<StorageItem[]>;\n fetchAboutToExpire: (storageId: number) => Promise<StorageItem[]>;\n fetchRunningLow: (storageId: number) => Promise<RunningLowNotification[]>;\n};\n\ntype StorageItemProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageItemContext = createContext<StorageItemContextValue | undefined>(undefined);\n\nexport const StorageItemProvider = ({ baseUrl, children }: StorageItemProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<StorageItem[]>([]);\n const [expiredItems, setExpiredItems] = useState<StorageItem[]>([]);\n const [aboutToExpireItems, setAboutToExpireItems] = useState<StorageItem[]>([]);\n const [runningLow, setRunningLow] = useState<RunningLowNotification[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setItems,\n setExpiredItems,\n setAboutToExpireItems,\n setRunningLow,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchItems = useCallback((storageId: number) => fetchItemsRequest(apiConfig, storageId), [apiConfig]);\n const addItem = useCallback(\n (storageId: number, dto: AddItemRequest) => addItemRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editItem = useCallback(\n (storageId: number, itemId: number, dto: EditItemRequest) => editItemRequest(apiConfig, storageId, itemId, dto),\n [apiConfig]\n );\n const deleteItem = useCallback(\n (storageId: number, itemId: number) => deleteItemRequest(apiConfig, storageId, itemId),\n [apiConfig]\n );\n const fetchExpired = useCallback(\n (storageId: number) => fetchExpiredRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchAboutToExpire = useCallback(\n (storageId: number) => fetchAboutToExpireRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchRunningLow = useCallback(\n (storageId: number) => fetchRunningLowRequest(apiConfig, storageId),\n [apiConfig]\n );\n\n const value = useMemo<StorageItemContextValue>(() => ({\n items,\n expiredItems,\n aboutToExpireItems,\n runningLow,\n isLoading,\n isError,\n error,\n fetchItems,\n addItem,\n editItem,\n deleteItem,\n fetchExpired,\n fetchAboutToExpire,\n fetchRunningLow\n }), [\n aboutToExpireItems,\n addItem,\n deleteItem,\n editItem,\n error,\n expiredItems,\n fetchAboutToExpire,\n fetchExpired,\n fetchItems,\n fetchRunningLow,\n isError,\n isLoading,\n items,\n runningLow\n ]);\n\n return <StorageItemContext.Provider value={value}>{children}</StorageItemContext.Provider>;\n};\n\nexport const useStorageItems = (): StorageItemContextValue => {\n const context = useContext(StorageItemContext);\n if (!context) {\n throw new Error('useStorageItems must be used within a StorageItemProvider');\n }\n\n return context;\n};\n","import type { RunningLowNotification, StorageItem } from '../../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageItemApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: StorageItem[] | ((items: StorageItem[]) => StorageItem[])) => void;\n setExpiredItems: (value: StorageItem[]) => void;\n setAboutToExpireItems: (value: StorageItem[]) => void;\n setRunningLow: (value: RunningLowNotification[]) => void;\n};\n\nconst updateById = (items: StorageItem[], updated: StorageItem): StorageItem[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchItemsRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const addItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n dto: AddItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to add storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Add item response missing data');\n }\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number,\n dto: EditItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to edit storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Edit item response missing data');\n }\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage item');\n }\n\n config.setItems((previous) => previous.filter((item) => item.id !== itemId));\n});\n\nexport const fetchExpiredRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/expired`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch expired items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setExpiredItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchAboutToExpireRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/abouttoexpire`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch items about to expire');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setAboutToExpireItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchRunningLowRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<RunningLowNotification[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/runninglow`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low items');\n }\n\n const payload = await readJson<RunningLowNotification[]>(response);\n if (payload) {\n config.setRunningLow(payload);\n return payload;\n }\n\n return [];\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport type { InviteMemberRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchMembersRequest,\n inviteMemberRequest,\n removeMemberRequest\n} from './api/storageMemberApi.js';\n\ntype StorageMemberContextValue = {\n members: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchMembers: (storageId: number) => Promise<StorageMember[]>;\n inviteMember: (storageId: number, dto: InviteMemberRequest) => Promise<StorageMember>;\n removeMember: (storageId: number, userId: number) => Promise<void>;\n};\n\ntype StorageMemberProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageMemberContext = createContext<StorageMemberContextValue | undefined>(undefined);\n\nexport const StorageMemberProvider = ({ baseUrl, children }: StorageMemberProviderProps) => {\n const { token } = useAuth();\n const [members, setMembers] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setMembers,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchMembers = useCallback(\n (storageId: number) => fetchMembersRequest(apiConfig, storageId),\n [apiConfig]\n );\n const inviteMember = useCallback(\n (storageId: number, dto: InviteMemberRequest) => inviteMemberRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const removeMember = useCallback(\n (storageId: number, userId: number) => removeMemberRequest(apiConfig, storageId, userId),\n [apiConfig]\n );\n\n const value = useMemo<StorageMemberContextValue>(() => ({\n members,\n isLoading,\n isError,\n error,\n fetchMembers,\n inviteMember,\n removeMember\n }), [error, fetchMembers, inviteMember, isError, isLoading, members, removeMember]);\n\n return <StorageMemberContext.Provider value={value}>{children}</StorageMemberContext.Provider>;\n};\n\nexport const useStorageMembers = (): StorageMemberContextValue => {\n const context = useContext(StorageMemberContext);\n if (!context) {\n throw new Error('useStorageMembers must be used within a StorageMemberProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport type { InviteMemberRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageMemberApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setMembers: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchMembersRequest = async (\n config: StorageMemberApiConfig,\n storageId: number\n): Promise<StorageMember[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage members');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setMembers(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const inviteMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n dto: InviteMemberRequest\n): Promise<StorageMember> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to invite member');\n }\n\n const payload = await readJson<StorageMember>(response);\n if (!payload) {\n throw new Error('Invite member response missing data');\n }\n\n config.setMembers((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const removeMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n userId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members/${userId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to remove member');\n }\n\n config.setMembers((previous) => previous.filter((member) => member.user.id !== userId));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { User } from '../type/models.js';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n deleteUserRequest,\n fetchUserRequest,\n fetchUsersRequest,\n getUserPfpRequest,\n updateUserRequest,\n uploadUserPfpRequest\n} from './api/userApi.js';\n\ntype UserContextValue = {\n users: User[];\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchUsers: () => Promise<User[]>;\n fetchUser: (id: number) => Promise<User | null>;\n updateUser: (id: number, dto: ChangeUserDataRequest) => Promise<User>;\n deleteUser: (id: number) => Promise<void>;\n getUserPfp: (id: number) => Promise<ArrayBuffer>;\n uploadUserPfp: (id: number, file: Blob) => Promise<void>;\n};\n\ntype UserProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst UserContext = createContext<UserContextValue | undefined>(undefined);\n\nexport const UserProvider = ({ baseUrl, children }: UserProviderProps) => {\n const { token } = useAuth();\n const [users, setUsers] = useState<User[]>([]);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setUsers,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchUsers = useCallback(() => fetchUsersRequest(apiConfig), [apiConfig]);\n const fetchUser = useCallback((id: number) => fetchUserRequest(apiConfig, id), [apiConfig]);\n const updateUser = useCallback(\n (id: number, dto: ChangeUserDataRequest) => updateUserRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteUser = useCallback((id: number) => deleteUserRequest(apiConfig, id), [apiConfig]);\n const getUserPfp = useCallback((id: number) => getUserPfpRequest(apiConfig, id), [apiConfig]);\n const uploadUserPfp = useCallback(\n (id: number, file: Blob) => uploadUserPfpRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<UserContextValue>(() => ({\n users,\n user,\n isLoading,\n isError,\n error,\n fetchUsers,\n fetchUser,\n updateUser,\n deleteUser,\n getUserPfp,\n uploadUserPfp\n }), [\n deleteUser,\n error,\n fetchUser,\n fetchUsers,\n getUserPfp,\n isError,\n isLoading,\n updateUser,\n uploadUserPfp,\n user,\n users\n ]);\n\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useUsers = (): UserContextValue => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error('useUsers must be used within a UserProvider');\n }\n\n return context;\n};\n","import type { User } from '../../type/models.js';\nimport type { ChangeUserDataRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype UserApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setUsers: (value: User[] | ((items: User[]) => User[])) => void;\n setUser: (value: User | null | ((prev: User | null) => User | null)) => void;\n};\n\nconst updateById = (items: User[], updated: User): User[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchUsersRequest = async (config: UserApiConfig): Promise<User[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch users');\n }\n\n const payload = await readJson<User[]>(response);\n if (payload) {\n config.setUsers(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<User | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setUser(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('User response missing data');\n }\n\n config.setUser(payload);\n config.setUsers((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const updateUserRequest = async (\n config: UserApiConfig,\n id: number,\n dto: ChangeUserDataRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Update user response missing data');\n }\n\n config.setUsers((previous) => updateById(previous, payload));\n config.setUser(payload);\n return payload;\n});\n\nexport const deleteUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete user');\n }\n\n config.setUsers((previous) => previous.filter((item) => item.id !== id));\n config.setUser((current) => (current?.id === id ? null : current));\n});\n\nexport const getUserPfpRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch user pfp');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadUserPfpRequest = async (\n config: UserApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload user pfp');\n }\n});\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context/AuthContext.tsx","../src/context/http.ts","../src/context/api/requestState.ts","../src/context/api/authApi.ts","../src/context/InviteContext.tsx","../src/context/api/inviteApi.ts","../src/context/ProductContext.tsx","../src/context/api/productApi.ts","../src/context/RunningLowContext.tsx","../src/context/api/runningLowApi.ts","../src/context/StorageContext.tsx","../src/context/api/storageApi.ts","../src/context/StorageItemContext.tsx","../src/context/api/storageItemApi.ts","../src/context/StorageMemberContext.tsx","../src/context/api/storageMemberApi.ts","../src/context/UserContext.tsx","../src/context/api/userApi.ts"],"sourcesContent":["export * from './type/auth.js';\nexport * from './type/base.js';\nexport * from './type/models.js';\nexport * from './type/product.js';\nexport * from './type/runninglow.js';\nexport * from './type/requests.js';\nexport * from './type/storage.js';\nexport * from './type/user.js';\nexport * from './context/AuthContext.js';\nexport * from './context/http.js';\nexport * from './context/InviteContext.js';\nexport * from './context/ProductContext.js';\nexport * from './context/RunningLowContext.js';\nexport * from './context/StorageContext.js';\nexport * from './context/StorageItemContext.js';\nexport * from './context/StorageMemberContext.js';\nexport * from './context/UserContext.js';","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from 'react';\n\nimport type {\n ChangePasswordRequest,\n LoginRequest,\n SignupRequest,\n TokenStorage,\n User\n} from '../type/auth.js';\nimport {\n changePasswordRequest,\n getMeRequest,\n loginRequest,\n logoutRequest,\n signupRequest\n} from './api/authApi.js';\n\nexport type AuthContextValue = {\n token: string | null;\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n login: (dto: LoginRequest) => Promise<void>;\n signup: (dto: SignupRequest) => Promise<User>;\n changePassword: (dto: ChangePasswordRequest) => Promise<void>;\n getMe: () => Promise<User | null>;\n logout: () => Promise<void>;\n getToken: () => string | null;\n};\n\ntype AuthProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n initialToken?: string | null;\n tokenStorage?: TokenStorage;\n storageKey?: string;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport const AuthProvider = ({ \n baseUrl, \n children, \n initialToken = null,\n tokenStorage,\n storageKey = 'auth_token'\n}: AuthProviderProps) => {\n const [token, setTokenState] = useState<string | null>(initialToken);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Load token from storage on mount\n useEffect(() => {\n if (tokenStorage && !initialToken) {\n const loadToken = async () => {\n try {\n const storedToken = await tokenStorage.getItem(storageKey);\n if (storedToken) {\n setTokenState(storedToken);\n }\n } catch (err) {\n console.error('Failed to load token from storage:', err);\n }\n };\n loadToken();\n }\n }, [tokenStorage, storageKey, initialToken]);\n\n // Wrap setToken to persist to storage\n const setToken = useCallback(async (newToken: string | null) => {\n setTokenState(newToken);\n if (tokenStorage) {\n try {\n if (newToken) {\n await tokenStorage.setItem(storageKey, newToken);\n } else {\n await tokenStorage.removeItem(storageKey);\n }\n } catch (err) {\n console.error('Failed to persist token to storage:', err);\n }\n }\n }, [tokenStorage, storageKey]);\n\n const getToken = useCallback(() => token, [token]);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setToken,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const login = useCallback((dto: LoginRequest) => loginRequest(apiConfig, dto), [apiConfig]);\n const signup = useCallback((dto: SignupRequest) => signupRequest(apiConfig, dto), [apiConfig]);\n const changePassword = useCallback(\n (dto: ChangePasswordRequest) => changePasswordRequest(apiConfig, dto),\n [apiConfig]\n );\n const getMe = useCallback(() => getMeRequest(apiConfig), [apiConfig]);\n const logout = useCallback(() => logoutRequest(apiConfig), [apiConfig]);\n\n const value = useMemo<AuthContextValue>(() => ({\n token,\n user,\n isLoading,\n isError,\n error,\n login,\n signup,\n changePassword,\n getMe,\n logout,\n getToken\n }), [\n changePassword,\n error,\n getMe,\n getToken,\n isError,\n isLoading,\n login,\n logout,\n signup,\n token,\n user\n ]);\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport const useAuth = (): AuthContextValue => {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return context;\n};\n","export const normalizeBaseUrl = (baseUrl: string): string => baseUrl.replace(/\\/+$/, '');\n\nexport const buildAuthHeaders = (token: string | null): HeadersInit => {\n if (!token) {\n return {};\n }\n\n return {\n Authorization: `Bearer ${token}`\n };\n};\n\nexport const readJson = async <T,>(response: Response): Promise<T | null> => {\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return null;\n }\n\n return (await response.json()) as T;\n};\n\nexport const readArrayBuffer = async (response: Response): Promise<ArrayBuffer> => response.arrayBuffer();\n","export type RequestStateHandlers = {\n setIsLoading: (value: boolean) => void;\n setIsError: (value: boolean) => void;\n setError: (error: Error | null) => void;\n};\n\nexport const runWithRequestState = async <T>(\n handlers: RequestStateHandlers,\n request: () => Promise<T>\n): Promise<T> => {\n handlers.setIsLoading(true);\n handlers.setIsError(false);\n handlers.setError(null);\n\n try {\n return await request();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n handlers.setIsError(true);\n handlers.setError(error);\n throw error;\n } finally {\n handlers.setIsLoading(false);\n }\n};\n","import type {\n ChangePasswordRequest,\n LoginRequest,\n LoginResponse,\n SignupRequest,\n User\n} from '../../type/auth.js';\nimport type { ErrorResponse } from '../../type/base.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype AuthApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setToken: (token: string | null) => void;\n setUser: (user: User | null) => void;\n};\n\nexport const loginRequest = async (\n config: AuthApiConfig,\n dto: LoginRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Login failed');\n }\n\n const payload = await readJson<LoginResponse>(response);\n if (!payload || !('token' in payload)) {\n throw new Error('Login response missing token');\n }\n\n config.setToken(payload.token);\n\n const meResponse = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(payload.token)\n });\n\n if (meResponse.ok) {\n const mePayload = await readJson<User>(meResponse);\n if (mePayload) {\n config.setUser(mePayload);\n }\n }\n});\n\nexport const signupRequest = async (\n config: AuthApiConfig,\n dto: SignupRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/signup`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Signup failed');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Signup response missing user');\n }\n\n config.setUser(payload);\n return payload;\n});\n\nexport const changePasswordRequest = async (\n config: AuthApiConfig,\n dto: ChangePasswordRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/password/change`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Change password failed');\n }\n});\n\nexport const getMeRequest = async (config: AuthApiConfig): Promise<User | null> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n config.setUser(null);\n return null;\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n config.setUser(null);\n return null;\n }\n\n config.setUser(payload);\n return payload;\n }\n);\n\nexport const logoutRequest = async (config: AuthApiConfig): Promise<void> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n if (config.token) {\n await fetch(`${normalizedBaseUrl}/api/auth/logout`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n }\n\n config.setToken(null);\n config.setUser(null);\n }\n);\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n acceptInviteRequest,\n declineInviteRequest,\n fetchInvitesRequest\n} from './api/inviteApi.js';\n\ntype InviteContextValue = {\n invites: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchInvites: () => Promise<StorageMember[]>;\n acceptInvite: (id: number) => Promise<void>;\n declineInvite: (id: number) => Promise<void>;\n};\n\ntype InviteProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst InviteContext = createContext<InviteContextValue | undefined>(undefined);\n\nexport const InviteProvider = ({ baseUrl, children }: InviteProviderProps) => {\n const { token } = useAuth();\n const [invites, setInvites] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setInvites,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchInvites = useCallback(() => fetchInvitesRequest(apiConfig), [apiConfig]);\n const acceptInvite = useCallback((id: number) => acceptInviteRequest(apiConfig, id), [apiConfig]);\n const declineInvite = useCallback((id: number) => declineInviteRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<InviteContextValue>(() => ({\n invites,\n isLoading,\n isError,\n error,\n fetchInvites,\n acceptInvite,\n declineInvite\n }), [acceptInvite, declineInvite, error, fetchInvites, isError, isLoading, invites]);\n\n return <InviteContext.Provider value={value}>{children}</InviteContext.Provider>;\n};\n\nexport const useInvites = (): InviteContextValue => {\n const context = useContext(InviteContext);\n if (!context) {\n throw new Error('useInvites must be used within an InviteProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype InviteApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setInvites: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchInvitesRequest = async (config: InviteApiConfig): Promise<StorageMember[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch invites');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setInvites(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const acceptInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to accept invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n\nexport const declineInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to decline invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Product } from '../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createProductRequest,\n deleteProductRequest,\n fetchProductRequest,\n fetchProductsRequest,\n getProductIconRequest,\n updateProductRequest,\n uploadProductIconRequest\n} from './api/productApi.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductContextValue = {\n products: Product[];\n product: Product | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchProducts: (query?: ProductQuery) => Promise<Product[]>;\n fetchProduct: (id: number) => Promise<Product | null>;\n createProduct: (dto: CreateProductRequest) => Promise<Product>;\n updateProduct: (id: number, dto: UpdateProductRequest) => Promise<Product>;\n deleteProduct: (id: number) => Promise<void>;\n getProductIcon: (id: number) => Promise<ArrayBuffer>;\n uploadProductIcon: (id: number, file: Blob) => Promise<void>;\n};\n\ntype ProductProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ProductContext = createContext<ProductContextValue | undefined>(undefined);\n\nexport const ProductProvider = ({ baseUrl, children }: ProductProviderProps) => {\n const { token } = useAuth();\n const [products, setProducts] = useState<Product[]>([]);\n const [product, setProduct] = useState<Product | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setProducts,\n setProduct,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchProducts = useCallback(\n (query?: ProductQuery) => fetchProductsRequest(apiConfig, query),\n [apiConfig]\n );\n const fetchProduct = useCallback((id: number) => fetchProductRequest(apiConfig, id), [apiConfig]);\n const createProduct = useCallback(\n (dto: CreateProductRequest) => createProductRequest(apiConfig, dto),\n [apiConfig]\n );\n const updateProduct = useCallback(\n (id: number, dto: UpdateProductRequest) => updateProductRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteProduct = useCallback((id: number) => deleteProductRequest(apiConfig, id), [apiConfig]);\n const getProductIcon = useCallback((id: number) => getProductIconRequest(apiConfig, id), [apiConfig]);\n const uploadProductIcon = useCallback(\n (id: number, file: Blob) => uploadProductIconRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<ProductContextValue>(() => ({\n products,\n product,\n isLoading,\n isError,\n error,\n fetchProducts,\n fetchProduct,\n createProduct,\n updateProduct,\n deleteProduct,\n getProductIcon,\n uploadProductIcon\n }), [\n createProduct,\n deleteProduct,\n error,\n fetchProduct,\n fetchProducts,\n getProductIcon,\n isError,\n isLoading,\n product,\n products,\n updateProduct,\n uploadProductIcon\n ]);\n\n return <ProductContext.Provider value={value}>{children}</ProductContext.Provider>;\n};\n\nexport const useProducts = (): ProductContextValue => {\n const context = useContext(ProductContext);\n if (!context) {\n throw new Error('useProducts must be used within a ProductProvider');\n }\n\n return context;\n};\n","import type { Product } from '../../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setProducts: (value: Product[] | ((items: Product[]) => Product[])) => void;\n setProduct: (value: Product | null | ((prev: Product | null) => Product | null)) => void;\n};\n\nconst updateById = (items: Product[], updated: Product): Product[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchProductsRequest = async (\n config: ProductApiConfig,\n query?: ProductQuery\n): Promise<Product[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const params = new URLSearchParams();\n if (query?.barcode) {\n params.set('barcode', query.barcode);\n }\n if (query?.name) {\n params.set('name', query.name);\n }\n if (query?.category) {\n params.set('category', query.category);\n }\n\n const url = params.toString()\n ? `${normalizedBaseUrl}/api/products?${params.toString()}`\n : `${normalizedBaseUrl}/api/products`;\n\n const response = await fetch(url, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch products');\n }\n\n const payload = await readJson<Product[]>(response);\n if (payload) {\n config.setProducts(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<Product | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setProduct(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Product response missing data');\n }\n\n config.setProduct(payload);\n config.setProducts((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createProductRequest = async (\n config: ProductApiConfig,\n dto: CreateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Create product response missing data');\n }\n\n config.setProducts((previous) => [payload, ...previous]);\n config.setProduct(payload);\n return payload;\n});\n\nexport const updateProductRequest = async (\n config: ProductApiConfig,\n id: number,\n dto: UpdateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Update product response missing data');\n }\n\n config.setProducts((previous) => updateById(previous, payload));\n config.setProduct(payload);\n return payload;\n});\n\nexport const deleteProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete product');\n }\n\n config.setProducts((previous) => previous.filter((item) => item.id !== id));\n config.setProduct((current) => (current?.id === id ? null : current));\n});\n\nexport const getProductIconRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch product icon');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadProductIconRequest = async (\n config: ProductApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload product icon');\n }\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowSetting } from '../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createSettingRequest,\n deleteSettingRequest,\n editSettingRequest,\n fetchSettingsRequest\n} from './api/runningLowApi.js';\n\ntype RunningLowContextValue = {\n settings: RunningLowSetting[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchSettings: (storageId: number) => Promise<RunningLowSetting[]>;\n createSetting: (storageId: number, dto: CreateSettingRequest) => Promise<RunningLowSetting>;\n editSetting: (storageId: number, id: number, dto: EditSettingRequest) => Promise<RunningLowSetting>;\n deleteSetting: (storageId: number, id: number) => Promise<void>;\n};\n\ntype RunningLowProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst RunningLowContext = createContext<RunningLowContextValue | undefined>(undefined);\n\nexport const RunningLowProvider = ({ baseUrl, children }: RunningLowProviderProps) => {\n const { token } = useAuth();\n const [settings, setSettings] = useState<RunningLowSetting[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setSettings,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchSettings = useCallback(\n (storageId: number) => fetchSettingsRequest(apiConfig, storageId),\n [apiConfig]\n );\n const createSetting = useCallback(\n (storageId: number, dto: CreateSettingRequest) => createSettingRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editSetting = useCallback(\n (storageId: number, id: number, dto: EditSettingRequest) => editSettingRequest(apiConfig, storageId, id, dto),\n [apiConfig]\n );\n const deleteSetting = useCallback(\n (storageId: number, id: number) => deleteSettingRequest(apiConfig, storageId, id),\n [apiConfig]\n );\n\n const value = useMemo<RunningLowContextValue>(() => ({\n settings,\n isLoading,\n isError,\n error,\n fetchSettings,\n createSetting,\n editSetting,\n deleteSetting\n }), [\n createSetting,\n deleteSetting,\n editSetting,\n error,\n fetchSettings,\n isError,\n isLoading,\n settings\n ]);\n\n return <RunningLowContext.Provider value={value}>{children}</RunningLowContext.Provider>;\n};\n\nexport const useRunningLow = (): RunningLowContextValue => {\n const context = useContext(RunningLowContext);\n if (!context) {\n throw new Error('useRunningLow must be used within a RunningLowProvider');\n }\n\n return context;\n};\n","import type { RunningLowSetting } from '../../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype RunningLowApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setSettings: (value: RunningLowSetting[] | ((items: RunningLowSetting[]) => RunningLowSetting[])) => void;\n};\n\nconst updateById = (items: RunningLowSetting[], updated: RunningLowSetting): RunningLowSetting[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchSettingsRequest = async (\n config: RunningLowApiConfig,\n storageId: number\n): Promise<RunningLowSetting[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low settings');\n }\n\n const payload = await readJson<RunningLowSetting[]>(response);\n if (payload) {\n config.setSettings(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n dto: CreateSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to create running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Create running low response missing data');\n }\n\n config.setSettings((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number,\n dto: EditSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'PUT',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to edit running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Edit running low response missing data');\n }\n\n config.setSettings((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to delete running low setting');\n }\n\n config.setSettings((previous) => previous.filter((item) => item.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Storage } from '../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n changeStorageNameRequest,\n createStorageRequest,\n deleteStorageRequest,\n fetchStorageRequest,\n fetchStoragesRequest\n} from './api/storageApi.js';\n\ntype StorageContextValue = {\n storages: Storage[];\n storage: Storage | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchStorages: () => Promise<Storage[]>;\n fetchStorage: (id: number) => Promise<Storage | null>;\n createStorage: (dto: CreateStorageRequest) => Promise<Storage>;\n changeStorageName: (id: number, dto: ChangeStorageNameRequest) => Promise<Storage>;\n deleteStorage: (id: number) => Promise<void>;\n};\n\ntype StorageProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageContext = createContext<StorageContextValue | undefined>(undefined);\n\nexport const StorageProvider = ({ baseUrl, children }: StorageProviderProps) => {\n const { token } = useAuth();\n const [storages, setStorages] = useState<Storage[]>([]);\n const [storage, setStorage] = useState<Storage | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setStorages,\n setStorage,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchStorages = useCallback(() => fetchStoragesRequest(apiConfig), [apiConfig]);\n const fetchStorage = useCallback((id: number) => fetchStorageRequest(apiConfig, id), [apiConfig]);\n const createStorage = useCallback(\n (dto: CreateStorageRequest) => createStorageRequest(apiConfig, dto),\n [apiConfig]\n );\n const changeStorageName = useCallback(\n (id: number, dto: ChangeStorageNameRequest) => changeStorageNameRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteStorage = useCallback((id: number) => deleteStorageRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<StorageContextValue>(() => ({\n storages,\n storage,\n isLoading,\n isError,\n error,\n fetchStorages,\n fetchStorage,\n createStorage,\n changeStorageName,\n deleteStorage\n }), [\n changeStorageName,\n createStorage,\n deleteStorage,\n error,\n fetchStorage,\n fetchStorages,\n isError,\n isLoading,\n storage,\n storages\n ]);\n\n return <StorageContext.Provider value={value}>{children}</StorageContext.Provider>;\n};\n\nexport const useStorages = (): StorageContextValue => {\n const context = useContext(StorageContext);\n if (!context) {\n throw new Error('useStorages must be used within a StorageProvider');\n }\n\n return context;\n};\n","import type { Storage } from '../../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setStorages: (value: Storage[] | ((items: Storage[]) => Storage[])) => void;\n setStorage: (value: Storage | null | ((prev: Storage | null) => Storage | null)) => void;\n};\n\nconst updateById = (items: Storage[], updated: Storage): Storage[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchStoragesRequest = async (config: StorageApiConfig): Promise<Storage[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storages');\n }\n\n const payload = await readJson<Storage[]>(response);\n if (payload) {\n config.setStorages(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<Storage | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setStorage(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Storage response missing data');\n }\n\n config.setStorage(payload);\n config.setStorages((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createStorageRequest = async (\n config: StorageApiConfig,\n dto: CreateStorageRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Create storage response missing data');\n }\n\n config.setStorages((previous) => [payload, ...previous]);\n config.setStorage(payload);\n return payload;\n});\n\nexport const changeStorageNameRequest = async (\n config: StorageApiConfig,\n id: number,\n dto: ChangeStorageNameRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Update storage response missing data');\n }\n\n config.setStorages((previous) => updateById(previous, payload));\n config.setStorage(payload);\n return payload;\n});\n\nexport const deleteStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage');\n }\n\n config.setStorages((previous) => previous.filter((item) => item.id !== id));\n config.setStorage((current) => (current?.id === id ? null : current));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowNotification, StorageItem } from '../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n addItemRequest,\n deleteItemRequest,\n editItemRequest,\n fetchAboutToExpireRequest,\n fetchExpiredRequest,\n fetchItemsRequest,\n fetchRunningLowRequest\n} from './api/storageItemApi.js';\n\ntype StorageItemContextValue = {\n items: StorageItem[];\n expiredItems: StorageItem[];\n aboutToExpireItems: StorageItem[];\n runningLow: RunningLowNotification[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<StorageItem[]>;\n addItem: (storageId: number, dto: AddItemRequest) => Promise<StorageItem>;\n editItem: (storageId: number, itemId: number, dto: EditItemRequest) => Promise<StorageItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n fetchExpired: (storageId: number) => Promise<StorageItem[]>;\n fetchAboutToExpire: (storageId: number) => Promise<StorageItem[]>;\n fetchRunningLow: (storageId: number) => Promise<RunningLowNotification[]>;\n};\n\ntype StorageItemProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageItemContext = createContext<StorageItemContextValue | undefined>(undefined);\n\nexport const StorageItemProvider = ({ baseUrl, children }: StorageItemProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<StorageItem[]>([]);\n const [expiredItems, setExpiredItems] = useState<StorageItem[]>([]);\n const [aboutToExpireItems, setAboutToExpireItems] = useState<StorageItem[]>([]);\n const [runningLow, setRunningLow] = useState<RunningLowNotification[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setItems,\n setExpiredItems,\n setAboutToExpireItems,\n setRunningLow,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchItems = useCallback((storageId: number) => fetchItemsRequest(apiConfig, storageId), [apiConfig]);\n const addItem = useCallback(\n (storageId: number, dto: AddItemRequest) => addItemRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editItem = useCallback(\n (storageId: number, itemId: number, dto: EditItemRequest) => editItemRequest(apiConfig, storageId, itemId, dto),\n [apiConfig]\n );\n const deleteItem = useCallback(\n (storageId: number, itemId: number) => deleteItemRequest(apiConfig, storageId, itemId),\n [apiConfig]\n );\n const fetchExpired = useCallback(\n (storageId: number) => fetchExpiredRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchAboutToExpire = useCallback(\n (storageId: number) => fetchAboutToExpireRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchRunningLow = useCallback(\n (storageId: number) => fetchRunningLowRequest(apiConfig, storageId),\n [apiConfig]\n );\n\n const value = useMemo<StorageItemContextValue>(() => ({\n items,\n expiredItems,\n aboutToExpireItems,\n runningLow,\n isLoading,\n isError,\n error,\n fetchItems,\n addItem,\n editItem,\n deleteItem,\n fetchExpired,\n fetchAboutToExpire,\n fetchRunningLow\n }), [\n aboutToExpireItems,\n addItem,\n deleteItem,\n editItem,\n error,\n expiredItems,\n fetchAboutToExpire,\n fetchExpired,\n fetchItems,\n fetchRunningLow,\n isError,\n isLoading,\n items,\n runningLow\n ]);\n\n return <StorageItemContext.Provider value={value}>{children}</StorageItemContext.Provider>;\n};\n\nexport const useStorageItems = (): StorageItemContextValue => {\n const context = useContext(StorageItemContext);\n if (!context) {\n throw new Error('useStorageItems must be used within a StorageItemProvider');\n }\n\n return context;\n};\n","import type { RunningLowNotification, StorageItem } from '../../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageItemApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: StorageItem[] | ((items: StorageItem[]) => StorageItem[])) => void;\n setExpiredItems: (value: StorageItem[]) => void;\n setAboutToExpireItems: (value: StorageItem[]) => void;\n setRunningLow: (value: RunningLowNotification[]) => void;\n};\n\nconst updateById = (items: StorageItem[], updated: StorageItem): StorageItem[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchItemsRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const addItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n dto: AddItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to add storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Add item response missing data');\n }\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number,\n dto: EditItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to edit storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Edit item response missing data');\n }\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage item');\n }\n\n config.setItems((previous) => previous.filter((item) => item.id !== itemId));\n});\n\nexport const fetchExpiredRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/expired`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch expired items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setExpiredItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchAboutToExpireRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/abouttoexpire`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch items about to expire');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setAboutToExpireItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchRunningLowRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<RunningLowNotification[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/runninglow`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low items');\n }\n\n const payload = await readJson<RunningLowNotification[]>(response);\n if (payload) {\n config.setRunningLow(payload);\n return payload;\n }\n\n return [];\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport type { InviteMemberRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchMembersRequest,\n inviteMemberRequest,\n removeMemberRequest\n} from './api/storageMemberApi.js';\n\ntype StorageMemberContextValue = {\n members: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchMembers: (storageId: number) => Promise<StorageMember[]>;\n inviteMember: (storageId: number, dto: InviteMemberRequest) => Promise<StorageMember>;\n removeMember: (storageId: number, userId: number) => Promise<void>;\n};\n\ntype StorageMemberProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageMemberContext = createContext<StorageMemberContextValue | undefined>(undefined);\n\nexport const StorageMemberProvider = ({ baseUrl, children }: StorageMemberProviderProps) => {\n const { token } = useAuth();\n const [members, setMembers] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setMembers,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchMembers = useCallback(\n (storageId: number) => fetchMembersRequest(apiConfig, storageId),\n [apiConfig]\n );\n const inviteMember = useCallback(\n (storageId: number, dto: InviteMemberRequest) => inviteMemberRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const removeMember = useCallback(\n (storageId: number, userId: number) => removeMemberRequest(apiConfig, storageId, userId),\n [apiConfig]\n );\n\n const value = useMemo<StorageMemberContextValue>(() => ({\n members,\n isLoading,\n isError,\n error,\n fetchMembers,\n inviteMember,\n removeMember\n }), [error, fetchMembers, inviteMember, isError, isLoading, members, removeMember]);\n\n return <StorageMemberContext.Provider value={value}>{children}</StorageMemberContext.Provider>;\n};\n\nexport const useStorageMembers = (): StorageMemberContextValue => {\n const context = useContext(StorageMemberContext);\n if (!context) {\n throw new Error('useStorageMembers must be used within a StorageMemberProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport type { InviteMemberRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageMemberApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setMembers: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchMembersRequest = async (\n config: StorageMemberApiConfig,\n storageId: number\n): Promise<StorageMember[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage members');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setMembers(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const inviteMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n dto: InviteMemberRequest\n): Promise<StorageMember> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to invite member');\n }\n\n const payload = await readJson<StorageMember>(response);\n if (!payload) {\n throw new Error('Invite member response missing data');\n }\n\n config.setMembers((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const removeMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n userId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members/${userId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to remove member');\n }\n\n config.setMembers((previous) => previous.filter((member) => member.user.id !== userId));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { User } from '../type/models.js';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n deleteUserRequest,\n fetchUserRequest,\n fetchUsersRequest,\n getUserPfpRequest,\n updateUserRequest,\n uploadUserPfpRequest\n} from './api/userApi.js';\n\ntype UserContextValue = {\n users: User[];\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchUsers: () => Promise<User[]>;\n fetchUser: (id: number) => Promise<User | null>;\n updateUser: (id: number, dto: ChangeUserDataRequest) => Promise<User>;\n deleteUser: (id: number) => Promise<void>;\n getUserPfp: (id: number) => Promise<ArrayBuffer>;\n uploadUserPfp: (id: number, file: Blob) => Promise<void>;\n};\n\ntype UserProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst UserContext = createContext<UserContextValue | undefined>(undefined);\n\nexport const UserProvider = ({ baseUrl, children }: UserProviderProps) => {\n const { token } = useAuth();\n const [users, setUsers] = useState<User[]>([]);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setUsers,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchUsers = useCallback(() => fetchUsersRequest(apiConfig), [apiConfig]);\n const fetchUser = useCallback((id: number) => fetchUserRequest(apiConfig, id), [apiConfig]);\n const updateUser = useCallback(\n (id: number, dto: ChangeUserDataRequest) => updateUserRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteUser = useCallback((id: number) => deleteUserRequest(apiConfig, id), [apiConfig]);\n const getUserPfp = useCallback((id: number) => getUserPfpRequest(apiConfig, id), [apiConfig]);\n const uploadUserPfp = useCallback(\n (id: number, file: Blob) => uploadUserPfpRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<UserContextValue>(() => ({\n users,\n user,\n isLoading,\n isError,\n error,\n fetchUsers,\n fetchUser,\n updateUser,\n deleteUser,\n getUserPfp,\n uploadUserPfp\n }), [\n deleteUser,\n error,\n fetchUser,\n fetchUsers,\n getUserPfp,\n isError,\n isLoading,\n updateUser,\n uploadUserPfp,\n user,\n users\n ]);\n\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useUsers = (): UserContextValue => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error('useUsers must be used within a UserProvider');\n }\n\n return context;\n};\n","import type { User } from '../../type/models.js';\nimport type { ChangeUserDataRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype UserApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setUsers: (value: User[] | ((items: User[]) => User[])) => void;\n setUser: (value: User | null | ((prev: User | null) => User | null)) => void;\n};\n\nconst updateById = (items: User[], updated: User): User[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchUsersRequest = async (config: UserApiConfig): Promise<User[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch users');\n }\n\n const payload = await readJson<User[]>(response);\n if (payload) {\n config.setUsers(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<User | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setUser(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('User response missing data');\n }\n\n config.setUser(payload);\n config.setUsers((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const updateUserRequest = async (\n config: UserApiConfig,\n id: number,\n dto: ChangeUserDataRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Update user response missing data');\n }\n\n config.setUsers((previous) => updateById(previous, payload));\n config.setUser(payload);\n return payload;\n});\n\nexport const deleteUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete user');\n }\n\n config.setUsers((previous) => previous.filter((item) => item.id !== id));\n config.setUser((current) => (current?.id === id ? null : current));\n});\n\nexport const getUserPfpRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch user pfp');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadUserPfpRequest = async (\n config: UserApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload user pfp');\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAOO;;;ACPA,IAAM,mBAAmB,CAAC,YAA4B,QAAQ,QAAQ,QAAQ,EAAE;AAEhF,IAAM,mBAAmB,CAAC,UAAsC;AACnE,MAAI,CAAC,OAAO;AACR,WAAO,CAAC;AAAA,EACZ;AAEA,SAAO;AAAA,IACH,eAAe,UAAU,KAAK;AAAA,EAClC;AACJ;AAEO,IAAM,WAAW,OAAW,aAA0C;AACzE,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,MAAI,CAAC,eAAe,CAAC,YAAY,SAAS,kBAAkB,GAAG;AAC3D,WAAO;AAAA,EACX;AAEA,SAAQ,MAAM,SAAS,KAAK;AAChC;AAEO,IAAM,kBAAkB,OAAO,aAA6C,SAAS,YAAY;;;ACfjG,IAAM,sBAAsB,OAC/B,UACA,YACa;AACb,WAAS,aAAa,IAAI;AAC1B,WAAS,WAAW,KAAK;AACzB,WAAS,SAAS,IAAI;AAEtB,MAAI;AACA,WAAO,MAAM,QAAQ;AAAA,EACzB,SAAS,KAAK;AACV,UAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,eAAe;AACpE,aAAS,WAAW,IAAI;AACxB,aAAS,SAAS,KAAK;AACvB,UAAM;AAAA,EACV,UAAE;AACE,aAAS,aAAa,KAAK;AAAA,EAC/B;AACJ;;;ACNO,IAAM,eAAe,OACxB,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,mBAAmB;AAAA,IAChE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,cAAc;AAAA,EAClD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,CAAC,WAAW,EAAE,WAAW,UAAU;AACnC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,SAAS,QAAQ,KAAK;AAE7B,QAAM,aAAa,MAAM,MAAM,GAAG,iBAAiB,gBAAgB;AAAA,IAC/D,SAAS,iBAAiB,QAAQ,KAAK;AAAA,EAC3C,CAAC;AAED,MAAI,WAAW,IAAI;AACf,UAAM,YAAY,MAAM,SAAe,UAAU;AACjD,QAAI,WAAW;AACX,aAAO,QAAQ,SAAS;AAAA,IAC5B;AAAA,EACJ;AACJ,CAAC;AAEM,IAAM,gBAAgB,OACzB,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,oBAAoB;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,eAAe;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,QAAQ,OAAO;AACtB,SAAO;AACX,CAAC;AAEM,IAAM,wBAAwB,OACjC,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,6BAA6B;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,wBAAwB;AAAA,EAC5D;AACJ,CAAC;AAEM,IAAM,eAAe,OAAO,WAAgD;AAAA,EAC/E;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,gBAAgB;AAAA,MAC7D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,aAAO,QAAQ,IAAI;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,QAAI,CAAC,SAAS;AACV,aAAO,QAAQ,IAAI;AACnB,aAAO;AAAA,IACX;AAEA,WAAO,QAAQ,OAAO;AACtB,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,gBAAgB,OAAO,WAAyC;AAAA,EACzE;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAI,OAAO,OAAO;AACd,YAAM,MAAM,GAAG,iBAAiB,oBAAoB;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,MAC1C,CAAC;AAAA,IACL;AAEA,WAAO,SAAS,IAAI;AACpB,WAAO,QAAQ,IAAI;AAAA,EACvB;AACJ;;;AHCW;AA/FX,IAAM,kBAAc,4BAA4C,MAAS;AAElE,IAAM,eAAe,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,aAAa;AACjB,MAAyB;AACrB,QAAM,CAAC,OAAO,aAAa,QAAI,uBAAwB,YAAY;AACnE,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAsB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,IAAI;AAGrD,8BAAU,MAAM;AACZ,QAAI,gBAAgB,CAAC,cAAc;AAC/B,YAAM,YAAY,YAAY;AAC1B,YAAI;AACA,gBAAM,cAAc,MAAM,aAAa,QAAQ,UAAU;AACzD,cAAI,aAAa;AACb,0BAAc,WAAW;AAAA,UAC7B;AAAA,QACJ,SAAS,KAAK;AACV,kBAAQ,MAAM,sCAAsC,GAAG;AAAA,QAC3D;AAAA,MACJ;AACA,gBAAU;AAAA,IACd;AAAA,EACJ,GAAG,CAAC,cAAc,YAAY,YAAY,CAAC;AAG3C,QAAM,eAAW,0BAAY,OAAO,aAA4B;AAC5D,kBAAc,QAAQ;AACtB,QAAI,cAAc;AACd,UAAI;AACA,YAAI,UAAU;AACV,gBAAM,aAAa,QAAQ,YAAY,QAAQ;AAAA,QACnD,OAAO;AACH,gBAAM,aAAa,WAAW,UAAU;AAAA,QAC5C;AAAA,MACJ,SAAS,KAAK;AACV,gBAAQ,MAAM,uCAAuC,GAAG;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,QAAM,eAAW,0BAAY,MAAM,OAAO,CAAC,KAAK,CAAC;AAEjD,QAAM,gBAAY,sBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,YAAQ,0BAAY,CAAC,QAAsB,aAAa,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;AAC1F,QAAM,aAAS,0BAAY,CAAC,QAAuB,cAAc,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;AAC7F,QAAM,qBAAiB;AAAA,IACnB,CAAC,QAA+B,sBAAsB,WAAW,GAAG;AAAA,IACpE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,YAAQ,0BAAY,MAAM,aAAa,SAAS,GAAG,CAAC,SAAS,CAAC;AACpE,QAAM,aAAS,0BAAY,MAAM,cAAc,SAAS,GAAG,CAAC,SAAS,CAAC;AAEtE,QAAM,YAAQ,sBAA0B,OAAO;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACzD;AAEO,IAAM,UAAU,MAAwB;AAC3C,QAAM,cAAU,yBAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AAEA,SAAO;AACX;;;AIvJA,IAAAA,gBAMO;;;ACIA,IAAM,sBAAsB,OAAO,WAAsD;AAAA,EAC5F;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB;AAAA,MACtE,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AAEA,UAAM,UAAU,MAAM,SAA0B,QAAQ;AACxD,QAAI,SAAS;AACT,aAAO,WAAW,OAAO;AACzB,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,sBAAsB,OAC/B,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB,EAAE,IAAI;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,EAAE,CAAC;AACjF,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB,EAAE,IAAI;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,EAAE,CAAC;AACjF,CAAC;;;ADDU,IAAAC,sBAAA;AAhCX,IAAM,oBAAgB,6BAA8C,MAAS;AAEtE,IAAM,iBAAiB,CAAC,EAAE,SAAS,SAAS,MAA2B;AAC1E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,mBAAe,2BAAY,MAAM,oBAAoB,SAAS,GAAG,CAAC,SAAS,CAAC;AAClF,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAElG,QAAM,YAAQ,uBAA4B,OAAO;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,cAAc,eAAe,OAAO,cAAc,SAAS,WAAW,OAAO,CAAC;AAEnF,SAAO,6CAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AAC3D;AAEO,IAAM,aAAa,MAA0B;AAChD,QAAM,cAAU,0BAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACtE;AAEA,SAAO;AACX;;;AEzEA,IAAAC,gBAMO;;;ACYP,IAAM,aAAa,CAAC,OAAkB,YAAgC;AAClE,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAChC,QACA,UACqB,oBAAoB,QAAQ,YAAY;AAC7D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,SAAS;AAChB,WAAO,IAAI,WAAW,MAAM,OAAO;AAAA,EACvC;AACA,MAAI,OAAO,MAAM;AACb,WAAO,IAAI,QAAQ,MAAM,IAAI;AAAA,EACjC;AACA,MAAI,OAAO,UAAU;AACjB,WAAO,IAAI,YAAY,MAAM,QAAQ;AAAA,EACzC;AAEA,QAAM,MAAM,OAAO,SAAS,IACtB,GAAG,iBAAiB,iBAAiB,OAAO,SAAS,CAAC,KACtD,GAAG,iBAAiB;AAE1B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAC9B,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAoB,QAAQ;AAClD,MAAI,SAAS;AACT,WAAO,YAAY,OAAO;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,OAC0B,oBAAoB,QAAQ,YAAY;AAClE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,WAAW,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,WAAW,OAAO;AACzB,SAAO,YAAY,CAAC,aAAa,WAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,IAC9D,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,IACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,WAAW,UAAU,OAAO,CAAC;AAC9D,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC1E,SAAO,WAAW,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACxE,CAAC;AAEM,IAAM,wBAAwB,OACjC,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,SAAS;AAAA,IACzE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,gBAAgB,QAAQ;AACnC,CAAC;AAEM,IAAM,2BAA2B,OACpC,QACA,IACA,SACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,OAAO,IAAI;AAE3B,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,SAAS;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IACtC,MAAM;AAAA,EACV,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AACJ,CAAC;;;ADxFU,IAAAC,sBAAA;AApEX,IAAM,qBAAiB,6BAA+C,MAAS;AAExE,IAAM,kBAAkB,CAAC,EAAE,SAAS,SAAS,MAA4B;AAC5E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAyB,IAAI;AAC3D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB;AAAA,IAClB,CAAC,UAAyB,qBAAqB,WAAW,KAAK;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB;AAAA,IAClB,CAAC,QAA8B,qBAAqB,WAAW,GAAG;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,IAAY,QAA8B,qBAAqB,WAAW,IAAI,GAAG;AAAA,IAClF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAClG,QAAM,qBAAiB,2BAAY,CAAC,OAAe,sBAAsB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AACpG,QAAM,wBAAoB;AAAA,IACtB,CAAC,IAAY,SAAe,yBAAyB,WAAW,IAAI,IAAI;AAAA,IACxE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAA6B,OAAO;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC5D;AAEO,IAAM,cAAc,MAA2B;AAClD,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAEA,SAAO;AACX;;;AE7HA,IAAAC,gBAMO;;;ACKP,IAAMC,cAAa,CAAC,OAA4B,YAAoD;AAChG,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAChC,QACA,cAC+B,oBAAoB,QAAQ,YAAY;AACvE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS;AAAA,IAC9C;AAAA,MACI,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,QAAM,UAAU,MAAM,SAA8B,QAAQ;AAC5D,MAAI,SAAS;AACT,WAAO,YAAY,OAAO;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,WACA,QAC6B,oBAAoB,QAAQ,YAAY;AACrE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS;AAAA,IAC9C;AAAA,MACI,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,QAChC,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,QAAM,UAAU,MAAM,SAA4B,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC9D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO;AACX,CAAC;AAEM,IAAM,qBAAqB,OAC9B,QACA,WACA,IACA,QAC6B,oBAAoB,QAAQ,YAAY;AACrE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS,uBAAuB,EAAE;AAAA,IACvE;AAAA,MACI,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,QAChC,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAEA,QAAM,UAAU,MAAM,SAA4B,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AAEA,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,WACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS,uBAAuB,EAAE;AAAA,IACvE;AAAA,MACI,QAAQ;AAAA,MACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC9E,CAAC;;;ADxCU,IAAAC,sBAAA;AAvDX,IAAM,wBAAoB,6BAAkD,MAAS;AAE9E,IAAM,qBAAqB,CAAC,EAAE,SAAS,SAAS,MAA+B;AAClF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA8B,CAAC,CAAC;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB;AAAA,IAClB,CAAC,cAAsB,qBAAqB,WAAW,SAAS;AAAA,IAChE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,WAAmB,QAA8B,qBAAqB,WAAW,WAAW,GAAG;AAAA,IAChG,CAAC,SAAS;AAAA,EACd;AACA,QAAM,kBAAc;AAAA,IAChB,CAAC,WAAmB,IAAY,QAA4B,mBAAmB,WAAW,WAAW,IAAI,GAAG;AAAA,IAC5G,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,WAAmB,OAAe,qBAAqB,WAAW,WAAW,EAAE;AAAA,IAChF,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAgC,OAAO;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,kBAAkB,UAAlB,EAA2B,OAAe,UAAS;AAC/D;AAEO,IAAM,gBAAgB,MAA8B;AACvD,QAAM,cAAU,0BAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC5E;AAEA,SAAO;AACX;;;AEnGA,IAAAC,gBAMO;;;ACMP,IAAMC,cAAa,CAAC,OAAkB,YAAgC;AAClE,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAAO,WAAiD;AAAA,EACxF;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,MAC9D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC9C;AAEA,UAAM,UAAU,MAAM,SAAoB,QAAQ;AAClD,QAAI,SAAS;AACT,aAAO,YAAY,OAAO;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,sBAAsB,OAC/B,QACA,OAC0B,oBAAoB,QAAQ,YAAY;AAClE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,WAAW,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,WAAW,OAAO;AACzB,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,IAC9D,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,2BAA2B,OACpC,QACA,IACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC1E,SAAO,WAAW,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACxE,CAAC;;;ADrDU,IAAAC,sBAAA;AAxDX,IAAM,qBAAiB,6BAA+C,MAAS;AAExE,IAAM,kBAAkB,CAAC,EAAE,SAAS,SAAS,MAA4B;AAC5E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAyB,IAAI;AAC3D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB,2BAAY,MAAM,qBAAqB,SAAS,GAAG,CAAC,SAAS,CAAC;AACpF,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB;AAAA,IAClB,CAAC,QAA8B,qBAAqB,WAAW,GAAG;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,wBAAoB;AAAA,IACtB,CAAC,IAAY,QAAkC,yBAAyB,WAAW,IAAI,GAAG;AAAA,IAC1F,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAElG,QAAM,YAAQ,uBAA6B,OAAO;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC5D;AAEO,IAAM,cAAc,MAA2B;AAClD,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAEA,SAAO;AACX;;;AEvGA,IAAAC,gBAMO;;;ACQP,IAAMC,cAAa,CAAC,OAAsB,YAAwC;AAC9E,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,oBAAoB,OAC7B,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU;AAAA,IACjF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,SAAS,OAAO;AACvB,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,iBAAiB,OAC1B,QACA,WACA,QACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU;AAAA,IACjF,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAChD;AAEA,QAAM,UAAU,MAAM,SAAsB,QAAQ;AACpD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,gCAAgC;AAAA,EACpD;AAEA,SAAO,SAAS,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACpD,SAAO;AACX,CAAC;AAEM,IAAM,kBAAkB,OAC3B,QACA,WACA,QACA,QACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU,MAAM,IAAI;AAAA,IAC3F,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,6BAA6B;AAAA,EACjD;AAEA,QAAM,UAAU,MAAM,SAAsB,QAAQ;AACpD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACrD;AAEA,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,WACA,WACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU,MAAM,IAAI;AAAA,IAC3F,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,SAAS,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;AAC/E,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,gBAAgB,OAAO;AAC9B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,4BAA4B,OACrC,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,kBAAkB;AAAA,IACzF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uCAAuC;AAAA,EAC3D;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,sBAAsB,OAAO;AACpC,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,yBAAyB,OAClC,QACA,cACoC,oBAAoB,QAAQ,YAAY;AAC5E,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,eAAe;AAAA,IACtF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAEA,QAAM,UAAU,MAAM,SAAmC,QAAQ;AACjE,MAAI,SAAS;AACT,WAAO,cAAc,OAAO;AAC5B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;;;AD7DU,IAAAC,sBAAA;AAlFX,IAAM,yBAAqB,6BAAmD,MAAS;AAEhF,IAAM,sBAAsB,CAAC,EAAE,SAAS,SAAS,MAAgC;AACpF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,CAAC,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAwB,CAAC,CAAC;AAClE,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAwB,CAAC,CAAC;AAC9E,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAmC,CAAC,CAAC;AACzE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,iBAAa,2BAAY,CAAC,cAAsB,kBAAkB,WAAW,SAAS,GAAG,CAAC,SAAS,CAAC;AAC1G,QAAM,cAAU;AAAA,IACZ,CAAC,WAAmB,QAAwB,eAAe,WAAW,WAAW,GAAG;AAAA,IACpF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,eAAW;AAAA,IACb,CAAC,WAAmB,QAAgB,QAAyB,gBAAgB,WAAW,WAAW,QAAQ,GAAG;AAAA,IAC9G,CAAC,SAAS;AAAA,EACd;AACA,QAAM,iBAAa;AAAA,IACf,CAAC,WAAmB,WAAmB,kBAAkB,WAAW,WAAW,MAAM;AAAA,IACrF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,cAAsB,oBAAoB,WAAW,SAAS;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,yBAAqB;AAAA,IACvB,CAAC,cAAsB,0BAA0B,WAAW,SAAS;AAAA,IACrE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,sBAAkB;AAAA,IACpB,CAAC,cAAsB,uBAAuB,WAAW,SAAS;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAiC,OAAO;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,mBAAmB,UAAnB,EAA4B,OAAe,UAAS;AAChE;AAEO,IAAM,kBAAkB,MAA+B;AAC1D,QAAM,cAAU,0BAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AAEA,SAAO;AACX;;;AEvIA,IAAAC,gBAMO;;;ACKA,IAAM,sBAAsB,OAC/B,QACA,cAC2B,oBAAoB,QAAQ,YAAY;AACnE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM,SAA0B,QAAQ;AACxD,MAAI,SAAS;AACT,WAAO,WAAW,OAAO;AACzB,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,WACA,QACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,SAAO,WAAW,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACtD,SAAO;AACX,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,WACA,WACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY,MAAM,IAAI;AAAA,IAC7F,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,KAAK,OAAO,MAAM,CAAC;AAC1F,CAAC;;;ADJU,IAAAC,sBAAA;AAzCX,IAAM,2BAAuB,6BAAqD,MAAS;AAEpF,IAAM,wBAAwB,CAAC,EAAE,SAAS,SAAS,MAAkC;AACxF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,mBAAe;AAAA,IACjB,CAAC,cAAsB,oBAAoB,WAAW,SAAS;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,WAAmB,QAA6B,oBAAoB,WAAW,WAAW,GAAG;AAAA,IAC9F,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,WAAmB,WAAmB,oBAAoB,WAAW,WAAW,MAAM;AAAA,IACvF,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAmC,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,OAAO,cAAc,cAAc,SAAS,WAAW,SAAS,YAAY,CAAC;AAElF,SAAO,6CAAC,qBAAqB,UAArB,EAA8B,OAAe,UAAS;AAClE;AAEO,IAAM,oBAAoB,MAAiC;AAC9D,QAAM,cAAU,0BAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACnF;AAEA,SAAO;AACX;;;AEnFA,IAAAC,gBAMO;;;ACMP,IAAMC,cAAa,CAAC,OAAe,YAA0B;AACzD,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,oBAAoB,OAAO,WAA2C;AAAA,EAC/E;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc;AAAA,MAC3D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AAEA,UAAM,UAAU,MAAM,SAAiB,QAAQ;AAC/C,QAAI,SAAS;AACT,aAAO,SAAS,OAAO;AACvB,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,mBAAmB,OAC5B,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,QAAQ,IAAI;AACnB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sBAAsB;AAAA,EAC1C;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAChD;AAEA,SAAO,QAAQ,OAAO;AACtB,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,IACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAEA,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO,QAAQ,OAAO;AACtB,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAEA,SAAO,SAAS,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AACvE,SAAO,QAAQ,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACrE,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,QAAQ;AAAA,IACrE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,gBAAgB,QAAQ;AACnC,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,IACA,SACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,OAAO,IAAI;AAE3B,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,QAAQ;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IACtC,MAAM;AAAA,EACV,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AACJ,CAAC;;;ADxDU,IAAAC,sBAAA;AA3DX,IAAM,kBAAc,6BAA4C,MAAS;AAElE,IAAM,eAAe,CAAC,EAAE,SAAS,SAAS,MAAyB;AACtE,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAsB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,iBAAa,2BAAY,MAAM,kBAAkB,SAAS,GAAG,CAAC,SAAS,CAAC;AAC9E,QAAM,gBAAY,2BAAY,CAAC,OAAe,iBAAiB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC1F,QAAM,iBAAa;AAAA,IACf,CAAC,IAAY,QAA+B,kBAAkB,WAAW,IAAI,GAAG;AAAA,IAChF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,iBAAa,2BAAY,CAAC,OAAe,kBAAkB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC5F,QAAM,iBAAa,2BAAY,CAAC,OAAe,kBAAkB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC5F,QAAM,oBAAgB;AAAA,IAClB,CAAC,IAAY,SAAe,qBAAqB,WAAW,IAAI,IAAI;AAAA,IACpE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAA0B,OAAO;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACzD;AAEO,IAAM,WAAW,MAAwB;AAC5C,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AAEA,SAAO;AACX;","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -85,6 +85,11 @@ type ChangePasswordErrorResponse = {
|
|
|
85
85
|
};
|
|
86
86
|
type ChangePasswordResponse = EmptyResponse | ChangePasswordErrorResponse;
|
|
87
87
|
type GetMeResponse = User;
|
|
88
|
+
type TokenStorage = {
|
|
89
|
+
getItem: (key: string) => Promise<string | null> | string | null;
|
|
90
|
+
setItem: (key: string, value: string) => Promise<void> | void;
|
|
91
|
+
removeItem: (key: string) => Promise<void> | void;
|
|
92
|
+
};
|
|
88
93
|
|
|
89
94
|
type ProductListResponse = Product[];
|
|
90
95
|
type ProductResponse = Product | EmptyResponse;
|
|
@@ -190,8 +195,10 @@ type AuthProviderProps = {
|
|
|
190
195
|
baseUrl: string;
|
|
191
196
|
children: React.ReactNode;
|
|
192
197
|
initialToken?: string | null;
|
|
198
|
+
tokenStorage?: TokenStorage;
|
|
199
|
+
storageKey?: string;
|
|
193
200
|
};
|
|
194
|
-
declare const AuthProvider: ({ baseUrl, children, initialToken }: AuthProviderProps) => react_jsx_runtime.JSX.Element;
|
|
201
|
+
declare const AuthProvider: ({ baseUrl, children, initialToken, tokenStorage, storageKey }: AuthProviderProps) => react_jsx_runtime.JSX.Element;
|
|
195
202
|
declare const useAuth: () => AuthContextValue;
|
|
196
203
|
|
|
197
204
|
declare const normalizeBaseUrl: (baseUrl: string) => string;
|
|
@@ -336,4 +343,4 @@ type UserProviderProps = {
|
|
|
336
343
|
declare const UserProvider: ({ baseUrl, children }: UserProviderProps) => react_jsx_runtime.JSX.Element;
|
|
337
344
|
declare const useUsers: () => UserContextValue;
|
|
338
345
|
|
|
339
|
-
export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
|
|
346
|
+
export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type TokenStorage, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
|
package/dist/index.d.ts
CHANGED
|
@@ -85,6 +85,11 @@ type ChangePasswordErrorResponse = {
|
|
|
85
85
|
};
|
|
86
86
|
type ChangePasswordResponse = EmptyResponse | ChangePasswordErrorResponse;
|
|
87
87
|
type GetMeResponse = User;
|
|
88
|
+
type TokenStorage = {
|
|
89
|
+
getItem: (key: string) => Promise<string | null> | string | null;
|
|
90
|
+
setItem: (key: string, value: string) => Promise<void> | void;
|
|
91
|
+
removeItem: (key: string) => Promise<void> | void;
|
|
92
|
+
};
|
|
88
93
|
|
|
89
94
|
type ProductListResponse = Product[];
|
|
90
95
|
type ProductResponse = Product | EmptyResponse;
|
|
@@ -190,8 +195,10 @@ type AuthProviderProps = {
|
|
|
190
195
|
baseUrl: string;
|
|
191
196
|
children: React.ReactNode;
|
|
192
197
|
initialToken?: string | null;
|
|
198
|
+
tokenStorage?: TokenStorage;
|
|
199
|
+
storageKey?: string;
|
|
193
200
|
};
|
|
194
|
-
declare const AuthProvider: ({ baseUrl, children, initialToken }: AuthProviderProps) => react_jsx_runtime.JSX.Element;
|
|
201
|
+
declare const AuthProvider: ({ baseUrl, children, initialToken, tokenStorage, storageKey }: AuthProviderProps) => react_jsx_runtime.JSX.Element;
|
|
195
202
|
declare const useAuth: () => AuthContextValue;
|
|
196
203
|
|
|
197
204
|
declare const normalizeBaseUrl: (baseUrl: string) => string;
|
|
@@ -336,4 +343,4 @@ type UserProviderProps = {
|
|
|
336
343
|
declare const UserProvider: ({ baseUrl, children }: UserProviderProps) => react_jsx_runtime.JSX.Element;
|
|
337
344
|
declare const useUsers: () => UserContextValue;
|
|
338
345
|
|
|
339
|
-
export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
|
|
346
|
+
export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type TokenStorage, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
|