shelflife-react-hooks 1.0.11 → 1.0.13
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 +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/context/AuthContext.tsx +1 -1
- package/src/context/ProductContext.tsx +2 -2
- package/src/context/StorageContext.tsx +2 -2
- package/src/context/api/productApi.ts +6 -21
- package/src/context/api/storageApi.ts +12 -3
- package/src/index.ts +4 -1
- package/src/type/requests.ts +2 -0
package/dist/index.cjs.js
CHANGED
|
@@ -309,7 +309,7 @@ var AuthProvider = ({
|
|
|
309
309
|
}) => {
|
|
310
310
|
const [token, setTokenState] = (0, import_react.useState)(initialToken);
|
|
311
311
|
const [user, setUser] = (0, import_react.useState)(null);
|
|
312
|
-
const [isLoading, setIsLoading] = (0, import_react.useState)(
|
|
312
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
313
313
|
const [isError, setIsError] = (0, import_react.useState)(false);
|
|
314
314
|
const [error, setError] = (0, import_react.useState)(null);
|
|
315
315
|
(0, import_react.useEffect)(() => {
|
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/api/userApi.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/ShoppingListContext.tsx","../src/context/api/shoppingListApi.ts","../src/context/ToPurchaseContext.tsx","../src/context/api/toPurchaseApi.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';\nexport * from './context/ShoppingListContext.js';\nexport * from './context/ToPurchaseContext.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';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { updateUserRequest } from './api/userApi.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 changeMe: (dto: ChangeUserDataRequest) => 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 changeMe = useCallback(\n (dto: ChangeUserDataRequest) => updateUserRequest({ ...apiConfig, setUsers: () => { }, setUser }, user!.id, dto),\n [apiConfig, user]\n )\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 changeMe,\n changePassword,\n getMe,\n logout,\n getToken\n }), [\n changeMe,\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: any | 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 handlers.setIsError(true);\n handlers.setError(err);\n throw err;\n } finally {\n handlers.setIsLoading(false);\n }\n};\n","import type {\n ChangePasswordErrorResponse,\n ChangePasswordRequest,\n LoginErrorResponse,\n LoginRequest,\n LoginResponse,\n SignupError,\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<LoginErrorResponse>(response);\n\n if (error?.error)\n throw error;\n\n throw new 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<SignupError>(response);\n\n if (error?.email || error?.password || error?.passwordRepeat || error?.username )\n throw error;\n\n throw new 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 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<ChangePasswordErrorResponse>(response);\n\n if (error?.oldPassword || error?.newPassword || error?.newPasswordRepeat)\n throw error;\n\n throw new 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 type { User } from '../../type/models.js';\nimport type { ChangeUserDataRequest } from '../../type/requests.js';\nimport type { UpdateUserError } from '../../type/user.js';\nimport { buildAuthHeaders, normalizeBaseUrl, 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 const update = await readJson<UpdateUserError>(response);\n\n if (update?.email || update?.username)\n throw update;\n\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<Blob> => 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 response.blob();\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","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 { ProductCreateError } from '../../type/product.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 const err = await readJson<ProductCreateError>(response);\n\n if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)\n throw err;\n\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 const err = await readJson<ProductCreateError>(response);\n\n if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)\n throw err;\n\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 type { CreateRunningLowSettingError, EditRunningLowSettingError } from '../../type/runninglow.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 const err = await readJson<CreateRunningLowSettingError>(response);\n\n if (err?.productId || err?.runningLow)\n throw err;\n\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 const err = await readJson<EditRunningLowSettingError>(response);\n\n if (err?.runningLow)\n throw err;\n\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 type { CreateStorageError } from '../../type/storage.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 const payload = await readJson<CreateStorageError>(response);\n if (payload?.name)\n throw payload;\n\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 const payload = await readJson<CreateStorageError>(response);\n if (payload?.name)\n throw payload;\n \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 { AddItemError, EditItemError } from '../../type/item.js';\nimport 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 const err = await readJson<AddItemError>(response);\n\n if (err?.productId || err?.expiresAt)\n throw err;\n\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 const err = await readJson<EditItemError>(response);\n\n if (err?.expiresAt)\n throw err;\n\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 { InviteMemberError } from '../../type/member.js';\nimport 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 const err = await readJson<InviteMemberError>(response);\n\n if(err?.email)\n throw err;\n\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<Blob>;\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 React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ShoppingListItem } from '../type/models.js';\nimport type { CreateShoppingItemRequest, EditShoppingItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchShoppingListRequest,\n createShoppingItemRequest,\n editShoppingItemRequest,\n deleteShoppingItemRequest\n} from './api/shoppingListApi.js';\n\ntype ShoppingListContextValue = {\n items: ShoppingListItem[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<ShoppingListItem[]>;\n createItem: (storageId: number, dto: CreateShoppingItemRequest) => Promise<ShoppingListItem>;\n editItem: (storageId: number, itemId: number, dto: EditShoppingItemRequest) => Promise<ShoppingListItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n};\n\ntype ShoppingListProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ShoppingListContext = createContext<ShoppingListContextValue | undefined>(undefined);\n\nexport const ShoppingListProvider = ({ baseUrl, children }: ShoppingListProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<ShoppingListItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = { baseUrl, token, setItems, setIsLoading, setIsError, setError };\n\n const fetchItems = useCallback(async (storageId: number) => {\n return fetchShoppingListRequest(apiConfig, storageId);\n }, [apiConfig]);\n\n const createItem = useCallback(async (storageId: number, dto: CreateShoppingItemRequest) => {\n return createShoppingItemRequest(apiConfig, storageId, dto);\n }, [apiConfig]);\n\n const editItem = useCallback(async (storageId: number, itemId: number, dto: EditShoppingItemRequest) => {\n return editShoppingItemRequest(apiConfig, storageId, itemId, dto);\n }, [apiConfig]);\n\n const deleteItem = useCallback(async (storageId: number, itemId: number) => {\n return deleteShoppingItemRequest(apiConfig, storageId, itemId);\n }, [apiConfig]);\n\n const value = useMemo(() => ({ items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem }), [items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem]);\n\n return <ShoppingListContext.Provider value={value}>{children}</ShoppingListContext.Provider>;\n};\n\nexport const useShoppingList = (): ShoppingListContextValue => {\n const context = useContext(ShoppingListContext);\n if (!context) throw new Error('useShoppingList must be used within a ShoppingListProvider');\n return context;\n};\n","import type { ShoppingListItem } from '../../type/models.js';\nimport type { CreateShoppingItemRequest, EditShoppingItemRequest } from '../../type/requests.js';\nimport type { CreateShoppingItemError, EditShoppingItemError } from '../../type/shoppingList.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ShoppingListApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: ShoppingListItem[] | ((items: ShoppingListItem[]) => ShoppingListItem[])) => void;\n};\n\nconst updateById = (items: ShoppingListItem[], updated: ShoppingListItem): ShoppingListItem[] => {\n const index = items.findIndex((i) => i.id === updated.id);\n if (index === -1) return [updated, ...items];\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchShoppingListRequest = async (\n config: ShoppingListApiConfig,\n storageId: number\n): Promise<ShoppingListItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch shopping list items');\n }\n\n const payload = await readJson<ShoppingListItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createShoppingItemRequest = async (\n config: ShoppingListApiConfig,\n storageId: number,\n dto: CreateShoppingItemRequest\n): Promise<ShoppingListItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {\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 err = await readJson<CreateShoppingItemError>(response);\n\n if (err?.productId || err?.amountToBuy)\n throw err;\n\n throw new Error('Failed to create shopping list item');\n }\n\n const payload = await readJson<ShoppingListItem>(response);\n if (!payload) throw new Error('Create shopping item response missing data');\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editShoppingItemRequest = async (\n config: ShoppingListApiConfig,\n storageId: number,\n itemId: number,\n dto: EditShoppingItemRequest\n): Promise<ShoppingListItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist/${itemId}`, {\n method: 'PUT',\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 err = await readJson<EditShoppingItemError>(response);\n\n if (err?.productId || err?.amountToBuy)\n throw err;\n \n throw new Error('Failed to edit shopping list item');\n }\n\n const payload = await readJson<ShoppingListItem>(response);\n if (!payload) throw new Error('Edit shopping item response missing data');\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteShoppingItemRequest = async (\n config: ShoppingListApiConfig,\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}/shoppinglist/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete shopping list item');\n }\n\n config.setItems((previous) => previous.filter((i) => i.id !== itemId));\n});\n","import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ToPurchaseItem } from '../type/models.js';\nimport { useAuth } from './AuthContext.js';\nimport { fetchAggregatedShoppingRequest } from './api/toPurchaseApi.js';\n\ntype ToPurchaseContextValue = {\n items: ToPurchaseItem[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchAggregated: () => Promise<ToPurchaseItem[]>;\n};\n\ntype ToPurchaseProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ToPurchaseContext = createContext<ToPurchaseContextValue | undefined>(undefined);\n\nexport const ToPurchaseProvider = ({ baseUrl, children }: ToPurchaseProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<ToPurchaseItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = { baseUrl, token, setToPurchase: setItems, setIsLoading, setIsError, setError };\n\n const fetchAggregated = useCallback(async () => {\n return fetchAggregatedShoppingRequest(apiConfig);\n }, [apiConfig]);\n\n const value = useMemo(() => ({ items, isLoading, isError, error, fetchAggregated }), [items, isLoading, isError, error, fetchAggregated]);\n\n return <ToPurchaseContext.Provider value={value}>{children}</ToPurchaseContext.Provider>;\n};\n\nexport const useToPurchase = (): ToPurchaseContextValue => {\n const context = useContext(ToPurchaseContext);\n if (!context) throw new Error('useToPurchase must be used within a ToPurchaseProvider');\n return context;\n};\n","import type { ToPurchaseItem } from '../../type/models.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ToPurchaseApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setToPurchase: (value: ToPurchaseItem[] | ((items: ToPurchaseItem[]) => ToPurchaseItem[])) => void;\n};\n\nexport const fetchAggregatedShoppingRequest = async (\n config: ToPurchaseApiConfig\n): Promise<ToPurchaseItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/tobuy/shopping`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch aggregated shopping list');\n }\n\n const payload = await readJson<ToPurchaseItem[]>(response);\n if (payload) {\n config.setToPurchase(payload);\n return payload;\n }\n\n return [];\n});\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","payload","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","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/api/userApi.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/ShoppingListContext.tsx","../src/context/api/shoppingListApi.ts","../src/context/ToPurchaseContext.tsx","../src/context/api/toPurchaseApi.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';\nexport * from './context/ShoppingListContext.js';\nexport * from './context/ToPurchaseContext.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';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { updateUserRequest } from './api/userApi.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 changeMe: (dto: ChangeUserDataRequest) => 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(true);\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 changeMe = useCallback(\n (dto: ChangeUserDataRequest) => updateUserRequest({ ...apiConfig, setUsers: () => { }, setUser }, user!.id, dto),\n [apiConfig, user]\n )\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 changeMe,\n changePassword,\n getMe,\n logout,\n getToken\n }), [\n changeMe,\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: any | 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 handlers.setIsError(true);\n handlers.setError(err);\n throw err;\n } finally {\n handlers.setIsLoading(false);\n }\n};\n","import type {\n ChangePasswordErrorResponse,\n ChangePasswordRequest,\n LoginErrorResponse,\n LoginRequest,\n LoginResponse,\n SignupError,\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<LoginErrorResponse>(response);\n\n if (error?.error)\n throw error;\n\n throw new 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<SignupError>(response);\n\n if (error?.email || error?.password || error?.passwordRepeat || error?.username )\n throw error;\n\n throw new 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 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<ChangePasswordErrorResponse>(response);\n\n if (error?.oldPassword || error?.newPassword || error?.newPasswordRepeat)\n throw error;\n\n throw new 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 type { User } from '../../type/models.js';\nimport type { ChangeUserDataRequest } from '../../type/requests.js';\nimport type { UpdateUserError } from '../../type/user.js';\nimport { buildAuthHeaders, normalizeBaseUrl, 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 const update = await readJson<UpdateUserError>(response);\n\n if (update?.email || update?.username)\n throw update;\n\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<Blob> => 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 response.blob();\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","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 { ProductCreateError } from '../../type/product.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 const err = await readJson<ProductCreateError>(response);\n\n if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)\n throw err;\n\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 const err = await readJson<ProductCreateError>(response);\n\n if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)\n throw err;\n\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 type { CreateRunningLowSettingError, EditRunningLowSettingError } from '../../type/runninglow.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 const err = await readJson<CreateRunningLowSettingError>(response);\n\n if (err?.productId || err?.runningLow)\n throw err;\n\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 const err = await readJson<EditRunningLowSettingError>(response);\n\n if (err?.runningLow)\n throw err;\n\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 type { CreateStorageError } from '../../type/storage.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 const payload = await readJson<CreateStorageError>(response);\n if (payload?.name)\n throw payload;\n\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 const payload = await readJson<CreateStorageError>(response);\n if (payload?.name)\n throw payload;\n \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 { AddItemError, EditItemError } from '../../type/item.js';\nimport 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 const err = await readJson<AddItemError>(response);\n\n if (err?.productId || err?.expiresAt)\n throw err;\n\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 const err = await readJson<EditItemError>(response);\n\n if (err?.expiresAt)\n throw err;\n\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 { InviteMemberError } from '../../type/member.js';\nimport 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 const err = await readJson<InviteMemberError>(response);\n\n if(err?.email)\n throw err;\n\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<Blob>;\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 React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ShoppingListItem } from '../type/models.js';\nimport type { CreateShoppingItemRequest, EditShoppingItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchShoppingListRequest,\n createShoppingItemRequest,\n editShoppingItemRequest,\n deleteShoppingItemRequest\n} from './api/shoppingListApi.js';\n\ntype ShoppingListContextValue = {\n items: ShoppingListItem[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<ShoppingListItem[]>;\n createItem: (storageId: number, dto: CreateShoppingItemRequest) => Promise<ShoppingListItem>;\n editItem: (storageId: number, itemId: number, dto: EditShoppingItemRequest) => Promise<ShoppingListItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n};\n\ntype ShoppingListProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ShoppingListContext = createContext<ShoppingListContextValue | undefined>(undefined);\n\nexport const ShoppingListProvider = ({ baseUrl, children }: ShoppingListProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<ShoppingListItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = { baseUrl, token, setItems, setIsLoading, setIsError, setError };\n\n const fetchItems = useCallback(async (storageId: number) => {\n return fetchShoppingListRequest(apiConfig, storageId);\n }, [apiConfig]);\n\n const createItem = useCallback(async (storageId: number, dto: CreateShoppingItemRequest) => {\n return createShoppingItemRequest(apiConfig, storageId, dto);\n }, [apiConfig]);\n\n const editItem = useCallback(async (storageId: number, itemId: number, dto: EditShoppingItemRequest) => {\n return editShoppingItemRequest(apiConfig, storageId, itemId, dto);\n }, [apiConfig]);\n\n const deleteItem = useCallback(async (storageId: number, itemId: number) => {\n return deleteShoppingItemRequest(apiConfig, storageId, itemId);\n }, [apiConfig]);\n\n const value = useMemo(() => ({ items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem }), [items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem]);\n\n return <ShoppingListContext.Provider value={value}>{children}</ShoppingListContext.Provider>;\n};\n\nexport const useShoppingList = (): ShoppingListContextValue => {\n const context = useContext(ShoppingListContext);\n if (!context) throw new Error('useShoppingList must be used within a ShoppingListProvider');\n return context;\n};\n","import type { ShoppingListItem } from '../../type/models.js';\nimport type { CreateShoppingItemRequest, EditShoppingItemRequest } from '../../type/requests.js';\nimport type { CreateShoppingItemError, EditShoppingItemError } from '../../type/shoppingList.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ShoppingListApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: ShoppingListItem[] | ((items: ShoppingListItem[]) => ShoppingListItem[])) => void;\n};\n\nconst updateById = (items: ShoppingListItem[], updated: ShoppingListItem): ShoppingListItem[] => {\n const index = items.findIndex((i) => i.id === updated.id);\n if (index === -1) return [updated, ...items];\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchShoppingListRequest = async (\n config: ShoppingListApiConfig,\n storageId: number\n): Promise<ShoppingListItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch shopping list items');\n }\n\n const payload = await readJson<ShoppingListItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createShoppingItemRequest = async (\n config: ShoppingListApiConfig,\n storageId: number,\n dto: CreateShoppingItemRequest\n): Promise<ShoppingListItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {\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 err = await readJson<CreateShoppingItemError>(response);\n\n if (err?.productId || err?.amountToBuy)\n throw err;\n\n throw new Error('Failed to create shopping list item');\n }\n\n const payload = await readJson<ShoppingListItem>(response);\n if (!payload) throw new Error('Create shopping item response missing data');\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editShoppingItemRequest = async (\n config: ShoppingListApiConfig,\n storageId: number,\n itemId: number,\n dto: EditShoppingItemRequest\n): Promise<ShoppingListItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist/${itemId}`, {\n method: 'PUT',\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 err = await readJson<EditShoppingItemError>(response);\n\n if (err?.productId || err?.amountToBuy)\n throw err;\n \n throw new Error('Failed to edit shopping list item');\n }\n\n const payload = await readJson<ShoppingListItem>(response);\n if (!payload) throw new Error('Edit shopping item response missing data');\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteShoppingItemRequest = async (\n config: ShoppingListApiConfig,\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}/shoppinglist/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete shopping list item');\n }\n\n config.setItems((previous) => previous.filter((i) => i.id !== itemId));\n});\n","import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ToPurchaseItem } from '../type/models.js';\nimport { useAuth } from './AuthContext.js';\nimport { fetchAggregatedShoppingRequest } from './api/toPurchaseApi.js';\n\ntype ToPurchaseContextValue = {\n items: ToPurchaseItem[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchAggregated: () => Promise<ToPurchaseItem[]>;\n};\n\ntype ToPurchaseProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ToPurchaseContext = createContext<ToPurchaseContextValue | undefined>(undefined);\n\nexport const ToPurchaseProvider = ({ baseUrl, children }: ToPurchaseProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<ToPurchaseItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = { baseUrl, token, setToPurchase: setItems, setIsLoading, setIsError, setError };\n\n const fetchAggregated = useCallback(async () => {\n return fetchAggregatedShoppingRequest(apiConfig);\n }, [apiConfig]);\n\n const value = useMemo(() => ({ items, isLoading, isError, error, fetchAggregated }), [items, isLoading, isError, error, fetchAggregated]);\n\n return <ToPurchaseContext.Provider value={value}>{children}</ToPurchaseContext.Provider>;\n};\n\nexport const useToPurchase = (): ToPurchaseContextValue => {\n const context = useContext(ToPurchaseContext);\n if (!context) throw new Error('useToPurchase must be used within a ToPurchaseProvider');\n return context;\n};\n","import type { ToPurchaseItem } from '../../type/models.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ToPurchaseApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setToPurchase: (value: ToPurchaseItem[] | ((items: ToPurchaseItem[]) => ToPurchaseItem[])) => void;\n};\n\nexport const fetchAggregatedShoppingRequest = async (\n config: ToPurchaseApiConfig\n): Promise<ToPurchaseItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/tobuy/shopping`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch aggregated shopping list');\n }\n\n const payload = await readJson<ToPurchaseItem[]>(response);\n if (payload) {\n config.setToPurchase(payload);\n return payload;\n }\n\n return [];\n});\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","payload","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
package/dist/index.esm.js
CHANGED
|
@@ -267,7 +267,7 @@ var AuthProvider = ({
|
|
|
267
267
|
}) => {
|
|
268
268
|
const [token, setTokenState] = useState(initialToken);
|
|
269
269
|
const [user, setUser] = useState(null);
|
|
270
|
-
const [isLoading, setIsLoading] = useState(
|
|
270
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
271
271
|
const [isError, setIsError] = useState(false);
|
|
272
272
|
const [error, setError] = useState(null);
|
|
273
273
|
useEffect(() => {
|