@growsober/sdk 1.0.5 → 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/__tests__/e2e.test.d.ts +30 -0
- package/dist/__tests__/e2e.test.js +959 -63
- package/dist/api/mutations/badges.d.ts +116 -0
- package/dist/api/mutations/badges.js +177 -0
- package/dist/api/mutations/brands.d.ts +251 -0
- package/dist/api/mutations/brands.js +242 -0
- package/dist/api/mutations/creators.d.ts +131 -0
- package/dist/api/mutations/creators.js +129 -0
- package/dist/api/mutations/event-chat.d.ts +2 -2
- package/dist/api/mutations/event-chat.js +9 -9
- package/dist/api/mutations/index.d.ts +4 -0
- package/dist/api/mutations/index.js +5 -1
- package/dist/api/mutations/jack.d.ts +29 -0
- package/dist/api/mutations/jack.js +41 -1
- package/dist/api/mutations/products.d.ts +175 -0
- package/dist/api/mutations/products.js +226 -0
- package/dist/api/mutations/support.d.ts +20 -1
- package/dist/api/mutations/support.js +36 -1
- package/dist/api/queries/badges.d.ts +221 -0
- package/dist/api/queries/badges.js +290 -0
- package/dist/api/queries/bookings.d.ts +1 -1
- package/dist/api/queries/brands.d.ts +248 -0
- package/dist/api/queries/brands.js +226 -0
- package/dist/api/queries/businesses.d.ts +61 -1
- package/dist/api/queries/businesses.js +27 -1
- package/dist/api/queries/creators.d.ts +332 -0
- package/dist/api/queries/creators.js +249 -0
- package/dist/api/queries/event-chat.d.ts +1 -1
- package/dist/api/queries/event-chat.js +4 -4
- package/dist/api/queries/events.d.ts +45 -0
- package/dist/api/queries/index.d.ts +5 -0
- package/dist/api/queries/index.js +6 -1
- package/dist/api/queries/jack.d.ts +80 -0
- package/dist/api/queries/jack.js +98 -1
- package/dist/api/queries/library.d.ts +8 -0
- package/dist/api/queries/products.d.ts +185 -0
- package/dist/api/queries/products.js +203 -0
- package/dist/api/queries/support.d.ts +46 -1
- package/dist/api/queries/support.js +48 -1
- package/dist/api/queries/venues.d.ts +304 -0
- package/dist/api/queries/venues.js +211 -0
- package/dist/api/types.d.ts +245 -0
- package/dist/api/types.js +6 -1
- package/dist/api/utils/eventGrouping.d.ts +104 -0
- package/dist/api/utils/eventGrouping.js +155 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/package.json +5 -2
- package/src/__tests__/e2e.test.ts +996 -64
- package/src/api/mutations/badges.ts +228 -0
- package/src/api/mutations/brands.ts +376 -0
- package/src/api/mutations/creators.ts +171 -0
- package/src/api/mutations/event-chat.ts +8 -8
- package/src/api/mutations/index.ts +4 -0
- package/src/api/mutations/jack.ts +50 -1
- package/src/api/mutations/products.ts +336 -0
- package/src/api/mutations/support.ts +44 -0
- package/src/api/queries/badges.ts +385 -0
- package/src/api/queries/brands.ts +281 -0
- package/src/api/queries/businesses.ts +30 -1
- package/src/api/queries/creators.ts +308 -0
- package/src/api/queries/event-chat.ts +3 -3
- package/src/api/queries/index.ts +5 -0
- package/src/api/queries/jack.ts +139 -1
- package/src/api/queries/products.ts +312 -0
- package/src/api/queries/support.ts +54 -0
- package/src/api/queries/venues.ts +271 -0
- package/src/api/types.ts +317 -1
- package/src/api/utils/eventGrouping.ts +181 -0
- package/src/index.ts +6 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { UseMutationOptions } from '@tanstack/react-query';
|
|
2
|
+
import type { PartnerRewardResponse, PartnerRewardRedemptionResponse, CreatePartnerRewardRequest } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Redeem a partner reward
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const redeemReward = useRedeemReward();
|
|
9
|
+
*
|
|
10
|
+
* const handleRedeem = async (rewardId: string) => {
|
|
11
|
+
* await redeemReward.mutateAsync(rewardId);
|
|
12
|
+
* // Show success message
|
|
13
|
+
* };
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function useRedeemReward(options?: Omit<UseMutationOptions<PartnerRewardRedemptionResponse, Error, string>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<PartnerRewardRedemptionResponse, Error, string, unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Create a partner reward (for business dashboard)
|
|
19
|
+
*
|
|
20
|
+
* @param businessId - Business ID creating the reward
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* const createReward = useCreatePartnerReward('business-123');
|
|
25
|
+
*
|
|
26
|
+
* const handleCreate = async () => {
|
|
27
|
+
* await createReward.mutateAsync({
|
|
28
|
+
* badgeId: 'badge-week-warrior',
|
|
29
|
+
* title: 'Free Coffee',
|
|
30
|
+
* description: 'Show your badge for a free coffee',
|
|
31
|
+
* });
|
|
32
|
+
* };
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function useCreatePartnerReward(businessId: string, options?: Omit<UseMutationOptions<PartnerRewardResponse, Error, CreatePartnerRewardRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<PartnerRewardResponse, Error, CreatePartnerRewardRequest, unknown>;
|
|
36
|
+
interface CreateRewardRequest {
|
|
37
|
+
badgeId: string;
|
|
38
|
+
title: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
code?: string;
|
|
41
|
+
redeemType?: 'IN_PERSON' | 'ONLINE' | 'BOTH';
|
|
42
|
+
maxRedemptions?: number;
|
|
43
|
+
perUserLimit?: number;
|
|
44
|
+
validFrom?: string;
|
|
45
|
+
validUntil?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a reward for a venue
|
|
49
|
+
*
|
|
50
|
+
* @param venueId - Venue ID
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* const createReward = useCreateVenueReward('venue-123');
|
|
55
|
+
*
|
|
56
|
+
* const handleCreate = async () => {
|
|
57
|
+
* await createReward.mutateAsync({
|
|
58
|
+
* badgeId: 'badge-week-warrior',
|
|
59
|
+
* title: 'Free Coffee',
|
|
60
|
+
* description: 'Show your badge for a free coffee',
|
|
61
|
+
* redeemType: 'IN_PERSON',
|
|
62
|
+
* });
|
|
63
|
+
* };
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function useCreateVenueReward(venueId: string, options?: Omit<UseMutationOptions<unknown, Error, CreateRewardRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<unknown, Error, CreateRewardRequest, unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* Create a reward for a brand
|
|
69
|
+
*
|
|
70
|
+
* @param brandId - Brand ID
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```tsx
|
|
74
|
+
* const createReward = useCreateBrandReward('brand-123');
|
|
75
|
+
*
|
|
76
|
+
* const handleCreate = async () => {
|
|
77
|
+
* await createReward.mutateAsync({
|
|
78
|
+
* badgeId: 'badge-week-warrior',
|
|
79
|
+
* title: '10% Off',
|
|
80
|
+
* description: 'Use code at checkout',
|
|
81
|
+
* code: 'SOBER10',
|
|
82
|
+
* redeemType: 'ONLINE',
|
|
83
|
+
* });
|
|
84
|
+
* };
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function useCreateBrandReward(brandId: string, options?: Omit<UseMutationOptions<unknown, Error, CreateRewardRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<unknown, Error, CreateRewardRequest, unknown>;
|
|
88
|
+
/**
|
|
89
|
+
* Update a partner reward (for business dashboard)
|
|
90
|
+
*
|
|
91
|
+
* @param businessId - Business ID
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```tsx
|
|
95
|
+
* const updateReward = useUpdatePartnerReward('business-123');
|
|
96
|
+
*
|
|
97
|
+
* const handleUpdate = async (rewardId: string) => {
|
|
98
|
+
* await updateReward.mutateAsync({
|
|
99
|
+
* id: rewardId,
|
|
100
|
+
* data: { title: 'Updated Title', isActive: false },
|
|
101
|
+
* });
|
|
102
|
+
* };
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function useUpdatePartnerReward(businessId: string, options?: Omit<UseMutationOptions<PartnerRewardResponse, Error, {
|
|
106
|
+
id: string;
|
|
107
|
+
data: Partial<CreatePartnerRewardRequest & {
|
|
108
|
+
isActive: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<PartnerRewardResponse, Error, {
|
|
111
|
+
id: string;
|
|
112
|
+
data: Partial<CreatePartnerRewardRequest & {
|
|
113
|
+
isActive: boolean;
|
|
114
|
+
}>;
|
|
115
|
+
}, unknown>;
|
|
116
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useRedeemReward = useRedeemReward;
|
|
4
|
+
exports.useCreatePartnerReward = useCreatePartnerReward;
|
|
5
|
+
exports.useCreateVenueReward = useCreateVenueReward;
|
|
6
|
+
exports.useCreateBrandReward = useCreateBrandReward;
|
|
7
|
+
exports.useUpdatePartnerReward = useUpdatePartnerReward;
|
|
8
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const badges_1 = require("../queries/badges");
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// REWARD MUTATION HOOKS
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Redeem a partner reward
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const redeemReward = useRedeemReward();
|
|
20
|
+
*
|
|
21
|
+
* const handleRedeem = async (rewardId: string) => {
|
|
22
|
+
* await redeemReward.mutateAsync(rewardId);
|
|
23
|
+
* // Show success message
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function useRedeemReward(options) {
|
|
28
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
29
|
+
return (0, react_query_1.useMutation)({
|
|
30
|
+
mutationFn: async (rewardId) => {
|
|
31
|
+
const client = (0, client_1.getApiClient)();
|
|
32
|
+
const response = await client.post(`/api/v1/rewards/${rewardId}/redeem`);
|
|
33
|
+
return response.data?.data || response.data;
|
|
34
|
+
},
|
|
35
|
+
onSuccess: () => {
|
|
36
|
+
// Invalidate wallet, available and redeemed rewards
|
|
37
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.wallet() });
|
|
38
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.available() });
|
|
39
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.redeemed() });
|
|
40
|
+
},
|
|
41
|
+
...options,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a partner reward (for business dashboard)
|
|
46
|
+
*
|
|
47
|
+
* @param businessId - Business ID creating the reward
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* const createReward = useCreatePartnerReward('business-123');
|
|
52
|
+
*
|
|
53
|
+
* const handleCreate = async () => {
|
|
54
|
+
* await createReward.mutateAsync({
|
|
55
|
+
* badgeId: 'badge-week-warrior',
|
|
56
|
+
* title: 'Free Coffee',
|
|
57
|
+
* description: 'Show your badge for a free coffee',
|
|
58
|
+
* });
|
|
59
|
+
* };
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function useCreatePartnerReward(businessId, options) {
|
|
63
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
64
|
+
return (0, react_query_1.useMutation)({
|
|
65
|
+
mutationFn: async (data) => {
|
|
66
|
+
const client = (0, client_1.getApiClient)();
|
|
67
|
+
const response = await client.post(`/api/v1/businesses/${businessId}/rewards`, data);
|
|
68
|
+
return response.data?.data || response.data;
|
|
69
|
+
},
|
|
70
|
+
onSuccess: () => {
|
|
71
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.forBusiness(businessId) });
|
|
72
|
+
},
|
|
73
|
+
...options,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create a reward for a venue
|
|
78
|
+
*
|
|
79
|
+
* @param venueId - Venue ID
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const createReward = useCreateVenueReward('venue-123');
|
|
84
|
+
*
|
|
85
|
+
* const handleCreate = async () => {
|
|
86
|
+
* await createReward.mutateAsync({
|
|
87
|
+
* badgeId: 'badge-week-warrior',
|
|
88
|
+
* title: 'Free Coffee',
|
|
89
|
+
* description: 'Show your badge for a free coffee',
|
|
90
|
+
* redeemType: 'IN_PERSON',
|
|
91
|
+
* });
|
|
92
|
+
* };
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
function useCreateVenueReward(venueId, options) {
|
|
96
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
97
|
+
return (0, react_query_1.useMutation)({
|
|
98
|
+
mutationFn: async (data) => {
|
|
99
|
+
const client = (0, client_1.getApiClient)();
|
|
100
|
+
const response = await client.post(`/api/v1/venues/${venueId}/rewards`, data);
|
|
101
|
+
return response.data?.data || response.data;
|
|
102
|
+
},
|
|
103
|
+
onSuccess: () => {
|
|
104
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.forVenue(venueId) });
|
|
105
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.available() });
|
|
106
|
+
},
|
|
107
|
+
...options,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a reward for a brand
|
|
112
|
+
*
|
|
113
|
+
* @param brandId - Brand ID
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```tsx
|
|
117
|
+
* const createReward = useCreateBrandReward('brand-123');
|
|
118
|
+
*
|
|
119
|
+
* const handleCreate = async () => {
|
|
120
|
+
* await createReward.mutateAsync({
|
|
121
|
+
* badgeId: 'badge-week-warrior',
|
|
122
|
+
* title: '10% Off',
|
|
123
|
+
* description: 'Use code at checkout',
|
|
124
|
+
* code: 'SOBER10',
|
|
125
|
+
* redeemType: 'ONLINE',
|
|
126
|
+
* });
|
|
127
|
+
* };
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
function useCreateBrandReward(brandId, options) {
|
|
131
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
132
|
+
return (0, react_query_1.useMutation)({
|
|
133
|
+
mutationFn: async (data) => {
|
|
134
|
+
const client = (0, client_1.getApiClient)();
|
|
135
|
+
const response = await client.post(`/api/v1/brands/${brandId}/rewards`, data);
|
|
136
|
+
return response.data?.data || response.data;
|
|
137
|
+
},
|
|
138
|
+
onSuccess: () => {
|
|
139
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.forBrand(brandId) });
|
|
140
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.available() });
|
|
141
|
+
},
|
|
142
|
+
...options,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Update a partner reward (for business dashboard)
|
|
147
|
+
*
|
|
148
|
+
* @param businessId - Business ID
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```tsx
|
|
152
|
+
* const updateReward = useUpdatePartnerReward('business-123');
|
|
153
|
+
*
|
|
154
|
+
* const handleUpdate = async (rewardId: string) => {
|
|
155
|
+
* await updateReward.mutateAsync({
|
|
156
|
+
* id: rewardId,
|
|
157
|
+
* data: { title: 'Updated Title', isActive: false },
|
|
158
|
+
* });
|
|
159
|
+
* };
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
function useUpdatePartnerReward(businessId, options) {
|
|
163
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
164
|
+
return (0, react_query_1.useMutation)({
|
|
165
|
+
mutationFn: async ({ id, data, }) => {
|
|
166
|
+
const client = (0, client_1.getApiClient)();
|
|
167
|
+
const response = await client.patch(`/api/v1/businesses/${businessId}/rewards/${id}`, data);
|
|
168
|
+
return response.data?.data || response.data;
|
|
169
|
+
},
|
|
170
|
+
onSuccess: () => {
|
|
171
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.forBusiness(businessId) });
|
|
172
|
+
queryClient.invalidateQueries({ queryKey: badges_1.rewardKeys.available() });
|
|
173
|
+
},
|
|
174
|
+
...options,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9tdXRhdGlvbnMvYmFkZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLDBDQW1CQztBQW9CRCx3REFpQkM7QUFxQ0Qsb0RBa0JDO0FBc0JELG9EQWtCQztBQW1CRCx3REErQkM7QUFuT0QsdURBQXdGO0FBQ3hGLHNDQUF5QztBQUN6Qyw4Q0FBMEQ7QUFPMUQsK0VBQStFO0FBQy9FLHdCQUF3QjtBQUN4QiwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixPQUFnRztJQUVoRyxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQTRDLEVBQUU7WUFDL0UsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixRQUFRLFNBQVMsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5QyxDQUFDO1FBQ0QsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNkLG9EQUFvRDtZQUNwRCxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLG1CQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxtQkFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFD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Q1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLFVBQWtCLEVBQ2xCLE9BT0M7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQ2pCLEVBQUUsRUFDRixJQUFJLEdBSUwsRUFBa0MsRUFBRTtZQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDZCxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxtQkFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCwgVXNlTXV0YXRpb25PcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGdldEFwaUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgeyBiYWRnZUtleXMsIHJld2FyZEtleXMgfSBmcm9tICcuLi9xdWVyaWVzL2JhZGdlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhcnRuZXJSZXdhcmRSZXNwb25zZSxcbiAgUGFydG5lclJld2FyZFJlZGVtcHRpb25SZXNwb25zZSxcbiAgQ3JlYXRlUGFydG5lclJld2FyZFJlcXVlc3QsXG59IGZyb20gJy4uL3R5cGVzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVXQVJEIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVkZWVtIGEgcGFydG5lciByZXdhcmRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCByZWRlZW1SZXdhcmQgPSB1c2VSZWRlZW1SZXdhcmQoKTtcbiAqXG4gKiBjb25zdCBoYW5kbGVSZWRlZW0gPSBhc3luYyAocmV3YXJkSWQ6IHN0cmluZykgPT4ge1xuICogICBhd2FpdCByZWRlZW1SZXdhcmQubXV0YXRlQXN5bmMocmV3YXJkSWQpO1xuICogICAvLyBTaG93IHN1Y2Nlc3MgbWVzc2FnZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkZWVtUmV3YXJkKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8UGFydG5lclJld2FyZFJlZGVtcHRpb25SZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sICdtdXRhdGlvbkZuJz5cbikge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAocmV3YXJkSWQ6IHN0cmluZyk6IFByb21pc2U8UGFydG5lclJld2FyZFJlZGVtcHRpb25SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvYXBpL3YxL3Jld2FyZHMvJHtyZXdhcmRJZH0vcmVkZWVtYCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIHdhbGxldCwgYXZhaWxhYmxlIGFuZCByZWRlZW1lZCByZXdhcmRzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiByZXdhcmRLZXlzLndhbGxldCgpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogcmV3YXJkS2V5cy5hdmFpbGFibGUoKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHJld2FyZEtleXMucmVkZWVtZWQoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBhcnRuZXIgcmV3YXJkIChmb3IgYnVzaW5lc3MgZGFzaGJvYXJkKVxuICpcbiAqIEBwYXJhbSBidXNpbmVzc0lkIC0gQnVzaW5lc3MgSUQgY3JlYXRpbmcgdGhlIHJld2FyZFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IGNyZWF0ZVJld2FyZCA9IHVzZUNyZWF0ZVBhcnRuZXJSZXdhcmQoJ2J1c2luZXNzLTEyMycpO1xuICpcbiAqIGNvbnN0IGhhbmRsZUNyZWF0ZSA9IGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY3JlYXRlUmV3YXJkLm11dGF0ZUFzeW5jKHtcbiAqICAgICBiYWRnZUlkOiAnYmFkZ2Utd2Vlay13YXJyaW9yJyxcbiAqICAgICB0aXRsZTogJ0ZyZWUgQ29mZmVlJyxcbiAqICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgeW91ciBiYWRnZSBmb3IgYSBmcmVlIGNvZmZlZScsXG4gKiAgIH0pO1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ3JlYXRlUGFydG5lclJld2FyZChcbiAgYnVzaW5lc3NJZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8UGFydG5lclJld2FyZFJlc3BvbnNlLCBFcnJvciwgQ3JlYXRlUGFydG5lclJld2FyZFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pIHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IENyZWF0ZVBhcnRuZXJSZXdhcmRSZXF1ZXN0KTogUHJvbWlzZTxQYXJ0bmVyUmV3YXJkUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL2FwaS92MS9idXNpbmVzc2VzLyR7YnVzaW5lc3NJZH0vcmV3YXJkc2AsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogcmV3YXJkS2V5cy5mb3JCdXNpbmVzcyhidXNpbmVzc0lkKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFJFV0FSRCBNVVRBVElPTlMgKFZlbnVlICYgQnJhbmQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBDcmVhdGVSZXdhcmRSZXF1ZXN0IHtcbiAgYmFkZ2VJZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgcmVkZWVtVHlwZT86ICdJTl9QRVJTT04nIHwgJ09OTElORScgfCAnQk9USCc7XG4gIG1heFJlZGVtcHRpb25zPzogbnVtYmVyO1xuICBwZXJVc2VyTGltaXQ/OiBudW1iZXI7XG4gIHZhbGlkRnJvbT86IHN0cmluZztcbiAgdmFsaWRVbnRpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZXdhcmQgZm9yIGEgdmVudWVcbiAqXG4gKiBAcGFyYW0gdmVudWVJZCAtIFZlbnVlIElEXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgY3JlYXRlUmV3YXJkID0gdXNlQ3JlYXRlVmVudWVSZXdhcmQoJ3ZlbnVlLTEyMycpO1xuICpcbiAqIGNvbnN0IGhhbmRsZUNyZWF0ZSA9IGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY3JlYXRlUmV3YXJkLm11dGF0ZUFzeW5jKHtcbiAqICAgICBiYWRnZUlkOiAnYmFkZ2Utd2Vlay13YXJyaW9yJyxcbiAqICAgICB0aXRsZTogJ0ZyZWUgQ29mZmVlJyxcbiAqICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgeW91ciBiYWRnZSBmb3IgYSBmcmVlIGNvZmZlZScsXG4gKiAgICAgcmVkZWVtVHlwZTogJ0lOX1BFUlNPTicsXG4gKiAgIH0pO1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ3JlYXRlVmVudWVSZXdhcmQoXG4gIHZlbnVlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPHVua25vd24sIEVycm9yLCBDcmVhdGVSZXdhcmRSZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKSB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBDcmVhdGVSZXdhcmRSZXF1ZXN0KSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoYC9hcGkvdjEvdmVudWVzLyR7dmVudWVJZH0vcmV3YXJkc2AsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogcmV3YXJkS2V5cy5mb3JWZW51ZSh2ZW51ZUlkKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHJld2FyZEtleXMuYXZhaWxhYmxlKCkgfSk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZXdhcmQgZm9yIGEgYnJhbmRcbiAqXG4gKiBAcGFyYW0gYnJhbmRJZCAtIEJyYW5kIElEXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgY3JlYXRlUmV3YXJkID0gdXNlQ3JlYXRlQnJhbmRSZXdhcmQoJ2JyYW5kLTEyMycpO1xuICpcbiAqIGNvbnN0IGhhbmRsZUNyZWF0ZSA9IGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY3JlYXRlUmV3YXJkLm11dGF0ZUFzeW5jKHtcbiAqICAgICBiYWRnZUlkOiAnYmFkZ2Utd2Vlay13YXJyaW9yJyxcbiAqICAgICB0aXRsZTogJzEwJSBPZmYnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnVXNlIGNvZGUgYXQgY2hlY2tvdXQnLFxuICogICAgIGNvZGU6ICdTT0JFUjEwJyxcbiAqICAgICByZWRlZW1UeXBlOiAnT05MSU5FJyxcbiAqICAgfSk7XG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVCcmFuZFJld2FyZChcbiAgYnJhbmRJZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8dW5rbm93biwgRXJyb3IsIENyZWF0ZVJld2FyZFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pIHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IENyZWF0ZVJld2FyZFJlcXVlc3QpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL2FwaS92MS9icmFuZHMvJHticmFuZElkfS9yZXdhcmRzYCwgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiByZXdhcmRLZXlzLmZvckJyYW5kKGJyYW5kSWQpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogcmV3YXJkS2V5cy5hdmFpbGFibGUoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhIHBhcnRuZXIgcmV3YXJkIChmb3IgYnVzaW5lc3MgZGFzaGJvYXJkKVxuICpcbiAqIEBwYXJhbSBidXNpbmVzc0lkIC0gQnVzaW5lc3MgSURcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB1cGRhdGVSZXdhcmQgPSB1c2VVcGRhdGVQYXJ0bmVyUmV3YXJkKCdidXNpbmVzcy0xMjMnKTtcbiAqXG4gKiBjb25zdCBoYW5kbGVVcGRhdGUgPSBhc3luYyAocmV3YXJkSWQ6IHN0cmluZykgPT4ge1xuICogICBhd2FpdCB1cGRhdGVSZXdhcmQubXV0YXRlQXN5bmMoe1xuICogICAgIGlkOiByZXdhcmRJZCxcbiAqICAgICBkYXRhOiB7IHRpdGxlOiAnVXBkYXRlZCBUaXRsZScsIGlzQWN0aXZlOiBmYWxzZSB9LFxuICogICB9KTtcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVwZGF0ZVBhcnRuZXJSZXdhcmQoXG4gIGJ1c2luZXNzSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8XG4gICAgVXNlTXV0YXRpb25PcHRpb25zPFxuICAgICAgUGFydG5lclJld2FyZFJlc3BvbnNlLFxuICAgICAgRXJyb3IsXG4gICAgICB7IGlkOiBzdHJpbmc7IGRhdGE6IFBhcnRpYWw8Q3JlYXRlUGFydG5lclJld2FyZFJlcXVlc3QgJiB7IGlzQWN0aXZlOiBib29sZWFuIH0+IH1cbiAgICA+LFxuICAgICdtdXRhdGlvbkZuJ1xuICA+XG4pIHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHtcbiAgICAgIGlkLFxuICAgICAgZGF0YSxcbiAgICB9OiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGF0YTogUGFydGlhbDxDcmVhdGVQYXJ0bmVyUmV3YXJkUmVxdWVzdCAmIHsgaXNBY3RpdmU6IGJvb2xlYW4gfT47XG4gICAgfSk6IFByb21pc2U8UGFydG5lclJld2FyZFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBhdGNoKGAvYXBpL3YxL2J1c2luZXNzZXMvJHtidXNpbmVzc0lkfS9yZXdhcmRzLyR7aWR9YCwgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiByZXdhcmRLZXlzLmZvckJ1c2luZXNzKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogcmV3YXJkS2V5cy5hdmFpbGFibGUoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { UseMutationOptions } from '@tanstack/react-query';
|
|
2
|
+
import type { BrandResponse, BrandOwnerResponse, BrandCreatorResponse, BrandOwnerRole, CreateBrandRequest, UpdateBrandRequest } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a new brand
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const { mutateAsync: createBrand } = useCreateBrand();
|
|
9
|
+
*
|
|
10
|
+
* await createBrand({
|
|
11
|
+
* slug: 'wellness-co',
|
|
12
|
+
* name: 'Wellness Co',
|
|
13
|
+
* description: 'A wellness brand',
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function useCreateBrand(options?: Omit<UseMutationOptions<BrandResponse, Error, CreateBrandRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
18
|
+
id: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description?: Record<string, never>;
|
|
22
|
+
logoUrl?: Record<string, never>;
|
|
23
|
+
bannerUrl?: Record<string, never>;
|
|
24
|
+
primaryColor?: Record<string, never>;
|
|
25
|
+
website?: Record<string, never>;
|
|
26
|
+
email?: Record<string, never>;
|
|
27
|
+
instagram?: Record<string, never>;
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
isVerified: boolean;
|
|
30
|
+
isFeatured: boolean;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
}, Error, CreateBrandRequest, unknown>;
|
|
34
|
+
/**
|
|
35
|
+
* Update a brand
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* const { mutateAsync: updateBrand } = useUpdateBrand();
|
|
40
|
+
*
|
|
41
|
+
* await updateBrand({
|
|
42
|
+
* id: 'brand-123',
|
|
43
|
+
* data: { description: 'Updated description' },
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function useUpdateBrand(options?: Omit<UseMutationOptions<BrandResponse, Error, {
|
|
48
|
+
id: string;
|
|
49
|
+
data: UpdateBrandRequest;
|
|
50
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
51
|
+
id: string;
|
|
52
|
+
slug: string;
|
|
53
|
+
name: string;
|
|
54
|
+
description?: Record<string, never>;
|
|
55
|
+
logoUrl?: Record<string, never>;
|
|
56
|
+
bannerUrl?: Record<string, never>;
|
|
57
|
+
primaryColor?: Record<string, never>;
|
|
58
|
+
website?: Record<string, never>;
|
|
59
|
+
email?: Record<string, never>;
|
|
60
|
+
instagram?: Record<string, never>;
|
|
61
|
+
isActive: boolean;
|
|
62
|
+
isVerified: boolean;
|
|
63
|
+
isFeatured: boolean;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
}, Error, {
|
|
67
|
+
id: string;
|
|
68
|
+
data: UpdateBrandRequest;
|
|
69
|
+
}, unknown>;
|
|
70
|
+
/**
|
|
71
|
+
* Add a brand owner
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```tsx
|
|
75
|
+
* const { mutateAsync: addOwner } = useAddBrandOwner();
|
|
76
|
+
*
|
|
77
|
+
* await addOwner({
|
|
78
|
+
* brandId: 'brand-123',
|
|
79
|
+
* userId: 'user-456',
|
|
80
|
+
* role: 'MANAGER',
|
|
81
|
+
* });
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function useAddBrandOwner(options?: Omit<UseMutationOptions<BrandOwnerResponse, Error, {
|
|
85
|
+
brandId: string;
|
|
86
|
+
userId: string;
|
|
87
|
+
role: BrandOwnerRole;
|
|
88
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
89
|
+
id: string;
|
|
90
|
+
brandId: string;
|
|
91
|
+
userId: string;
|
|
92
|
+
role: "OWNER" | "MANAGER" | "MARKETING";
|
|
93
|
+
user?: import("@growsober/types/dist/generated").components["schemas"]["BrandOwnerUserDto"];
|
|
94
|
+
createdAt: string;
|
|
95
|
+
updatedAt: string;
|
|
96
|
+
}, Error, {
|
|
97
|
+
brandId: string;
|
|
98
|
+
userId: string;
|
|
99
|
+
role: BrandOwnerRole;
|
|
100
|
+
}, unknown>;
|
|
101
|
+
/**
|
|
102
|
+
* Update a brand owner's role
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```tsx
|
|
106
|
+
* const { mutateAsync: updateOwnerRole } = useUpdateBrandOwnerRole();
|
|
107
|
+
*
|
|
108
|
+
* await updateOwnerRole({
|
|
109
|
+
* brandId: 'brand-123',
|
|
110
|
+
* userId: 'user-456',
|
|
111
|
+
* role: 'OWNER',
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function useUpdateBrandOwnerRole(options?: Omit<UseMutationOptions<BrandOwnerResponse, Error, {
|
|
116
|
+
brandId: string;
|
|
117
|
+
userId: string;
|
|
118
|
+
role: BrandOwnerRole;
|
|
119
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
120
|
+
id: string;
|
|
121
|
+
brandId: string;
|
|
122
|
+
userId: string;
|
|
123
|
+
role: "OWNER" | "MANAGER" | "MARKETING";
|
|
124
|
+
user?: import("@growsober/types/dist/generated").components["schemas"]["BrandOwnerUserDto"];
|
|
125
|
+
createdAt: string;
|
|
126
|
+
updatedAt: string;
|
|
127
|
+
}, Error, {
|
|
128
|
+
brandId: string;
|
|
129
|
+
userId: string;
|
|
130
|
+
role: BrandOwnerRole;
|
|
131
|
+
}, unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* Remove a brand owner
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```tsx
|
|
137
|
+
* const { mutateAsync: removeOwner } = useRemoveBrandOwner();
|
|
138
|
+
*
|
|
139
|
+
* await removeOwner({
|
|
140
|
+
* brandId: 'brand-123',
|
|
141
|
+
* userId: 'user-456',
|
|
142
|
+
* });
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export declare function useRemoveBrandOwner(options?: Omit<UseMutationOptions<void, Error, {
|
|
146
|
+
brandId: string;
|
|
147
|
+
userId: string;
|
|
148
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, {
|
|
149
|
+
brandId: string;
|
|
150
|
+
userId: string;
|
|
151
|
+
}, unknown>;
|
|
152
|
+
/**
|
|
153
|
+
* Add a creator partnership to a brand
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```tsx
|
|
157
|
+
* const { mutateAsync: addCreator } = useAddBrandCreator();
|
|
158
|
+
*
|
|
159
|
+
* await addCreator({
|
|
160
|
+
* brandId: 'brand-123',
|
|
161
|
+
* creatorId: 'creator-456',
|
|
162
|
+
* commissionRate: 0.15,
|
|
163
|
+
* });
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
export declare function useAddBrandCreator(options?: Omit<UseMutationOptions<BrandCreatorResponse, Error, {
|
|
167
|
+
brandId: string;
|
|
168
|
+
creatorId: string;
|
|
169
|
+
startDate?: string;
|
|
170
|
+
endDate?: string;
|
|
171
|
+
commissionRate?: number;
|
|
172
|
+
isActive?: boolean;
|
|
173
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
174
|
+
id: string;
|
|
175
|
+
brandId: string;
|
|
176
|
+
creatorId: string;
|
|
177
|
+
startDate?: string;
|
|
178
|
+
endDate?: string;
|
|
179
|
+
isActive: boolean;
|
|
180
|
+
commissionRate?: number;
|
|
181
|
+
creator?: Record<string, never>;
|
|
182
|
+
createdAt: string;
|
|
183
|
+
updatedAt: string;
|
|
184
|
+
}, Error, {
|
|
185
|
+
brandId: string;
|
|
186
|
+
creatorId: string;
|
|
187
|
+
startDate?: string;
|
|
188
|
+
endDate?: string;
|
|
189
|
+
commissionRate?: number;
|
|
190
|
+
isActive?: boolean;
|
|
191
|
+
}, unknown>;
|
|
192
|
+
/**
|
|
193
|
+
* Update a creator partnership
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```tsx
|
|
197
|
+
* const { mutateAsync: updateCreator } = useUpdateBrandCreator();
|
|
198
|
+
*
|
|
199
|
+
* await updateCreator({
|
|
200
|
+
* brandId: 'brand-123',
|
|
201
|
+
* creatorId: 'creator-456',
|
|
202
|
+
* isActive: false,
|
|
203
|
+
* });
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
export declare function useUpdateBrandCreator(options?: Omit<UseMutationOptions<BrandCreatorResponse, Error, {
|
|
207
|
+
brandId: string;
|
|
208
|
+
creatorId: string;
|
|
209
|
+
startDate?: string;
|
|
210
|
+
endDate?: string;
|
|
211
|
+
commissionRate?: number;
|
|
212
|
+
isActive?: boolean;
|
|
213
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
214
|
+
id: string;
|
|
215
|
+
brandId: string;
|
|
216
|
+
creatorId: string;
|
|
217
|
+
startDate?: string;
|
|
218
|
+
endDate?: string;
|
|
219
|
+
isActive: boolean;
|
|
220
|
+
commissionRate?: number;
|
|
221
|
+
creator?: Record<string, never>;
|
|
222
|
+
createdAt: string;
|
|
223
|
+
updatedAt: string;
|
|
224
|
+
}, Error, {
|
|
225
|
+
brandId: string;
|
|
226
|
+
creatorId: string;
|
|
227
|
+
startDate?: string;
|
|
228
|
+
endDate?: string;
|
|
229
|
+
commissionRate?: number;
|
|
230
|
+
isActive?: boolean;
|
|
231
|
+
}, unknown>;
|
|
232
|
+
/**
|
|
233
|
+
* Remove a creator partnership from a brand
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```tsx
|
|
237
|
+
* const { mutateAsync: removeCreator } = useRemoveBrandCreator();
|
|
238
|
+
*
|
|
239
|
+
* await removeCreator({
|
|
240
|
+
* brandId: 'brand-123',
|
|
241
|
+
* creatorId: 'creator-456',
|
|
242
|
+
* });
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
export declare function useRemoveBrandCreator(options?: Omit<UseMutationOptions<void, Error, {
|
|
246
|
+
brandId: string;
|
|
247
|
+
creatorId: string;
|
|
248
|
+
}>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, {
|
|
249
|
+
brandId: string;
|
|
250
|
+
creatorId: string;
|
|
251
|
+
}, unknown>;
|