shelflife-react-hooks 1.0.7 → 1.0.9

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.d.cts CHANGED
@@ -54,6 +54,17 @@ type RunningLowNotification = {
54
54
  runningLowAt: number;
55
55
  amount: number;
56
56
  };
57
+ type ShoppingListItem = {
58
+ id: number;
59
+ storage: Storage;
60
+ product: Product;
61
+ amountToBuy: number;
62
+ };
63
+ type ToPurchaseItem = {
64
+ productId: number;
65
+ productName: string;
66
+ amountToBuy: number;
67
+ };
57
68
 
58
69
  type LoginRequest = {
59
70
  email: string;
@@ -91,6 +102,7 @@ type LogoutErrorResponse = {
91
102
  type LogoutResponse = EmptyResponse | LogoutErrorResponse;
92
103
  type ChangePasswordErrorResponse = {
93
104
  oldPassword?: string;
105
+ newPassword?: string;
94
106
  newPasswordRepeat?: string;
95
107
  };
96
108
  type ChangePasswordResponse = EmptyResponse | ChangePasswordErrorResponse;
@@ -101,23 +113,20 @@ type TokenStorage = {
101
113
  removeItem: (key: string) => Promise<void> | void;
102
114
  };
103
115
 
104
- type ProductListResponse = Product[];
105
- type ProductResponse = Product | EmptyResponse;
106
- type ProductIconResponse = ImageResponse;
107
- type ProductUploadIconError = ErrorResponse | {
108
- pfp: string;
109
- };
110
- type ProductUploadIconResponse = EmptyResponse | ProductUploadIconError;
111
- type ProductCreateResponse = Product | FieldErrorMap | EmptyResponse;
112
- type ProductUpdateResponse = Product | FieldErrorMap | EmptyResponse;
113
- type ProductDeleteResponse = EmptyResponse;
116
+ type ProductCreateError = {
117
+ name?: string;
118
+ category?: string;
119
+ barcode?: string;
120
+ expirationDaysDelta?: number;
121
+ };
114
122
 
115
- type RunningLowSettingListResponse = RunningLowSetting[];
116
- type RunningLowSettingResponse = RunningLowSetting | EmptyResponse;
117
- type RunningLowCreateResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
118
- type RunningLowEditResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
119
- type RunningLowDeleteResponse = EmptyResponse;
120
- type RunningLowNotificationListResponse = RunningLowNotification[];
123
+ type CreateRunningLowSettingError = {
124
+ productId?: string;
125
+ runningLow?: string;
126
+ };
127
+ type EditRunningLowSettingError = {
128
+ runningLow?: string;
129
+ };
121
130
 
122
131
  type CreateProductRequest = {
123
132
  name: string;
@@ -145,6 +154,13 @@ type AddItemRequest = {
145
154
  type EditItemRequest = {
146
155
  expiresAt?: string;
147
156
  };
157
+ type CreateShoppingItemRequest = {
158
+ productId: number;
159
+ amountToBuy: number;
160
+ };
161
+ type EditShoppingItemRequest = {
162
+ amountToBuy: number;
163
+ };
148
164
  type CreateStorageRequest = {
149
165
  name: string;
150
166
  };
@@ -160,33 +176,14 @@ type ChangeUserDataRequest = {
160
176
  isAdmin?: boolean;
161
177
  };
162
178
 
163
- type StorageListResponse = Storage[];
164
- type StorageResponse = Storage | EmptyResponse;
165
- type StorageCreateResponse = Storage | FieldErrorMap | EmptyResponse;
166
- type StorageChangeNameResponse = Storage | FieldErrorMap | EmptyResponse;
167
- type StorageDeleteResponse = EmptyResponse;
168
- type StorageItemListResponse = StorageItem[];
169
- type StorageItemResponse = StorageItem | EmptyResponse;
170
- type StorageItemAddResponse = StorageItem | FieldErrorMap | EmptyResponse;
171
- type StorageItemEditResponse = StorageItem | FieldErrorMap | EmptyResponse;
172
- type StorageItemDeleteResponse = EmptyResponse;
173
- type StorageExpiredItemsResponse = StorageItem[];
174
- type StorageAboutToExpireItemsResponse = StorageItem[];
175
- type StorageRunningLowResponse = RunningLowNotification[];
176
- type StorageMemberListResponse = StorageMember[];
177
- type StorageMemberResponse = StorageMember | EmptyResponse;
178
- type StorageMemberInviteResponse = StorageMember | FieldErrorMap | EmptyResponse;
179
- type StorageMemberDeleteResponse = EmptyResponse | FieldErrorMap;
180
- type InviteListResponse = StorageMember[];
181
- type InviteAcceptResponse = EmptyResponse;
182
- type InviteDeclineResponse = EmptyResponse;
179
+ type CreateStorageError = {
180
+ name?: string;
181
+ };
183
182
 
184
- type UserListResponse = User[];
185
- type UserResponse = User | EmptyResponse;
186
- type UserPfpResponse = ImageResponse;
187
- type UserUploadPfpResponse = EmptyResponse | FieldErrorMap | string;
188
- type UserDeleteResponse = EmptyResponse;
189
- type UserUpdateResponse = User | FieldErrorMap | EmptyResponse;
183
+ type UpdateUserError = {
184
+ username?: string;
185
+ email?: string;
186
+ };
190
187
 
191
188
  type AuthContextValue = {
192
189
  token: string | null;
@@ -354,4 +351,35 @@ type UserProviderProps = {
354
351
  declare const UserProvider: ({ baseUrl, children }: UserProviderProps) => react_jsx_runtime.JSX.Element;
355
352
  declare const useUsers: () => UserContextValue;
356
353
 
357
- export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type TokenStorage, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
354
+ type ShoppingListContextValue = {
355
+ items: ShoppingListItem[];
356
+ isLoading: boolean;
357
+ isError: boolean;
358
+ error: Error | null;
359
+ fetchItems: (storageId: number) => Promise<ShoppingListItem[]>;
360
+ createItem: (storageId: number, dto: CreateShoppingItemRequest) => Promise<ShoppingListItem>;
361
+ editItem: (storageId: number, itemId: number, dto: EditShoppingItemRequest) => Promise<ShoppingListItem>;
362
+ deleteItem: (storageId: number, itemId: number) => Promise<void>;
363
+ };
364
+ type ShoppingListProviderProps = {
365
+ baseUrl: string;
366
+ children: React.ReactNode;
367
+ };
368
+ declare const ShoppingListProvider: ({ baseUrl, children }: ShoppingListProviderProps) => react_jsx_runtime.JSX.Element;
369
+ declare const useShoppingList: () => ShoppingListContextValue;
370
+
371
+ type ToPurchaseContextValue = {
372
+ items: ToPurchaseItem[];
373
+ isLoading: boolean;
374
+ isError: boolean;
375
+ error: Error | null;
376
+ fetchAggregated: () => Promise<ToPurchaseItem[]>;
377
+ };
378
+ type ToPurchaseProviderProps = {
379
+ baseUrl: string;
380
+ children: React.ReactNode;
381
+ };
382
+ declare const ToPurchaseProvider: ({ baseUrl, children }: ToPurchaseProviderProps) => react_jsx_runtime.JSX.Element;
383
+ declare const useToPurchase: () => ToPurchaseContextValue;
384
+
385
+ export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateRunningLowSettingError, type CreateSettingRequest, type CreateShoppingItemRequest, type CreateStorageError, type CreateStorageRequest, type EditItemRequest, type EditRunningLowSettingError, type EditSettingRequest, type EditShoppingItemRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateError, ProductProvider, type RunningLowNotification, RunningLowProvider, type RunningLowSetting, type ShoppingListItem, ShoppingListProvider, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageItem, StorageItemProvider, type StorageMember, StorageMemberProvider, StorageProvider, type ToPurchaseItem, ToPurchaseProvider, type TokenStorage, type UpdateProductRequest, type UpdateUserError, type User, UserProvider, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useShoppingList, useStorageItems, useStorageMembers, useStorages, useToPurchase, useUsers };
package/dist/index.d.ts CHANGED
@@ -54,6 +54,17 @@ type RunningLowNotification = {
54
54
  runningLowAt: number;
55
55
  amount: number;
56
56
  };
57
+ type ShoppingListItem = {
58
+ id: number;
59
+ storage: Storage;
60
+ product: Product;
61
+ amountToBuy: number;
62
+ };
63
+ type ToPurchaseItem = {
64
+ productId: number;
65
+ productName: string;
66
+ amountToBuy: number;
67
+ };
57
68
 
58
69
  type LoginRequest = {
59
70
  email: string;
@@ -91,6 +102,7 @@ type LogoutErrorResponse = {
91
102
  type LogoutResponse = EmptyResponse | LogoutErrorResponse;
92
103
  type ChangePasswordErrorResponse = {
93
104
  oldPassword?: string;
105
+ newPassword?: string;
94
106
  newPasswordRepeat?: string;
95
107
  };
96
108
  type ChangePasswordResponse = EmptyResponse | ChangePasswordErrorResponse;
@@ -101,23 +113,20 @@ type TokenStorage = {
101
113
  removeItem: (key: string) => Promise<void> | void;
102
114
  };
103
115
 
104
- type ProductListResponse = Product[];
105
- type ProductResponse = Product | EmptyResponse;
106
- type ProductIconResponse = ImageResponse;
107
- type ProductUploadIconError = ErrorResponse | {
108
- pfp: string;
109
- };
110
- type ProductUploadIconResponse = EmptyResponse | ProductUploadIconError;
111
- type ProductCreateResponse = Product | FieldErrorMap | EmptyResponse;
112
- type ProductUpdateResponse = Product | FieldErrorMap | EmptyResponse;
113
- type ProductDeleteResponse = EmptyResponse;
116
+ type ProductCreateError = {
117
+ name?: string;
118
+ category?: string;
119
+ barcode?: string;
120
+ expirationDaysDelta?: number;
121
+ };
114
122
 
115
- type RunningLowSettingListResponse = RunningLowSetting[];
116
- type RunningLowSettingResponse = RunningLowSetting | EmptyResponse;
117
- type RunningLowCreateResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
118
- type RunningLowEditResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
119
- type RunningLowDeleteResponse = EmptyResponse;
120
- type RunningLowNotificationListResponse = RunningLowNotification[];
123
+ type CreateRunningLowSettingError = {
124
+ productId?: string;
125
+ runningLow?: string;
126
+ };
127
+ type EditRunningLowSettingError = {
128
+ runningLow?: string;
129
+ };
121
130
 
122
131
  type CreateProductRequest = {
123
132
  name: string;
@@ -145,6 +154,13 @@ type AddItemRequest = {
145
154
  type EditItemRequest = {
146
155
  expiresAt?: string;
147
156
  };
157
+ type CreateShoppingItemRequest = {
158
+ productId: number;
159
+ amountToBuy: number;
160
+ };
161
+ type EditShoppingItemRequest = {
162
+ amountToBuy: number;
163
+ };
148
164
  type CreateStorageRequest = {
149
165
  name: string;
150
166
  };
@@ -160,33 +176,14 @@ type ChangeUserDataRequest = {
160
176
  isAdmin?: boolean;
161
177
  };
162
178
 
163
- type StorageListResponse = Storage[];
164
- type StorageResponse = Storage | EmptyResponse;
165
- type StorageCreateResponse = Storage | FieldErrorMap | EmptyResponse;
166
- type StorageChangeNameResponse = Storage | FieldErrorMap | EmptyResponse;
167
- type StorageDeleteResponse = EmptyResponse;
168
- type StorageItemListResponse = StorageItem[];
169
- type StorageItemResponse = StorageItem | EmptyResponse;
170
- type StorageItemAddResponse = StorageItem | FieldErrorMap | EmptyResponse;
171
- type StorageItemEditResponse = StorageItem | FieldErrorMap | EmptyResponse;
172
- type StorageItemDeleteResponse = EmptyResponse;
173
- type StorageExpiredItemsResponse = StorageItem[];
174
- type StorageAboutToExpireItemsResponse = StorageItem[];
175
- type StorageRunningLowResponse = RunningLowNotification[];
176
- type StorageMemberListResponse = StorageMember[];
177
- type StorageMemberResponse = StorageMember | EmptyResponse;
178
- type StorageMemberInviteResponse = StorageMember | FieldErrorMap | EmptyResponse;
179
- type StorageMemberDeleteResponse = EmptyResponse | FieldErrorMap;
180
- type InviteListResponse = StorageMember[];
181
- type InviteAcceptResponse = EmptyResponse;
182
- type InviteDeclineResponse = EmptyResponse;
179
+ type CreateStorageError = {
180
+ name?: string;
181
+ };
183
182
 
184
- type UserListResponse = User[];
185
- type UserResponse = User | EmptyResponse;
186
- type UserPfpResponse = ImageResponse;
187
- type UserUploadPfpResponse = EmptyResponse | FieldErrorMap | string;
188
- type UserDeleteResponse = EmptyResponse;
189
- type UserUpdateResponse = User | FieldErrorMap | EmptyResponse;
183
+ type UpdateUserError = {
184
+ username?: string;
185
+ email?: string;
186
+ };
190
187
 
191
188
  type AuthContextValue = {
192
189
  token: string | null;
@@ -354,4 +351,35 @@ type UserProviderProps = {
354
351
  declare const UserProvider: ({ baseUrl, children }: UserProviderProps) => react_jsx_runtime.JSX.Element;
355
352
  declare const useUsers: () => UserContextValue;
356
353
 
357
- export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type TokenStorage, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };
354
+ type ShoppingListContextValue = {
355
+ items: ShoppingListItem[];
356
+ isLoading: boolean;
357
+ isError: boolean;
358
+ error: Error | null;
359
+ fetchItems: (storageId: number) => Promise<ShoppingListItem[]>;
360
+ createItem: (storageId: number, dto: CreateShoppingItemRequest) => Promise<ShoppingListItem>;
361
+ editItem: (storageId: number, itemId: number, dto: EditShoppingItemRequest) => Promise<ShoppingListItem>;
362
+ deleteItem: (storageId: number, itemId: number) => Promise<void>;
363
+ };
364
+ type ShoppingListProviderProps = {
365
+ baseUrl: string;
366
+ children: React.ReactNode;
367
+ };
368
+ declare const ShoppingListProvider: ({ baseUrl, children }: ShoppingListProviderProps) => react_jsx_runtime.JSX.Element;
369
+ declare const useShoppingList: () => ShoppingListContextValue;
370
+
371
+ type ToPurchaseContextValue = {
372
+ items: ToPurchaseItem[];
373
+ isLoading: boolean;
374
+ isError: boolean;
375
+ error: Error | null;
376
+ fetchAggregated: () => Promise<ToPurchaseItem[]>;
377
+ };
378
+ type ToPurchaseProviderProps = {
379
+ baseUrl: string;
380
+ children: React.ReactNode;
381
+ };
382
+ declare const ToPurchaseProvider: ({ baseUrl, children }: ToPurchaseProviderProps) => react_jsx_runtime.JSX.Element;
383
+ declare const useToPurchase: () => ToPurchaseContextValue;
384
+
385
+ export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateRunningLowSettingError, type CreateSettingRequest, type CreateShoppingItemRequest, type CreateStorageError, type CreateStorageRequest, type EditItemRequest, type EditRunningLowSettingError, type EditSettingRequest, type EditShoppingItemRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateError, ProductProvider, type RunningLowNotification, RunningLowProvider, type RunningLowSetting, type ShoppingListItem, ShoppingListProvider, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageItem, StorageItemProvider, type StorageMember, StorageMemberProvider, StorageProvider, type ToPurchaseItem, ToPurchaseProvider, type TokenStorage, type UpdateProductRequest, type UpdateUserError, type User, UserProvider, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useShoppingList, useStorageItems, useStorageMembers, useStorages, useToPurchase, useUsers };
package/dist/index.esm.js CHANGED
@@ -108,7 +108,7 @@ var changePasswordRequest = async (config, dto) => runWithRequestState(config, a
108
108
  });
109
109
  if (!response.ok) {
110
110
  const error = await readJson(response);
111
- if (error?.oldPassword || error?.newPasswordRepeat)
111
+ if (error?.oldPassword || error?.newPassword || error?.newPasswordRepeat)
112
112
  throw error;
113
113
  throw new Error("Change password failed");
114
114
  }
@@ -207,6 +207,9 @@ var updateUserRequest = async (config, id, dto) => runWithRequestState(config, a
207
207
  body: JSON.stringify(dto)
208
208
  });
209
209
  if (!response.ok) {
210
+ const update = await readJson(response);
211
+ if (update?.email || update?.username)
212
+ throw update;
210
213
  throw new Error("Failed to update user");
211
214
  }
212
215
  const payload = await readJson(response);
@@ -523,6 +526,9 @@ var createProductRequest = async (config, dto) => runWithRequestState(config, as
523
526
  body: JSON.stringify(dto)
524
527
  });
525
528
  if (!response.ok) {
529
+ const err = await readJson(response);
530
+ if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)
531
+ throw err;
526
532
  throw new Error("Failed to create product");
527
533
  }
528
534
  const payload = await readJson(response);
@@ -544,6 +550,9 @@ var updateProductRequest = async (config, id, dto) => runWithRequestState(config
544
550
  body: JSON.stringify(dto)
545
551
  });
546
552
  if (!response.ok) {
553
+ const err = await readJson(response);
554
+ if (err?.name || err?.barcode || err?.category || err?.expirationDaysDelta)
555
+ throw err;
547
556
  throw new Error("Failed to update product");
548
557
  }
549
558
  const payload = await readJson(response);
@@ -716,6 +725,9 @@ var createSettingRequest = async (config, storageId, dto) => runWithRequestState
716
725
  }
717
726
  );
718
727
  if (!response.ok) {
728
+ const err = await readJson(response);
729
+ if (err?.productId || err?.runningLow)
730
+ throw err;
719
731
  throw new Error("Failed to create running low setting");
720
732
  }
721
733
  const payload = await readJson(response);
@@ -739,6 +751,9 @@ var editSettingRequest = async (config, storageId, id, dto) => runWithRequestSta
739
751
  }
740
752
  );
