@burdenoff/microfe-subscriberbot 2026.706.2 → 2026.710.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/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +23527 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +57851 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -1
- package/dist/subscriberbot/SubscriberBotRoot.d.ts +5 -0
- package/dist/subscriberbot/SubscriberBotRoot.d.ts.map +1 -0
- package/dist/subscriberbot/SubscriberBotRoot.js +56 -40
- package/dist/subscriberbot/SubscriberBotRoot.js.map +1 -1
- package/dist/subscriberbot/SubscriberBotRoutes.d.ts +4 -0
- package/dist/subscriberbot/SubscriberBotRoutes.d.ts.map +1 -0
- package/dist/subscriberbot/SubscriberBotRoutes.js +14 -6
- package/dist/subscriberbot/SubscriberBotRoutes.js.map +1 -1
- package/dist/subscriberbot/components/EmptyState.d.ts +18 -0
- package/dist/subscriberbot/components/EmptyState.d.ts.map +1 -0
- package/dist/subscriberbot/components/MetricsCard.d.ts +16 -0
- package/dist/subscriberbot/components/MetricsCard.d.ts.map +1 -0
- package/dist/subscriberbot/components/Modal.d.ts +13 -0
- package/dist/subscriberbot/components/Modal.d.ts.map +1 -0
- package/dist/subscriberbot/components/PageLayout.d.ts +23 -0
- package/dist/subscriberbot/components/PageLayout.d.ts.map +1 -0
- package/dist/subscriberbot/components/StateViews.d.ts +24 -0
- package/dist/subscriberbot/components/StateViews.d.ts.map +1 -0
- package/dist/subscriberbot/components/StatusBadge.d.ts +9 -0
- package/dist/subscriberbot/components/StatusBadge.d.ts.map +1 -0
- package/dist/subscriberbot/components/index.d.ts +13 -0
- package/dist/subscriberbot/components/index.d.ts.map +1 -0
- package/dist/subscriberbot/components/index.js +7 -0
- package/dist/subscriberbot/components/viz.d.ts +58 -0
- package/dist/subscriberbot/components/viz.d.ts.map +1 -0
- package/dist/subscriberbot/components/viz.js +196 -0
- package/dist/subscriberbot/components/viz.js.map +1 -0
- package/dist/subscriberbot/config/assistantUsecases.d.ts +13 -0
- package/dist/subscriberbot/config/assistantUsecases.d.ts.map +1 -0
- package/dist/subscriberbot/context/SubscriberBotContext.d.ts +16 -0
- package/dist/subscriberbot/context/SubscriberBotContext.d.ts.map +1 -0
- package/dist/subscriberbot/context/index.d.ts +6 -0
- package/dist/subscriberbot/context/index.d.ts.map +1 -0
- package/dist/subscriberbot/hooks/index.d.ts +7 -0
- package/dist/subscriberbot/hooks/index.d.ts.map +1 -0
- package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts +105 -0
- package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts.map +1 -0
- package/dist/subscriberbot/hooks/useSubscriberBotApi.js +38 -30
- package/dist/subscriberbot/hooks/useSubscriberBotApi.js.map +1 -1
- package/dist/subscriberbot/index.d.ts +12 -0
- package/dist/subscriberbot/index.d.ts.map +1 -0
- package/dist/subscriberbot/index.js +1 -0
- package/dist/subscriberbot/pages/AssetVaultPage.d.ts +4 -0
- package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/AssetVaultPage.js +182 -0
- package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -0
- package/dist/subscriberbot/pages/DashboardPage.d.ts +12 -0
- package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/DashboardPage.js +272 -199
- package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
- package/dist/subscriberbot/pages/InboxPage.d.ts +12 -0
- package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/InboxPage.js +517 -234
- package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
- package/dist/subscriberbot/pages/InsightsPage.d.ts +4 -0
- package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/InsightsPage.js +220 -0
- package/dist/subscriberbot/pages/InsightsPage.js.map +1 -0
- package/dist/subscriberbot/pages/InvoicesPage.d.ts +13 -0
- package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/InvoicesPage.js +325 -237
- package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
- package/dist/subscriberbot/pages/WorkflowsPage.d.ts +15 -0
- package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/WorkflowsPage.js +301 -112
- package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts +11 -0
- package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/agents/AgentDetailPage.js +311 -165
- package/dist/subscriberbot/pages/agents/AgentDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts +8 -0
- package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts +11 -0
- package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/agents/AgentsListPage.js +183 -93
- package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts +10 -0
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.js +426 -293
- package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts +10 -0
- package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/providers/ProviderNewPage.js +217 -153
- package/dist/subscriberbot/pages/providers/ProviderNewPage.js.map +1 -1
- package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts +12 -0
- package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/providers/ProvidersListPage.js +215 -112
- package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts +13 -0
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js +542 -428
- package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts +10 -0
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js +242 -192
- package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts +10 -0
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -0
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js +174 -133
- package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
- package/dist/subscriberbot/services/assistantApi.d.ts +66 -0
- package/dist/subscriberbot/services/assistantApi.d.ts.map +1 -0
- package/dist/subscriberbot/services/assistantApi.js +260 -0
- package/dist/subscriberbot/services/assistantApi.js.map +1 -0
- package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts +13 -0
- package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/subscriberbot/services/createSandboxAssistantTransport.js +120 -0
- package/dist/subscriberbot/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/subscriberbot/store/index.d.ts +6 -0
- package/dist/subscriberbot/store/index.d.ts.map +1 -0
- package/dist/subscriberbot/store/subscriberbotStore.d.ts +60 -0
- package/dist/subscriberbot/store/subscriberbotStore.d.ts.map +1 -0
- package/dist/subscriberbot/types/assistant.d.ts +57 -0
- package/dist/subscriberbot/types/assistant.d.ts.map +1 -0
- package/dist/subscriberbot/types/index.d.ts +465 -0
- package/dist/subscriberbot/types/index.d.ts.map +1 -0
- package/dist/subscriberbot/utils/cn.d.ts +4 -0
- package/dist/subscriberbot/utils/cn.d.ts.map +1 -0
- package/dist/subscriberbot/utils/formatters.d.ts +53 -0
- package/dist/subscriberbot/utils/formatters.d.ts.map +1 -0
- package/dist/subscriberbot/utils/index.d.ts +8 -0
- package/dist/subscriberbot/utils/index.d.ts.map +1 -0
- package/dist/subscriberbot/utils/navigation.d.ts +20 -0
- package/dist/subscriberbot/utils/navigation.d.ts.map +1 -0
- package/dist/subscriberbot/utils/pageContext.d.ts +21 -0
- package/dist/subscriberbot/utils/pageContext.d.ts.map +1 -0
- package/dist/subscriberbot/utils/pageContext.js +47 -0
- package/dist/subscriberbot/utils/pageContext.js.map +1 -0
- package/package.json +5 -1
|
@@ -5,13 +5,15 @@ import { formatCurrency as r, formatDate as i, formatEnumLabel as a, formatInter
|
|
|
5
5
|
import { StatusBadge as s } from "../../components/StatusBadge.js";
|
|
6
6
|
import { EmptyState as c } from "../../components/EmptyState.js";
|
|
7
7
|
import { ErrorView as l, LoadingView as u } from "../../components/StateViews.js";
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
8
|
+
import { MiniProgress as d } from "../../components/viz.js";
|
|
9
|
+
import "../../components/index.js";
|
|
10
|
+
import { useRelationships as f } from "../../hooks/useSubscriberBotApi.js";
|
|
11
|
+
import { useMemo as p, useState as m } from "react";
|
|
12
|
+
import { ChevronRight as h, Plus as g, Repeat2 as _, Search as v } from "lucide-react";
|
|
13
|
+
import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
14
|
+
import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
|
|
13
15
|
//#region src/subscriberbot/pages/relationships/RelationshipsListPage.tsx
|
|
14
|
-
var
|
|
16
|
+
var w = 20, T = [
|
|
15
17
|
{
|
|
16
18
|
value: "",
|
|
17
19
|
label: "All statuses"
|
|
@@ -44,7 +46,7 @@ var S = 20, C = [
|
|
|
44
46
|
value: "CANCELLED",
|
|
45
47
|
label: "Cancelled"
|
|
46
48
|
}
|
|
47
|
-
],
|
|
49
|
+
], E = [
|
|
48
50
|
{
|
|
49
51
|
value: "",
|
|
50
52
|
label: "All kinds"
|
|
@@ -81,162 +83,201 @@ var S = 20, C = [
|
|
|
81
83
|
value: "TRIAL",
|
|
82
84
|
label: "Trial"
|
|
83
85
|
}
|
|
84
|
-
];
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
], D = "rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]";
|
|
87
|
+
function O(e) {
|
|
88
|
+
return e == null ? "accent" : e >= 66 ? "positive" : e >= 33 ? "warning" : "negative";
|
|
89
|
+
}
|
|
90
|
+
function k() {
|
|
91
|
+
let { navigateTo: k } = e(), [A, j] = m(0), [M, N] = m(""), [P, F] = m(""), [I, L] = m(""), [R, z] = m(""), { data: B, isLoading: V, isError: H, refetch: U, isFetching: W } = f({
|
|
92
|
+
status: M || void 0,
|
|
93
|
+
kind: P || void 0,
|
|
94
|
+
search: I || void 0,
|
|
90
95
|
pagination: {
|
|
91
|
-
limit:
|
|
92
|
-
offset:
|
|
96
|
+
limit: w,
|
|
97
|
+
offset: A * w
|
|
93
98
|
}
|
|
94
|
-
}),
|
|
95
|
-
return /* @__PURE__ */
|
|
99
|
+
}), G = p(() => B?.items ?? [], [B]), K = B?.pageInfo.hasMore ?? !1;
|
|
100
|
+
return /* @__PURE__ */ x(n, {
|
|
96
101
|
title: "Relationships",
|
|
97
102
|
description: "Every subscription, membership, license and contract you track",
|
|
98
|
-
actions: /* @__PURE__ */
|
|
103
|
+
actions: /* @__PURE__ */ x("button", {
|
|
99
104
|
type: "button",
|
|
100
|
-
onClick: () =>
|
|
105
|
+
onClick: () => k("/relationships/new"),
|
|
101
106
|
className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
107
|
+
children: [/* @__PURE__ */ b(g, { className: "h-4 w-4" }), " Add relationship"]
|
|
103
108
|
}),
|
|
104
109
|
children: [
|
|
105
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ b(C, {
|
|
106
111
|
className: "mb-4",
|
|
107
112
|
children: "This is the fundamental object of Subscriber Bot. Filter by lifecycle and kind, open any row to manage its plan, payment, entitlements, assets and renewals, or advance its lifecycle."
|
|
108
113
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
114
|
+
/* @__PURE__ */ b(S, {
|
|
115
|
+
treatment: "plain",
|
|
116
|
+
className: "p-3 sm:p-4",
|
|
117
|
+
children: /* @__PURE__ */ x("div", {
|
|
118
|
+
className: "flex flex-col gap-3 md:flex-row md:items-center",
|
|
119
|
+
children: [/* @__PURE__ */ x("form", {
|
|
120
|
+
onSubmit: (e) => {
|
|
121
|
+
e.preventDefault(), L(R.trim()), j(0);
|
|
122
|
+
},
|
|
123
|
+
className: "relative flex-1 min-w-0",
|
|
124
|
+
children: [/* @__PURE__ */ b(v, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ b("input", {
|
|
125
|
+
type: "text",
|
|
126
|
+
"aria-label": "Search relationships by label",
|
|
127
|
+
placeholder: "Search relationships by label…",
|
|
128
|
+
value: R,
|
|
129
|
+
onChange: (e) => z(e.target.value),
|
|
130
|
+
className: "w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
|
|
131
|
+
})]
|
|
132
|
+
}), /* @__PURE__ */ x("div", {
|
|
133
|
+
className: "flex flex-wrap gap-2 sm:flex-nowrap",
|
|
134
|
+
children: [/* @__PURE__ */ b("select", {
|
|
135
|
+
"aria-label": "Filter by kind",
|
|
136
|
+
value: P,
|
|
137
|
+
onChange: (e) => {
|
|
138
|
+
F(e.target.value), j(0);
|
|
139
|
+
},
|
|
140
|
+
className: t(D, "flex-1 sm:flex-none"),
|
|
141
|
+
children: E.map((e) => /* @__PURE__ */ b("option", {
|
|
142
|
+
value: e.value,
|
|
143
|
+
children: e.label
|
|
144
|
+
}, e.value))
|
|
145
|
+
}), /* @__PURE__ */ b("select", {
|
|
146
|
+
"aria-label": "Filter by status",
|
|
147
|
+
value: M,
|
|
148
|
+
onChange: (e) => {
|
|
149
|
+
N(e.target.value), j(0);
|
|
150
|
+
},
|
|
151
|
+
className: t(D, "flex-1 sm:flex-none"),
|
|
152
|
+
children: T.map((e) => /* @__PURE__ */ b("option", {
|
|
153
|
+
value: e.value,
|
|
154
|
+
children: e.label
|
|
155
|
+
}, e.value))
|
|
156
|
+
})]
|
|
157
|
+
})]
|
|
158
|
+
})
|
|
147
159
|
}),
|
|
148
|
-
|
|
160
|
+
V ? /* @__PURE__ */ b(u, { label: "Loading relationships…" }) : H ? /* @__PURE__ */ b(l, {
|
|
149
161
|
message: "Could not load relationships.",
|
|
150
|
-
onRetry: () => void
|
|
151
|
-
}) :
|
|
162
|
+
onRetry: () => void U()
|
|
163
|
+
}) : G.length === 0 ? /* @__PURE__ */ b("div", {
|
|
152
164
|
className: "mt-6",
|
|
153
|
-
children: /* @__PURE__ */
|
|
165
|
+
children: /* @__PURE__ */ b(c, {
|
|
154
166
|
illustration: "empty-data",
|
|
155
|
-
icon: /* @__PURE__ */
|
|
167
|
+
icon: /* @__PURE__ */ b(_, { className: "h-12 w-12" }),
|
|
156
168
|
title: "No relationships found",
|
|
157
|
-
description:
|
|
158
|
-
action: /* @__PURE__ */
|
|
169
|
+
description: I ? `No relationships match "${I}".` : "Add your first recurring relationship to start tracking it.",
|
|
170
|
+
action: /* @__PURE__ */ b("button", {
|
|
159
171
|
type: "button",
|
|
160
|
-
onClick: () =>
|
|
172
|
+
onClick: () => k("/relationships/new"),
|
|
161
173
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
162
174
|
children: "Add relationship"
|
|
163
175
|
})
|
|
164
176
|
})
|
|
165
|
-
}) : /* @__PURE__ */ y
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
/* @__PURE__ */
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
className: "
|
|
196
|
-
children:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
177
|
+
}) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(S, {
|
|
178
|
+
treatment: "plain",
|
|
179
|
+
className: "mt-4 overflow-hidden p-0",
|
|
180
|
+
children: /* @__PURE__ */ b("div", {
|
|
181
|
+
className: "overflow-x-auto",
|
|
182
|
+
children: /* @__PURE__ */ x("div", {
|
|
183
|
+
className: "min-w-[720px]",
|
|
184
|
+
children: [/* @__PURE__ */ x("div", {
|
|
185
|
+
className: "grid grid-cols-[minmax(0,2.4fr)_1fr_1fr_1fr_1fr_1.3fr] gap-4 border-b border-border-seam bg-bg-sunken/60 px-4 py-2.5 text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
186
|
+
children: [
|
|
187
|
+
/* @__PURE__ */ b("span", { children: "Subscription" }),
|
|
188
|
+
/* @__PURE__ */ b("span", { children: "Kind" }),
|
|
189
|
+
/* @__PURE__ */ b("span", { children: "Status" }),
|
|
190
|
+
/* @__PURE__ */ b("span", {
|
|
191
|
+
className: "text-right",
|
|
192
|
+
children: "Amount"
|
|
193
|
+
}),
|
|
194
|
+
/* @__PURE__ */ b("span", {
|
|
195
|
+
className: "text-right",
|
|
196
|
+
children: "Renews on"
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ b("span", { children: "Health" })
|
|
199
|
+
]
|
|
200
|
+
}), /* @__PURE__ */ b("div", {
|
|
201
|
+
className: "divide-y divide-border-subtle",
|
|
202
|
+
children: G.map((e) => {
|
|
203
|
+
let t = e.healthScore;
|
|
204
|
+
return /* @__PURE__ */ x("button", {
|
|
205
|
+
type: "button",
|
|
206
|
+
onClick: () => k(`/relationships/${e.id}`),
|
|
207
|
+
className: "group grid w-full grid-cols-[minmax(0,2.4fr)_1fr_1fr_1fr_1fr_1.3fr] items-center gap-4 px-4 py-3.5 text-left transition-colors hover:bg-bg-sunken",
|
|
208
|
+
children: [
|
|
209
|
+
/* @__PURE__ */ b("div", {
|
|
210
|
+
className: "flex min-w-0 items-center gap-2",
|
|
211
|
+
children: /* @__PURE__ */ x("div", {
|
|
212
|
+
className: "min-w-0",
|
|
213
|
+
children: [/* @__PURE__ */ b("p", {
|
|
214
|
+
className: "truncate text-sm font-semibold text-text-primary",
|
|
215
|
+
children: e.label
|
|
216
|
+
}), e.provider?.name && /* @__PURE__ */ b("p", {
|
|
217
|
+
className: "truncate text-xs text-text-secondary",
|
|
218
|
+
children: e.provider.name
|
|
219
|
+
})]
|
|
220
|
+
})
|
|
221
|
+
}),
|
|
222
|
+
/* @__PURE__ */ b("span", { children: /* @__PURE__ */ b("span", {
|
|
223
|
+
className: "inline-flex items-center rounded-md bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
|
|
224
|
+
children: a(e.kind)
|
|
225
|
+
}) }),
|
|
226
|
+
/* @__PURE__ */ b("span", { children: /* @__PURE__ */ b(s, { status: e.status }) }),
|
|
227
|
+
/* @__PURE__ */ x("span", {
|
|
228
|
+
className: "text-right text-sm font-semibold tabular-nums text-text-primary",
|
|
229
|
+
children: [r(e.amount, e.currency), /* @__PURE__ */ b("span", {
|
|
230
|
+
className: "text-xs font-normal text-text-secondary",
|
|
231
|
+
children: o(e.interval)
|
|
232
|
+
})]
|
|
233
|
+
}),
|
|
234
|
+
/* @__PURE__ */ b("span", {
|
|
235
|
+
className: "text-right text-xs text-text-secondary",
|
|
236
|
+
children: e.renewsAt ? i(e.renewsAt) : "—"
|
|
237
|
+
}),
|
|
238
|
+
/* @__PURE__ */ x("span", {
|
|
239
|
+
className: "flex items-center gap-2",
|
|
240
|
+
children: [t == null ? /* @__PURE__ */ b("span", {
|
|
241
|
+
className: "text-xs text-text-secondary",
|
|
242
|
+
children: "—"
|
|
243
|
+
}) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(d, {
|
|
244
|
+
value: t,
|
|
245
|
+
max: 100,
|
|
246
|
+
tone: O(t),
|
|
247
|
+
className: "w-16 shrink-0 sm:w-20"
|
|
248
|
+
}), /* @__PURE__ */ b("span", {
|
|
249
|
+
className: "text-xs tabular-nums text-text-secondary",
|
|
250
|
+
children: t
|
|
251
|
+
})] }), /* @__PURE__ */ b(h, { className: "ml-auto h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover:opacity-100" })]
|
|
252
|
+
})
|
|
253
|
+
]
|
|
254
|
+
}, e.id);
|
|
214
255
|
})
|
|
215
|
-
]
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
}), /* @__PURE__ */
|
|
256
|
+
})]
|
|
257
|
+
})
|
|
258
|
+
})
|
|
259
|
+
}), /* @__PURE__ */ x("div", {
|
|
219
260
|
className: "mt-4 flex items-center justify-between",
|
|
220
|
-
children: [/* @__PURE__ */
|
|
261
|
+
children: [/* @__PURE__ */ x("p", {
|
|
221
262
|
className: "text-xs text-text-secondary",
|
|
222
263
|
children: [
|
|
223
264
|
"Page ",
|
|
224
|
-
|
|
225
|
-
|
|
265
|
+
A + 1,
|
|
266
|
+
W ? " · refreshing…" : ""
|
|
226
267
|
]
|
|
227
|
-
}), /* @__PURE__ */
|
|
268
|
+
}), /* @__PURE__ */ x("div", {
|
|
228
269
|
className: "flex gap-2",
|
|
229
|
-
children: [/* @__PURE__ */
|
|
270
|
+
children: [/* @__PURE__ */ b("button", {
|
|
230
271
|
type: "button",
|
|
231
|
-
disabled:
|
|
232
|
-
onClick: () =>
|
|
233
|
-
className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium",
|
|
272
|
+
disabled: A === 0,
|
|
273
|
+
onClick: () => j((e) => Math.max(0, e - 1)),
|
|
274
|
+
className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", A === 0 ? "cursor-not-allowed text-text-secondary opacity-50" : "text-text-primary hover:bg-bg-sunken"),
|
|
234
275
|
children: "Previous"
|
|
235
|
-
}), /* @__PURE__ */
|
|
276
|
+
}), /* @__PURE__ */ b("button", {
|
|
236
277
|
type: "button",
|
|
237
|
-
disabled: !
|
|
238
|
-
onClick: () =>
|
|
239
|
-
className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium",
|
|
278
|
+
disabled: !K,
|
|
279
|
+
onClick: () => j((e) => e + 1),
|
|
280
|
+
className: t("rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium", K ? "text-text-primary hover:bg-bg-sunken" : "cursor-not-allowed text-text-secondary opacity-50"),
|
|
240
281
|
children: "Next"
|
|
241
282
|
})]
|
|
242
283
|
})]
|
|
@@ -245,6 +286,6 @@ function T() {
|
|
|
245
286
|
});
|
|
246
287
|
}
|
|
247
288
|
//#endregion
|
|
248
|
-
export {
|
|
289
|
+
export { k as RelationshipsListPage };
|
|
249
290
|
|
|
250
291
|
//# sourceMappingURL=RelationshipsListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationshipsListPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/relationships/RelationshipsListPage.tsx"],"sourcesContent":["/**\n * Relationships list\n * @module subscriberbot/pages/relationships\n *\n * The core CRUDL list — every recurring relationship (subscription /\n * membership / license / contract) in one paginated, filterable view.\n * Data comes from `subListRelationships` (a SubRelationshipConnection).\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Search, Repeat2 } from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useRelationships } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport {\n formatCurrency,\n formatDate,\n formatEnumLabel,\n formatIntervalSuffix,\n} from '../../utils/formatters';\nimport type { SubRelationshipKind, SubRelationshipStatus } from '../../types';\n\nconst PAGE_SIZE = 20;\n\nconst STATUS_OPTIONS: Array<{ value: '' | SubRelationshipStatus; label: string }> = [\n { value: '', label: 'All statuses' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'TRIAL', label: 'Trial' },\n { value: 'PAUSED', label: 'Paused' },\n { value: 'PAST_DUE', label: 'Past due' },\n { value: 'LAPSED', label: 'Lapsed' },\n { value: 'EXPIRED', label: 'Expired' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\nconst KIND_OPTIONS: Array<{ value: '' | SubRelationshipKind; label: string }> = [\n { value: '', label: 'All kinds' },\n { value: 'SUBSCRIPTION', label: 'Subscription' },\n { value: 'MEMBERSHIP', label: 'Membership' },\n { value: 'LICENSE', label: 'License' },\n { value: 'CONTRACT', label: 'Contract' },\n { value: 'NEWSLETTER', label: 'Newsletter' },\n { value: 'RECURRING_PAYMENT', label: 'Recurring payment' },\n { value: 'ENROLLMENT', label: 'Enrollment' },\n { value: 'TRIAL', label: 'Trial' },\n];\n\nexport function RelationshipsListPage() {\n const { navigateTo } = useSubscriberBot();\n const [page, setPage] = useState(0);\n const [statusFilter, setStatusFilter] = useState<'' | SubRelationshipStatus>('');\n const [kindFilter, setKindFilter] = useState<'' | SubRelationshipKind>('');\n const [search, setSearch] = useState('');\n const [searchInput, setSearchInput] = useState('');\n\n const { data, isLoading, isError, refetch, isFetching } = useRelationships({\n status: statusFilter || undefined,\n kind: kindFilter || undefined,\n search: search || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = useMemo(() => data?.items ?? [], [data]);\n const hasMore = data?.pageInfo.hasMore ?? false;\n\n const submitSearch = (e: React.FormEvent) => {\n e.preventDefault();\n setSearch(searchInput.trim());\n setPage(0);\n };\n\n return (\n <PageLayout\n title=\"Relationships\"\n description=\"Every subscription, membership, license and contract you track\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/relationships/new')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" /> Add relationship\n </button>\n }\n >\n <PagePurpose className=\"mb-4\">\n This is the fundamental object of Subscriber Bot. Filter by lifecycle and kind, open any row\n to manage its plan, payment, entitlements, assets and renewals, or advance its lifecycle.\n </PagePurpose>\n\n <EmphasisPanel>\n <form onSubmit={submitSearch} className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search relationships by label…\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </form>\n </EmphasisPanel>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n aria-label=\"Filter by status\"\n value={statusFilter}\n onChange={(e) => {\n setStatusFilter(e.target.value as '' | SubRelationshipStatus);\n setPage(0);\n }}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {STATUS_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n <select\n aria-label=\"Filter by kind\"\n value={kindFilter}\n onChange={(e) => {\n setKindFilter(e.target.value as '' | SubRelationshipKind);\n setPage(0);\n }}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {KIND_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading relationships…\" />\n ) : isError ? (\n <ErrorView message=\"Could not load relationships.\" onRetry={() => void refetch()} />\n ) : items.length === 0 ? (\n <div className=\"mt-6\">\n <EmptyState\n illustration=\"empty-data\"\n icon={<Repeat2 className=\"h-12 w-12\" />}\n title=\"No relationships found\"\n description={\n search\n ? `No relationships match \"${search}\".`\n : 'Add your first recurring relationship to start tracking it.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/relationships/new')}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Add relationship\n </button>\n }\n />\n </div>\n ) : (\n <>\n <div className=\"mt-6 overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"hidden grid-cols-[2fr_1fr_1fr_1fr_1fr] gap-4 border-b border-border-subtle bg-bg-sunken px-4 py-2.5 text-xs font-medium text-text-secondary sm:grid\">\n <span>Relationship</span>\n <span>Kind</span>\n <span>Status</span>\n <span className=\"text-right\">Amount</span>\n <span className=\"text-right\">Renews</span>\n </div>\n <div className=\"divide-y divide-border-subtle\">\n {items.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => navigateTo(`/relationships/${r.id}`)}\n className=\"grid w-full grid-cols-1 gap-2 px-4 py-3 text-left hover:bg-bg-sunken sm:grid-cols-[2fr_1fr_1fr_1fr_1fr] sm:items-center sm:gap-4\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{r.label}</p>\n {r.provider?.name && (\n <p className=\"truncate text-xs text-text-secondary\">{r.provider.name}</p>\n )}\n </div>\n <span className=\"text-xs text-text-secondary\">{formatEnumLabel(r.kind)}</span>\n <span>\n <StatusBadge status={r.status} />\n </span>\n <span className=\"text-sm font-semibold tabular-nums text-text-primary sm:text-right\">\n {formatCurrency(r.amount, r.currency)}\n <span className=\"text-xs font-normal text-text-secondary\">\n {formatIntervalSuffix(r.interval)}\n </span>\n </span>\n <span className=\"text-xs text-text-secondary sm:text-right\">\n {r.renewsAt ? formatDate(r.renewsAt) : '—'}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-xs text-text-secondary\">\n Page {page + 1}\n {isFetching ? ' · refreshing…' : ''}\n </p>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={page === 0}\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n className={cn(\n 'rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium',\n page === 0\n ? 'cursor-not-allowed text-text-secondary opacity-50'\n : 'text-text-primary hover:bg-bg-sunken'\n )}\n >\n Previous\n </button>\n <button\n type=\"button\"\n disabled={!hasMore}\n onClick={() => setPage((p) => p + 1)}\n className={cn(\n 'rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium',\n !hasMore\n ? 'cursor-not-allowed text-text-secondary opacity-50'\n : 'text-text-primary hover:bg-bg-sunken'\n )}\n >\n Next\n </button>\n </div>\n </div>\n </>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RelationshipsListPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/relationships/RelationshipsListPage.tsx"],"sourcesContent":["/**\n * Relationships list\n * @module subscriberbot/pages/relationships\n *\n * The core CRUDL list — every recurring relationship (subscription /\n * membership / license / contract) in one paginated, filterable view.\n * Data comes from `subListRelationships` (a SubRelationshipConnection).\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Search, Repeat2, ChevronRight } from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { MiniProgress } from '../../components';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useRelationships } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport {\n formatCurrency,\n formatDate,\n formatEnumLabel,\n formatIntervalSuffix,\n} from '../../utils/formatters';\nimport type { SubRelationshipKind, SubRelationshipStatus } from '../../types';\n\nconst PAGE_SIZE = 20;\n\nconst STATUS_OPTIONS: Array<{ value: '' | SubRelationshipStatus; label: string }> = [\n { value: '', label: 'All statuses' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'TRIAL', label: 'Trial' },\n { value: 'PAUSED', label: 'Paused' },\n { value: 'PAST_DUE', label: 'Past due' },\n { value: 'LAPSED', label: 'Lapsed' },\n { value: 'EXPIRED', label: 'Expired' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\nconst KIND_OPTIONS: Array<{ value: '' | SubRelationshipKind; label: string }> = [\n { value: '', label: 'All kinds' },\n { value: 'SUBSCRIPTION', label: 'Subscription' },\n { value: 'MEMBERSHIP', label: 'Membership' },\n { value: 'LICENSE', label: 'License' },\n { value: 'CONTRACT', label: 'Contract' },\n { value: 'NEWSLETTER', label: 'Newsletter' },\n { value: 'RECURRING_PAYMENT', label: 'Recurring payment' },\n { value: 'ENROLLMENT', label: 'Enrollment' },\n { value: 'TRIAL', label: 'Trial' },\n];\n\nconst selectCls =\n 'rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\n\n/** Map a 0–100 health score onto a MiniProgress tone. */\nfunction healthTone(\n score: number | null | undefined\n): 'positive' | 'accent' | 'warning' | 'negative' {\n if (score == null) return 'accent';\n if (score >= 66) return 'positive';\n if (score >= 33) return 'warning';\n return 'negative';\n}\n\nexport function RelationshipsListPage() {\n const { navigateTo } = useSubscriberBot();\n const [page, setPage] = useState(0);\n const [statusFilter, setStatusFilter] = useState<'' | SubRelationshipStatus>('');\n const [kindFilter, setKindFilter] = useState<'' | SubRelationshipKind>('');\n const [search, setSearch] = useState('');\n const [searchInput, setSearchInput] = useState('');\n\n const { data, isLoading, isError, refetch, isFetching } = useRelationships({\n status: statusFilter || undefined,\n kind: kindFilter || undefined,\n search: search || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = useMemo(() => data?.items ?? [], [data]);\n const hasMore = data?.pageInfo.hasMore ?? false;\n\n const submitSearch = (e: React.FormEvent) => {\n e.preventDefault();\n setSearch(searchInput.trim());\n setPage(0);\n };\n\n return (\n <PageLayout\n title=\"Relationships\"\n description=\"Every subscription, membership, license and contract you track\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/relationships/new')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" /> Add relationship\n </button>\n }\n >\n <PagePurpose className=\"mb-4\">\n This is the fundamental object of Subscriber Bot. Filter by lifecycle and kind, open any row\n to manage its plan, payment, entitlements, assets and renewals, or advance its lifecycle.\n </PagePurpose>\n\n {/* Toolbar — search + filters, responsive */}\n <GlassCard treatment=\"plain\" className=\"p-3 sm:p-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center\">\n <form onSubmit={submitSearch} className=\"relative flex-1 min-w-0\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n aria-label=\"Search relationships by label\"\n placeholder=\"Search relationships by label…\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </form>\n <div className=\"flex flex-wrap gap-2 sm:flex-nowrap\">\n <select\n aria-label=\"Filter by kind\"\n value={kindFilter}\n onChange={(e) => {\n setKindFilter(e.target.value as '' | SubRelationshipKind);\n setPage(0);\n }}\n className={cn(selectCls, 'flex-1 sm:flex-none')}\n >\n {KIND_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n <select\n aria-label=\"Filter by status\"\n value={statusFilter}\n onChange={(e) => {\n setStatusFilter(e.target.value as '' | SubRelationshipStatus);\n setPage(0);\n }}\n className={cn(selectCls, 'flex-1 sm:flex-none')}\n >\n {STATUS_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </GlassCard>\n\n {isLoading ? (\n <LoadingView label=\"Loading relationships…\" />\n ) : isError ? (\n <ErrorView message=\"Could not load relationships.\" onRetry={() => void refetch()} />\n ) : items.length === 0 ? (\n <div className=\"mt-6\">\n <EmptyState\n illustration=\"empty-data\"\n icon={<Repeat2 className=\"h-12 w-12\" />}\n title=\"No relationships found\"\n description={\n search\n ? `No relationships match \"${search}\".`\n : 'Add your first recurring relationship to start tracking it.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/relationships/new')}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Add relationship\n </button>\n }\n />\n </div>\n ) : (\n <>\n {/* Portfolio table — scrolls horizontally on small screens, never the page */}\n <GlassCard treatment=\"plain\" className=\"mt-4 overflow-hidden p-0\">\n <div className=\"overflow-x-auto\">\n <div className=\"min-w-[720px]\">\n <div className=\"grid grid-cols-[minmax(0,2.4fr)_1fr_1fr_1fr_1fr_1.3fr] gap-4 border-b border-border-seam bg-bg-sunken/60 px-4 py-2.5 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n <span>Subscription</span>\n <span>Kind</span>\n <span>Status</span>\n <span className=\"text-right\">Amount</span>\n <span className=\"text-right\">Renews on</span>\n <span>Health</span>\n </div>\n <div className=\"divide-y divide-border-subtle\">\n {items.map((r) => {\n const score = r.healthScore;\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => navigateTo(`/relationships/${r.id}`)}\n className=\"group grid w-full grid-cols-[minmax(0,2.4fr)_1fr_1fr_1fr_1fr_1.3fr] items-center gap-4 px-4 py-3.5 text-left transition-colors hover:bg-bg-sunken\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-text-primary\">\n {r.label}\n </p>\n {r.provider?.name && (\n <p className=\"truncate text-xs text-text-secondary\">\n {r.provider.name}\n </p>\n )}\n </div>\n </div>\n <span>\n <span className=\"inline-flex items-center rounded-md bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {formatEnumLabel(r.kind)}\n </span>\n </span>\n <span>\n <StatusBadge status={r.status} />\n </span>\n <span className=\"text-right text-sm font-semibold tabular-nums text-text-primary\">\n {formatCurrency(r.amount, r.currency)}\n <span className=\"text-xs font-normal text-text-secondary\">\n {formatIntervalSuffix(r.interval)}\n </span>\n </span>\n <span className=\"text-right text-xs text-text-secondary\">\n {r.renewsAt ? formatDate(r.renewsAt) : '—'}\n </span>\n <span className=\"flex items-center gap-2\">\n {score != null ? (\n <>\n <MiniProgress\n value={score}\n max={100}\n tone={healthTone(score)}\n className=\"w-16 shrink-0 sm:w-20\"\n />\n <span className=\"text-xs tabular-nums text-text-secondary\">\n {score}\n </span>\n </>\n ) : (\n <span className=\"text-xs text-text-secondary\">—</span>\n )}\n <ChevronRight className=\"ml-auto h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover:opacity-100\" />\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </GlassCard>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-xs text-text-secondary\">\n Page {page + 1}\n {isFetching ? ' · refreshing…' : ''}\n </p>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={page === 0}\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n className={cn(\n 'rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium',\n page === 0\n ? 'cursor-not-allowed text-text-secondary opacity-50'\n : 'text-text-primary hover:bg-bg-sunken'\n )}\n >\n Previous\n </button>\n <button\n type=\"button\"\n disabled={!hasMore}\n onClick={() => setPage((p) => p + 1)}\n className={cn(\n 'rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium',\n !hasMore\n ? 'cursor-not-allowed text-text-secondary opacity-50'\n : 'text-text-primary hover:bg-bg-sunken'\n )}\n >\n Next\n </button>\n </div>\n </div>\n </>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ApolloClient } from '@apollo/client';
|
|
2
|
+
import { AssistantArtifact, AssistantMode } from '../types/assistant';
|
|
3
|
+
import { PageContext } from '../utils/pageContext';
|
|
4
|
+
|
|
5
|
+
export interface AssistantPromptResult {
|
|
6
|
+
response: string;
|
|
7
|
+
tokens?: {
|
|
8
|
+
input: number;
|
|
9
|
+
output: number;
|
|
10
|
+
};
|
|
11
|
+
artifacts?: AssistantArtifact[];
|
|
12
|
+
}
|
|
13
|
+
export interface AssistantRawMessagePart {
|
|
14
|
+
type?: string;
|
|
15
|
+
text?: string;
|
|
16
|
+
tool?: string;
|
|
17
|
+
state?: {
|
|
18
|
+
status?: string;
|
|
19
|
+
input?: unknown;
|
|
20
|
+
output?: unknown;
|
|
21
|
+
raw?: unknown;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface AssistantRawMessage {
|
|
25
|
+
info?: {
|
|
26
|
+
id?: string;
|
|
27
|
+
role?: string;
|
|
28
|
+
providerID?: string;
|
|
29
|
+
modelID?: string;
|
|
30
|
+
tokens?: {
|
|
31
|
+
input: number;
|
|
32
|
+
output: number;
|
|
33
|
+
};
|
|
34
|
+
time?: {
|
|
35
|
+
created?: number;
|
|
36
|
+
completed?: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
parts?: AssistantRawMessagePart[];
|
|
40
|
+
}
|
|
41
|
+
export interface AssistantSandboxAuthContext {
|
|
42
|
+
accessToken?: string | null;
|
|
43
|
+
workspaceToken?: string | null;
|
|
44
|
+
userId?: string | null;
|
|
45
|
+
organizationId?: string | null;
|
|
46
|
+
}
|
|
47
|
+
export interface AssistantSessionInfo {
|
|
48
|
+
id: string;
|
|
49
|
+
mode: string;
|
|
50
|
+
}
|
|
51
|
+
export interface DownloadedAssistantArtifact {
|
|
52
|
+
filename: string;
|
|
53
|
+
mimeType: string;
|
|
54
|
+
contentBase64: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function findExistingSandbox(_apollo: ApolloClient, workspaceId: string, mode: AssistantMode, authContext?: AssistantSandboxAuthContext): Promise<string | null>;
|
|
57
|
+
export declare function createAssistantSandbox(_apollo: ApolloClient, mode: AssistantMode, workspaceId: string, authContext?: AssistantSandboxAuthContext): Promise<string>;
|
|
58
|
+
export declare function waitForSandboxReady(_apollo: ApolloClient, sandboxId: string, workspaceId: string, authContext?: AssistantSandboxAuthContext, maxWaitMs?: number, onProgress?: (message: string) => void): Promise<void>;
|
|
59
|
+
export declare function waitForAssistantServiceReady(apollo: ApolloClient, sandboxId: string, workspaceId: string, authContext?: AssistantSandboxAuthContext, maxWaitMs?: number, onProgress?: (message: string) => void): Promise<void>;
|
|
60
|
+
export declare function createAssistantSession(apollo: ApolloClient, sandboxId: string, workspaceId: string, mode: AssistantMode, authContext?: AssistantSandboxAuthContext): Promise<{
|
|
61
|
+
sessionId: string;
|
|
62
|
+
}>;
|
|
63
|
+
export declare function sendAssistantPromptAsync(apollo: ApolloClient, sandboxId: string, workspaceId: string, sessionId: string, prompt: string, mode: AssistantMode, pageContext?: PageContext, authContext?: AssistantSandboxAuthContext): Promise<void>;
|
|
64
|
+
export declare function getAssistantMessages(apollo: ApolloClient, sandboxId: string, workspaceId: string, sessionId: string, authContext?: AssistantSandboxAuthContext, limit?: number): Promise<AssistantRawMessage[]>;
|
|
65
|
+
export declare function extendAssistantSandboxTTL(_apollo: ApolloClient, sandboxId: string, workspaceId: string, additionalSeconds?: number, authContext?: AssistantSandboxAuthContext): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=assistantApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistantApi.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/services/assistantApi.ts"],"names":[],"mappings":"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"}
|