shelflife-react-hooks 1.0.6 → 1.0.8

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 CHANGED
@@ -146,7 +146,7 @@ var changePasswordRequest = async (config, dto) => runWithRequestState(config, a
146
146
  });
147
147
  if (!response.ok) {
148
148
  const error = await readJson(response);
149
- if (error?.oldPassword || error?.newPasswordRepeat)
149
+ if (error?.oldPassword || error?.newPassword || error?.newPasswordRepeat)
150
150
  throw error;
151
151
  throw new Error("Change password failed");
152
152
  }
@@ -245,6 +245,9 @@ var updateUserRequest = async (config, id, dto) => runWithRequestState(config, a
245
245
  body: JSON.stringify(dto)
246
246
  });
247
247
  if (!response.ok) {
248
+ const update = await readJson(response);
249
+ if (update?.email || update?.username)
250
+ throw update;
248
251
  throw new Error("Failed to update user");
249
252
  }
250
253
  const payload = await readJson(response);
@@ -549,6 +552,9 @@ var createProductRequest = async (config, dto) => runWithRequestState(config, as
549
552
  body: JSON.stringify(dto)
550
553
  });
551
554
  if (!response.ok) {
555
+ const err = await readJson(response);
556
+ if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)
557
+ throw err;
552
558
  throw new Error("Failed to create product");
553
559
  }
554
560
  const payload = await readJson(response);
@@ -570,6 +576,9 @@ var updateProductRequest = async (config, id, dto) => runWithRequestState(config
570
576
  body: JSON.stringify(dto)
571
577
  });
572
578
  if (!response.ok) {
579
+ const err = await readJson(response);
580
+ if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)
581
+ throw err;
573
582
  throw new Error("Failed to update product");
574
583
  }
575
584
  const payload = await readJson(response);
@@ -736,6 +745,9 @@ var createSettingRequest = async (config, storageId, dto) => runWithRequestState
736
745
  }
737
746
  );
738
747
  if (!response.ok) {
748
+ const err = await readJson(response);
749
+ if (err?.productId || err?.runningLow)
750
+ throw err;
739
751
  throw new Error("Failed to create running low setting");
740
752
  }
741
753
  const payload = await readJson(response);
@@ -759,6 +771,9 @@ var editSettingRequest = async (config, storageId, id, dto) => runWithRequestSta
759
771
  }
760
772
  );
761
773
  if (!response.ok) {
774
+ const err = await readJson(response);
775
+ if (err?.runningLow)
776
+ throw err;
762
777
  throw new Error("Failed to edit running low setting");
763
778
  }
764
779
  const payload = await readJson(response);
@@ -907,6 +922,9 @@ var createStorageRequest = async (config, dto) => runWithRequestState(config, as
907
922
  body: JSON.stringify(dto)
908
923
  });
909
924
  if (!response.ok) {
925
+ const payload2 = await readJson(response);
926
+ if (payload2?.name)
927
+ throw payload2;
910
928
  throw new Error("Failed to create storage");
911
929
  }
912
930
  const payload = await readJson(response);
@@ -928,6 +946,9 @@ var changeStorageNameRequest = async (config, id, dto) => runWithRequestState(co
928
946
  body: JSON.stringify(dto)
929
947
  });
930
948
  if (!response.ok) {
949
+ const payload2 = await readJson(response);
950
+ if (payload2?.name)
951
+ throw payload2;
931
952
  throw new Error("Failed to update storage");
932
953
  }
933
954
  const payload = await readJson(response);
@@ -1053,6 +1074,9 @@ var addItemRequest = async (config, storageId, dto) => runWithRequestState(confi
1053
1074
  body: JSON.stringify(dto)
1054
1075
  });
1055
1076
  if (!response.ok) {
1077
+ const err = await readJson(response);
1078
+ if (err?.productId || err?.expiresAt)
1079
+ throw err;
1056
1080
  throw new Error("Failed to add storage item");
1057
1081
  }
1058
1082
  const payload = await readJson(response);
@@ -1073,6 +1097,9 @@ var editItemRequest = async (config, storageId, itemId, dto) => runWithRequestSt
1073
1097
  body: JSON.stringify(dto)
