@burdenoff/microfe-comradecircle 2026.512.1 → 2026.704.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/ComradeCircleRoot.js +75 -95
- package/dist/comradecircle/ComradeCircleRoot.js.map +1 -1
- package/dist/comradecircle/ComradeCircleRoutes.js +58 -37
- package/dist/comradecircle/ComradeCircleRoutes.js.map +1 -1
- package/dist/comradecircle/components/Avatar.js +35 -0
- package/dist/comradecircle/components/Avatar.js.map +1 -0
- package/dist/comradecircle/components/CircleCard.js +117 -0
- package/dist/comradecircle/components/CircleCard.js.map +1 -0
- package/dist/comradecircle/components/CommentThread.js +105 -0
- package/dist/comradecircle/components/CommentThread.js.map +1 -0
- package/dist/comradecircle/components/CreateCircleDialog.js +148 -0
- package/dist/comradecircle/components/CreateCircleDialog.js.map +1 -0
- package/dist/comradecircle/components/CreateEventDialog.js +210 -0
- package/dist/comradecircle/components/CreateEventDialog.js.map +1 -0
- package/dist/comradecircle/components/EmptyState.js +35 -0
- package/dist/comradecircle/components/EmptyState.js.map +1 -0
- package/dist/comradecircle/components/EventCard.js +93 -0
- package/dist/comradecircle/components/EventCard.js.map +1 -0
- package/dist/comradecircle/components/FilterTabs.js +27 -0
- package/dist/comradecircle/components/FilterTabs.js.map +1 -0
- package/dist/comradecircle/components/MemberIdentity.js +43 -0
- package/dist/comradecircle/components/MemberIdentity.js.map +1 -0
- package/dist/comradecircle/components/MiniBar.js +22 -0
- package/dist/comradecircle/components/MiniBar.js.map +1 -0
- package/dist/comradecircle/components/PageLayout.js +38 -0
- package/dist/comradecircle/components/PageLayout.js.map +1 -0
- package/dist/comradecircle/components/Pagination.js +50 -0
- package/dist/comradecircle/components/Pagination.js.map +1 -0
- package/dist/comradecircle/components/PollCard.js +97 -0
- package/dist/comradecircle/components/PollCard.js.map +1 -0
- package/dist/comradecircle/components/PostCard.js +170 -0
- package/dist/comradecircle/components/PostCard.js.map +1 -0
- package/dist/comradecircle/components/PostComposer.js +77 -0
- package/dist/comradecircle/components/PostComposer.js.map +1 -0
- package/dist/comradecircle/components/ReactionBar.js +122 -0
- package/dist/comradecircle/components/ReactionBar.js.map +1 -0
- package/dist/comradecircle/components/StateViews.js +49 -0
- package/dist/comradecircle/components/StateViews.js.map +1 -0
- package/dist/comradecircle/components/StatusBadge.js +68 -0
- package/dist/comradecircle/components/StatusBadge.js.map +1 -0
- package/dist/comradecircle/components/Tabs.js +31 -0
- package/dist/comradecircle/components/Tabs.js.map +1 -0
- package/dist/comradecircle/components/TagInput.js +49 -0
- package/dist/comradecircle/components/TagInput.js.map +1 -0
- package/dist/comradecircle/context/ComradeCircleContext.js +85 -0
- package/dist/comradecircle/context/ComradeCircleContext.js.map +1 -0
- package/dist/comradecircle/context/index.js +1 -0
- package/dist/comradecircle/hooks/index.js +2 -0
- package/dist/comradecircle/hooks/useComradeCircleApi.js +416 -0
- package/dist/comradecircle/hooks/useComradeCircleApi.js.map +1 -0
- package/dist/comradecircle/hooks/useCursorPager.js +25 -0
- package/dist/comradecircle/hooks/useCursorPager.js.map +1 -0
- package/dist/comradecircle/index.js +5 -2
- package/dist/comradecircle/lib/toast.js +39 -0
- package/dist/comradecircle/lib/toast.js.map +1 -0
- package/dist/comradecircle/pages/FeedPage.js +65 -0
- package/dist/comradecircle/pages/FeedPage.js.map +1 -0
- package/dist/comradecircle/pages/circles/CircleDetailPage.js +650 -0
- package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -0
- package/dist/comradecircle/pages/circles/CirclesPage.js +129 -0
- package/dist/comradecircle/pages/circles/CirclesPage.js.map +1 -0
- package/dist/comradecircle/pages/events/EventDetailPage.js +276 -0
- package/dist/comradecircle/pages/events/EventDetailPage.js.map +1 -0
- package/dist/comradecircle/pages/events/EventsPage.js +102 -0
- package/dist/comradecircle/pages/events/EventsPage.js.map +1 -0
- package/dist/comradecircle/pages/members/MemberProfilePage.js +137 -0
- package/dist/comradecircle/pages/members/MemberProfilePage.js.map +1 -0
- package/dist/comradecircle/pages/members/MembersPage.js +152 -0
- package/dist/comradecircle/pages/members/MembersPage.js.map +1 -0
- package/dist/comradecircle/pages/profile/MyProfilePage.js +255 -0
- package/dist/comradecircle/pages/profile/MyProfilePage.js.map +1 -0
- package/dist/comradecircle/utils/cn.js +10 -0
- package/dist/comradecircle/utils/cn.js.map +1 -0
- package/dist/comradecircle/utils/formatters.js +51 -0
- package/dist/comradecircle/utils/formatters.js.map +1 -0
- package/dist/comradecircle/utils/navigation.js +2 -1
- package/dist/comradecircle/utils/navigation.js.map +1 -1
- package/dist/comradecircle/utils/slug.js +8 -0
- package/dist/comradecircle/utils/slug.js.map +1 -0
- package/dist/index.js +6 -4
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +3 -2
- package/dist/comradecircle/ComradeCircleRoot.d.ts +0 -5
- package/dist/comradecircle/ComradeCircleRoot.d.ts.map +0 -1
- package/dist/comradecircle/ComradeCircleRoutes.d.ts +0 -2
- package/dist/comradecircle/ComradeCircleRoutes.d.ts.map +0 -1
- package/dist/comradecircle/index.d.ts +0 -5
- package/dist/comradecircle/index.d.ts.map +0 -1
- package/dist/comradecircle/pages/CommunitiesPage.d.ts +0 -2
- package/dist/comradecircle/pages/CommunitiesPage.d.ts.map +0 -1
- package/dist/comradecircle/pages/CommunitiesPage.js +0 -299
- package/dist/comradecircle/pages/CommunitiesPage.js.map +0 -1
- package/dist/comradecircle/pages/CreatorPage.d.ts +0 -2
- package/dist/comradecircle/pages/CreatorPage.d.ts.map +0 -1
- package/dist/comradecircle/pages/CreatorPage.js +0 -399
- package/dist/comradecircle/pages/CreatorPage.js.map +0 -1
- package/dist/comradecircle/pages/DashboardPage.d.ts +0 -2
- package/dist/comradecircle/pages/DashboardPage.d.ts.map +0 -1
- package/dist/comradecircle/pages/DashboardPage.js +0 -265
- package/dist/comradecircle/pages/DashboardPage.js.map +0 -1
- package/dist/comradecircle/providers/ComradeCircleProvider.d.ts +0 -6
- package/dist/comradecircle/providers/ComradeCircleProvider.d.ts.map +0 -1
- package/dist/comradecircle/providers/ComradeCircleProvider.js +0 -27
- package/dist/comradecircle/providers/ComradeCircleProvider.js.map +0 -1
- package/dist/comradecircle/store/comradecircleStore.d.ts +0 -28
- package/dist/comradecircle/store/comradecircleStore.d.ts.map +0 -1
- package/dist/comradecircle/store/comradecircleStore.js +0 -345
- package/dist/comradecircle/store/comradecircleStore.js.map +0 -1
- package/dist/comradecircle/types/index.d.ts +0 -162
- package/dist/comradecircle/types/index.d.ts.map +0 -1
- package/dist/comradecircle/utils/cn.d.ts +0 -4
- package/dist/comradecircle/utils/cn.d.ts.map +0 -1
- package/dist/comradecircle/utils/navigation.d.ts +0 -2
- package/dist/comradecircle/utils/navigation.d.ts.map +0 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -18199
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -43046
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
|
@@ -1,107 +1,87 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { joinPath as e } from "./utils/navigation.js";
|
|
2
|
+
import { ComradeCircleProvider as t } from "./context/ComradeCircleContext.js";
|
|
3
|
+
import { ComradeCircleRoutes as n } from "./ComradeCircleRoutes.js";
|
|
4
|
+
import { useCallback as r, useEffect as i } from "react";
|
|
5
|
+
import { QueryClient as a, QueryClientProvider as o } from "@tanstack/react-query";
|
|
6
|
+
import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
7
|
+
import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { CalendarDays as l, Contact as u, Newspaper as d, UserCircle as f, Users as p } from "lucide-react";
|
|
7
9
|
import { jsx as m } from "react/jsx-runtime";
|
|
8
|
-
import { FeatureFlagProvider as h } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
9
10
|
//#region src/comradecircle/ComradeCircleRoot.tsx
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
id: "comradecircle-privacy",
|
|
65
|
-
label: b("comradecircle.nav.privacy", { defaultValue: "Privacy" }),
|
|
66
|
-
path: n(y, "privacy"),
|
|
67
|
-
icon: /* @__PURE__ */ m(d, { size: 16 }),
|
|
68
|
-
order: 6
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
id: "comradecircle-terms",
|
|
72
|
-
label: b("comradecircle.nav.terms", { defaultValue: "Terms" }),
|
|
73
|
-
path: n(y, "terms"),
|
|
74
|
-
icon: /* @__PURE__ */ m(o, { size: 16 }),
|
|
75
|
-
order: 7
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
id: "comradecircle-cookies",
|
|
79
|
-
label: b("comradecircle.nav.cookies", { defaultValue: "Cookies" }),
|
|
80
|
-
path: n(y, "cookies"),
|
|
81
|
-
icon: /* @__PURE__ */ m(a, { size: 16 }),
|
|
82
|
-
order: 8
|
|
83
|
-
}
|
|
84
|
-
]
|
|
85
|
-
});
|
|
11
|
+
var h = new a({ defaultOptions: { queries: {
|
|
12
|
+
staleTime: 60 * 1e3,
|
|
13
|
+
retry: 1,
|
|
14
|
+
refetchOnWindowFocus: !1
|
|
15
|
+
} } }), g = (a) => {
|
|
16
|
+
let { registerNavItems: g, registerFooterItems: _, basePath: v = "/" } = a, { t: y } = c(), b = r((e, t) => {
|
|
17
|
+
let n = y(e);
|
|
18
|
+
return n === e ? t : n;
|
|
19
|
+
}, [y]);
|
|
20
|
+
return i(() => {
|
|
21
|
+
if (g) return g([
|
|
22
|
+
{
|
|
23
|
+
id: "comradecircle-feed",
|
|
24
|
+
label: b("comradecircle.nav.feed", "Home"),
|
|
25
|
+
path: e(v, ""),
|
|
26
|
+
icon: /* @__PURE__ */ m(d, { size: 20 }),
|
|
27
|
+
order: 0,
|
|
28
|
+
group: "products"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "comradecircle-circles",
|
|
32
|
+
label: b("comradecircle.nav.circles", "Circles"),
|
|
33
|
+
path: e(v, "circles"),
|
|
34
|
+
icon: /* @__PURE__ */ m(p, { size: 20 }),
|
|
35
|
+
order: 1,
|
|
36
|
+
group: "products"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "comradecircle-events",
|
|
40
|
+
label: b("comradecircle.nav.events", "Events"),
|
|
41
|
+
path: e(v, "events"),
|
|
42
|
+
icon: /* @__PURE__ */ m(l, { size: 20 }),
|
|
43
|
+
order: 2,
|
|
44
|
+
group: "products"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "comradecircle-members",
|
|
48
|
+
label: b("comradecircle.nav.members", "Members"),
|
|
49
|
+
path: e(v, "members"),
|
|
50
|
+
icon: /* @__PURE__ */ m(u, { size: 20 }),
|
|
51
|
+
order: 3,
|
|
52
|
+
group: "products"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "comradecircle-profile",
|
|
56
|
+
label: b("comradecircle.nav.profile", "My Profile"),
|
|
57
|
+
path: e(v, "profile"),
|
|
58
|
+
icon: /* @__PURE__ */ m(f, { size: 20 }),
|
|
59
|
+
order: 4,
|
|
60
|
+
group: "products"
|
|
61
|
+
}
|
|
62
|
+
]);
|
|
86
63
|
}, [
|
|
87
|
-
|
|
88
|
-
|
|
64
|
+
g,
|
|
65
|
+
v,
|
|
89
66
|
b
|
|
90
|
-
]),
|
|
91
|
-
if (
|
|
67
|
+
]), i(() => {
|
|
68
|
+
if (_) return _([{
|
|
92
69
|
id: "comradecircle-status",
|
|
93
|
-
label: b("comradecircle.footer.ready",
|
|
70
|
+
label: b("comradecircle.footer.ready", "ComradeCircle Ready"),
|
|
94
71
|
type: "status",
|
|
95
72
|
section: "left",
|
|
96
73
|
order: 10
|
|
97
74
|
}]);
|
|
98
|
-
}, [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
children: /* @__PURE__ */ m(t, {
|
|
75
|
+
}, [_, b]), /* @__PURE__ */ m(o, {
|
|
76
|
+
client: h,
|
|
77
|
+
children: /* @__PURE__ */ m(s, {
|
|
78
|
+
workspaceId: null,
|
|
79
|
+
gateway: "global",
|
|
80
|
+
defaultEnabled: !0,
|
|
81
|
+
children: /* @__PURE__ */ m(t, {
|
|
82
|
+
...a,
|
|
83
|
+
children: /* @__PURE__ */ m(n, {})
|
|
84
|
+
})
|
|
105
85
|
})
|
|
106
86
|
});
|
|
107
87
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComradeCircleRoot.js","names":[],"sources":["../../src/comradecircle/ComradeCircleRoot.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"ComradeCircleRoot.js","names":[],"sources":["../../src/comradecircle/ComradeCircleRoot.tsx"],"sourcesContent":["/**\n * ComradeCircle Root Component\n * @module comradecircle\n *\n * Host-contract entry point. Registers the product's sidebar nav (five sections\n * that map to the wspace-comradecircle-svc `com*` backend) and mounts the routed\n * pages inside the shared QueryClient + FeatureFlag providers.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Newspaper, Users, CalendarDays, Contact, UserCircle } from 'lucide-react';\nimport { ComradeCircleProvider } from './context/ComradeCircleContext';\nimport { ComradeCircleRoutes } from './ComradeCircleRoutes';\nimport { joinPath } from './utils/navigation';\nimport type { ComradeCircleRootProps, NavItem } from './types';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport const ComradeCircleRoot: FC<ComradeCircleRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Register navigation items with the shell on mount. Ids/paths/orders match\n // the app-shell static NavRegistration block so the two are a single,\n // consistent source of truth.\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'comradecircle-feed',\n label: t('comradecircle.nav.feed', 'Home'),\n path: joinPath(basePath, ''),\n icon: <Newspaper size={20} />,\n order: 0,\n group: 'products',\n },\n {\n id: 'comradecircle-circles',\n label: t('comradecircle.nav.circles', 'Circles'),\n path: joinPath(basePath, 'circles'),\n icon: <Users size={20} />,\n order: 1,\n group: 'products',\n },\n {\n id: 'comradecircle-events',\n label: t('comradecircle.nav.events', 'Events'),\n path: joinPath(basePath, 'events'),\n icon: <CalendarDays size={20} />,\n order: 2,\n group: 'products',\n },\n {\n id: 'comradecircle-members',\n label: t('comradecircle.nav.members', 'Members'),\n path: joinPath(basePath, 'members'),\n icon: <Contact size={20} />,\n order: 3,\n group: 'products',\n },\n {\n id: 'comradecircle-profile',\n label: t('comradecircle.nav.profile', 'My Profile'),\n path: joinPath(basePath, 'profile'),\n icon: <UserCircle size={20} />,\n order: 4,\n group: 'products',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n return registerFooterItems([\n {\n id: 'comradecircle-status',\n label: t('comradecircle.footer.ready', 'ComradeCircle Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <ComradeCircleProvider {...props}>\n <ComradeCircleRoutes />\n </ComradeCircleProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;;;;;AAoBA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,KAAK;CAChB,OAAO;CACP,sBAAsB;CACvB,EACF,EACF,CAAC,EAEW,KAAiD,MAAU;CACtE,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,GAAG,MAAc,GAAS,EAC5B,IAAI,GACP,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAU,CACZ;AAmED,QA9DA,QAAgB;AACT,QA6CL,QAAO,EA3CqB;GAC1B;IACE,IAAI;IACJ,OAAO,EAAE,0BAA0B,OAAO;IAC1C,MAAM,EAAS,GAAU,GAAG;IAC5B,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,UAAU;IAChD,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,4BAA4B,SAAS;IAC9C,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAc,MAAM,IAAM,CAAA;IAChC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,UAAU;IAChD,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;IAC3B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,aAAa;IACnD,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAY,MAAM,IAAM,CAAA;IAC9B,OAAO;IACP,OAAO;IACR;GACF,CAEgC;IAChC;EAAC;EAAkB;EAAU;EAAE,CAAC,EAEnC,QAAgB;AACT,QACL,QAAO,EAAoB,CACzB;GACE,IAAI;GACJ,OAAO,EAAE,8BAA8B,sBAAsB;GAC7D,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF,CAAC;IACD,CAAC,GAAqB,EAAE,CAAC,EAG1B,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAAuB,GAAI;cACzB,kBAAC,GAAD,EAAuB,CAAA;IACD,CAAA;GACJ,CAAA;EACF,CAAA"}
|
|
@@ -1,43 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Navigate as i, Route as a, Routes as o } from "react-router-dom";
|
|
5
|
-
import { jsx as
|
|
1
|
+
import { useComradeCircle as e } from "./context/ComradeCircleContext.js";
|
|
2
|
+
import { FeedPage as t } from "./pages/FeedPage.js";
|
|
3
|
+
import { Suspense as n, lazy as r } from "react";
|
|
4
|
+
import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-router-dom";
|
|
5
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { Spinner as u } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/comradecircle/ComradeCircleRoutes.tsx
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
8
|
+
var d = r(() => import("./pages/circles/CirclesPage.js").then((e) => ({ default: e.CirclesPage }))), f = r(() => import("./pages/circles/CircleDetailPage.js").then((e) => ({ default: e.CircleDetailPage }))), p = r(() => import("./pages/events/EventsPage.js").then((e) => ({ default: e.EventsPage }))), m = r(() => import("./pages/events/EventDetailPage.js").then((e) => ({ default: e.EventDetailPage }))), h = r(() => import("./pages/members/MembersPage.js").then((e) => ({ default: e.MembersPage }))), g = r(() => import("./pages/members/MemberProfilePage.js").then((e) => ({ default: e.MemberProfilePage }))), _ = r(() => import("./pages/profile/MyProfilePage.js").then((e) => ({ default: e.MyProfilePage }))), v = () => /* @__PURE__ */ c("div", {
|
|
9
|
+
className: "flex min-h-[400px] items-center justify-center",
|
|
10
|
+
children: /* @__PURE__ */ c(u, { size: "lg" })
|
|
11
|
+
}), y = () => {
|
|
12
|
+
let { basePath: r, isStandalone: u } = e(), y = s(), b = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
|
|
13
|
+
return b && !u && !(y.pathname === b || y.pathname.startsWith(b + "/")) ? null : /* @__PURE__ */ c("div", {
|
|
14
|
+
className: "flex min-h-full flex-col",
|
|
15
|
+
children: /* @__PURE__ */ c(n, {
|
|
16
|
+
fallback: /* @__PURE__ */ c(v, {}),
|
|
17
|
+
children: /* @__PURE__ */ l(o, { children: [
|
|
18
|
+
/* @__PURE__ */ c(a, {
|
|
19
|
+
index: !0,
|
|
20
|
+
element: /* @__PURE__ */ c(t, {})
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ c(a, {
|
|
23
|
+
path: "circles",
|
|
24
|
+
element: /* @__PURE__ */ c(d, {})
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ c(a, {
|
|
27
|
+
path: "circles/:id",
|
|
28
|
+
element: /* @__PURE__ */ c(f, {})
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ c(a, {
|
|
31
|
+
path: "events",
|
|
32
|
+
element: /* @__PURE__ */ c(p, {})
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ c(a, {
|
|
35
|
+
path: "events/:id",
|
|
36
|
+
element: /* @__PURE__ */ c(m, {})
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ c(a, {
|
|
39
|
+
path: "members",
|
|
40
|
+
element: /* @__PURE__ */ c(h, {})
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ c(a, {
|
|
43
|
+
path: "members/:memberId",
|
|
44
|
+
element: /* @__PURE__ */ c(g, {})
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ c(a, {
|
|
47
|
+
path: "profile",
|
|
48
|
+
element: /* @__PURE__ */ c(_, {})
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ c(a, {
|
|
51
|
+
path: "*",
|
|
52
|
+
element: /* @__PURE__ */ c(i, {
|
|
53
|
+
to: "",
|
|
54
|
+
replace: !0
|
|
55
|
+
})
|
|
35
56
|
})
|
|
36
|
-
})
|
|
37
|
-
|
|
57
|
+
] })
|
|
58
|
+
})
|
|
38
59
|
});
|
|
39
|
-
}
|
|
60
|
+
};
|
|
40
61
|
//#endregion
|
|
41
|
-
export {
|
|
62
|
+
export { y as ComradeCircleRoutes };
|
|
42
63
|
|
|
43
64
|
//# sourceMappingURL=ComradeCircleRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComradeCircleRoutes.js","names":[],"sources":["../../src/comradecircle/ComradeCircleRoutes.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"ComradeCircleRoutes.js","names":[],"sources":["../../src/comradecircle/ComradeCircleRoutes.tsx"],"sourcesContent":["/**\n * ComradeCircle Routes\n * @module comradecircle\n *\n * Domain routes. The home feed is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `com*` backend capability.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useComradeCircle } from './context/ComradeCircleContext';\n\n// Eager — primary landing\nimport { FeedPage } from './pages/FeedPage';\n\n// Circles (communities → channels → posts)\nconst CirclesPage = lazy(() =>\n import('./pages/circles/CirclesPage').then((m) => ({ default: m.CirclesPage }))\n);\nconst CircleDetailPage = lazy(() =>\n import('./pages/circles/CircleDetailPage').then((m) => ({ default: m.CircleDetailPage }))\n);\n\n// Events + RSVPs\nconst EventsPage = lazy(() =>\n import('./pages/events/EventsPage').then((m) => ({ default: m.EventsPage }))\n);\nconst EventDetailPage = lazy(() =>\n import('./pages/events/EventDetailPage').then((m) => ({ default: m.EventDetailPage }))\n);\n\n// Member directory + profiles\nconst MembersPage = lazy(() =>\n import('./pages/members/MembersPage').then((m) => ({ default: m.MembersPage }))\n);\nconst MemberProfilePage = lazy(() =>\n import('./pages/members/MemberProfilePage').then((m) => ({ default: m.MemberProfilePage }))\n);\n\n// My profile (edit)\nconst MyProfilePage = lazy(() =>\n import('./pages/profile/MyProfilePage').then((m) => ({ default: m.MyProfilePage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const ComradeCircleRoutes: FC = () => {\n const { basePath, isStandalone } = useComradeCircle();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<FeedPage />} />\n\n <Route path=\"circles\" element={<CirclesPage />} />\n <Route path=\"circles/:id\" element={<CircleDetailPage />} />\n\n <Route path=\"events\" element={<EventsPage />} />\n <Route path=\"events/:id\" element={<EventDetailPage />} />\n\n <Route path=\"members\" element={<MembersPage />} />\n <Route path=\"members/:memberId\" element={<MemberProfilePage />} />\n\n <Route path=\"profile\" element={<MyProfilePage />} />\n\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAiBA,IAAM,IAAc,QAClB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAChF,EACK,IAAmB,QACvB,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC1F,EAGK,IAAa,QACjB,OAAO,gCAA6B,MAAM,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAC7E,EACK,IAAkB,QACtB,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CACvF,EAGK,IAAc,QAClB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAChF,EACK,IAAoB,QACxB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAC5F,EAGK,IAAgB,QACpB,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CACpF,EAEK,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,GAAD,EAAS,MAAK,MAAO,CAAA;CACjB,CAAA,EAGK,UAAgC;CAC3C,IAAM,EAAE,aAAU,oBAAiB,GAAkB,EAC/C,IAAW,GAAa,EAExB,IAAqB,MAAa,MAAM,MAAM,KAAY,IAAI,QAAQ,OAAO,GAAG;AAYtF,QATI,KAAsB,CAAC,KAIrB,EAFF,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,IAAI,IAE/C,OAKT,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;aAChC,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAO,OAAA;KAAM,SAAS,kBAAC,GAAD,EAAY,CAAA;KAAI,CAAA;IAEtC,kBAAC,GAAD;KAAO,MAAK;KAAU,SAAS,kBAAC,GAAD,EAAe,CAAA;KAAI,CAAA;IAClD,kBAAC,GAAD;KAAO,MAAK;KAAc,SAAS,kBAAC,GAAD,EAAoB,CAAA;KAAI,CAAA;IAE3D,kBAAC,GAAD;KAAO,MAAK;KAAS,SAAS,kBAAC,GAAD,EAAc,CAAA;KAAI,CAAA;IAChD,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAEzD,kBAAC,GAAD;KAAO,MAAK;KAAU,SAAS,kBAAC,GAAD,EAAe,CAAA;KAAI,CAAA;IAClD,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAAqB,CAAA;KAAI,CAAA;IAElE,kBAAC,GAAD;KAAO,MAAK;KAAU,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAEpD,kBAAC,GAAD;KAAO,MAAK;KAAI,SAAS,kBAAC,GAAD;MAAU,IAAG;MAAG,SAAA;MAAU,CAAA;KAAI,CAAA;IAChD,EAAA,CAAA;GACA,CAAA;EACP,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/comradecircle/components/Avatar.tsx
|
|
4
|
+
var r = {
|
|
5
|
+
xs: "h-6 w-6 text-[0.6rem]",
|
|
6
|
+
sm: "h-8 w-8 text-xs",
|
|
7
|
+
md: "h-10 w-10 text-sm",
|
|
8
|
+
lg: "h-14 w-14 text-lg",
|
|
9
|
+
xl: "h-20 w-20 text-2xl"
|
|
10
|
+
}, i = {
|
|
11
|
+
ONLINE: "bg-status-success-text",
|
|
12
|
+
AWAY: "bg-status-warning-text",
|
|
13
|
+
BUSY: "bg-status-error-text",
|
|
14
|
+
OFFLINE: "bg-text-tertiary"
|
|
15
|
+
};
|
|
16
|
+
function a(e) {
|
|
17
|
+
if (!e) return "?";
|
|
18
|
+
let t = e.trim().split(/\s+/).filter(Boolean);
|
|
19
|
+
return t.length === 0 ? "?" : t.length === 1 ? t[0].slice(0, 2).toUpperCase() : (t[0][0] + t[t.length - 1][0]).toUpperCase();
|
|
20
|
+
}
|
|
21
|
+
var o = ({ name: o, size: s = "md", presence: c, className: l }) => /* @__PURE__ */ n("span", {
|
|
22
|
+
className: e("relative inline-flex shrink-0", l),
|
|
23
|
+
children: [/* @__PURE__ */ t("span", {
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
className: e("inline-flex items-center justify-center rounded-full bg-[var(--color-accent-soft)] font-semibold text-text-primary ring-1 ring-border-seam", r[s]),
|
|
26
|
+
children: a(o)
|
|
27
|
+
}), c && /* @__PURE__ */ t("span", {
|
|
28
|
+
className: e("absolute -bottom-0.5 -right-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-bg-surface", i[c], c === "ONLINE" && "motion-safe:animate-vc-glow-pulse"),
|
|
29
|
+
"aria-label": `Presence: ${c.toLowerCase()}`
|
|
30
|
+
})]
|
|
31
|
+
});
|
|
32
|
+
//#endregion
|
|
33
|
+
export { o as Avatar };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","names":[],"sources":["../../../src/comradecircle/components/Avatar.tsx"],"sourcesContent":["/**\n * Avatar — initials-based, token-only avatar with an optional presence dot.\n * @module comradecircle/components\n *\n * File-backed avatars are not rendered here: in this subgraph `File` resolves\n * `id` only (no URL), so we render deterministic initials on the brand\n * accent-soft tint. Clean, theme-aware, and never a broken image.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\nimport type { ComPresence } from '../types';\n\ntype AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst sizeClass: Record<AvatarSize, string> = {\n xs: 'h-6 w-6 text-[0.6rem]',\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-14 w-14 text-lg',\n xl: 'h-20 w-20 text-2xl',\n};\n\nconst presenceDot: Record<ComPresence, string> = {\n ONLINE: 'bg-status-success-text',\n AWAY: 'bg-status-warning-text',\n BUSY: 'bg-status-error-text',\n OFFLINE: 'bg-text-tertiary',\n};\n\nexport function initialsOf(name: string | null | undefined): string {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase();\n}\n\ninterface AvatarProps {\n name?: string | null;\n size?: AvatarSize;\n presence?: ComPresence | null;\n className?: string;\n}\n\nexport const Avatar: FC<AvatarProps> = ({ name, size = 'md', presence, className }) => {\n return (\n <span className={cn('relative inline-flex shrink-0', className)}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex items-center justify-center rounded-full bg-[var(--color-accent-soft)] font-semibold text-text-primary ring-1 ring-border-seam',\n sizeClass[size]\n )}\n >\n {initialsOf(name)}\n </span>\n {presence && (\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-bg-surface',\n presenceDot[presence],\n presence === 'ONLINE' && 'motion-safe:animate-vc-glow-pulse'\n )}\n aria-label={`Presence: ${presence.toLowerCase()}`}\n />\n )}\n </span>\n );\n};\n"],"mappings":";;;AAeA,IAAM,IAAwC;CAC5C,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL,EAEK,IAA2C;CAC/C,QAAQ;CACR,MAAM;CACN,MAAM;CACN,SAAS;CACV;AAED,SAAgB,EAAW,GAAyC;AAClE,KAAI,CAAC,EAAM,QAAO;CAClB,IAAM,IAAQ,EAAK,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ;AAGtD,QAFI,EAAM,WAAW,IAAU,MAC3B,EAAM,WAAW,IAAU,EAAM,GAAI,MAAM,GAAG,EAAE,CAAC,aAAa,IAC1D,EAAM,GAAI,KAAM,EAAM,EAAM,SAAS,GAAI,IAAK,aAAa;;AAUrE,IAAa,KAA2B,EAAE,SAAM,UAAO,MAAM,aAAU,mBAEnE,kBAAC,QAAD;CAAM,WAAW,EAAG,iCAAiC,EAAU;WAA/D,CACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAW,EACT,8IACA,EAAU,GACX;YAEA,EAAW,EAAK;EACZ,CAAA,EACN,KACC,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAY,IACZ,MAAa,YAAY,oCAC1B;EACD,cAAY,aAAa,EAAS,aAAa;EAC/C,CAAA,CAEC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { useComJoinCircle as e, useComLeaveCircle as t } from "../hooks/useComradeCircleApi.js";
|
|
2
|
+
import "../hooks/index.js";
|
|
3
|
+
import { Avatar as n } from "./Avatar.js";
|
|
4
|
+
import { describeError as r, notify as i } from "../lib/toast.js";
|
|
5
|
+
import { formatEnumLabel as a, formatNumber as o } from "../utils/formatters.js";
|
|
6
|
+
import { StatusBadge as s } from "./StatusBadge.js";
|
|
7
|
+
import { Hash as c, Users as l } from "lucide-react";
|
|
8
|
+
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
|
+
import { Button as p, GlassCard as m } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
//#region src/comradecircle/components/CircleCard.tsx
|
|
11
|
+
function h({ circle: h, membership: g, onOpen: _ }) {
|
|
12
|
+
let v = e(), y = t(), b = g?.status === "ACTIVE";
|
|
13
|
+
return /* @__PURE__ */ f(m, {
|
|
14
|
+
treatment: "plain",
|
|
15
|
+
className: "flex flex-col p-5",
|
|
16
|
+
children: [
|
|
17
|
+
/* @__PURE__ */ f("div", {
|
|
18
|
+
className: "flex items-start gap-3",
|
|
19
|
+
children: [/* @__PURE__ */ d(n, {
|
|
20
|
+
name: h.name,
|
|
21
|
+
size: "lg"
|
|
22
|
+
}), /* @__PURE__ */ f("div", {
|
|
23
|
+
className: "min-w-0 flex-1",
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ d("button", {
|
|
26
|
+
type: "button",
|
|
27
|
+
onClick: _,
|
|
28
|
+
className: "truncate text-left text-base font-semibold text-text-primary hover:underline",
|
|
29
|
+
children: h.name
|
|
30
|
+
}),
|
|
31
|
+
h.topic && /* @__PURE__ */ d("p", {
|
|
32
|
+
className: "truncate text-sm text-text-secondary",
|
|
33
|
+
children: h.topic
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ f("div", {
|
|
36
|
+
className: "mt-1.5 flex flex-wrap items-center gap-1.5",
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ d(s, { status: h.visibility }),
|
|
39
|
+
h.status !== "ACTIVE" && /* @__PURE__ */ d(s, { status: h.status }),
|
|
40
|
+
b && g && /* @__PURE__ */ d(s, { status: g.role })
|
|
41
|
+
]
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
})]
|
|
45
|
+
}),
|
|
46
|
+
h.description && /* @__PURE__ */ d("p", {
|
|
47
|
+
className: "mt-3 line-clamp-2 text-sm text-text-secondary",
|
|
48
|
+
children: h.description
|
|
49
|
+
}),
|
|
50
|
+
h.tags.length > 0 && /* @__PURE__ */ d("div", {
|
|
51
|
+
className: "mt-3 flex flex-wrap gap-1.5",
|
|
52
|
+
children: h.tags.slice(0, 4).map((e) => /* @__PURE__ */ f("span", {
|
|
53
|
+
className: "rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
|
|
54
|
+
children: ["#", e]
|
|
55
|
+
}, e))
|
|
56
|
+
}),
|
|
57
|
+
/* @__PURE__ */ f("div", {
|
|
58
|
+
className: "mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3",
|
|
59
|
+
children: [/* @__PURE__ */ f("div", {
|
|
60
|
+
className: "flex items-center gap-3 text-xs text-text-tertiary",
|
|
61
|
+
children: [/* @__PURE__ */ f("span", {
|
|
62
|
+
className: "inline-flex items-center gap-1",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ d(l, { className: "h-3.5 w-3.5" }),
|
|
65
|
+
" ",
|
|
66
|
+
o(h.memberCount)
|
|
67
|
+
]
|
|
68
|
+
}), /* @__PURE__ */ f("span", {
|
|
69
|
+
className: "inline-flex items-center gap-1",
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ d(c, { className: "h-3.5 w-3.5" }),
|
|
72
|
+
" ",
|
|
73
|
+
h.channels?.length ?? 0
|
|
74
|
+
]
|
|
75
|
+
})]
|
|
76
|
+
}), /* @__PURE__ */ d("div", {
|
|
77
|
+
className: "flex items-center gap-2",
|
|
78
|
+
children: b ? /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d(p, {
|
|
79
|
+
size: "sm",
|
|
80
|
+
variant: "outline",
|
|
81
|
+
onClick: async () => {
|
|
82
|
+
try {
|
|
83
|
+
await y.mutateAsync(h.id), i.success("Left circle", `You have left ${h.name}.`);
|
|
84
|
+
} catch (e) {
|
|
85
|
+
i.error("Could not leave", r(e));
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
disabled: y.isPending,
|
|
89
|
+
children: "Leave"
|
|
90
|
+
}), /* @__PURE__ */ d(p, {
|
|
91
|
+
size: "sm",
|
|
92
|
+
onClick: _,
|
|
93
|
+
children: "Open"
|
|
94
|
+
})] }) : h.status === "ACTIVE" ? /* @__PURE__ */ d(p, {
|
|
95
|
+
size: "sm",
|
|
96
|
+
onClick: async () => {
|
|
97
|
+
try {
|
|
98
|
+
await v.mutateAsync(h.id), i.success("Joined circle", `You are now a member of ${h.name}.`);
|
|
99
|
+
} catch (e) {
|
|
100
|
+
i.error("Could not join", r(e));
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
disabled: v.isPending,
|
|
104
|
+
children: "Join"
|
|
105
|
+
}) : /* @__PURE__ */ d("span", {
|
|
106
|
+
className: "text-xs text-text-tertiary",
|
|
107
|
+
children: a(h.status)
|
|
108
|
+
})
|
|
109
|
+
})]
|
|
110
|
+
})
|
|
111
|
+
]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
export { h as CircleCard };
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=CircleCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CircleCard.js","names":[],"sources":["../../../src/comradecircle/components/CircleCard.tsx"],"sourcesContent":["/**\n * CircleCard — a discovery/overview tile for a community circle.\n * @module comradecircle/components\n *\n * Writes `comJoinCircle` / `comLeaveCircle`. When the caller already belongs to\n * the circle the card shows their role and an Open action; otherwise a Join\n * action. Membership is supplied by the parent (which knows the caller's set).\n */\n\nimport { Users, Hash } from 'lucide-react';\nimport { GlassCard, Button } from '@burdenoff/fe-libs/ui';\nimport { Avatar } from './Avatar';\nimport { StatusBadge } from './StatusBadge';\nimport { useComJoinCircle, useComLeaveCircle } from '../hooks';\nimport { formatEnumLabel, formatNumber } from '../utils/formatters';\nimport { notify, describeError } from '../lib/toast';\nimport type { ComCircle, ComMembership } from '../types';\n\ninterface CircleCardProps {\n circle: ComCircle;\n membership?: ComMembership | null;\n onOpen: () => void;\n}\n\nexport function CircleCard({ circle, membership, onOpen }: CircleCardProps) {\n const join = useComJoinCircle();\n const leave = useComLeaveCircle();\n const isMember = membership?.status === 'ACTIVE';\n\n const handleJoin = async () => {\n try {\n await join.mutateAsync(circle.id);\n notify.success('Joined circle', `You are now a member of ${circle.name}.`);\n } catch (err) {\n notify.error('Could not join', describeError(err));\n }\n };\n\n const handleLeave = async () => {\n try {\n await leave.mutateAsync(circle.id);\n notify.success('Left circle', `You have left ${circle.name}.`);\n } catch (err) {\n notify.error('Could not leave', describeError(err));\n }\n };\n\n return (\n <GlassCard treatment=\"plain\" className=\"flex flex-col p-5\">\n <div className=\"flex items-start gap-3\">\n <Avatar name={circle.name} size=\"lg\" />\n <div className=\"min-w-0 flex-1\">\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"truncate text-left text-base font-semibold text-text-primary hover:underline\"\n >\n {circle.name}\n </button>\n {circle.topic && <p className=\"truncate text-sm text-text-secondary\">{circle.topic}</p>}\n <div className=\"mt-1.5 flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={circle.visibility} />\n {circle.status !== 'ACTIVE' && <StatusBadge status={circle.status} />}\n {isMember && membership && <StatusBadge status={membership.role} />}\n </div>\n </div>\n </div>\n\n {circle.description && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{circle.description}</p>\n )}\n\n {circle.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {circle.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\"\n >\n #{tag}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3\">\n <div className=\"flex items-center gap-3 text-xs text-text-tertiary\">\n <span className=\"inline-flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" /> {formatNumber(circle.memberCount)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Hash className=\"h-3.5 w-3.5\" /> {circle.channels?.length ?? 0}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {isMember ? (\n <>\n <Button size=\"sm\" variant=\"outline\" onClick={handleLeave} disabled={leave.isPending}>\n Leave\n </Button>\n <Button size=\"sm\" onClick={onOpen}>\n Open\n </Button>\n </>\n ) : circle.status === 'ACTIVE' ? (\n <Button size=\"sm\" onClick={handleJoin} disabled={join.isPending}>\n Join\n </Button>\n ) : (\n <span className=\"text-xs text-text-tertiary\">{formatEnumLabel(circle.status)}</span>\n )}\n </div>\n </div>\n </GlassCard>\n );\n}\n"],"mappings":";;;;;;;;;;AAwBA,SAAgB,EAAW,EAAE,WAAQ,eAAY,aAA2B;CAC1E,IAAM,IAAO,GAAkB,EACzB,IAAQ,GAAmB,EAC3B,IAAW,GAAY,WAAW;AAoBxC,QACE,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAU;YAAvC;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,MAAM,EAAO;KAAM,MAAK;KAAO,CAAA,EACvC,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;iBAET,EAAO;OACD,CAAA;MACR,EAAO,SAAS,kBAAC,KAAD;OAAG,WAAU;iBAAwC,EAAO;OAAU,CAAA;MACvF,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD,EAAa,QAAQ,EAAO,YAAc,CAAA;QACzC,EAAO,WAAW,YAAY,kBAAC,GAAD,EAAa,QAAQ,EAAO,QAAU,CAAA;QACpE,KAAY,KAAc,kBAAC,GAAD,EAAa,QAAQ,EAAW,MAAQ,CAAA;QAC/D;;MACF;OACF;;GAEL,EAAO,eACN,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAO;IAAgB,CAAA;GAGtF,EAAO,KAAK,SAAS,KACpB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC5B,kBAAC,QAAD;KAEE,WAAU;eAFZ,CAGC,KACG,EACG;OAJA,EAIA,CACP;IACE,CAAA;GAGR,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA;;OAAE,EAAa,EAAO,YAAY;OAC9D;SACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;;OAAE,EAAO,UAAU,UAAU;OACxD;QACH;QACN,kBAAC,OAAD;KAAK,WAAU;eACZ,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAU,SA3D5B,YAAY;AAC9B,WAAI;AAEF,QADA,MAAM,EAAM,YAAY,EAAO,GAAG,EAClC,EAAO,QAAQ,eAAe,iBAAiB,EAAO,KAAK,GAAG;gBACvD,GAAK;AACZ,UAAO,MAAM,mBAAmB,EAAc,EAAI,CAAC;;;MAsDe,UAAU,EAAM;gBAAW;MAE5E,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAK,SAAS;gBAAQ;MAE1B,CAAA,CACR,EAAA,CAAA,GACD,EAAO,WAAW,WACpB,kBAAC,GAAD;MAAQ,MAAK;MAAK,SA5ET,YAAY;AAC7B,WAAI;AAEF,QADA,MAAM,EAAK,YAAY,EAAO,GAAG,EACjC,EAAO,QAAQ,iBAAiB,2BAA2B,EAAO,KAAK,GAAG;gBACnE,GAAK;AACZ,UAAO,MAAM,kBAAkB,EAAc,EAAI,CAAC;;;MAuEL,UAAU,EAAK;gBAAW;MAExD,CAAA,GAET,kBAAC,QAAD;MAAM,WAAU;gBAA8B,EAAgB,EAAO,OAAO;MAAQ,CAAA;KAElF,CAAA,CACF;;GACI"}
|