@burdenoff/microfe-coolandlovely 2026.1102.1 → 2026.1102.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.
- package/README.md +15 -0
- package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoot.js +8 -0
- package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoutes.js +20 -16
- package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
- package/dist/coolandlovely/hooks/useContextNavigation.d.ts +3 -0
- package/dist/coolandlovely/hooks/useContextNavigation.d.ts.map +1 -0
- package/dist/coolandlovely/hooks/useContextNavigation.js +31 -0
- package/dist/coolandlovely/hooks/useContextNavigation.js.map +1 -0
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +1 -1
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
- package/dist/coolandlovely/hooks/useCreatorMarketplace.d.ts +118 -0
- package/dist/coolandlovely/hooks/useCreatorMarketplace.d.ts.map +1 -0
- package/dist/coolandlovely/hooks/useCreatorMarketplace.js +120 -0
- package/dist/coolandlovely/hooks/useCreatorMarketplace.js.map +1 -0
- package/dist/coolandlovely/hooks/usePriceApi.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +139 -121
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +140 -137
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +104 -95
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js +49 -40
- package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js.map +1 -1
- package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.d.ts +2 -0
- package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.d.ts.map +1 -0
- package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.js +714 -0
- package/dist/coolandlovely/pages/marketplace/CreatorMarketplacePage.js.map +1 -0
- package/dist/coolandlovely/types/index.d.ts +5 -0
- package/dist/coolandlovely/types/index.d.ts.map +1 -1
- package/dist/generated/wspace-operations.d.ts +649 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +141 -7
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +315 -1
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js +7 -1
- package/dist/generated/wspace-types.js.map +1 -1
- 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":"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"}
|
|
@@ -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;;;
|
|
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;
|
|
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
|
|
7
|
-
import { ErrorView as
|
|
8
|
-
import { Thumbnail as
|
|
9
|
-
import { formatDate as
|
|
10
|
-
import { TagList as
|
|
11
|
-
import { ActorName as
|
|
12
|
-
import { StepTracker as
|
|
13
|
-
import { BrandCreatorAvatars as
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
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
|
|
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
|
-
},
|
|
33
|
+
}, j = [
|
|
32
34
|
"PROPOSED",
|
|
33
35
|
"ACCEPTED",
|
|
34
36
|
"IN_PROGRESS",
|
|
35
37
|
"PUBLISHED"
|
|
36
38
|
];
|
|
37
|
-
function
|
|
38
|
-
let { collaborationId:
|
|
39
|
-
if (a(
|
|
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__ */
|
|
43
|
+
children: /* @__PURE__ */ D(l, { label: "Loading collaboration…" })
|
|
42
44
|
});
|
|
43
|
-
if (
|
|
45
|
+
if (I.isError || !I.data) return /* @__PURE__ */ D(t, {
|
|
44
46
|
title: "Collaboration",
|
|
45
|
-
children: /* @__PURE__ */
|
|
47
|
+
children: /* @__PURE__ */ D(c, {
|
|
46
48
|
title: "Collaboration not found",
|
|
47
|
-
onRetry: () => void
|
|
49
|
+
onRetry: () => void I.refetch()
|
|
48
50
|
})
|
|
49
51
|
});
|
|
50
|
-
let
|
|
51
|
-
return /* @__PURE__ */
|
|
52
|
-
title:
|
|
53
|
-
description:
|
|
54
|
-
actions: /* @__PURE__ */
|
|
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
|
-
|
|
59
|
+
V.length > 0 && /* @__PURE__ */ O("button", {
|
|
58
60
|
type: "button",
|
|
59
|
-
onClick: () =>
|
|
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__ */
|
|
63
|
+
children: [/* @__PURE__ */ D(S, { className: "h-4 w-4" }), " Edit"]
|
|
62
64
|
}),
|
|
63
|
-
|
|
65
|
+
z.status === "PROPOSED" && /* @__PURE__ */ O("button", {
|
|
64
66
|
type: "button",
|
|
65
|
-
disabled:
|
|
66
|
-
onClick: () =>
|
|
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: [
|
|
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__ */
|
|
72
|
+
/* @__PURE__ */ O("button", {
|
|
71
73
|
type: "button",
|
|
72
|
-
onClick: () =>
|
|
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__ */
|
|
76
|
+
children: [/* @__PURE__ */ D(b, { className: "h-4 w-4" }), " Back"]
|
|
75
77
|
})
|
|
76
78
|
]
|
|
77
79
|
}),
|
|
78
|
-
children: /* @__PURE__ */
|
|
80
|
+
children: /* @__PURE__ */ O("div", {
|
|
79
81
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
82
|
+
children: [/* @__PURE__ */ O("div", {
|
|
81
83
|
className: "lg:col-span-2",
|
|
82
|
-
children: [/* @__PURE__ */
|
|
84
|
+
children: [/* @__PURE__ */ O(k, {
|
|
83
85
|
treatment: "glass",
|
|
84
86
|
className: "p-6",
|
|
85
87
|
children: [
|
|
86
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ O("div", {
|
|
87
89
|
className: "flex items-center gap-3",
|
|
88
90
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
brandLogoFileId:
|
|
91
|
-
brandSeed:
|
|
92
|
-
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__ */
|
|
97
|
+
/* @__PURE__ */ O("div", {
|
|
96
98
|
className: "min-w-0 flex-1",
|
|
97
|
-
children: [/* @__PURE__ */
|
|
99
|
+
children: [/* @__PURE__ */ D("h2", {
|
|
98
100
|
className: "truncate text-xl font-semibold text-text-primary",
|
|
99
|
-
children:
|
|
100
|
-
}), /* @__PURE__ */
|
|
101
|
+
children: z.title
|
|
102
|
+
}), /* @__PURE__ */ O("p", {
|
|
101
103
|
className: "text-xs text-text-secondary",
|
|
102
104
|
children: [
|
|
103
|
-
|
|
105
|
+
z.brand?.name ?? "Brand",
|
|
104
106
|
" ×",
|
|
105
107
|
" ",
|
|
106
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ D("button", {
|
|
107
109
|
type: "button",
|
|
108
|
-
onClick: () =>
|
|
110
|
+
onClick: () => F(`/profile/${z.creatorId}`),
|
|
109
111
|
className: "font-medium text-text-primary hover:underline focus-visible:outline-none",
|
|
110
|
-
children: /* @__PURE__ */
|
|
112
|
+
children: /* @__PURE__ */ D(h, { id: z.creatorId })
|
|
111
113
|
}),
|
|
112
114
|
" ",
|
|
113
115
|
"· ",
|
|
114
|
-
|
|
116
|
+
p(z.role),
|
|
115
117
|
" collaboration"
|
|
116
118
|
]
|
|
117
119
|
})]
|
|
118
120
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ D(s, { status: z.status })
|
|
120
122
|
]
|
|
121
123
|
}),
|
|
122
|
-
|
|
124
|
+
z.brief && /* @__PURE__ */ D("p", {
|
|
123
125
|
className: "mt-4 text-sm text-text-secondary",
|
|
124
|
-
children:
|
|
126
|
+
children: z.brief
|
|
125
127
|
}),
|
|
126
|
-
|
|
127
|
-
|
|
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__ */
|
|
150
|
+
}), /* @__PURE__ */ O("section", {
|
|
133
151
|
className: "mt-6",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
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
|
-
|
|
156
|
+
B.length,
|
|
139
157
|
")"
|
|
140
158
|
]
|
|
141
|
-
}),
|
|
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__ */
|
|
162
|
+
}) : /* @__PURE__ */ D("div", {
|
|
145
163
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
|
|
146
|
-
children:
|
|
164
|
+
children: B.map((e) => /* @__PURE__ */ O("button", {
|
|
147
165
|
type: "button",
|
|
148
|
-
onClick: () =>
|
|
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__ */
|
|
151
|
-
icon: /* @__PURE__ */
|
|
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__ */
|
|
172
|
+
}), /* @__PURE__ */ O("div", {
|
|
155
173
|
className: "p-3",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ D("p", {
|
|
157
175
|
className: "truncate text-sm font-medium text-text-primary",
|
|
158
176
|
children: e.title
|
|
159
|
-
}), /* @__PURE__ */
|
|
177
|
+
}), /* @__PURE__ */ D("p", {
|
|
160
178
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
161
|
-
children:
|
|
179
|
+
children: p(e.occasion)
|
|
162
180
|
})]
|
|
163
181
|
})]
|
|
164
182
|
}, e.id))
|
|
165
183
|
})]
|
|
166
184
|
})]
|
|
167
|
-
}), /* @__PURE__ */
|
|
185
|
+
}), /* @__PURE__ */ O("div", {
|
|
168
186
|
className: "space-y-4",
|
|
169
187
|
children: [
|
|
170
|
-
/* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ O(k, {
|
|
171
189
|
treatment: "insight",
|
|
172
190
|
className: "p-5",
|
|
173
191
|
children: [
|
|
174
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ D("h3", {
|
|
175
193
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
176
194
|
children: "Lifecycle"
|
|
177
195
|
}),
|
|
178
|
-
/* @__PURE__ */
|
|
179
|
-
steps:
|
|
180
|
-
current:
|
|
196
|
+
/* @__PURE__ */ D(g, {
|
|
197
|
+
steps: H,
|
|
198
|
+
current: z.status,
|
|
181
199
|
className: "mb-5"
|
|
182
200
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ O("div", {
|
|
184
202
|
className: "mb-3 flex items-center gap-2",
|
|
185
|
-
children: [/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ D("span", {
|
|
186
204
|
className: "text-sm text-text-secondary",
|
|
187
205
|
children: "Current:"
|
|
188
|
-
}), /* @__PURE__ */
|
|
206
|
+
}), /* @__PURE__ */ D(s, { status: z.status })]
|
|
189
207
|
}),
|
|
190
|
-
|
|
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__ */
|
|
211
|
+
}) : /* @__PURE__ */ D("div", {
|
|
194
212
|
className: "flex flex-col gap-2",
|
|
195
|
-
children:
|
|
213
|
+
children: V.map((e) => /* @__PURE__ */ O("button", {
|
|
196
214
|
type: "button",
|
|
197
|
-
disabled:
|
|
198
|
-
onClick: () =>
|
|
199
|
-
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
|
-
|
|
222
|
+
L.isPending && /* @__PURE__ */ D(x, { className: "h-3.5 w-3.5 animate-spin" }),
|
|
205
223
|
"Move to ",
|
|
206
|
-
|
|
224
|
+
p(e)
|
|
207
225
|
]
|
|
208
226
|
}, e))
|
|
209
227
|
}),
|
|
210
|
-
|
|
228
|
+
L.isError && /* @__PURE__ */ D("p", {
|
|
211
229
|
className: "mt-2 text-xs text-status-error-text",
|
|
212
|
-
children:
|
|
230
|
+
children: L.error instanceof Error ? L.error.message : "Transition failed"
|
|
213
231
|
})
|
|
214
232
|
]
|
|
215
233
|
}),
|
|
216
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ O(k, {
|
|
217
235
|
treatment: "plain",
|
|
218
236
|
className: "p-5",
|
|
219
|
-
children: [/* @__PURE__ */
|
|
237
|
+
children: [/* @__PURE__ */ D("h3", {
|
|
220
238
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
221
239
|
children: "Terms"
|
|
222
|
-
}), /* @__PURE__ */
|
|
240
|
+
}), /* @__PURE__ */ O("dl", {
|
|
223
241
|
className: "space-y-2 text-sm",
|
|
224
242
|
children: [
|
|
225
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ O("div", {
|
|
226
244
|
className: "flex justify-between gap-2",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
245
|
+
children: [/* @__PURE__ */ D("dt", {
|
|
228
246
|
className: "text-text-secondary",
|
|
229
247
|
children: "Role"
|
|
230
|
-
}), /* @__PURE__ */
|
|
248
|
+
}), /* @__PURE__ */ D("dd", {
|
|
231
249
|
className: "text-text-primary",
|
|
232
|
-
children:
|
|
250
|
+
children: p(z.role)
|
|
233
251
|
})]
|
|
234
252
|
}),
|
|
235
|
-
/* @__PURE__ */
|
|
253
|
+
/* @__PURE__ */ O("div", {
|
|
236
254
|
className: "flex justify-between gap-2",
|
|
237
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ D("dt", {
|
|
238
256
|
className: "text-text-secondary",
|
|
239
257
|
children: "Compensation"
|
|
240
|
-
}), /* @__PURE__ */
|
|
258
|
+
}), /* @__PURE__ */ D("dd", {
|
|
241
259
|
className: "text-text-primary",
|
|
242
|
-
children:
|
|
260
|
+
children: f(z.compensation, z.currency)
|
|
243
261
|
})]
|
|
244
262
|
}),
|
|
245
|
-
/* @__PURE__ */
|
|
263
|
+
/* @__PURE__ */ O("div", {
|
|
246
264
|
className: "flex justify-between gap-2",
|
|
247
|
-
children: [/* @__PURE__ */
|
|
265
|
+
children: [/* @__PURE__ */ D("dt", {
|
|
248
266
|
className: "text-text-secondary",
|
|
249
267
|
children: "Starts"
|
|
250
|
-
}), /* @__PURE__ */
|
|
268
|
+
}), /* @__PURE__ */ D("dd", {
|
|
251
269
|
className: "text-text-primary",
|
|
252
|
-
children:
|
|
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__ */
|
|
276
|
+
/* @__PURE__ */ O("div", {
|
|
259
277
|
className: "flex justify-between gap-2",
|
|
260
|
-
children: [/* @__PURE__ */
|
|
278
|
+
children: [/* @__PURE__ */ D("dt", {
|
|
261
279
|
className: "text-text-secondary",
|
|
262
280
|
children: "Ends"
|
|
263
|
-
}), /* @__PURE__ */
|
|
281
|
+
}), /* @__PURE__ */ D("dd", {
|
|
264
282
|
className: "text-text-primary",
|
|
265
|
-
children:
|
|
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__ */
|
|
275
|
-
|
|
292
|
+
/* @__PURE__ */ D(y, { collaboration: z }),
|
|
293
|
+
z.brand && /* @__PURE__ */ O("button", {
|
|
276
294
|
type: "button",
|
|
277
|
-
onClick: () =>
|
|
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__ */
|
|
280
|
-
icon: /* @__PURE__ */
|
|
281
|
-
seed:
|
|
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__ */
|
|
301
|
+
}), /* @__PURE__ */ O("div", {
|
|
284
302
|
className: "min-w-0",
|
|
285
|
-
children: [/* @__PURE__ */
|
|
303
|
+
children: [/* @__PURE__ */ D("p", {
|
|
286
304
|
className: "truncate text-sm font-medium text-text-primary",
|
|
287
|
-
children:
|
|
288
|
-
}), /* @__PURE__ */
|
|
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 {
|
|
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;
|
|
1
|
+
{"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiEH,wBAAgB,qBAAqB,gCA4TpC"}
|