@burdenoff/microfe-coolandlovely 2026.1031.2 → 2026.1101.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 (141) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -1
  2. package/dist/coolandlovely/CoolAndLovelyRoot.js +16 -4
  3. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  4. package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -1
  5. package/dist/coolandlovely/CoolAndLovelyRoutes.js +19 -15
  6. package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
  7. package/dist/coolandlovely/components/ActivityTrail.js +1 -1
  8. package/dist/coolandlovely/components/ActivityTrail.js.map +1 -1
  9. package/dist/coolandlovely/components/ActorName.js.map +1 -1
  10. package/dist/coolandlovely/components/AddToCartPanel.js.map +1 -1
  11. package/dist/coolandlovely/components/AddToLookbookButton.js.map +1 -1
  12. package/dist/coolandlovely/components/BrandCard.js.map +1 -1
  13. package/dist/coolandlovely/components/BrandCover.js.map +1 -1
  14. package/dist/coolandlovely/components/BrandCreatorAvatars.js.map +1 -1
  15. package/dist/coolandlovely/components/CollaborationFeeCard.js.map +1 -1
  16. package/dist/coolandlovely/components/CollectionCard.js.map +1 -1
  17. package/dist/coolandlovely/components/ColourSwatchRow.js.map +1 -1
  18. package/dist/coolandlovely/components/Comments.js.map +1 -1
  19. package/dist/coolandlovely/components/EmptyState.js.map +1 -1
  20. package/dist/coolandlovely/components/FeedbackWidget.js.map +1 -1
  21. package/dist/coolandlovely/components/Field.js.map +1 -1
  22. package/dist/coolandlovely/components/FileImage.js.map +1 -1
  23. package/dist/coolandlovely/components/FollowButton.js.map +1 -1
  24. package/dist/coolandlovely/components/FulfilmentTimeline.js.map +1 -1
  25. package/dist/coolandlovely/components/ImageUploadField.js +3 -1
  26. package/dist/coolandlovely/components/ImageUploadField.js.map +1 -1
  27. package/dist/coolandlovely/components/LookCard.js.map +1 -1
  28. package/dist/coolandlovely/components/LookbookCard.js.map +1 -1
  29. package/dist/coolandlovely/components/MetricsCard.js.map +1 -1
  30. package/dist/coolandlovely/components/PageLayout.js.map +1 -1
  31. package/dist/coolandlovely/components/PayForOrder.js.map +1 -1
  32. package/dist/coolandlovely/components/RefundPanel.js +1 -1
  33. package/dist/coolandlovely/components/RefundPanel.js.map +1 -1
  34. package/dist/coolandlovely/components/ReturnRequests.js +1 -1
  35. package/dist/coolandlovely/components/ReturnRequests.js.map +1 -1
  36. package/dist/coolandlovely/components/ShopItemCard.js.map +1 -1
  37. package/dist/coolandlovely/components/StateViews.js.map +1 -1
  38. package/dist/coolandlovely/components/StatusBadge.js +1 -1
  39. package/dist/coolandlovely/components/StatusBadge.js.map +1 -1
  40. package/dist/coolandlovely/components/StepTracker.js.map +1 -1
  41. package/dist/coolandlovely/components/StockEditor.js.map +1 -1
  42. package/dist/coolandlovely/components/StoreListingCard.js.map +1 -1
  43. package/dist/coolandlovely/components/TagList.js.map +1 -1
  44. package/dist/coolandlovely/components/Thumbnail.js +1 -1
  45. package/dist/coolandlovely/components/Thumbnail.js.map +1 -1
  46. package/dist/coolandlovely/components/VisibilityChip.js.map +1 -1
  47. package/dist/coolandlovely/components/WardrobeItemCard.js.map +1 -1
  48. package/dist/coolandlovely/components/index.js +2 -1
  49. package/dist/coolandlovely/context/CoolAndLovelyContext.js +2 -1
  50. package/dist/coolandlovely/context/CoolAndLovelyContext.js.map +1 -1
  51. package/dist/coolandlovely/context/index.js +2 -1
  52. package/dist/coolandlovely/hooks/index.js +4 -3
  53. package/dist/coolandlovely/hooks/useActivity.d.ts +1 -1
  54. package/dist/coolandlovely/hooks/useActivity.d.ts.map +1 -1
  55. package/dist/coolandlovely/hooks/useActivity.js.map +1 -1
  56. package/dist/coolandlovely/hooks/useAssistantEntity.js.map +1 -1
  57. package/dist/coolandlovely/hooks/useBrandOrdersApi.d.ts +4 -4
  58. package/dist/coolandlovely/hooks/useBrandOrdersApi.d.ts.map +1 -1
  59. package/dist/coolandlovely/hooks/useBrandOrdersApi.js.map +1 -1
  60. package/dist/coolandlovely/hooks/useCatalogImport.js.map +1 -1
  61. package/dist/coolandlovely/hooks/useComments.d.ts +1 -1
  62. package/dist/coolandlovely/hooks/useComments.d.ts.map +1 -1
  63. package/dist/coolandlovely/hooks/useComments.js.map +1 -1
  64. package/dist/coolandlovely/hooks/useCommerceApi.d.ts +7 -7
  65. package/dist/coolandlovely/hooks/useCommerceApi.d.ts.map +1 -1
  66. package/dist/coolandlovely/hooks/useCommerceApi.js.map +1 -1
  67. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts +24 -24
  68. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
  69. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  70. package/dist/coolandlovely/hooks/useEditorialApi.d.ts +95 -0
  71. package/dist/coolandlovely/hooks/useEditorialApi.d.ts.map +1 -0
  72. package/dist/coolandlovely/hooks/useEditorialApi.js +107 -0
  73. package/dist/coolandlovely/hooks/useEditorialApi.js.map +1 -0
  74. package/dist/coolandlovely/hooks/useFiles.js.map +1 -1
  75. package/dist/coolandlovely/hooks/useInventoryApi.d.ts +1 -1
  76. package/dist/coolandlovely/hooks/useInventoryApi.d.ts.map +1 -1
  77. package/dist/coolandlovely/hooks/useInventoryApi.js.map +1 -1
  78. package/dist/coolandlovely/hooks/useTr.js.map +1 -1
  79. package/dist/coolandlovely/index.js +6 -5
  80. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  81. package/dist/coolandlovely/pages/admin/AdminBrandsPage.js.map +1 -1
  82. package/dist/coolandlovely/pages/admin/AdminCollaborationsPage.js.map +1 -1
  83. package/dist/coolandlovely/pages/admin/AdminFeaturedItemsPage.js.map +1 -1
  84. package/dist/coolandlovely/pages/brands/BrandDetailPage.js.map +1 -1
  85. package/dist/coolandlovely/pages/brands/BrandFormPage.js.map +1 -1
  86. package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -1
  87. package/dist/coolandlovely/pages/brands/ImportCatalogPage.js.map +1 -1
  88. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
  89. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +1 -1
  90. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -1
  91. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -1
  92. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -1
  93. package/dist/coolandlovely/pages/collections/CollectionFormPage.js.map +1 -1
  94. package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -1
  95. package/dist/coolandlovely/pages/commerce/BrandOrdersPage.js.map +1 -1
  96. package/dist/coolandlovely/pages/commerce/CartPage.js.map +1 -1
  97. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js.map +1 -1
  98. package/dist/coolandlovely/pages/commerce/OrdersPage.js.map +1 -1
  99. package/dist/coolandlovely/pages/discover/DiscoverPage.js +1 -1
  100. package/dist/coolandlovely/pages/discover/DiscoverPage.js.map +1 -1
  101. package/dist/coolandlovely/pages/editorial/EditorialPage.d.ts +2 -0
  102. package/dist/coolandlovely/pages/editorial/EditorialPage.d.ts.map +1 -0
  103. package/dist/coolandlovely/pages/editorial/EditorialPage.js +486 -0
  104. package/dist/coolandlovely/pages/editorial/EditorialPage.js.map +1 -0
  105. package/dist/coolandlovely/pages/items/StoreListedPieceView.js.map +1 -1
  106. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js.map +1 -1
  107. package/dist/coolandlovely/pages/items/StyleItemFormPage.js.map +1 -1
  108. package/dist/coolandlovely/pages/items/StyleItemsListPage.js.map +1 -1
  109. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -1
  110. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -1
  111. package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -1
  112. package/dist/coolandlovely/pages/looks/LookFormPage.js.map +1 -1
  113. package/dist/coolandlovely/pages/looks/LooksListPage.js.map +1 -1
  114. package/dist/coolandlovely/pages/profile/StyleProfilePage.js +1 -1
  115. package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
  116. package/dist/coolandlovely/pages/trends/TrendsPage.js.map +1 -1
  117. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js.map +1 -1
  118. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -1
  119. package/dist/coolandlovely/store/coolandlovelyStore.js.map +1 -1
  120. package/dist/coolandlovely/store/index.js +2 -1
  121. package/dist/coolandlovely/types/commerce.d.ts.map +1 -1
  122. package/dist/coolandlovely/types/index.d.ts.map +1 -1
  123. package/dist/coolandlovely/utils/cn.js +1 -1
  124. package/dist/coolandlovely/utils/cn.js.map +1 -1
  125. package/dist/coolandlovely/utils/formatters.js.map +1 -1
  126. package/dist/coolandlovely/utils/icons.js.map +1 -1
  127. package/dist/coolandlovely/utils/index.js +2 -1
  128. package/dist/coolandlovely/utils/navigation.js.map +1 -1
  129. package/dist/coolandlovely/utils/paymentProviders.js +22 -22
  130. package/dist/coolandlovely/utils/paymentProviders.js.map +1 -1
  131. package/dist/coolandlovely/utils/sparkline.js +13 -15
  132. package/dist/coolandlovely/utils/sparkline.js.map +1 -1
  133. package/dist/node_modules/clsx/dist/clsx.js +1 -1
  134. package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
  135. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +225 -146
  136. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  137. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  138. package/dist/stories/DiscoverPage.stories.d.ts.map +1 -1
  139. package/dist/utils/pageContext.js +1 -1
  140. package/dist/utils/pageContext.js.map +1 -1
  141. package/package.json +6 -4
@@ -8,8 +8,8 @@ export interface ListBrandsArgs {
8
8
  featured?: boolean;
9
9
  pagination?: PaginationInput;
10
10
  }
