@burdenoff/microfe-subscriberbot 2026.719.1 → 2026.720.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/subscriberbot/admin/AdminDashboardPage.d.ts.map +1 -1
- package/dist/subscriberbot/admin/AdminDashboardPage.js +206 -129
- package/dist/subscriberbot/admin/AdminDashboardPage.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.d.ts.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +5 -1
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/hooks/index.d.ts +2 -2
- package/dist/subscriberbot/hooks/index.d.ts.map +1 -1
- package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts +24 -1
- package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts.map +1 -1
- package/dist/subscriberbot/hooks/useSubscriberBotApi.js +140 -55
- package/dist/subscriberbot/hooks/useSubscriberBotApi.js.map +1 -1
- package/dist/subscriberbot/types/index.d.ts +24 -0
- package/dist/subscriberbot/types/index.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AdminDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAsCpD,eAAO,MAAM,kBAAkB,EAAE,EA6ahC,CAAC"}
|
|
@@ -1,129 +1,126 @@
|
|
|
1
1
|
import { PageLayout as e } from "../components/PageLayout.js";
|
|
2
2
|
import { formatDate as t } from "../utils/formatters.js";
|
|
3
3
|
import { StatusBadge as n } from "../components/StatusBadge.js";
|
|
4
|
-
import {
|
|
4
|
+
import { useAdapterSubmissions as r, useApproveAdapter as i, useMarketplaceReports as ee, useModerateListing as a, useProviders as te, useRejectAdapter as ne, useUpdateProvider as o } from "../hooks/useSubscriberBotApi.js";
|
|
5
5
|
import "../hooks/index.js";
|
|
6
|
-
import { useState as
|
|
7
|
-
import { CheckCircle2 as
|
|
8
|
-
import { jsx as
|
|
9
|
-
import { Button as
|
|
6
|
+
import { Fragment as s, useState as c } from "react";
|
|
7
|
+
import { CheckCircle2 as l, Plug as u, Settings2 as re, Store as d, XCircle as ie } from "lucide-react";
|
|
8
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
9
|
+
import { Button as m, Card as h, CardContent as g, CardDescription as _, CardHeader as v, CardTitle as y, EmptyState as b, Spinner as x, Table as S, TableBody as C, TableCell as w, TableHead as T, TableHeader as E, TableRow as D, Tabs as O, TabsContent as k, TabsList as A, TabsTrigger as j, Textarea as M } from "@burdenoff/fe-libs/ui";
|
|
10
10
|
//#region src/subscriberbot/admin/AdminDashboardPage.tsx
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
kind: "BILLING",
|
|
15
|
-
submittedAt: "2026-07-10T08:30:00Z",
|
|
16
|
-
status: "pending"
|
|
17
|
-
}, {
|
|
18
|
-
id: "adapter-placeholder-2",
|
|
19
|
-
name: "Chargebee Sync Adapter",
|
|
20
|
-
kind: "BILLING",
|
|
21
|
-
submittedAt: "2026-07-12T14:22:00Z",
|
|
22
|
-
status: "pending"
|
|
23
|
-
}], j = [{
|
|
24
|
-
id: "listing-placeholder-1",
|
|
25
|
-
title: "Premium SaaS Bundle",
|
|
26
|
-
provider: "ExampleSoft",
|
|
27
|
-
reportedAt: "2026-07-14T09:15:00Z",
|
|
28
|
-
reason: "Misleading pricing"
|
|
29
|
-
}, {
|
|
30
|
-
id: "listing-placeholder-2",
|
|
31
|
-
title: "Newsletter Pro",
|
|
32
|
-
provider: "MailMaster",
|
|
33
|
-
reportedAt: "2026-07-13T16:40:00Z",
|
|
34
|
-
reason: "Trademark concern"
|
|
35
|
-
}], M = () => {
|
|
36
|
-
let [M, N] = a("providers"), { data: P, isLoading: F } = r({ pagination: { limit: 50 } }), I = i(), L = (e) => {
|
|
37
|
-
I.mutate({
|
|
11
|
+
var N = () => {
|
|
12
|
+
let [N, ae] = c("providers"), { data: P, isLoading: oe } = te({ pagination: { limit: 50 } }), F = o(), se = (e) => {
|
|
13
|
+
F.mutate({
|
|
38
14
|
id: e,
|
|
39
15
|
input: { status: "VERIFIED" }
|
|
40
16
|
});
|
|
41
|
-
},
|
|
42
|
-
|
|
17
|
+
}, ce = (e) => {
|
|
18
|
+
F.mutate({
|
|
43
19
|
id: e,
|
|
44
20
|
input: { status: "DEPRECATED" }
|
|
45
21
|
});
|
|
46
|
-
},
|
|
47
|
-
|
|
22
|
+
}, I = P?.items ?? [], { data: L, isLoading: R } = r({ pagination: { limit: 50 } }), z = i(), B = ne(), [V, H] = c(null), [U, W] = c(""), G = L?.items ?? [], le = (e) => {
|
|
23
|
+
z.mutate({ id: e });
|
|
24
|
+
}, ue = (e) => {
|
|
25
|
+
H(e), W("");
|
|
26
|
+
}, de = (e) => {
|
|
27
|
+
U.trim() && B.mutate({
|
|
28
|
+
id: e,
|
|
29
|
+
reason: U.trim()
|
|
30
|
+
}, { onSuccess: () => {
|
|
31
|
+
H(null), W("");
|
|
32
|
+
} });
|
|
33
|
+
}, { data: fe, isLoading: pe } = ee({ pagination: { limit: 50 } }), K = a(), [me, q] = c(null), [J, Y] = c(null), [X, Z] = c(""), Q = fe?.items ?? [], $ = (e, t) => {
|
|
34
|
+
q(e), Y(t), Z("");
|
|
35
|
+
}, he = (e) => {
|
|
36
|
+
!J || !X.trim() || K.mutate({
|
|
37
|
+
id: e,
|
|
38
|
+
action: J,
|
|
39
|
+
reason: X.trim()
|
|
40
|
+
}, { onSuccess: () => {
|
|
41
|
+
q(null), Y(null), Z("");
|
|
42
|
+
} });
|
|
43
|
+
};
|
|
44
|
+
return /* @__PURE__ */ f(e, {
|
|
48
45
|
title: "SubscriberBot Admin",
|
|
49
46
|
description: "Provider registry curation, adapter approvals, and marketplace moderation.",
|
|
50
|
-
children: /* @__PURE__ */
|
|
51
|
-
value:
|
|
52
|
-
onValueChange:
|
|
47
|
+
children: /* @__PURE__ */ p(O, {
|
|
48
|
+
value: N,
|
|
49
|
+
onValueChange: ae,
|
|
53
50
|
className: "w-full",
|
|
54
51
|
children: [
|
|
55
|
-
/* @__PURE__ */
|
|
52
|
+
/* @__PURE__ */ p(A, {
|
|
56
53
|
className: "mb-4 grid w-full grid-cols-3 sm:w-auto sm:inline-flex",
|
|
57
54
|
children: [
|
|
58
|
-
/* @__PURE__ */
|
|
55
|
+
/* @__PURE__ */ p(j, {
|
|
59
56
|
value: "providers",
|
|
60
57
|
className: "gap-2",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
58
|
+
children: [/* @__PURE__ */ f(re, { size: 16 }), "Provider Registry"]
|
|
62
59
|
}),
|
|
63
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ p(j, {
|
|
64
61
|
value: "adapters",
|
|
65
62
|
className: "gap-2",
|
|
66
|
-
children: [/* @__PURE__ */ u
|
|
63
|
+
children: [/* @__PURE__ */ f(u, { size: 16 }), "Adapter Approvals"]
|
|
67
64
|
}),
|
|
68
|
-
/* @__PURE__ */
|
|
65
|
+
/* @__PURE__ */ p(j, {
|
|
69
66
|
value: "marketplace",
|
|
70
67
|
className: "gap-2",
|
|
71
|
-
children: [/* @__PURE__ */
|
|
68
|
+
children: [/* @__PURE__ */ f(d, { size: 16 }), "Marketplace Moderation"]
|
|
72
69
|
})
|
|
73
70
|
]
|
|
74
71
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ f(k, {
|
|
76
73
|
value: "providers",
|
|
77
|
-
children: /* @__PURE__ */
|
|
74
|
+
children: /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ f(y, { children: "Provider registry" }), /* @__PURE__ */ f(_, { children: "Curate the global provider catalog. Verify submitted providers or deprecate stale entries." })] }), /* @__PURE__ */ f(g, { children: oe ? /* @__PURE__ */ f("div", {
|
|
78
75
|
className: "flex min-h-[200px] items-center justify-center",
|
|
79
|
-
children: /* @__PURE__ */
|
|
80
|
-
}) :
|
|
81
|
-
icon: /* @__PURE__ */
|
|
76
|
+
children: /* @__PURE__ */ f(x, { size: "lg" })
|
|
77
|
+
}) : I.length === 0 ? /* @__PURE__ */ f(b, {
|
|
78
|
+
icon: /* @__PURE__ */ f(d, { className: "size-6 text-action-primary-bg" }),
|
|
82
79
|
title: "No providers yet",
|
|
83
80
|
description: "Once providers are created or claimed they will appear here for curation."
|
|
84
|
-
}) : /* @__PURE__ */
|
|
81
|
+
}) : /* @__PURE__ */ f("div", {
|
|
85
82
|
className: "overflow-x-auto",
|
|
86
|
-
children: /* @__PURE__ */
|
|
87
|
-
/* @__PURE__ */
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
/* @__PURE__ */
|
|
91
|
-
/* @__PURE__ */
|
|
83
|
+
children: /* @__PURE__ */ p(S, { children: [/* @__PURE__ */ f(E, { children: /* @__PURE__ */ p(D, { children: [
|
|
84
|
+
/* @__PURE__ */ f(T, { children: "Name" }),
|
|
85
|
+
/* @__PURE__ */ f(T, { children: "Category" }),
|
|
86
|
+
/* @__PURE__ */ f(T, { children: "Status" }),
|
|
87
|
+
/* @__PURE__ */ f(T, { children: "Created" }),
|
|
88
|
+
/* @__PURE__ */ f(T, {
|
|
92
89
|
className: "text-right",
|
|
93
90
|
children: "Actions"
|
|
94
91
|
})
|
|
95
|
-
] }) }), /* @__PURE__ */
|
|
96
|
-
/* @__PURE__ */
|
|
92
|
+
] }) }), /* @__PURE__ */ f(C, { children: I.map((e) => /* @__PURE__ */ p(D, { children: [
|
|
93
|
+
/* @__PURE__ */ f(w, {
|
|
97
94
|
className: "font-medium text-text-primary",
|
|
98
95
|
children: e.name
|
|
99
96
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
97
|
+
/* @__PURE__ */ f(w, {
|
|
101
98
|
className: "text-text-secondary",
|
|
102
99
|
children: e.category
|
|
103
100
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
105
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ f(w, { children: /* @__PURE__ */ f(n, { status: e.status }) }),
|
|
102
|
+
/* @__PURE__ */ f(w, {
|
|
106
103
|
className: "text-text-secondary",
|
|
107
104
|
children: t(e.createdAt)
|
|
108
105
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ f(w, {
|
|
110
107
|
className: "text-right",
|
|
111
|
-
children: /* @__PURE__ */
|
|
108
|
+
children: /* @__PURE__ */ p("div", {
|
|
112
109
|
className: "flex justify-end gap-2",
|
|
113
|
-
children: [e.status !== "VERIFIED" && /* @__PURE__ */
|
|
110
|
+
children: [e.status !== "VERIFIED" && /* @__PURE__ */ p(m, {
|
|
114
111
|
size: "sm",
|
|
115
112
|
variant: "outline",
|
|
116
|
-
onClick: () =>
|
|
117
|
-
disabled:
|
|
118
|
-
children: [/* @__PURE__ */
|
|
113
|
+
onClick: () => se(e.id),
|
|
114
|
+
disabled: F.isPending,
|
|
115
|
+
children: [/* @__PURE__ */ f(l, {
|
|
119
116
|
size: 14,
|
|
120
117
|
className: "mr-1"
|
|
121
118
|
}), "Verify"]
|
|
122
|
-
}), e.status !== "DEPRECATED" && /* @__PURE__ */
|
|
119
|
+
}), e.status !== "DEPRECATED" && /* @__PURE__ */ f(m, {
|
|
123
120
|
size: "sm",
|
|
124
121
|
variant: "secondary",
|
|
125
|
-
onClick: () =>
|
|
126
|
-
disabled:
|
|
122
|
+
onClick: () => ce(e.id),
|
|
123
|
+
disabled: F.isPending,
|
|
127
124
|
children: "Deprecate"
|
|
128
125
|
})]
|
|
129
126
|
})
|
|
@@ -131,114 +128,194 @@ var A = [{
|
|
|
131
128
|
] }, e.id)) })] })
|
|
132
129
|
}) })] })
|
|
133
130
|
}),
|
|
134
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ f(k, {
|
|
135
132
|
value: "adapters",
|
|
136
|
-
children: /* @__PURE__ */
|
|
137
|
-
className: "
|
|
138
|
-
children:
|
|
139
|
-
})
|
|
133
|
+
children: /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ f(y, { children: "Adapter approvals" }), /* @__PURE__ */ f(_, { children: "Review submitted integration adapters before they are published to the SubscriberBot adapter marketplace." })] }), /* @__PURE__ */ f(g, { children: R ? /* @__PURE__ */ f("div", {
|
|
134
|
+
className: "flex min-h-[200px] items-center justify-center",
|
|
135
|
+
children: /* @__PURE__ */ f(x, { size: "lg" })
|
|
136
|
+
}) : G.length === 0 ? /* @__PURE__ */ f(b, {
|
|
137
|
+
icon: /* @__PURE__ */ f(u, { className: "size-6 text-action-primary-bg" }),
|
|
138
|
+
title: "No adapter submissions",
|
|
139
|
+
description: "Submitted integration adapters will appear here for review."
|
|
140
|
+
}) : /* @__PURE__ */ f("div", {
|
|
140
141
|
className: "overflow-x-auto",
|
|
141
|
-
children: /* @__PURE__ */
|
|
142
|
-
/* @__PURE__ */
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
/* @__PURE__ */
|
|
142
|
+
children: /* @__PURE__ */ p(S, { children: [/* @__PURE__ */ f(E, { children: /* @__PURE__ */ p(D, { children: [
|
|
143
|
+
/* @__PURE__ */ f(T, { children: "Adapter" }),
|
|
144
|
+
/* @__PURE__ */ f(T, { children: "Submitting workspace" }),
|
|
145
|
+
/* @__PURE__ */ f(T, { children: "Submitted" }),
|
|
146
|
+
/* @__PURE__ */ f(T, { children: "Status" }),
|
|
147
|
+
/* @__PURE__ */ f(T, {
|
|
147
148
|
className: "text-right",
|
|
148
149
|
children: "Actions"
|
|
149
150
|
})
|
|
150
|
-
] }) }), /* @__PURE__ */
|
|
151
|
-
/* @__PURE__ */
|
|
151
|
+
] }) }), /* @__PURE__ */ f(C, { children: G.map((e) => /* @__PURE__ */ p(s, { children: [/* @__PURE__ */ p(D, { children: [
|
|
152
|
+
/* @__PURE__ */ f(w, {
|
|
152
153
|
className: "font-medium text-text-primary",
|
|
153
|
-
children: e.
|
|
154
|
+
children: e.adapterId
|
|
154
155
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ f(w, {
|
|
156
157
|
className: "text-text-secondary",
|
|
157
|
-
children: e.
|
|
158
|
+
children: e.submitterWorkspaceId
|
|
158
159
|
}),
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ f(w, {
|
|
160
161
|
className: "text-text-secondary",
|
|
161
|
-
children: t(e.
|
|
162
|
+
children: t(e.createdAt)
|
|
162
163
|
}),
|
|
163
|
-
/* @__PURE__ */
|
|
164
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ f(w, { children: /* @__PURE__ */ f(n, { status: e.status }) }),
|
|
165
|
+
/* @__PURE__ */ f(w, {
|
|
165
166
|
className: "text-right",
|
|
166
|
-
children: /* @__PURE__ */
|
|
167
|
+
children: e.status === "PENDING" && /* @__PURE__ */ p("div", {
|
|
167
168
|
className: "flex justify-end gap-2",
|
|
168
|
-
children: [/* @__PURE__ */
|
|
169
|
+
children: [/* @__PURE__ */ p(m, {
|
|
169
170
|
size: "sm",
|
|
170
171
|
variant: "outline",
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
onClick: () => le(e.id),
|
|
173
|
+
disabled: z.isPending || B.isPending,
|
|
174
|
+
children: [/* @__PURE__ */ f(l, {
|
|
175
|
+
size: 14,
|
|
176
|
+
className: "mr-1"
|
|
177
|
+
}), "Approve"]
|
|
178
|
+
}), /* @__PURE__ */ p(m, {
|
|
174
179
|
size: "sm",
|
|
175
180
|
variant: "secondary",
|
|
176
|
-
|
|
177
|
-
|
|
181
|
+
onClick: () => ue(e.id),
|
|
182
|
+
disabled: z.isPending || B.isPending,
|
|
183
|
+
children: [/* @__PURE__ */ f(ie, {
|
|
184
|
+
size: 14,
|
|
185
|
+
className: "mr-1"
|
|
186
|
+
}), "Reject"]
|
|
178
187
|
})]
|
|
179
188
|
})
|
|
180
189
|
})
|
|
181
|
-
] }, e.id
|
|
182
|
-
|
|
190
|
+
] }), V === e.id && /* @__PURE__ */ f(D, { children: /* @__PURE__ */ f(w, {
|
|
191
|
+
colSpan: 5,
|
|
192
|
+
className: "bg-bg-sunken",
|
|
193
|
+
children: /* @__PURE__ */ p("div", {
|
|
194
|
+
className: "flex flex-col gap-2 py-1 sm:flex-row sm:items-start",
|
|
195
|
+
children: [/* @__PURE__ */ f(M, {
|
|
196
|
+
value: U,
|
|
197
|
+
onChange: (e) => W(e.target.value),
|
|
198
|
+
placeholder: "Reason for rejecting this adapter submission (required)",
|
|
199
|
+
className: "min-h-[60px] flex-1",
|
|
200
|
+
autoFocus: !0
|
|
201
|
+
}), /* @__PURE__ */ p("div", {
|
|
202
|
+
className: "flex gap-2 sm:flex-col",
|
|
203
|
+
children: [/* @__PURE__ */ f(m, {
|
|
204
|
+
size: "sm",
|
|
205
|
+
variant: "destructive",
|
|
206
|
+
onClick: () => de(e.id),
|
|
207
|
+
disabled: !U.trim() || B.isPending,
|
|
208
|
+
children: "Confirm reject"
|
|
209
|
+
}), /* @__PURE__ */ f(m, {
|
|
210
|
+
size: "sm",
|
|
211
|
+
variant: "outline",
|
|
212
|
+
onClick: () => H(null),
|
|
213
|
+
disabled: B.isPending,
|
|
214
|
+
children: "Cancel"
|
|
215
|
+
})]
|
|
216
|
+
})]
|
|
217
|
+
})
|
|
218
|
+
}) }, `${e.id}-reject`)] }, e.id)) })] })
|
|
219
|
+
}) })] })
|
|
183
220
|
}),
|
|
184
|
-
/* @__PURE__ */
|
|
221
|
+
/* @__PURE__ */ f(k, {
|
|
185
222
|
value: "marketplace",
|
|
186
|
-
children: /* @__PURE__ */
|
|
187
|
-
className: "
|
|
188
|
-
children:
|
|
189
|
-
})
|
|
223
|
+
children: /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ f(y, { children: "Marketplace moderation" }), /* @__PURE__ */ f(_, { children: "Review reported marketplace listings and take moderation actions." })] }), /* @__PURE__ */ f(g, { children: pe ? /* @__PURE__ */ f("div", {
|
|
224
|
+
className: "flex min-h-[200px] items-center justify-center",
|
|
225
|
+
children: /* @__PURE__ */ f(x, { size: "lg" })
|
|
226
|
+
}) : Q.length === 0 ? /* @__PURE__ */ f(b, {
|
|
227
|
+
icon: /* @__PURE__ */ f(d, { className: "size-6 text-action-primary-bg" }),
|
|
228
|
+
title: "No reported listings",
|
|
229
|
+
description: "Reported marketplace listings will appear here for moderation."
|
|
230
|
+
}) : /* @__PURE__ */ f("div", {
|
|
190
231
|
className: "overflow-x-auto",
|
|
191
|
-
children: /* @__PURE__ */
|
|
192
|
-
/* @__PURE__ */
|
|
193
|
-
/* @__PURE__ */
|
|
194
|
-
/* @__PURE__ */
|
|
195
|
-
/* @__PURE__ */
|
|
196
|
-
/* @__PURE__ */
|
|
232
|
+
children: /* @__PURE__ */ p(S, { children: [/* @__PURE__ */ f(E, { children: /* @__PURE__ */ p(D, { children: [
|
|
233
|
+
/* @__PURE__ */ f(T, { children: "Listing" }),
|
|
234
|
+
/* @__PURE__ */ f(T, { children: "Reporting workspace" }),
|
|
235
|
+
/* @__PURE__ */ f(T, { children: "Reported" }),
|
|
236
|
+
/* @__PURE__ */ f(T, { children: "Reason" }),
|
|
237
|
+
/* @__PURE__ */ f(T, { children: "Status" }),
|
|
238
|
+
/* @__PURE__ */ f(T, {
|
|
197
239
|
className: "text-right",
|
|
198
240
|
children: "Actions"
|
|
199
241
|
})
|
|
200
|
-
] }) }), /* @__PURE__ */
|
|
201
|
-
/* @__PURE__ */
|
|
242
|
+
] }) }), /* @__PURE__ */ f(C, { children: Q.map((e) => /* @__PURE__ */ p(s, { children: [/* @__PURE__ */ p(D, { children: [
|
|
243
|
+
/* @__PURE__ */ f(w, {
|
|
202
244
|
className: "font-medium text-text-primary",
|
|
203
|
-
children: e.
|
|
245
|
+
children: e.listingId
|
|
204
246
|
}),
|
|
205
|
-
/* @__PURE__ */
|
|
247
|
+
/* @__PURE__ */ f(w, {
|
|
206
248
|
className: "text-text-secondary",
|
|
207
|
-
children: e.
|
|
249
|
+
children: e.reporterWorkspaceId
|
|
208
250
|
}),
|
|
209
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ f(w, {
|
|
210
252
|
className: "text-text-secondary",
|
|
211
|
-
children: t(e.
|
|
253
|
+
children: t(e.createdAt)
|
|
212
254
|
}),
|
|
213
|
-
/* @__PURE__ */
|
|
255
|
+
/* @__PURE__ */ f(w, {
|
|
214
256
|
className: "text-text-secondary",
|
|
215
257
|
children: e.reason
|
|
216
258
|
}),
|
|
217
|
-
/* @__PURE__ */
|
|
259
|
+
/* @__PURE__ */ f(w, { children: /* @__PURE__ */ f(n, { status: e.status }) }),
|
|
260
|
+
/* @__PURE__ */ f(w, {
|
|
218
261
|
className: "text-right",
|
|
219
|
-
children: /* @__PURE__ */
|
|
262
|
+
children: e.status === "PENDING" && /* @__PURE__ */ p("div", {
|
|
220
263
|
className: "flex justify-end gap-2",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
264
|
+
children: [/* @__PURE__ */ f(m, {
|
|
222
265
|
size: "sm",
|
|
223
266
|
variant: "outline",
|
|
224
|
-
|
|
267
|
+
onClick: () => $(e.id, "DISMISS"),
|
|
268
|
+
disabled: K.isPending,
|
|
225
269
|
children: "Dismiss"
|
|
226
|
-
}), /* @__PURE__ */
|
|
270
|
+
}), /* @__PURE__ */ f(m, {
|
|
227
271
|
size: "sm",
|
|
228
272
|
variant: "destructive",
|
|
229
|
-
|
|
273
|
+
onClick: () => $(e.id, "REMOVE_LISTING"),
|
|
274
|
+
disabled: K.isPending,
|
|
230
275
|
children: "Remove"
|
|
231
276
|
})]
|
|
232
277
|
})
|
|
233
278
|
})
|
|
234
|
-
] }, e.id
|
|
235
|
-
|
|
279
|
+
] }), me === e.id && /* @__PURE__ */ f(D, { children: /* @__PURE__ */ f(w, {
|
|
280
|
+
colSpan: 6,
|
|
281
|
+
className: "bg-bg-sunken",
|
|
282
|
+
children: /* @__PURE__ */ p("div", {
|
|
283
|
+
className: "flex flex-col gap-2 py-1 sm:flex-row sm:items-start",
|
|
284
|
+
children: [/* @__PURE__ */ f(M, {
|
|
285
|
+
value: X,
|
|
286
|
+
onChange: (e) => Z(e.target.value),
|
|
287
|
+
placeholder: `Reason to ${J === "REMOVE_LISTING" ? "remove this listing" : "dismiss this report"} (required)`,
|
|
288
|
+
className: "min-h-[60px] flex-1",
|
|
289
|
+
autoFocus: !0
|
|
290
|
+
}), /* @__PURE__ */ p("div", {
|
|
291
|
+
className: "flex gap-2 sm:flex-col",
|
|
292
|
+
children: [/* @__PURE__ */ p(m, {
|
|
293
|
+
size: "sm",
|
|
294
|
+
variant: J === "REMOVE_LISTING" ? "destructive" : "outline",
|
|
295
|
+
onClick: () => he(e.id),
|
|
296
|
+
disabled: !X.trim() || K.isPending,
|
|
297
|
+
children: [
|
|
298
|
+
"Confirm",
|
|
299
|
+
" ",
|
|
300
|
+
J === "REMOVE_LISTING" ? "removal" : "dismissal"
|
|
301
|
+
]
|
|
302
|
+
}), /* @__PURE__ */ f(m, {
|
|
303
|
+
size: "sm",
|
|
304
|
+
variant: "outline",
|
|
305
|
+
onClick: () => q(null),
|
|
306
|
+
disabled: K.isPending,
|
|
307
|
+
children: "Cancel"
|
|
308
|
+
})]
|
|
309
|
+
})]
|
|
310
|
+
})
|
|
311
|
+
}) }, `${e.id}-moderate`)] }, e.id)) })] })
|
|
312
|
+
}) })] })
|
|
236
313
|
})
|
|
237
314
|
]
|
|
238
315
|
})
|
|
239
316
|
});
|
|
240
317
|
};
|
|
241
318
|
//#endregion
|
|
242
|
-
export {
|
|
319
|
+
export { N as AdminDashboardPage };
|
|
243
320
|
|
|
244
321
|
//# sourceMappingURL=AdminDashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboardPage.js","names":[],"sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"sourcesContent":["/**\n * SubscriberBot Admin Dashboard\n * @module subscriberbot/admin\n *\n * Product-specific admin surface mounted inside `admin-app`. It exposes the\n * three governance operations requested for SubscriberBot:\n * 1. Provider registry curation (real — wires `subListProviders` / `subUpdateProvider`).\n * 2. Adapter approval queue (placeholder — backend query does not exist yet).\n * 3. Marketplace moderation queue (placeholder — backend query does not exist yet).\n */\n\nimport { useState, type FC } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmptyState,\n Spinner,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Plug, Settings2, Store } from 'lucide-react';\n\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { useProviders, useUpdateProvider } from '../hooks';\nimport { formatDate } from '../utils/formatters';\nimport type { SubProvider } from '../types';\n\n// Placeholder rows for surfaces that don't have a backend query yet.\n// These are intentionally typed as read-only data so the UI is structured\n// and the next engineer can swap in a real React-Query hook.\nconst PLACEHOLDER_ADAPTERS: Array<{\n id: string;\n name: string;\n kind: string;\n submittedAt: string;\n status: 'pending' | 'approved' | 'rejected';\n}> = [\n {\n id: 'adapter-placeholder-1',\n name: 'Stripe Billing Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-10T08:30:00Z',\n status: 'pending',\n },\n {\n id: 'adapter-placeholder-2',\n name: 'Chargebee Sync Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-12T14:22:00Z',\n status: 'pending',\n },\n];\n\nconst PLACEHOLDER_LISTINGS: Array<{\n id: string;\n title: string;\n provider: string;\n reportedAt: string;\n reason: string;\n}> = [\n {\n id: 'listing-placeholder-1',\n title: 'Premium SaaS Bundle',\n provider: 'ExampleSoft',\n reportedAt: '2026-07-14T09:15:00Z',\n reason: 'Misleading pricing',\n },\n {\n id: 'listing-placeholder-2',\n title: 'Newsletter Pro',\n provider: 'MailMaster',\n reportedAt: '2026-07-13T16:40:00Z',\n reason: 'Trademark concern',\n },\n];\n\nexport const AdminDashboardPage: FC = () => {\n const [activeTab, setActiveTab] = useState('providers');\n const { data: providersData, isLoading: providersLoading } = useProviders({\n pagination: { limit: 50 },\n });\n const updateProvider = useUpdateProvider();\n\n const handleVerify = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'VERIFIED' } });\n };\n\n const handleDeprecate = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'DEPRECATED' } });\n };\n\n const providers = providersData?.items ?? [];\n\n return (\n <PageLayout\n title=\"SubscriberBot Admin\"\n description=\"Provider registry curation, adapter approvals, and marketplace moderation.\"\n >\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"mb-4 grid w-full grid-cols-3 sm:w-auto sm:inline-flex\">\n <TabsTrigger value=\"providers\" className=\"gap-2\">\n <Settings2 size={16} />\n Provider Registry\n </TabsTrigger>\n <TabsTrigger value=\"adapters\" className=\"gap-2\">\n <Plug size={16} />\n Adapter Approvals\n </TabsTrigger>\n <TabsTrigger value=\"marketplace\" className=\"gap-2\">\n <Store size={16} />\n Marketplace Moderation\n </TabsTrigger>\n </TabsList>\n\n {/* Provider registry curation — backed by real GraphQL queries. */}\n <TabsContent value=\"providers\">\n <Card>\n <CardHeader>\n <CardTitle>Provider registry</CardTitle>\n <CardDescription>\n Curate the global provider catalog. Verify submitted providers or deprecate stale\n entries.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {providersLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : providers.length === 0 ? (\n <EmptyState\n icon={<Store className=\"size-6 text-action-primary-bg\" />}\n title=\"No providers yet\"\n description=\"Once providers are created or claimed they will appear here for curation.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Category</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {providers.map((provider: SubProvider) => (\n <TableRow key={provider.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {provider.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{provider.category}</TableCell>\n <TableCell>\n <StatusBadge status={provider.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(provider.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n {provider.status !== 'VERIFIED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleVerify(provider.id)}\n disabled={updateProvider.isPending}\n >\n <CheckCircle2 size={14} className=\"mr-1\" />\n Verify\n </Button>\n )}\n {provider.status !== 'DEPRECATED' && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => handleDeprecate(provider.id)}\n disabled={updateProvider.isPending}\n >\n Deprecate\n </Button>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Adapter approval queue — placeholder until backend exists. */}\n <TabsContent value=\"adapters\">\n <Card>\n <CardHeader>\n <CardTitle>Adapter approvals</CardTitle>\n <CardDescription>\n Review submitted integration adapters before they are published to the SubscriberBot\n adapter marketplace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Live adapter submissions aren't available yet — showing sample data below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Adapter</TableHead>\n <TableHead>Kind</TableHead>\n <TableHead>Submitted</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_ADAPTERS.map((adapter) => (\n <TableRow key={adapter.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {adapter.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{adapter.kind}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(adapter.submittedAt)}\n </TableCell>\n <TableCell>\n <StatusBadge status={adapter.status} />\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Approve\n </Button>\n <Button size=\"sm\" variant=\"secondary\" disabled>\n Reject\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Marketplace moderation — placeholder until backend exists. */}\n <TabsContent value=\"marketplace\">\n <Card>\n <CardHeader>\n <CardTitle>Marketplace moderation</CardTitle>\n <CardDescription>\n Review reported marketplace listings and take moderation actions.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Live moderation reports aren't available yet — showing sample data below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Listing</TableHead>\n <TableHead>Provider</TableHead>\n <TableHead>Reported</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_LISTINGS.map((listing) => (\n <TableRow key={listing.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {listing.title}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.provider}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(listing.reportedAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.reason}</TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Dismiss\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled>\n Remove\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminDashboardPage.js","names":[],"sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"sourcesContent":["/**\n * SubscriberBot Admin Dashboard\n * @module subscriberbot/admin\n *\n * Product-specific admin surface mounted inside `admin-app`. It exposes the\n * three governance operations requested for SubscriberBot, all wired to the\n * real `wspace-subscriberbot-svc` admin governance schema (BOFF-3237):\n * 1. Provider registry curation — `subListProviders` / `subUpdateProvider`.\n * 2. Adapter approval queue — `subListAdapterSubmissions` /\n * `subApproveAdapter` / `subRejectAdapter`.\n * 3. Marketplace moderation queue — `subListMarketplaceReports` /\n * `subModerateListing`.\n */\n\nimport { Fragment, useState, type FC } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmptyState,\n Spinner,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Plug, Settings2, Store, XCircle } from 'lucide-react';\n\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport {\n useAdapterSubmissions,\n useApproveAdapter,\n useMarketplaceReports,\n useModerateListing,\n useProviders,\n useRejectAdapter,\n useUpdateProvider,\n} from '../hooks';\nimport { formatDate } from '../utils/formatters';\nimport type { SubModerationAction, SubProvider } from '../types';\n\nexport const AdminDashboardPage: FC = () => {\n const [activeTab, setActiveTab] = useState('providers');\n\n // --- Provider registry ----------------------------------------------\n const { data: providersData, isLoading: providersLoading } = useProviders({\n pagination: { limit: 50 },\n });\n const updateProvider = useUpdateProvider();\n\n const handleVerify = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'VERIFIED' } });\n };\n\n const handleDeprecate = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'DEPRECATED' } });\n };\n\n const providers = providersData?.items ?? [];\n\n // --- Adapter approvals -------------------------------------------------\n const { data: adapterSubmissionsData, isLoading: adaptersLoading } = useAdapterSubmissions({\n pagination: { limit: 50 },\n });\n const approveAdapter = useApproveAdapter();\n const rejectAdapter = useRejectAdapter();\n const [rejectingAdapterId, setRejectingAdapterId] = useState<string | null>(null);\n const [adapterRejectReason, setAdapterRejectReason] = useState('');\n\n const adapterSubmissions = adapterSubmissionsData?.items ?? [];\n\n const handleApproveAdapter = (id: string) => {\n approveAdapter.mutate({ id });\n };\n\n const handleStartRejectAdapter = (id: string) => {\n setRejectingAdapterId(id);\n setAdapterRejectReason('');\n };\n\n const handleConfirmRejectAdapter = (id: string) => {\n if (!adapterRejectReason.trim()) return;\n rejectAdapter.mutate(\n { id, reason: adapterRejectReason.trim() },\n {\n onSuccess: () => {\n setRejectingAdapterId(null);\n setAdapterRejectReason('');\n },\n }\n );\n };\n\n // --- Marketplace moderation ---------------------------------------------\n const { data: marketplaceReportsData, isLoading: reportsLoading } = useMarketplaceReports({\n pagination: { limit: 50 },\n });\n const moderateListing = useModerateListing();\n const [moderatingReportId, setModeratingReportId] = useState<string | null>(null);\n const [moderateAction, setModerateAction] = useState<SubModerationAction | null>(null);\n const [moderateReason, setModerateReason] = useState('');\n\n const marketplaceReports = marketplaceReportsData?.items ?? [];\n\n const handleStartModerate = (id: string, action: SubModerationAction) => {\n setModeratingReportId(id);\n setModerateAction(action);\n setModerateReason('');\n };\n\n const handleConfirmModerate = (id: string) => {\n if (!moderateAction || !moderateReason.trim()) return;\n moderateListing.mutate(\n { id, action: moderateAction, reason: moderateReason.trim() },\n {\n onSuccess: () => {\n setModeratingReportId(null);\n setModerateAction(null);\n setModerateReason('');\n },\n }\n );\n };\n\n return (\n <PageLayout\n title=\"SubscriberBot Admin\"\n description=\"Provider registry curation, adapter approvals, and marketplace moderation.\"\n >\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"mb-4 grid w-full grid-cols-3 sm:w-auto sm:inline-flex\">\n <TabsTrigger value=\"providers\" className=\"gap-2\">\n <Settings2 size={16} />\n Provider Registry\n </TabsTrigger>\n <TabsTrigger value=\"adapters\" className=\"gap-2\">\n <Plug size={16} />\n Adapter Approvals\n </TabsTrigger>\n <TabsTrigger value=\"marketplace\" className=\"gap-2\">\n <Store size={16} />\n Marketplace Moderation\n </TabsTrigger>\n </TabsList>\n\n {/* Provider registry curation — backed by real GraphQL queries. */}\n <TabsContent value=\"providers\">\n <Card>\n <CardHeader>\n <CardTitle>Provider registry</CardTitle>\n <CardDescription>\n Curate the global provider catalog. Verify submitted providers or deprecate stale\n entries.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {providersLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : providers.length === 0 ? (\n <EmptyState\n icon={<Store className=\"size-6 text-action-primary-bg\" />}\n title=\"No providers yet\"\n description=\"Once providers are created or claimed they will appear here for curation.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Category</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {providers.map((provider: SubProvider) => (\n <TableRow key={provider.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {provider.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{provider.category}</TableCell>\n <TableCell>\n <StatusBadge status={provider.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(provider.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n {provider.status !== 'VERIFIED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleVerify(provider.id)}\n disabled={updateProvider.isPending}\n >\n <CheckCircle2 size={14} className=\"mr-1\" />\n Verify\n </Button>\n )}\n {provider.status !== 'DEPRECATED' && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => handleDeprecate(provider.id)}\n disabled={updateProvider.isPending}\n >\n Deprecate\n </Button>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Adapter approval queue — backed by real GraphQL queries. */}\n <TabsContent value=\"adapters\">\n <Card>\n <CardHeader>\n <CardTitle>Adapter approvals</CardTitle>\n <CardDescription>\n Review submitted integration adapters before they are published to the SubscriberBot\n adapter marketplace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {adaptersLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : adapterSubmissions.length === 0 ? (\n <EmptyState\n icon={<Plug className=\"size-6 text-action-primary-bg\" />}\n title=\"No adapter submissions\"\n description=\"Submitted integration adapters will appear here for review.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Adapter</TableHead>\n <TableHead>Submitting workspace</TableHead>\n <TableHead>Submitted</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {adapterSubmissions.map((submission) => (\n <Fragment key={submission.id}>\n <TableRow>\n <TableCell className=\"font-medium text-text-primary\">\n {submission.adapterId}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {submission.submitterWorkspaceId}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(submission.createdAt)}\n </TableCell>\n <TableCell>\n <StatusBadge status={submission.status} />\n </TableCell>\n <TableCell className=\"text-right\">\n {submission.status === 'PENDING' && (\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleApproveAdapter(submission.id)}\n disabled={approveAdapter.isPending || rejectAdapter.isPending}\n >\n <CheckCircle2 size={14} className=\"mr-1\" />\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => handleStartRejectAdapter(submission.id)}\n disabled={approveAdapter.isPending || rejectAdapter.isPending}\n >\n <XCircle size={14} className=\"mr-1\" />\n Reject\n </Button>\n </div>\n )}\n </TableCell>\n </TableRow>\n {rejectingAdapterId === submission.id && (\n <TableRow key={`${submission.id}-reject`}>\n <TableCell colSpan={5} className=\"bg-bg-sunken\">\n <div className=\"flex flex-col gap-2 py-1 sm:flex-row sm:items-start\">\n <Textarea\n value={adapterRejectReason}\n onChange={(event) => setAdapterRejectReason(event.target.value)}\n placeholder=\"Reason for rejecting this adapter submission (required)\"\n className=\"min-h-[60px] flex-1\"\n autoFocus\n />\n <div className=\"flex gap-2 sm:flex-col\">\n <Button\n size=\"sm\"\n variant=\"destructive\"\n onClick={() => handleConfirmRejectAdapter(submission.id)}\n disabled={\n !adapterRejectReason.trim() || rejectAdapter.isPending\n }\n >\n Confirm reject\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setRejectingAdapterId(null)}\n disabled={rejectAdapter.isPending}\n >\n Cancel\n </Button>\n </div>\n </div>\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Marketplace moderation — backed by real GraphQL queries. */}\n <TabsContent value=\"marketplace\">\n <Card>\n <CardHeader>\n <CardTitle>Marketplace moderation</CardTitle>\n <CardDescription>\n Review reported marketplace listings and take moderation actions.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {reportsLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : marketplaceReports.length === 0 ? (\n <EmptyState\n icon={<Store className=\"size-6 text-action-primary-bg\" />}\n title=\"No reported listings\"\n description=\"Reported marketplace listings will appear here for moderation.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Listing</TableHead>\n <TableHead>Reporting workspace</TableHead>\n <TableHead>Reported</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {marketplaceReports.map((report) => (\n <Fragment key={report.id}>\n <TableRow>\n <TableCell className=\"font-medium text-text-primary\">\n {report.listingId}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {report.reporterWorkspaceId}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(report.createdAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{report.reason}</TableCell>\n <TableCell>\n <StatusBadge status={report.status} />\n </TableCell>\n <TableCell className=\"text-right\">\n {report.status === 'PENDING' && (\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleStartModerate(report.id, 'DISMISS')}\n disabled={moderateListing.isPending}\n >\n Dismiss\n </Button>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n onClick={() => handleStartModerate(report.id, 'REMOVE_LISTING')}\n disabled={moderateListing.isPending}\n >\n Remove\n </Button>\n </div>\n )}\n </TableCell>\n </TableRow>\n {moderatingReportId === report.id && (\n <TableRow key={`${report.id}-moderate`}>\n <TableCell colSpan={6} className=\"bg-bg-sunken\">\n <div className=\"flex flex-col gap-2 py-1 sm:flex-row sm:items-start\">\n <Textarea\n value={moderateReason}\n onChange={(event) => setModerateReason(event.target.value)}\n placeholder={`Reason to ${moderateAction === 'REMOVE_LISTING' ? 'remove this listing' : 'dismiss this report'} (required)`}\n className=\"min-h-[60px] flex-1\"\n autoFocus\n />\n <div className=\"flex gap-2 sm:flex-col\">\n <Button\n size=\"sm\"\n variant={\n moderateAction === 'REMOVE_LISTING'\n ? 'destructive'\n : 'outline'\n }\n onClick={() => handleConfirmModerate(report.id)}\n disabled={!moderateReason.trim() || moderateListing.isPending}\n >\n Confirm{' '}\n {moderateAction === 'REMOVE_LISTING'\n ? 'removal'\n : 'dismissal'}\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setModeratingReportId(null)}\n disabled={moderateListing.isPending}\n >\n Cancel\n </Button>\n </div>\n </div>\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/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/subscriberbot/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;AA6DD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAsB5C,CAAC"}
|
|
@@ -38,7 +38,11 @@ var i = {
|
|
|
38
38
|
CLAIMED: "success",
|
|
39
39
|
UNVERIFIED: "secondary",
|
|
40
40
|
DEPRECATED: "outline",
|
|
41
|
-
ARCHIVED: "outline"
|
|
41
|
+
ARCHIVED: "outline",
|
|
42
|
+
APPROVED: "success",
|
|
43
|
+
REJECTED: "destructive",
|
|
44
|
+
DISMISSED: "outline",
|
|
45
|
+
RESOLVED: "success"
|
|
42
46
|
}, s = ({ status: s, className: c }) => {
|
|
43
47
|
let l = s.toUpperCase(), u = o[l] ?? "secondary", d = a.has(l);
|
|
44
48
|
return /* @__PURE__ */ r("span", {
|