@burdenoff/microfe-coolandlovely 2026.1102.1 → 2026.1102.3

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 (46) hide show
  1. package/README.md +15 -0
  2. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -1
  3. package/dist/coolandlovely/CoolAndLovelyRoot.js +8 -0
  4. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  5. package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -1
  6. package/dist/coolandlovely/CoolAndLovelyRoutes.js +20 -16
  7. package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
  8. package/dist/coolandlovely/hooks/useContextNavigation.d.ts +3 -0
  9. package/dist/coolandlovely/hooks/useContextNavigation.d.ts.map +1 -0
  10. package/dist/coolandlovely/hooks/useContextNavigation.js +31 -0
  11. package/dist/coolandlovely/hooks/useContextNavigation.js.map +1 -0
  12. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
  13. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +1 -1
  14. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  15. package/dist/coolandlovely/hooks/useCreatorMarketplace.d.ts +118 -0
  16. package/dist/coolandlovely/hooks/useCreatorMarketplace.d.ts.map +1 -0
  17. package/dist/coolandlovely/hooks/useCreatorMarketplace.js +120 -0
  18. package/dist/coolandlovely/hooks/useCreatorMarketplace.js.map +1 -0
  19. package/dist/coolandlovely/hooks/usePriceApi.d.ts.map +1 -1
  20. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts.map +1 -1
  21. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +139 -121
  22. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
  23. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts.map +1 -1
  24. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +140 -137
  25. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -1
  26. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.d.ts.map +1 -1
  27. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +104 -95
  28. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.d.ts.map +1 -1
  30. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js +49 -40
  31. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js.map +1 -1
  32. package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.d.ts +2 -0
  33. package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.d.ts.map +1 -0
  34. package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.js +714 -0
  35. package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.js.map +1 -0
  36. package/dist/coolandlovely/types/index.d.ts +5 -0
  37. package/dist/coolandlovely/types/index.d.ts.map +1 -1
  38. package/dist/generated/wspace-operations.d.ts +649 -0
  39. package/dist/generated/wspace-operations.d.ts.map +1 -1
  40. package/dist/generated/wspace-operations.js +141 -7
  41. package/dist/generated/wspace-operations.js.map +1 -1
  42. package/dist/generated/wspace-types.d.ts +315 -1
  43. package/dist/generated/wspace-types.d.ts.map +1 -1
  44. package/dist/generated/wspace-types.js +7 -1
  45. package/dist/generated/wspace-types.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCreatorMarketplace.js","names":[],"sources":["../../../src/coolandlovely/hooks/useCreatorMarketplace.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { print } from 'graphql';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useCoolAndLovely } from '../context';\nimport {\n CooMarketplaceMyOffersDocument,\n CooMarketplacePublishedOffersDocument,\n CooMarketplaceOfferDocument,\n CooMarketplaceProposalBrandsDocument,\n CooMarketplaceInboxDocument,\n CooMarketplaceCreateOfferDocument,\n CooMarketplaceUpdateOfferDocument,\n CooMarketplacePublishOfferDocument,\n CooMarketplaceArchiveOfferDocument,\n CooMarketplaceProposeOfferDocument,\n CooMarketplaceRespondDocument,\n type CooMarketplaceMyOffersQuery,\n type CooMarketplacePublishedOffersQuery,\n type CooMarketplaceOfferQuery,\n type CooMarketplaceProposalBrandsQuery,\n type CooMarketplaceInboxQuery,\n type CooMarketplaceCreateOfferMutation,\n type CooMarketplaceCreateOfferMutationVariables,\n type CooMarketplaceUpdateOfferMutation,\n type CooMarketplaceUpdateOfferMutationVariables,\n type CooMarketplacePublishOfferMutation,\n type CooMarketplacePublishOfferMutationVariables,\n type CooMarketplaceArchiveOfferMutation,\n type CooMarketplaceArchiveOfferMutationVariables,\n type CooMarketplaceProposeOfferMutation,\n type CooMarketplaceProposeOfferMutationVariables,\n type CooMarketplaceRespondMutation,\n type CooMarketplaceRespondMutationVariables,\n} from '../../generated/wspace-operations';\nimport type { CooProposalDirection } from '../../generated/wspace-types';\n\nexport type {\n CooMarketplaceRateCardFragment as CreatorOffer,\n CooMarketplaceProposalFragment as CreatorProposal,\n} from '../../generated/wspace-operations';\nconst KEY = ['coolandlovely', 'creator-marketplace'] as const;\nexport const MARKETPLACE_PAGE_SIZE = 20;\n\nfunction useRequest() {\n const { apiGatewayUrl, workspaceId, organizationId, tenantId, currentUser } = useCoolAndLovely();\n const ready = Boolean(workspaceId && currentUser?.id);\n const request = async <T>(\n query: string,\n variables: Record<string, unknown>,\n signal?: AbortSignal\n ): Promise<T> => {\n const result = await graphqlFetch<T>({\n gateway: 'workspace',\n baseUrl: apiGatewayUrl,\n workspaceToken: true,\n workspaceId: workspaceId ?? undefined,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n query,\n variables,\n signal,\n }).catch((error: unknown) => {\n if (error instanceof Error && 'errors' in error && Array.isArray(error.errors)) {\n throw Object.assign(error, { graphQLErrors: error.errors });\n }\n throw error;\n });\n if (result.errors?.length) {\n throw Object.assign(\n new Error(result.errors[0]?.message ?? 'The request could not be completed.'),\n { graphQLErrors: result.errors }\n );\n }\n if (!result.data) throw new Error('The request did not return data.');\n return result.data;\n };\n return { request, ready };\n}\n\nexport function useCreatorOffers(mode: 'mine' | 'published', page: number, enabled = true) {\n const { request, ready } = useRequest();\n return useQuery({\n queryKey: [...KEY, mode, page],\n enabled: enabled && ready,\n staleTime: 0,\n queryFn: async ({ signal }) => {\n const variables = { limit: MARKETPLACE_PAGE_SIZE, offset: page * MARKETPLACE_PAGE_SIZE };\n return mode === 'mine'\n ? (\n await request<CooMarketplaceMyOffersQuery>(\n print(CooMarketplaceMyOffersDocument),\n variables,\n signal\n )\n ).cooMyCreatorRateCards\n : (\n await request<CooMarketplacePublishedOffersQuery>(\n print(CooMarketplacePublishedOffersDocument),\n variables,\n signal\n )\n ).cooPublishedCreatorRateCards;\n },\n });\n}\nexport function useCreatorOffer(id: string | undefined, enabled = false) {\n const { request, ready } = useRequest();\n return useQuery({\n queryKey: [...KEY, 'offer', id],\n enabled: enabled && ready && Boolean(id),\n staleTime: 0,\n queryFn: async ({ signal }) => {\n if (!id) throw new Error('Choose an offer.');\n return (\n await request<CooMarketplaceOfferQuery>(print(CooMarketplaceOfferDocument), { id }, signal)\n ).cooCreatorRateCard;\n },\n });\n}\nexport function useProposalBrands(page: number, enabled: boolean) {\n const { request, ready } = useRequest();\n return useQuery({\n queryKey: [...KEY, 'brands', page],\n enabled: enabled && ready,\n staleTime: 0,\n queryFn: async ({ signal }) =>\n (\n await request<CooMarketplaceProposalBrandsQuery>(\n print(CooMarketplaceProposalBrandsDocument),\n { limit: MARKETPLACE_PAGE_SIZE, offset: page * MARKETPLACE_PAGE_SIZE },\n signal\n )\n ).cooMyProposalBrands,\n });\n}\nexport function useCreatorInbox(direction: CooProposalDirection, page: number, enabled: boolean) {\n const { request, ready } = useRequest();\n return useQuery({\n queryKey: [...KEY, 'inbox', direction, page],\n enabled: enabled && ready,\n staleTime: 0,\n queryFn: async ({ signal }) =>\n (\n await request<CooMarketplaceInboxQuery>(\n print(CooMarketplaceInboxDocument),\n { direction, limit: MARKETPLACE_PAGE_SIZE, offset: page * MARKETPLACE_PAGE_SIZE },\n signal\n )\n ).cooMyProposalInbox,\n });\n}\n\nfunction useAction<TData, TVariables extends Record<string, unknown>>(query: string) {\n const { request } = useRequest();\n const client = useQueryClient();\n return useMutation({\n mutationFn: (variables: TVariables) => request<TData>(query, variables),\n onSuccess: async () => {\n clearGraphqlFetchResponseCache();\n await Promise.all([\n client.invalidateQueries({ queryKey: KEY }),\n client.invalidateQueries({ queryKey: ['coolandlovely', 'collaborations'] }),\n client.invalidateQueries({ queryKey: ['coolandlovely', 'collaboration'] }),\n ]);\n },\n });\n}\nexport const useCreateCreatorOffer = () =>\n useAction<CooMarketplaceCreateOfferMutation, CooMarketplaceCreateOfferMutationVariables>(\n print(CooMarketplaceCreateOfferDocument)\n );\nexport const useUpdateCreatorOffer = () =>\n useAction<CooMarketplaceUpdateOfferMutation, CooMarketplaceUpdateOfferMutationVariables>(\n print(CooMarketplaceUpdateOfferDocument)\n );\nexport const usePublishCreatorOffer = () =>\n useAction<CooMarketplacePublishOfferMutation, CooMarketplacePublishOfferMutationVariables>(\n print(CooMarketplacePublishOfferDocument)\n );\nexport const useArchiveCreatorOffer = () =>\n useAction<CooMarketplaceArchiveOfferMutation, CooMarketplaceArchiveOfferMutationVariables>(\n print(CooMarketplaceArchiveOfferDocument)\n );\nexport const useProposeCreatorOffer = () =>\n useAction<CooMarketplaceProposeOfferMutation, CooMarketplaceProposeOfferMutationVariables>(\n print(CooMarketplaceProposeOfferDocument)\n );\nexport const useRespondToCreatorProposal = () =>\n useAction<CooMarketplaceRespondMutation, CooMarketplaceRespondMutationVariables>(\n print(CooMarketplaceRespondDocument)\n );\n"],"mappings":";;;;;;;;AA0CA,IAAM,IAAM,CAAC,iBAAiB,qBAAqB;AAGnD,SAAS,IAAa;CACpB,IAAM,EAAE,kBAAe,gBAAa,mBAAgB,aAAU,mBAAgB,EAAiB;CAgC/F,OAAO;EAAE,gBA7BP,GACA,GACA,MACe;GACf,IAAM,IAAS,MAAM,EAAgB;IACnC,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,aAAa,KAAe,KAAA;IAC5B,gBAAgB,KAAkB,KAAA;IAClC,UAAU,KAAY,KAAA;IACtB;IACA;IACA;GACF,CAAC,CAAC,CAAC,OAAO,MAAmB;IAI3B,MAHI,aAAiB,SAAS,YAAY,KAAS,MAAM,QAAQ,EAAM,MAAM,IACrE,OAAO,OAAO,GAAO,EAAE,eAAe,EAAM,OAAO,CAAC,IAEtD;GACR,CAAC;GACD,IAAI,EAAO,QAAQ,QACjB,MAAM,OAAO,OACP,MAAM,EAAO,OAAO,EAAE,EAAE,WAAW,qCAAqC,GAC5E,EAAE,eAAe,EAAO,OAAO,CACjC;GAEF,IAAI,CAAC,EAAO,MAAM,MAAU,MAAM,kCAAkC;GACpE,OAAO,EAAO;EAChB;EACkB,QA/BJ,EAAQ,KAAe,GAAa;CA+B1B;AAC1B;AAEA,SAAgB,EAAiB,GAA4B,GAAc,IAAU,IAAM;CACzF,IAAM,EAAE,YAAS,aAAU,EAAW;CACtC,OAAO,EAAS;EACd,UAAU;GAAC,GAAG;GAAK;GAAM;EAAI;EAC7B,SAAS,KAAW;EACpB,WAAW;EACX,SAAS,OAAO,EAAE,gBAAa;GAC7B,IAAM,IAAY;IAAE,OAAA;IAA8B,QAAQ,IAAA;GAA6B;GACvF,OAAO,MAAS,UAEV,MAAM,EACJ,EAAM,CAA8B,GACpC,GACA,CACF,EAAA,CACA,yBAEA,MAAM,EACJ,EAAM,CAAqC,GAC3C,GACA,CACF,EAAA,CACA;EACR;CACF,CAAC;AACH;AACA,SAAgB,EAAgB,GAAwB,IAAU,IAAO;CACvE,IAAM,EAAE,YAAS,aAAU,EAAW;CACtC,OAAO,EAAS;EACd,UAAU;GAAC,GAAG;GAAK;GAAS;EAAE;EAC9B,SAAS,KAAW,KAAS,EAAQ;EACrC,WAAW;EACX,SAAS,OAAO,EAAE,gBAAa;GAC7B,IAAI,CAAC,GAAI,MAAU,MAAM,kBAAkB;GAC3C,QACE,MAAM,EAAkC,EAAM,CAA2B,GAAG,EAAE,MAAG,GAAG,CAAM,EAAA,CAC1F;EACJ;CACF,CAAC;AACH;AACA,SAAgB,EAAkB,GAAc,GAAkB;CAChE,IAAM,EAAE,YAAS,aAAU,EAAW;CACtC,OAAO,EAAS;EACd,UAAU;GAAC,GAAG;GAAK;GAAU;EAAI;EACjC,SAAS,KAAW;EACpB,WAAW;EACX,SAAS,OAAO,EAAE,iBAEd,MAAM,EACJ,EAAM,CAAoC,GAC1C;GAAE,OAAA;GAA8B,QAAQ,IAAA;EAA6B,GACrE,CACF,EAAA,CACA;CACN,CAAC;AACH;AACA,SAAgB,EAAgB,GAAiC,GAAc,GAAkB;CAC/F,IAAM,EAAE,YAAS,aAAU,EAAW;CACtC,OAAO,EAAS;EACd,UAAU;GAAC,GAAG;GAAK;GAAS;GAAW;EAAI;EAC3C,SAAS,KAAW;EACpB,WAAW;EACX,SAAS,OAAO,EAAE,iBAEd,MAAM,EACJ,EAAM,CAA2B,GACjC;GAAE;GAAW,OAAA;GAA8B,QAAQ,IAAA;EAA6B,GAChF,CACF,EAAA,CACA;CACN,CAAC;AACH;AAEA,SAAS,EAA6D,GAAe;CACnF,IAAM,EAAE,eAAY,EAAW,GACzB,IAAS,EAAe;CAC9B,OAAO,EAAY;EACjB,aAAa,MAA0B,EAAe,GAAO,CAAS;EACtE,WAAW,YAAY;GAErB,AADA,EAA+B,GAC/B,MAAM,QAAQ,IAAI;IAChB,EAAO,kBAAkB,EAAE,UAAU,EAAI,CAAC;IAC1C,EAAO,kBAAkB,EAAE,UAAU,CAAC,iBAAiB,gBAAgB,EAAE,CAAC;IAC1E,EAAO,kBAAkB,EAAE,UAAU,CAAC,iBAAiB,eAAe,EAAE,CAAC;GAC3E,CAAC;EACH;CACF,CAAC;AACH;AACA,IAAa,UACX,EACE,EAAM,CAAiC,CACzC,GACW,UACX,EACE,EAAM,CAAiC,CACzC,GACW,UACX,EACE,EAAM,CAAkC,CAC1C,GACW,UACX,EACE,EAAM,CAAkC,CAC1C,GACW,UACX,EACE,EAAM,CAAkC,CAC1C,GACW,UACX,EACE,EAAM,CAA6B,CACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePriceApi.d.ts","sourceRoot":"","sources":["../../../src/coolandlovely/hooks/usePriceApi.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAIV,mBAAmB,EAGpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAqBvE,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM;;;;;;YAiBrE;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,8EAejB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM;;;kBAX1C,CAAJ;;;;;wBAG2B,CAAC;;uBACY,CAAA;;;;kBAItC,CAAA;;cAGgC,CAAC;;UAelC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;kBAN/E,CAAF;;;sBAMQ,CAAA;qBAA8B,CAAC;;mBAC7C,CAAA;;;kBACS,CAAC;;cACqB,CAAC;;UAYjC;AAED,wBAAgB,mBAAmB;UAKb,MAAM;WAAS,kBAAkB;;UAAa,QAAQ;QAAM,MAAM;YAwBvF"}