741
753
  if (!response.ok) {
754
+ const err = await readJson(response);
755
+ if (err?.runningLow)
756
+ throw err;
742
757
  throw new Error("Failed to edit running low setting");
743
758
  }
744
759
  const payload = await readJson(response);
@@ -893,6 +908,9 @@ var createStorageRequest = async (config, dto) => runWithRequestState(config, as
893
908
  body: JSON.stringify(dto)
894
909
  });
895
910
  if (!response.ok) {
911
+ const payload2 = await readJson(response);
912
+ if (payload2?.name)
913
+ throw payload2;
896
914
  throw new Error("Failed to create storage");
897
915
  }
898
916
  const payload = await readJson(response);
@@ -914,6 +932,9 @@ var changeStorageNameRequest = async (config, id, dto) => runWithRequestState(co
914
932
  body: JSON.stringify(dto)
915
933
  });
916
934
  if (!response.ok) {
935
+ const payload2 = await readJson(response);
936
+ if (payload2?.name)
937
+ throw payload2;
917
938
  throw new Error("Failed to update storage");
918
939
  }
919
940
  const payload = await readJson(response);
@@ -1045,6 +1066,9 @@ var addItemRequest = async (config, storageId, dto) => runWithRequestState(confi
1045
1066
  body: JSON.stringify(dto)
1046
1067
  });