1074
1098
  });
1075
1099
  if (!response.ok) {
1100
+ const err = await readJson(response);
1101
+ if (err?.expiresAt)
1102
+ throw err;
1076
1103
  throw new Error("Failed to edit storage item");
1077
1104
  }
1078
1105
  const payload = await readJson(response);
@@ -1258,6 +1285,9 @@ var inviteMemberRequest = async (config, storageId, dto) => runWithRequestState(
1258
1285
  body: JSON.stringify(dto)
1259
1286
  });
1260
1287
  if (!response.ok) {
1288
+ const err = await readJson(response);
1289
+ if (err?.email)
1290
+ throw err;
1261
1291
  throw new Error("Failed to invite member");
1262
1292
  }
1263
1293
  const payload = await readJson(response);
@@ -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"],"sourcesContent":["export * from './type/auth.js';\nexport * from './type/base.js';\nexport * from './type/models.js';\nexport * from './type/product.js';\nexport * from './type/runninglow.js';\nexport * from './type/requests.js';\nexport * from './type/storage.js';\nexport * from './type/user.js';\nexport * from './context/AuthContext.js';\nexport * from './context/http.js';\nexport * from './context/InviteContext.js';\nexport * from './context/ProductContext.js';\nexport * from './context/RunningLowContext.js';\nexport * from './context/StorageContext.js';\nexport * from './context/StorageItemContext.js';\nexport * from './context/StorageMemberContext.js';\nexport * from './context/UserContext.js';","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from 'react';\n\nimport type {\n ChangePasswordRequest,\n LoginRequest,\n SignupRequest,\n TokenStorage,\n User\n} from '../type/auth.js';\nimport {\n changePasswordRequest,\n getMeRequest,\n loginRequest,\n logoutRequest,\n signupRequest\n} from './api/authApi.js';\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 config.setUser(payload);\n return payload;\n});\n\nexport const changePasswordRequest = async (\n config: AuthApiConfig,\n dto: ChangePasswordRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/password/change`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ChangePasswordErrorResponse>(response);\n\n if (error?.oldPassword || 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 { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype UserApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setUsers: (value: User[] | ((items: User[]) => User[])) => void;\n setUser: (value: User | null | ((prev: User | null) => User | null)) => void;\n};\n\nconst updateById = (items: User[], updated: User): User[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchUsersRequest = async (config: UserApiConfig): Promise<User[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch users');\n }\n\n const payload = await readJson<User[]>(response);\n if (payload) {\n config.setUsers(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<User | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setUser(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('User response missing data');\n }\n\n config.setUser(payload);\n config.setUsers((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const updateUserRequest = async (\n config: UserApiConfig,\n id: number,\n dto: ChangeUserDataRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Update user response missing data');\n }\n\n config.setUsers((previous) => updateById(previous, payload));\n config.setUser(payload);\n return payload;\n});\n\nexport const deleteUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete user');\n }\n\n config.setUsers((previous) => previous.filter((item) => item.id !== id));\n config.setUser((current) => (current?.id === id ? null : current));\n});\n\nexport const getUserPfpRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<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 { CreateProductRequest, UpdateProductRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setProducts: (value: Product[] | ((items: Product[]) => Product[])) => void;\n setProduct: (value: Product | null | ((prev: Product | null) => Product | null)) => void;\n};\n\nconst updateById = (items: Product[], updated: Product): Product[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchProductsRequest = async (\n config: ProductApiConfig,\n query?: ProductQuery\n): Promise<Product[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const params = new URLSearchParams();\n if (query?.barcode) {\n params.set('barcode', query.barcode);\n }\n if (query?.name) {\n params.set('name', query.name);\n }\n if (query?.category) {\n params.set('category', query.category);\n }\n\n const url = params.toString()\n ? `${normalizedBaseUrl}/api/products?${params.toString()}`\n : `${normalizedBaseUrl}/api/products`;\n\n const response = await fetch(url, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch products');\n }\n\n const payload = await readJson<Product[]>(response);\n if (payload) {\n config.setProducts(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<Product | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setProduct(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Product response missing data');\n }\n\n config.setProduct(payload);\n config.setProducts((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createProductRequest = async (\n config: ProductApiConfig,\n dto: CreateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Create product response missing data');\n }\n\n config.setProducts((previous) => [payload, ...previous]);\n config.setProduct(payload);\n return payload;\n});\n\nexport const updateProductRequest = async (\n config: ProductApiConfig,\n id: number,\n dto: UpdateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Update product response missing data');\n }\n\n config.setProducts((previous) => updateById(previous, payload));\n config.setProduct(payload);\n return payload;\n});\n\nexport const deleteProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete product');\n }\n\n config.setProducts((previous) => previous.filter((item) => item.id !== id));\n config.setProduct((current) => (current?.id === id ? null : current));\n});\n\nexport const getProductIconRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch product icon');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadProductIconRequest = async (\n config: ProductApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload product icon');\n }\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowSetting } from '../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createSettingRequest,\n deleteSettingRequest,\n editSettingRequest,\n fetchSettingsRequest\n} from './api/runningLowApi.js';\n\ntype RunningLowContextValue = {\n settings: RunningLowSetting[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchSettings: (storageId: number) => Promise<RunningLowSetting[]>;\n createSetting: (storageId: number, dto: CreateSettingRequest) => Promise<RunningLowSetting>;\n editSetting: (storageId: number, id: number, dto: EditSettingRequest) => Promise<RunningLowSetting>;\n deleteSetting: (storageId: number, id: number) => Promise<void>;\n};\n\ntype RunningLowProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst RunningLowContext = createContext<RunningLowContextValue | undefined>(undefined);\n\nexport const RunningLowProvider = ({ baseUrl, children }: RunningLowProviderProps) => {\n const { token } = useAuth();\n const [settings, setSettings] = useState<RunningLowSetting[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setSettings,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchSettings = useCallback(\n (storageId: number) => fetchSettingsRequest(apiConfig, storageId),\n [apiConfig]\n );\n const createSetting = useCallback(\n (storageId: number, dto: CreateSettingRequest) => createSettingRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editSetting = useCallback(\n (storageId: number, id: number, dto: EditSettingRequest) => editSettingRequest(apiConfig, storageId, id, dto),\n [apiConfig]\n );\n const deleteSetting = useCallback(\n (storageId: number, id: number) => deleteSettingRequest(apiConfig, storageId, id),\n [apiConfig]\n );\n\n const value = useMemo<RunningLowContextValue>(() => ({\n settings,\n isLoading,\n isError,\n error,\n fetchSettings,\n createSetting,\n editSetting,\n deleteSetting\n }), [\n createSetting,\n deleteSetting,\n editSetting,\n error,\n fetchSettings,\n isError,\n isLoading,\n settings\n ]);\n\n return <RunningLowContext.Provider value={value}>{children}</RunningLowContext.Provider>;\n};\n\nexport const useRunningLow = (): RunningLowContextValue => {\n const context = useContext(RunningLowContext);\n if (!context) {\n throw new Error('useRunningLow must be used within a RunningLowProvider');\n }\n\n return context;\n};\n","import type { RunningLowSetting } from '../../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype RunningLowApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setSettings: (value: RunningLowSetting[] | ((items: RunningLowSetting[]) => RunningLowSetting[])) => void;\n};\n\nconst updateById = (items: RunningLowSetting[], updated: RunningLowSetting): RunningLowSetting[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchSettingsRequest = async (\n config: RunningLowApiConfig,\n storageId: number\n): Promise<RunningLowSetting[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low settings');\n }\n\n const payload = await readJson<RunningLowSetting[]>(response);\n if (payload) {\n config.setSettings(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n dto: CreateSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to create running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Create running low response missing data');\n }\n\n config.setSettings((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number,\n dto: EditSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'PUT',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to edit running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Edit running low response missing data');\n }\n\n config.setSettings((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to delete running low setting');\n }\n\n config.setSettings((previous) => previous.filter((item) => item.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Storage } from '../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n changeStorageNameRequest,\n createStorageRequest,\n deleteStorageRequest,\n fetchStorageRequest,\n fetchStoragesRequest\n} from './api/storageApi.js';\n\ntype StorageContextValue = {\n storages: Storage[];\n storage: Storage | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchStorages: () => Promise<Storage[]>;\n fetchStorage: (id: number) => Promise<Storage | null>;\n createStorage: (dto: CreateStorageRequest) => Promise<Storage>;\n changeStorageName: (id: number, dto: ChangeStorageNameRequest) => Promise<Storage>;\n deleteStorage: (id: number) => Promise<void>;\n};\n\ntype StorageProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageContext = createContext<StorageContextValue | undefined>(undefined);\n\nexport const StorageProvider = ({ baseUrl, children }: StorageProviderProps) => {\n const { token } = useAuth();\n const [storages, setStorages] = useState<Storage[]>([]);\n const [storage, setStorage] = useState<Storage | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setStorages,\n setStorage,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchStorages = useCallback(() => fetchStoragesRequest(apiConfig), [apiConfig]);\n const fetchStorage = useCallback((id: number) => fetchStorageRequest(apiConfig, id), [apiConfig]);\n const createStorage = useCallback(\n (dto: CreateStorageRequest) => createStorageRequest(apiConfig, dto),\n [apiConfig]\n );\n const changeStorageName = useCallback(\n (id: number, dto: ChangeStorageNameRequest) => changeStorageNameRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteStorage = useCallback((id: number) => deleteStorageRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<StorageContextValue>(() => ({\n storages,\n storage,\n isLoading,\n isError,\n error,\n fetchStorages,\n fetchStorage,\n createStorage,\n changeStorageName,\n deleteStorage\n }), [\n changeStorageName,\n createStorage,\n deleteStorage,\n error,\n fetchStorage,\n fetchStorages,\n isError,\n isLoading,\n storage,\n storages\n ]);\n\n return <StorageContext.Provider value={value}>{children}</StorageContext.Provider>;\n};\n\nexport const useStorages = (): StorageContextValue => {\n const context = useContext(StorageContext);\n if (!context) {\n throw new Error('useStorages must be used within a StorageProvider');\n }\n\n return context;\n};\n","import type { Storage } from '../../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setStorages: (value: Storage[] | ((items: Storage[]) => Storage[])) => void;\n setStorage: (value: Storage | null | ((prev: Storage | null) => Storage | null)) => void;\n};\n\nconst updateById = (items: Storage[], updated: Storage): Storage[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchStoragesRequest = async (config: StorageApiConfig): Promise<Storage[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storages');\n }\n\n const payload = await readJson<Storage[]>(response);\n if (payload) {\n config.setStorages(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<Storage | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setStorage(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Storage response missing data');\n }\n\n config.setStorage(payload);\n config.setStorages((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createStorageRequest = async (\n config: StorageApiConfig,\n dto: CreateStorageRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Create storage response missing data');\n }\n\n config.setStorages((previous) => [payload, ...previous]);\n config.setStorage(payload);\n return payload;\n});\n\nexport const changeStorageNameRequest = async (\n config: StorageApiConfig,\n id: number,\n dto: ChangeStorageNameRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Update storage response missing data');\n }\n\n config.setStorages((previous) => updateById(previous, payload));\n config.setStorage(payload);\n return payload;\n});\n\nexport const deleteStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage');\n }\n\n config.setStorages((previous) => previous.filter((item) => item.id !== id));\n config.setStorage((current) => (current?.id === id ? null : current));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowNotification, StorageItem } from '../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n addItemRequest,\n deleteItemRequest,\n editItemRequest,\n fetchAboutToExpireRequest,\n fetchExpiredRequest,\n fetchItemsRequest,\n fetchRunningLowRequest\n} from './api/storageItemApi.js';\n\ntype StorageItemContextValue = {\n items: StorageItem[];\n expiredItems: StorageItem[];\n aboutToExpireItems: StorageItem[];\n runningLow: RunningLowNotification[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<StorageItem[]>;\n addItem: (storageId: number, dto: AddItemRequest) => Promise<StorageItem>;\n editItem: (storageId: number, itemId: number, dto: EditItemRequest) => Promise<StorageItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n fetchExpired: (storageId: number) => Promise<StorageItem[]>;\n fetchAboutToExpire: (storageId: number) => Promise<StorageItem[]>;\n fetchRunningLow: (storageId: number) => Promise<RunningLowNotification[]>;\n};\n\ntype StorageItemProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageItemContext = createContext<StorageItemContextValue | undefined>(undefined);\n\nexport const StorageItemProvider = ({ baseUrl, children }: StorageItemProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<StorageItem[]>([]);\n const [expiredItems, setExpiredItems] = useState<StorageItem[]>([]);\n const [aboutToExpireItems, setAboutToExpireItems] = useState<StorageItem[]>([]);\n const [runningLow, setRunningLow] = useState<RunningLowNotification[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setItems,\n setExpiredItems,\n setAboutToExpireItems,\n setRunningLow,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchItems = useCallback((storageId: number) => fetchItemsRequest(apiConfig, storageId), [apiConfig]);\n const addItem = useCallback(\n (storageId: number, dto: AddItemRequest) => addItemRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editItem = useCallback(\n (storageId: number, itemId: number, dto: EditItemRequest) => editItemRequest(apiConfig, storageId, itemId, dto),\n [apiConfig]\n );\n const deleteItem = useCallback(\n (storageId: number, itemId: number) => deleteItemRequest(apiConfig, storageId, itemId),\n [apiConfig]\n );\n const fetchExpired = useCallback(\n (storageId: number) => fetchExpiredRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchAboutToExpire = useCallback(\n (storageId: number) => fetchAboutToExpireRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchRunningLow = useCallback(\n (storageId: number) => fetchRunningLowRequest(apiConfig, storageId),\n [apiConfig]\n );\n\n const value = useMemo<StorageItemContextValue>(() => ({\n items,\n expiredItems,\n aboutToExpireItems,\n runningLow,\n isLoading,\n isError,\n error,\n fetchItems,\n addItem,\n editItem,\n deleteItem,\n fetchExpired,\n fetchAboutToExpire,\n fetchRunningLow\n }), [\n aboutToExpireItems,\n addItem,\n deleteItem,\n editItem,\n error,\n expiredItems,\n fetchAboutToExpire,\n fetchExpired,\n fetchItems,\n fetchRunningLow,\n isError,\n isLoading,\n items,\n runningLow\n ]);\n\n return <StorageItemContext.Provider value={value}>{children}</StorageItemContext.Provider>;\n};\n\nexport const useStorageItems = (): StorageItemContextValue => {\n const context = useContext(StorageItemContext);\n if (!context) {\n throw new Error('useStorageItems must be used within a StorageItemProvider');\n }\n\n return context;\n};\n","import type { RunningLowNotification, StorageItem } from '../../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageItemApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: StorageItem[] | ((items: StorageItem[]) => StorageItem[])) => void;\n setExpiredItems: (value: StorageItem[]) => void;\n setAboutToExpireItems: (value: StorageItem[]) => void;\n setRunningLow: (value: RunningLowNotification[]) => void;\n};\n\nconst updateById = (items: StorageItem[], updated: StorageItem): StorageItem[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchItemsRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const addItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n dto: AddItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to add storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Add item response missing data');\n }\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number,\n dto: EditItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to edit storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Edit item response missing data');\n }\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage item');\n }\n\n config.setItems((previous) => previous.filter((item) => item.id !== itemId));\n});\n\nexport const fetchExpiredRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/expired`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch expired items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setExpiredItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchAboutToExpireRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/abouttoexpire`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch items about to expire');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setAboutToExpireItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchRunningLowRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<RunningLowNotification[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/runninglow`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low items');\n }\n\n const payload = await readJson<RunningLowNotification[]>(response);\n if (payload) {\n config.setRunningLow(payload);\n return payload;\n }\n\n return [];\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport type { InviteMemberRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchMembersRequest,\n inviteMemberRequest,\n removeMemberRequest\n} from './api/storageMemberApi.js';\n\ntype StorageMemberContextValue = {\n members: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchMembers: (storageId: number) => Promise<StorageMember[]>;\n inviteMember: (storageId: number, dto: InviteMemberRequest) => Promise<StorageMember>;\n removeMember: (storageId: number, userId: number) => Promise<void>;\n};\n\ntype StorageMemberProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageMemberContext = createContext<StorageMemberContextValue | undefined>(undefined);\n\nexport const StorageMemberProvider = ({ baseUrl, children }: StorageMemberProviderProps) => {\n const { token } = useAuth();\n const [members, setMembers] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setMembers,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchMembers = useCallback(\n (storageId: number) => fetchMembersRequest(apiConfig, storageId),\n [apiConfig]\n );\n const inviteMember = useCallback(\n (storageId: number, dto: InviteMemberRequest) => inviteMemberRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const removeMember = useCallback(\n (storageId: number, userId: number) => removeMemberRequest(apiConfig, storageId, userId),\n [apiConfig]\n );\n\n const value = useMemo<StorageMemberContextValue>(() => ({\n members,\n isLoading,\n isError,\n error,\n fetchMembers,\n inviteMember,\n removeMember\n }), [error, fetchMembers, inviteMember, isError, isLoading, members, removeMember]);\n\n return <StorageMemberContext.Provider value={value}>{children}</StorageMemberContext.Provider>;\n};\n\nexport const useStorageMembers = (): StorageMemberContextValue => {\n const context = useContext(StorageMemberContext);\n if (!context) {\n throw new Error('useStorageMembers must be used within a StorageMemberProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport type { InviteMemberRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageMemberApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setMembers: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchMembersRequest = async (\n config: StorageMemberApiConfig,\n storageId: number\n): Promise<StorageMember[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage members');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setMembers(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const inviteMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n dto: InviteMemberRequest\n): Promise<StorageMember> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to invite member');\n }\n\n const payload = await readJson<StorageMember>(response);\n if (!payload) {\n throw new Error('Invite member response missing data');\n }\n\n config.setMembers((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const removeMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n userId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members/${userId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to remove member');\n }\n\n config.setMembers((previous) => previous.filter((member) => member.user.id !== userId));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { User } from '../type/models.js';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n deleteUserRequest,\n fetchUserRequest,\n fetchUsersRequest,\n getUserPfpRequest,\n updateUserRequest,\n uploadUserPfpRequest\n} from './api/userApi.js';\n\ntype UserContextValue = {\n users: User[];\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchUsers: () => Promise<User[]>;\n fetchUser: (id: number) => Promise<User | null>;\n updateUser: (id: number, dto: ChangeUserDataRequest) => Promise<User>;\n deleteUser: (id: number) => Promise<void>;\n getUserPfp: (id: number) => Promise<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"],"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","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","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"],"sourcesContent":["export * from './type/auth.js';\nexport * from './type/base.js';\nexport * from './type/models.js';\nexport * from './type/product.js';\nexport * from './type/runninglow.js';\nexport * from './type/requests.js';\nexport * from './type/storage.js';\nexport * from './type/user.js';\nexport * from './context/AuthContext.js';\nexport * from './context/http.js';\nexport * from './context/InviteContext.js';\nexport * from './context/ProductContext.js';\nexport * from './context/RunningLowContext.js';\nexport * from './context/StorageContext.js';\nexport * from './context/StorageItemContext.js';\nexport * from './context/StorageMemberContext.js';\nexport * from './context/UserContext.js';","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from 'react';\n\nimport type {\n ChangePasswordRequest,\n LoginRequest,\n SignupRequest,\n TokenStorage,\n User\n} from '../type/auth.js';\nimport {\n changePasswordRequest,\n getMeRequest,\n loginRequest,\n logoutRequest,\n signupRequest\n} from './api/authApi.js';\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 config.setUser(payload);\n return payload;\n});\n\nexport const changePasswordRequest = async (\n config: AuthApiConfig,\n dto: ChangePasswordRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/password/change`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<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"],"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"]}