1
+ {"version":3,"file":"usePriceApi.d.ts","sourceRoot":"","sources":["../../../src/coolandlovely/hooks/usePriceApi.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAIV,mBAAmB,EAGpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAqBvE,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM;;;;;;YAiBrE;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,8EAejB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM;;;kBAgEs2L,CAAC;;;;;wBAAqH,CAAC;;uBAAkD,CAAC;;;;kBAA6D,CAAC;;cAAyC,CAAC;;UAjDrqM;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;kBA+C27M,CAAC;;;sBAAqE,CAAC;qBAA8B,CAAC;;mBAA+C,CAAC;;;kBAA0C,CAAC;;cAAyC,CAAC;;UAhC9vN;AAED,wBAAgB,mBAAmB;UAKb,MAAM;WAAS,kBAAkB;;UAAa,QAAQ;QAAM,MAAM;YAwBvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0CH,wBAAgB,uBAAuB,gCA4OtC"}
1
+ {"version":3,"file":"CollaborationDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH,wBAAgB,uBAAuB,gCA+QtC"}
@@ -2,22 +2,24 @@ import { useCoolAndLovely as e } from "../../context/CoolAndLovelyContext.js";
2
2
  import { PageLayout as t } from "../../components/PageLayout.js";
3
3
  import { useCollaboration as n, useDeleteCollaboration as r, useTransitionCollaboration as i } from "../../hooks/useCoolAndLovelyApi.js";
4
4
  import { useAssistantEntityName as a } from "../../hooks/useAssistantEntity.js";
5
+ import { useTr as o } from "../../hooks/useTr.js";
5
6
  import "../../hooks/index.js";
6
- import { StatusBadge as o } from "../../components/StatusBadge.js";
7
- import { ErrorView as s, LoadingView as c } from "../../components/StateViews.js";
8
- import { Thumbnail as l } from "../../components/Thumbnail.js";
9
- import { formatDate as u, formatPrice as d, titleCase as f } from "../../utils/formatters.js";
10
- import { TagList as p } from "../../components/TagList.js";
11
- import { ActorName as m } from "../../components/ActorName.js";
12
- import { StepTracker as h } from "../../components/StepTracker.js";
13
- import { BrandCreatorAvatars as g } from "../../components/BrandCreatorAvatars.js";
14
- import { CollaborationFeeCard as _ } from "../../components/CollaborationFeeCard.js";
15
- import { ArrowLeft as v, Loader2 as y, Pencil as b, Sparkles as x, Store as S, Trash2 as C } from "lucide-react";
16
- import { useParams as w } from "react-router";
17
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
18
- import { GlassCard as D } from "@burdenoff/fe-libs/ui";
7
+ import { StatusBadge as s } from "../../components/StatusBadge.js";
8
+ import { ErrorView as c, LoadingView as l } from "../../components/StateViews.js";
9
+ import { Thumbnail as u } from "../../components/Thumbnail.js";
10
+ import { formatDate as d, formatPrice as f, titleCase as p } from "../../utils/formatters.js";
11
+ import { TagList as m } from "../../components/TagList.js";
12
+ import { ActorName as h } from "../../components/ActorName.js";
13
+ import { StepTracker as g } from "../../components/StepTracker.js";
14
+ import { BrandCreatorAvatars as _ } from "../../components/BrandCreatorAvatars.js";
15
+ import { useContextNavigation as v } from "../../hooks/useContextNavigation.js";
16
+ import { CollaborationFeeCard as y } from "../../components/CollaborationFeeCard.js";
17
+ import { ArrowLeft as b, Loader2 as x, Pencil as S, Sparkles as C, Store as w, Trash2 as T } from "lucide-react";
18
+ import { useParams as E } from "react-router";
19
+ import { jsx as D, jsxs as O } from "react/jsx-runtime";
20
+ import { GlassCard as k } from "@burdenoff/fe-libs/ui";
19
21
  //#region src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx
20
- var O = {
22
+ var A = {
21
23
  PROPOSED: [
22
24
  "ACCEPTED",
23
25
  "DECLINED",
@@ -28,241 +30,257 @@ var O = {
28
30
  PUBLISHED: [],
29
31
  DECLINED: [],
30
32
  CANCELLED: []
31
- }, k = [
33
+ }, j = [
32
34
  "PROPOSED",
33
35
  "ACCEPTED",
34
36
  "IN_PROGRESS",
35
37
  "PUBLISHED"
36
38
  ];
37
- function A() {
38
- let { collaborationId: A } = w(), { navigateTo: j } = e(), M = n(A), N = i(), P = r();
39
- if (a(A, M.data?.title), M.isLoading) return /* @__PURE__ */ T(t, {
39
+ function M() {
40
+ let M = o(), { collaborationId: N } = E(), { currentUser: P } = e(), F = v(), I = n(N), L = i(), R = r();
41
+ if (a(N, I.data?.title), I.isLoading) return /* @__PURE__ */ D(t, {
40
42
  title: "Collaboration",
41
- children: /* @__PURE__ */ T(c, { label: "Loading collaboration…" })
43
+ children: /* @__PURE__ */ D(l, { label: "Loading collaboration…" })
42
44
  });
43
- if (M.isError || !M.data) return /* @__PURE__ */ T(t, {
45
+ if (I.isError || !I.data) return /* @__PURE__ */ D(t, {
44
46
  title: "Collaboration",
45
- children: /* @__PURE__ */ T(s, {
47
+ children: /* @__PURE__ */ D(c, {
46
48
  title: "Collaboration not found",
47
- onRetry: () => void M.refetch()
49
+ onRetry: () => void I.refetch()
48
50
  })
49
51
  });
50
- let F = M.data, I = F.looks ?? [], L = O[F.status], R = k.includes(F.status) ? k : ["PROPOSED", F.status];
51
- return /* @__PURE__ */ T(t, {
52
- title: F.title,
53
- description: F.brand?.name ?? void 0,
54
- actions: /* @__PURE__ */ E("div", {
52
+ let z = I.data, B = z.looks ?? [], V = A[z.status].filter((e) => !z.rateCardId || z.creatorId === P?.id || e !== "ACCEPTED" && e !== "DECLINED"), H = j.includes(z.status) ? j : ["PROPOSED", z.status];
53
+ return /* @__PURE__ */ D(t, {
54
+ title: z.title,
55
+ description: z.brand?.name ?? void 0,
56
+ actions: /* @__PURE__ */ O("div", {
55
57
  className: "flex items-center gap-2",
56
58
  children: [
57
- L.length > 0 && /* @__PURE__ */ E("button", {
59
+ V.length > 0 && /* @__PURE__ */ O("button", {
58
60
  type: "button",
59
- onClick: () => j(`/collaborations/${F.id}/edit`),
61
+ onClick: () => F(`/collaborations/${z.id}/edit`),
60
62
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
61
- children: [/* @__PURE__ */ T(b, { className: "h-4 w-4" }), " Edit"]
63
+ children: [/* @__PURE__ */ D(S, { className: "h-4 w-4" }), " Edit"]
62
64
  }),
63
- F.status === "PROPOSED" && /* @__PURE__ */ E("button", {
65
+ z.status === "PROPOSED" && /* @__PURE__ */ O("button", {
64
66
  type: "button",
65
- disabled: P.isPending,
66
- onClick: () => P.mutate(F.id, { onSuccess: () => j("/collaborations") }),
67
+ disabled: R.isPending,
68
+ onClick: () => R.mutate(z.id, { onSuccess: () => F("/collaborations") }),
67
69
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50",
68
- children: [P.isPending ? /* @__PURE__ */ T(y, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ T(C, { className: "h-4 w-4" }), "Delete"]
70
+ children: [R.isPending ? /* @__PURE__ */ D(x, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ D(T, { className: "h-4 w-4" }), "Delete"]
69
71
  }),
70
- /* @__PURE__ */ E("button", {
72
+ /* @__PURE__ */ O("button", {
71
73
  type: "button",
72
- onClick: () => j("/collaborations"),
74
+ onClick: () => F("/collaborations"),
73
75
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
74
- children: [/* @__PURE__ */ T(v, { className: "h-4 w-4" }), " Back"]
76
+ children: [/* @__PURE__ */ D(b, { className: "h-4 w-4" }), " Back"]
75
77
  })
76
78
  ]
77
79
  }),
78
- children: /* @__PURE__ */ E("div", {
80
+ children: /* @__PURE__ */ O("div", {
79
81
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
80
- children: [/* @__PURE__ */ E("div", {
82
+ children: [/* @__PURE__ */ O("div", {
81
83
  className: "lg:col-span-2",
82
- children: [/* @__PURE__ */ E(D, {
84
+ children: [/* @__PURE__ */ O(k, {
83
85
  treatment: "glass",
84
86
  className: "p-6",
85
87
  children: [
86
- /* @__PURE__ */ E("div", {
88
+ /* @__PURE__ */ O("div", {
87
89
  className: "flex items-center gap-3",
88
90
  children: [
89
- /* @__PURE__ */ T(g, {
90
- brandLogoFileId: F.brand?.logo?.id,
91
- brandSeed: F.brandId,
92
- creatorId: F.creatorId,
91
+ /* @__PURE__ */ D(_, {
92
+ brandLogoFileId: z.brand?.logo?.id,
93
+ brandSeed: z.brandId,
94
+ creatorId: z.creatorId,
93
95
  className: "shrink-0"
94
96
  }),
95
- /* @__PURE__ */ E("div", {
97
+ /* @__PURE__ */ O("div", {
96
98
  className: "min-w-0 flex-1",
97
- children: [/* @__PURE__ */ T("h2", {
99
+ children: [/* @__PURE__ */ D("h2", {
98
100
  className: "truncate text-xl font-semibold text-text-primary",
99
- children: F.title
100
- }), /* @__PURE__ */ E("p", {
101
+ children: z.title
102
+ }), /* @__PURE__ */ O("p", {
101
103
  className: "text-xs text-text-secondary",
102
104
  children: [
103
- F.brand?.name ?? "Brand",
105
+ z.brand?.name ?? "Brand",
104
106
  " ×",
105
107
  " ",
106
- /* @__PURE__ */ T("button", {
108
+ /* @__PURE__ */ D("button", {
107
109
  type: "button",
108
- onClick: () => j(`/profile/${F.creatorId}`),
110
+ onClick: () => F(`/profile/${z.creatorId}`),
109
111
  className: "font-medium text-text-primary hover:underline focus-visible:outline-none",
110
- children: /* @__PURE__ */ T(m, { id: F.creatorId })
112
+ children: /* @__PURE__ */ D(h, { id: z.creatorId })
111
113
  }),
112
114
  " ",
113
115
  "· ",
114
- f(F.role),
116
+ p(z.role),
115
117
  " collaboration"
116
118
  ]
117
119
  })]
118
120
  }),
119
- /* @__PURE__ */ T(o, { status: F.status })
121
+ /* @__PURE__ */ D(s, { status: z.status })
120
122
  ]
121
123
  }),
122
- F.brief && /* @__PURE__ */ T("p", {
124
+ z.brief && /* @__PURE__ */ D("p", {
123
125
  className: "mt-4 text-sm text-text-secondary",
124
- children: F.brief
126
+ children: z.brief
125
127
  }),
126
- F.tags.length > 0 && /* @__PURE__ */ T(p, {
127
- tags: F.tags,
128
+ z.rateCardId && /* @__PURE__ */ O("div", {
129
+ className: "mt-4 space-y-2 text-sm text-text-secondary",
130
+ children: [
131
+ /* @__PURE__ */ D("h3", {
132
+ className: "font-semibold text-text-primary",
133
+ children: M("coolandlovely.marketplace.agreedQuote", "Agreed service quote")
134
+ }),
135
+ /* @__PURE__ */ D("p", { children: z.rateCardTitle }),
136
+ /* @__PURE__ */ D("ul", {
137
+ className: "list-inside list-disc",
138
+ children: z.quotedDeliverables?.map((e) => /* @__PURE__ */ D("li", { children: e }, e))
139
+ }),
140
+ z.quotedDeliveryDays != null && /* @__PURE__ */ D("p", { children: M("coolandlovely.marketplace.delivery", "Delivery within {{days}} days of the agreed start", { days: z.quotedDeliveryDays }) }),
141
+ /* @__PURE__ */ D("p", { children: M("coolandlovely.marketplace.immutable", "The service fee, currency, role and deliverables are preserved from the reviewed offer.") })
142
+ ]
143
+ }),
144
+ z.tags.length > 0 && /* @__PURE__ */ D(m, {
145
+ tags: z.tags,
128
146
  className: "mt-4",
129
147
  tone: "accent"
130
148
  })
131
149
  ]
132
- }), /* @__PURE__ */ E("section", {
150
+ }), /* @__PURE__ */ O("section", {
133
151
  className: "mt-6",
134
- children: [/* @__PURE__ */ E("h3", {
152
+ children: [/* @__PURE__ */ O("h3", {
135
153
  className: "mb-3 text-lg font-semibold text-text-primary",
136
154
  children: [
137
155
  "Attributed looks (",
138
- I.length,
156
+ B.length,
139
157
  ")"
140
158
  ]
141
- }), I.length === 0 ? /* @__PURE__ */ T("p", {
159
+ }), B.length === 0 ? /* @__PURE__ */ D("p", {
142
160
  className: "rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary",
143
161
  children: "No looks attributed to this collaboration yet."
144
- }) : /* @__PURE__ */ T("div", {
162
+ }) : /* @__PURE__ */ D("div", {
145
163
  className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
146
- children: I.map((e) => /* @__PURE__ */ E("button", {
164
+ children: B.map((e) => /* @__PURE__ */ O("button", {
147
165
  type: "button",
148
- onClick: () => j(`/looks/${e.id}`),
166
+ onClick: () => F(`/looks/${e.id}`),
149
167
  className: "overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md",
150
- children: [/* @__PURE__ */ T(l, {
151
- icon: /* @__PURE__ */ T(x, { className: "h-6 w-6" }),
168
+ children: [/* @__PURE__ */ D(u, {
169
+ icon: /* @__PURE__ */ D(C, { className: "h-6 w-6" }),
152
170
  seed: e.id,
153
171
  className: "h-24 w-full"
154
- }), /* @__PURE__ */ E("div", {
172
+ }), /* @__PURE__ */ O("div", {
155
173
  className: "p-3",
156
- children: [/* @__PURE__ */ T("p", {
174
+ children: [/* @__PURE__ */ D("p", {
157
175
  className: "truncate text-sm font-medium text-text-primary",
158
176
  children: e.title
159
- }), /* @__PURE__ */ T("p", {
177
+ }), /* @__PURE__ */ D("p", {
160
178
  className: "mt-0.5 text-xs text-text-secondary",
161
- children: f(e.occasion)
179
+ children: p(e.occasion)
162
180
  })]
163
181
  })]
164
182
  }, e.id))
165
183
  })]
166
184
  })]
167
- }), /* @__PURE__ */ E("div", {
185
+ }), /* @__PURE__ */ O("div", {
168
186
  className: "space-y-4",
169
187
  children: [
170
- /* @__PURE__ */ E(D, {
188
+ /* @__PURE__ */ O(k, {
171
189
  treatment: "insight",
172
190
  className: "p-5",
173
191
  children: [
174
- /* @__PURE__ */ T("h3", {
192
+ /* @__PURE__ */ D("h3", {
175
193
  className: "mb-3 text-sm font-semibold text-text-primary",
176
194
  children: "Lifecycle"
177
195
  }),
178
- /* @__PURE__ */ T(h, {
179
- steps: R,
180
- current: F.status,
196
+ /* @__PURE__ */ D(g, {
197
+ steps: H,
198
+ current: z.status,
181
199
  className: "mb-5"
182
200
  }),
183
- /* @__PURE__ */ E("div", {
201
+ /* @__PURE__ */ O("div", {
184
202
  className: "mb-3 flex items-center gap-2",
185
- children: [/* @__PURE__ */ T("span", {
203
+ children: [/* @__PURE__ */ D("span", {
186
204
  className: "text-sm text-text-secondary",
187
205
  children: "Current:"
188
- }), /* @__PURE__ */ T(o, { status: F.status })]
206
+ }), /* @__PURE__ */ D(s, { status: z.status })]
189
207
  }),
190
- L.length === 0 ? /* @__PURE__ */ T("p", {
208
+ V.length === 0 ? /* @__PURE__ */ D("p", {
191
209
  className: "text-xs text-text-secondary",
192
210
  children: "This collaboration is in a terminal state."
193
- }) : /* @__PURE__ */ T("div", {
211
+ }) : /* @__PURE__ */ D("div", {
194
212
  className: "flex flex-col gap-2",
195
- children: L.map((e) => /* @__PURE__ */ E("button", {
213
+ children: V.map((e) => /* @__PURE__ */ O("button", {
196
214
  type: "button",
197
- disabled: N.isPending,
198
- onClick: () => N.mutate({
199
- id: F.id,
215
+ disabled: L.isPending,
216
+ onClick: () => L.mutate({
217
+ id: z.id,
200
218
  status: e
201
219
  }),
202
220
  className: "inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50",
203
221
  children: [
204
- N.isPending && /* @__PURE__ */ T(y, { className: "h-3.5 w-3.5 animate-spin" }),
222
+ L.isPending && /* @__PURE__ */ D(x, { className: "h-3.5 w-3.5 animate-spin" }),
205
223
  "Move to ",
206
- f(e)
224
+ p(e)
207
225
  ]
208
226
  }, e))
209
227
  }),
210
- N.isError && /* @__PURE__ */ T("p", {
228
+ L.isError && /* @__PURE__ */ D("p", {
211
229
  className: "mt-2 text-xs text-status-error-text",
212
- children: N.error instanceof Error ? N.error.message : "Transition failed"
230
+ children: L.error instanceof Error ? L.error.message : "Transition failed"
213
231
  })
214
232
  ]
215
233
  }),
216
- /* @__PURE__ */ E(D, {
234
+ /* @__PURE__ */ O(k, {
217
235
  treatment: "plain",
218
236
  className: "p-5",
219
- children: [/* @__PURE__ */ T("h3", {
237
+ children: [/* @__PURE__ */ D("h3", {
220
238
  className: "mb-3 text-sm font-semibold text-text-primary",
221
239
  children: "Terms"
222
- }), /* @__PURE__ */ E("dl", {
240
+ }), /* @__PURE__ */ O("dl", {
223
241
  className: "space-y-2 text-sm",
224
242
  children: [
225
- /* @__PURE__ */ E("div", {
243
+ /* @__PURE__ */ O("div", {
226
244
  className: "flex justify-between gap-2",
227
- children: [/* @__PURE__ */ T("dt", {
245
+ children: [/* @__PURE__ */ D("dt", {
228
246
  className: "text-text-secondary",
229
247
  children: "Role"
230
- }), /* @__PURE__ */ T("dd", {
248
+ }), /* @__PURE__ */ D("dd", {
231
249
  className: "text-text-primary",
232
- children: f(F.role)
250
+ children: p(z.role)
233
251
  })]
234
252
  }),
235
- /* @__PURE__ */ E("div", {
253
+ /* @__PURE__ */ O("div", {
236
254
  className: "flex justify-between gap-2",
237
- children: [/* @__PURE__ */ T("dt", {
255
+ children: [/* @__PURE__ */ D("dt", {
238
256
  className: "text-text-secondary",
239
257
  children: "Compensation"
240
- }), /* @__PURE__ */ T("dd", {
258
+ }), /* @__PURE__ */ D("dd", {
241
259
  className: "text-text-primary",
242
- children: d(F.compensation, F.currency)
260
+ children: f(z.compensation, z.currency)
243
261
  })]
244
262
  }),
245
- /* @__PURE__ */ E("div", {
263
+ /* @__PURE__ */ O("div", {
246
264
  className: "flex justify-between gap-2",
247
- children: [/* @__PURE__ */ T("dt", {
265
+ children: [/* @__PURE__ */ D("dt", {
248
266
  className: "text-text-secondary",
249
267
  children: "Starts"
250
- }), /* @__PURE__ */ T("dd", {
268
+ }), /* @__PURE__ */ D("dd", {
251
269
  className: "text-text-primary",
252
- children: F.startDate ? u(F.startDate, {
270
+ children: z.startDate ? d(z.startDate, {
253
271
  hour: void 0,
254
272
  minute: void 0
255
273
  }) : "—"
256
274
  })]
257
275
  }),
258
- /* @__PURE__ */ E("div", {
276
+ /* @__PURE__ */ O("div", {
259
277
  className: "flex justify-between gap-2",
260
- children: [/* @__PURE__ */ T("dt", {
278
+ children: [/* @__PURE__ */ D("dt", {
261
279
  className: "text-text-secondary",
262
280
  children: "Ends"
263
- }), /* @__PURE__ */ T("dd", {
281
+ }), /* @__PURE__ */ D("dd", {
264
282
  className: "text-text-primary",
265
- children: F.endDate ? u(F.endDate, {
283
+ children: z.endDate ? d(z.endDate, {
266
284
  hour: void 0,
267
285
  minute: void 0
268
286
  }) : "—"
@@ -271,21 +289,21 @@ function A() {
271
289
  ]
272
290
  })]
273
291
  }),
274
- /* @__PURE__ */ T(_, { collaboration: F }),
275
- F.brand && /* @__PURE__ */ E("button", {
292
+ /* @__PURE__ */ D(y, { collaboration: z }),
293
+ z.brand && /* @__PURE__ */ O("button", {
276
294
  type: "button",
277
- onClick: () => j(`/brands/${F.brand?.id}`),
295
+ onClick: () => F(`/brands/${z.brand?.id}`),
278
296
  className: "flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50",
279
- children: [/* @__PURE__ */ T(l, {
280
- icon: /* @__PURE__ */ T(S, { className: "h-5 w-5" }),
281
- seed: F.brand.id,
297
+ children: [/* @__PURE__ */ D(u, {
298
+ icon: /* @__PURE__ */ D(w, { className: "h-5 w-5" }),
299
+ seed: z.brand.id,
282
300
  className: "h-10 w-10 shrink-0"
283
- }), /* @__PURE__ */ E("div", {
301
+ }), /* @__PURE__ */ O("div", {
284
302
  className: "min-w-0",
285
- children: [/* @__PURE__ */ T("p", {
303
+ children: [/* @__PURE__ */ D("p", {
286
304
  className: "truncate text-sm font-medium text-text-primary",
287
- children: F.brand.name
288
- }), /* @__PURE__ */ T("p", {
305
+ children: z.brand.name
306
+ }), /* @__PURE__ */ D("p", {
289
307
  className: "truncate text-xs text-text-secondary",
290
308
  children: "View brand"
291
309
  })]
@@ -297,6 +315,6 @@ function A() {
297
315
  });
298
316
  }
299
317
  //#endregion
300
- export { A as CollaborationDetailPage };
318
+ export { M as CollaborationDetailPage };
301
319
 
302
320
  //# sourceMappingURL=CollaborationDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"sourcesContent":["/**\n * Collaboration Detail Page\n * @module coolandlovely/pages/collaborations\n *\n * Single collaboration (`cooCollaboration`) with validated lifecycle\n * transitions (`cooTransitionCollaboration`), its brand and attributed looks.\n */\n\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Loader2, Pencil, Trash2, Store, Sparkles } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { Thumbnail } from '../../components/Thumbnail';\nimport { BrandCreatorAvatars } from '../../components/BrandCreatorAvatars';\nimport { ActorName } from '../../components/ActorName';\nimport { StepTracker } from '../../components/StepTracker';\nimport { TagList } from '../../components/TagList';\nimport { CollaborationFeeCard } from '../../components/CollaborationFeeCard';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport {\n useAssistantEntityName,\n useCollaboration,\n useTransitionCollaboration,\n useDeleteCollaboration,\n} from '../../hooks';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport type { CooCollaborationStatus } from '../../types';\n\n/** Allowed next states per the svc collaboration state machine (UX guidance;\n * the service is authoritative and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooCollaborationStatus, CooCollaborationStatus[]> = {\n PROPOSED: ['ACCEPTED', 'DECLINED', 'CANCELLED'],\n ACCEPTED: ['IN_PROGRESS', 'CANCELLED'],\n IN_PROGRESS: ['PUBLISHED', 'CANCELLED'],\n PUBLISHED: [],\n DECLINED: [],\n CANCELLED: [],\n};\n\nconst LIFECYCLE_STEPS: CooCollaborationStatus[] = [\n 'PROPOSED',\n 'ACCEPTED',\n 'IN_PROGRESS',\n 'PUBLISHED',\n];\n\nexport function CollaborationDetailPage() {\n const { collaborationId } = useParams<{ collaborationId: string }>();\n const { navigateTo } = useCoolAndLovely();\n const query = useCollaboration(collaborationId);\n const transition = useTransitionCollaboration();\n const deleteCollaboration = useDeleteCollaboration();\n // Name the collaboration for the assistant's screen context.\n useAssistantEntityName(collaborationId, query.data?.title);\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Collaboration\">\n <LoadingView label=\"Loading collaboration…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Collaboration\">\n <ErrorView title=\"Collaboration not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const collab = query.data;\n const looks = collab.looks ?? [];\n const nextStates = NEXT_STATES[collab.status];\n const trackerSteps = LIFECYCLE_STEPS.includes(collab.status)\n ? LIFECYCLE_STEPS\n : (['PROPOSED', collab.status] as CooCollaborationStatus[]);\n\n return (\n <PageLayout\n title={collab.title}\n description={collab.brand?.name ?? undefined}\n actions={\n <div className=\"flex items-center gap-2\">\n {nextStates.length > 0 && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collaborations/${collab.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Pencil className=\"h-4 w-4\" /> Edit\n </button>\n )}\n {collab.status === 'PROPOSED' && (\n <button\n type=\"button\"\n disabled={deleteCollaboration.isPending}\n onClick={() =>\n deleteCollaboration.mutate(collab.id, {\n onSuccess: () => navigateTo('/collaborations'),\n })\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n {deleteCollaboration.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n Delete\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo('/collaborations')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <BrandCreatorAvatars\n brandLogoFileId={collab.brand?.logo?.id}\n brandSeed={collab.brandId}\n creatorId={collab.creatorId}\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-xl font-semibold text-text-primary\">{collab.title}</h2>\n <p className=\"text-xs text-text-secondary\">\n {collab.brand?.name ?? 'Brand'} ×{' '}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/profile/${collab.creatorId}`)}\n className=\"font-medium text-text-primary hover:underline focus-visible:outline-none\"\n >\n <ActorName id={collab.creatorId} />\n </button>{' '}\n · {titleCase(collab.role)} collaboration\n </p>\n </div>\n <StatusBadge status={collab.status} />\n </div>\n {collab.brief && <p className=\"mt-4 text-sm text-text-secondary\">{collab.brief}</p>}\n {collab.tags.length > 0 && (\n <TagList tags={collab.tags} className=\"mt-4\" tone=\"accent\" />\n )}\n </GlassCard>\n\n {/* Attributed looks */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Attributed looks ({looks.length})\n </h3>\n {looks.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No looks attributed to this collaboration yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {looks.map((look) => (\n <button\n key={look.id}\n type=\"button\"\n onClick={() => navigateTo(`/looks/${look.id}`)}\n className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md\"\n >\n <Thumbnail\n icon={<Sparkles className=\"h-6 w-6\" />}\n seed={look.id}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{look.title}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {titleCase(look.occasion)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n\n <div className=\"space-y-4\">\n <GlassCard treatment=\"insight\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Lifecycle</h3>\n <StepTracker steps={trackerSteps} current={collab.status} className=\"mb-5\" />\n <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={collab.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This collaboration is in a terminal state.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {nextStates.map((next) => (\n <button\n key={next}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => transition.mutate({ id: collab.id, status: next })}\n className=\"inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50\"\n >\n {transition.isPending && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Move to {titleCase(next)}\n </button>\n ))}\n </div>\n )}\n {transition.isError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {transition.error instanceof Error ? transition.error.message : 'Transition failed'}\n </p>\n )}\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Terms</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Role</dt>\n <dd className=\"text-text-primary\">{titleCase(collab.role)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Compensation</dt>\n <dd className=\"text-text-primary\">\n {formatPrice(collab.compensation, collab.currency)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Starts</dt>\n <dd className=\"text-text-primary\">\n {collab.startDate\n ? formatDate(collab.startDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Ends</dt>\n <dd className=\"text-text-primary\">\n {collab.endDate\n ? formatDate(collab.endDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n <CollaborationFeeCard collaboration={collab} />\n\n {collab.brand && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${collab.brand?.id}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Store className=\"h-5 w-5\" />}\n seed={collab.brand.id}\n className=\"h-10 w-10 shrink-0\"\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {collab.brand.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View brand</p>\n </div>\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CollaborationDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"sourcesContent":["/**\n * Collaboration Detail Page\n * @module coolandlovely/pages/collaborations\n *\n * Single collaboration (`cooCollaboration`) with validated lifecycle\n * transitions (`cooTransitionCollaboration`), its brand and attributed looks.\n */\n\nimport { useTr } from '../../hooks/useTr';\nimport { useContextNavigation } from '../../hooks/useContextNavigation';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Loader2, Pencil, Trash2, Store, Sparkles } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { Thumbnail } from '../../components/Thumbnail';\nimport { BrandCreatorAvatars } from '../../components/BrandCreatorAvatars';\nimport { ActorName } from '../../components/ActorName';\nimport { StepTracker } from '../../components/StepTracker';\nimport { TagList } from '../../components/TagList';\nimport { CollaborationFeeCard } from '../../components/CollaborationFeeCard';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport {\n useAssistantEntityName,\n useCollaboration,\n useTransitionCollaboration,\n useDeleteCollaboration,\n} from '../../hooks';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport type { CooCollaborationStatus } from '../../types';\n\n/** Allowed next states per the svc collaboration state machine (UX guidance;\n * the service is authoritative and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooCollaborationStatus, CooCollaborationStatus[]> = {\n PROPOSED: ['ACCEPTED', 'DECLINED', 'CANCELLED'],\n ACCEPTED: ['IN_PROGRESS', 'CANCELLED'],\n IN_PROGRESS: ['PUBLISHED', 'CANCELLED'],\n PUBLISHED: [],\n DECLINED: [],\n CANCELLED: [],\n};\n\nconst LIFECYCLE_STEPS: CooCollaborationStatus[] = [\n 'PROPOSED',\n 'ACCEPTED',\n 'IN_PROGRESS',\n 'PUBLISHED',\n];\n\nexport function CollaborationDetailPage() {\n const tr = useTr();\n const { collaborationId } = useParams<{ collaborationId: string }>();\n const { currentUser } = useCoolAndLovely();\n const navigateTo = useContextNavigation();\n const query = useCollaboration(collaborationId);\n const transition = useTransitionCollaboration();\n const deleteCollaboration = useDeleteCollaboration();\n // Name the collaboration for the assistant's screen context.\n useAssistantEntityName(collaborationId, query.data?.title);\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Collaboration\">\n <LoadingView label=\"Loading collaboration…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Collaboration\">\n <ErrorView title=\"Collaboration not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const collab = query.data;\n const looks = collab.looks ?? [];\n const nextStates = NEXT_STATES[collab.status].filter(\n (next) =>\n !collab.rateCardId ||\n collab.creatorId === currentUser?.id ||\n (next !== 'ACCEPTED' && next !== 'DECLINED')\n );\n const trackerSteps = LIFECYCLE_STEPS.includes(collab.status)\n ? LIFECYCLE_STEPS\n : (['PROPOSED', collab.status] as CooCollaborationStatus[]);\n\n return (\n <PageLayout\n title={collab.title}\n description={collab.brand?.name ?? undefined}\n actions={\n <div className=\"flex items-center gap-2\">\n {nextStates.length > 0 && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collaborations/${collab.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Pencil className=\"h-4 w-4\" /> Edit\n </button>\n )}\n {collab.status === 'PROPOSED' && (\n <button\n type=\"button\"\n disabled={deleteCollaboration.isPending}\n onClick={() =>\n deleteCollaboration.mutate(collab.id, {\n onSuccess: () => navigateTo('/collaborations'),\n })\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n {deleteCollaboration.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n Delete\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo('/collaborations')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <BrandCreatorAvatars\n brandLogoFileId={collab.brand?.logo?.id}\n brandSeed={collab.brandId}\n creatorId={collab.creatorId}\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-xl font-semibold text-text-primary\">{collab.title}</h2>\n <p className=\"text-xs text-text-secondary\">\n {collab.brand?.name ?? 'Brand'} ×{' '}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/profile/${collab.creatorId}`)}\n className=\"font-medium text-text-primary hover:underline focus-visible:outline-none\"\n >\n <ActorName id={collab.creatorId} />\n </button>{' '}\n · {titleCase(collab.role)} collaboration\n </p>\n </div>\n <StatusBadge status={collab.status} />\n </div>\n {collab.brief && <p className=\"mt-4 text-sm text-text-secondary\">{collab.brief}</p>}\n {collab.rateCardId && (\n <div className=\"mt-4 space-y-2 text-sm text-text-secondary\">\n <h3 className=\"font-semibold text-text-primary\">\n {tr('coolandlovely.marketplace.agreedQuote', 'Agreed service quote')}\n </h3>\n <p>{collab.rateCardTitle}</p>\n <ul className=\"list-inside list-disc\">\n {collab.quotedDeliverables?.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n {collab.quotedDeliveryDays != null && (\n <p>\n {tr(\n 'coolandlovely.marketplace.delivery',\n 'Delivery within {{days}} days of the agreed start',\n { days: collab.quotedDeliveryDays }\n )}\n </p>\n )}\n <p>\n {tr(\n 'coolandlovely.marketplace.immutable',\n 'The service fee, currency, role and deliverables are preserved from the reviewed offer.'\n )}\n </p>\n </div>\n )}\n {collab.tags.length > 0 && (\n <TagList tags={collab.tags} className=\"mt-4\" tone=\"accent\" />\n )}\n </GlassCard>\n\n {/* Attributed looks */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Attributed looks ({looks.length})\n </h3>\n {looks.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No looks attributed to this collaboration yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {looks.map((look) => (\n <button\n key={look.id}\n type=\"button\"\n onClick={() => navigateTo(`/looks/${look.id}`)}\n className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md\"\n >\n <Thumbnail\n icon={<Sparkles className=\"h-6 w-6\" />}\n seed={look.id}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{look.title}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {titleCase(look.occasion)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n\n <div className=\"space-y-4\">\n <GlassCard treatment=\"insight\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Lifecycle</h3>\n <StepTracker steps={trackerSteps} current={collab.status} className=\"mb-5\" />\n <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={collab.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This collaboration is in a terminal state.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {nextStates.map((next) => (\n <button\n key={next}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => transition.mutate({ id: collab.id, status: next })}\n className=\"inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50\"\n >\n {transition.isPending && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Move to {titleCase(next)}\n </button>\n ))}\n </div>\n )}\n {transition.isError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {transition.error instanceof Error ? transition.error.message : 'Transition failed'}\n </p>\n )}\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Terms</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Role</dt>\n <dd className=\"text-text-primary\">{titleCase(collab.role)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Compensation</dt>\n <dd className=\"text-text-primary\">\n {formatPrice(collab.compensation, collab.currency)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Starts</dt>\n <dd className=\"text-text-primary\">\n {collab.startDate\n ? formatDate(collab.startDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Ends</dt>\n <dd className=\"text-text-primary\">\n {collab.endDate\n ? formatDate(collab.endDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n <CollaborationFeeCard collaboration={collab} />\n\n {collab.brand && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${collab.brand?.id}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Store className=\"h-5 w-5\" />}\n seed={collab.brand.id}\n className=\"h-10 w-10 shrink-0\"\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {collab.brand.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View brand</p>\n </div>\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgEH,wBAAgB,qBAAqB,gCAoTpC"}
1
+ {"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiEH,wBAAgB,qBAAqB,gCA4TpC"}