11
- export declare const useBrands: (args?: ListBrandsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooBrandConnection>, Error>;
12
- export declare const useBrand: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooBrand | null>, Error>;
11
+ export declare const useBrands: (args?: ListBrandsArgs) => import('@tanstack/react-query').UseQueryResult<CooBrandConnection, Error>;
12
+ export declare const useBrand: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooBrand | null, Error>;
13
13
  export declare const useCreateBrand: () => import('@tanstack/react-query').UseMutationResult<CooBrand, Error, CooCreateBrandInput, unknown>;
14
14
  export declare const useUpdateBrand: () => import('@tanstack/react-query').UseMutationResult<CooBrand, Error, {
15
15
  id: string;
@@ -24,8 +24,8 @@ export interface ListCollectionsArgs {
24
24
  brandId?: string;
25
25
  status?: CooCollectionStatus;
26
26
  }
27
- export declare const useCollections: (args?: ListCollectionsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooCollection[]>, Error>;
28
- export declare const useCollection: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooCollection | null>, Error>;
27
+ export declare const useCollections: (args?: ListCollectionsArgs) => import('@tanstack/react-query').UseQueryResult<CooCollection[], Error>;
28
+ export declare const useCollection: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooCollection | null, Error>;
29
29
  export declare const useCreateCollection: () => import('@tanstack/react-query').UseMutationResult<CooCollection, Error, CooCreateCollectionInput, unknown>;
30
30
  export declare const useUpdateCollection: () => import('@tanstack/react-query').UseMutationResult<CooCollection, Error, {
31
31
  id: string;
@@ -40,8 +40,8 @@ export interface ListStyleItemsArgs {
40
40
  status?: CooStyleItemStatus;
41
41
  pagination?: PaginationInput;
42
42
  }
43
- export declare const useStyleItems: (args?: ListStyleItemsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleItemConnection>, Error>;
44
- export declare const useStyleItem: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleItem | null>, Error>;
43
+ export declare const useStyleItems: (args?: ListStyleItemsArgs) => import('@tanstack/react-query').UseQueryResult<CooStyleItemConnection, Error>;
44
+ export declare const useStyleItem: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooStyleItem | null, Error>;
45
45
  export declare const useCreateStyleItem: () => import('@tanstack/react-query').UseMutationResult<CooStyleItem, Error, CooCreateStyleItemInput, unknown>;
46
46
  export declare const useUpdateStyleItem: () => import('@tanstack/react-query').UseMutationResult<CooStyleItem, Error, {
47
47
  id: string;
@@ -62,12 +62,12 @@ export interface ListLooksArgs {
62
62
  featured?: boolean;
63
63
  pagination?: PaginationInput;
64
64
  }
65
- export declare const useLooks: (args?: ListLooksArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooLookConnection>, Error>;
66
- export declare const useLook: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooLook | null>, Error>;
67
- export declare const useLooksWithItems: (args?: ListLooksArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<{
65
+ export declare const useLooks: (args?: ListLooksArgs) => import('@tanstack/react-query').UseQueryResult<CooLookConnection, Error>;
66
+ export declare const useLook: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooLook | null, Error>;
67
+ export declare const useLooksWithItems: (args?: ListLooksArgs) => import('@tanstack/react-query').UseQueryResult<{
68
68
  items: CooLook[];
69
69
  pageInfo: import('../types').CooPageInfo;
70
- }>, Error>;
70
+ }, Error>;
71
71
  export declare const useCreateLook: () => import('@tanstack/react-query').UseMutationResult<CooLook, Error, CooCreateLookInput, unknown>;
72
72
  export declare const useUpdateLook: () => import('@tanstack/react-query').UseMutationResult<CooLook, Error, {
73
73
  id: string;
@@ -84,8 +84,8 @@ export interface ListCollaborationsArgs {
84
84
  creatorId?: string;
85
85
  status?: CooCollaborationStatus;
86
86
  }
87
- export declare const useCollaborations: (args?: ListCollaborationsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooCollaboration[]>, Error>;
88
- export declare const useCollaboration: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooCollaboration | null>, Error>;
87
+ export declare const useCollaborations: (args?: ListCollaborationsArgs) => import('@tanstack/react-query').UseQueryResult<CooCollaboration[], Error>;
88
+ export declare const useCollaboration: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooCollaboration | null, Error>;
89
89
  export declare const useCreateCollaboration: () => import('@tanstack/react-query').UseMutationResult<CooCollaboration, Error, CooCreateCollaborationInput, unknown>;
90
90
  export declare const useUpdateCollaboration: () => import('@tanstack/react-query').UseMutationResult<CooCollaboration, Error, {
91
91
  id: string;
@@ -101,7 +101,7 @@ export interface ListWardrobeArgs {
101
101
  category?: CooStyleCategory;
102
102
  source?: CooWardrobeSource;
103
103
  }
104
- export declare const useWardrobeItems: (args?: ListWardrobeArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooWardrobeItem[]>, Error>;
104
+ export declare const useWardrobeItems: (args?: ListWardrobeArgs) => import('@tanstack/react-query').UseQueryResult<CooWardrobeItem[], Error>;
105
105
  export declare const useCreateWardrobeItem: () => import('@tanstack/react-query').UseMutationResult<CooWardrobeItem, Error, CooCreateWardrobeItemInput, unknown>;
106
106
  export declare const useUpdateWardrobeItem: () => import('@tanstack/react-query').UseMutationResult<CooWardrobeItem, Error, {
107
107
  id: string;
@@ -109,22 +109,22 @@ export declare const useUpdateWardrobeItem: () => import('@tanstack/react-query'
109
109
  }, unknown>;
110
110
  export declare const useLogWardrobeWear: () => import('@tanstack/react-query').UseMutationResult<CooWardrobeItem, Error, string, unknown>;
111
111
  export declare const useRemoveWardrobeItem: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, string, unknown>;
112
- export declare const useMyStyleProfile: () => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleProfile | null>, Error>;
112
+ export declare const useMyStyleProfile: () => import('@tanstack/react-query').UseQueryResult<CooStyleProfile | null, Error>;
113
113
  /**
114
114
  * A style profile by its own id, honoring CooVisibility (PRIVATE/FOLLOWERS
115
115
  * gated server-side). Returns null when not found or not visible to the
116
116
  * caller. Disabled until `id` is provided.
117
117
  */
118
- export declare const useStyleProfile: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleProfile | null>, Error>;
118
+ export declare const useStyleProfile: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooStyleProfile | null, Error>;
119
119
  /**
120
120
  * Same visibility gate as `useStyleProfile`, looked up by the profile
121
121
  * owner's actor id — powers `/profile/:userId` (the public profile route
122
122
  * reached from an author's name/avatar on a Look/Discover/Collaboration
123
123
  * card). Disabled until `ownerId` is provided.
124
124
  */
125
- export declare const useStyleProfileByOwner: (ownerId: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleProfile | null>, Error>;
125
+ export declare const useStyleProfileByOwner: (ownerId: string | undefined) => import('@tanstack/react-query').UseQueryResult<CooStyleProfile | null, Error>;
126
126
  export declare const useUpsertStyleProfile: () => import('@tanstack/react-query').UseMutationResult<CooStyleProfile, Error, CooUpsertStyleProfileInput, unknown>;
127
- export declare const useLookbooks: (ownerId?: string) => import('@tanstack/react-query').UseQueryResult<NoInfer<{
127
+ export declare const useLookbooks: (ownerId?: string) => import('@tanstack/react-query').UseQueryResult<{
128
128
  entries: import('../types').CooLookbookEntry[];
129
129
  id: string;
130
130
  workspaceId: string;
@@ -137,7 +137,7 @@ export declare const useLookbooks: (ownerId?: string) => import('@tanstack/react
137
137
  cover: import('../types').CooFileRef | null;
138
138
  createdAt: string;
139
139
  updatedAt: string;
140
- }[]>, Error>;
140
+ }[], Error>;
141
141
  export declare const useCreateLookbook: () => import('@tanstack/react-query').UseMutationResult<CooLookbook, Error, CooCreateLookbookInput, unknown>;
142
142
  export declare const useAddLookbookEntry: () => import('@tanstack/react-query').UseMutationResult<{
143
143
  id: string;
@@ -149,10 +149,10 @@ export declare const useIsFollowing: (followeeId: string | undefined) => import(
149
149
  export declare const useFollow: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, string, unknown>;
150
150
  export declare const useUnfollow: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, string, unknown>;
151
151
  /** Style profiles of people the caller follows. */
152
- export declare const useMyFollowing: () => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleProfile[]>, Error>;
152
+ export declare const useMyFollowing: () => import('@tanstack/react-query').UseQueryResult<CooStyleProfile[], Error>;
153
153
  /** Style profiles of people following the caller. */
154
- export declare const useMyFollowers: () => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleProfile[]>, Error>;
155
- export declare const useLookbook: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<{
154
+ export declare const useMyFollowers: () => import('@tanstack/react-query').UseQueryResult<CooStyleProfile[], Error>;
155
+ export declare const useLookbook: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<{
156
156
  entries: import('../types').CooLookbookEntry[];
157
157
  id: string;
158
158
  workspaceId: string;
@@ -165,7 +165,7 @@ export declare const useLookbook: (id: string | undefined) => import('@tanstack/
165
165
  cover: import('../types').CooFileRef | null;
166
166
  createdAt: string;
167
167
  updatedAt: string;
168
- } | null>, Error>;
168
+ } | null, Error>;
169
169
  export declare const useDeleteLookbook: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, string, unknown>;
170
170
  export interface SearchStyleItemsArgs {
171
171
  input: CooSearchStyleItemsInput;
@@ -177,7 +177,7 @@ export interface SearchStyleItemsArgs {
177
177
  */
178
178
  enabled?: boolean;
179
179
  }
180
- export declare const useSearchStyleItems: ({ enabled, ...args }: SearchStyleItemsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooStyleItemConnection>, Error>;
180
+ export declare const useSearchStyleItems: ({ enabled, ...args }: SearchStyleItemsArgs) => import('@tanstack/react-query').UseQueryResult<CooStyleItemConnection, Error>;
181
181
  export interface SearchLooksArgs {
182
182
  input: CooSearchLooksInput;
183
183
  pagination?: PaginationInput;
@@ -188,7 +188,7 @@ export interface SearchLooksArgs {
188
188
  */
189
189
  enabled?: boolean;
190
190
  }
191
- export declare const useSearchLooks: ({ enabled, ...args }: SearchLooksArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<CooLookConnection>, Error>;
191
+ export declare const useSearchLooks: ({ enabled, ...args }: SearchLooksArgs) => import('@tanstack/react-query').UseQueryResult<CooLookConnection, Error>;
192
192
  export declare const useApproveBrand: () => import('@tanstack/react-query').UseMutationResult<CooBrand, Error, string, unknown>;
193
193
  export declare const useRejectBrand: () => import('@tanstack/react-query').UseMutationResult<CooBrand, Error, string, unknown>;
194
194
  export declare const useReviewCollaboration: () => import('@tanstack/react-query').UseMutationResult<CooCollaboration, Error, {
@@ -1 +1 @@
1
- {"version":3,"file":"useCoolAndLovelyApi.d.ts","sourceRoot":"","sources":["../../../src/coolandlovely/hooks/useCoolAndLovelyApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCoolAndLovelyApi.d.ts","sourceRoot":"","sources":["../../../src/coolandlovely/hooks/useCoolAndLovelyApi.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCoolAndLovelyApi.js","names":[],"sources":["../../../src/coolandlovely/hooks/useCoolAndLovelyApi.ts"],"sourcesContent":["/**\n * CoolAndLovely API hooks\n * @module coolandlovely/hooks\n *\n * Thin, strictly-typed React Query layer over the federated\n * `wspace-coolandlovely-svc` GraphQL contract. Every query/mutation here maps\n * 1:1 to a real `coo*` root field — no mocks. Requests go through the workspace\n * gateway via `graphqlFetch({ gateway: 'workspace', workspaceToken: true })`.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n// Imported from the `/fetch` subpath (not the barrel) so it resolves against the\n// MFE's pinned fe-libs, which exposes the helper in fetch but not yet in the\n// graphql barrel index.\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useCoolAndLovely } from '../context';\nimport type {\n CooAddLookbookEntryInput,\n CooBrand,\n CooBrandConnection,\n CooBrandStatus,\n CooCollaboration,\n CooCollaborationConnection,\n CooCollaborationStatus,\n CooCollection,\n CooCollectionConnection,\n CooCollectionStatus,\n CooCreateBrandInput,\n CooCreateCollaborationInput,\n CooCreateCollectionInput,\n CooCreateLookInput,\n CooCreateLookbookInput,\n CooCreateStyleItemInput,\n CooCreateWardrobeItemInput,\n CooLook,\n CooLookConnection,\n CooLookItemConnection,\n CooLookOccasion,\n CooLookbook,\n CooLookbookEntryConnection,\n CooStyleCategory,\n CooStyleItem,\n CooStyleItemConnection,\n CooStyleItemStatus,\n CooStyleProfile,\n CooStyleProfileConnection,\n CooUpdateBrandInput,\n CooUpdateCollaborationInput,\n CooUpdateCollectionInput,\n CooUpdateLookInput,\n CooUpdateStyleItemInput,\n CooUpdateWardrobeItemInput,\n CooUpsertStyleProfileInput,\n CooWardrobeItem,\n CooWardrobeItemConnection,\n CooWardrobeSource,\n PaginationInput,\n CooSearchStyleItemsInput,\n CooSearchLooksInput,\n CooReviewCollaborationInput,\n} from '../types';\n\n// ---------------------------------------------------------------------------\n// Query key root\n// ---------------------------------------------------------------------------\n\nconst QK = 'coolandlovely';\n\n// ---------------------------------------------------------------------------\n// Low-level fetch wrapper\n// ---------------------------------------------------------------------------\n\nexport const coolQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n // fe-libs graphqlFetch caches every *query* response for ~15s in a global\n // response cache. After a successful mutation we drop that cache so the\n // React Query `invalidateQueries` refetch reads fresh data instead of the\n // stale pre-mutation response (otherwise a like/publish/transition/remove\n // shows no change for up to 15s).\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n return response.data;\n};\n\n// ---------------------------------------------------------------------------\n// Reusable GraphQL field selections\n// ---------------------------------------------------------------------------\n\nconst BRAND_FIELDS = `\n id workspaceId name handle tagline bio aesthetics tags websiteUrl\n isFeatured status logo { id } cover { id } createdAt updatedAt\n`;\n\nconst COLLECTION_FIELDS = `\n id workspaceId brandId name description season status tags\n cover { id } publishAt endAt createdAt updatedAt\n`;\n\nconst STYLE_ITEM_FIELDS = `\n id workspaceId brandId collectionId name description category status\n sku price currency colours sizes materials tags image { id }\n createdAt updatedAt\n`;\n\n/** The piece's Burdenoff store catalogue listing state (BOFF-3430). */\nconst STORE_LISTING_FIELDS = `\n storeProductId storeListingStatus storeSyncStatus storeSyncedAt\n`;\n\nconst LOOK_FIELDS = `\n id workspaceId authorId title caption occasion visibility isFeatured\n likeCount saveCount collaborationId image { id } tags publishedAt\n createdAt updatedAt isLikedByMe isSavedByMe\n`;\n\nconst LOOK_ITEM_FIELDS = `\n id workspaceId lookId styleItemId position styling createdAt updatedAt\n styleItem { id name category price currency brand { id name handle } image { id } }\n`;\n\nconst COLLABORATION_FIELDS = `\n id workspaceId brandId creatorId collectionId title brief role status\n compensation currency tags startDate endDate publishedAt createdAt updatedAt\n`;\n\n/** Fields of a collaboration fee (BOFF-9637), shared with the commerce hooks. */\nexport const COLLABORATION_PAYOUT_FIELDS = `\n id collaborationId collaborationTitle brandId creatorId amount currency status paymentProvider\n paidAt earningAvailableAt earningSyncStatus createdAt updatedAt\n`;\n\nconst WARDROBE_FIELDS = `\n id workspaceId profileId name category source brandName colour size notes\n styleItemId purchasePrice currency costPerWear timesWorn lastWornAt tags\n image { id } createdAt updatedAt\n`;\n\nconst PROFILE_FIELDS = `\n id workspaceId ownerId displayName bio visibility stylePreferences\n palette favouriteBrands sizes createdAt updatedAt\n isFollowedByMe followerCount followingCount\n`;\n\nconst LOOKBOOK_FIELDS = `\n id workspaceId ownerId profileId name description visibility tags\n cover { id } createdAt updatedAt\n`;\n\n// ===========================================================================\n// Brands\n// ===========================================================================\n\nexport interface ListBrandsArgs {\n status?: CooBrandStatus;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useBrands = (args: ListBrandsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'brands', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListBrands: CooBrandConnection }>(\n `query CooListBrands($status: CooBrandStatus, $featured: Boolean, $pagination: PaginationInput) {\n cooListBrands(status: $status, featured: $featured, pagination: $pagination) {\n items { ${BRAND_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: args.status,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListBrands;\n },\n });\n};\n\n/** Wire shape of `cooBrand` — its nested `collections`/`items` are Connections, flattened below. */\ntype CooBrandWire = Omit<CooBrand, 'collections' | 'items'> & {\n collections?: CooCollectionConnection | null;\n items?: CooStyleItemConnection | null;\n};\n\nexport const useBrand = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'brand', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooBrand: CooBrandWire | null }>(\n `query CooBrand($id: ID!) {\n cooBrand(id: $id) {\n ${BRAND_FIELDS}\n collections { items { ${COLLECTION_FIELDS} } pageInfo { cursor hasMore } }\n items { items { ${STYLE_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooBrand) return null;\n const { collections, items, ...rest } = data.cooBrand;\n return {\n ...rest,\n collections: collections?.items ?? [],\n items: items?.items ?? [],\n } as CooBrand;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateBrandInput) => {\n const data = await coolQuery<{ cooCreateBrand: CooBrand }>(\n `mutation CooCreateBrand($input: CooCreateBrandInput!) {\n cooCreateBrand(input: $input) { ${BRAND_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateBrand;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n },\n });\n};\n\nexport const useUpdateBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateBrandInput }) => {\n const data = await coolQuery<{ cooUpdateBrand: CooBrand }>(\n `mutation CooUpdateBrand($id: ID!, $input: CooUpdateBrandInput!) {\n cooUpdateBrand(id: $id, input: $input) { ${BRAND_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useTransitionBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: CooBrandStatus }) => {\n const data = await coolQuery<{ cooTransitionBrand: CooBrand }>(\n `mutation CooTransitionBrand($id: ID!, $status: CooBrandStatus!) {\n cooTransitionBrand(id: $id, status: $status) { ${BRAND_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.cooTransitionBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useArchiveBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveBrand: boolean }>(\n `mutation CooArchiveBrand($id: ID!) { cooArchiveBrand(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveBrand;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n },\n });\n};\n\n// ===========================================================================\n// Collections\n// ===========================================================================\n\nexport interface ListCollectionsArgs {\n brandId?: string;\n status?: CooCollectionStatus;\n}\n\nexport const useCollections = (args: ListCollectionsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collections', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListCollections: CooCollectionConnection }>(\n `query CooListCollections($brandId: ID, $status: CooCollectionStatus) {\n cooListCollections(brandId: $brandId, status: $status) {\n items { ${COLLECTION_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n { brandId: args.brandId, status: args.status },\n apiGatewayUrl\n );\n return data.cooListCollections.items;\n },\n });\n};\n\n/** Wire shape of `cooCollection` — its nested `items` is a Connection, flattened below. */\ntype CooCollectionWire = Omit<CooCollection, 'items'> & { items?: CooStyleItemConnection | null };\n\nexport const useCollection = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collection', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooCollection: CooCollectionWire | null }>(\n `query CooCollection($id: ID!) {\n cooCollection(id: $id) {\n ${COLLECTION_FIELDS}\n brand { id name handle }\n items { items { ${STYLE_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooCollection) return null;\n const { items, ...rest } = data.cooCollection;\n return { ...rest, items: items?.items ?? [] } as CooCollection;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateCollectionInput) => {\n const data = await coolQuery<{ cooCreateCollection: CooCollection }>(\n `mutation CooCreateCollection($input: CooCreateCollectionInput!) {\n cooCreateCollection(input: $input) { ${COLLECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateCollection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n },\n });\n};\n\nexport const useUpdateCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateCollectionInput }) => {\n const data = await coolQuery<{ cooUpdateCollection: CooCollection }>(\n `mutation CooUpdateCollection($id: ID!, $input: CooUpdateCollectionInput!) {\n cooUpdateCollection(id: $id, input: $input) { ${COLLECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateCollection;\n },\n onSuccess: (collection) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collection', collection.id] });\n },\n });\n};\n\nexport const usePublishCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooPublishCollection: CooCollection }>(\n `mutation CooPublishCollection($id: ID!) {\n cooPublishCollection(id: $id) { ${COLLECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooPublishCollection;\n },\n onSuccess: (collection) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collection', collection.id] });\n },\n });\n};\n\nexport const useArchiveCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveCollection: boolean }>(\n `mutation CooArchiveCollection($id: ID!) { cooArchiveCollection(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveCollection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n },\n });\n};\n\n// ===========================================================================\n// Style Items\n// ===========================================================================\n\nexport interface ListStyleItemsArgs {\n brandId?: string;\n collectionId?: string;\n category?: CooStyleCategory;\n status?: CooStyleItemStatus;\n pagination?: PaginationInput;\n}\n\nexport const useStyleItems = (args: ListStyleItemsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-items', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListStyleItems: CooStyleItemConnection }>(\n `query CooListStyleItems(\n $brandId: ID, $collectionId: ID, $category: CooStyleCategory,\n $status: CooStyleItemStatus, $pagination: PaginationInput\n ) {\n cooListStyleItems(\n brandId: $brandId, collectionId: $collectionId, category: $category,\n status: $status, pagination: $pagination\n ) {\n items { ${STYLE_ITEM_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n brandId: args.brandId,\n collectionId: args.collectionId,\n category: args.category,\n status: args.status,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListStyleItems;\n },\n });\n};\n\nexport const useStyleItem = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-item', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleItem: CooStyleItem | null }>(\n `query CooStyleItem($id: ID!) {\n cooStyleItem(id: $id) {\n ${STYLE_ITEM_FIELDS}\n ${STORE_LISTING_FIELDS}\n brand { id name handle }\n collection { id name }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooStyleItem;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateStyleItemInput) => {\n const data = await coolQuery<{ cooCreateStyleItem: CooStyleItem }>(\n `mutation CooCreateStyleItem($input: CooCreateStyleItemInput!) {\n cooCreateStyleItem(input: $input) { ${STYLE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateStyleItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n },\n });\n};\n\nexport const useUpdateStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateStyleItemInput }) => {\n const data = await coolQuery<{ cooUpdateStyleItem: CooStyleItem }>(\n `mutation CooUpdateStyleItem($id: ID!, $input: CooUpdateStyleItemInput!) {\n cooUpdateStyleItem(id: $id, input: $input) { ${STYLE_ITEM_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n // Sizes or colours may have changed, and with them the variants that hold stock.\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item-inventory', item.id] });\n },\n });\n};\n\n/**\n * Re-drive the push of a piece to its Burdenoff store catalogue listing\n * (`cooSyncStyleItemStoreListing`, BOFF-3430). Listings normally follow every\n * change automatically; this is the manual retry for a FAILED sync. The\n * service records a failed push on the piece rather than throwing, so the\n * returned item carries the new outcome either way.\n */\nexport const useSyncStyleItemStoreListing = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooSyncStyleItemStoreListing: CooStyleItem }>(\n `mutation CooSyncStyleItemStoreListing($id: ID!) {\n cooSyncStyleItemStoreListing(id: $id) { id ${STORE_LISTING_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooSyncStyleItemStoreListing;\n },\n onSuccess: (synced) => {\n queryClient.setQueryData<CooStyleItem | null>([QK, 'style-item', synced.id], (prev) =>\n prev ? { ...prev, ...synced } : prev\n );\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', synced.id] });\n },\n });\n};\n\nexport const useArchiveStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveStyleItem: boolean }>(\n `mutation CooArchiveStyleItem($id: ID!) { cooArchiveStyleItem(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveStyleItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n },\n });\n};\n\n// ===========================================================================\n// Looks\n// ===========================================================================\n\nexport interface ListLooksArgs {\n authorId?: string;\n occasion?: CooLookOccasion;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useLooks = (args: ListLooksArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'looks', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListLooks: CooLookConnection }>(\n `query CooListLooks(\n $authorId: ID, $occasion: CooLookOccasion, $featured: Boolean, $pagination: PaginationInput\n ) {\n cooListLooks(authorId: $authorId, occasion: $occasion, featured: $featured, pagination: $pagination) {\n items { ${LOOK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n authorId: args.authorId,\n occasion: args.occasion,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListLooks;\n },\n });\n};\n\n/** Wire shape of `cooLook` — its nested `items` is a Connection, flattened below. */\ntype CooLookWire = Omit<CooLook, 'items'> & { items?: CooLookItemConnection | null };\n\nexport const useLook = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'look', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooLook: CooLookWire | null }>(\n `query CooLook($id: ID!) {\n cooLook(id: $id) {\n ${LOOK_FIELDS}\n items { items { ${LOOK_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooLook) return null;\n const { items, ...rest } = data.cooLook;\n return { ...rest, items: items?.items ?? [] } as CooLook;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useLooksWithItems = (args: ListLooksArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'looks-with-items', args],\n queryFn: async () => {\n const data = await coolQuery<{\n cooListLooks: { items: CooLookWire[]; pageInfo: CooLookConnection['pageInfo'] };\n }>(\n `query CooListLooksWithItems(\n $authorId: ID, $occasion: CooLookOccasion, $featured: Boolean, $pagination: PaginationInput\n ) {\n cooListLooks(authorId: $authorId, occasion: $occasion, featured: $featured, pagination: $pagination) {\n items { ${LOOK_FIELDS} items { items { ${LOOK_ITEM_FIELDS} } pageInfo { cursor hasMore } } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n authorId: args.authorId,\n occasion: args.occasion,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return {\n items: data.cooListLooks.items.map(\n ({ items, ...rest }) => ({ ...rest, items: items?.items ?? [] }) as CooLook\n ),\n pageInfo: data.cooListLooks.pageInfo,\n };\n },\n });\n};\n\nexport const useCreateLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateLookInput) => {\n const data = await coolQuery<{ cooCreateLook: CooLook }>(\n `mutation CooCreateLook($input: CooCreateLookInput!) {\n cooCreateLook(input: $input) { ${LOOK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateLook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n },\n });\n};\n\nexport const useUpdateLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateLookInput }) => {\n const data = await coolQuery<{ cooUpdateLook: CooLook }>(\n `mutation CooUpdateLook($id: ID!, $input: CooUpdateLookInput!) {\n cooUpdateLook(id: $id, input: $input) { ${LOOK_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const usePublishLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooPublishLook: CooLook }>(\n `mutation CooPublishLook($id: ID!) { cooPublishLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooPublishLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useLikeLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooLikeLook: CooLook }>(\n `mutation CooLikeLook($id: ID!) { cooLikeLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooLikeLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useUnlikeLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnlikeLook: CooLook }>(\n `mutation CooUnlikeLook($id: ID!) { cooUnlikeLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnlikeLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useSaveLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooSaveLook: CooLook }>(\n `mutation CooSaveLook($id: ID!) { cooSaveLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooSaveLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useUnsaveLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnsaveLook: CooLook }>(\n `mutation CooUnsaveLook($id: ID!) { cooUnsaveLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnsaveLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useDeleteLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteLook: boolean }>(\n `mutation CooDeleteLook($id: ID!) { cooDeleteLook(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteLook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n },\n });\n};\n\n// ===========================================================================\n// Collaborations\n// ===========================================================================\n\nexport interface ListCollaborationsArgs {\n brandId?: string;\n creatorId?: string;\n status?: CooCollaborationStatus;\n}\n\nexport const useCollaborations = (args: ListCollaborationsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collaborations', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListCollaborations: CooCollaborationConnection }>(\n `query CooListCollaborations($brandId: ID, $creatorId: ID, $status: CooCollaborationStatus) {\n cooListCollaborations(brandId: $brandId, creatorId: $creatorId, status: $status) {\n items { ${COLLABORATION_FIELDS} brand { id name handle logo { id } } }\n pageInfo { cursor hasMore }\n }\n }`,\n { brandId: args.brandId, creatorId: args.creatorId, status: args.status },\n apiGatewayUrl\n );\n return data.cooListCollaborations.items;\n },\n });\n};\n\n/** Wire shape of `cooCollaboration` — its nested `looks` is a Connection, flattened below. */\ntype CooCollaborationWire = Omit<CooCollaboration, 'looks'> & { looks?: CooLookConnection | null };\n\nexport const useCollaboration = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collaboration', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooCollaboration: CooCollaborationWire | null }>(\n `query CooCollaboration($id: ID!) {\n cooCollaboration(id: $id) {\n ${COLLABORATION_FIELDS}\n brand { id name handle logo { id } }\n looks { items { ${LOOK_FIELDS} } pageInfo { cursor hasMore } }\n payout { ${COLLABORATION_PAYOUT_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooCollaboration) return null;\n const { looks, ...rest } = data.cooCollaboration;\n return { ...rest, looks: looks?.items ?? [] } as CooCollaboration;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateCollaborationInput) => {\n const data = await coolQuery<{ cooCreateCollaboration: CooCollaboration }>(\n `mutation CooCreateCollaboration($input: CooCreateCollaborationInput!) {\n cooCreateCollaboration(input: $input) { ${COLLABORATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateCollaboration;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n },\n });\n};\n\nexport const useUpdateCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateCollaborationInput }) => {\n const data = await coolQuery<{ cooUpdateCollaboration: CooCollaboration }>(\n `mutation CooUpdateCollaboration($id: ID!, $input: CooUpdateCollaborationInput!) {\n cooUpdateCollaboration(id: $id, input: $input) {\n ${COLLABORATION_FIELDS}\n brand { id name handle logo { id } }\n }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\nexport const useTransitionCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: CooCollaborationStatus }) => {\n const data = await coolQuery<{ cooTransitionCollaboration: CooCollaboration }>(\n `mutation CooTransitionCollaboration($id: ID!, $status: CooCollaborationStatus!) {\n cooTransitionCollaboration(id: $id, status: $status) { ${COLLABORATION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.cooTransitionCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\n/** Delete a still-PROPOSED collaboration (the svc rejects this once it has moved past PROPOSED). */\nexport const useDeleteCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteCollaboration: boolean }>(\n `mutation CooDeleteCollaboration($id: ID!) { cooDeleteCollaboration(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteCollaboration;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n },\n });\n};\n\n// ===========================================================================\n// Wardrobe (self-scoped)\n// ===========================================================================\n\nexport interface ListWardrobeArgs {\n category?: CooStyleCategory;\n source?: CooWardrobeSource;\n}\n\nexport const useWardrobeItems = (args: ListWardrobeArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'wardrobe', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListWardrobeItems: CooWardrobeItemConnection }>(\n `query CooListWardrobeItems($category: CooStyleCategory, $source: CooWardrobeSource) {\n cooListWardrobeItems(category: $category, source: $source) {\n items { ${WARDROBE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { category: args.category, source: args.source },\n apiGatewayUrl\n );\n return data.cooListWardrobeItems.items;\n },\n });\n};\n\nexport const useCreateWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateWardrobeItemInput) => {\n const data = await coolQuery<{ cooCreateWardrobeItem: CooWardrobeItem }>(\n `mutation CooCreateWardrobeItem($input: CooCreateWardrobeItemInput!) {\n cooCreateWardrobeItem(input: $input) { ${WARDROBE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useUpdateWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateWardrobeItemInput }) => {\n const data = await coolQuery<{ cooUpdateWardrobeItem: CooWardrobeItem }>(\n `mutation CooUpdateWardrobeItem($id: ID!, $input: CooUpdateWardrobeItemInput!) {\n cooUpdateWardrobeItem(id: $id, input: $input) { ${WARDROBE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useLogWardrobeWear = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooLogWardrobeWear: CooWardrobeItem }>(\n `mutation CooLogWardrobeWear($id: ID!) {\n cooLogWardrobeWear(id: $id) { ${WARDROBE_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooLogWardrobeWear;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useRemoveWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRemoveWardrobeItem: boolean }>(\n `mutation CooRemoveWardrobeItem($id: ID!) { cooRemoveWardrobeItem(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRemoveWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\n// ===========================================================================\n// Style Profile (self-scoped)\n// ===========================================================================\n\nexport const useMyStyleProfile = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-style-profile'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyStyleProfile: CooStyleProfile | null }>(\n `query CooMyStyleProfile { cooMyStyleProfile { ${PROFILE_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyStyleProfile;\n },\n });\n};\n\n/**\n * A style profile by its own id, honoring CooVisibility (PRIVATE/FOLLOWERS\n * gated server-side). Returns null when not found or not visible to the\n * caller. Disabled until `id` is provided.\n */\nexport const useStyleProfile = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-profile', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleProfile: CooStyleProfile | null }>(\n `query CooStyleProfile($id: ID!) { cooStyleProfile(id: $id) { ${PROFILE_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooStyleProfile;\n },\n enabled: Boolean(id),\n });\n};\n\n/**\n * Same visibility gate as `useStyleProfile`, looked up by the profile\n * owner's actor id — powers `/profile/:userId` (the public profile route\n * reached from an author's name/avatar on a Look/Discover/Collaboration\n * card). Disabled until `ownerId` is provided.\n */\nexport const useStyleProfileByOwner = (ownerId: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-profile-by-owner', ownerId],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleProfileByOwner: CooStyleProfile | null }>(\n `query CooStyleProfileByOwner($ownerId: ID!) {\n cooStyleProfileByOwner(ownerId: $ownerId) { ${PROFILE_FIELDS} }\n }`,\n { ownerId },\n apiGatewayUrl\n );\n return data.cooStyleProfileByOwner;\n },\n enabled: Boolean(ownerId),\n });\n};\n\nexport const useUpsertStyleProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooUpsertStyleProfileInput) => {\n const data = await coolQuery<{ cooUpsertStyleProfile: CooStyleProfile }>(\n `mutation CooUpsertStyleProfile($input: CooUpsertStyleProfileInput!) {\n cooUpsertStyleProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooUpsertStyleProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\n// ===========================================================================\n// Lookbooks\n// ===========================================================================\n\n/** The plain `CooLookbookEntry` field selection reused across lookbook queries. */\nconst LOOKBOOK_ENTRY_FIELDS =\n 'id workspaceId lookbookId lookId styleItemId note position createdAt updatedAt';\n\nexport const useLookbooks = (ownerId?: string) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'lookbooks', ownerId],\n queryFn: async () => {\n const data = await coolQuery<{\n cooListLookbooks: {\n items: (CooLookbook & { entries?: CooLookbookEntryConnection | null })[];\n pageInfo: unknown;\n };\n }>(\n `query CooListLookbooks($ownerId: ID) {\n cooListLookbooks(ownerId: $ownerId) {\n items {\n ${LOOKBOOK_FIELDS}\n entries { items { ${LOOKBOOK_ENTRY_FIELDS} } pageInfo { cursor hasMore } }\n }\n pageInfo { cursor hasMore }\n }\n }`,\n { ownerId },\n apiGatewayUrl\n );\n return data.cooListLookbooks.items.map(({ entries, ...rest }) => ({\n ...rest,\n entries: entries?.items ?? [],\n }));\n },\n });\n};\n\nexport const useCreateLookbook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateLookbookInput) => {\n const data = await coolQuery<{ cooCreateLookbook: CooLookbook }>(\n `mutation CooCreateLookbook($input: CooCreateLookbookInput!) {\n cooCreateLookbook(input: $input) { ${LOOKBOOK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateLookbook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n },\n });\n};\n\nexport const useAddLookbookEntry = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooAddLookbookEntryInput) => {\n const data = await coolQuery<{ cooAddLookbookEntry: { id: string; lookbookId: string } }>(\n `mutation CooAddLookbookEntry($input: CooAddLookbookEntryInput!) {\n cooAddLookbookEntry(input: $input) {\n id lookbookId lookId styleItemId note position createdAt updatedAt\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooAddLookbookEntry;\n },\n onSuccess: (entry) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook', entry.lookbookId] });\n },\n });\n};\n\nexport const useRemoveLookbookEntry = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRemoveLookbookEntry: boolean }>(\n `mutation CooRemoveLookbookEntry($id: ID!) { cooRemoveLookbookEntry(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRemoveLookbookEntry;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n },\n });\n};\n\n// ===========================================================================\n// Follow graph (added this release — cooFollow / cooUnfollow / cooIsFollowing)\n// ===========================================================================\n\nconst FOLLOW_PROFILE_FIELDS = `\n id workspaceId ownerId displayName bio visibility\n stylePreferences palette favouriteBrands\n isFollowedByMe followerCount followingCount\n`;\n\n/** Whether the caller currently follows `followeeId`. */\nexport const useIsFollowing = (followeeId: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'is-following', followeeId],\n enabled: Boolean(followeeId),\n queryFn: async () => {\n const data = await coolQuery<{ cooIsFollowing: boolean }>(\n `query CooIsFollowing($followeeId: ID!) { cooIsFollowing(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooIsFollowing;\n },\n });\n};\n\nexport const useFollow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (followeeId: string) => {\n const data = await coolQuery<{ cooFollow: boolean }>(\n `mutation CooFollow($followeeId: ID!) { cooFollow(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooFollow;\n },\n onSuccess: (_result, followeeId) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'is-following', followeeId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-following'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-followers'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\nexport const useUnfollow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (followeeId: string) => {\n const data = await coolQuery<{ cooUnfollow: boolean }>(\n `mutation CooUnfollow($followeeId: ID!) { cooUnfollow(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooUnfollow;\n },\n onSuccess: (_result, followeeId) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'is-following', followeeId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-following'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-followers'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\n/** Style profiles of people the caller follows. */\nexport const useMyFollowing = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-following'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyFollowing: CooStyleProfileConnection }>(\n `query CooMyFollowing {\n cooMyFollowing { items { ${FOLLOW_PROFILE_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyFollowing.items;\n },\n });\n};\n\n/** Style profiles of people following the caller. */\nexport const useMyFollowers = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-followers'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyFollowers: CooStyleProfileConnection }>(\n `query CooMyFollowers {\n cooMyFollowers { items { ${FOLLOW_PROFILE_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyFollowers.items;\n },\n });\n};\n\nexport const useLookbook = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'lookbook', id],\n queryFn: async () => {\n const data = await coolQuery<{\n cooLookbook: (CooLookbook & { entries?: CooLookbookEntryConnection | null }) | null;\n }>(\n `query CooLookbook($id: ID!) {\n cooLookbook(id: $id) {\n ${LOOKBOOK_FIELDS}\n entries { items { ${LOOKBOOK_ENTRY_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooLookbook) return null;\n const { entries, ...rest } = data.cooLookbook;\n return { ...rest, entries: entries?.items ?? [] };\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useDeleteLookbook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteLookbook: boolean }>(\n `mutation CooDeleteLookbook($id: ID!) { cooDeleteLookbook(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteLookbook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n },\n });\n};\n\n// ===========================================================================\n// Discovery search\n// ===========================================================================\n\nexport interface SearchStyleItemsArgs {\n input: CooSearchStyleItemsInput;\n pagination?: PaginationInput;\n /**\n * Run the search only while this is true. Every call is metered against the\n * workspace's `coolandlovely.searches.count` quota, so callers must not fire\n * a search the shopper has not asked for (for example a hidden tab).\n */\n enabled?: boolean;\n}\n\nexport const useSearchStyleItems = ({ enabled = true, ...args }: SearchStyleItemsArgs) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'search-style-items', args],\n enabled,\n queryFn: async () => {\n const data = await coolQuery<{ cooSearchStyleItems: CooStyleItemConnection }>(\n `query CooSearchStyleItems($input: CooSearchStyleItemsInput!, $pagination: PaginationInput) {\n cooSearchStyleItems(input: $input, pagination: $pagination) {\n items { ${STYLE_ITEM_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n input: args.input,\n pagination: args.pagination ?? { limit: 24, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooSearchStyleItems;\n },\n });\n};\n\nexport interface SearchLooksArgs {\n input: CooSearchLooksInput;\n pagination?: PaginationInput;\n /**\n * Run the search only while this is true. Every call is metered against the\n * workspace's `coolandlovely.searches.count` quota, so callers must not fire\n * a search the shopper has not asked for (for example a hidden tab).\n */\n enabled?: boolean;\n}\n\nexport const useSearchLooks = ({ enabled = true, ...args }: SearchLooksArgs) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'search-looks', args],\n enabled,\n queryFn: async () => {\n const data = await coolQuery<{ cooSearchLooks: CooLookConnection }>(\n `query CooSearchLooks($input: CooSearchLooksInput!, $pagination: PaginationInput) {\n cooSearchLooks(input: $input, pagination: $pagination) {\n items { ${LOOK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n input: args.input,\n pagination: args.pagination ?? { limit: 24, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooSearchLooks;\n },\n });\n};\n\n// ===========================================================================\n// Admin curation (gated by the `coolandlovely.admin.curation` feature flag)\n// ===========================================================================\n\nexport const useApproveBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooApproveBrand: CooBrand }>(\n `mutation CooApproveBrand($id: ID!) { cooApproveBrand(id: $id) { ${BRAND_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooApproveBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useRejectBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRejectBrand: CooBrand }>(\n `mutation CooRejectBrand($id: ID!) { cooRejectBrand(id: $id) { ${BRAND_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRejectBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useReviewCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooReviewCollaborationInput }) => {\n const data = await coolQuery<{ cooReviewCollaboration: CooCollaboration }>(\n `mutation CooReviewCollaboration($id: ID!, $input: CooReviewCollaborationInput!) {\n cooReviewCollaboration(id: $id, input: $input) { ${COLLABORATION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooReviewCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\nexport const useFeatureStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooFeatureStyleItem: CooStyleItem }>(\n `mutation CooFeatureStyleItem($id: ID!) { cooFeatureStyleItem(id: $id) { ${STYLE_ITEM_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooFeatureStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n },\n });\n};\n\nexport const useUnfeatureStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnfeatureStyleItem: CooStyleItem }>(\n `mutation CooUnfeatureStyleItem($id: ID!) { cooUnfeatureStyleItem(id: $id) { ${STYLE_ITEM_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnfeatureStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useCoolAndLovelyApi.js","names":[],"sources":["../../../src/coolandlovely/hooks/useCoolAndLovelyApi.ts"],"sourcesContent":["/**\n * CoolAndLovely API hooks\n * @module coolandlovely/hooks\n *\n * Thin, strictly-typed React Query layer over the federated\n * `wspace-coolandlovely-svc` GraphQL contract. Every query/mutation here maps\n * 1:1 to a real `coo*` root field — no mocks. Requests go through the workspace\n * gateway via `graphqlFetch({ gateway: 'workspace', workspaceToken: true })`.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n// Imported from the `/fetch` subpath (not the barrel) so it resolves against the\n// MFE's pinned fe-libs, which exposes the helper in fetch but not yet in the\n// graphql barrel index.\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useCoolAndLovely } from '../context';\nimport type {\n CooAddLookbookEntryInput,\n CooBrand,\n CooBrandConnection,\n CooBrandStatus,\n CooCollaboration,\n CooCollaborationConnection,\n CooCollaborationStatus,\n CooCollection,\n CooCollectionConnection,\n CooCollectionStatus,\n CooCreateBrandInput,\n CooCreateCollaborationInput,\n CooCreateCollectionInput,\n CooCreateLookInput,\n CooCreateLookbookInput,\n CooCreateStyleItemInput,\n CooCreateWardrobeItemInput,\n CooLook,\n CooLookConnection,\n CooLookItemConnection,\n CooLookOccasion,\n CooLookbook,\n CooLookbookEntryConnection,\n CooStyleCategory,\n CooStyleItem,\n CooStyleItemConnection,\n CooStyleItemStatus,\n CooStyleProfile,\n CooStyleProfileConnection,\n CooUpdateBrandInput,\n CooUpdateCollaborationInput,\n CooUpdateCollectionInput,\n CooUpdateLookInput,\n CooUpdateStyleItemInput,\n CooUpdateWardrobeItemInput,\n CooUpsertStyleProfileInput,\n CooWardrobeItem,\n CooWardrobeItemConnection,\n CooWardrobeSource,\n PaginationInput,\n CooSearchStyleItemsInput,\n CooSearchLooksInput,\n CooReviewCollaborationInput,\n} from '../types';\n\n// ---------------------------------------------------------------------------\n// Query key root\n// ---------------------------------------------------------------------------\n\nconst QK = 'coolandlovely';\n\n// ---------------------------------------------------------------------------\n// Low-level fetch wrapper\n// ---------------------------------------------------------------------------\n\nexport const coolQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n // fe-libs graphqlFetch caches every *query* response for ~15s in a global\n // response cache. After a successful mutation we drop that cache so the\n // React Query `invalidateQueries` refetch reads fresh data instead of the\n // stale pre-mutation response (otherwise a like/publish/transition/remove\n // shows no change for up to 15s).\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n return response.data;\n};\n\n// ---------------------------------------------------------------------------\n// Reusable GraphQL field selections\n// ---------------------------------------------------------------------------\n\nconst BRAND_FIELDS = `\n id workspaceId name handle tagline bio aesthetics tags websiteUrl\n isFeatured status logo { id } cover { id } createdAt updatedAt\n`;\n\nconst COLLECTION_FIELDS = `\n id workspaceId brandId name description season status tags\n cover { id } publishAt endAt createdAt updatedAt\n`;\n\nconst STYLE_ITEM_FIELDS = `\n id workspaceId brandId collectionId name description category status\n sku price currency colours sizes materials tags image { id }\n createdAt updatedAt\n`;\n\n/** The piece's Burdenoff store catalogue listing state (BOFF-3430). */\nconst STORE_LISTING_FIELDS = `\n storeProductId storeListingStatus storeSyncStatus storeSyncedAt\n`;\n\nconst LOOK_FIELDS = `\n id workspaceId authorId title caption occasion visibility isFeatured\n likeCount saveCount collaborationId image { id } tags publishedAt\n createdAt updatedAt isLikedByMe isSavedByMe\n`;\n\nconst LOOK_ITEM_FIELDS = `\n id workspaceId lookId styleItemId position styling createdAt updatedAt\n styleItem { id name category price currency brand { id name handle } image { id } }\n`;\n\nconst COLLABORATION_FIELDS = `\n id workspaceId brandId creatorId collectionId title brief role status\n compensation currency tags startDate endDate publishedAt createdAt updatedAt\n`;\n\n/** Fields of a collaboration fee (BOFF-9637), shared with the commerce hooks. */\nexport const COLLABORATION_PAYOUT_FIELDS = `\n id collaborationId collaborationTitle brandId creatorId amount currency status paymentProvider\n paidAt earningAvailableAt earningSyncStatus createdAt updatedAt\n`;\n\nconst WARDROBE_FIELDS = `\n id workspaceId profileId name category source brandName colour size notes\n styleItemId purchasePrice currency costPerWear timesWorn lastWornAt tags\n image { id } createdAt updatedAt\n`;\n\nconst PROFILE_FIELDS = `\n id workspaceId ownerId displayName bio visibility stylePreferences\n palette favouriteBrands sizes createdAt updatedAt\n isFollowedByMe followerCount followingCount\n`;\n\nconst LOOKBOOK_FIELDS = `\n id workspaceId ownerId profileId name description visibility tags\n cover { id } createdAt updatedAt\n`;\n\n// ===========================================================================\n// Brands\n// ===========================================================================\n\nexport interface ListBrandsArgs {\n status?: CooBrandStatus;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useBrands = (args: ListBrandsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'brands', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListBrands: CooBrandConnection }>(\n `query CooListBrands($status: CooBrandStatus, $featured: Boolean, $pagination: PaginationInput) {\n cooListBrands(status: $status, featured: $featured, pagination: $pagination) {\n items { ${BRAND_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: args.status,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListBrands;\n },\n });\n};\n\n/** Wire shape of `cooBrand` — its nested `collections`/`items` are Connections, flattened below. */\ntype CooBrandWire = Omit<CooBrand, 'collections' | 'items'> & {\n collections?: CooCollectionConnection | null;\n items?: CooStyleItemConnection | null;\n};\n\nexport const useBrand = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'brand', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooBrand: CooBrandWire | null }>(\n `query CooBrand($id: ID!) {\n cooBrand(id: $id) {\n ${BRAND_FIELDS}\n collections { items { ${COLLECTION_FIELDS} } pageInfo { cursor hasMore } }\n items { items { ${STYLE_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooBrand) return null;\n const { collections, items, ...rest } = data.cooBrand;\n return {\n ...rest,\n collections: collections?.items ?? [],\n items: items?.items ?? [],\n } as CooBrand;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateBrandInput) => {\n const data = await coolQuery<{ cooCreateBrand: CooBrand }>(\n `mutation CooCreateBrand($input: CooCreateBrandInput!) {\n cooCreateBrand(input: $input) { ${BRAND_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateBrand;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n },\n });\n};\n\nexport const useUpdateBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateBrandInput }) => {\n const data = await coolQuery<{ cooUpdateBrand: CooBrand }>(\n `mutation CooUpdateBrand($id: ID!, $input: CooUpdateBrandInput!) {\n cooUpdateBrand(id: $id, input: $input) { ${BRAND_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useTransitionBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: CooBrandStatus }) => {\n const data = await coolQuery<{ cooTransitionBrand: CooBrand }>(\n `mutation CooTransitionBrand($id: ID!, $status: CooBrandStatus!) {\n cooTransitionBrand(id: $id, status: $status) { ${BRAND_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.cooTransitionBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useArchiveBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveBrand: boolean }>(\n `mutation CooArchiveBrand($id: ID!) { cooArchiveBrand(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveBrand;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n },\n });\n};\n\n// ===========================================================================\n// Collections\n// ===========================================================================\n\nexport interface ListCollectionsArgs {\n brandId?: string;\n status?: CooCollectionStatus;\n}\n\nexport const useCollections = (args: ListCollectionsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collections', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListCollections: CooCollectionConnection }>(\n `query CooListCollections($brandId: ID, $status: CooCollectionStatus) {\n cooListCollections(brandId: $brandId, status: $status) {\n items { ${COLLECTION_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n { brandId: args.brandId, status: args.status },\n apiGatewayUrl\n );\n return data.cooListCollections.items;\n },\n });\n};\n\n/** Wire shape of `cooCollection` — its nested `items` is a Connection, flattened below. */\ntype CooCollectionWire = Omit<CooCollection, 'items'> & { items?: CooStyleItemConnection | null };\n\nexport const useCollection = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collection', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooCollection: CooCollectionWire | null }>(\n `query CooCollection($id: ID!) {\n cooCollection(id: $id) {\n ${COLLECTION_FIELDS}\n brand { id name handle }\n items { items { ${STYLE_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooCollection) return null;\n const { items, ...rest } = data.cooCollection;\n return { ...rest, items: items?.items ?? [] } as CooCollection;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateCollectionInput) => {\n const data = await coolQuery<{ cooCreateCollection: CooCollection }>(\n `mutation CooCreateCollection($input: CooCreateCollectionInput!) {\n cooCreateCollection(input: $input) { ${COLLECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateCollection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n },\n });\n};\n\nexport const useUpdateCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateCollectionInput }) => {\n const data = await coolQuery<{ cooUpdateCollection: CooCollection }>(\n `mutation CooUpdateCollection($id: ID!, $input: CooUpdateCollectionInput!) {\n cooUpdateCollection(id: $id, input: $input) { ${COLLECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateCollection;\n },\n onSuccess: (collection) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collection', collection.id] });\n },\n });\n};\n\nexport const usePublishCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooPublishCollection: CooCollection }>(\n `mutation CooPublishCollection($id: ID!) {\n cooPublishCollection(id: $id) { ${COLLECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooPublishCollection;\n },\n onSuccess: (collection) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collection', collection.id] });\n },\n });\n};\n\nexport const useArchiveCollection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveCollection: boolean }>(\n `mutation CooArchiveCollection($id: ID!) { cooArchiveCollection(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveCollection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collections'] });\n },\n });\n};\n\n// ===========================================================================\n// Style Items\n// ===========================================================================\n\nexport interface ListStyleItemsArgs {\n brandId?: string;\n collectionId?: string;\n category?: CooStyleCategory;\n status?: CooStyleItemStatus;\n pagination?: PaginationInput;\n}\n\nexport const useStyleItems = (args: ListStyleItemsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-items', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListStyleItems: CooStyleItemConnection }>(\n `query CooListStyleItems(\n $brandId: ID, $collectionId: ID, $category: CooStyleCategory,\n $status: CooStyleItemStatus, $pagination: PaginationInput\n ) {\n cooListStyleItems(\n brandId: $brandId, collectionId: $collectionId, category: $category,\n status: $status, pagination: $pagination\n ) {\n items { ${STYLE_ITEM_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n brandId: args.brandId,\n collectionId: args.collectionId,\n category: args.category,\n status: args.status,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListStyleItems;\n },\n });\n};\n\nexport const useStyleItem = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-item', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleItem: CooStyleItem | null }>(\n `query CooStyleItem($id: ID!) {\n cooStyleItem(id: $id) {\n ${STYLE_ITEM_FIELDS}\n ${STORE_LISTING_FIELDS}\n brand { id name handle }\n collection { id name }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooStyleItem;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateStyleItemInput) => {\n const data = await coolQuery<{ cooCreateStyleItem: CooStyleItem }>(\n `mutation CooCreateStyleItem($input: CooCreateStyleItemInput!) {\n cooCreateStyleItem(input: $input) { ${STYLE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateStyleItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n },\n });\n};\n\nexport const useUpdateStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateStyleItemInput }) => {\n const data = await coolQuery<{ cooUpdateStyleItem: CooStyleItem }>(\n `mutation CooUpdateStyleItem($id: ID!, $input: CooUpdateStyleItemInput!) {\n cooUpdateStyleItem(id: $id, input: $input) { ${STYLE_ITEM_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n // Sizes or colours may have changed, and with them the variants that hold stock.\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item-inventory', item.id] });\n },\n });\n};\n\n/**\n * Re-drive the push of a piece to its Burdenoff store catalogue listing\n * (`cooSyncStyleItemStoreListing`, BOFF-3430). Listings normally follow every\n * change automatically; this is the manual retry for a FAILED sync. The\n * service records a failed push on the piece rather than throwing, so the\n * returned item carries the new outcome either way.\n */\nexport const useSyncStyleItemStoreListing = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooSyncStyleItemStoreListing: CooStyleItem }>(\n `mutation CooSyncStyleItemStoreListing($id: ID!) {\n cooSyncStyleItemStoreListing(id: $id) { id ${STORE_LISTING_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooSyncStyleItemStoreListing;\n },\n onSuccess: (synced) => {\n queryClient.setQueryData<CooStyleItem | null>([QK, 'style-item', synced.id], (prev) =>\n prev ? { ...prev, ...synced } : prev\n );\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', synced.id] });\n },\n });\n};\n\nexport const useArchiveStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooArchiveStyleItem: boolean }>(\n `mutation CooArchiveStyleItem($id: ID!) { cooArchiveStyleItem(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooArchiveStyleItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n },\n });\n};\n\n// ===========================================================================\n// Looks\n// ===========================================================================\n\nexport interface ListLooksArgs {\n authorId?: string;\n occasion?: CooLookOccasion;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useLooks = (args: ListLooksArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'looks', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListLooks: CooLookConnection }>(\n `query CooListLooks(\n $authorId: ID, $occasion: CooLookOccasion, $featured: Boolean, $pagination: PaginationInput\n ) {\n cooListLooks(authorId: $authorId, occasion: $occasion, featured: $featured, pagination: $pagination) {\n items { ${LOOK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n authorId: args.authorId,\n occasion: args.occasion,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooListLooks;\n },\n });\n};\n\n/** Wire shape of `cooLook` — its nested `items` is a Connection, flattened below. */\ntype CooLookWire = Omit<CooLook, 'items'> & { items?: CooLookItemConnection | null };\n\nexport const useLook = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'look', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooLook: CooLookWire | null }>(\n `query CooLook($id: ID!) {\n cooLook(id: $id) {\n ${LOOK_FIELDS}\n items { items { ${LOOK_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooLook) return null;\n const { items, ...rest } = data.cooLook;\n return { ...rest, items: items?.items ?? [] } as CooLook;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useLooksWithItems = (args: ListLooksArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'looks-with-items', args],\n queryFn: async () => {\n const data = await coolQuery<{\n cooListLooks: { items: CooLookWire[]; pageInfo: CooLookConnection['pageInfo'] };\n }>(\n `query CooListLooksWithItems(\n $authorId: ID, $occasion: CooLookOccasion, $featured: Boolean, $pagination: PaginationInput\n ) {\n cooListLooks(authorId: $authorId, occasion: $occasion, featured: $featured, pagination: $pagination) {\n items { ${LOOK_FIELDS} items { items { ${LOOK_ITEM_FIELDS} } pageInfo { cursor hasMore } } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n authorId: args.authorId,\n occasion: args.occasion,\n featured: args.featured,\n pagination: args.pagination ?? { limit: 50, offset: 0 },\n },\n apiGatewayUrl\n );\n return {\n items: data.cooListLooks.items.map(\n ({ items, ...rest }) => ({ ...rest, items: items?.items ?? [] }) as CooLook\n ),\n pageInfo: data.cooListLooks.pageInfo,\n };\n },\n });\n};\n\nexport const useCreateLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateLookInput) => {\n const data = await coolQuery<{ cooCreateLook: CooLook }>(\n `mutation CooCreateLook($input: CooCreateLookInput!) {\n cooCreateLook(input: $input) { ${LOOK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateLook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n },\n });\n};\n\nexport const useUpdateLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateLookInput }) => {\n const data = await coolQuery<{ cooUpdateLook: CooLook }>(\n `mutation CooUpdateLook($id: ID!, $input: CooUpdateLookInput!) {\n cooUpdateLook(id: $id, input: $input) { ${LOOK_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const usePublishLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooPublishLook: CooLook }>(\n `mutation CooPublishLook($id: ID!) { cooPublishLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooPublishLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useLikeLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooLikeLook: CooLook }>(\n `mutation CooLikeLook($id: ID!) { cooLikeLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooLikeLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useUnlikeLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnlikeLook: CooLook }>(\n `mutation CooUnlikeLook($id: ID!) { cooUnlikeLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnlikeLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useSaveLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooSaveLook: CooLook }>(\n `mutation CooSaveLook($id: ID!) { cooSaveLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooSaveLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useUnsaveLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnsaveLook: CooLook }>(\n `mutation CooUnsaveLook($id: ID!) { cooUnsaveLook(id: $id) { ${LOOK_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnsaveLook;\n },\n onSuccess: (look) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'look', look.id] });\n },\n });\n};\n\nexport const useDeleteLook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteLook: boolean }>(\n `mutation CooDeleteLook($id: ID!) { cooDeleteLook(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteLook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'looks-with-items'] });\n },\n });\n};\n\n// ===========================================================================\n// Collaborations\n// ===========================================================================\n\nexport interface ListCollaborationsArgs {\n brandId?: string;\n creatorId?: string;\n status?: CooCollaborationStatus;\n}\n\nexport const useCollaborations = (args: ListCollaborationsArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collaborations', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListCollaborations: CooCollaborationConnection }>(\n `query CooListCollaborations($brandId: ID, $creatorId: ID, $status: CooCollaborationStatus) {\n cooListCollaborations(brandId: $brandId, creatorId: $creatorId, status: $status) {\n items { ${COLLABORATION_FIELDS} brand { id name handle logo { id } } }\n pageInfo { cursor hasMore }\n }\n }`,\n { brandId: args.brandId, creatorId: args.creatorId, status: args.status },\n apiGatewayUrl\n );\n return data.cooListCollaborations.items;\n },\n });\n};\n\n/** Wire shape of `cooCollaboration` — its nested `looks` is a Connection, flattened below. */\ntype CooCollaborationWire = Omit<CooCollaboration, 'looks'> & { looks?: CooLookConnection | null };\n\nexport const useCollaboration = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'collaboration', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooCollaboration: CooCollaborationWire | null }>(\n `query CooCollaboration($id: ID!) {\n cooCollaboration(id: $id) {\n ${COLLABORATION_FIELDS}\n brand { id name handle logo { id } }\n looks { items { ${LOOK_FIELDS} } pageInfo { cursor hasMore } }\n payout { ${COLLABORATION_PAYOUT_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooCollaboration) return null;\n const { looks, ...rest } = data.cooCollaboration;\n return { ...rest, looks: looks?.items ?? [] } as CooCollaboration;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useCreateCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateCollaborationInput) => {\n const data = await coolQuery<{ cooCreateCollaboration: CooCollaboration }>(\n `mutation CooCreateCollaboration($input: CooCreateCollaborationInput!) {\n cooCreateCollaboration(input: $input) { ${COLLABORATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateCollaboration;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n },\n });\n};\n\nexport const useUpdateCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateCollaborationInput }) => {\n const data = await coolQuery<{ cooUpdateCollaboration: CooCollaboration }>(\n `mutation CooUpdateCollaboration($id: ID!, $input: CooUpdateCollaborationInput!) {\n cooUpdateCollaboration(id: $id, input: $input) {\n ${COLLABORATION_FIELDS}\n brand { id name handle logo { id } }\n }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\nexport const useTransitionCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: CooCollaborationStatus }) => {\n const data = await coolQuery<{ cooTransitionCollaboration: CooCollaboration }>(\n `mutation CooTransitionCollaboration($id: ID!, $status: CooCollaborationStatus!) {\n cooTransitionCollaboration(id: $id, status: $status) { ${COLLABORATION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.cooTransitionCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\n/** Delete a still-PROPOSED collaboration (the svc rejects this once it has moved past PROPOSED). */\nexport const useDeleteCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteCollaboration: boolean }>(\n `mutation CooDeleteCollaboration($id: ID!) { cooDeleteCollaboration(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteCollaboration;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n },\n });\n};\n\n// ===========================================================================\n// Wardrobe (self-scoped)\n// ===========================================================================\n\nexport interface ListWardrobeArgs {\n category?: CooStyleCategory;\n source?: CooWardrobeSource;\n}\n\nexport const useWardrobeItems = (args: ListWardrobeArgs = {}) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'wardrobe', args],\n queryFn: async () => {\n const data = await coolQuery<{ cooListWardrobeItems: CooWardrobeItemConnection }>(\n `query CooListWardrobeItems($category: CooStyleCategory, $source: CooWardrobeSource) {\n cooListWardrobeItems(category: $category, source: $source) {\n items { ${WARDROBE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { category: args.category, source: args.source },\n apiGatewayUrl\n );\n return data.cooListWardrobeItems.items;\n },\n });\n};\n\nexport const useCreateWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateWardrobeItemInput) => {\n const data = await coolQuery<{ cooCreateWardrobeItem: CooWardrobeItem }>(\n `mutation CooCreateWardrobeItem($input: CooCreateWardrobeItemInput!) {\n cooCreateWardrobeItem(input: $input) { ${WARDROBE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useUpdateWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooUpdateWardrobeItemInput }) => {\n const data = await coolQuery<{ cooUpdateWardrobeItem: CooWardrobeItem }>(\n `mutation CooUpdateWardrobeItem($id: ID!, $input: CooUpdateWardrobeItemInput!) {\n cooUpdateWardrobeItem(id: $id, input: $input) { ${WARDROBE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooUpdateWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useLogWardrobeWear = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooLogWardrobeWear: CooWardrobeItem }>(\n `mutation CooLogWardrobeWear($id: ID!) {\n cooLogWardrobeWear(id: $id) { ${WARDROBE_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.cooLogWardrobeWear;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\nexport const useRemoveWardrobeItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRemoveWardrobeItem: boolean }>(\n `mutation CooRemoveWardrobeItem($id: ID!) { cooRemoveWardrobeItem(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRemoveWardrobeItem;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'wardrobe'] });\n },\n });\n};\n\n// ===========================================================================\n// Style Profile (self-scoped)\n// ===========================================================================\n\nexport const useMyStyleProfile = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-style-profile'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyStyleProfile: CooStyleProfile | null }>(\n `query CooMyStyleProfile { cooMyStyleProfile { ${PROFILE_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyStyleProfile;\n },\n });\n};\n\n/**\n * A style profile by its own id, honoring CooVisibility (PRIVATE/FOLLOWERS\n * gated server-side). Returns null when not found or not visible to the\n * caller. Disabled until `id` is provided.\n */\nexport const useStyleProfile = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-profile', id],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleProfile: CooStyleProfile | null }>(\n `query CooStyleProfile($id: ID!) { cooStyleProfile(id: $id) { ${PROFILE_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooStyleProfile;\n },\n enabled: Boolean(id),\n });\n};\n\n/**\n * Same visibility gate as `useStyleProfile`, looked up by the profile\n * owner's actor id — powers `/profile/:userId` (the public profile route\n * reached from an author's name/avatar on a Look/Discover/Collaboration\n * card). Disabled until `ownerId` is provided.\n */\nexport const useStyleProfileByOwner = (ownerId: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'style-profile-by-owner', ownerId],\n queryFn: async () => {\n const data = await coolQuery<{ cooStyleProfileByOwner: CooStyleProfile | null }>(\n `query CooStyleProfileByOwner($ownerId: ID!) {\n cooStyleProfileByOwner(ownerId: $ownerId) { ${PROFILE_FIELDS} }\n }`,\n { ownerId },\n apiGatewayUrl\n );\n return data.cooStyleProfileByOwner;\n },\n enabled: Boolean(ownerId),\n });\n};\n\nexport const useUpsertStyleProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooUpsertStyleProfileInput) => {\n const data = await coolQuery<{ cooUpsertStyleProfile: CooStyleProfile }>(\n `mutation CooUpsertStyleProfile($input: CooUpsertStyleProfileInput!) {\n cooUpsertStyleProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooUpsertStyleProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\n// ===========================================================================\n// Lookbooks\n// ===========================================================================\n\n/** The plain `CooLookbookEntry` field selection reused across lookbook queries. */\nconst LOOKBOOK_ENTRY_FIELDS =\n 'id workspaceId lookbookId lookId styleItemId note position createdAt updatedAt';\n\nexport const useLookbooks = (ownerId?: string) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'lookbooks', ownerId],\n queryFn: async () => {\n const data = await coolQuery<{\n cooListLookbooks: {\n items: (CooLookbook & { entries?: CooLookbookEntryConnection | null })[];\n pageInfo: unknown;\n };\n }>(\n `query CooListLookbooks($ownerId: ID) {\n cooListLookbooks(ownerId: $ownerId) {\n items {\n ${LOOKBOOK_FIELDS}\n entries { items { ${LOOKBOOK_ENTRY_FIELDS} } pageInfo { cursor hasMore } }\n }\n pageInfo { cursor hasMore }\n }\n }`,\n { ownerId },\n apiGatewayUrl\n );\n return data.cooListLookbooks.items.map(({ entries, ...rest }) => ({\n ...rest,\n entries: entries?.items ?? [],\n }));\n },\n });\n};\n\nexport const useCreateLookbook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooCreateLookbookInput) => {\n const data = await coolQuery<{ cooCreateLookbook: CooLookbook }>(\n `mutation CooCreateLookbook($input: CooCreateLookbookInput!) {\n cooCreateLookbook(input: $input) { ${LOOKBOOK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooCreateLookbook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n },\n });\n};\n\nexport const useAddLookbookEntry = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (input: CooAddLookbookEntryInput) => {\n const data = await coolQuery<{ cooAddLookbookEntry: { id: string; lookbookId: string } }>(\n `mutation CooAddLookbookEntry($input: CooAddLookbookEntryInput!) {\n cooAddLookbookEntry(input: $input) {\n id lookbookId lookId styleItemId note position createdAt updatedAt\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.cooAddLookbookEntry;\n },\n onSuccess: (entry) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook', entry.lookbookId] });\n },\n });\n};\n\nexport const useRemoveLookbookEntry = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRemoveLookbookEntry: boolean }>(\n `mutation CooRemoveLookbookEntry($id: ID!) { cooRemoveLookbookEntry(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRemoveLookbookEntry;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n },\n });\n};\n\n// ===========================================================================\n// Follow graph (added this release — cooFollow / cooUnfollow / cooIsFollowing)\n// ===========================================================================\n\nconst FOLLOW_PROFILE_FIELDS = `\n id workspaceId ownerId displayName bio visibility\n stylePreferences palette favouriteBrands\n isFollowedByMe followerCount followingCount\n`;\n\n/** Whether the caller currently follows `followeeId`. */\nexport const useIsFollowing = (followeeId: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'is-following', followeeId],\n enabled: Boolean(followeeId),\n queryFn: async () => {\n const data = await coolQuery<{ cooIsFollowing: boolean }>(\n `query CooIsFollowing($followeeId: ID!) { cooIsFollowing(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooIsFollowing;\n },\n });\n};\n\nexport const useFollow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (followeeId: string) => {\n const data = await coolQuery<{ cooFollow: boolean }>(\n `mutation CooFollow($followeeId: ID!) { cooFollow(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooFollow;\n },\n onSuccess: (_result, followeeId) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'is-following', followeeId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-following'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-followers'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\nexport const useUnfollow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (followeeId: string) => {\n const data = await coolQuery<{ cooUnfollow: boolean }>(\n `mutation CooUnfollow($followeeId: ID!) { cooUnfollow(followeeId: $followeeId) }`,\n { followeeId },\n apiGatewayUrl\n );\n return data.cooUnfollow;\n },\n onSuccess: (_result, followeeId) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'is-following', followeeId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-following'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-followers'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-style-profile'] });\n },\n });\n};\n\n/** Style profiles of people the caller follows. */\nexport const useMyFollowing = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-following'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyFollowing: CooStyleProfileConnection }>(\n `query CooMyFollowing {\n cooMyFollowing { items { ${FOLLOW_PROFILE_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyFollowing.items;\n },\n });\n};\n\n/** Style profiles of people following the caller. */\nexport const useMyFollowers = () => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'my-followers'],\n queryFn: async () => {\n const data = await coolQuery<{ cooMyFollowers: CooStyleProfileConnection }>(\n `query CooMyFollowers {\n cooMyFollowers { items { ${FOLLOW_PROFILE_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n {},\n apiGatewayUrl\n );\n return data.cooMyFollowers.items;\n },\n });\n};\n\nexport const useLookbook = (id: string | undefined) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'lookbook', id],\n queryFn: async () => {\n const data = await coolQuery<{\n cooLookbook: (CooLookbook & { entries?: CooLookbookEntryConnection | null }) | null;\n }>(\n `query CooLookbook($id: ID!) {\n cooLookbook(id: $id) {\n ${LOOKBOOK_FIELDS}\n entries { items { ${LOOKBOOK_ENTRY_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!data.cooLookbook) return null;\n const { entries, ...rest } = data.cooLookbook;\n return { ...rest, entries: entries?.items ?? [] };\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useDeleteLookbook = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooDeleteLookbook: boolean }>(\n `mutation CooDeleteLookbook($id: ID!) { cooDeleteLookbook(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.cooDeleteLookbook;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbooks'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'lookbook'] });\n },\n });\n};\n\n// ===========================================================================\n// Discovery search\n// ===========================================================================\n\nexport interface SearchStyleItemsArgs {\n input: CooSearchStyleItemsInput;\n pagination?: PaginationInput;\n /**\n * Run the search only while this is true. Every call is metered against the\n * workspace's `coolandlovely.searches.count` quota, so callers must not fire\n * a search the shopper has not asked for (for example a hidden tab).\n */\n enabled?: boolean;\n}\n\nexport const useSearchStyleItems = ({ enabled = true, ...args }: SearchStyleItemsArgs) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'search-style-items', args],\n enabled,\n queryFn: async () => {\n const data = await coolQuery<{ cooSearchStyleItems: CooStyleItemConnection }>(\n `query CooSearchStyleItems($input: CooSearchStyleItemsInput!, $pagination: PaginationInput) {\n cooSearchStyleItems(input: $input, pagination: $pagination) {\n items { ${STYLE_ITEM_FIELDS} brand { id name handle } }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n input: args.input,\n pagination: args.pagination ?? { limit: 24, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooSearchStyleItems;\n },\n });\n};\n\nexport interface SearchLooksArgs {\n input: CooSearchLooksInput;\n pagination?: PaginationInput;\n /**\n * Run the search only while this is true. Every call is metered against the\n * workspace's `coolandlovely.searches.count` quota, so callers must not fire\n * a search the shopper has not asked for (for example a hidden tab).\n */\n enabled?: boolean;\n}\n\nexport const useSearchLooks = ({ enabled = true, ...args }: SearchLooksArgs) => {\n const { apiGatewayUrl } = useCoolAndLovely();\n return useQuery({\n queryKey: [QK, 'search-looks', args],\n enabled,\n queryFn: async () => {\n const data = await coolQuery<{ cooSearchLooks: CooLookConnection }>(\n `query CooSearchLooks($input: CooSearchLooksInput!, $pagination: PaginationInput) {\n cooSearchLooks(input: $input, pagination: $pagination) {\n items { ${LOOK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n input: args.input,\n pagination: args.pagination ?? { limit: 24, offset: 0 },\n },\n apiGatewayUrl\n );\n return data.cooSearchLooks;\n },\n });\n};\n\n// ===========================================================================\n// Admin curation (gated by the `coolandlovely.admin.curation` feature flag)\n// ===========================================================================\n\nexport const useApproveBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooApproveBrand: CooBrand }>(\n `mutation CooApproveBrand($id: ID!) { cooApproveBrand(id: $id) { ${BRAND_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooApproveBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useRejectBrand = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooRejectBrand: CooBrand }>(\n `mutation CooRejectBrand($id: ID!) { cooRejectBrand(id: $id) { ${BRAND_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooRejectBrand;\n },\n onSuccess: (brand) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'brands'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'brand', brand.id] });\n },\n });\n};\n\nexport const useReviewCollaboration = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: CooReviewCollaborationInput }) => {\n const data = await coolQuery<{ cooReviewCollaboration: CooCollaboration }>(\n `mutation CooReviewCollaboration($id: ID!, $input: CooReviewCollaborationInput!) {\n cooReviewCollaboration(id: $id, input: $input) { ${COLLABORATION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.cooReviewCollaboration;\n },\n onSuccess: (collab) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaborations'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'collaboration', collab.id] });\n },\n });\n};\n\nexport const useFeatureStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooFeatureStyleItem: CooStyleItem }>(\n `mutation CooFeatureStyleItem($id: ID!) { cooFeatureStyleItem(id: $id) { ${STYLE_ITEM_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooFeatureStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n },\n });\n};\n\nexport const useUnfeatureStyleItem = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useCoolAndLovely();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await coolQuery<{ cooUnfeatureStyleItem: CooStyleItem }>(\n `mutation CooUnfeatureStyleItem($id: ID!) { cooUnfeatureStyleItem(id: $id) { ${STYLE_ITEM_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return data.cooUnfeatureStyleItem;\n },\n onSuccess: (item) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-items'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'style-item', item.id] });\n },\n });\n};\n"],"mappings":"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"}