1047
1068
  if (!response.ok) {
1069
+ const err = await readJson(response);
1070
+ if (err?.productId || err?.expiresAt)
1071
+ throw err;
1048
1072
  throw new Error("Failed to add storage item");
1049
1073
  }
1050
1074
  const payload = await readJson(response);
@@ -1065,6 +1089,9 @@ var editItemRequest = async (config, storageId, itemId, dto) => runWithRequestSt
1065
1089
  body: JSON.stringify(dto)
1066
1090
  });
1067
1091
  if (!response.ok) {
1092
+ const err = await readJson(response);
1093
+ if (err?.expiresAt)
1094
+ throw err;
1068
1095
  throw new Error("Failed to edit storage item");
1069
1096
  }
1070
1097
  const payload = await readJson(response);
@@ -1256,6 +1283,9 @@ var inviteMemberRequest = async (config, storageId, dto) => runWithRequestState(
1256
1283
  body: JSON.stringify(dto)
1257
1284
  });
1258
1285
  if (!response.ok) {
1286
+ const err = await readJson(response);
1287
+ if (err?.email)
1288
+ throw err;
1259
1289
  throw new Error("Failed to invite member");
1260
1290
  }
1261
1291
  const payload = await readJson(response);
@@ -1397,14 +1427,163 @@ var useUsers = () => {
1397
1427
  }
