@burdenoff/microfe-comradecircle 2026.1014.1 → 2026.1025.1
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/components/MetricsCard.js +64 -0
- package/dist/comradecircle/components/MetricsCard.js.map +1 -0
- package/dist/comradecircle/components/StatusBadge.d.ts.map +1 -1
- package/dist/comradecircle/components/StatusBadge.js +4 -0
- package/dist/comradecircle/components/StatusBadge.js.map +1 -1
- package/dist/comradecircle/hooks/index.d.ts +1 -0
- package/dist/comradecircle/hooks/index.d.ts.map +1 -1
- package/dist/comradecircle/hooks/index.js +1 -0
- package/dist/comradecircle/hooks/useComradeCircleApi.d.ts +6 -0
- package/dist/comradecircle/hooks/useComradeCircleApi.d.ts.map +1 -1
- package/dist/comradecircle/hooks/useComradeCircleApi.js +1 -1
- package/dist/comradecircle/hooks/useComradeCircleApi.js.map +1 -1
- package/dist/comradecircle/hooks/useModerationApi.d.ts +19 -0
- package/dist/comradecircle/hooks/useModerationApi.d.ts.map +1 -0
- package/dist/comradecircle/hooks/useModerationApi.js +101 -0
- package/dist/comradecircle/hooks/useModerationApi.js.map +1 -0
- package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts +1 -0
- package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
- package/dist/comradecircle/pages/circles/CircleDetailPage.js +91 -77
- package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
- package/dist/comradecircle/pages/circles/ModerationTab.d.ts +7 -0
- package/dist/comradecircle/pages/circles/ModerationTab.d.ts.map +1 -0
- package/dist/comradecircle/pages/circles/ModerationTab.js +429 -0
- package/dist/comradecircle/pages/circles/ModerationTab.js.map +1 -0
- package/dist/comradecircle/pages/events/EventsPage.js +6 -6
- package/dist/comradecircle/types/index.d.ts +53 -0
- package/dist/comradecircle/types/index.d.ts.map +1 -1
- package/dist/generated/global-types.d.ts +9105 -562
- package/dist/generated/global-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.d.ts +103018 -27116
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Minus as t, TrendingDown as n, TrendingUp as r } from "lucide-react";
|
|
3
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
+
import { GlassCard as o } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/comradecircle/components/MetricsCard.tsx
|
|
6
|
+
var s = {
|
|
7
|
+
up: {
|
|
8
|
+
icon: r,
|
|
9
|
+
color: "text-status-success-text"
|
|
10
|
+
},
|
|
11
|
+
down: {
|
|
12
|
+
icon: n,
|
|
13
|
+
color: "text-status-error-text"
|
|
14
|
+
},
|
|
15
|
+
neutral: {
|
|
16
|
+
icon: t,
|
|
17
|
+
color: "text-text-secondary"
|
|
18
|
+
}
|
|
19
|
+
}, c = {
|
|
20
|
+
success: "text-status-success-text",
|
|
21
|
+
warning: "text-status-warning-text",
|
|
22
|
+
error: "text-status-error-text"
|
|
23
|
+
}, l = {
|
|
24
|
+
success: "shadow-[inset_0_1px_0_0_var(--color-status-success-text)]",
|
|
25
|
+
warning: "shadow-[inset_0_1px_0_0_var(--color-status-warning-text)]",
|
|
26
|
+
error: "shadow-[inset_0_1px_0_0_var(--color-status-error-text)]"
|
|
27
|
+
}, u = ({ icon: t, value: n, label: r, trend: u, trendValue: d, className: f, featured: p = !1, accent: m, pill: h, footer: g }) => {
|
|
28
|
+
let _ = u ? s[u] : null, v = _?.icon;
|
|
29
|
+
return /* @__PURE__ */ a(o, {
|
|
30
|
+
treatment: p ? "glass" : "metric",
|
|
31
|
+
glow: p,
|
|
32
|
+
className: e("p-6", m && l[m], f),
|
|
33
|
+
children: [/* @__PURE__ */ a("div", {
|
|
34
|
+
className: "flex items-center justify-between",
|
|
35
|
+
children: [/* @__PURE__ */ i("div", {
|
|
36
|
+
className: e("text-text-secondary", m && c[m]),
|
|
37
|
+
children: t
|
|
38
|
+
}), h ?? (u && _ && v ? /* @__PURE__ */ a("div", {
|
|
39
|
+
className: e("flex items-center gap-1 text-xs font-medium", _.color),
|
|
40
|
+
children: [/* @__PURE__ */ i(v, { className: "h-3.5 w-3.5" }), d && /* @__PURE__ */ i("span", { children: d })]
|
|
41
|
+
}) : null)]
|
|
42
|
+
}), /* @__PURE__ */ a("div", {
|
|
43
|
+
className: "mt-3",
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ i("p", {
|
|
46
|
+
className: "text-2xl font-bold text-text-primary tabular-nums",
|
|
47
|
+
children: n
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ i("p", {
|
|
50
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
51
|
+
children: r
|
|
52
|
+
}),
|
|
53
|
+
g && /* @__PURE__ */ i("div", {
|
|
54
|
+
className: "mt-3",
|
|
55
|
+
children: g
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
})]
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
//#endregion
|
|
62
|
+
export { u as MetricsCard };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=MetricsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/comradecircle/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module comradecircle/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\nimport type { TrendDirection } from '../types';\n\ntype Accent = 'success' | 'warning' | 'error';\n\ninterface MetricsCardProps {\n icon: ReactNode;\n value: string | number;\n label: string;\n trend?: TrendDirection;\n trendValue?: string;\n className?: string;\n /** Render as the page's hero metric (glass treatment + accent glow). */\n featured?: boolean;\n /** Severity accent — tints the icon and adds a soft top-edge glow. */\n accent?: Accent;\n /** Optional pill shown in the top-right (e.g. \"Critical\"). */\n pill?: ReactNode;\n /** Optional slot under the value (e.g. a MiniBar or sub-label). */\n footer?: ReactNode;\n}\n\nconst trendConfig: Record<TrendDirection, { icon: typeof TrendingUp; color: string }> = {\n up: { icon: TrendingUp, color: 'text-status-success-text' },\n down: { icon: TrendingDown, color: 'text-status-error-text' },\n neutral: { icon: Minus, color: 'text-text-secondary' },\n};\n\nconst accentIcon: Record<Accent, string> = {\n success: 'text-status-success-text',\n warning: 'text-status-warning-text',\n error: 'text-status-error-text',\n};\n\nconst accentGlow: Record<Accent, string> = {\n success: 'shadow-[inset_0_1px_0_0_var(--color-status-success-text)]',\n warning: 'shadow-[inset_0_1px_0_0_var(--color-status-warning-text)]',\n error: 'shadow-[inset_0_1px_0_0_var(--color-status-error-text)]',\n};\n\nexport const MetricsCard: FC<MetricsCardProps> = ({\n icon,\n value,\n label,\n trend,\n trendValue,\n className,\n featured = false,\n accent,\n pill,\n footer,\n}) => {\n const trendInfo = trend ? trendConfig[trend] : null;\n const TrendIcon = trendInfo?.icon;\n\n return (\n <GlassCard\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n className={cn('p-6', accent && accentGlow[accent], className)}\n >\n <div className=\"flex items-center justify-between\">\n <div className={cn('text-text-secondary', accent && accentIcon[accent])}>{icon}</div>\n {pill ??\n (trend && trendInfo && TrendIcon ? (\n <div className={cn('flex items-center gap-1 text-xs font-medium', trendInfo.color)}>\n <TrendIcon className=\"h-3.5 w-3.5\" />\n {trendValue && <span>{trendValue}</span>}\n </div>\n ) : null)}\n </div>\n <div className=\"mt-3\">\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">{value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{label}</p>\n {footer && <div className=\"mt-3\">{footer}</div>}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;AA8BA,IAAM,IAAkF;CACtF,IAAI;EAAE,MAAM;EAAY,OAAO;CAA2B;CAC1D,MAAM;EAAE,MAAM;EAAc,OAAO;CAAyB;CAC5D,SAAS;EAAE,MAAM;EAAO,OAAO;CAAsB;AACvD,GAEM,IAAqC;CACzC,SAAS;CACT,SAAS;CACT,OAAO;AACT,GAEM,IAAqC;CACzC,SAAS;CACT,SAAS;CACT,OAAO;AACT,GAEa,KAAqC,EAChD,SACA,UACA,UACA,UACA,eACA,cACA,cAAW,IACX,WACA,SACA,gBACI;CACJ,IAAM,IAAY,IAAQ,EAAY,KAAS,MACzC,IAAY,GAAW;CAE7B,OACE,kBAAC,GAAD;EACE,WAAW,IAAW,UAAU;EAChC,MAAM;EACN,WAAW,EAAG,OAAO,KAAU,EAAW,IAAS,CAAS;YAH9D,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAW,EAAG,uBAAuB,KAAU,EAAW,EAAO;cAAI;GAAU,CAAA,GACnF,MACE,KAAS,KAAa,IACrB,kBAAC,OAAD;IAAK,WAAW,EAAG,+CAA+C,EAAU,KAAK;cAAjF,CACE,kBAAC,GAAD,EAAW,WAAU,cAAe,CAAA,GACnC,KAAc,kBAAC,QAAD,EAAA,UAAO,EAAiB,CAAA,CACpC;QACH,KACH;MACL,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,KAAD;KAAG,WAAU;eAAqD;IAAS,CAAA;IAC3E,kBAAC,KAAD;KAAG,WAAU;eAAoC;IAAS,CAAA;IACzD,KAAU,kBAAC,OAAD;KAAK,WAAU;eAAQ;IAAY,CAAA;GAC3C;IACI;;AAEf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuFD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAsB5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/comradecircle/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module comradecircle/components\n *\n * A colored badge for ComradeCircle domain statuses (circle status/visibility,\n * event status/mode, membership status, member role, poll status, post status,\n * presence, RSVP status) with semantic color mapping. Accepts the raw server\n * enum value.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\nimport { formatEnumLabel } from '../utils/formatters';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-[var(--color-accent-soft)] text-text-primary',\n outline: 'border border-border-seam text-text-primary',\n};\n\n// Statuses that represent a \"live\" / active condition get a subtle opacity-only\n// glow pulse (reduced-motion safe via motion-safe:).\nconst liveStatuses = new Set(['LIVE', 'ONLINE', 'ACTIVE']);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Circle status\n ACTIVE: 'success',\n ARCHIVED: 'outline',\n SUSPENDED: 'destructive',\n\n // Circle visibility\n PUBLIC: 'success',\n PRIVATE: 'secondary',\n SECRET: 'warning',\n\n // Channel visibility\n CIRCLE: 'info',\n\n // Channel type\n ANNOUNCEMENT: 'warning',\n FORUM: 'info',\n TEXT: 'secondary',\n VOICE: 'info',\n\n // Event status\n SCHEDULED: 'info',\n LIVE: 'success',\n COMPLETED: 'secondary',\n CANCELLED: 'destructive',\n\n // Event mode\n ONLINE: 'success',\n IN_PERSON: 'success',\n HYBRID: 'warning',\n\n // Membership status\n PENDING: 'warning',\n BANNED: 'destructive',\n LEFT: 'outline',\n\n // Member role\n OWNER: 'info',\n ADMIN: 'warning',\n MODERATOR: 'info',\n MEMBER: 'secondary',\n\n // Poll status\n OPEN: 'success',\n CLOSED: 'outline',\n\n // Post status\n PUBLISHED: 'success',\n DRAFT: 'secondary',\n HIDDEN: 'warning',\n REMOVED: 'destructive',\n\n // Presence (ONLINE handled by ACTIVE→success above; keep the green convention)\n AWAY: 'warning',\n BUSY: 'destructive',\n OFFLINE: 'secondary',\n\n // RSVP status\n GOING: 'success',\n INTERESTED: 'info',\n WAITLISTED: 'warning',\n NOT_GOING: 'outline',\n};\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const key = status.toUpperCase();\n const variant = statusVariantMap[key] ?? 'secondary';\n const isLive = liveStatuses.has(key);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n {isLive && (\n <span\n aria-hidden=\"true\"\n className=\"size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse\"\n />\n )}\n {formatEnumLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;;AAqBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;AACX,GAIM,IAAe,IAAI,IAAI;CAAC;CAAQ;CAAU;AAAQ,CAAC,GAEnD,IAAiD;CAErD,QAAQ;CACR,UAAU;CACV,WAAW;CAGX,QAAQ;CACR,SAAS;CACT,QAAQ;CAGR,QAAQ;CAGR,cAAc;CACd,OAAO;CACP,MAAM;CACN,OAAO;CAGP,WAAW;CACX,MAAM;CACN,WAAW;CACX,WAAW;CAGX,QAAQ;CACR,WAAW;CACX,QAAQ;CAGR,SAAS;CACT,QAAQ;CACR,MAAM;CAGN,OAAO;CACP,OAAO;CACP,WAAW;CACX,QAAQ;CAGR,MAAM;CACN,QAAQ;CAGR,WAAW;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CAGT,MAAM;CACN,MAAM;CACN,SAAS;CAGT,OAAO;CACP,YAAY;CACZ,YAAY;CACZ,WAAW;AACb,GAEa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAM,EAAO,YAAY,GACzB,IAAU,EAAiB,MAAQ,aACnC,IAAS,EAAa,IAAI,CAAG;CAEnC,OACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,CACF;YALF,CAOG,KACC,kBAAC,QAAD;GACE,eAAY;GACZ,WAAU;EACX,CAAA,GAEF,EAAgB,CAAM,CACnB;;AAEV"}
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/comradecircle/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module comradecircle/components\n *\n * A colored badge for ComradeCircle domain statuses (circle status/visibility,\n * event status/mode, membership status, member role, poll status, post status,\n * presence, RSVP status) with semantic color mapping. Accepts the raw server\n * enum value.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\nimport { formatEnumLabel } from '../utils/formatters';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-[var(--color-accent-soft)] text-text-primary',\n outline: 'border border-border-seam text-text-primary',\n};\n\n// Statuses that represent a \"live\" / active condition get a subtle opacity-only\n// glow pulse (reduced-motion safe via motion-safe:).\nconst liveStatuses = new Set(['LIVE', 'ONLINE', 'ACTIVE']);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Circle status\n ACTIVE: 'success',\n ARCHIVED: 'outline',\n SUSPENDED: 'destructive',\n\n // Circle visibility\n PUBLIC: 'success',\n PRIVATE: 'secondary',\n SECRET: 'warning',\n\n // Channel visibility\n CIRCLE: 'info',\n\n // Channel type\n ANNOUNCEMENT: 'warning',\n FORUM: 'info',\n TEXT: 'secondary',\n VOICE: 'info',\n\n // Event status\n SCHEDULED: 'info',\n LIVE: 'success',\n COMPLETED: 'secondary',\n CANCELLED: 'destructive',\n\n // Event mode\n ONLINE: 'success',\n IN_PERSON: 'success',\n HYBRID: 'warning',\n\n // Membership status\n PENDING: 'warning',\n BANNED: 'destructive',\n LEFT: 'outline',\n\n // Member role\n OWNER: 'info',\n ADMIN: 'warning',\n MODERATOR: 'info',\n MEMBER: 'secondary',\n\n // Poll status\n OPEN: 'success',\n CLOSED: 'outline',\n\n // Post status\n PUBLISHED: 'success',\n DRAFT: 'secondary',\n HIDDEN: 'warning',\n REMOVED: 'destructive',\n\n // Presence (ONLINE handled by ACTIVE→success above; keep the green convention)\n AWAY: 'warning',\n BUSY: 'destructive',\n OFFLINE: 'secondary',\n\n // Moderation verdict (triage engine)\n ALLOW: 'success',\n FLAG: 'warning',\n HIDE: 'warning',\n ESCALATE: 'destructive',\n\n // RSVP status\n GOING: 'success',\n INTERESTED: 'info',\n WAITLISTED: 'warning',\n NOT_GOING: 'outline',\n};\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const key = status.toUpperCase();\n const variant = statusVariantMap[key] ?? 'secondary';\n const isLive = liveStatuses.has(key);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n {isLive && (\n <span\n aria-hidden=\"true\"\n className=\"size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse\"\n />\n )}\n {formatEnumLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;;AAqBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;AACX,GAIM,IAAe,IAAI,IAAI;CAAC;CAAQ;CAAU;AAAQ,CAAC,GAEnD,IAAiD;CAErD,QAAQ;CACR,UAAU;CACV,WAAW;CAGX,QAAQ;CACR,SAAS;CACT,QAAQ;CAGR,QAAQ;CAGR,cAAc;CACd,OAAO;CACP,MAAM;CACN,OAAO;CAGP,WAAW;CACX,MAAM;CACN,WAAW;CACX,WAAW;CAGX,QAAQ;CACR,WAAW;CACX,QAAQ;CAGR,SAAS;CACT,QAAQ;CACR,MAAM;CAGN,OAAO;CACP,OAAO;CACP,WAAW;CACX,QAAQ;CAGR,MAAM;CACN,QAAQ;CAGR,WAAW;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CAGT,MAAM;CACN,MAAM;CACN,SAAS;CAGT,OAAO;CACP,MAAM;CACN,MAAM;CACN,UAAU;CAGV,OAAO;CACP,YAAY;CACZ,YAAY;CACZ,WAAW;AACb,GAEa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAM,EAAO,YAAY,GACzB,IAAU,EAAiB,MAAQ,aACnC,IAAS,EAAa,IAAI,CAAG;CAEnC,OACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,CACF;YALF,CAOG,KACC,kBAAC,QAAD;GACE,eAAY;GACZ,WAAU;EACX,CAAA,GAEF,EAAgB,CAAM,CACnB;;AAEV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/hooks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/hooks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { ComConnection, ComCircle, ComCircleStatus, ComCircleVisibility, ComChannel, ComComment, ComPost, ComPostStatus, ComPoll, ComPollStatus, ComPollOption, ComEvent, ComEventStatus, ComEventRsvp, ComRsvpStatus, ComProfile, ComMembership, ComMembershipStatus, ComMemberRole, ComFeedFollow, ComFollowTargetType, ComReaction, ComReactionType, ComCreateCircleInput, ComUpdateCircleInput, ComCreateChannelInput, ComUpdateChannelInput, ComCreatePostInput, ComUpdatePostInput, ComCreateCommentInput, ComCreateEventInput, ComUpdateEventInput, ComCreatePollInput, ComFollowInput, ComUpsertProfileInput, PaginationInput, ComCreatorMembershipTier, ComCreatorMembershipTierConnection, ComPaidEvent, ComPaidEventConnection, ComDigitalProduct, ComDigitalProductConnection, ComTipIntent, ComTipIntentConnection, ComCreateMembershipTierInput, ComCreatePaidEventInput, ComUpdatePaidEventInput, ComCreateDigitalProductInput, ComRecordTipIntentInput } from '../types';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Run one `com*` operation through the workspace gateway. Exported so sibling
|
|
5
|
+
* hook modules (e.g. useModerationApi) share the same transport and
|
|
6
|
+
* read-cache invalidation rules.
|
|
7
|
+
*/
|
|
8
|
+
export declare const comQuery: <TData>(query: string, variables: Record<string, unknown>, baseUrl?: string) => Promise<TData>;
|
|
3
9
|
export interface CircleFilters {
|
|
4
10
|
status?: ComCircleStatus;
|
|
5
11
|
visibility?: ComCircleVisibility;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComradeCircleApi.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/hooks/useComradeCircleApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,EACP,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EAErB,eAAe,EACf,wBAAwB,EACxB,kCAAkC,EAClC,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,2BAA2B,EAC3B,YAAY,EACZ,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useComradeCircleApi.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/hooks/useComradeCircleApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -660,6 +660,6 @@ var te = (e) => /^\s*mutation\b/.test(e), o = async (e, n, r) => {
|
|
|
660
660
|
});
|
|
661
661
|
};
|
|
662
662
|
//#endregion
|
|
663
|
-
export { W as useComAddComment, Oe as useComArchiveDigitalProduct, be as useComArchiveMembershipTier, we as useComArchivePaidEvent, ie as useComCircle, re as useComCircles, de as useComClosePoll, H as useComCommentAddedLive, U as useComComments, N as useComCreateChannel, O as useComCreateCircle, De as useComCreateDigitalProduct, oe as useComCreateEvent, ye as useComCreateMembershipTier, Se as useComCreatePaidEvent, ue as useComCreatePoll, L as useComCreatePost, Y as useComEvent, ae as useComEventLive, J as useComEvents, K as useComFollow, k as useComJoinCircle, A as useComLeaveCircle, Te as useComListDigitalProducts, _e as useComListMembershipTiers, $ as useComListPaidEvents, M as useComMemberships, Ee as useComMyDigitalProducts, I as useComMyFeed, G as useComMyFollows, ve as useComMyMembershipTiers, xe as useComMyPaidEvents, ke as useComMyReceivedTips, le as useComPolls, F as useComPost, V as useComPostAddedLive, P as useComPosts, me as useComProfile, pe as useComProfiles, B as useComReactToPost, z as useComRemovePost, ce as useComRsvpEvent, j as useComSetMemberRole, se as useComTransitionEvent, q as useComUnfollow, Ce as useComUpdatePaidEvent, R as useComUpdatePost, he as useComUpsertProfile, fe as useComVotePoll };
|
|
663
|
+
export { o as comQuery, W as useComAddComment, Oe as useComArchiveDigitalProduct, be as useComArchiveMembershipTier, we as useComArchivePaidEvent, ie as useComCircle, re as useComCircles, de as useComClosePoll, H as useComCommentAddedLive, U as useComComments, N as useComCreateChannel, O as useComCreateCircle, De as useComCreateDigitalProduct, oe as useComCreateEvent, ye as useComCreateMembershipTier, Se as useComCreatePaidEvent, ue as useComCreatePoll, L as useComCreatePost, Y as useComEvent, ae as useComEventLive, J as useComEvents, K as useComFollow, k as useComJoinCircle, A as useComLeaveCircle, Te as useComListDigitalProducts, _e as useComListMembershipTiers, $ as useComListPaidEvents, M as useComMemberships, Ee as useComMyDigitalProducts, I as useComMyFeed, G as useComMyFollows, ve as useComMyMembershipTiers, xe as useComMyPaidEvents, ke as useComMyReceivedTips, le as useComPolls, F as useComPost, V as useComPostAddedLive, P as useComPosts, me as useComProfile, pe as useComProfiles, B as useComReactToPost, z as useComRemovePost, ce as useComRsvpEvent, j as useComSetMemberRole, se as useComTransitionEvent, q as useComUnfollow, Ce as useComUpdatePaidEvent, R as useComUpdatePost, he as useComUpsertProfile, fe as useComVotePoll };
|
|
664
664
|
|
|
665
665
|
//# sourceMappingURL=useComradeCircleApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComradeCircleApi.js","names":[],"sources":["../../../src/comradecircle/hooks/useComradeCircleApi.ts"],"sourcesContent":["/**\n * ComradeCircle API hooks\n * @module comradecircle/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-comradecircle-svc`\n * federated GraphQL contract (the `com*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n *\n * IMPORTANT: `User`/`File` are id-only federation stubs in this subgraph. We\n * never select `author { firstName }` or `avatar { url }`. Display identity is\n * resolved through `ComProfile` (see `useComProfile`).\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useComradeCircle } from '../context';\nimport { clearGraphqlResponseCache } from '../lib/graphql-cache';\nimport { useComSubscription } from './useComSubscription';\nimport type {\n ComConnection,\n ComCircle,\n ComCircleStatus,\n ComCircleVisibility,\n ComChannel,\n ComComment,\n ComPost,\n ComPostStatus,\n ComPoll,\n ComPollStatus,\n ComPollOption,\n ComEvent,\n ComEventStatus,\n ComEventRsvp,\n ComRsvpStatus,\n ComProfile,\n ComMembership,\n ComMembershipStatus,\n ComMemberRole,\n ComFeedFollow,\n ComFollowTargetType,\n ComReaction,\n ComReactionType,\n ComCreateCircleInput,\n ComUpdateCircleInput,\n ComCreateChannelInput,\n ComUpdateChannelInput,\n ComCreatePostInput,\n ComUpdatePostInput,\n ComCreateCommentInput,\n ComCreateEventInput,\n ComUpdateEventInput,\n ComCreatePollInput,\n ComFollowInput,\n ComUpsertProfileInput,\n ComPageInfo,\n PaginationInput,\n ComCreatorMembershipTier,\n ComCreatorMembershipTierConnection,\n ComPaidEvent,\n ComPaidEventConnection,\n ComDigitalProduct,\n ComDigitalProductConnection,\n ComTipIntent,\n ComTipIntentConnection,\n ComCreateMembershipTierInput,\n ComCreatePaidEventInput,\n ComUpdatePaidEventInput,\n ComCreateDigitalProductInput,\n ComRecordTipIntentInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\nconst isMutation = (query: string): boolean => /^\\s*mutation\\b/.test(query);\n\nconst comQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n // A mutation's own request must never be served from (or coalesced onto) the\n // read cache, and the resolved read cache must be dropped once it commits so\n // the React-Query refetch that follows sees the new state — not a stale\n // pre-write response held for up to 15s. Clear before AND after the write.\n const mutating = isMutation(query);\n if (mutating) clearGraphqlResponseCache();\n\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (mutating) clearGraphqlResponseCache();\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n circles: ['comradecircle', 'circles'] as const,\n circle: (id: string) => ['comradecircle', 'circle', id] as const,\n channels: (circleId: string) => ['comradecircle', 'channels', circleId] as const,\n posts: (channelId: string) => ['comradecircle', 'posts', channelId] as const,\n post: (id: string) => ['comradecircle', 'post', id] as const,\n comments: (postId: string) => ['comradecircle', 'comments', postId] as const,\n feed: ['comradecircle', 'feed'] as const,\n follows: ['comradecircle', 'follows'] as const,\n events: ['comradecircle', 'events'] as const,\n event: (id: string) => ['comradecircle', 'event', id] as const,\n polls: (circleId: string) => ['comradecircle', 'polls', circleId] as const,\n poll: (id: string) => ['comradecircle', 'poll', id] as const,\n profiles: ['comradecircle', 'profiles'] as const,\n profile: (memberId: string) => ['comradecircle', 'profile', memberId] as const,\n memberships: ['comradecircle', 'memberships'] as const,\n // Creator monetization (BOFF-4454)\n membershipTiers: (creatorId?: string) =>\n ['comradecircle', 'membershipTiers', creatorId ?? 'all'] as const,\n myMembershipTiers: ['comradecircle', 'myMembershipTiers'] as const,\n paidEvents: (creatorId?: string) => ['comradecircle', 'paidEvents', creatorId ?? 'all'] as const,\n myPaidEvents: ['comradecircle', 'myPaidEvents'] as const,\n digitalProducts: (creatorId?: string) =>\n ['comradecircle', 'digitalProducts', creatorId ?? 'all'] as const,\n myDigitalProducts: ['comradecircle', 'myDigitalProducts'] as const,\n myReceivedTips: ['comradecircle', 'myReceivedTips'] as const,\n mySentTips: ['comradecircle', 'mySentTips'] as const,\n creatorHasPaymentsEnabled: (creatorId: string) =>\n ['comradecircle', 'creatorHasPaymentsEnabled', creatorId] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n/** Drop `cursor` when it is nullish so the svc never sees an explicit null. */\nconst page = (p?: PaginationInput): PaginationInput => {\n const base = p ?? DEFAULT_PAGE;\n const result: PaginationInput = { limit: base.limit ?? DEFAULT_PAGE.limit };\n if (base.offset != null) result.offset = base.offset;\n if (base.cursor != null) result.cursor = base.cursor;\n return result;\n};\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst CHANNEL_FIELDS = `\n id workspaceId circleId name slug description type visibility position isArchived\n createdAt updatedAt\n`;\n\nconst CIRCLE_FIELDS = `\n id workspaceId name slug description topic tags status visibility memberCount\n avatar { id } createdAt updatedAt\n`;\n\nconst REACTION_FIELDS = `id postId memberId type createdAt`;\n\n/**\n * Every collection on the svc schema — root list fields AND nested fields such\n * as `ComPost.reactions` / `ComPoll.options` — returns a `Com*Connection`\n * (`{ items, pageInfo }`), never a bare list. Selecting scalars directly on a\n * connection is a hard `GRAPHQL_VALIDATION_FAILED` at the gateway, so every\n * collection selection is built through this helper.\n */\nconst conn = (fields: string): string => `items { ${fields} } pageInfo { cursor hasMore }`;\n\nconst COMMENT_FIELDS = `\n id workspaceId postId parentId authorId body isHidden createdAt updatedAt\n`;\n\nconst POST_FIELDS = `\n id workspaceId channelId authorId body status tags attachmentFileIds isPinned\n reactionCount commentCount reactions { ${conn(REACTION_FIELDS)} } createdAt updatedAt\n`;\n\nconst POLL_OPTION_FIELDS = `id workspaceId pollId label position voteCount createdAt`;\n\nconst POLL_FIELDS = `\n id workspaceId circleId question allowMultiple isAnonymous status closesAt\n options { ${conn(POLL_OPTION_FIELDS)} } createdAt updatedAt\n`;\n\nconst RSVP_FIELDS = `\n id workspaceId eventId memberId status note createdAt updatedAt\n`;\n\nconst EVENT_FIELDS = `\n id workspaceId circleId hostId title description mode status location joinUrl\n capacity startsAt endsAt tags rsvpCount createdAt updatedAt\n`;\n\nconst PROFILE_FIELDS = `\n id workspaceId memberId displayName headline bio avatar { id } interests skills\n presence discoverable createdAt updatedAt\n`;\n\nconst MEMBERSHIP_FIELDS = `\n id workspaceId circleId memberId role status joinedAt createdAt updatedAt\n`;\n\nconst FOLLOW_FIELDS = `\n id workspaceId followerId targetId targetType muted createdAt updatedAt\n`;\n\n// ============================================================================\n// Wire -> domain normalisation\n// ----------------------------------------------------------------------------\n// The transport shape (`Com*Connection`) and the shape components consume (flat\n// arrays) differ deliberately: pagination belongs to the transport, not to the\n// render tree. Every hook therefore unwraps connections here, once, so no\n// component ever has to know about `items`/`pageInfo`.\n// ============================================================================\n\n/** A `Com*Connection` as it arrives over the wire. */\ninterface WireConnection<T> {\n items: T[];\n pageInfo?: ComPageInfo;\n}\n\n/** Nested connections are optional on the wire: a selection may omit them. */\ntype WireNested<T> = WireConnection<T> | null | undefined;\n\nconst unwrap = <T>(value: WireNested<T>): T[] => value?.items ?? [];\n\ntype ComCircleWire = Omit<ComCircle, 'channels' | 'memberships'> & {\n channels?: WireNested<ComChannel>;\n memberships?: WireNested<ComMembership>;\n};\n\ntype ComPostWire = Omit<ComPost, 'reactions' | 'comments'> & {\n reactions?: WireNested<ComReaction>;\n comments?: WireNested<ComComment>;\n};\n\ntype ComPollWire = Omit<ComPoll, 'options'> & { options?: WireNested<ComPollOption> };\n\ntype ComEventWire = Omit<ComEvent, 'rsvps'> & { rsvps?: WireNested<ComEventRsvp> };\n\nconst toCircle = (wire: ComCircleWire): ComCircle => ({\n ...wire,\n channels: unwrap(wire.channels),\n memberships: unwrap(wire.memberships),\n});\n\nconst toPost = (wire: ComPostWire): ComPost => ({\n ...wire,\n reactions: unwrap(wire.reactions),\n comments: unwrap(wire.comments),\n});\n\nconst toPoll = (wire: ComPollWire): ComPoll => ({ ...wire, options: unwrap(wire.options) });\n\nconst toEvent = (wire: ComEventWire): ComEvent => ({ ...wire, rsvps: unwrap(wire.rsvps) });\n\n/** Map a wire connection onto the domain connection components consume. */\nconst toConnection = <TWire, TDomain>(\n wire: WireConnection<TWire>,\n map: (item: TWire) => TDomain\n): ComConnection<TDomain> => ({\n items: (wire.items ?? []).map(map),\n pageInfo: wire.pageInfo ?? { hasMore: false },\n});\n\n// ============================================================================\n// Circles\n// ============================================================================\n\nexport interface CircleFilters {\n status?: ComCircleStatus;\n visibility?: ComCircleVisibility;\n pagination?: PaginationInput;\n}\n\nexport const useComCircles = (filters: CircleFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.circles, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListCircles: WireConnection<ComCircleWire> }>(\n `query ComListCircles($status: ComCircleStatus, $visibility: ComCircleVisibility, $pagination: PaginationInput) {\n comListCircles(status: $status, visibility: $visibility, pagination: $pagination) {\n ${conn(`${CIRCLE_FIELDS} channels { ${conn('id')} }`)}\n }\n }`,\n {\n status: filters.status,\n visibility: filters.visibility,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListCircles, toCircle);\n },\n });\n};\n\nexport const useComCircle = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.circle(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comCircle: ComCircleWire | null }>(\n `query ComCircle($id: ID!) {\n comCircle(id: $id) {\n ${CIRCLE_FIELDS}\n channels { ${conn(CHANNEL_FIELDS)} }\n memberships { ${conn(MEMBERSHIP_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comCircle ? toCircle(result.comCircle) : null;\n },\n });\n};\n\nexport const useComCreateCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateCircleInput) => {\n const result = await comQuery<{ comCreateCircle: ComCircleWire }>(\n `mutation ComCreateCircle($input: ComCreateCircleInput!) {\n comCreateCircle(input: $input) { ${CIRCLE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toCircle(result.comCreateCircle);\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.circles }),\n });\n};\n\nexport const useComUpdateCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateCircleInput }) => {\n const result = await comQuery<{ comUpdateCircle: ComCircleWire }>(\n `mutation ComUpdateCircle($id: ID!, $input: ComUpdateCircleInput!) {\n comUpdateCircle(id: $id, input: $input) { ${CIRCLE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toCircle(result.comUpdateCircle);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(data.id) });\n },\n });\n};\n\nexport const useComArchiveCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveCircle: boolean }>(\n `mutation ComArchiveCircle($id: ID!) { comArchiveCircle(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveCircle;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.circles }),\n });\n};\n\nexport const useComJoinCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (circleId: string) => {\n const result = await comQuery<{ comJoinCircle: ComMembership }>(\n `mutation ComJoinCircle($circleId: ID!) {\n comJoinCircle(circleId: $circleId) { ${MEMBERSHIP_FIELDS} }\n }`,\n { circleId },\n apiGatewayUrl\n );\n return result.comJoinCircle;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport const useComLeaveCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (circleId: string) => {\n const result = await comQuery<{ comLeaveCircle: boolean }>(\n `mutation ComLeaveCircle($circleId: ID!) { comLeaveCircle(circleId: $circleId) }`,\n { circleId },\n apiGatewayUrl\n );\n return result.comLeaveCircle;\n },\n onSuccess: (_data, circleId) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport const useComSetMemberRole = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { membershipId: string; role: ComMemberRole; circleId?: string }) => {\n const result = await comQuery<{ comSetMemberRole: ComMembership }>(\n `mutation ComSetMemberRole($membershipId: ID!, $role: ComMemberRole!) {\n comSetMemberRole(membershipId: $membershipId, role: $role) { ${MEMBERSHIP_FIELDS} }\n }`,\n { membershipId: vars.membershipId, role: vars.role },\n apiGatewayUrl\n );\n return result.comSetMemberRole;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport interface MembershipFilters {\n circleId?: string;\n status?: ComMembershipStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComMemberships = (filters: MembershipFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.memberships, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListMemberships: ComConnection<ComMembership> }>(\n `query ComListMemberships($circleId: ID, $status: ComMembershipStatus, $pagination: PaginationInput) {\n comListMemberships(circleId: $circleId, status: $status, pagination: $pagination) {\n items { ${MEMBERSHIP_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n circleId: filters.circleId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.comListMemberships;\n },\n });\n};\n\n// ============================================================================\n// Channels\n// ============================================================================\n\nexport const useComChannels = (circleId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.channels(circleId ?? ''),\n enabled: Boolean(circleId),\n queryFn: async () => {\n const result = await comQuery<{ comListChannels: WireConnection<ComChannel> }>(\n `query ComListChannels($circleId: ID!) {\n comListChannels(circleId: $circleId) { ${conn(CHANNEL_FIELDS)} }\n }`,\n { circleId },\n apiGatewayUrl\n );\n return unwrap(result.comListChannels);\n },\n });\n};\n\nexport const useComCreateChannel = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateChannelInput) => {\n const result = await comQuery<{ comCreateChannel: ComChannel }>(\n `mutation ComCreateChannel($input: ComCreateChannelInput!) {\n comCreateChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateChannel;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.channels(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n },\n });\n};\n\nexport const useComUpdateChannel = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateChannelInput; circleId: string }) => {\n const result = await comQuery<{ comUpdateChannel: ComChannel }>(\n `mutation ComUpdateChannel($id: ID!, $input: ComUpdateChannelInput!) {\n comUpdateChannel(id: $id, input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { id: vars.id, input: vars.input },\n apiGatewayUrl\n );\n return result.comUpdateChannel;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.channels(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n },\n });\n};\n\n// ============================================================================\n// Posts / Reactions / Comments\n// ============================================================================\n\nexport interface PostFilters {\n channelId?: string;\n status?: ComPostStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComPosts = (filters: PostFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.posts(filters.channelId ?? 'all'), filters.status, filters.pagination],\n enabled: Boolean(filters.channelId),\n queryFn: async () => {\n const result = await comQuery<{ comListPosts: WireConnection<ComPostWire> }>(\n `query ComListPosts($channelId: ID, $status: ComPostStatus, $pagination: PaginationInput) {\n comListPosts(channelId: $channelId, status: $status, pagination: $pagination) {\n ${conn(POST_FIELDS)}\n }\n }`,\n {\n channelId: filters.channelId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListPosts, toPost);\n },\n });\n};\n\nexport const useComPost = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.post(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comPost: ComPostWire | null }>(\n `query ComPost($id: ID!) {\n comPost(id: $id) {\n ${POST_FIELDS}\n comments { ${conn(COMMENT_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comPost ? toPost(result.comPost) : null;\n },\n });\n};\n\nexport const useComMyFeed = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.feed, pagination],\n queryFn: async () => {\n const result = await comQuery<{ comMyFeed: WireConnection<ComPostWire> }>(\n `query ComMyFeed($pagination: PaginationInput) {\n comMyFeed(pagination: $pagination) {\n ${conn(POST_FIELDS)}\n }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return toConnection(result.comMyFeed, toPost);\n },\n });\n};\n\nexport const useComCreatePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePostInput) => {\n const result = await comQuery<{ comCreatePost: ComPostWire }>(\n `mutation ComCreatePost($input: ComCreatePostInput!) {\n comCreatePost(input: $input) { ${POST_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toPost(result.comCreatePost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComUpdatePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdatePostInput }) => {\n const result = await comQuery<{ comUpdatePost: ComPostWire }>(\n `mutation ComUpdatePost($id: ID!, $input: ComUpdatePostInput!) {\n comUpdatePost(id: $id, input: $input) { ${POST_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toPost(result.comUpdatePost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.id) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComRemovePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; channelId?: string }) => {\n const result = await comQuery<{ comRemovePost: boolean }>(\n `mutation ComRemovePost($id: ID!) { comRemovePost(id: $id) }`,\n { id: vars.id },\n apiGatewayUrl\n );\n return result.comRemovePost;\n },\n onSuccess: (_d, vars) => {\n if (vars.channelId) qc.invalidateQueries({ queryKey: KEY.posts(vars.channelId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComReactToPost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { postId: string; type: ComReactionType }) => {\n const result = await comQuery<{ comReactToPost: ComPostWire }>(\n `mutation ComReactToPost($postId: ID!, $type: ComReactionType!) {\n comReactToPost(postId: $postId, type: $type) { ${POST_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toPost(result.comReactToPost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.id) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n/**\n * Live-updating channel feed (BOFF-4455). Subscribes to `comPostAdded` over\n * the shell's graphql-ws transport (falling back to polling — see\n * `useComSubscription`) and invalidates the `useComPosts` cache for this\n * channel whenever a new post arrives or the fallback poll fires, so an open\n * `ChannelFeed` picks up the new post on its next render without the member\n * needing to manually refresh.\n */\nexport const useComPostAddedLive = (channelId: string | undefined): void => {\n const qc = useQueryClient();\n useComSubscription<{ comPostAdded: unknown }>({\n query: `subscription ComPostAdded($channelId: ID!) { comPostAdded(channelId: $channelId) { id } }`,\n variables: { channelId: channelId ?? '' },\n operationName: 'ComPostAdded',\n enabled: Boolean(channelId),\n onData: () => {\n if (channelId) void qc.invalidateQueries({ queryKey: KEY.posts(channelId) });\n },\n pollFn: () => {\n if (channelId) return qc.invalidateQueries({ queryKey: KEY.posts(channelId) });\n },\n });\n};\n\n/**\n * Live-updating post thread (BOFF-4455). Subscribes to `comCommentAdded` for\n * a single post and invalidates the `useComPost` cache (which embeds\n * `comments`) so a thread view live-updates on new comments.\n */\nexport const useComCommentAddedLive = (postId: string | undefined): void => {\n const qc = useQueryClient();\n useComSubscription<{ comCommentAdded: unknown }>({\n query: `subscription ComCommentAdded($postId: ID!) { comCommentAdded(postId: $postId) { id } }`,\n variables: { postId: postId ?? '' },\n operationName: 'ComCommentAdded',\n enabled: Boolean(postId),\n onData: () => {\n if (postId) void qc.invalidateQueries({ queryKey: KEY.post(postId) });\n },\n pollFn: () => {\n if (postId) return qc.invalidateQueries({ queryKey: KEY.post(postId) });\n },\n });\n};\n\nexport const useComComments = (postId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.comments(postId ?? ''),\n enabled: Boolean(postId),\n queryFn: async () => {\n const result = await comQuery<{ comListComments: WireConnection<ComComment> }>(\n `query ComListComments($postId: ID!) {\n comListComments(postId: $postId) { ${conn(COMMENT_FIELDS)} }\n }`,\n { postId },\n apiGatewayUrl\n );\n return unwrap(result.comListComments);\n },\n });\n};\n\nexport const useComAddComment = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateCommentInput) => {\n const result = await comQuery<{ comAddComment: ComComment }>(\n `mutation ComAddComment($input: ComCreateCommentInput!) {\n comAddComment(input: $input) { ${COMMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comAddComment;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.comments(data.postId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.postId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n// ============================================================================\n// Feed follows\n// ============================================================================\n\nexport const useComMyFollows = (targetType?: ComFollowTargetType) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.follows, targetType ?? 'all'],\n queryFn: async () => {\n const result = await comQuery<{ comMyFollows: WireConnection<ComFeedFollow> }>(\n `query ComMyFollows($targetType: ComFollowTargetType) {\n comMyFollows(targetType: $targetType) { ${conn(FOLLOW_FIELDS)} }\n }`,\n { targetType },\n apiGatewayUrl\n );\n return unwrap(result.comMyFollows);\n },\n });\n};\n\nexport const useComFollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComFollowInput) => {\n const result = await comQuery<{ comFollow: ComFeedFollow }>(\n `mutation ComFollow($input: ComFollowInput!) {\n comFollow(input: $input) { ${FOLLOW_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comFollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComUnfollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComFollowInput) => {\n const result = await comQuery<{ comUnfollow: boolean }>(\n `mutation ComUnfollow($input: ComFollowInput!) { comUnfollow(input: $input) }`,\n { input },\n apiGatewayUrl\n );\n return result.comUnfollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComMuteFollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; muted: boolean }) => {\n const result = await comQuery<{ comMuteFollow: ComFeedFollow }>(\n `mutation ComMuteFollow($id: ID!, $muted: Boolean!) {\n comMuteFollow(id: $id, muted: $muted) { ${FOLLOW_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.comMuteFollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n// ============================================================================\n// Events / RSVPs\n// ============================================================================\n\nexport interface EventFilters {\n circleId?: string;\n status?: ComEventStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComEvents = (filters: EventFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.events, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListEvents: WireConnection<ComEventWire> }>(\n `query ComListEvents($circleId: ID, $status: ComEventStatus, $pagination: PaginationInput) {\n comListEvents(circleId: $circleId, status: $status, pagination: $pagination) {\n ${conn(EVENT_FIELDS)}\n }\n }`,\n {\n circleId: filters.circleId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListEvents, toEvent);\n },\n });\n};\n\nexport const useComEvent = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.event(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comEvent: ComEventWire | null }>(\n `query ComEvent($id: ID!) {\n comEvent(id: $id) {\n ${EVENT_FIELDS}\n rsvps { ${conn(RSVP_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comEvent ? toEvent(result.comEvent) : null;\n },\n });\n};\n\n/**\n * Live-updating event detail (BOFF-4455). Subscribes to both\n * `comEventUpdated` (lifecycle transitions / edits) and `comEventRsvpAdded`\n * (new/changed RSVPs) for a single event and invalidates the `useComEvent`\n * cache on either, so an open event detail page's status badge and live\n * attendee count update without a manual refresh.\n */\nexport const useComEventLive = (eventId: string | undefined): void => {\n const qc = useQueryClient();\n const invalidate = () => {\n if (eventId) return qc.invalidateQueries({ queryKey: KEY.event(eventId) });\n };\n\n useComSubscription<{ comEventUpdated: unknown }>({\n query: `subscription ComEventUpdated($eventId: ID!) { comEventUpdated(eventId: $eventId) { id } }`,\n variables: { eventId: eventId ?? '' },\n operationName: 'ComEventUpdated',\n enabled: Boolean(eventId),\n onData: invalidate,\n pollFn: invalidate,\n });\n\n useComSubscription<{ comEventRsvpAdded: unknown }>({\n query: `subscription ComEventRsvpAdded($eventId: ID!) { comEventRsvpAdded(eventId: $eventId) { id } }`,\n variables: { eventId: eventId ?? '' },\n operationName: 'ComEventRsvpAdded',\n enabled: Boolean(eventId),\n onData: invalidate,\n // Only one of the two subscriptions needs to drive the polling fallback\n // interval — running both would double the poll rate for no benefit.\n pollFn: () => {},\n pollIntervalMs: 30_000,\n });\n};\n\nexport const useComCreateEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateEventInput) => {\n const result = await comQuery<{ comCreateEvent: ComEventWire }>(\n `mutation ComCreateEvent($input: ComCreateEventInput!) {\n comCreateEvent(input: $input) { ${EVENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toEvent(result.comCreateEvent);\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.events }),\n });\n};\n\nexport const useComUpdateEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateEventInput }) => {\n const result = await comQuery<{ comUpdateEvent: ComEventWire }>(\n `mutation ComUpdateEvent($id: ID!, $input: ComUpdateEventInput!) {\n comUpdateEvent(id: $id, input: $input) { ${EVENT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toEvent(result.comUpdateEvent);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.id) });\n },\n });\n};\n\nexport const useComTransitionEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: ComEventStatus }) => {\n const result = await comQuery<{ comTransitionEvent: ComEventWire }>(\n `mutation ComTransitionEvent($id: ID!, $status: ComEventStatus!) {\n comTransitionEvent(id: $id, status: $status) { ${EVENT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toEvent(result.comTransitionEvent);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.id) });\n },\n });\n};\n\nexport const useComRsvpEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { eventId: string; status: ComRsvpStatus; note?: string | null }) => {\n const result = await comQuery<{ comRsvpEvent: ComEventRsvp }>(\n `mutation ComRsvpEvent($eventId: ID!, $status: ComRsvpStatus!, $note: String) {\n comRsvpEvent(eventId: $eventId, status: $status, note: $note) { ${RSVP_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.comRsvpEvent;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.eventId) });\n },\n });\n};\n\n// ============================================================================\n// Polls / Votes\n// ============================================================================\n\nexport const useComPolls = (circleId: string | undefined, status?: ComPollStatus) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.polls(circleId ?? ''), status ?? 'all'],\n enabled: Boolean(circleId),\n queryFn: async () => {\n const result = await comQuery<{ comListPolls: WireConnection<ComPollWire> }>(\n `query ComListPolls($circleId: ID!, $status: ComPollStatus) {\n comListPolls(circleId: $circleId, status: $status) { ${conn(POLL_FIELDS)} }\n }`,\n { circleId, status },\n apiGatewayUrl\n );\n return unwrap(result.comListPolls).map(toPoll);\n },\n });\n};\n\nexport const useComCreatePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePollInput) => {\n const result = await comQuery<{ comCreatePoll: ComPollWire }>(\n `mutation ComCreatePoll($input: ComCreatePollInput!) {\n comCreatePoll(input: $input) { ${POLL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toPoll(result.comCreatePoll);\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.polls(data.circleId) }),\n });\n};\n\nexport const useComClosePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comClosePoll: ComPollWire }>(\n `mutation ComClosePoll($id: ID!) { comClosePoll(id: $id) { ${POLL_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return toPoll(result.comClosePoll);\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.polls(data.circleId) }),\n });\n};\n\nexport const useComVotePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { pollId: string; optionId: string; circleId?: string }) => {\n const result = await comQuery<{ comVotePoll: ComPollOption }>(\n `mutation ComVotePoll($pollId: ID!, $optionId: ID!) {\n comVotePoll(pollId: $pollId, optionId: $optionId) { ${POLL_OPTION_FIELDS} }\n }`,\n { pollId: vars.pollId, optionId: vars.optionId },\n apiGatewayUrl\n );\n return result.comVotePoll;\n },\n onSuccess: (_data, vars) => {\n if (vars.circleId) qc.invalidateQueries({ queryKey: KEY.polls(vars.circleId) });\n qc.invalidateQueries({ queryKey: KEY.poll(vars.pollId) });\n },\n });\n};\n\n// ============================================================================\n// Profiles (social identity layer)\n// ============================================================================\n\nexport interface ProfileFilters {\n discoverable?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useComProfiles = (filters: ProfileFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.profiles, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListProfiles: ComConnection<ComProfile> }>(\n `query ComListProfiles($discoverable: Boolean, $pagination: PaginationInput) {\n comListProfiles(discoverable: $discoverable, pagination: $pagination) {\n items { ${PROFILE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { discoverable: filters.discoverable, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.comListProfiles;\n },\n });\n};\n\nexport const useComProfile = (memberId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.profile(memberId ?? ''),\n enabled: Boolean(memberId),\n // Profiles change rarely; cache aggressively so feed identity lookups are cheap.\n staleTime: 10 * 60 * 1000,\n queryFn: async () => {\n const result = await comQuery<{ comProfile: ComProfile | null }>(\n `query ComProfile($memberId: ID!) {\n comProfile(memberId: $memberId) { ${PROFILE_FIELDS} }\n }`,\n { memberId },\n apiGatewayUrl\n );\n return result.comProfile;\n },\n });\n};\n\nexport const useComUpsertProfile = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComUpsertProfileInput) => {\n const result = await comQuery<{ comUpsertProfile: ComProfile }>(\n `mutation ComUpsertProfile($input: ComUpsertProfileInput!) {\n comUpsertProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comUpsertProfile;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.profiles });\n qc.invalidateQueries({ queryKey: KEY.profile(data.memberId) });\n },\n });\n};\n\n// ============================================================================\n// Creator monetization (BOFF-4454)\n// ============================================================================\n// Bounded pricing/catalog CATALOG core — no live payment processor is wired\n// (see `useComCreatorHasPaymentsEnabled`, always false today). Purchase/\n// subscribe/tip CTAs must render a \"Payment integration pending\" state.\n\nconst MONETIZATION_TIER_FIELDS = `\n id workspaceId creatorId circleId name description perks priceAmount currency\n billingInterval status createdAt updatedAt\n`;\n\nconst MONETIZATION_EVENT_FIELDS = `\n id workspaceId creatorId circleId title description priceAmount currency\n capacity startsAt status createdAt updatedAt\n`;\n\nconst MONETIZATION_PRODUCT_FIELDS = `\n id workspaceId creatorId title description priceAmount currency productType\n file { id } status createdAt updatedAt\n`;\n\nconst MONETIZATION_TIP_FIELDS = `\n id workspaceId creatorId tipperId amount currency message status createdAt\n`;\n\nexport const useComListMembershipTiers = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.membershipTiers(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListMembershipTiers: ComCreatorMembershipTierConnection }>(\n `query ComListMembershipTiers($creatorId: ID, $pagination: PaginationInput) {\n comListMembershipTiers(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_TIER_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListMembershipTiers;\n },\n });\n};\n\nexport const useComMyMembershipTiers = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myMembershipTiers,\n queryFn: async () => {\n const result = await comQuery<{ comMyMembershipTiers: ComCreatorMembershipTierConnection }>(\n `query ComMyMembershipTiers($pagination: PaginationInput) {\n comMyMembershipTiers(pagination: $pagination) { ${conn(MONETIZATION_TIER_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyMembershipTiers;\n },\n });\n};\n\nexport const useComCreateMembershipTier = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateMembershipTierInput) => {\n const result = await comQuery<{ comCreateMembershipTier: ComCreatorMembershipTier }>(\n `mutation ComCreateMembershipTier($input: ComCreateMembershipTierInput!) {\n comCreateMembershipTier(input: $input) { ${MONETIZATION_TIER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateMembershipTier;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myMembershipTiers });\n },\n });\n};\n\nexport const useComArchiveMembershipTier = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveMembershipTier: boolean }>(\n `mutation ComArchiveMembershipTier($id: ID!) { comArchiveMembershipTier(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveMembershipTier;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myMembershipTiers });\n },\n });\n};\n\nexport const useComListPaidEvents = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.paidEvents(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListPaidEvents: ComPaidEventConnection }>(\n `query ComListPaidEvents($creatorId: ID, $pagination: PaginationInput) {\n comListPaidEvents(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_EVENT_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListPaidEvents;\n },\n });\n};\n\nexport const useComMyPaidEvents = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myPaidEvents,\n queryFn: async () => {\n const result = await comQuery<{ comMyPaidEvents: ComPaidEventConnection }>(\n `query ComMyPaidEvents($pagination: PaginationInput) {\n comMyPaidEvents(pagination: $pagination) { ${conn(MONETIZATION_EVENT_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyPaidEvents;\n },\n });\n};\n\nexport const useComCreatePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePaidEventInput) => {\n const result = await comQuery<{ comCreatePaidEvent: ComPaidEvent }>(\n `mutation ComCreatePaidEvent($input: ComCreatePaidEventInput!) {\n comCreatePaidEvent(input: $input) { ${MONETIZATION_EVENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreatePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComUpdatePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: ComUpdatePaidEventInput }) => {\n const result = await comQuery<{ comUpdatePaidEvent: ComPaidEvent }>(\n `mutation ComUpdatePaidEvent($id: ID!, $input: ComUpdatePaidEventInput!) {\n comUpdatePaidEvent(id: $id, input: $input) { ${MONETIZATION_EVENT_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.comUpdatePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComArchivePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchivePaidEvent: boolean }>(\n `mutation ComArchivePaidEvent($id: ID!) { comArchivePaidEvent(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchivePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComListDigitalProducts = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.digitalProducts(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListDigitalProducts: ComDigitalProductConnection }>(\n `query ComListDigitalProducts($creatorId: ID, $pagination: PaginationInput) {\n comListDigitalProducts(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_PRODUCT_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListDigitalProducts;\n },\n });\n};\n\nexport const useComMyDigitalProducts = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myDigitalProducts,\n queryFn: async () => {\n const result = await comQuery<{ comMyDigitalProducts: ComDigitalProductConnection }>(\n `query ComMyDigitalProducts($pagination: PaginationInput) {\n comMyDigitalProducts(pagination: $pagination) { ${conn(MONETIZATION_PRODUCT_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyDigitalProducts;\n },\n });\n};\n\nexport const useComCreateDigitalProduct = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateDigitalProductInput) => {\n const result = await comQuery<{ comCreateDigitalProduct: ComDigitalProduct }>(\n `mutation ComCreateDigitalProduct($input: ComCreateDigitalProductInput!) {\n comCreateDigitalProduct(input: $input) { ${MONETIZATION_PRODUCT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateDigitalProduct;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myDigitalProducts });\n },\n });\n};\n\nexport const useComArchiveDigitalProduct = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveDigitalProduct: boolean }>(\n `mutation ComArchiveDigitalProduct($id: ID!) { comArchiveDigitalProduct(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveDigitalProduct;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myDigitalProducts });\n },\n });\n};\n\nexport const useComMyReceivedTips = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myReceivedTips,\n queryFn: async () => {\n const result = await comQuery<{ comMyReceivedTips: ComTipIntentConnection }>(\n `query ComMyReceivedTips($pagination: PaginationInput) {\n comMyReceivedTips(pagination: $pagination) { ${conn(MONETIZATION_TIP_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyReceivedTips;\n },\n });\n};\n\nexport const useComMySentTips = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.mySentTips,\n queryFn: async () => {\n const result = await comQuery<{ comMySentTips: ComTipIntentConnection }>(\n `query ComMySentTips($pagination: PaginationInput) {\n comMySentTips(pagination: $pagination) { ${conn(MONETIZATION_TIP_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMySentTips;\n },\n });\n};\n\nexport const useComRecordTipIntent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComRecordTipIntentInput) => {\n const result = await comQuery<{ comRecordTipIntent: ComTipIntent }>(\n `mutation ComRecordTipIntent($input: ComRecordTipIntentInput!) {\n comRecordTipIntent(input: $input) { ${MONETIZATION_TIP_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comRecordTipIntent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.mySentTips });\n },\n });\n};\n\nexport const useComCancelTipIntent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comCancelTipIntent: boolean }>(\n `mutation ComCancelTipIntent($id: ID!) { comCancelTipIntent(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comCancelTipIntent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.mySentTips });\n },\n });\n};\n\n/**\n * Always false today (BOFF-4454 billing boundary — catalog/calculation only,\n * no live payment processor is wired). Lets the FE render an honest \"Payment\n * integration pending\" state on every purchase/subscribe/tip CTA instead of\n * guessing. Cached like any other read so the UI doesn't re-fetch per render.\n */\nexport const useComCreatorHasPaymentsEnabled = (creatorId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.creatorHasPaymentsEnabled(creatorId ?? ''),\n enabled: Boolean(creatorId),\n staleTime: 60 * 60 * 1000,\n queryFn: async () => {\n const result = await comQuery<{ comCreatorHasPaymentsEnabled: boolean }>(\n `query ComCreatorHasPaymentsEnabled($creatorId: ID!) {\n comCreatorHasPaymentsEnabled(creatorId: $creatorId)\n }`,\n { creatorId },\n apiGatewayUrl\n );\n return result.comCreatorHasPaymentsEnabled;\n },\n });\n};\n\n// Re-export commonly used reaction type for convenience.\nexport type { ComReaction };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useComradeCircleApi.js","names":[],"sources":["../../../src/comradecircle/hooks/useComradeCircleApi.ts"],"sourcesContent":["/**\n * ComradeCircle API hooks\n * @module comradecircle/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-comradecircle-svc`\n * federated GraphQL contract (the `com*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n *\n * IMPORTANT: `User`/`File` are id-only federation stubs in this subgraph. We\n * never select `author { firstName }` or `avatar { url }`. Display identity is\n * resolved through `ComProfile` (see `useComProfile`).\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useComradeCircle } from '../context';\nimport { clearGraphqlResponseCache } from '../lib/graphql-cache';\nimport { useComSubscription } from './useComSubscription';\nimport type {\n ComConnection,\n ComCircle,\n ComCircleStatus,\n ComCircleVisibility,\n ComChannel,\n ComComment,\n ComPost,\n ComPostStatus,\n ComPoll,\n ComPollStatus,\n ComPollOption,\n ComEvent,\n ComEventStatus,\n ComEventRsvp,\n ComRsvpStatus,\n ComProfile,\n ComMembership,\n ComMembershipStatus,\n ComMemberRole,\n ComFeedFollow,\n ComFollowTargetType,\n ComReaction,\n ComReactionType,\n ComCreateCircleInput,\n ComUpdateCircleInput,\n ComCreateChannelInput,\n ComUpdateChannelInput,\n ComCreatePostInput,\n ComUpdatePostInput,\n ComCreateCommentInput,\n ComCreateEventInput,\n ComUpdateEventInput,\n ComCreatePollInput,\n ComFollowInput,\n ComUpsertProfileInput,\n ComPageInfo,\n PaginationInput,\n ComCreatorMembershipTier,\n ComCreatorMembershipTierConnection,\n ComPaidEvent,\n ComPaidEventConnection,\n ComDigitalProduct,\n ComDigitalProductConnection,\n ComTipIntent,\n ComTipIntentConnection,\n ComCreateMembershipTierInput,\n ComCreatePaidEventInput,\n ComUpdatePaidEventInput,\n ComCreateDigitalProductInput,\n ComRecordTipIntentInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\nconst isMutation = (query: string): boolean => /^\\s*mutation\\b/.test(query);\n\n/**\n * Run one `com*` operation through the workspace gateway. Exported so sibling\n * hook modules (e.g. useModerationApi) share the same transport and\n * read-cache invalidation rules.\n */\nexport const comQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n // A mutation's own request must never be served from (or coalesced onto) the\n // read cache, and the resolved read cache must be dropped once it commits so\n // the React-Query refetch that follows sees the new state — not a stale\n // pre-write response held for up to 15s. Clear before AND after the write.\n const mutating = isMutation(query);\n if (mutating) clearGraphqlResponseCache();\n\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (mutating) clearGraphqlResponseCache();\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n circles: ['comradecircle', 'circles'] as const,\n circle: (id: string) => ['comradecircle', 'circle', id] as const,\n channels: (circleId: string) => ['comradecircle', 'channels', circleId] as const,\n posts: (channelId: string) => ['comradecircle', 'posts', channelId] as const,\n post: (id: string) => ['comradecircle', 'post', id] as const,\n comments: (postId: string) => ['comradecircle', 'comments', postId] as const,\n feed: ['comradecircle', 'feed'] as const,\n follows: ['comradecircle', 'follows'] as const,\n events: ['comradecircle', 'events'] as const,\n event: (id: string) => ['comradecircle', 'event', id] as const,\n polls: (circleId: string) => ['comradecircle', 'polls', circleId] as const,\n poll: (id: string) => ['comradecircle', 'poll', id] as const,\n profiles: ['comradecircle', 'profiles'] as const,\n profile: (memberId: string) => ['comradecircle', 'profile', memberId] as const,\n memberships: ['comradecircle', 'memberships'] as const,\n // Creator monetization (BOFF-4454)\n membershipTiers: (creatorId?: string) =>\n ['comradecircle', 'membershipTiers', creatorId ?? 'all'] as const,\n myMembershipTiers: ['comradecircle', 'myMembershipTiers'] as const,\n paidEvents: (creatorId?: string) => ['comradecircle', 'paidEvents', creatorId ?? 'all'] as const,\n myPaidEvents: ['comradecircle', 'myPaidEvents'] as const,\n digitalProducts: (creatorId?: string) =>\n ['comradecircle', 'digitalProducts', creatorId ?? 'all'] as const,\n myDigitalProducts: ['comradecircle', 'myDigitalProducts'] as const,\n myReceivedTips: ['comradecircle', 'myReceivedTips'] as const,\n mySentTips: ['comradecircle', 'mySentTips'] as const,\n creatorHasPaymentsEnabled: (creatorId: string) =>\n ['comradecircle', 'creatorHasPaymentsEnabled', creatorId] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n/** Drop `cursor` when it is nullish so the svc never sees an explicit null. */\nconst page = (p?: PaginationInput): PaginationInput => {\n const base = p ?? DEFAULT_PAGE;\n const result: PaginationInput = { limit: base.limit ?? DEFAULT_PAGE.limit };\n if (base.offset != null) result.offset = base.offset;\n if (base.cursor != null) result.cursor = base.cursor;\n return result;\n};\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst CHANNEL_FIELDS = `\n id workspaceId circleId name slug description type visibility position isArchived\n createdAt updatedAt\n`;\n\nconst CIRCLE_FIELDS = `\n id workspaceId name slug description topic tags status visibility memberCount\n avatar { id } createdAt updatedAt\n`;\n\nconst REACTION_FIELDS = `id postId memberId type createdAt`;\n\n/**\n * Every collection on the svc schema — root list fields AND nested fields such\n * as `ComPost.reactions` / `ComPoll.options` — returns a `Com*Connection`\n * (`{ items, pageInfo }`), never a bare list. Selecting scalars directly on a\n * connection is a hard `GRAPHQL_VALIDATION_FAILED` at the gateway, so every\n * collection selection is built through this helper.\n */\nconst conn = (fields: string): string => `items { ${fields} } pageInfo { cursor hasMore }`;\n\nconst COMMENT_FIELDS = `\n id workspaceId postId parentId authorId body isHidden createdAt updatedAt\n`;\n\nconst POST_FIELDS = `\n id workspaceId channelId authorId body status tags attachmentFileIds isPinned\n reactionCount commentCount reactions { ${conn(REACTION_FIELDS)} } createdAt updatedAt\n`;\n\nconst POLL_OPTION_FIELDS = `id workspaceId pollId label position voteCount createdAt`;\n\nconst POLL_FIELDS = `\n id workspaceId circleId question allowMultiple isAnonymous status closesAt\n options { ${conn(POLL_OPTION_FIELDS)} } createdAt updatedAt\n`;\n\nconst RSVP_FIELDS = `\n id workspaceId eventId memberId status note createdAt updatedAt\n`;\n\nconst EVENT_FIELDS = `\n id workspaceId circleId hostId title description mode status location joinUrl\n capacity startsAt endsAt tags rsvpCount createdAt updatedAt\n`;\n\nconst PROFILE_FIELDS = `\n id workspaceId memberId displayName headline bio avatar { id } interests skills\n presence discoverable createdAt updatedAt\n`;\n\nconst MEMBERSHIP_FIELDS = `\n id workspaceId circleId memberId role status joinedAt createdAt updatedAt\n`;\n\nconst FOLLOW_FIELDS = `\n id workspaceId followerId targetId targetType muted createdAt updatedAt\n`;\n\n// ============================================================================\n// Wire -> domain normalisation\n// ----------------------------------------------------------------------------\n// The transport shape (`Com*Connection`) and the shape components consume (flat\n// arrays) differ deliberately: pagination belongs to the transport, not to the\n// render tree. Every hook therefore unwraps connections here, once, so no\n// component ever has to know about `items`/`pageInfo`.\n// ============================================================================\n\n/** A `Com*Connection` as it arrives over the wire. */\ninterface WireConnection<T> {\n items: T[];\n pageInfo?: ComPageInfo;\n}\n\n/** Nested connections are optional on the wire: a selection may omit them. */\ntype WireNested<T> = WireConnection<T> | null | undefined;\n\nconst unwrap = <T>(value: WireNested<T>): T[] => value?.items ?? [];\n\ntype ComCircleWire = Omit<ComCircle, 'channels' | 'memberships'> & {\n channels?: WireNested<ComChannel>;\n memberships?: WireNested<ComMembership>;\n};\n\ntype ComPostWire = Omit<ComPost, 'reactions' | 'comments'> & {\n reactions?: WireNested<ComReaction>;\n comments?: WireNested<ComComment>;\n};\n\ntype ComPollWire = Omit<ComPoll, 'options'> & { options?: WireNested<ComPollOption> };\n\ntype ComEventWire = Omit<ComEvent, 'rsvps'> & { rsvps?: WireNested<ComEventRsvp> };\n\nconst toCircle = (wire: ComCircleWire): ComCircle => ({\n ...wire,\n channels: unwrap(wire.channels),\n memberships: unwrap(wire.memberships),\n});\n\nconst toPost = (wire: ComPostWire): ComPost => ({\n ...wire,\n reactions: unwrap(wire.reactions),\n comments: unwrap(wire.comments),\n});\n\nconst toPoll = (wire: ComPollWire): ComPoll => ({ ...wire, options: unwrap(wire.options) });\n\nconst toEvent = (wire: ComEventWire): ComEvent => ({ ...wire, rsvps: unwrap(wire.rsvps) });\n\n/** Map a wire connection onto the domain connection components consume. */\nconst toConnection = <TWire, TDomain>(\n wire: WireConnection<TWire>,\n map: (item: TWire) => TDomain\n): ComConnection<TDomain> => ({\n items: (wire.items ?? []).map(map),\n pageInfo: wire.pageInfo ?? { hasMore: false },\n});\n\n// ============================================================================\n// Circles\n// ============================================================================\n\nexport interface CircleFilters {\n status?: ComCircleStatus;\n visibility?: ComCircleVisibility;\n pagination?: PaginationInput;\n}\n\nexport const useComCircles = (filters: CircleFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.circles, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListCircles: WireConnection<ComCircleWire> }>(\n `query ComListCircles($status: ComCircleStatus, $visibility: ComCircleVisibility, $pagination: PaginationInput) {\n comListCircles(status: $status, visibility: $visibility, pagination: $pagination) {\n ${conn(`${CIRCLE_FIELDS} channels { ${conn('id')} }`)}\n }\n }`,\n {\n status: filters.status,\n visibility: filters.visibility,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListCircles, toCircle);\n },\n });\n};\n\nexport const useComCircle = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.circle(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comCircle: ComCircleWire | null }>(\n `query ComCircle($id: ID!) {\n comCircle(id: $id) {\n ${CIRCLE_FIELDS}\n channels { ${conn(CHANNEL_FIELDS)} }\n memberships { ${conn(MEMBERSHIP_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comCircle ? toCircle(result.comCircle) : null;\n },\n });\n};\n\nexport const useComCreateCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateCircleInput) => {\n const result = await comQuery<{ comCreateCircle: ComCircleWire }>(\n `mutation ComCreateCircle($input: ComCreateCircleInput!) {\n comCreateCircle(input: $input) { ${CIRCLE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toCircle(result.comCreateCircle);\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.circles }),\n });\n};\n\nexport const useComUpdateCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateCircleInput }) => {\n const result = await comQuery<{ comUpdateCircle: ComCircleWire }>(\n `mutation ComUpdateCircle($id: ID!, $input: ComUpdateCircleInput!) {\n comUpdateCircle(id: $id, input: $input) { ${CIRCLE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toCircle(result.comUpdateCircle);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(data.id) });\n },\n });\n};\n\nexport const useComArchiveCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveCircle: boolean }>(\n `mutation ComArchiveCircle($id: ID!) { comArchiveCircle(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveCircle;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.circles }),\n });\n};\n\nexport const useComJoinCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (circleId: string) => {\n const result = await comQuery<{ comJoinCircle: ComMembership }>(\n `mutation ComJoinCircle($circleId: ID!) {\n comJoinCircle(circleId: $circleId) { ${MEMBERSHIP_FIELDS} }\n }`,\n { circleId },\n apiGatewayUrl\n );\n return result.comJoinCircle;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport const useComLeaveCircle = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (circleId: string) => {\n const result = await comQuery<{ comLeaveCircle: boolean }>(\n `mutation ComLeaveCircle($circleId: ID!) { comLeaveCircle(circleId: $circleId) }`,\n { circleId },\n apiGatewayUrl\n );\n return result.comLeaveCircle;\n },\n onSuccess: (_data, circleId) => {\n qc.invalidateQueries({ queryKey: KEY.circles });\n qc.invalidateQueries({ queryKey: KEY.circle(circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport const useComSetMemberRole = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { membershipId: string; role: ComMemberRole; circleId?: string }) => {\n const result = await comQuery<{ comSetMemberRole: ComMembership }>(\n `mutation ComSetMemberRole($membershipId: ID!, $role: ComMemberRole!) {\n comSetMemberRole(membershipId: $membershipId, role: $role) { ${MEMBERSHIP_FIELDS} }\n }`,\n { membershipId: vars.membershipId, role: vars.role },\n apiGatewayUrl\n );\n return result.comSetMemberRole;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.memberships });\n },\n });\n};\n\nexport interface MembershipFilters {\n circleId?: string;\n status?: ComMembershipStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComMemberships = (filters: MembershipFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.memberships, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListMemberships: ComConnection<ComMembership> }>(\n `query ComListMemberships($circleId: ID, $status: ComMembershipStatus, $pagination: PaginationInput) {\n comListMemberships(circleId: $circleId, status: $status, pagination: $pagination) {\n items { ${MEMBERSHIP_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n circleId: filters.circleId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.comListMemberships;\n },\n });\n};\n\n// ============================================================================\n// Channels\n// ============================================================================\n\nexport const useComChannels = (circleId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.channels(circleId ?? ''),\n enabled: Boolean(circleId),\n queryFn: async () => {\n const result = await comQuery<{ comListChannels: WireConnection<ComChannel> }>(\n `query ComListChannels($circleId: ID!) {\n comListChannels(circleId: $circleId) { ${conn(CHANNEL_FIELDS)} }\n }`,\n { circleId },\n apiGatewayUrl\n );\n return unwrap(result.comListChannels);\n },\n });\n};\n\nexport const useComCreateChannel = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateChannelInput) => {\n const result = await comQuery<{ comCreateChannel: ComChannel }>(\n `mutation ComCreateChannel($input: ComCreateChannelInput!) {\n comCreateChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateChannel;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.channels(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n },\n });\n};\n\nexport const useComUpdateChannel = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateChannelInput; circleId: string }) => {\n const result = await comQuery<{ comUpdateChannel: ComChannel }>(\n `mutation ComUpdateChannel($id: ID!, $input: ComUpdateChannelInput!) {\n comUpdateChannel(id: $id, input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { id: vars.id, input: vars.input },\n apiGatewayUrl\n );\n return result.comUpdateChannel;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.channels(data.circleId) });\n qc.invalidateQueries({ queryKey: KEY.circle(data.circleId) });\n },\n });\n};\n\n// ============================================================================\n// Posts / Reactions / Comments\n// ============================================================================\n\nexport interface PostFilters {\n channelId?: string;\n status?: ComPostStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComPosts = (filters: PostFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.posts(filters.channelId ?? 'all'), filters.status, filters.pagination],\n enabled: Boolean(filters.channelId),\n queryFn: async () => {\n const result = await comQuery<{ comListPosts: WireConnection<ComPostWire> }>(\n `query ComListPosts($channelId: ID, $status: ComPostStatus, $pagination: PaginationInput) {\n comListPosts(channelId: $channelId, status: $status, pagination: $pagination) {\n ${conn(POST_FIELDS)}\n }\n }`,\n {\n channelId: filters.channelId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListPosts, toPost);\n },\n });\n};\n\nexport const useComPost = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.post(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comPost: ComPostWire | null }>(\n `query ComPost($id: ID!) {\n comPost(id: $id) {\n ${POST_FIELDS}\n comments { ${conn(COMMENT_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comPost ? toPost(result.comPost) : null;\n },\n });\n};\n\nexport const useComMyFeed = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.feed, pagination],\n queryFn: async () => {\n const result = await comQuery<{ comMyFeed: WireConnection<ComPostWire> }>(\n `query ComMyFeed($pagination: PaginationInput) {\n comMyFeed(pagination: $pagination) {\n ${conn(POST_FIELDS)}\n }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return toConnection(result.comMyFeed, toPost);\n },\n });\n};\n\nexport const useComCreatePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePostInput) => {\n const result = await comQuery<{ comCreatePost: ComPostWire }>(\n `mutation ComCreatePost($input: ComCreatePostInput!) {\n comCreatePost(input: $input) { ${POST_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toPost(result.comCreatePost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComUpdatePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdatePostInput }) => {\n const result = await comQuery<{ comUpdatePost: ComPostWire }>(\n `mutation ComUpdatePost($id: ID!, $input: ComUpdatePostInput!) {\n comUpdatePost(id: $id, input: $input) { ${POST_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toPost(result.comUpdatePost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.id) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComRemovePost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; channelId?: string }) => {\n const result = await comQuery<{ comRemovePost: boolean }>(\n `mutation ComRemovePost($id: ID!) { comRemovePost(id: $id) }`,\n { id: vars.id },\n apiGatewayUrl\n );\n return result.comRemovePost;\n },\n onSuccess: (_d, vars) => {\n if (vars.channelId) qc.invalidateQueries({ queryKey: KEY.posts(vars.channelId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComReactToPost = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { postId: string; type: ComReactionType }) => {\n const result = await comQuery<{ comReactToPost: ComPostWire }>(\n `mutation ComReactToPost($postId: ID!, $type: ComReactionType!) {\n comReactToPost(postId: $postId, type: $type) { ${POST_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toPost(result.comReactToPost);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.posts(data.channelId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.id) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n/**\n * Live-updating channel feed (BOFF-4455). Subscribes to `comPostAdded` over\n * the shell's graphql-ws transport (falling back to polling — see\n * `useComSubscription`) and invalidates the `useComPosts` cache for this\n * channel whenever a new post arrives or the fallback poll fires, so an open\n * `ChannelFeed` picks up the new post on its next render without the member\n * needing to manually refresh.\n */\nexport const useComPostAddedLive = (channelId: string | undefined): void => {\n const qc = useQueryClient();\n useComSubscription<{ comPostAdded: unknown }>({\n query: `subscription ComPostAdded($channelId: ID!) { comPostAdded(channelId: $channelId) { id } }`,\n variables: { channelId: channelId ?? '' },\n operationName: 'ComPostAdded',\n enabled: Boolean(channelId),\n onData: () => {\n if (channelId) void qc.invalidateQueries({ queryKey: KEY.posts(channelId) });\n },\n pollFn: () => {\n if (channelId) return qc.invalidateQueries({ queryKey: KEY.posts(channelId) });\n },\n });\n};\n\n/**\n * Live-updating post thread (BOFF-4455). Subscribes to `comCommentAdded` for\n * a single post and invalidates the `useComPost` cache (which embeds\n * `comments`) so a thread view live-updates on new comments.\n */\nexport const useComCommentAddedLive = (postId: string | undefined): void => {\n const qc = useQueryClient();\n useComSubscription<{ comCommentAdded: unknown }>({\n query: `subscription ComCommentAdded($postId: ID!) { comCommentAdded(postId: $postId) { id } }`,\n variables: { postId: postId ?? '' },\n operationName: 'ComCommentAdded',\n enabled: Boolean(postId),\n onData: () => {\n if (postId) void qc.invalidateQueries({ queryKey: KEY.post(postId) });\n },\n pollFn: () => {\n if (postId) return qc.invalidateQueries({ queryKey: KEY.post(postId) });\n },\n });\n};\n\nexport const useComComments = (postId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.comments(postId ?? ''),\n enabled: Boolean(postId),\n queryFn: async () => {\n const result = await comQuery<{ comListComments: WireConnection<ComComment> }>(\n `query ComListComments($postId: ID!) {\n comListComments(postId: $postId) { ${conn(COMMENT_FIELDS)} }\n }`,\n { postId },\n apiGatewayUrl\n );\n return unwrap(result.comListComments);\n },\n });\n};\n\nexport const useComAddComment = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateCommentInput) => {\n const result = await comQuery<{ comAddComment: ComComment }>(\n `mutation ComAddComment($input: ComCreateCommentInput!) {\n comAddComment(input: $input) { ${COMMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comAddComment;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.comments(data.postId) });\n qc.invalidateQueries({ queryKey: KEY.post(data.postId) });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n// ============================================================================\n// Feed follows\n// ============================================================================\n\nexport const useComMyFollows = (targetType?: ComFollowTargetType) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.follows, targetType ?? 'all'],\n queryFn: async () => {\n const result = await comQuery<{ comMyFollows: WireConnection<ComFeedFollow> }>(\n `query ComMyFollows($targetType: ComFollowTargetType) {\n comMyFollows(targetType: $targetType) { ${conn(FOLLOW_FIELDS)} }\n }`,\n { targetType },\n apiGatewayUrl\n );\n return unwrap(result.comMyFollows);\n },\n });\n};\n\nexport const useComFollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComFollowInput) => {\n const result = await comQuery<{ comFollow: ComFeedFollow }>(\n `mutation ComFollow($input: ComFollowInput!) {\n comFollow(input: $input) { ${FOLLOW_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comFollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComUnfollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComFollowInput) => {\n const result = await comQuery<{ comUnfollow: boolean }>(\n `mutation ComUnfollow($input: ComFollowInput!) { comUnfollow(input: $input) }`,\n { input },\n apiGatewayUrl\n );\n return result.comUnfollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\nexport const useComMuteFollow = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; muted: boolean }) => {\n const result = await comQuery<{ comMuteFollow: ComFeedFollow }>(\n `mutation ComMuteFollow($id: ID!, $muted: Boolean!) {\n comMuteFollow(id: $id, muted: $muted) { ${FOLLOW_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.comMuteFollow;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.follows });\n qc.invalidateQueries({ queryKey: KEY.feed });\n },\n });\n};\n\n// ============================================================================\n// Events / RSVPs\n// ============================================================================\n\nexport interface EventFilters {\n circleId?: string;\n status?: ComEventStatus;\n pagination?: PaginationInput;\n}\n\nexport const useComEvents = (filters: EventFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.events, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListEvents: WireConnection<ComEventWire> }>(\n `query ComListEvents($circleId: ID, $status: ComEventStatus, $pagination: PaginationInput) {\n comListEvents(circleId: $circleId, status: $status, pagination: $pagination) {\n ${conn(EVENT_FIELDS)}\n }\n }`,\n {\n circleId: filters.circleId,\n status: filters.status,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return toConnection(result.comListEvents, toEvent);\n },\n });\n};\n\nexport const useComEvent = (id: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.event(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await comQuery<{ comEvent: ComEventWire | null }>(\n `query ComEvent($id: ID!) {\n comEvent(id: $id) {\n ${EVENT_FIELDS}\n rsvps { ${conn(RSVP_FIELDS)} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.comEvent ? toEvent(result.comEvent) : null;\n },\n });\n};\n\n/**\n * Live-updating event detail (BOFF-4455). Subscribes to both\n * `comEventUpdated` (lifecycle transitions / edits) and `comEventRsvpAdded`\n * (new/changed RSVPs) for a single event and invalidates the `useComEvent`\n * cache on either, so an open event detail page's status badge and live\n * attendee count update without a manual refresh.\n */\nexport const useComEventLive = (eventId: string | undefined): void => {\n const qc = useQueryClient();\n const invalidate = () => {\n if (eventId) return qc.invalidateQueries({ queryKey: KEY.event(eventId) });\n };\n\n useComSubscription<{ comEventUpdated: unknown }>({\n query: `subscription ComEventUpdated($eventId: ID!) { comEventUpdated(eventId: $eventId) { id } }`,\n variables: { eventId: eventId ?? '' },\n operationName: 'ComEventUpdated',\n enabled: Boolean(eventId),\n onData: invalidate,\n pollFn: invalidate,\n });\n\n useComSubscription<{ comEventRsvpAdded: unknown }>({\n query: `subscription ComEventRsvpAdded($eventId: ID!) { comEventRsvpAdded(eventId: $eventId) { id } }`,\n variables: { eventId: eventId ?? '' },\n operationName: 'ComEventRsvpAdded',\n enabled: Boolean(eventId),\n onData: invalidate,\n // Only one of the two subscriptions needs to drive the polling fallback\n // interval — running both would double the poll rate for no benefit.\n pollFn: () => {},\n pollIntervalMs: 30_000,\n });\n};\n\nexport const useComCreateEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateEventInput) => {\n const result = await comQuery<{ comCreateEvent: ComEventWire }>(\n `mutation ComCreateEvent($input: ComCreateEventInput!) {\n comCreateEvent(input: $input) { ${EVENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toEvent(result.comCreateEvent);\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.events }),\n });\n};\n\nexport const useComUpdateEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: ComUpdateEventInput }) => {\n const result = await comQuery<{ comUpdateEvent: ComEventWire }>(\n `mutation ComUpdateEvent($id: ID!, $input: ComUpdateEventInput!) {\n comUpdateEvent(id: $id, input: $input) { ${EVENT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toEvent(result.comUpdateEvent);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.id) });\n },\n });\n};\n\nexport const useComTransitionEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: ComEventStatus }) => {\n const result = await comQuery<{ comTransitionEvent: ComEventWire }>(\n `mutation ComTransitionEvent($id: ID!, $status: ComEventStatus!) {\n comTransitionEvent(id: $id, status: $status) { ${EVENT_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return toEvent(result.comTransitionEvent);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.id) });\n },\n });\n};\n\nexport const useComRsvpEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { eventId: string; status: ComRsvpStatus; note?: string | null }) => {\n const result = await comQuery<{ comRsvpEvent: ComEventRsvp }>(\n `mutation ComRsvpEvent($eventId: ID!, $status: ComRsvpStatus!, $note: String) {\n comRsvpEvent(eventId: $eventId, status: $status, note: $note) { ${RSVP_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.comRsvpEvent;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.events });\n qc.invalidateQueries({ queryKey: KEY.event(data.eventId) });\n },\n });\n};\n\n// ============================================================================\n// Polls / Votes\n// ============================================================================\n\nexport const useComPolls = (circleId: string | undefined, status?: ComPollStatus) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.polls(circleId ?? ''), status ?? 'all'],\n enabled: Boolean(circleId),\n queryFn: async () => {\n const result = await comQuery<{ comListPolls: WireConnection<ComPollWire> }>(\n `query ComListPolls($circleId: ID!, $status: ComPollStatus) {\n comListPolls(circleId: $circleId, status: $status) { ${conn(POLL_FIELDS)} }\n }`,\n { circleId, status },\n apiGatewayUrl\n );\n return unwrap(result.comListPolls).map(toPoll);\n },\n });\n};\n\nexport const useComCreatePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePollInput) => {\n const result = await comQuery<{ comCreatePoll: ComPollWire }>(\n `mutation ComCreatePoll($input: ComCreatePollInput!) {\n comCreatePoll(input: $input) { ${POLL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return toPoll(result.comCreatePoll);\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.polls(data.circleId) }),\n });\n};\n\nexport const useComClosePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comClosePoll: ComPollWire }>(\n `mutation ComClosePoll($id: ID!) { comClosePoll(id: $id) { ${POLL_FIELDS} } }`,\n { id },\n apiGatewayUrl\n );\n return toPoll(result.comClosePoll);\n },\n onSuccess: (data) => qc.invalidateQueries({ queryKey: KEY.polls(data.circleId) }),\n });\n};\n\nexport const useComVotePoll = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { pollId: string; optionId: string; circleId?: string }) => {\n const result = await comQuery<{ comVotePoll: ComPollOption }>(\n `mutation ComVotePoll($pollId: ID!, $optionId: ID!) {\n comVotePoll(pollId: $pollId, optionId: $optionId) { ${POLL_OPTION_FIELDS} }\n }`,\n { pollId: vars.pollId, optionId: vars.optionId },\n apiGatewayUrl\n );\n return result.comVotePoll;\n },\n onSuccess: (_data, vars) => {\n if (vars.circleId) qc.invalidateQueries({ queryKey: KEY.polls(vars.circleId) });\n qc.invalidateQueries({ queryKey: KEY.poll(vars.pollId) });\n },\n });\n};\n\n// ============================================================================\n// Profiles (social identity layer)\n// ============================================================================\n\nexport interface ProfileFilters {\n discoverable?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useComProfiles = (filters: ProfileFilters = {}) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: [...KEY.profiles, filters],\n queryFn: async () => {\n const result = await comQuery<{ comListProfiles: ComConnection<ComProfile> }>(\n `query ComListProfiles($discoverable: Boolean, $pagination: PaginationInput) {\n comListProfiles(discoverable: $discoverable, pagination: $pagination) {\n items { ${PROFILE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { discoverable: filters.discoverable, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.comListProfiles;\n },\n });\n};\n\nexport const useComProfile = (memberId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.profile(memberId ?? ''),\n enabled: Boolean(memberId),\n // Profiles change rarely; cache aggressively so feed identity lookups are cheap.\n staleTime: 10 * 60 * 1000,\n queryFn: async () => {\n const result = await comQuery<{ comProfile: ComProfile | null }>(\n `query ComProfile($memberId: ID!) {\n comProfile(memberId: $memberId) { ${PROFILE_FIELDS} }\n }`,\n { memberId },\n apiGatewayUrl\n );\n return result.comProfile;\n },\n });\n};\n\nexport const useComUpsertProfile = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComUpsertProfileInput) => {\n const result = await comQuery<{ comUpsertProfile: ComProfile }>(\n `mutation ComUpsertProfile($input: ComUpsertProfileInput!) {\n comUpsertProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comUpsertProfile;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.profiles });\n qc.invalidateQueries({ queryKey: KEY.profile(data.memberId) });\n },\n });\n};\n\n// ============================================================================\n// Creator monetization (BOFF-4454)\n// ============================================================================\n// Bounded pricing/catalog CATALOG core — no live payment processor is wired\n// (see `useComCreatorHasPaymentsEnabled`, always false today). Purchase/\n// subscribe/tip CTAs must render a \"Payment integration pending\" state.\n\nconst MONETIZATION_TIER_FIELDS = `\n id workspaceId creatorId circleId name description perks priceAmount currency\n billingInterval status createdAt updatedAt\n`;\n\nconst MONETIZATION_EVENT_FIELDS = `\n id workspaceId creatorId circleId title description priceAmount currency\n capacity startsAt status createdAt updatedAt\n`;\n\nconst MONETIZATION_PRODUCT_FIELDS = `\n id workspaceId creatorId title description priceAmount currency productType\n file { id } status createdAt updatedAt\n`;\n\nconst MONETIZATION_TIP_FIELDS = `\n id workspaceId creatorId tipperId amount currency message status createdAt\n`;\n\nexport const useComListMembershipTiers = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.membershipTiers(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListMembershipTiers: ComCreatorMembershipTierConnection }>(\n `query ComListMembershipTiers($creatorId: ID, $pagination: PaginationInput) {\n comListMembershipTiers(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_TIER_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListMembershipTiers;\n },\n });\n};\n\nexport const useComMyMembershipTiers = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myMembershipTiers,\n queryFn: async () => {\n const result = await comQuery<{ comMyMembershipTiers: ComCreatorMembershipTierConnection }>(\n `query ComMyMembershipTiers($pagination: PaginationInput) {\n comMyMembershipTiers(pagination: $pagination) { ${conn(MONETIZATION_TIER_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyMembershipTiers;\n },\n });\n};\n\nexport const useComCreateMembershipTier = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateMembershipTierInput) => {\n const result = await comQuery<{ comCreateMembershipTier: ComCreatorMembershipTier }>(\n `mutation ComCreateMembershipTier($input: ComCreateMembershipTierInput!) {\n comCreateMembershipTier(input: $input) { ${MONETIZATION_TIER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateMembershipTier;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myMembershipTiers });\n },\n });\n};\n\nexport const useComArchiveMembershipTier = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveMembershipTier: boolean }>(\n `mutation ComArchiveMembershipTier($id: ID!) { comArchiveMembershipTier(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveMembershipTier;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myMembershipTiers });\n },\n });\n};\n\nexport const useComListPaidEvents = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.paidEvents(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListPaidEvents: ComPaidEventConnection }>(\n `query ComListPaidEvents($creatorId: ID, $pagination: PaginationInput) {\n comListPaidEvents(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_EVENT_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListPaidEvents;\n },\n });\n};\n\nexport const useComMyPaidEvents = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myPaidEvents,\n queryFn: async () => {\n const result = await comQuery<{ comMyPaidEvents: ComPaidEventConnection }>(\n `query ComMyPaidEvents($pagination: PaginationInput) {\n comMyPaidEvents(pagination: $pagination) { ${conn(MONETIZATION_EVENT_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyPaidEvents;\n },\n });\n};\n\nexport const useComCreatePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreatePaidEventInput) => {\n const result = await comQuery<{ comCreatePaidEvent: ComPaidEvent }>(\n `mutation ComCreatePaidEvent($input: ComCreatePaidEventInput!) {\n comCreatePaidEvent(input: $input) { ${MONETIZATION_EVENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreatePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComUpdatePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: ComUpdatePaidEventInput }) => {\n const result = await comQuery<{ comUpdatePaidEvent: ComPaidEvent }>(\n `mutation ComUpdatePaidEvent($id: ID!, $input: ComUpdatePaidEventInput!) {\n comUpdatePaidEvent(id: $id, input: $input) { ${MONETIZATION_EVENT_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.comUpdatePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComArchivePaidEvent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchivePaidEvent: boolean }>(\n `mutation ComArchivePaidEvent($id: ID!) { comArchivePaidEvent(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchivePaidEvent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myPaidEvents });\n },\n });\n};\n\nexport const useComListDigitalProducts = (creatorId?: string) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.digitalProducts(creatorId),\n queryFn: async () => {\n const result = await comQuery<{ comListDigitalProducts: ComDigitalProductConnection }>(\n `query ComListDigitalProducts($creatorId: ID, $pagination: PaginationInput) {\n comListDigitalProducts(creatorId: $creatorId, pagination: $pagination) {\n ${conn(MONETIZATION_PRODUCT_FIELDS)}\n }\n }`,\n { creatorId, pagination: page() },\n apiGatewayUrl\n );\n return result.comListDigitalProducts;\n },\n });\n};\n\nexport const useComMyDigitalProducts = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myDigitalProducts,\n queryFn: async () => {\n const result = await comQuery<{ comMyDigitalProducts: ComDigitalProductConnection }>(\n `query ComMyDigitalProducts($pagination: PaginationInput) {\n comMyDigitalProducts(pagination: $pagination) { ${conn(MONETIZATION_PRODUCT_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyDigitalProducts;\n },\n });\n};\n\nexport const useComCreateDigitalProduct = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComCreateDigitalProductInput) => {\n const result = await comQuery<{ comCreateDigitalProduct: ComDigitalProduct }>(\n `mutation ComCreateDigitalProduct($input: ComCreateDigitalProductInput!) {\n comCreateDigitalProduct(input: $input) { ${MONETIZATION_PRODUCT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comCreateDigitalProduct;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myDigitalProducts });\n },\n });\n};\n\nexport const useComArchiveDigitalProduct = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comArchiveDigitalProduct: boolean }>(\n `mutation ComArchiveDigitalProduct($id: ID!) { comArchiveDigitalProduct(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comArchiveDigitalProduct;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.myDigitalProducts });\n },\n });\n};\n\nexport const useComMyReceivedTips = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.myReceivedTips,\n queryFn: async () => {\n const result = await comQuery<{ comMyReceivedTips: ComTipIntentConnection }>(\n `query ComMyReceivedTips($pagination: PaginationInput) {\n comMyReceivedTips(pagination: $pagination) { ${conn(MONETIZATION_TIP_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMyReceivedTips;\n },\n });\n};\n\nexport const useComMySentTips = () => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.mySentTips,\n queryFn: async () => {\n const result = await comQuery<{ comMySentTips: ComTipIntentConnection }>(\n `query ComMySentTips($pagination: PaginationInput) {\n comMySentTips(pagination: $pagination) { ${conn(MONETIZATION_TIP_FIELDS)} }\n }`,\n { pagination: page() },\n apiGatewayUrl\n );\n return result.comMySentTips;\n },\n });\n};\n\nexport const useComRecordTipIntent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: ComRecordTipIntentInput) => {\n const result = await comQuery<{ comRecordTipIntent: ComTipIntent }>(\n `mutation ComRecordTipIntent($input: ComRecordTipIntentInput!) {\n comRecordTipIntent(input: $input) { ${MONETIZATION_TIP_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.comRecordTipIntent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.mySentTips });\n },\n });\n};\n\nexport const useComCancelTipIntent = () => {\n const { apiGatewayUrl } = useComradeCircle();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await comQuery<{ comCancelTipIntent: boolean }>(\n `mutation ComCancelTipIntent($id: ID!) { comCancelTipIntent(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.comCancelTipIntent;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: KEY.mySentTips });\n },\n });\n};\n\n/**\n * Always false today (BOFF-4454 billing boundary — catalog/calculation only,\n * no live payment processor is wired). Lets the FE render an honest \"Payment\n * integration pending\" state on every purchase/subscribe/tip CTA instead of\n * guessing. Cached like any other read so the UI doesn't re-fetch per render.\n */\nexport const useComCreatorHasPaymentsEnabled = (creatorId: string | undefined) => {\n const { apiGatewayUrl } = useComradeCircle();\n return useQuery({\n queryKey: KEY.creatorHasPaymentsEnabled(creatorId ?? ''),\n enabled: Boolean(creatorId),\n staleTime: 60 * 60 * 1000,\n queryFn: async () => {\n const result = await comQuery<{ comCreatorHasPaymentsEnabled: boolean }>(\n `query ComCreatorHasPaymentsEnabled($creatorId: ID!) {\n comCreatorHasPaymentsEnabled(creatorId: $creatorId)\n }`,\n { creatorId },\n apiGatewayUrl\n );\n return result.comCreatorHasPaymentsEnabled;\n },\n });\n};\n\n// Re-export commonly used reaction type for convenience.\nexport type { ComReaction };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComCircleActivitySummary, ComModerationReviewDecision, ComModerationRule, ComModerationRuleInput, ComModerationVerdict, ComModerationVerdictType } from '../types';
|
|
2
|
+
|
|
3
|
+
/** Page size of the moderator queue; the svc clamps larger requests anyway. */
|
|
4
|
+
export declare const VERDICT_QUEUE_LIMIT = 50;
|
|
5
|
+
export interface VerdictQueueFilters {
|
|
6
|
+
/** `false` = needs review, `true` = already reviewed, undefined = all. */
|
|
7
|
+
reviewed?: boolean;
|
|
8
|
+
verdict?: ComModerationVerdictType;
|
|
9
|
+
}
|
|
10
|
+
export declare const useComCircleVerdicts: (circleId: string | undefined, filters?: VerdictQueueFilters, enabled?: boolean) => import('@tanstack/react-query').UseQueryResult<ComModerationVerdict[], Error>;
|
|
11
|
+
export declare const useComReviewVerdict: (circleId: string) => import('@tanstack/react-query').UseMutationResult<ComModerationVerdict, Error, {
|
|
12
|
+
verdictId: string;
|
|
13
|
+
decision: ComModerationReviewDecision;
|
|
14
|
+
note?: string;
|
|
15
|
+
}, unknown>;
|
|
16
|
+
export declare const useComModerationRule: (circleId: string | undefined, enabled?: boolean) => import('@tanstack/react-query').UseQueryResult<ComModerationRule | null, Error>;
|
|
17
|
+
export declare const useComUpdateModerationRule: (circleId: string) => import('@tanstack/react-query').UseMutationResult<ComModerationRule, Error, ComModerationRuleInput, unknown>;
|
|
18
|
+
export declare const useComCircleActivitySummary: (circleId: string | undefined, days: number, enabled?: boolean) => import('@tanstack/react-query').UseQueryResult<ComCircleActivitySummary | null, Error>;
|
|
19
|
+
//# sourceMappingURL=useModerationApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useModerationApi.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/hooks/useModerationApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,UAAU,CAAC;AAmBlB,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAED,eAAO,MAAM,oBAAoB,GAC/B,UAAU,MAAM,GAAG,SAAS,EAC5B,UAAS,mBAAwB,EACjC,iBAAc,kFAwBf,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM;eAKnC,MAAM;cACP,2BAA2B;WAC9B,MAAM;WAsBlB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,GAAG,SAAS,EAAE,iBAAc,oFAgBhF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,UAAU,MAAM,iHAkB1D,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,GAAG,SAAS,EAC5B,MAAM,MAAM,EACZ,iBAAc,2FAoBf,CAAC"}
|