@spotsdev/sdk 1.4.0 → 1.5.2

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.
Files changed (67) hide show
  1. package/dist/index.cjs +2166 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +1656 -0
  4. package/dist/index.d.ts +1655 -36
  5. package/dist/index.js +2021 -64
  6. package/dist/index.js.map +1 -0
  7. package/package.json +22 -6
  8. package/src/api/entities.ts +171 -170
  9. package/src/api/mutations/products.ts +18 -2
  10. package/src/api/queries/index.ts +4 -0
  11. package/src/api/queries/payments.ts +67 -0
  12. package/dist/api/client.d.ts +0 -12
  13. package/dist/api/client.js +0 -72
  14. package/dist/api/entities.d.ts +0 -305
  15. package/dist/api/entities.js +0 -13
  16. package/dist/api/mutations/clubs.d.ts +0 -47
  17. package/dist/api/mutations/clubs.js +0 -97
  18. package/dist/api/mutations/conversations.d.ts +0 -45
  19. package/dist/api/mutations/conversations.js +0 -114
  20. package/dist/api/mutations/index.d.ts +0 -14
  21. package/dist/api/mutations/index.js +0 -40
  22. package/dist/api/mutations/notifications.d.ts +0 -38
  23. package/dist/api/mutations/notifications.js +0 -64
  24. package/dist/api/mutations/orders.d.ts +0 -73
  25. package/dist/api/mutations/orders.js +0 -114
  26. package/dist/api/mutations/posts.d.ts +0 -123
  27. package/dist/api/mutations/posts.js +0 -242
  28. package/dist/api/mutations/products.d.ts +0 -81
  29. package/dist/api/mutations/products.js +0 -98
  30. package/dist/api/mutations/redemptions.d.ts +0 -33
  31. package/dist/api/mutations/redemptions.js +0 -63
  32. package/dist/api/mutations/spots.d.ts +0 -93
  33. package/dist/api/mutations/spots.js +0 -167
  34. package/dist/api/mutations/users.d.ts +0 -73
  35. package/dist/api/mutations/users.js +0 -175
  36. package/dist/api/queries/auth.d.ts +0 -37
  37. package/dist/api/queries/auth.js +0 -61
  38. package/dist/api/queries/clubs.d.ts +0 -52
  39. package/dist/api/queries/clubs.js +0 -116
  40. package/dist/api/queries/conversations.d.ts +0 -52
  41. package/dist/api/queries/conversations.js +0 -83
  42. package/dist/api/queries/index.d.ts +0 -28
  43. package/dist/api/queries/index.js +0 -69
  44. package/dist/api/queries/misc.d.ts +0 -30
  45. package/dist/api/queries/misc.js +0 -91
  46. package/dist/api/queries/notifications.d.ts +0 -34
  47. package/dist/api/queries/notifications.js +0 -62
  48. package/dist/api/queries/orders.d.ts +0 -45
  49. package/dist/api/queries/orders.js +0 -93
  50. package/dist/api/queries/posts.d.ts +0 -92
  51. package/dist/api/queries/posts.js +0 -233
  52. package/dist/api/queries/products.d.ts +0 -48
  53. package/dist/api/queries/products.js +0 -87
  54. package/dist/api/queries/spots.d.ts +0 -93
  55. package/dist/api/queries/spots.js +0 -250
  56. package/dist/api/queries/templates.d.ts +0 -39
  57. package/dist/api/queries/templates.js +0 -81
  58. package/dist/api/queries/users.d.ts +0 -104
  59. package/dist/api/queries/users.js +0 -235
  60. package/dist/api/queries/wallet.d.ts +0 -109
  61. package/dist/api/queries/wallet.js +0 -136
  62. package/dist/api/services/index.d.ts +0 -2
  63. package/dist/api/services/index.js +0 -8
  64. package/dist/api/services/marketplace.d.ts +0 -129
  65. package/dist/api/services/marketplace.js +0 -168
  66. package/dist/api/types.d.ts +0 -57
  67. package/dist/api/types.js +0 -33