1398
1428
  return context;
1399
1429
  };
1430
+
1431
+ // src/context/ShoppingListContext.tsx
1432
+ import { createContext as createContext9, useCallback as useCallback9, useContext as useContext9, useMemo as useMemo9, useState as useState9 } from "react";
1433
+
1434
+ // src/context/api/shoppingListApi.ts
1435
+ var updateById6 = (items, updated) => {
1436
+ const index = items.findIndex((i) => i.id === updated.id);
1437
+ if (index === -1) return [updated, ...items];
1438
+ const next = [...items];
1439
+ next[index] = updated;
1440
+ return next;
1441
+ };
1442
+ var fetchShoppingListRequest = async (config, storageId) => runWithRequestState(config, async () => {
1443
+ const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);
1444
+ const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {
1445
+ headers: buildAuthHeaders(config.token)
1446
+ });
1447
+ if (!response.ok) {
1448
+ throw new Error("Failed to fetch shopping list items");
1449
+ }
1450
+ const payload = await readJson(response);
1451
+ if (payload) {
1452
+ config.setItems(payload);
1453
+ return payload;
1454
+ }
1455
+ return [];
1456
+ });
1457
+ var createShoppingItemRequest = async (config, storageId, dto) => runWithRequestState(config, async () => {
1458
+ const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);
1459
+ const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist`, {
1460
+ method: "POST",
1461
+ headers: {
1462
+ ...buildAuthHeaders(config.token),
1463
+ "Content-Type": "application/json"
1464
+ },
1465
+ body: JSON.stringify(dto)
1466
+ });
1467
+ if (!response.ok) {
1468
+ throw new Error("Failed to create shopping list item");
1469
+ }
1470
+ const payload = await readJson(response);
1471
+ if (!payload) throw new Error("Create shopping item response missing data");
1472
+ config.setItems((previous) => [payload, ...previous]);
1473
+ return payload;
1474
+ });
1475
+ var editShoppingItemRequest = async (config, storageId, itemId, dto) => runWithRequestState(config, async () => {
1476
+ const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);
1477
+ const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist/${itemId}`, {
1478
+ method: "PUT",
1479
+ headers: {
1480
+ ...buildAuthHeaders(config.token),
1481
+ "Content-Type": "application/json"
1482
+ },
1483
+ body: JSON.stringify(dto)
1484
+ });
1485
+ if (!response.ok) {
1486
+ throw new Error("Failed to edit shopping list item");
1487
+ }
1488
+ const payload = await readJson(response);
1489
+ if (!payload) throw new Error("Edit shopping item response missing data");
1490
+ config.setItems((previous) => updateById6(previous, payload));
1491
+ return payload;
1492
+ });
1493
+ var deleteShoppingItemRequest = async (config, storageId, itemId) => runWithRequestState(config, async () => {
1494
+ const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);
1495
+ const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/shoppinglist/${itemId}`, {
1496
+ method: "DELETE",
1497
+ headers: buildAuthHeaders(config.token)
1498
+ });
1499
+ if (!response.ok) {
1500
+ throw new Error("Failed to delete shopping list item");
1501
+ }
1502
+ config.setItems((previous) => previous.filter((i) => i.id !== itemId));
1503
+ });
1504
+
1505
+ // src/context/ShoppingListContext.tsx
1506
+ import { jsx as jsx9 } from "react/jsx-runtime";
1507
+ var ShoppingListContext = createContext9(void 0);
1508
+ var ShoppingListProvider = ({ baseUrl, children }) => {
1509
+ const { token } = useAuth();
1510
+ const [items, setItems] = useState9([]);
1511
+ const [isLoading, setIsLoading] = useState9(false);
1512
+ const [isError, setIsError] = useState9(false);
1513
+ const [error, setError] = useState9(null);
1514
+ const apiConfig = { baseUrl, token, setItems, setIsLoading, setIsError, setError };
1515
+ const fetchItems = useCallback9(async (storageId) => {
1516
+ return fetchShoppingListRequest(apiConfig, storageId);
1517
+ }, [apiConfig]);
1518
+ const createItem = useCallback9(async (storageId, dto) => {
1519
+ return createShoppingItemRequest(apiConfig, storageId, dto);
1520
+ }, [apiConfig]);
1521
+ const editItem = useCallback9(async (storageId, itemId, dto) => {
1522
+ return editShoppingItemRequest(apiConfig, storageId, itemId, dto);
1523
+ }, [apiConfig]);
1524
+ const deleteItem = useCallback9(async (storageId, itemId) => {
1525
+ return deleteShoppingItemRequest(apiConfig, storageId, itemId);
1526
+ }, [apiConfig]);
1527
+ const value = useMemo9(() => ({ items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem }), [items, isLoading, isError, error, fetchItems, createItem, editItem, deleteItem]);
1528
+ return /* @__PURE__ */ jsx9(ShoppingListContext.Provider, { value, children });
1529
+ };
1530
+ var useShoppingList = () => {
1531
+ const context = useContext9(ShoppingListContext);
1532
+ if (!context) throw new Error("useShoppingList must be used within a ShoppingListProvider");
1533
+ return context;
1534
+ };
1535
+
1536
+ // src/context/ToPurchaseContext.tsx
1537
+ import { createContext as createContext10, useCallback as useCallback10, useContext as useContext10, useMemo as useMemo10, useState as useState10 } from "react";
1538
+
1539
+ // src/context/api/toPurchaseApi.ts
1540
+ var fetchAggregatedShoppingRequest = async (config) => runWithRequestState(config, async () => {
1541
+ const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);
1542
+ const response = await fetch(`${normalizedBaseUrl}/api/tobuy/shopping`, {
1543
+ headers: buildAuthHeaders(config.token)
1544
+ });
1545
+ if (!response.ok) {
1546
+ throw new Error("Failed to fetch aggregated shopping list");
1547
+ }
1548
+ const payload = await readJson(response);
1549
+ if (payload) {
1550
+ config.setToPurchase(payload);
1551
+ return payload;
1552
+ }
1553
+ return [];
1554
+ });
1555
+
1556
+ // src/context/ToPurchaseContext.tsx
1557
+ import { jsx as jsx10 } from "react/jsx-runtime";
1558
+ var ToPurchaseContext = createContext10(void 0);
1559
+ var ToPurchaseProvider = ({ baseUrl, children }) => {
1560
+ const { token } = useAuth();
1561
+ const [items, setItems] = useState10([]);
1562
+ const [isLoading, setIsLoading] = useState10(false);
1563
+ const [isError, setIsError] = useState10(false);
1564
+ const [error, setError] = useState10(null);
1565
+ const apiConfig = { baseUrl, token, setToPurchase: setItems, setIsLoading, setIsError, setError };
1566
+ const fetchAggregated = useCallback10(async () => {
1567
+ return fetchAggregatedShoppingRequest(apiConfig);
1568
+ }, [apiConfig]);
1569
+ const value = useMemo10(() => ({ items, isLoading, isError, error, fetchAggregated }), [items, isLoading, isError, error, fetchAggregated]);
1570
+ return /* @__PURE__ */ jsx10(ToPurchaseContext.Provider, { value, children });
1571
+ };
1572
+ var useToPurchase = () => {
1573
+ const context = useContext10(ToPurchaseContext);
1574
+ if (!context) throw new Error("useToPurchase must be used within a ToPurchaseProvider");
1575
+ return context;
1576
+ };
1400
1577
  export {
1401
1578
  AuthProvider,
1402
1579
  InviteProvider,
1403
1580
  ProductProvider,
1404
1581
  RunningLowProvider,
1582
+ ShoppingListProvider,
1405
1583
  StorageItemProvider,
1406
1584
  StorageMemberProvider,
1407
1585
  StorageProvider,
1586
+ ToPurchaseProvider,
1408
1587
  UserProvider,
1409
1588
  buildAuthHeaders,
1410
1589
  normalizeBaseUrl,
@@ -1414,9 +1593,11 @@ export {
1414
1593
  useInvites,
1415
1594
  useProducts,
1416
1595
  useRunningLow,
1596
+ useShoppingList,
1417
1597
  useStorageItems,
1418
1598
  useStorageMembers,
1419
1599
  useStorages,
1600
+ useToPurchase,
1420
1601
  useUsers
1421
1602
  };
1422
1603
  //# sourceMappingURL=index.esm.js.map