@burdenoff/microfe-comradecircle 2026.723.1 → 2026.730.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/dist/comradecircle/ComradeCircleRoutes.d.ts.map +1 -1
- package/dist/comradecircle/ComradeCircleRoutes.js +11 -7
- package/dist/comradecircle/ComradeCircleRoutes.js.map +1 -1
- package/dist/comradecircle/hooks/useComSubscription.d.ts +18 -0
- package/dist/comradecircle/hooks/useComSubscription.d.ts.map +1 -0
- package/dist/comradecircle/hooks/useComSubscription.js +110 -0
- package/dist/comradecircle/hooks/useComSubscription.js.map +1 -0
- package/dist/comradecircle/hooks/useComradeCircleApi.d.ts +51 -1
- package/dist/comradecircle/hooks/useComradeCircleApi.d.ts.map +1 -1
- package/dist/comradecircle/hooks/useComradeCircleApi.js +435 -223
- package/dist/comradecircle/hooks/useComradeCircleApi.js.map +1 -1
- package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
- package/dist/comradecircle/pages/circles/CircleDetailPage.js +268 -266
- package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
- package/dist/comradecircle/pages/events/EventDetailPage.d.ts.map +1 -1
- package/dist/comradecircle/pages/events/EventDetailPage.js +84 -82
- package/dist/comradecircle/pages/events/EventDetailPage.js.map +1 -1
- package/dist/comradecircle/pages/members/MemberProfilePage.d.ts.map +1 -1
- package/dist/comradecircle/pages/members/MemberProfilePage.js +251 -129
- package/dist/comradecircle/pages/members/MemberProfilePage.js.map +1 -1
- package/dist/comradecircle/pages/monetization/MonetizationPage.d.ts +13 -0
- package/dist/comradecircle/pages/monetization/MonetizationPage.d.ts.map +1 -0
- package/dist/comradecircle/pages/monetization/MonetizationPage.js +596 -0
- package/dist/comradecircle/pages/monetization/MonetizationPage.js.map +1 -0
- package/dist/comradecircle/pages/posts/PostThreadPage.d.ts.map +1 -1
- package/dist/comradecircle/pages/posts/PostThreadPage.js +26 -24
- package/dist/comradecircle/pages/posts/PostThreadPage.js.map +1 -1
- package/dist/comradecircle/pages/profile/MyProfilePage.d.ts.map +1 -1
- package/dist/comradecircle/pages/profile/MyProfilePage.js +101 -96
- package/dist/comradecircle/pages/profile/MyProfilePage.js.map +1 -1
- package/dist/comradecircle/types/index.d.ts +126 -0
- package/dist/comradecircle/types/index.d.ts.map +1 -1
- package/dist/comradecircle/utils/shellBridge.d.ts +45 -0
- package/dist/comradecircle/utils/shellBridge.d.ts.map +1 -0
- package/dist/comradecircle/utils/shellBridge.js +19 -0
- package/dist/comradecircle/utils/shellBridge.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,209 +2,331 @@ import { useComradeCircle as e } from "../../context/ComradeCircleContext.js";
|
|
|
2
2
|
import "../../context/index.js";
|
|
3
3
|
import { cn as t } from "../../utils/cn.js";
|
|
4
4
|
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
5
|
-
import { useComFollow as r,
|
|
5
|
+
import { useComFollow as r, useComListDigitalProducts as i, useComListMembershipTiers as a, useComListPaidEvents as o, useComMyFollows as s, useComProfile as c, useComUnfollow as l } from "../../hooks/useComradeCircleApi.js";
|
|
6
6
|
import "../../hooks/index.js";
|
|
7
|
-
import { Avatar as
|
|
8
|
-
import { describeError as
|
|
9
|
-
import { EmptyState as
|
|
10
|
-
import { ErrorView as
|
|
11
|
-
import { StatusBadge as
|
|
12
|
-
import { ArrowLeft as
|
|
13
|
-
import { useParams as
|
|
14
|
-
import { jsx as
|
|
15
|
-
import { AuroraBackground as
|
|
7
|
+
import { Avatar as u } from "../../components/Avatar.js";
|
|
8
|
+
import { describeError as d, notify as f } from "../../lib/toast.js";
|
|
9
|
+
import { EmptyState as p } from "../../components/EmptyState.js";
|
|
10
|
+
import { ErrorView as m } from "../../components/StateViews.js";
|
|
11
|
+
import { StatusBadge as h } from "../../components/StatusBadge.js";
|
|
12
|
+
import { ArrowLeft as g, Coins as _, Gift as v, Package as y, Pencil as b, Ticket as x, UserCheck as S, UserMinus as C, UserPlus as w, UserX as T } from "lucide-react";
|
|
13
|
+
import { useParams as E } from "react-router-dom";
|
|
14
|
+
import { jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
15
|
+
import { AuroraBackground as k, Button as A, GlassCard as j, GradientText as M, Skeleton as N } from "@burdenoff/fe-libs/ui";
|
|
16
16
|
//#region src/comradecircle/pages/members/MemberProfilePage.tsx
|
|
17
|
-
function
|
|
18
|
-
|
|
17
|
+
function P(e, t) {
|
|
18
|
+
try {
|
|
19
|
+
return new Intl.NumberFormat(void 0, {
|
|
20
|
+
style: "currency",
|
|
21
|
+
currency: t
|
|
22
|
+
}).format(e);
|
|
23
|
+
} catch {
|
|
24
|
+
return `${t} ${e.toFixed(2)}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function F({ creatorId: e }) {
|
|
28
|
+
let t = a(e), n = o(e), r = i(e), s = t.data?.items ?? [], c = n.data?.items ?? [], l = r.data?.items ?? [], u = t.isLoading || n.isLoading || r.isLoading, d = s.length > 0 || c.length > 0 || l.length > 0;
|
|
29
|
+
return u || !d ? null : /* @__PURE__ */ O(j, {
|
|
30
|
+
treatment: "plain",
|
|
31
|
+
className: "flex flex-col gap-5 p-5 sm:p-6",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ O("div", {
|
|
34
|
+
className: "flex items-center gap-2",
|
|
35
|
+
children: [/* @__PURE__ */ D(_, { className: "h-4 w-4 text-accent" }), /* @__PURE__ */ D("h3", {
|
|
36
|
+
className: "text-base font-semibold text-text-primary",
|
|
37
|
+
children: "Support this creator"
|
|
38
|
+
})]
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ O("div", {
|
|
41
|
+
className: "flex items-start gap-2 rounded-lg border border-status-warning-border bg-status-warning-bg-subtle px-3 py-2 text-xs text-status-warning-text",
|
|
42
|
+
children: [/* @__PURE__ */ D(v, { className: "mt-0.5 h-3.5 w-3.5 shrink-0" }), "Payment integration pending — these are catalog listings, not a live checkout yet."]
|
|
43
|
+
}),
|
|
44
|
+
s.length > 0 && /* @__PURE__ */ O("div", {
|
|
45
|
+
className: "grid gap-2",
|
|
46
|
+
children: [/* @__PURE__ */ D("p", {
|
|
47
|
+
className: "text-xs font-medium text-text-tertiary",
|
|
48
|
+
children: "Membership tiers"
|
|
49
|
+
}), s.map((e) => /* @__PURE__ */ O("div", {
|
|
50
|
+
className: "flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
51
|
+
children: [/* @__PURE__ */ O("div", {
|
|
52
|
+
className: "min-w-0",
|
|
53
|
+
children: [/* @__PURE__ */ D("p", {
|
|
54
|
+
className: "truncate text-sm font-medium text-text-primary",
|
|
55
|
+
children: e.name
|
|
56
|
+
}), e.description && /* @__PURE__ */ D("p", {
|
|
57
|
+
className: "truncate text-xs text-text-secondary",
|
|
58
|
+
children: e.description
|
|
59
|
+
})]
|
|
60
|
+
}), /* @__PURE__ */ O("div", {
|
|
61
|
+
className: "flex shrink-0 items-center gap-2",
|
|
62
|
+
children: [/* @__PURE__ */ O("span", {
|
|
63
|
+
className: "text-sm font-semibold tabular-nums text-text-primary",
|
|
64
|
+
children: [
|
|
65
|
+
P(e.priceAmount, e.currency),
|
|
66
|
+
"/",
|
|
67
|
+
e.billingInterval === "YEARLY" ? "yr" : "mo"
|
|
68
|
+
]
|
|
69
|
+
}), /* @__PURE__ */ D(A, {
|
|
70
|
+
size: "sm",
|
|
71
|
+
disabled: !0,
|
|
72
|
+
title: "Payment integration pending",
|
|
73
|
+
children: "Support"
|
|
74
|
+
})]
|
|
75
|
+
})]
|
|
76
|
+
}, e.id))]
|
|
77
|
+
}),
|
|
78
|
+
c.length > 0 && /* @__PURE__ */ O("div", {
|
|
79
|
+
className: "grid gap-2",
|
|
80
|
+
children: [/* @__PURE__ */ D("p", {
|
|
81
|
+
className: "text-xs font-medium text-text-tertiary",
|
|
82
|
+
children: "Paid events"
|
|
83
|
+
}), c.map((e) => /* @__PURE__ */ O("div", {
|
|
84
|
+
className: "flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
85
|
+
children: [/* @__PURE__ */ O("div", {
|
|
86
|
+
className: "flex min-w-0 items-center gap-2",
|
|
87
|
+
children: [/* @__PURE__ */ D(x, { className: "h-4 w-4 shrink-0 text-text-tertiary" }), /* @__PURE__ */ D("p", {
|
|
88
|
+
className: "truncate text-sm font-medium text-text-primary",
|
|
89
|
+
children: e.title
|
|
90
|
+
})]
|
|
91
|
+
}), /* @__PURE__ */ O("div", {
|
|
92
|
+
className: "flex shrink-0 items-center gap-2",
|
|
93
|
+
children: [/* @__PURE__ */ D("span", {
|
|
94
|
+
className: "text-sm font-semibold tabular-nums text-text-primary",
|
|
95
|
+
children: P(e.priceAmount, e.currency)
|
|
96
|
+
}), /* @__PURE__ */ D(A, {
|
|
97
|
+
size: "sm",
|
|
98
|
+
disabled: !0,
|
|
99
|
+
title: "Payment integration pending",
|
|
100
|
+
children: "Get ticket"
|
|
101
|
+
})]
|
|
102
|
+
})]
|
|
103
|
+
}, e.id))]
|
|
104
|
+
}),
|
|
105
|
+
l.length > 0 && /* @__PURE__ */ O("div", {
|
|
106
|
+
className: "grid gap-2",
|
|
107
|
+
children: [/* @__PURE__ */ D("p", {
|
|
108
|
+
className: "text-xs font-medium text-text-tertiary",
|
|
109
|
+
children: "Digital products"
|
|
110
|
+
}), l.map((e) => /* @__PURE__ */ O("div", {
|
|
111
|
+
className: "flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
112
|
+
children: [/* @__PURE__ */ O("div", {
|
|
113
|
+
className: "flex min-w-0 items-center gap-2",
|
|
114
|
+
children: [/* @__PURE__ */ D(y, { className: "h-4 w-4 shrink-0 text-text-tertiary" }), /* @__PURE__ */ D("p", {
|
|
115
|
+
className: "truncate text-sm font-medium text-text-primary",
|
|
116
|
+
children: e.title
|
|
117
|
+
})]
|
|
118
|
+
}), /* @__PURE__ */ O("div", {
|
|
119
|
+
className: "flex shrink-0 items-center gap-2",
|
|
120
|
+
children: [/* @__PURE__ */ D("span", {
|
|
121
|
+
className: "text-sm font-semibold tabular-nums text-text-primary",
|
|
122
|
+
children: P(e.priceAmount, e.currency)
|
|
123
|
+
}), /* @__PURE__ */ D(A, {
|
|
124
|
+
size: "sm",
|
|
125
|
+
disabled: !0,
|
|
126
|
+
title: "Payment integration pending",
|
|
127
|
+
children: "Buy"
|
|
128
|
+
})]
|
|
129
|
+
})]
|
|
130
|
+
}, e.id))]
|
|
131
|
+
})
|
|
132
|
+
]
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function I({ items: e, variant: n }) {
|
|
136
|
+
return /* @__PURE__ */ D("ul", {
|
|
19
137
|
className: "flex flex-wrap gap-2",
|
|
20
|
-
children: e.map((e) => /* @__PURE__ */
|
|
138
|
+
children: e.map((e) => /* @__PURE__ */ D("li", {
|
|
21
139
|
className: t("rounded-full px-3 py-1 text-xs font-medium motion-safe:transition-transform motion-safe:duration-150 motion-safe:hover:-translate-y-0.5", n === "interest" ? "bg-[var(--color-accent-soft)] text-accent" : "border border-border-seam text-text-primary hover:border-border-strong"),
|
|
22
140
|
children: e
|
|
23
141
|
}, e))
|
|
24
142
|
});
|
|
25
143
|
}
|
|
26
|
-
function
|
|
27
|
-
return /* @__PURE__ */
|
|
144
|
+
function L() {
|
|
145
|
+
return /* @__PURE__ */ O("div", {
|
|
28
146
|
className: "mx-auto flex max-w-2xl flex-col gap-6",
|
|
29
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ O(j, {
|
|
30
148
|
treatment: "plain",
|
|
31
149
|
className: "overflow-hidden p-0",
|
|
32
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ D(N, { className: "h-24 w-full rounded-none sm:h-28" }), /* @__PURE__ */ O("div", {
|
|
33
151
|
className: "px-5 pb-5 sm:px-6 sm:pb-6",
|
|
34
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ O("div", {
|
|
35
153
|
className: "flex flex-col items-center gap-4 sm:flex-row sm:items-end",
|
|
36
|
-
children: [/* @__PURE__ */
|
|
154
|
+
children: [/* @__PURE__ */ D(N, { className: "-mt-16 h-28 w-28 rounded-full sm:-mt-20" }), /* @__PURE__ */ O("div", {
|
|
37
155
|
className: "w-full space-y-2 pb-1 text-center sm:text-left",
|
|
38
156
|
children: [
|
|
39
|
-
/* @__PURE__ */
|
|
40
|
-
/* @__PURE__ */
|
|
41
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ D(N, { className: "mx-auto h-7 w-44 sm:mx-0" }),
|
|
158
|
+
/* @__PURE__ */ D(N, { className: "mx-auto h-4 w-56 sm:mx-0" }),
|
|
159
|
+
/* @__PURE__ */ D(N, { className: "mx-auto h-5 w-20 rounded-full sm:mx-0" })
|
|
42
160
|
]
|
|
43
161
|
})]
|
|
44
|
-
}), /* @__PURE__ */
|
|
162
|
+
}), /* @__PURE__ */ O("div", {
|
|
45
163
|
className: "mt-5 space-y-2",
|
|
46
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ D(N, { className: "h-4 w-full" }), /* @__PURE__ */ D(N, { className: "h-4 w-3/4" })]
|
|
47
165
|
})]
|
|
48
166
|
})]
|
|
49
|
-
}), /* @__PURE__ */
|
|
167
|
+
}), /* @__PURE__ */ D(j, {
|
|
50
168
|
treatment: "plain",
|
|
51
169
|
className: "flex flex-col gap-6 p-5 sm:p-6",
|
|
52
|
-
children: [0, 1].map((e) => /* @__PURE__ */
|
|
170
|
+
children: [0, 1].map((e) => /* @__PURE__ */ O("div", {
|
|
53
171
|
className: "space-y-3",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
172
|
+
children: [/* @__PURE__ */ D(N, { className: "h-4 w-24" }), /* @__PURE__ */ D("div", {
|
|
55
173
|
className: "flex flex-wrap gap-2",
|
|
56
174
|
children: [
|
|
57
175
|
0,
|
|
58
176
|
1,
|
|
59
177
|
2,
|
|
60
178
|
3
|
|
61
|
-
].map((e) => /* @__PURE__ */
|
|
179
|
+
].map((e) => /* @__PURE__ */ D(N, { className: "h-6 w-20 rounded-full" }, e))
|
|
62
180
|
})]
|
|
63
181
|
}, e))
|
|
64
182
|
})]
|
|
65
183
|
});
|
|
66
184
|
}
|
|
67
|
-
function
|
|
68
|
-
let { memberId: t } =
|
|
185
|
+
function R() {
|
|
186
|
+
let { memberId: t } = E(), { navigateTo: i, currentUser: a } = e(), { data: o, isLoading: _, isError: v, refetch: y } = c(t), x = s("MEMBER"), N = r(), P = l(), R = /* @__PURE__ */ O(A, {
|
|
69
187
|
variant: "ghost",
|
|
70
188
|
size: "sm",
|
|
71
|
-
onClick: () =>
|
|
72
|
-
children: [/* @__PURE__ */
|
|
189
|
+
onClick: () => i("members"),
|
|
190
|
+
children: [/* @__PURE__ */ D(g, { className: "mr-1.5 h-4 w-4" }), " Back"]
|
|
73
191
|
});
|
|
74
|
-
if (
|
|
192
|
+
if (_) return /* @__PURE__ */ D(n, {
|
|
75
193
|
title: "Profile",
|
|
76
|
-
actions:
|
|
77
|
-
children: /* @__PURE__ */
|
|
194
|
+
actions: R,
|
|
195
|
+
children: /* @__PURE__ */ D(L, {})
|
|
78
196
|
});
|
|
79
|
-
if (
|
|
197
|
+
if (v) return /* @__PURE__ */ D(n, {
|
|
80
198
|
title: "Profile",
|
|
81
|
-
actions:
|
|
82
|
-
children: /* @__PURE__ */
|
|
199
|
+
actions: R,
|
|
200
|
+
children: /* @__PURE__ */ D(m, {
|
|
83
201
|
message: "We couldn't load this member's profile.",
|
|
84
|
-
onRetry: () =>
|
|
202
|
+
onRetry: () => y()
|
|
85
203
|
})
|
|
86
204
|
});
|
|
87
|
-
if (!
|
|
205
|
+
if (!o) return /* @__PURE__ */ D(n, {
|
|
88
206
|
title: "Profile",
|
|
89
|
-
actions:
|
|
90
|
-
children: /* @__PURE__ */
|
|
91
|
-
icon: /* @__PURE__ */
|
|
207
|
+
actions: R,
|
|
208
|
+
children: /* @__PURE__ */ D(p, {
|
|
209
|
+
icon: /* @__PURE__ */ D(T, { className: "h-10 w-10" }),
|
|
92
210
|
title: "No profile",
|
|
93
211
|
description: "This member hasn't set up a ComradeCircle profile yet."
|
|
94
212
|
})
|
|
95
213
|
});
|
|
96
|
-
let
|
|
214
|
+
let z = !!(t && a?.id === t), B = (x.data ?? []).some((e) => e.targetId === t && e.targetType === "MEMBER"), V = N.isPending || P.isPending, H = async () => {
|
|
97
215
|
if (t) try {
|
|
98
|
-
|
|
216
|
+
B ? (await P.mutateAsync({
|
|
99
217
|
targetId: t,
|
|
100
218
|
targetType: "MEMBER"
|
|
101
|
-
}),
|
|
219
|
+
}), f.success("Unfollowed", o.displayName)) : (await N.mutateAsync({
|
|
102
220
|
targetId: t,
|
|
103
221
|
targetType: "MEMBER"
|
|
104
|
-
}),
|
|
222
|
+
}), f.success("Following", o.displayName));
|
|
105
223
|
} catch (e) {
|
|
106
|
-
|
|
224
|
+
f.error("Could not update follow", d(e));
|
|
107
225
|
}
|
|
108
|
-
},
|
|
226
|
+
}, U = z ? /* @__PURE__ */ O(A, {
|
|
109
227
|
variant: "outline",
|
|
110
|
-
onClick: () =>
|
|
111
|
-
children: [/* @__PURE__ */ b
|
|
112
|
-
}) :
|
|
228
|
+
onClick: () => i("profile"),
|
|
229
|
+
children: [/* @__PURE__ */ D(b, { className: "mr-1.5 h-4 w-4" }), " Edit profile"]
|
|
230
|
+
}) : B ? /* @__PURE__ */ O(A, {
|
|
113
231
|
variant: "outline",
|
|
114
|
-
onClick:
|
|
115
|
-
disabled:
|
|
116
|
-
"aria-label": `Following ${
|
|
232
|
+
onClick: H,
|
|
233
|
+
disabled: V,
|
|
234
|
+
"aria-label": `Following ${o.displayName}. Activate to unfollow.`,
|
|
117
235
|
className: "group/follow min-w-[8rem] justify-center motion-safe:transition-colors hover:border-status-error-border hover:bg-status-error-subtle hover:text-status-error-text",
|
|
118
236
|
children: [
|
|
119
|
-
/* @__PURE__ */
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ D(S, { className: "mr-1.5 h-4 w-4 group-hover/follow:hidden" }),
|
|
238
|
+
/* @__PURE__ */ D(C, { className: "mr-1.5 hidden h-4 w-4 group-hover/follow:inline" }),
|
|
239
|
+
/* @__PURE__ */ D("span", {
|
|
122
240
|
className: "group-hover/follow:hidden",
|
|
123
241
|
children: "Following"
|
|
124
242
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ D("span", {
|
|
126
244
|
className: "hidden group-hover/follow:inline",
|
|
127
245
|
children: "Unfollow"
|
|
128
246
|
})
|
|
129
247
|
]
|
|
130
|
-
}) : /* @__PURE__ */
|
|
131
|
-
onClick:
|
|
132
|
-
disabled:
|
|
133
|
-
children: [/* @__PURE__ */
|
|
134
|
-
}),
|
|
135
|
-
return /* @__PURE__ */
|
|
248
|
+
}) : /* @__PURE__ */ O(A, {
|
|
249
|
+
onClick: H,
|
|
250
|
+
disabled: V,
|
|
251
|
+
children: [/* @__PURE__ */ D(w, { className: "mr-1.5 h-4 w-4" }), " Follow"]
|
|
252
|
+
}), W = o.interests.length > 0 || o.skills.length > 0;
|
|
253
|
+
return /* @__PURE__ */ D(n, {
|
|
136
254
|
title: "Profile",
|
|
137
|
-
actions:
|
|
138
|
-
children: /* @__PURE__ */
|
|
255
|
+
actions: R,
|
|
256
|
+
children: /* @__PURE__ */ O("div", {
|
|
139
257
|
className: "mx-auto flex max-w-2xl flex-col gap-6",
|
|
140
|
-
children: [
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
258
|
+
children: [
|
|
259
|
+
/* @__PURE__ */ O(j, {
|
|
260
|
+
treatment: "plain",
|
|
261
|
+
className: "overflow-hidden p-0",
|
|
262
|
+
children: [/* @__PURE__ */ D("div", {
|
|
263
|
+
className: "relative h-24 overflow-hidden bg-gloss-card sm:h-28",
|
|
264
|
+
children: /* @__PURE__ */ D(k, { intensity: "subtle" })
|
|
265
|
+
}), /* @__PURE__ */ O("div", {
|
|
266
|
+
className: "px-5 pb-5 sm:px-6 sm:pb-6",
|
|
267
|
+
children: [/* @__PURE__ */ O("div", {
|
|
268
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",
|
|
269
|
+
children: [/* @__PURE__ */ O("div", {
|
|
270
|
+
className: "flex flex-col items-center gap-4 sm:flex-row sm:items-end",
|
|
271
|
+
children: [/* @__PURE__ */ D(u, {
|
|
272
|
+
name: o.displayName,
|
|
273
|
+
presence: o.presence,
|
|
274
|
+
size: "2xl",
|
|
275
|
+
seed: o.memberId,
|
|
276
|
+
fileId: o.avatar?.id,
|
|
277
|
+
ring: !0,
|
|
278
|
+
className: "-mt-16 sm:-mt-20"
|
|
279
|
+
}), /* @__PURE__ */ O("div", {
|
|
280
|
+
className: "min-w-0 pb-1 text-center sm:text-left",
|
|
281
|
+
children: [
|
|
282
|
+
/* @__PURE__ */ D(M, {
|
|
283
|
+
as: "h2",
|
|
284
|
+
className: "text-2xl font-semibold sm:text-[1.75rem]",
|
|
285
|
+
children: o.displayName
|
|
286
|
+
}),
|
|
287
|
+
o.headline && /* @__PURE__ */ D("p", {
|
|
288
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
289
|
+
children: o.headline
|
|
290
|
+
}),
|
|
291
|
+
/* @__PURE__ */ D("div", {
|
|
292
|
+
className: "mt-3 flex justify-center sm:justify-start",
|
|
293
|
+
children: /* @__PURE__ */ D(h, { status: o.presence })
|
|
294
|
+
})
|
|
295
|
+
]
|
|
296
|
+
})]
|
|
297
|
+
}), /* @__PURE__ */ D("div", {
|
|
298
|
+
className: "flex shrink-0 justify-center pb-1 sm:justify-end",
|
|
299
|
+
children: U
|
|
177
300
|
})]
|
|
178
|
-
}), /* @__PURE__ */
|
|
179
|
-
className: "
|
|
180
|
-
children:
|
|
301
|
+
}), o.bio && /* @__PURE__ */ D("p", {
|
|
302
|
+
className: "mt-5 whitespace-pre-wrap text-sm leading-relaxed text-text-secondary",
|
|
303
|
+
children: o.bio
|
|
181
304
|
})]
|
|
182
|
-
}), A.bio && /* @__PURE__ */ b("p", {
|
|
183
|
-
className: "mt-5 whitespace-pre-wrap text-sm leading-relaxed text-text-secondary",
|
|
184
|
-
children: A.bio
|
|
185
305
|
})]
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
306
|
+
}),
|
|
307
|
+
W && /* @__PURE__ */ O(j, {
|
|
308
|
+
treatment: "plain",
|
|
309
|
+
className: "flex flex-col gap-6 p-5 sm:p-6",
|
|
310
|
+
children: [o.interests.length > 0 && /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("h3", {
|
|
311
|
+
className: "mb-3 text-base font-semibold text-text-primary",
|
|
312
|
+
children: "Interests"
|
|
313
|
+
}), /* @__PURE__ */ D(I, {
|
|
314
|
+
items: o.interests,
|
|
315
|
+
variant: "interest"
|
|
316
|
+
})] }), o.skills.length > 0 && /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("h3", {
|
|
317
|
+
className: "mb-3 text-base font-semibold text-text-primary",
|
|
318
|
+
children: "Skills"
|
|
319
|
+
}), /* @__PURE__ */ D(I, {
|
|
320
|
+
items: o.skills,
|
|
321
|
+
variant: "skill"
|
|
322
|
+
})] })]
|
|
323
|
+
}),
|
|
324
|
+
t && /* @__PURE__ */ D(F, { creatorId: t })
|
|
325
|
+
]
|
|
204
326
|
})
|
|
205
327
|
});
|
|
206
328
|
}
|
|
207
329
|
//#endregion
|
|
208
|
-
export {
|
|
330
|
+
export { R as MemberProfilePage };
|
|
209
331
|
|
|
210
332
|
//# sourceMappingURL=MemberProfilePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemberProfilePage.js","names":[],"sources":["../../../../src/comradecircle/pages/members/MemberProfilePage.tsx"],"sourcesContent":["/**\n * MemberProfilePage — a single member's public social profile.\n * @module comradecircle/pages/members\n *\n * Reads `comProfile(memberId)` (the social-identity layer). The visitor can\n * follow / unfollow the member (state derived from `comMyFollows('MEMBER')`);\n * on their own profile the action becomes an \"Edit profile\" shortcut. Interests\n * and skills render as differentiated chips (accent-tinted vs. outlined) and\n * hide when empty. The identity card gets a social-hero treatment: a living\n * gloss/aurora cover strip with the avatar overlapping upward onto it.\n */\n\nimport { ArrowLeft, UserX, UserMinus, UserPlus, UserCheck, Pencil } from 'lucide-react';\nimport { Button, GlassCard, GradientText, AuroraBackground, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Avatar } from '../../components/Avatar';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ErrorView } from '../../components/StateViews';\nimport { useComProfile, useComMyFollows, useComFollow, useComUnfollow } from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { notify, describeError } from '../../lib/toast';\nimport { cn } from '../../utils/cn';\nimport { useParams } from 'react-router-dom';\n\n/**\n * A wrap of tag chips. `interest` chips read as accent-tinted affinities;\n * `skill` chips read as outlined competencies — a quiet visual grammar that\n * lets the two sets be told apart at a glance. Hover gives a tasteful lift.\n */\nfunction ChipList({ items, variant }: { items: string[]; variant: 'interest' | 'skill' }) {\n return (\n <ul className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <li\n key={item}\n className={cn(\n 'rounded-full px-3 py-1 text-xs font-medium motion-safe:transition-transform motion-safe:duration-150 motion-safe:hover:-translate-y-0.5',\n variant === 'interest'\n ? 'bg-[var(--color-accent-soft)] text-accent'\n : 'border border-border-seam text-text-primary hover:border-border-strong'\n )}\n >\n {item}\n </li>\n ))}\n </ul>\n );\n}\n\n/** Profile-shaped skeleton — mirrors the hero cover strip, overlapping avatar,\n * identity block and the two chip sections so the layout doesn't jump. */\nfunction ProfileSkeleton() {\n return (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-6\">\n <GlassCard treatment=\"plain\" className=\"overflow-hidden p-0\">\n <Skeleton className=\"h-24 w-full rounded-none sm:h-28\" />\n <div className=\"px-5 pb-5 sm:px-6 sm:pb-6\">\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-end\">\n <Skeleton className=\"-mt-16 h-28 w-28 rounded-full sm:-mt-20\" />\n <div className=\"w-full space-y-2 pb-1 text-center sm:text-left\">\n <Skeleton className=\"mx-auto h-7 w-44 sm:mx-0\" />\n <Skeleton className=\"mx-auto h-4 w-56 sm:mx-0\" />\n <Skeleton className=\"mx-auto h-5 w-20 rounded-full sm:mx-0\" />\n </div>\n </div>\n <div className=\"mt-5 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"plain\" className=\"flex flex-col gap-6 p-5 sm:p-6\">\n {[0, 1].map((s) => (\n <div key={s} className=\"space-y-3\">\n <Skeleton className=\"h-4 w-24\" />\n <div className=\"flex flex-wrap gap-2\">\n {[0, 1, 2, 3].map((c) => (\n <Skeleton key={c} className=\"h-6 w-20 rounded-full\" />\n ))}\n </div>\n </div>\n ))}\n </GlassCard>\n </div>\n );\n}\n\nexport function MemberProfilePage() {\n const { memberId } = useParams<{ memberId: string }>();\n const { navigateTo, currentUser } = useComradeCircle();\n const { data: profile, isLoading, isError, refetch } = useComProfile(memberId);\n\n const follows = useComMyFollows('MEMBER');\n const follow = useComFollow();\n const unfollow = useComUnfollow();\n\n const back = (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateTo('members')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n );\n\n if (isLoading) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <ProfileSkeleton />\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <ErrorView message=\"We couldn't load this member's profile.\" onRetry={() => refetch()} />\n </PageLayout>\n );\n }\n\n if (!profile) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <EmptyState\n icon={<UserX className=\"h-10 w-10\" />}\n title=\"No profile\"\n description=\"This member hasn't set up a ComradeCircle profile yet.\"\n />\n </PageLayout>\n );\n }\n\n const isSelf = Boolean(memberId && currentUser?.id === memberId);\n const isFollowing = (follows.data ?? []).some(\n (f) => f.targetId === memberId && f.targetType === 'MEMBER'\n );\n const followPending = follow.isPending || unfollow.isPending;\n\n const toggleFollow = async () => {\n if (!memberId) return;\n try {\n if (isFollowing) {\n await unfollow.mutateAsync({ targetId: memberId, targetType: 'MEMBER' });\n notify.success('Unfollowed', profile.displayName);\n } else {\n await follow.mutateAsync({ targetId: memberId, targetType: 'MEMBER' });\n notify.success('Following', profile.displayName);\n }\n } catch (err) {\n notify.error('Could not update follow', describeError(err));\n }\n };\n\n const action = isSelf ? (\n <Button variant=\"outline\" onClick={() => navigateTo('profile')}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit profile\n </Button>\n ) : isFollowing ? (\n <Button\n variant=\"outline\"\n onClick={toggleFollow}\n disabled={followPending}\n aria-label={`Following ${profile.displayName}. Activate to unfollow.`}\n className=\"group/follow min-w-[8rem] justify-center motion-safe:transition-colors hover:border-status-error-border hover:bg-status-error-subtle hover:text-status-error-text\"\n >\n <UserCheck className=\"mr-1.5 h-4 w-4 group-hover/follow:hidden\" />\n <UserMinus className=\"mr-1.5 hidden h-4 w-4 group-hover/follow:inline\" />\n <span className=\"group-hover/follow:hidden\">Following</span>\n <span className=\"hidden group-hover/follow:inline\">Unfollow</span>\n </Button>\n ) : (\n <Button onClick={toggleFollow} disabled={followPending}>\n <UserPlus className=\"mr-1.5 h-4 w-4\" /> Follow\n </Button>\n );\n\n const hasTags = profile.interests.length > 0 || profile.skills.length > 0;\n\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <div className=\"mx-auto flex max-w-2xl flex-col gap-6\">\n {/* Identity hero */}\n <GlassCard treatment=\"plain\" className=\"overflow-hidden p-0\">\n {/* Living cover strip — gloss + drifting aurora, reduced-motion safe */}\n <div className=\"relative h-24 overflow-hidden bg-gloss-card sm:h-28\">\n <AuroraBackground intensity=\"subtle\" />\n </div>\n\n <div className=\"px-5 pb-5 sm:px-6 sm:pb-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-end\">\n <Avatar\n name={profile.displayName}\n presence={profile.presence}\n size=\"2xl\"\n seed={profile.memberId}\n fileId={profile.avatar?.id}\n ring\n className=\"-mt-16 sm:-mt-20\"\n />\n <div className=\"min-w-0 pb-1 text-center sm:text-left\">\n <GradientText as=\"h2\" className=\"text-2xl font-semibold sm:text-[1.75rem]\">\n {profile.displayName}\n </GradientText>\n {profile.headline && (\n <p className=\"mt-1 text-sm text-text-secondary\">{profile.headline}</p>\n )}\n <div className=\"mt-3 flex justify-center sm:justify-start\">\n <StatusBadge status={profile.presence} />\n </div>\n </div>\n </div>\n <div className=\"flex shrink-0 justify-center pb-1 sm:justify-end\">{action}</div>\n </div>\n\n {profile.bio && (\n <p className=\"mt-5 whitespace-pre-wrap text-sm leading-relaxed text-text-secondary\">\n {profile.bio}\n </p>\n )}\n </div>\n </GlassCard>\n\n {/* Interests & skills — differentiated chip grammar */}\n {hasTags && (\n <GlassCard treatment=\"plain\" className=\"flex flex-col gap-6 p-5 sm:p-6\">\n {profile.interests.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Interests</h3>\n <ChipList items={profile.interests} variant=\"interest\" />\n </div>\n )}\n {profile.skills.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Skills</h3>\n <ChipList items={profile.skills} variant=\"skill\" />\n </div>\n )}\n </GlassCard>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MemberProfilePage.js","names":[],"sources":["../../../../src/comradecircle/pages/members/MemberProfilePage.tsx"],"sourcesContent":["/**\n * MemberProfilePage — a single member's public social profile.\n * @module comradecircle/pages/members\n *\n * Reads `comProfile(memberId)` (the social-identity layer). The visitor can\n * follow / unfollow the member (state derived from `comMyFollows('MEMBER')`);\n * on their own profile the action becomes an \"Edit profile\" shortcut. Interests\n * and skills render as differentiated chips (accent-tinted vs. outlined) and\n * hide when empty. The identity card gets a social-hero treatment: a living\n * gloss/aurora cover strip with the avatar overlapping upward onto it.\n */\n\nimport {\n ArrowLeft,\n Coins,\n Gift,\n Package,\n Ticket,\n UserX,\n UserMinus,\n UserPlus,\n UserCheck,\n Pencil,\n} from 'lucide-react';\nimport { Button, GlassCard, GradientText, AuroraBackground, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Avatar } from '../../components/Avatar';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ErrorView } from '../../components/StateViews';\nimport {\n useComProfile,\n useComMyFollows,\n useComFollow,\n useComUnfollow,\n useComListMembershipTiers,\n useComListPaidEvents,\n useComListDigitalProducts,\n} from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { notify, describeError } from '../../lib/toast';\nimport { cn } from '../../utils/cn';\nimport { useParams } from 'react-router-dom';\n\nfunction formatMoney(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount);\n } catch {\n return `${currency} ${amount.toFixed(2)}`;\n }\n}\n\n/**\n * Fan-facing \"Support this creator\" panel — browses the creator's PUBLISHED\n * membership tiers / paid events / digital products (BOFF-4454 bounded\n * monetization CATALOG core). Every purchase CTA is disabled with a\n * \"Payment integration pending\" label: this ticket ships pricing/catalog\n * only, never a live checkout.\n */\nfunction SupportCreatorSection({ creatorId }: { creatorId: string }) {\n const tiers = useComListMembershipTiers(creatorId);\n const events = useComListPaidEvents(creatorId);\n const products = useComListDigitalProducts(creatorId);\n\n const tierItems = tiers.data?.items ?? [];\n const eventItems = events.data?.items ?? [];\n const productItems = products.data?.items ?? [];\n const isLoading = tiers.isLoading || events.isLoading || products.isLoading;\n const hasAnything = tierItems.length > 0 || eventItems.length > 0 || productItems.length > 0;\n\n if (isLoading || !hasAnything) return null;\n\n return (\n <GlassCard treatment=\"plain\" className=\"flex flex-col gap-5 p-5 sm:p-6\">\n <div className=\"flex items-center gap-2\">\n <Coins className=\"h-4 w-4 text-accent\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Support this creator</h3>\n </div>\n <div className=\"flex items-start gap-2 rounded-lg border border-status-warning-border bg-status-warning-bg-subtle px-3 py-2 text-xs text-status-warning-text\">\n <Gift className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n Payment integration pending — these are catalog listings, not a live checkout yet.\n </div>\n\n {tierItems.length > 0 && (\n <div className=\"grid gap-2\">\n <p className=\"text-xs font-medium text-text-tertiary\">Membership tiers</p>\n {tierItems.map((tier) => (\n <div\n key={tier.id}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{tier.name}</p>\n {tier.description && (\n <p className=\"truncate text-xs text-text-secondary\">{tier.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className=\"text-sm font-semibold tabular-nums text-text-primary\">\n {formatMoney(tier.priceAmount, tier.currency)}/\n {tier.billingInterval === 'YEARLY' ? 'yr' : 'mo'}\n </span>\n <Button size=\"sm\" disabled title=\"Payment integration pending\">\n Support\n </Button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {eventItems.length > 0 && (\n <div className=\"grid gap-2\">\n <p className=\"text-xs font-medium text-text-tertiary\">Paid events</p>\n {eventItems.map((event) => (\n <div\n key={event.id}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Ticket className=\"h-4 w-4 shrink-0 text-text-tertiary\" />\n <p className=\"truncate text-sm font-medium text-text-primary\">{event.title}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className=\"text-sm font-semibold tabular-nums text-text-primary\">\n {formatMoney(event.priceAmount, event.currency)}\n </span>\n <Button size=\"sm\" disabled title=\"Payment integration pending\">\n Get ticket\n </Button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {productItems.length > 0 && (\n <div className=\"grid gap-2\">\n <p className=\"text-xs font-medium text-text-tertiary\">Digital products</p>\n {productItems.map((product) => (\n <div\n key={product.id}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Package className=\"h-4 w-4 shrink-0 text-text-tertiary\" />\n <p className=\"truncate text-sm font-medium text-text-primary\">{product.title}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className=\"text-sm font-semibold tabular-nums text-text-primary\">\n {formatMoney(product.priceAmount, product.currency)}\n </span>\n <Button size=\"sm\" disabled title=\"Payment integration pending\">\n Buy\n </Button>\n </div>\n </div>\n ))}\n </div>\n )}\n </GlassCard>\n );\n}\n\n/**\n * A wrap of tag chips. `interest` chips read as accent-tinted affinities;\n * `skill` chips read as outlined competencies — a quiet visual grammar that\n * lets the two sets be told apart at a glance. Hover gives a tasteful lift.\n */\nfunction ChipList({ items, variant }: { items: string[]; variant: 'interest' | 'skill' }) {\n return (\n <ul className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <li\n key={item}\n className={cn(\n 'rounded-full px-3 py-1 text-xs font-medium motion-safe:transition-transform motion-safe:duration-150 motion-safe:hover:-translate-y-0.5',\n variant === 'interest'\n ? 'bg-[var(--color-accent-soft)] text-accent'\n : 'border border-border-seam text-text-primary hover:border-border-strong'\n )}\n >\n {item}\n </li>\n ))}\n </ul>\n );\n}\n\n/** Profile-shaped skeleton — mirrors the hero cover strip, overlapping avatar,\n * identity block and the two chip sections so the layout doesn't jump. */\nfunction ProfileSkeleton() {\n return (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-6\">\n <GlassCard treatment=\"plain\" className=\"overflow-hidden p-0\">\n <Skeleton className=\"h-24 w-full rounded-none sm:h-28\" />\n <div className=\"px-5 pb-5 sm:px-6 sm:pb-6\">\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-end\">\n <Skeleton className=\"-mt-16 h-28 w-28 rounded-full sm:-mt-20\" />\n <div className=\"w-full space-y-2 pb-1 text-center sm:text-left\">\n <Skeleton className=\"mx-auto h-7 w-44 sm:mx-0\" />\n <Skeleton className=\"mx-auto h-4 w-56 sm:mx-0\" />\n <Skeleton className=\"mx-auto h-5 w-20 rounded-full sm:mx-0\" />\n </div>\n </div>\n <div className=\"mt-5 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"plain\" className=\"flex flex-col gap-6 p-5 sm:p-6\">\n {[0, 1].map((s) => (\n <div key={s} className=\"space-y-3\">\n <Skeleton className=\"h-4 w-24\" />\n <div className=\"flex flex-wrap gap-2\">\n {[0, 1, 2, 3].map((c) => (\n <Skeleton key={c} className=\"h-6 w-20 rounded-full\" />\n ))}\n </div>\n </div>\n ))}\n </GlassCard>\n </div>\n );\n}\n\nexport function MemberProfilePage() {\n const { memberId } = useParams<{ memberId: string }>();\n const { navigateTo, currentUser } = useComradeCircle();\n const { data: profile, isLoading, isError, refetch } = useComProfile(memberId);\n\n const follows = useComMyFollows('MEMBER');\n const follow = useComFollow();\n const unfollow = useComUnfollow();\n\n const back = (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateTo('members')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n );\n\n if (isLoading) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <ProfileSkeleton />\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <ErrorView message=\"We couldn't load this member's profile.\" onRetry={() => refetch()} />\n </PageLayout>\n );\n }\n\n if (!profile) {\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <EmptyState\n icon={<UserX className=\"h-10 w-10\" />}\n title=\"No profile\"\n description=\"This member hasn't set up a ComradeCircle profile yet.\"\n />\n </PageLayout>\n );\n }\n\n const isSelf = Boolean(memberId && currentUser?.id === memberId);\n const isFollowing = (follows.data ?? []).some(\n (f) => f.targetId === memberId && f.targetType === 'MEMBER'\n );\n const followPending = follow.isPending || unfollow.isPending;\n\n const toggleFollow = async () => {\n if (!memberId) return;\n try {\n if (isFollowing) {\n await unfollow.mutateAsync({ targetId: memberId, targetType: 'MEMBER' });\n notify.success('Unfollowed', profile.displayName);\n } else {\n await follow.mutateAsync({ targetId: memberId, targetType: 'MEMBER' });\n notify.success('Following', profile.displayName);\n }\n } catch (err) {\n notify.error('Could not update follow', describeError(err));\n }\n };\n\n const action = isSelf ? (\n <Button variant=\"outline\" onClick={() => navigateTo('profile')}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit profile\n </Button>\n ) : isFollowing ? (\n <Button\n variant=\"outline\"\n onClick={toggleFollow}\n disabled={followPending}\n aria-label={`Following ${profile.displayName}. Activate to unfollow.`}\n className=\"group/follow min-w-[8rem] justify-center motion-safe:transition-colors hover:border-status-error-border hover:bg-status-error-subtle hover:text-status-error-text\"\n >\n <UserCheck className=\"mr-1.5 h-4 w-4 group-hover/follow:hidden\" />\n <UserMinus className=\"mr-1.5 hidden h-4 w-4 group-hover/follow:inline\" />\n <span className=\"group-hover/follow:hidden\">Following</span>\n <span className=\"hidden group-hover/follow:inline\">Unfollow</span>\n </Button>\n ) : (\n <Button onClick={toggleFollow} disabled={followPending}>\n <UserPlus className=\"mr-1.5 h-4 w-4\" /> Follow\n </Button>\n );\n\n const hasTags = profile.interests.length > 0 || profile.skills.length > 0;\n\n return (\n <PageLayout title=\"Profile\" actions={back}>\n <div className=\"mx-auto flex max-w-2xl flex-col gap-6\">\n {/* Identity hero */}\n <GlassCard treatment=\"plain\" className=\"overflow-hidden p-0\">\n {/* Living cover strip — gloss + drifting aurora, reduced-motion safe */}\n <div className=\"relative h-24 overflow-hidden bg-gloss-card sm:h-28\">\n <AuroraBackground intensity=\"subtle\" />\n </div>\n\n <div className=\"px-5 pb-5 sm:px-6 sm:pb-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-end\">\n <Avatar\n name={profile.displayName}\n presence={profile.presence}\n size=\"2xl\"\n seed={profile.memberId}\n fileId={profile.avatar?.id}\n ring\n className=\"-mt-16 sm:-mt-20\"\n />\n <div className=\"min-w-0 pb-1 text-center sm:text-left\">\n <GradientText as=\"h2\" className=\"text-2xl font-semibold sm:text-[1.75rem]\">\n {profile.displayName}\n </GradientText>\n {profile.headline && (\n <p className=\"mt-1 text-sm text-text-secondary\">{profile.headline}</p>\n )}\n <div className=\"mt-3 flex justify-center sm:justify-start\">\n <StatusBadge status={profile.presence} />\n </div>\n </div>\n </div>\n <div className=\"flex shrink-0 justify-center pb-1 sm:justify-end\">{action}</div>\n </div>\n\n {profile.bio && (\n <p className=\"mt-5 whitespace-pre-wrap text-sm leading-relaxed text-text-secondary\">\n {profile.bio}\n </p>\n )}\n </div>\n </GlassCard>\n\n {/* Interests & skills — differentiated chip grammar */}\n {hasTags && (\n <GlassCard treatment=\"plain\" className=\"flex flex-col gap-6 p-5 sm:p-6\">\n {profile.interests.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Interests</h3>\n <ChipList items={profile.interests} variant=\"interest\" />\n </div>\n )}\n {profile.skills.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Skills</h3>\n <ChipList items={profile.skills} variant=\"skill\" />\n </div>\n )}\n </GlassCard>\n )}\n\n {/* Creator monetization catalog — browse-only, payment pending (BOFF-4454) */}\n {memberId && <SupportCreatorSection creatorId={memberId} />}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MonetizationPage — creator-facing monetization management console (BOFF-4454).
|
|
3
|
+
* @module comradecircle/pages/monetization
|
|
4
|
+
*
|
|
5
|
+
* Bounded pricing/catalog CATALOG core: a creator manages their own membership
|
|
6
|
+
* tiers, paid events, and digital products (create + archive), and reviews the
|
|
7
|
+
* tip intents they've received. Nothing here talks to a payment processor —
|
|
8
|
+
* `comCreatorHasPaymentsEnabled` always resolves false today, so this page
|
|
9
|
+
* never claims a real checkout exists. Live payment processing and payout/
|
|
10
|
+
* revenue-split accounting are a separate, larger follow-up ticket.
|
|
11
|
+
*/
|
|
12
|
+
export declare function MonetizationPage(): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=MonetizationPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonetizationPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/monetization/MonetizationPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6nBH,wBAAgB,gBAAgB,4CAqC/B"}
|