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 +31 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.cts +22 -43
- package/dist/index.d.ts +22 -43
- package/dist/index.esm.js +31 -1
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/context/api/authApi.ts +1 -1
- package/src/context/api/productApi.ts +11 -0
- package/src/context/api/runningLowApi.ts +11 -0
- package/src/context/api/storageApi.ts +9 -0
- package/src/context/api/storageItemApi.ts +11 -0
- package/src/context/api/storageMemberApi.ts +6 -0
- package/src/context/api/userApi.ts +7 -1
- package/src/type/auth.ts +1 -0
- package/src/type/item.ts +13 -0
- package/src/type/member.ts +7 -0
- package/src/type/product.ts +7 -26
- package/src/type/runninglow.ts +9 -19
- package/src/type/storage.ts +4 -67
- package/src/type/user.ts +5 -17
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);
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/context/AuthContext.tsx","../src/context/http.ts","../src/context/api/requestState.ts","../src/context/api/authApi.ts","../src/context/api/userApi.ts","../src/context/InviteContext.tsx","../src/context/api/inviteApi.ts","../src/context/ProductContext.tsx","../src/context/api/productApi.ts","../src/context/RunningLowContext.tsx","../src/context/api/runningLowApi.ts","../src/context/StorageContext.tsx","../src/context/api/storageApi.ts","../src/context/StorageItemContext.tsx","../src/context/api/storageItemApi.ts","../src/context/StorageMemberContext.tsx","../src/context/api/storageMemberApi.ts","../src/context/UserContext.tsx"],"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"]}
|