@@ -1,62 +0,0 @@
1
- "use strict";
2
- /**
3
- * Notifications Query Hooks
4
- *
5
- * TanStack Query hooks for notification operations.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.notificationKeys = void 0;
9
- exports.useNotifications = useNotifications;
10
- exports.useUnreadNotificationCount = useUnreadNotificationCount;
11
- const react_query_1 = require("@tanstack/react-query");
12
- const client_1 = require("../client");
13
- // ============================================================================
14
- // QUERY KEYS
15
- // ============================================================================
16
- exports.notificationKeys = {
17
- all: ['notifications'],
18
- lists: () => [...exports.notificationKeys.all, 'list'],
19
- list: (params) => [...exports.notificationKeys.lists(), params],
20
- unreadCount: () => [...exports.notificationKeys.all, 'unreadCount'],
21
- };
22
- // ============================================================================
23
- // QUERY HOOKS
24
- // ============================================================================
25
- /**
26
- * Get notifications for current user
27
- *
28
- * @endpoint GET /notifications
29
- */
30
- function useNotifications(params, options) {
31
- return (0, react_query_1.useQuery)({
32
- queryKey: exports.notificationKeys.list(params),
33
- queryFn: async () => {
34
- const client = (0, client_1.getApiClient)();
35
- const queryParams = new URLSearchParams();
36
- if (params?.limit)
37
- queryParams.set('limit', String(params.limit));
38
- if (params?.unreadOnly)
39
- queryParams.set('unreadOnly', String(params.unreadOnly));
40
- const response = await client.get(`/notifications?${queryParams}`);
41
- return response.data.data;
42
- },
43
- ...options,
44
- });
45
- }
46
- /**
47
- * Get unread notification count
48
- *
49
- * @endpoint GET /notifications/unread-count
50
- */
51
- function useUnreadNotificationCount(options) {
52
- return (0, react_query_1.useQuery)({
53
- queryKey: exports.notificationKeys.unreadCount(),
54
- queryFn: async () => {
55
- const client = (0, client_1.getApiClient)();
56
- const response = await client.get('/notifications/unread-count');
57
- return response.data.data.count;
58
- },
59
- ...options,
60
- });
61
- }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9ub3RpZmljYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUFnQ0gsNENBbUJDO0FBT0QsZ0VBY0M7QUF0RUQsdURBSThCO0FBRTlCLHNDQUFzQztBQUd0QywrRUFBK0U7QUFDL0UsYUFBYTtBQUNiLCtFQUErRTtBQUVsRSxRQUFBLGdCQUFnQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBVTtJQUMvQixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLHdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQVU7SUFDdkQsSUFBSSxFQUFFLENBQUMsTUFBK0MsRUFBRSxFQUFFLENBQ3hELENBQUMsR0FBRyx3QkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQVU7SUFDaEQsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyx3QkFBZ0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFVO0NBQ3JFLENBQUE7QUFFRCwrRUFBK0U7QUFDL0UsY0FBYztBQUNkLCtFQUErRTtBQUUvRTs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLE1BQStDLEVBQy9DLE9BQXVFO0lBRXZFLE9BQU8sSUFBQSxzQkFBUSxFQUFDO1FBQ2QsUUFBUSxFQUFFLHdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsT0FBTyxFQUFFLEtBQUssSUFBNkIsRUFBRTtZQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQTtZQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO1lBQ3pDLElBQUksTUFBTSxFQUFFLEtBQUs7Z0JBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ2pFLElBQUksTUFBTSxFQUFFLFVBQVU7Z0JBQ3BCLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtZQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQy9CLGtCQUFrQixXQUFXLEVBQUUsQ0FDaEMsQ0FBQTtZQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDM0IsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLE9BQStEO0lBRS9ELE9BQU8sSUFBQSxzQkFBUSxFQUFDO1FBQ2QsUUFBUSxFQUFFLHdCQUFnQixDQUFDLFdBQVcsRUFBRTtRQUN4QyxPQUFPLEVBQUUsS0FBSyxJQUFxQixFQUFFO1lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFBO1lBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FDL0IsNkJBQTZCLENBQzlCLENBQUE7WUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm90aWZpY2F0aW9ucyBRdWVyeSBIb29rc1xuICpcbiAqIFRhblN0YWNrIFF1ZXJ5IGhvb2tzIGZvciBub3RpZmljYXRpb24gb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICB1c2VRdWVyeSxcbiAgdHlwZSBVc2VRdWVyeU9wdGlvbnMsXG4gIHR5cGUgVXNlUXVlcnlSZXN1bHQsXG59IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcblxuaW1wb3J0IHtnZXRBcGlDbGllbnR9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7dHlwZSBBcGlSZXNwb25zZSwgdHlwZSBOb3RpZmljYXRpb259IGZyb20gJy4uL3R5cGVzJ1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVlTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBub3RpZmljYXRpb25LZXlzID0ge1xuICBhbGw6IFsnbm90aWZpY2F0aW9ucyddIGFzIGNvbnN0LFxuICBsaXN0czogKCkgPT4gWy4uLm5vdGlmaWNhdGlvbktleXMuYWxsLCAnbGlzdCddIGFzIGNvbnN0LFxuICBsaXN0OiAocGFyYW1zPzoge2xpbWl0PzogbnVtYmVyOyB1bnJlYWRPbmx5PzogYm9vbGVhbn0pID0+XG4gICAgWy4uLm5vdGlmaWNhdGlvbktleXMubGlzdHMoKSwgcGFyYW1zXSBhcyBjb25zdCxcbiAgdW5yZWFkQ291bnQ6ICgpID0+IFsuLi5ub3RpZmljYXRpb25LZXlzLmFsbCwgJ3VucmVhZENvdW50J10gYXMgY29uc3QsXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IG5vdGlmaWNhdGlvbnMgZm9yIGN1cnJlbnQgdXNlclxuICpcbiAqIEBlbmRwb2ludCBHRVQgL25vdGlmaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbnMoXG4gIHBhcmFtcz86IHtsaW1pdD86IG51bWJlcjsgdW5yZWFkT25seT86IGJvb2xlYW59LFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Tm90aWZpY2F0aW9uW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPixcbik6IFVzZVF1ZXJ5UmVzdWx0PE5vdGlmaWNhdGlvbltdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG5vdGlmaWNhdGlvbktleXMubGlzdChwYXJhbXMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPE5vdGlmaWNhdGlvbltdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgIGlmIChwYXJhbXM/LmxpbWl0KSBxdWVyeVBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKHBhcmFtcy5saW1pdCkpXG4gICAgICBpZiAocGFyYW1zPy51bnJlYWRPbmx5KVxuICAgICAgICBxdWVyeVBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcocGFyYW1zLnVucmVhZE9ubHkpKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPE5vdGlmaWNhdGlvbltdPj4oXG4gICAgICAgIGAvbm90aWZpY2F0aW9ucz8ke3F1ZXJ5UGFyYW1zfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEdldCB1bnJlYWQgbm90aWZpY2F0aW9uIGNvdW50XG4gKlxuICogQGVuZHBvaW50IEdFVCAvbm90aWZpY2F0aW9ucy91bnJlYWQtY291bnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVucmVhZE5vdGlmaWNhdGlvbkNvdW50KFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8bnVtYmVyPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz4sXG4pOiBVc2VRdWVyeVJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbm90aWZpY2F0aW9uS2V5cy51bnJlYWRDb3VudCgpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTx7Y291bnQ6IG51bWJlcn0+PihcbiAgICAgICAgJy9ub3RpZmljYXRpb25zL3VucmVhZC1jb3VudCcsXG4gICAgICApXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhLmNvdW50XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuIl19
@@ -1,45 +0,0 @@
1
- /**
2
- * Orders Query Hooks
3
- *
4
- * TanStack Query hooks for order-related operations.
5
- */
6
- import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
7
- import type { Order, OrderItem, Product, Spot, OrderStatus, PaginatedResponse } from '../types';
8
- export declare const orderKeys: {
9
- all: readonly ["orders"];
10
- lists: () => readonly ["orders", "list"];
11
- list: (filters?: Record<string, unknown>) => readonly ["orders", "list", Record<string, unknown> | undefined];
12
- details: () => readonly ["orders", "detail"];
13
- detail: (id: string) => readonly ["orders", "detail", string];
14
- myOrders: () => readonly ["orders", "my"];
15
- spotOrders: (spotId: string) => readonly ["orders", "spot", string];
16
- };
17
- export interface OrderWithDetails extends Order {
18
- items: (OrderItem & {
19
- product: Pick<Product, 'id' | 'name' | 'slug' | 'type' | 'imageUrl'>;
20
- })[];
21
- spot: Pick<Spot, 'id' | 'name' | 'slug'>;
22
- }
23
- export interface OrderFilters {
24
- status?: OrderStatus;
25
- limit?: number;
26
- page?: number;
27
- }
28
- /**
29
- * Get current user's orders (purchases)
30
- *
31
- * @endpoint GET /users/me/orders
32
- */
33
- export declare function useMyOrders(params?: OrderFilters, options?: Omit<UseQueryOptions<PaginatedResponse<OrderWithDetails>>, 'queryKey' | 'queryFn'>): UseQueryResult<PaginatedResponse<OrderWithDetails>>;
34
- /**
35
- * Get a single order by ID
36
- *
37
- * @endpoint GET /orders/{orderId}
38
- */
39
- export declare function useOrder(orderId: string, options?: Omit<UseQueryOptions<OrderWithDetails>, 'queryKey' | 'queryFn'>): UseQueryResult<OrderWithDetails>;
40
- /**
41
- * Get orders for a spot (seller view)
42
- *
43
- * @endpoint GET /seller/spots/{spotId}/orders
44
- */
45
- export declare function useSpotOrders(spotId: string, params?: OrderFilters, options?: Omit<UseQueryOptions<PaginatedResponse<OrderWithDetails>>, 'queryKey' | 'queryFn'>): UseQueryResult<PaginatedResponse<OrderWithDetails>>;
@@ -1,93 +0,0 @@
1
- "use strict";
2
- /**
3
- * Orders Query Hooks
4
- *
5
- * TanStack Query hooks for order-related operations.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.orderKeys = void 0;
9
- exports.useMyOrders = useMyOrders;
10
- exports.useOrder = useOrder;
11
- exports.useSpotOrders = useSpotOrders;
12
- const react_query_1 = require("@tanstack/react-query");
13
- const client_1 = require("../client");
14
- // ============================================================================
15
- // QUERY KEYS
16
- // ============================================================================
17
- exports.orderKeys = {
18
- all: ['orders'],
19
- lists: () => [...exports.orderKeys.all, 'list'],
20
- list: (filters) => [...exports.orderKeys.lists(), filters],
21
- details: () => [...exports.orderKeys.all, 'detail'],
22
- detail: (id) => [...exports.orderKeys.details(), id],
23
- myOrders: () => [...exports.orderKeys.all, 'my'],
24
- spotOrders: (spotId) => [...exports.orderKeys.all, 'spot', spotId],
25
- };
26
- // ============================================================================
27
- // QUERY HOOKS
28
- // ============================================================================
29
- /**
30
- * Get current user's orders (purchases)
31
- *
32
- * @endpoint GET /users/me/orders
33
- */
34
- function useMyOrders(params, options) {
35
- return (0, react_query_1.useQuery)({
36
- queryKey: exports.orderKeys.list({ ...params, my: true }),
37
- queryFn: async () => {
38
- const client = (0, client_1.getApiClient)();
39
- const queryParams = new URLSearchParams();
40
- if (params?.status)
41
- queryParams.set('status', params.status);
42
- if (params?.limit)
43
- queryParams.set('limit', String(params.limit));
44
- if (params?.page)
45
- queryParams.set('page', String(params.page));
46
- const response = await client.get(`/users/me/orders?${queryParams}`);
47
- return response.data.data;
48
- },
49
- ...options,
50
- });
51
- }
52
- /**
53
- * Get a single order by ID
54
- *
55
- * @endpoint GET /orders/{orderId}
56
- */
57
- function useOrder(orderId, options) {
58
- return (0, react_query_1.useQuery)({
59
- queryKey: exports.orderKeys.detail(orderId),
60
- queryFn: async () => {
61
- const client = (0, client_1.getApiClient)();
62
- const response = await client.get(`/orders/${orderId}`);
63
- return response.data.data;
64
- },
65
- enabled: !!orderId,
66
- ...options,
67
- });
68
- }
69
- /**
70
- * Get orders for a spot (seller view)
71
- *
72
- * @endpoint GET /seller/spots/{spotId}/orders
73
- */
74
- function useSpotOrders(spotId, params, options) {
75
- return (0, react_query_1.useQuery)({
76
- queryKey: exports.orderKeys.spotOrders(spotId),
77
- queryFn: async () => {
78
- const client = (0, client_1.getApiClient)();
79
- const queryParams = new URLSearchParams();
80
- if (params?.status)
81
- queryParams.set('status', params.status);
82
- if (params?.limit)
83
- queryParams.set('limit', String(params.limit));
84
- if (params?.page)
85
- queryParams.set('page', String(params.page));
86
- const response = await client.get(`/seller/spots/${spotId}/orders?${queryParams}`);
87
- return response.data.data;
88
- },
89
- enabled: !!spotId,
90
- ...options,
91
- });
92
- }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9xdWVyaWVzL29yZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBdURILGtDQXNCQztBQU9ELDRCQWdCQztBQU9ELHNDQXdCQztBQWpJRCx1REFBeUY7QUFDekYsc0NBQXNDO0FBV3RDLCtFQUErRTtBQUMvRSxhQUFhO0FBQ2IsK0VBQStFO0FBRWxFLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBVTtJQUN4QixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBVTtJQUNoRCxJQUFJLEVBQUUsQ0FBQyxPQUFpQyxFQUFFLEVBQUUsQ0FDMUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFVO0lBQzFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFVO0lBQ3BELE1BQU0sRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFVO0lBQzdELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFVO0lBQ2pELFVBQVUsRUFBRSxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQVU7Q0FDNUUsQ0FBQTtBQW1CRCwrRUFBK0U7QUFDL0UsY0FBYztBQUNkLCtFQUErRTtBQUUvRTs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixNQUFxQixFQUNyQixPQUdDO0lBRUQsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsaUJBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDL0MsT0FBTyxFQUFFLEtBQUssSUFBa0QsRUFBRTtZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQTtZQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO1lBQ3pDLElBQUksTUFBTSxFQUFFLE1BQU07Z0JBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzVELElBQUksTUFBTSxFQUFFLEtBQUs7Z0JBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ2pFLElBQUksTUFBTSxFQUFFLElBQUk7Z0JBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQzlELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FFL0Isb0JBQW9CLFdBQVcsRUFBRSxDQUFDLENBQUE7WUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMzQixDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixRQUFRLENBQ3RCLE9BQWUsRUFDZixPQUF5RTtJQUV6RSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxpQkFBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDbkMsT0FBTyxFQUFFLEtBQUssSUFBK0IsRUFBRTtZQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQTtZQUM3QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQy9CLFdBQVcsT0FBTyxFQUFFLENBQ3JCLENBQUE7WUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzNCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87UUFDbEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQzNCLE1BQWMsRUFDZCxNQUFxQixFQUNyQixPQUdDO0lBRUQsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsaUJBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLElBQWtELEVBQUU7WUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUE7WUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtZQUN6QyxJQUFJLE1BQU0sRUFBRSxNQUFNO2dCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM1RCxJQUFJLE1BQU0sRUFBRSxLQUFLO2dCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNqRSxJQUFJLE1BQU0sRUFBRSxJQUFJO2dCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUM5RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBRS9CLGlCQUFpQixNQUFNLFdBQVcsV0FBVyxFQUFFLENBQUMsQ0FBQTtZQUNsRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzNCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDakIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3JkZXJzIFF1ZXJ5IEhvb2tzXG4gKlxuICogVGFuU3RhY2sgUXVlcnkgaG9va3MgZm9yIG9yZGVyLXJlbGF0ZWQgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQge3VzZVF1ZXJ5LCB0eXBlIFVzZVF1ZXJ5T3B0aW9ucywgdHlwZSBVc2VRdWVyeVJlc3VsdH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5J1xuaW1wb3J0IHtnZXRBcGlDbGllbnR9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB0eXBlIHtcbiAgT3JkZXIsXG4gIE9yZGVySXRlbSxcbiAgUHJvZHVjdCxcbiAgU3BvdCxcbiAgT3JkZXJTdGF0dXMsXG4gIEFwaVJlc3BvbnNlLFxuICBQYWdpbmF0ZWRSZXNwb25zZSxcbn0gZnJvbSAnLi4vdHlwZXMnXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IG9yZGVyS2V5cyA9IHtcbiAgYWxsOiBbJ29yZGVycyddIGFzIGNvbnN0LFxuICBsaXN0czogKCkgPT4gWy4uLm9yZGVyS2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+XG4gICAgWy4uLm9yZGVyS2V5cy5saXN0cygpLCBmaWx0ZXJzXSBhcyBjb25zdCxcbiAgZGV0YWlsczogKCkgPT4gWy4uLm9yZGVyS2V5cy5hbGwsICdkZXRhaWwnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLm9yZGVyS2V5cy5kZXRhaWxzKCksIGlkXSBhcyBjb25zdCxcbiAgbXlPcmRlcnM6ICgpID0+IFsuLi5vcmRlcktleXMuYWxsLCAnbXknXSBhcyBjb25zdCxcbiAgc3BvdE9yZGVyczogKHNwb3RJZDogc3RyaW5nKSA9PiBbLi4ub3JkZXJLZXlzLmFsbCwgJ3Nwb3QnLCBzcG90SWRdIGFzIGNvbnN0LFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVyV2l0aERldGFpbHMgZXh0ZW5kcyBPcmRlciB7XG4gIGl0ZW1zOiAoT3JkZXJJdGVtICYge1xuICAgIHByb2R1Y3Q6IFBpY2s8UHJvZHVjdCwgJ2lkJyB8ICduYW1lJyB8ICdzbHVnJyB8ICd0eXBlJyB8ICdpbWFnZVVybCc+XG4gIH0pW11cbiAgc3BvdDogUGljazxTcG90LCAnaWQnIHwgJ25hbWUnIHwgJ3NsdWcnPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVyRmlsdGVycyB7XG4gIHN0YXR1cz86IE9yZGVyU3RhdHVzXG4gIGxpbWl0PzogbnVtYmVyXG4gIHBhZ2U/OiBudW1iZXJcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgSE9PS1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgY3VycmVudCB1c2VyJ3Mgb3JkZXJzIChwdXJjaGFzZXMpXG4gKlxuICogQGVuZHBvaW50IEdFVCAvdXNlcnMvbWUvb3JkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNeU9yZGVycyhcbiAgcGFyYW1zPzogT3JkZXJGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxcbiAgICBVc2VRdWVyeU9wdGlvbnM8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+LFxuICAgICdxdWVyeUtleScgfCAncXVlcnlGbidcbiAgPixcbik6IFVzZVF1ZXJ5UmVzdWx0PFBhZ2luYXRlZFJlc3BvbnNlPE9yZGVyV2l0aERldGFpbHM+PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG9yZGVyS2V5cy5saXN0KHsuLi5wYXJhbXMsIG15OiB0cnVlfSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgaWYgKHBhcmFtcz8uc3RhdHVzKSBxdWVyeVBhcmFtcy5zZXQoJ3N0YXR1cycsIHBhcmFtcy5zdGF0dXMpXG4gICAgICBpZiAocGFyYW1zPy5saW1pdCkgcXVlcnlQYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhwYXJhbXMubGltaXQpKVxuICAgICAgaWYgKHBhcmFtcz8ucGFnZSkgcXVlcnlQYXJhbXMuc2V0KCdwYWdlJywgU3RyaW5nKHBhcmFtcy5wYWdlKSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxcbiAgICAgICAgQXBpUmVzcG9uc2U8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+XG4gICAgICA+KGAvdXNlcnMvbWUvb3JkZXJzPyR7cXVlcnlQYXJhbXN9YClcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGFcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIG9yZGVyIGJ5IElEXG4gKlxuICogQGVuZHBvaW50IEdFVCAvb3JkZXJzL3tvcmRlcklkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3JkZXIoXG4gIG9yZGVySWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPE9yZGVyV2l0aERldGFpbHM+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPixcbik6IFVzZVF1ZXJ5UmVzdWx0PE9yZGVyV2l0aERldGFpbHM+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogb3JkZXJLZXlzLmRldGFpbChvcmRlcklkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxPcmRlcldpdGhEZXRhaWxzPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPE9yZGVyV2l0aERldGFpbHM+PihcbiAgICAgICAgYC9vcmRlcnMvJHtvcmRlcklkfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhXG4gICAgfSxcbiAgICBlbmFibGVkOiAhIW9yZGVySWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgb3JkZXJzIGZvciBhIHNwb3QgKHNlbGxlciB2aWV3KVxuICpcbiAqIEBlbmRwb2ludCBHRVQgL3NlbGxlci9zcG90cy97c3BvdElkfS9vcmRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNwb3RPcmRlcnMoXG4gIHNwb3RJZDogc3RyaW5nLFxuICBwYXJhbXM/OiBPcmRlckZpbHRlcnMsXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZVF1ZXJ5T3B0aW9uczxQYWdpbmF0ZWRSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj4sXG4gICAgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJ1xuICA+LFxuKTogVXNlUXVlcnlSZXN1bHQ8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogb3JkZXJLZXlzLnNwb3RPcmRlcnMoc3BvdElkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KClcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICBpZiAocGFyYW1zPy5zdGF0dXMpIHF1ZXJ5UGFyYW1zLnNldCgnc3RhdHVzJywgcGFyYW1zLnN0YXR1cylcbiAgICAgIGlmIChwYXJhbXM/LmxpbWl0KSBxdWVyeVBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKHBhcmFtcy5saW1pdCkpXG4gICAgICBpZiAocGFyYW1zPy5wYWdlKSBxdWVyeVBhcmFtcy5zZXQoJ3BhZ2UnLCBTdHJpbmcocGFyYW1zLnBhZ2UpKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PFxuICAgICAgICBBcGlSZXNwb25zZTxQYWdpbmF0ZWRSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj5cbiAgICAgID4oYC9zZWxsZXIvc3BvdHMvJHtzcG90SWR9L29yZGVycz8ke3F1ZXJ5UGFyYW1zfWApXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhXG4gICAgfSxcbiAgICBlbmFibGVkOiAhIXNwb3RJZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuIl19
@@ -1,92 +0,0 @@
1
- /**
2
- * Posts Query Hooks
3
- *
4
- * TanStack Query hooks for post/board operations.
5
- */
6
- import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
7
- import { type Post, type PostResponse, type PostStatusDto, type PostUpvotesResponse } from '../types';
8
- export declare const postKeys: {
9
- all: readonly ["posts"];
10
- lists: () => readonly ["posts", "list"];
11
- list: (filters?: Record<string, unknown>) => readonly ["posts", "list", Record<string, unknown> | undefined];
12
- bySpot: (spotId: string, filters?: Record<string, unknown>) => readonly ["posts", "spot", string, Record<string, unknown> | undefined];
13
- details: () => readonly ["posts", "detail"];
14
- detail: (id: string) => readonly ["posts", "detail", string];
15
- responses: (postId: string) => readonly ["posts", "detail", string, "responses"];
16
- status: (postId: string) => readonly ["posts", "detail", string, "status"];
17
- upvotes: (postId: string, filters?: {
18
- limit?: number;
19
- offset?: number;
20
- }) => readonly ["posts", "detail", string, "upvotes", {
21
- limit?: number;
22
- offset?: number;
23
- } | undefined];
24
- };
25
- /**
26
- * Get posts for a spot
27
- *
28
- * @endpoint GET /spots/{spotId}/posts
29
- */
30
- export declare function useSpotPosts(spotId: string, params?: {
31
- postType?: string;
32
- status?: string;
33
- page?: number;
34
- limit?: number;
35
- }, options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>): UseQueryResult<Post[]>;
36
- /**
37
- * Get a single post by ID
38
- *
39
- * @endpoint GET /posts/{postId}
40
- */
41
- export declare function usePost(postId: string, options?: Omit<UseQueryOptions<Post>, 'queryKey' | 'queryFn'>): UseQueryResult<Post>;
42
- /**
43
- * Get responses for a post
44
- *
45
- * @endpoint GET /posts/{postId}/responses
46
- */
47
- export declare function usePostResponses(postId: string, options?: Omit<UseQueryOptions<PostResponse[]>, 'queryKey' | 'queryFn'>): UseQueryResult<PostResponse[]>;
48
- /**
49
- * Get all posts (with filters)
50
- *
51
- * @endpoint GET /posts
52
- */
53
- export declare function usePosts(params?: {
54
- postType?: string;
55
- limit?: number;
56
- }, options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>): UseQueryResult<Post[]>;
57
- /**
58
- * Get user's status for a post (read/hidden/pinned)
59
- *
60
- * @endpoint GET /posts/{postId}/status
61
- */
62
- export declare function usePostStatus(postId: string, options?: Omit<UseQueryOptions<PostStatusDto>, 'queryKey' | 'queryFn'>): UseQueryResult<PostStatusDto>;
63
- /**
64
- * Get upvotes for a post (list of users who upvoted)
65
- *
66
- * @endpoint GET /posts/{postId}/upvotes
67
- */
68
- export declare function usePostUpvotes(postId: string, params?: {
69
- limit?: number;
70
- offset?: number;
71
- }, options?: Omit<UseQueryOptions<PostUpvotesResponse>, 'queryKey' | 'queryFn'>): UseQueryResult<PostUpvotesResponse>;
72
- /**
73
- * Get nearby posts feed
74
- *
75
- * @endpoint GET /posts/feed
76
- */
77
- export declare function usePostsFeed(params: {
78
- lat: number;
79
- lng: number;
80
- radius?: number;
81
- postType?: string;
82
- cursor?: string;
83
- limit?: number;
84
- }, options?: Omit<UseQueryOptions<{
85
- posts: Post[];
86
- hasMore: boolean;
87
- nextCursor?: string;
88
- }>, 'queryKey' | 'queryFn'>): UseQueryResult<{
89
- posts: Post[];
90
- hasMore: boolean;
91
- nextCursor?: string;
92
- }>;
@@ -1,233 +0,0 @@
1
- "use strict";
2
- /**
3
- * Posts Query Hooks
4
- *
5
- * TanStack Query hooks for post/board operations.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.postKeys = void 0;
9
- exports.useSpotPosts = useSpotPosts;
10
- exports.usePost = usePost;
11
- exports.usePostResponses = usePostResponses;
12
- exports.usePosts = usePosts;
13
- exports.usePostStatus = usePostStatus;
14
- exports.usePostUpvotes = usePostUpvotes;
15
- exports.usePostsFeed = usePostsFeed;
16
- const react_query_1 = require("@tanstack/react-query");
17
- const client_1 = require("../client");
18
- // ============================================================================
19
- // HELPER FUNCTIONS
20
- // ============================================================================
21
- /**
22
- * Extract array data from API response
23
- * API returns { success, data: { data: [...], meta: {...} } } or { success, data: [...] }
24
- */
25
- function extractArrayData(data) {
26
- // If already an array, return it
27
- if (Array.isArray(data)) {
28
- return data;
29
- }
30
- // If it's an object with nested data property, extract it
31
- if (data && typeof data === 'object' && 'data' in data) {
32
- const nested = data.data;
33
- if (Array.isArray(nested)) {
34
- return nested;
35
- }
36
- }
37
- return [];
38
- }
39
- /**
40
- * Extract single object data from API response
41
- * API returns { success, data: { data: {...} } } or { success, data: {...} }
42
- */
43
- function extractObjectData(data) {
44
- // If it's an object with nested data property (not an array), extract it
45
- if (data &&
46
- typeof data === 'object' &&
47
- 'data' in data &&
48
- !Array.isArray(data)) {
49
- const nested = data.data;
50
- // Check if nested also has a data property (double-wrapped)
51
- if (nested &&
52
- typeof nested === 'object' &&
53
- 'data' in nested &&
54
- !Array.isArray(nested)) {
55
- return nested.data;
56
- }
57
- return nested;
58
- }
59
- return data;
60
- }
61
- // ============================================================================
62
- // QUERY KEYS
63
- // ============================================================================
64
- exports.postKeys = {
65
- all: ['posts'],
66
- lists: () => [...exports.postKeys.all, 'list'],
67
- list: (filters) => [...exports.postKeys.lists(), filters],
68
- bySpot: (spotId, filters) => [...exports.postKeys.all, 'spot', spotId, filters],
69
- details: () => [...exports.postKeys.all, 'detail'],
70
- detail: (id) => [...exports.postKeys.details(), id],
71
- responses: (postId) => [...exports.postKeys.detail(postId), 'responses'],
72
- status: (postId) => [...exports.postKeys.detail(postId), 'status'],
73
- upvotes: (postId, filters) => [...exports.postKeys.detail(postId), 'upvotes', filters],
74
- };
75
- // ============================================================================
76
- // QUERY HOOKS
77
- // ============================================================================
78
- /**
79
- * Get posts for a spot
80
- *
81
- * @endpoint GET /spots/{spotId}/posts
82
- */
83
- function useSpotPosts(spotId, params, options) {
84
- return (0, react_query_1.useQuery)({
85
- queryKey: exports.postKeys.bySpot(spotId, params),
86
- queryFn: async () => {
87
- const client = (0, client_1.getApiClient)();
88
- const queryParams = new URLSearchParams();
89
- if (params?.postType)
90
- queryParams.set('postType', params.postType);
91
- if (params?.status)
92
- queryParams.set('status', params.status);
93
- if (params?.page)
94
- queryParams.set('page', String(params.page));
95
- if (params?.limit)
96
- queryParams.set('limit', String(params.limit));
97
- const response = await client.get(`/spots/${spotId}/posts?${queryParams}`);
98
- return extractArrayData(response.data.data);
99
- },
100
- enabled: !!spotId,
101
- ...options,
102
- });
103
- }
104
- /**
105
- * Get a single post by ID
106
- *
107
- * @endpoint GET /posts/{postId}
108
- */
109
- function usePost(postId, options) {
110
- return (0, react_query_1.useQuery)({
111
- queryKey: exports.postKeys.detail(postId),
112
- queryFn: async () => {
113
- const client = (0, client_1.getApiClient)();
114
- const response = await client.get(`/posts/${postId}`);
115
- return extractObjectData(response.data.data);
116
- },
117
- enabled: !!postId,
118
- ...options,
119
- });
120
- }
121
- /**
122
- * Get responses for a post
123
- *
124
- * @endpoint GET /posts/{postId}/responses
125
- */
126
- function usePostResponses(postId, options) {
127
- return (0, react_query_1.useQuery)({
128
- queryKey: exports.postKeys.responses(postId),
129
- queryFn: async () => {
130
- const client = (0, client_1.getApiClient)();
131
- const response = await client.get(`/posts/${postId}/responses`);
132
- return extractArrayData(response.data.data);
133
- },
134
- enabled: !!postId,
135
- ...options,
136
- });
137
- }
138
- /**
139
- * Get all posts (with filters)
140
- *
141
- * @endpoint GET /posts
142
- */
143
- function usePosts(params, options) {
144
- return (0, react_query_1.useQuery)({
145
- queryKey: exports.postKeys.list(params),
146
- queryFn: async () => {
147
- const client = (0, client_1.getApiClient)();
148
- const queryParams = new URLSearchParams();
149
- if (params?.postType)
150
- queryParams.set('postType', params.postType);
151
- if (params?.limit)
152
- queryParams.set('limit', String(params.limit));
153
- const response = await client.get(`/posts?${queryParams}`);
154
- return extractArrayData(response.data.data);
155
- },
156
- ...options,
157
- });
158
- }
159
- /**
160
- * Get user's status for a post (read/hidden/pinned)
161
- *
162
- * @endpoint GET /posts/{postId}/status
163
- */
164
- function usePostStatus(postId, options) {
165
- return (0, react_query_1.useQuery)({
166
- queryKey: exports.postKeys.status(postId),
167
- queryFn: async () => {
168
- const client = (0, client_1.getApiClient)();
169
- const response = await client.get(`/posts/${postId}/status`);
170
- return extractObjectData(response.data.data);
171
- },
172
- enabled: !!postId,
173
- ...options,
174
- });
175
- }
176
- /**
177
- * Get upvotes for a post (list of users who upvoted)
178
- *
179
- * @endpoint GET /posts/{postId}/upvotes
180
- */
181
- function usePostUpvotes(postId, params, options) {
182
- return (0, react_query_1.useQuery)({
183
- queryKey: exports.postKeys.upvotes(postId, params),
184
- queryFn: async () => {
185
- const client = (0, client_1.getApiClient)();
186
- const queryParams = new URLSearchParams();
187
- if (params?.limit)
188
- queryParams.set('limit', String(params.limit));
189
- if (params?.offset)
190
- queryParams.set('offset', String(params.offset));
191
- const queryString = queryParams.toString();
192
- const response = await client.get(`/posts/${postId}/upvotes${queryString ? `?${queryString}` : ''}`);
193
- // Response structure: { success, data: { data: [...], meta: {...} } }
194
- return response.data.data;
195
- },
196
- enabled: !!postId,
197
- ...options,
198
- });
199
- }
200
- /**
201
- * Get nearby posts feed
202
- *
203
- * @endpoint GET /posts/feed
204
- */
205
- function usePostsFeed(params, options) {
206
- return (0, react_query_1.useQuery)({
207
- queryKey: [...exports.postKeys.lists(), 'feed', params],
208
- queryFn: async () => {
209
- const client = (0, client_1.getApiClient)();
210
- const queryParams = new URLSearchParams();
211
- queryParams.set('lat', String(params.lat));
212
- queryParams.set('lng', String(params.lng));
213
- if (params.radius)
214
- queryParams.set('radius', String(params.radius));
215
- if (params.postType)
216
- queryParams.set('postType', params.postType);
217
- if (params.cursor)
218
- queryParams.set('cursor', params.cursor);
219
- if (params.limit)
220
- queryParams.set('limit', String(params.limit));
221
- const response = await client.get(`/posts/feed?${queryParams}`);
222
- const data = response.data.data;
223
- return {
224
- posts: data.posts ?? extractArrayData(data),
225
- hasMore: data.hasMore ?? false,
226
- nextCursor: data.nextCursor,
227
- };
228
- },
229
- enabled: params.lat !== 0 && params.lng !== 0,
230
- ...options,
231
- });
232
- }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvcG9zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQWdHSCxvQ0FzQkM7QUFPRCwwQkFnQkM7QUFPRCw0Q0FnQkM7QUFPRCw0QkFrQkM7QUFPRCxzQ0FnQkM7QUFPRCx3Q0FzQkM7QUFPRCxvQ0E0Q0M7QUFsU0QsdURBSThCO0FBRTlCLHNDQUFzQztBQVN0QywrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFJLElBQWE7SUFDeEMsaUNBQWlDO0lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELDBEQUEwRDtJQUMxRCxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sTUFBTSxHQUFJLElBQXdCLENBQUMsSUFBSSxDQUFBO1FBQzdDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUFJLElBQWE7SUFDekMseUVBQXlFO0lBQ3pFLElBQ0UsSUFBSTtRQUNKLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDeEIsTUFBTSxJQUFJLElBQUk7UUFDZCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ3BCLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBSSxJQUF3QixDQUFDLElBQUksQ0FBQTtRQUM3Qyw0REFBNEQ7UUFDNUQsSUFDRSxNQUFN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Q0FFL0IsZUFBZSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1lBRS9CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBQy9CLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksZ0JBQWdCLENBQU8sSUFBSSxDQUFDO2dCQUNqRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLO2dCQUM5QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDNUIsQ0FBQTtRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzdDLEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvc3RzIFF1ZXJ5IEhvb2tzXG4gKlxuICogVGFuU3RhY2sgUXVlcnkgaG9va3MgZm9yIHBvc3QvYm9hcmQgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICB1c2VRdWVyeSxcbiAgdHlwZSBVc2VRdWVyeU9wdGlvbnMsXG4gIHR5cGUgVXNlUXVlcnlSZXN1bHQsXG59IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcblxuaW1wb3J0IHtnZXRBcGlDbGllbnR9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7XG4gIHR5cGUgQXBpUmVzcG9uc2UsXG4gIHR5cGUgUG9zdCxcbiAgdHlwZSBQb3N0UmVzcG9uc2UsXG4gIHR5cGUgUG9zdFN0YXR1c0R0byxcbiAgdHlwZSBQb3N0VXB2b3Rlc1Jlc3BvbnNlLFxufSBmcm9tICcuLi90eXBlcydcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEV4dHJhY3QgYXJyYXkgZGF0YSBmcm9tIEFQSSByZXNwb25zZVxuICogQVBJIHJldHVybnMgeyBzdWNjZXNzLCBkYXRhOiB7IGRhdGE6IFsuLi5dLCBtZXRhOiB7Li4ufSB9IH0gb3IgeyBzdWNjZXNzLCBkYXRhOiBbLi4uXSB9XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RBcnJheURhdGE8VD4oZGF0YTogdW5rbm93bik6IFRbXSB7XG4gIC8vIElmIGFscmVhZHkgYW4gYXJyYXksIHJldHVybiBpdFxuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cbiAgLy8gSWYgaXQncyBhbiBvYmplY3Qgd2l0aCBuZXN0ZWQgZGF0YSBwcm9wZXJ0eSwgZXh0cmFjdCBpdFxuICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRhdGEpIHtcbiAgICBjb25zdCBuZXN0ZWQgPSAoZGF0YSBhcyB7ZGF0YTogdW5rbm93bn0pLmRhdGFcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgICByZXR1cm4gbmVzdGVkXG4gICAgfVxuICB9XG4gIHJldHVybiBbXVxufVxuXG4vKipcbiAqIEV4dHJhY3Qgc2luZ2xlIG9iamVjdCBkYXRhIGZyb20gQVBJIHJlc3BvbnNlXG4gKiBBUEkgcmV0dXJucyB7IHN1Y2Nlc3MsIGRhdGE6IHsgZGF0YTogey4uLn0gfSB9IG9yIHsgc3VjY2VzcywgZGF0YTogey4uLn0gfVxuICovXG5mdW5jdGlvbiBleHRyYWN0T2JqZWN0RGF0YTxUPihkYXRhOiB1bmtub3duKTogVCB7XG4gIC8vIElmIGl0J3MgYW4gb2JqZWN0IHdpdGggbmVzdGVkIGRhdGEgcHJvcGVydHkgKG5vdCBhbiBhcnJheSksIGV4dHJhY3QgaXRcbiAgaWYgKFxuICAgIGRhdGEgJiZcbiAgICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAnZGF0YScgaW4gZGF0YSAmJlxuICAgICFBcnJheS5pc0FycmF5KGRhdGEpXG4gICkge1xuICAgIGNvbnN0IG5lc3RlZCA9IChkYXRhIGFzIHtkYXRhOiB1bmtub3dufSkuZGF0YVxuICAgIC8vIENoZWNrIGlmIG5lc3RlZCBhbHNvIGhhcyBhIGRhdGEgcHJvcGVydHkgKGRvdWJsZS13cmFwcGVkKVxuICAgIGlmIChcbiAgICAgIG5lc3RlZCAmJlxuICAgICAgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdkYXRhJyBpbiBuZXN0ZWQgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KG5lc3RlZClcbiAgICApIHtcbiAgICAgIHJldHVybiAobmVzdGVkIGFzIHtkYXRhOiBUfSkuZGF0YVxuICAgIH1cbiAgICByZXR1cm4gbmVzdGVkIGFzIFRcbiAgfVxuICByZXR1cm4gZGF0YSBhcyBUXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IHBvc3RLZXlzID0ge1xuICBhbGw6IFsncG9zdHMnXSBhcyBjb25zdCxcbiAgbGlzdHM6ICgpID0+IFsuLi5wb3N0S2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+XG4gICAgWy4uLnBvc3RLZXlzLmxpc3RzKCksIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBieVNwb3Q6IChzcG90SWQ6IHN0cmluZywgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PlxuICAgIFsuLi5wb3N0S2V5cy5hbGwsICdzcG90Jywgc3BvdElkLCBmaWx0ZXJzXSBhcyBjb25zdCxcbiAgZGV0YWlsczogKCkgPT4gWy4uLnBvc3RLZXlzLmFsbCwgJ2RldGFpbCddIGFzIGNvbnN0LFxuICBkZXRhaWw6IChpZDogc3RyaW5nKSA9PiBbLi4ucG9zdEtleXMuZGV0YWlscygpLCBpZF0gYXMgY29uc3QsXG4gIHJlc3BvbnNlczogKHBvc3RJZDogc3RyaW5nKSA9PlxuICAgIFsuLi5wb3N0S2V5cy5kZXRhaWwocG9zdElkKSwgJ3Jlc3BvbnNlcyddIGFzIGNvbnN0LFxuICBzdGF0dXM6IChwb3N0SWQ6IHN0cmluZykgPT4gWy4uLnBvc3RLZXlzLmRldGFpbChwb3N0SWQpLCAnc3RhdHVzJ10gYXMgY29uc3QsXG4gIHVwdm90ZXM6IChwb3N0SWQ6IHN0cmluZywgZmlsdGVycz86IHtsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyfSkgPT5cbiAgICBbLi4ucG9zdEtleXMuZGV0YWlsKHBvc3RJZCksICd1cHZvdGVzJywgZmlsdGVyc10gYXMgY29uc3QsXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IHBvc3RzIGZvciBhIHNwb3RcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9zcG90cy97c3BvdElkfS9wb3N0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3BvdFBvc3RzKFxuICBzcG90SWQ6IHN0cmluZyxcbiAgcGFyYW1zPzoge3Bvc3RUeXBlPzogc3RyaW5nOyBzdGF0dXM/OiBzdHJpbmc7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyfSxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFBvc3RbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+LFxuKTogVXNlUXVlcnlSZXN1bHQ8UG9zdFtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHBvc3RLZXlzLmJ5U3BvdChzcG90SWQsIHBhcmFtcyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8UG9zdFtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgIGlmIChwYXJhbXM/LnBvc3RUeXBlKSBxdWVyeVBhcmFtcy5zZXQoJ3Bvc3RUeXBlJywgcGFyYW1zLnBvc3RUeXBlKVxuICAgICAgaWYgKHBhcmFtcz8uc3RhdHVzKSBxdWVyeVBhcmFtcy5zZXQoJ3N0YXR1cycsIHBhcmFtcy5zdGF0dXMpXG4gICAgICBpZiAocGFyYW1zPy5wYWdlKSBxdWVyeVBhcmFtcy5zZXQoJ3BhZ2UnLCBTdHJpbmcocGFyYW1zLnBhZ2UpKVxuICAgICAgaWYgKHBhcmFtcz8ubGltaXQpIHF1ZXJ5UGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcocGFyYW1zLmxpbWl0KSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTx1bmtub3duPj4oXG4gICAgICAgIGAvc3BvdHMvJHtzcG90SWR9L3Bvc3RzPyR7cXVlcnlQYXJhbXN9YCxcbiAgICAgIClcbiAgICAgIHJldHVybiBleHRyYWN0QXJyYXlEYXRhPFBvc3Q+KHJlc3BvbnNlLmRhdGEuZGF0YSlcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhc3BvdElkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIHBvc3QgYnkgSURcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9wb3N0cy97cG9zdElkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUG9zdChcbiAgcG9zdElkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQb3N0PiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz4sXG4pOiBVc2VRdWVyeVJlc3VsdDxQb3N0PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHBvc3RLZXlzLmRldGFpbChwb3N0SWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFBvc3Q+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8dW5rbm93bj4+KFxuICAgICAgICBgL3Bvc3RzLyR7cG9zdElkfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gZXh0cmFjdE9iamVjdERhdGE8UG9zdD4ocmVzcG9uc2UuZGF0YS5kYXRhKVxuICAgIH0sXG4gICAgZW5hYmxlZDogISFwb3N0SWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgcmVzcG9uc2VzIGZvciBhIHBvc3RcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9wb3N0cy97cG9zdElkfS9yZXNwb25zZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBvc3RSZXNwb25zZXMoXG4gIHBvc3RJZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UG9zdFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPixcbik6IFVzZVF1ZXJ5UmVzdWx0PFBvc3RSZXNwb25zZVtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHBvc3RLZXlzLnJlc3BvbnNlcyhwb3N0SWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFBvc3RSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPHVua25vd24+PihcbiAgICAgICAgYC9wb3N0cy8ke3Bvc3RJZH0vcmVzcG9uc2VzYCxcbiAgICAgIClcbiAgICAgIHJldHVybiBleHRyYWN0QXJyYXlEYXRhPFBvc3RSZXNwb25zZT4ocmVzcG9uc2UuZGF0YS5kYXRhKVxuICAgIH0sXG4gICAgZW5hYmxlZDogISFwb3N0SWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgYWxsIHBvc3RzICh3aXRoIGZpbHRlcnMpXG4gKlxuICogQGVuZHBvaW50IEdFVCAvcG9zdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBvc3RzKFxuICBwYXJhbXM/OiB7cG9zdFR5cGU/OiBzdHJpbmc7IGxpbWl0PzogbnVtYmVyfSxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFBvc3RbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+LFxuKTogVXNlUXVlcnlSZXN1bHQ8UG9zdFtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHBvc3RLZXlzLmxpc3QocGFyYW1zKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQb3N0W10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgaWYgKHBhcmFtcz8ucG9zdFR5cGUpIHF1ZXJ5UGFyYW1zLnNldCgncG9zdFR5cGUnLCBwYXJhbXMucG9zdFR5cGUpXG4gICAgICBpZiAocGFyYW1zPy5saW1pdCkgcXVlcnlQYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhwYXJhbXMubGltaXQpKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPHVua25vd24+PihcbiAgICAgICAgYC9wb3N0cz8ke3F1ZXJ5UGFyYW1zfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gZXh0cmFjdEFycmF5RGF0YTxQb3N0PihyZXNwb25zZS5kYXRhLmRhdGEpXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEdldCB1c2VyJ3Mgc3RhdHVzIGZvciBhIHBvc3QgKHJlYWQvaGlkZGVuL3Bpbm5lZClcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9wb3N0cy97cG9zdElkfS9zdGF0dXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBvc3RTdGF0dXMoXG4gIHBvc3RJZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UG9zdFN0YXR1c0R0bz4sICdxdWVyeUtleScgfCAncXVlcnlGbic+LFxuKTogVXNlUXVlcnlSZXN1bHQ8UG9zdFN0YXR1c0R0bz4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBwb3N0S2V5cy5zdGF0dXMocG9zdElkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQb3N0U3RhdHVzRHRvPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPHVua25vd24+PihcbiAgICAgICAgYC9wb3N0cy8ke3Bvc3RJZH0vc3RhdHVzYCxcbiAgICAgIClcbiAgICAgIHJldHVybiBleHRyYWN0T2JqZWN0RGF0YTxQb3N0U3RhdHVzRHRvPihyZXNwb25zZS5kYXRhLmRhdGEpXG4gICAgfSxcbiAgICBlbmFibGVkOiAhIXBvc3RJZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEdldCB1cHZvdGVzIGZvciBhIHBvc3QgKGxpc3Qgb2YgdXNlcnMgd2hvIHVwdm90ZWQpXG4gKlxuICogQGVuZHBvaW50IEdFVCAvcG9zdHMve3Bvc3RJZH0vdXB2b3Rlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUG9zdFVwdm90ZXMoXG4gIHBvc3RJZDogc3RyaW5nLFxuICBwYXJhbXM/OiB7bGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlcn0sXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQb3N0VXB2b3Rlc1Jlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz4sXG4pOiBVc2VRdWVyeVJlc3VsdDxQb3N0VXB2b3Rlc1Jlc3BvbnNlPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHBvc3RLZXlzLnVwdm90ZXMocG9zdElkLCBwYXJhbXMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFBvc3RVcHZvdGVzUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgaWYgKHBhcmFtcz8ubGltaXQpIHF1ZXJ5UGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcocGFyYW1zLmxpbWl0KSlcbiAgICAgIGlmIChwYXJhbXM/Lm9mZnNldCkgcXVlcnlQYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcocGFyYW1zLm9mZnNldCkpXG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxQb3N0VXB2b3Rlc1Jlc3BvbnNlPj4oXG4gICAgICAgIGAvcG9zdHMvJHtwb3N0SWR9L3Vwdm90ZXMke3F1ZXJ5U3RyaW5nID8gYD8ke3F1ZXJ5U3RyaW5nfWAgOiAnJ31gLFxuICAgICAgKVxuICAgICAgLy8gUmVzcG9uc2Ugc3RydWN0dXJlOiB7IHN1Y2Nlc3MsIGRhdGE6IHsgZGF0YTogWy4uLl0sIG1ldGE6IHsuLi59IH0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YVxuICAgIH0sXG4gICAgZW5hYmxlZDogISFwb3N0SWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgbmVhcmJ5IHBvc3RzIGZlZWRcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9wb3N0cy9mZWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQb3N0c0ZlZWQoXG4gIHBhcmFtczoge1xuICAgIGxhdDogbnVtYmVyXG4gICAgbG5nOiBudW1iZXJcbiAgICByYWRpdXM/OiBudW1iZXJcbiAgICBwb3N0VHlwZT86IHN0cmluZ1xuICAgIGN1cnNvcj86IHN0cmluZ1xuICAgIGxpbWl0PzogbnVtYmVyXG4gIH0sXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZVF1ZXJ5T3B0aW9uczx7cG9zdHM6IFBvc3RbXTsgaGFzTW9yZTogYm9vbGVhbjsgbmV4dEN1cnNvcj86IHN0cmluZ30+LFxuICAgICdxdWVyeUtleScgfCAncXVlcnlGbidcbiAgPixcbik6IFVzZVF1ZXJ5UmVzdWx0PHtwb3N0czogUG9zdFtdOyBoYXNNb3JlOiBib29sZWFuOyBuZXh0Q3Vyc29yPzogc3RyaW5nfT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbLi4ucG9zdEtleXMubGlzdHMoKSwgJ2ZlZWQnLCBwYXJhbXNdIGFzIGNvbnN0LFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPHtcbiAgICAgIHBvc3RzOiBQb3N0W11cbiAgICAgIGhhc01vcmU6IGJvb2xlYW5cbiAgICAgIG5leHRDdXJzb3I/OiBzdHJpbmdcbiAgICB9PiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKVxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgIHF1ZXJ5UGFyYW1zLnNldCgnbGF0JywgU3RyaW5nKHBhcmFtcy5sYXQpKVxuICAgICAgcXVlcnlQYXJhbXMuc2V0KCdsbmcnLCBTdHJpbmcocGFyYW1zLmxuZykpXG4gICAgICBpZiAocGFyYW1zLnJhZGl1cykgcXVlcnlQYXJhbXMuc2V0KCdyYWRpdXMnLCBTdHJpbmcocGFyYW1zLnJhZGl1cykpXG4gICAgICBpZiAocGFyYW1zLnBvc3RUeXBlKSBxdWVyeVBhcmFtcy5zZXQoJ3Bvc3RUeXBlJywgcGFyYW1zLnBvc3RUeXBlKVxuICAgICAgaWYgKHBhcmFtcy5jdXJzb3IpIHF1ZXJ5UGFyYW1zLnNldCgnY3Vyc29yJywgcGFyYW1zLmN1cnNvcilcbiAgICAgIGlmIChwYXJhbXMubGltaXQpIHF1ZXJ5UGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcocGFyYW1zLmxpbWl0KSlcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PFxuICAgICAgICBBcGlSZXNwb25zZTx7cG9zdHM6IFBvc3RbXTsgaGFzTW9yZTogYm9vbGVhbjsgbmV4dEN1cnNvcj86IHN0cmluZ30+XG4gICAgICA+KGAvcG9zdHMvZmVlZD8ke3F1ZXJ5UGFyYW1zfWApXG5cbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhLmRhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvc3RzOiBkYXRhLnBvc3RzID8/IGV4dHJhY3RBcnJheURhdGE8UG9zdD4oZGF0YSksXG4gICAgICAgIGhhc01vcmU6IGRhdGEuaGFzTW9yZSA/PyBmYWxzZSxcbiAgICAgICAgbmV4dEN1cnNvcjogZGF0YS5uZXh0Q3Vyc29yLFxuICAgICAgfVxuICAgIH0sXG4gICAgZW5hYmxlZDogcGFyYW1zLmxhdCAhPT0gMCAmJiBwYXJhbXMubG5nICE9PSAwLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG4iXX0=
@@ -1,48 +0,0 @@
1
- /**
2
- * Products Query Hooks
3
- *
4
- * TanStack Query hooks for product-related operations.
5
- */
6
- import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
7
- import type { Product, PaginatedResponse, ProductType, ProductStatus, Spot } from '../types';
8
- export declare const productKeys: {
9
- all: readonly ["products"];
10
- lists: () => readonly ["products", "list"];
11
- list: (filters?: Record<string, unknown>) => readonly ["products", "list", Record<string, unknown> | undefined];
12
- details: () => readonly ["products", "detail"];
13
- detail: (id: string) => readonly ["products", "detail", string];
14
- bySlug: (spotId: string, slug: string) => readonly ["products", "slug", string, string];
15
- bySpot: (spotId: string) => readonly ["products", "spot", string];
16
- };
17
- export interface ProductFilters {
18
- spotId?: string;
19
- type?: ProductType;
20
- status?: ProductStatus;
21
- limit?: number;
22
- page?: number;
23
- }
24
- export interface ProductWithSpot extends Product {
25
- spot: Pick<Spot, 'id' | 'name' | 'slug'>;
26
- }
27
- /**
28
- * Get products for a spot (public browse)
29
- *
30
- * @endpoint GET /spots/{spotId}/products
31
- */
32
- export declare function useSpotProducts(spotId: string, params?: {
33
- type?: ProductType;
34
- limit?: number;
35
- page?: number;
36
- }, options?: Omit<UseQueryOptions<PaginatedResponse<Product>>, 'queryKey' | 'queryFn'>): UseQueryResult<PaginatedResponse<Product>>;
37
- /**
38
- * Get a product by ID
39
- *
40
- * @endpoint GET /products/{productId}
41
- */
42
- export declare function useProduct(productId: string, options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>): UseQueryResult<ProductWithSpot>;
43
- /**
44
- * Get a product by slug (within a spot)
45
- *
46
- * @endpoint GET /spots/{spotId}/products/slug/{slug}
47
- */
48
- export declare function useProductBySlug(spotId: string, slug: string, options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>): UseQueryResult<ProductWithSpot>;