@stapel/workspaces-react 0.6.0 → 0.7.0
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/CHANGELOG.md +14 -0
- package/dist/api/generated/schema.d.ts +384 -4
- package/dist/api/generated/schema.d.ts.map +1 -1
- package/dist/api/types.d.ts +20 -5
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/workspacesApi.d.ts +23 -1
- package/dist/api/workspacesApi.d.ts.map +1 -1
- package/dist/api/workspacesApi.js +4 -0
- package/dist/api/workspacesApi.js.map +1 -1
- package/dist/default/InviteAcceptPage.d.ts +28 -0
- package/dist/default/InviteAcceptPage.d.ts.map +1 -0
- package/dist/default/InviteAcceptPage.js +141 -0
- package/dist/default/InviteAcceptPage.js.map +1 -0
- package/dist/default/MembersManager.d.ts +4 -4
- package/dist/default/MembersManager.d.ts.map +1 -1
- package/dist/default/MembersManager.js +61 -56
- package/dist/default/MembersManager.js.map +1 -1
- package/dist/default/index.d.ts +2 -0
- package/dist/default/index.d.ts.map +1 -1
- package/dist/default/index.js +1 -0
- package/dist/default/index.js.map +1 -1
- package/dist/flows/inviteAcceptFlow.d.ts +155 -0
- package/dist/flows/inviteAcceptFlow.d.ts.map +1 -0
- package/dist/flows/inviteAcceptFlow.js +126 -0
- package/dist/flows/inviteAcceptFlow.js.map +1 -0
- package/dist/headless/Can.d.ts +40 -0
- package/dist/headless/Can.d.ts.map +1 -0
- package/dist/headless/Can.js +30 -0
- package/dist/headless/Can.js.map +1 -0
- package/dist/headless/InviteAcceptFlow.d.ts +44 -0
- package/dist/headless/InviteAcceptFlow.d.ts.map +1 -0
- package/dist/headless/InviteAcceptFlow.js +67 -0
- package/dist/headless/InviteAcceptFlow.js.map +1 -0
- package/dist/headless/RoleSelect.d.ts +41 -0
- package/dist/headless/RoleSelect.d.ts.map +1 -0
- package/dist/headless/RoleSelect.js +34 -0
- package/dist/headless/RoleSelect.js.map +1 -0
- package/dist/i18n/generated/errors.gen.d.ts +48 -0
- package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.gen.js +24 -0
- package/dist/i18n/generated/errors.gen.js.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.js +8 -0
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -1
- package/dist/i18n/keys.d.ts +28 -0
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +64 -0
- package/dist/i18n/keys.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +30 -0
- package/dist/i18n/ru.js.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/model/capabilities.d.ts +21 -0
- package/dist/model/capabilities.d.ts.map +1 -0
- package/dist/model/capabilities.js +32 -0
- package/dist/model/capabilities.js.map +1 -0
- package/dist/model/emailMask.d.ts +22 -0
- package/dist/model/emailMask.d.ts.map +1 -0
- package/dist/model/emailMask.js +36 -0
- package/dist/model/emailMask.js.map +1 -0
- package/dist/model/mutations.d.ts +23 -3
- package/dist/model/mutations.d.ts.map +1 -1
- package/dist/model/mutations.js +39 -1
- package/dist/model/mutations.js.map +1 -1
- package/dist/model/queries.d.ts +37 -1
- package/dist/model/queries.d.ts.map +1 -1
- package/dist/model/queries.js +49 -0
- package/dist/model/queries.js.map +1 -1
- package/dist/model/queryKeys.d.ts +2 -0
- package/dist/model/queryKeys.d.ts.map +1 -1
- package/dist/model/queryKeys.js +6 -0
- package/dist/model/queryKeys.js.map +1 -1
- package/llms.txt +40 -15
- package/manifest.json +225 -3
- package/package.json +4 -4
- package/src/analytics/generated/events.json +1 -1
- package/src/api/generated/schema.ts +384 -4
- package/src/api/types.ts +20 -5
- package/src/api/workspacesApi.ts +50 -0
- package/src/default/InviteAcceptPage.tsx +373 -0
- package/src/default/MembersManager.tsx +155 -145
- package/src/default/index.ts +2 -0
- package/src/flows/inviteAcceptFlow.ts +289 -0
- package/src/headless/Can.tsx +49 -0
- package/src/headless/InviteAcceptFlow.tsx +105 -0
- package/src/headless/RoleSelect.tsx +58 -0
- package/src/i18n/generated/errors.gen.ts +24 -0
- package/src/i18n/generated/errors.json +62 -0
- package/src/i18n/generated/errors.ru.gen.ts +8 -0
- package/src/i18n/keys.ts +68 -0
- package/src/i18n/ru.ts +34 -0
- package/src/index.ts +26 -0
- package/src/model/capabilities.ts +37 -0
- package/src/model/emailMask.ts +37 -0
- package/src/model/mutations.ts +56 -4
- package/src/model/queries.ts +73 -0
- package/src/model/queryKeys.ts +10 -0
|
@@ -39,6 +39,10 @@ export function createWorkspacesApi(client) {
|
|
|
39
39
|
updateMemberRole: (workspaceId, userId, patch) => client.patch(`/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(userId)}`, patch, mutating()),
|
|
40
40
|
removeMember: (workspaceId, userId) => client.delete(`/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(userId)}`, mutating()),
|
|
41
41
|
acceptInvitation: (body) => client.post("/invitations/accept", body, mutating()),
|
|
42
|
+
getInvitationPreview: (token) => client.get(`/invitations/${encodeURIComponent(token)}`),
|
|
43
|
+
claimInvitation: (token) => client.post(`/invitations/${encodeURIComponent(token)}/claim`, undefined, mutating()),
|
|
44
|
+
declineInvitation: (token) => client.post(`/invitations/${encodeURIComponent(token)}/decline`, undefined, mutating()),
|
|
45
|
+
listRoles: () => client.get("/roles"),
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
48
|
//# sourceMappingURL=workspacesApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspacesApi.js","sourceRoot":"","sources":["../../src/api/workspacesApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspacesApi.js","sourceRoot":"","sources":["../../src/api/workspacesApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from "react";
|
|
2
|
+
import type { Member } from "../api/types.js";
|
|
3
|
+
export interface InviteAcceptPageProps {
|
|
4
|
+
/** The invite token from the route — a bearer secret, never log it. */
|
|
5
|
+
readonly token: string;
|
|
6
|
+
/** The signed-in account's email, or null/undefined when no session
|
|
7
|
+
* (e.g. auth-react's `useAuthSessionState().user?.email ?? null`). */
|
|
8
|
+
readonly sessionEmail?: string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Exchange the login grant at auth (the §B4 seam — see the module doc).
|
|
11
|
+
* Resolve = signed in (the page advances); reject = retry offered.
|
|
12
|
+
*/
|
|
13
|
+
readonly onLoginGrant?: (grantToken: string) => void | Promise<void>;
|
|
14
|
+
/** Login slot for `loginRequired` (registered invitee, no session). */
|
|
15
|
+
readonly renderLoginPanel?: (ctx: {
|
|
16
|
+
onLoggedIn: (email: string) => void;
|
|
17
|
+
}) => ReactNode;
|
|
18
|
+
/** Basic-data slot for `basicData` (fresh account). Omitted → auto-skip. */
|
|
19
|
+
readonly renderInitialSetup?: (ctx: {
|
|
20
|
+
onDone: () => void;
|
|
21
|
+
}) => ReactNode;
|
|
22
|
+
/** Wrong-account CTA (sign out / switch). Omitted → CTA hidden. */
|
|
23
|
+
readonly onSwitchAccount?: () => void;
|
|
24
|
+
readonly onAccepted?: (member: Member) => void;
|
|
25
|
+
readonly onDeclined?: () => void;
|
|
26
|
+
}
|
|
27
|
+
export declare function InviteAcceptPage(props: InviteAcceptPageProps): ReactElement;
|
|
28
|
+
//# sourceMappingURL=InviteAcceptPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteAcceptPage.d.ts","sourceRoot":"","sources":["../../src/default/InviteAcceptPage.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGjE,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;0EACsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,uEAAuE;IACvE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE;QAChC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACrC,KAAK,SAAS,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC;IACzE,mEAAmE;IACnE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CA4B3E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<InviteAcceptPage/>` — the default `/invite/{token}` route component
|
|
4
|
+
* (org-program §B4): every state of the `InviteAcceptFlow` headless journey
|
|
5
|
+
* rendered with antd, with the two HOST SLOTS the pair cannot own:
|
|
6
|
+
*
|
|
7
|
+
* - `renderLoginPanel` — the sign-in surface for a registered invitee
|
|
8
|
+
* without a session (drop auth-react's `<AuthPanel/>` in; call
|
|
9
|
+
* `onLoggedIn(email)` — or simply let the `sessionEmail` prop update,
|
|
10
|
+
* the flow re-routes on it automatically).
|
|
11
|
+
* - `renderInitialSetup` — the basic-data step for a freshly created
|
|
12
|
+
* account (drop profiles-react's `InitialSetupPrompt`/`InitialSetupModal`
|
|
13
|
+
* in; call `onDone()`). Omitted → the step auto-skips.
|
|
14
|
+
*
|
|
15
|
+
* THE GRANT SEAM (§B4): for a NEW user the flow mints a login grant and this
|
|
16
|
+
* page hands it to YOUR `onLoginGrant(grantToken)` — wire it to auth-react's
|
|
17
|
+
* `api.exchangeLoginGrant(grantToken)` + `session.adopt(...)`. When your
|
|
18
|
+
* callback's promise resolves the page advances the flow automatically
|
|
19
|
+
* (`grantExchanged`); a rejection shows a retry. The pairs stay decoupled:
|
|
20
|
+
* this package never imports auth-react.
|
|
21
|
+
*
|
|
22
|
+
* Like the pair's other default skins (MembersManager/WorkspaceSettings),
|
|
23
|
+
* theming comes from the host's antd ConfigProvider — this is a route BODY,
|
|
24
|
+
* not a self-themed shell.
|
|
25
|
+
*/
|
|
26
|
+
import { useEffect, useRef, useState } from "react";
|
|
27
|
+
import { Alert, Button, Card, Flex, Result, Spin, Typography } from "antd";
|
|
28
|
+
import { useFormatFlowError, useT } from "@stapel/core";
|
|
29
|
+
import { InviteAcceptFlow } from "../headless/InviteAcceptFlow.js";
|
|
30
|
+
import { WORKSPACES_I18N_KEYS } from "../i18n/keys.js";
|
|
31
|
+
export function InviteAcceptPage(props) {
|
|
32
|
+
return (_jsx(InviteAcceptFlow, { token: props.token, sessionEmail: props.sessionEmail ?? null, ...(props.onAccepted !== undefined ? { onAccepted: props.onAccepted } : {}), ...(props.onDeclined !== undefined ? { onDeclined: props.onDeclined } : {}), children: (bag) => (_jsx(PageBody, { bag: bag, sessionEmail: props.sessionEmail ?? null, ...(props.onLoginGrant !== undefined
|
|
33
|
+
? { onLoginGrant: props.onLoginGrant }
|
|
34
|
+
: {}), ...(props.renderLoginPanel !== undefined
|
|
35
|
+
? { renderLoginPanel: props.renderLoginPanel }
|
|
36
|
+
: {}), ...(props.renderInitialSetup !== undefined
|
|
37
|
+
? { renderInitialSetup: props.renderInitialSetup }
|
|
38
|
+
: {}), ...(props.onSwitchAccount !== undefined
|
|
39
|
+
? { onSwitchAccount: props.onSwitchAccount }
|
|
40
|
+
: {}) })) }));
|
|
41
|
+
}
|
|
42
|
+
const UNAVAILABLE_KEY = {
|
|
43
|
+
expired: WORKSPACES_I18N_KEYS.inviteUnavailableExpired,
|
|
44
|
+
revoked: WORKSPACES_I18N_KEYS.inviteUnavailableRevoked,
|
|
45
|
+
accepted: WORKSPACES_I18N_KEYS.inviteUnavailableAccepted,
|
|
46
|
+
declined: WORKSPACES_I18N_KEYS.inviteUnavailableDeclined,
|
|
47
|
+
};
|
|
48
|
+
function InviteHeader(props) {
|
|
49
|
+
const t = useT();
|
|
50
|
+
return (_jsxs(Flex, { vertical: true, gap: 4, children: [_jsx(Typography.Title, { level: 3, style: { margin: 0 }, children: t(WORKSPACES_I18N_KEYS.inviteAcceptTitle, {
|
|
51
|
+
workspace: props.preview.workspace_name,
|
|
52
|
+
}) }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.inviteRoleLine, { role: props.preview.role }) }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.inviteEmailLine, {
|
|
53
|
+
email: props.preview.email_masked,
|
|
54
|
+
}) })] }));
|
|
55
|
+
}
|
|
56
|
+
/** A real component (not hooks in the render-prop lambda) — owns the
|
|
57
|
+
* grant-exchange effect below. */
|
|
58
|
+
function PageBody(props) {
|
|
59
|
+
const t = useT();
|
|
60
|
+
const formatError = useFormatFlowError();
|
|
61
|
+
const { bag } = props;
|
|
62
|
+
const s = bag.state;
|
|
63
|
+
// ── the grant seam: run the host's exchange when the grant is issued ──────
|
|
64
|
+
const { onLoginGrant, renderInitialSetup } = props;
|
|
65
|
+
const grantToken = s.step === "grantIssued" ? s.grantToken : null;
|
|
66
|
+
const [exchangeFailed, setExchangeFailed] = useState(false);
|
|
67
|
+
const exchangedRef = useRef(null);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (grantToken === null || onLoginGrant === undefined)
|
|
70
|
+
return;
|
|
71
|
+
if (exchangedRef.current === grantToken)
|
|
72
|
+
return; // once per grant
|
|
73
|
+
exchangedRef.current = grantToken;
|
|
74
|
+
setExchangeFailed(false);
|
|
75
|
+
void (async () => {
|
|
76
|
+
try {
|
|
77
|
+
await onLoginGrant(grantToken);
|
|
78
|
+
bag.grantExchanged();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// The grant is single-use server-side but un-consumed on a network
|
|
82
|
+
// fault; retry re-runs the host callback with the SAME token.
|
|
83
|
+
exchangedRef.current = null;
|
|
84
|
+
setExchangeFailed(true);
|
|
85
|
+
}
|
|
86
|
+
})();
|
|
87
|
+
}, [grantToken, onLoginGrant, bag]);
|
|
88
|
+
// ── basic-data auto-skip when the host provides no slot ───────────────────
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (s.step === "basicData" && renderInitialSetup === undefined) {
|
|
91
|
+
bag.completeBasicData();
|
|
92
|
+
}
|
|
93
|
+
}, [s.step, renderInitialSetup, bag]);
|
|
94
|
+
switch (s.step) {
|
|
95
|
+
case "idle":
|
|
96
|
+
case "loadingPreview":
|
|
97
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, align: "center", gap: "middle", children: [_jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.inviteLoading) }), _jsx(Spin, {})] }) }));
|
|
98
|
+
case "previewError":
|
|
99
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsx(Alert, { type: "error", showIcon: true, message: formatError(s.error) }) }));
|
|
100
|
+
case "unavailable":
|
|
101
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsx(Result, { status: "info", title: s.preview.workspace_name, subTitle: t(UNAVAILABLE_KEY[s.status] ??
|
|
102
|
+
WORKSPACES_I18N_KEYS.inviteUnavailableRevoked) }) }));
|
|
103
|
+
case "wrongAccount":
|
|
104
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, gap: "middle", children: [_jsx(InviteHeader, { preview: s.preview }), _jsx(Alert, { type: "warning", showIcon: true, message: t(WORKSPACES_I18N_KEYS.inviteWrongAccount), description: t(WORKSPACES_I18N_KEYS.inviteWrongAccountHint, {
|
|
105
|
+
email: props.sessionEmail ?? "",
|
|
106
|
+
invited: s.preview.email_masked,
|
|
107
|
+
}) }), props.onSwitchAccount && (_jsx(Button, { onClick: props.onSwitchAccount, "data-analytics": "flow", children: t(WORKSPACES_I18N_KEYS.inviteSwitchAccountCta) }))] }) }));
|
|
108
|
+
case "loginRequired":
|
|
109
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, gap: "middle", children: [_jsx(InviteHeader, { preview: s.preview }), _jsx(Typography.Text, { strong: true, children: t(WORKSPACES_I18N_KEYS.inviteLoginTitle) }), props.renderLoginPanel?.({
|
|
110
|
+
onLoggedIn: (email) => bag.sessionEstablished(email),
|
|
111
|
+
})] }) }));
|
|
112
|
+
case "newUser":
|
|
113
|
+
case "claiming":
|
|
114
|
+
case "claimError":
|
|
115
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, gap: "middle", children: [_jsx(InviteHeader, { preview: s.preview }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.inviteNewUserHint, {
|
|
116
|
+
email: s.preview.email_masked,
|
|
117
|
+
}) }), s.step === "claimError" && (_jsx(Alert, { type: "error", showIcon: true, message: formatError(s.error) })), _jsx(Button, { type: "primary", loading: s.step === "claiming", onClick: () => bag.claim(), "data-analytics": "flow", children: t(s.step === "claiming"
|
|
118
|
+
? WORKSPACES_I18N_KEYS.inviteClaiming
|
|
119
|
+
: WORKSPACES_I18N_KEYS.inviteCreateAccountCta) })] }) }));
|
|
120
|
+
case "grantIssued":
|
|
121
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsx(Flex, { vertical: true, align: "center", gap: "middle", children: exchangeFailed ? (_jsxs(_Fragment, { children: [_jsx(Alert, { type: "error", showIcon: true, message: t(WORKSPACES_I18N_KEYS.inviteExchangeFailed) }), _jsx(Button, { type: "primary", onClick: () => {
|
|
122
|
+
// Re-arm the effect for the same grant token.
|
|
123
|
+
exchangedRef.current = null;
|
|
124
|
+
setExchangeFailed(false);
|
|
125
|
+
}, "data-analytics": "flow", children: t(WORKSPACES_I18N_KEYS.inviteRetryCta) })] })) : (_jsxs(_Fragment, { children: [_jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.inviteExchanging) }), _jsx(Spin, {})] })) }) }));
|
|
126
|
+
case "basicData":
|
|
127
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, gap: "middle", children: [_jsx(Typography.Title, { level: 4, style: { margin: 0 }, children: t(WORKSPACES_I18N_KEYS.inviteBasicDataTitle) }), renderInitialSetup ? (renderInitialSetup({ onDone: () => bag.completeBasicData() })) : (_jsx(Spin, {}))] }) }));
|
|
128
|
+
case "acceptPrompt":
|
|
129
|
+
case "accepting":
|
|
130
|
+
case "declining":
|
|
131
|
+
case "acceptError":
|
|
132
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsxs(Flex, { vertical: true, gap: "middle", children: [_jsx(InviteHeader, { preview: s.preview }), s.step === "acceptError" && (_jsx(Alert, { type: "error", showIcon: true, message: formatError(s.error) })), _jsxs(Flex, { gap: "small", children: [_jsx(Button, { type: "primary", loading: s.step === "accepting", disabled: s.step === "declining", onClick: () => bag.accept(), "data-analytics": "flow", children: t(WORKSPACES_I18N_KEYS.inviteJoinCta) }), _jsx(Button, { danger: true, loading: s.step === "declining", disabled: s.step === "accepting", onClick: () => bag.decline(), "data-analytics": "flow", children: t(WORKSPACES_I18N_KEYS.inviteDeclineCta) })] })] }) }));
|
|
133
|
+
case "accepted":
|
|
134
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsx(Result, { status: "success", title: t(WORKSPACES_I18N_KEYS.inviteAccepted, {
|
|
135
|
+
workspace: s.preview.workspace_name,
|
|
136
|
+
}) }) }));
|
|
137
|
+
case "declined":
|
|
138
|
+
return (_jsx(Card, { "data-testid": "invite-accept-page", children: _jsx(Result, { status: "info", title: s.preview.workspace_name, subTitle: t(WORKSPACES_I18N_KEYS.inviteDeclined) }) }));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=InviteAcceptPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteAcceptPage.js","sourceRoot":"","sources":["../../src/default/InviteAcceptPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,10 @@ export interface MembersManagerProps {
|
|
|
3
3
|
workspaceId: string;
|
|
4
4
|
/**
|
|
5
5
|
* Whether the caller may invite, change roles, and remove members. The
|
|
6
|
-
* host already knows the caller's own
|
|
7
|
-
* `
|
|
8
|
-
* re-derive it — pass `false` for a
|
|
9
|
-
*
|
|
6
|
+
* host already knows the caller's own verdict in this workspace (e.g.
|
|
7
|
+
* `useCapabilities(workspaceId).can("members.invite")`, or the coarser
|
|
8
|
+
* `my_role`); this component doesn't re-derive it — pass `false` for a
|
|
9
|
+
* read-only roster. Default `true`.
|
|
10
10
|
*/
|
|
11
11
|
canManage?: boolean;
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersManager.d.ts","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MembersManager.d.ts","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAU1C,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CA0JvE"}
|
|
@@ -5,73 +5,78 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
* инвайты)"). Built entirely on this pair's EXISTING `Members` headless
|
|
6
6
|
* wrapper (`useMembers`/`useInviteMembers`/`useUpdateMemberRole`/
|
|
7
7
|
* `useRemoveMember`) — no new backend surface.
|
|
8
|
+
*
|
|
9
|
+
* Roles come from the EFFECTIVE registry via the `RoleSelect` headless
|
|
10
|
+
* (GET /roles, org-program §A2) — not a hardcoded builtin four: a deployment
|
|
11
|
+
* that overlays `STAPEL_WORKSPACES["ROLES"]` (e.g. a `secretary`) sees its
|
|
12
|
+
* roles here with `workspaces.role.<key>` labels (client-bundle merge,
|
|
13
|
+
* raw-name fallback). `owner` is offered only in the member-row select (the
|
|
14
|
+
* backend enforces "only an owner grants owner" and last-owner protection);
|
|
15
|
+
* the invite dialog filters it out, as before.
|
|
8
16
|
*/
|
|
9
17
|
import { useState } from "react";
|
|
10
18
|
import { Alert, Button, Card, Input, Modal, Popconfirm, Select, Table, Typography } from "antd";
|
|
11
19
|
import { useT } from "@stapel/core";
|
|
12
20
|
import { Members } from "../headless/Members.js";
|
|
21
|
+
import { RoleSelect } from "../headless/RoleSelect.js";
|
|
13
22
|
import { WORKSPACES_I18N_KEYS } from "../i18n/keys.js";
|
|
14
|
-
const
|
|
15
|
-
const ROLE_KEY = {
|
|
16
|
-
owner: "roleOwner",
|
|
17
|
-
admin: "roleAdmin",
|
|
18
|
-
member: "roleMember",
|
|
19
|
-
viewer: "roleViewer",
|
|
20
|
-
};
|
|
21
|
-
function isWorkspaceRole(value) {
|
|
22
|
-
return ROLES.includes(value);
|
|
23
|
-
}
|
|
23
|
+
const DEFAULT_INVITE_ROLE = "member";
|
|
24
24
|
export function MembersManager(props) {
|
|
25
25
|
const t = useT();
|
|
26
26
|
const canManage = props.canManage ?? true;
|
|
27
27
|
const [inviteOpen, setInviteOpen] = useState(false);
|
|
28
28
|
const [emailsText, setEmailsText] = useState("");
|
|
29
|
-
const [inviteRole, setInviteRole] = useState(
|
|
30
|
-
return (_jsx(Members, { workspaceId: props.workspaceId, children: ({ members, isLoading, isError, error, invite, isInviting, updateRole, remove }) => {
|
|
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
|
-
|
|
29
|
+
const [inviteRole, setInviteRole] = useState(DEFAULT_INVITE_ROLE);
|
|
30
|
+
return (_jsx(RoleSelect, { children: (rolesBag) => (_jsx(Members, { workspaceId: props.workspaceId, children: ({ members, isLoading, isError, error, invite, isInviting, updateRole, remove }) => {
|
|
31
|
+
const { labelFor } = rolesBag;
|
|
32
|
+
const roleOptions = rolesBag.roles.map((r) => ({
|
|
33
|
+
value: r.role,
|
|
34
|
+
label: labelFor(r.role),
|
|
35
|
+
}));
|
|
36
|
+
const inviteRoleOptions = roleOptions.filter((o) => o.value !== "owner");
|
|
37
|
+
function openInvite() {
|
|
38
|
+
setEmailsText("");
|
|
39
|
+
setInviteRole(DEFAULT_INVITE_ROLE);
|
|
40
|
+
setInviteOpen(true);
|
|
41
|
+
}
|
|
42
|
+
function submitInvite() {
|
|
43
|
+
const emails = emailsText
|
|
44
|
+
.split(/[,\s]+/)
|
|
45
|
+
.map((e) => e.trim())
|
|
46
|
+
.filter((e) => e.length > 0);
|
|
47
|
+
if (emails.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
invite({ emails, role: inviteRole });
|
|
50
|
+
setInviteOpen(false);
|
|
51
|
+
}
|
|
52
|
+
const columns = [
|
|
53
|
+
{
|
|
54
|
+
title: "Email",
|
|
55
|
+
dataIndex: "email",
|
|
56
|
+
key: "email",
|
|
57
|
+
render: (value) => value ?? "—",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
title: t(WORKSPACES_I18N_KEYS.membersInviteRoleLabel),
|
|
61
|
+
key: "role",
|
|
62
|
+
render: (_, member) => canManage ? (_jsx(Select, { value: member.role, style: { width: 160 }, loading: rolesBag.isLoading, onChange: (next) => updateRole({ userId: member.user_id, role: next }),
|
|
63
|
+
// A member's CURRENT role may be missing from the
|
|
64
|
+
// registry options (a deployment removed an overlay
|
|
65
|
+
// role) — antd shows the raw value then, which matches
|
|
66
|
+
// labelFor's raw-name fallback contract.
|
|
67
|
+
options: roleOptions })) : (_jsx("span", { children: labelFor(member.role) })),
|
|
59
68
|
},
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
value: r,
|
|
73
|
-
label: t(WORKSPACES_I18N_KEYS[ROLE_KEY[r]]),
|
|
74
|
-
})) })] })] }) })] }));
|
|
75
|
-
} }));
|
|
69
|
+
...(canManage
|
|
70
|
+
? [
|
|
71
|
+
{
|
|
72
|
+
title: "",
|
|
73
|
+
key: "actions",
|
|
74
|
+
render: (_, member) => (_jsx(Popconfirm, { title: t(WORKSPACES_I18N_KEYS.membersRemoveConfirm), onConfirm: () => remove(member.user_id), children: _jsx(Button, { danger: true, type: "link", children: t(WORKSPACES_I18N_KEYS.membersRemove) }) })),
|
|
75
|
+
},
|
|
76
|
+
]
|
|
77
|
+
: []),
|
|
78
|
+
];
|
|
79
|
+
return (_jsxs(Card, { "data-testid": "members-manager", children: [_jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 16 }, children: [_jsxs("div", { children: [_jsx(Typography.Title, { level: 4, style: { marginTop: 0 }, children: t(WORKSPACES_I18N_KEYS.membersTitle) }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.membersSubtitle) })] }), canManage && (_jsx(Button, { type: "primary", onClick: openInvite, "data-analytics": "none", "data-analytics-reason": "local-ui-open-invite-dialog", children: t(WORKSPACES_I18N_KEYS.membersInvite) }))] }), isError && error && (_jsx(Alert, { style: { marginTop: 12 }, type: "error", showIcon: true, message: error.message })), _jsx(Table, { style: { marginTop: 16 }, size: "small", loading: isLoading, rowKey: (member) => member.id, dataSource: members, columns: columns, pagination: false }), _jsx(Modal, { title: t(WORKSPACES_I18N_KEYS.membersInviteDialogTitle), open: inviteOpen, onCancel: () => setInviteOpen(false), onOk: submitInvite, okButtonProps: { loading: isInviting, disabled: emailsText.trim().length === 0 }, children: _jsxs("div", { style: { display: "grid", gap: 12 }, children: [_jsxs("div", { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteEmailsLabel) }), _jsx(Input, { value: emailsText, onChange: (e) => setEmailsText(e.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersInviteEmailsPlaceholder) })] }), _jsxs("div", { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteRoleLabel) }), _jsx(Select, { value: inviteRole, onChange: setInviteRole, style: { width: "100%" }, loading: rolesBag.isLoading, options: inviteRoleOptions })] })] }) })] }));
|
|
80
|
+
} })) }));
|
|
76
81
|
}
|
|
77
82
|
//# sourceMappingURL=MembersManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersManager.js","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"MembersManager.js","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":"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"}
|
package/dist/default/index.d.ts
CHANGED
|
@@ -15,4 +15,6 @@ export { WorkspaceSettings } from "./WorkspaceSettings.js";
|
|
|
15
15
|
export type { WorkspaceSettingsProps } from "./WorkspaceSettings.js";
|
|
16
16
|
export { MembersManager } from "./MembersManager.js";
|
|
17
17
|
export type { MembersManagerProps } from "./MembersManager.js";
|
|
18
|
+
export { InviteAcceptPage } from "./InviteAcceptPage.js";
|
|
19
|
+
export type { InviteAcceptPageProps } from "./InviteAcceptPage.js";
|
|
18
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/default/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Analytics } from "@stapel/core";
|
|
2
|
+
import type { FlowMachine } from "@stapel/core";
|
|
3
|
+
import type { WorkspacesApi } from "../api/workspacesApi.js";
|
|
4
|
+
import type { InvitationPreview, Member } from "../api/types.js";
|
|
5
|
+
import type { FlowError } from "./errors.js";
|
|
6
|
+
/**
|
|
7
|
+
* The `/invite/{token}` journey (org-program §B4) as a flow machine:
|
|
8
|
+
*
|
|
9
|
+
* ```
|
|
10
|
+
* preview → (session && email match) → acceptPrompt [accept/decline]
|
|
11
|
+
* → (session && email mismatch) → wrongAccount (logout CTA)
|
|
12
|
+
* → (no session, email_registered)→ loginRequired (host's login slot)
|
|
13
|
+
* → (no session, new user) → newUser → claim →
|
|
14
|
+
* grantIssued (grant_token handed OUT) → [host exchanges at auth]
|
|
15
|
+
* → basicData (host's initial-setup slot) → acceptPrompt
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Non-`pending` invitations (expired / revoked / accepted / declined) park in
|
|
19
|
+
* the terminal `unavailable` step — the page renders the matching copy.
|
|
20
|
+
*
|
|
21
|
+
* ## The grant_token seam (deliberate pair boundary)
|
|
22
|
+
*
|
|
23
|
+
* `claim` mints a login grant that must be exchanged at AUTH's
|
|
24
|
+
* `POST /grant/exchange/` — an endpoint of the auth pair, and pairs do NOT
|
|
25
|
+
* depend on each other (no auth-react peer dependency here). The flow
|
|
26
|
+
* therefore parks in `grantIssued` and hands `grantToken` OUT via the
|
|
27
|
+
* `onLoginGrant` callback; the HOST connects the two pairs:
|
|
28
|
+
*
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <InviteAcceptFlow token={token}
|
|
31
|
+
* onLoginGrant={async (grant) => {
|
|
32
|
+
* const r = await authApi.exchangeLoginGrant(grant); // auth-react
|
|
33
|
+
* session.adopt(r); // full session
|
|
34
|
+
* }}>
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* then calls `grantExchanged()` (the default `InviteAcceptPage` does this
|
|
38
|
+
* automatically when the host's `onLoginGrant` promise resolves), which moves
|
|
39
|
+
* the flow to `basicData` — the host's profiles-react `InitialSetupPrompt`
|
|
40
|
+
* slot — and `completeBasicData()` finally reaches `acceptPrompt`. The
|
|
41
|
+
* account created by the exchange IS the invited email's account (verified by
|
|
42
|
+
* construction), so no re-match happens on that path.
|
|
43
|
+
*
|
|
44
|
+
* ## Session/email detection
|
|
45
|
+
*
|
|
46
|
+
* The pair has no auth dependency, so the CALLER supplies the signed-in
|
|
47
|
+
* email (`sessionEmail`, e.g. auth-react's `useAuthSessionState().user?.email`
|
|
48
|
+
* — or any other session source; null/undefined = no session). Match against
|
|
49
|
+
* the preview's MASKED email is decided client-side by masking the known
|
|
50
|
+
* email with the same algorithm (see `model/emailMask.ts`); the backend's
|
|
51
|
+
* real email-match on accept/decline stays the enforcement point — a mask
|
|
52
|
+
* collision merely shows the prompt, the accept then surfaces the 403.
|
|
53
|
+
*/
|
|
54
|
+
export type InviteAcceptState = {
|
|
55
|
+
readonly step: "idle";
|
|
56
|
+
} | {
|
|
57
|
+
readonly step: "loadingPreview";
|
|
58
|
+
} | {
|
|
59
|
+
readonly step: "previewError";
|
|
60
|
+
readonly error: FlowError;
|
|
61
|
+
}
|
|
62
|
+
/** Terminal: the invitation is not pending (expired/revoked/accepted/declined). */
|
|
63
|
+
| {
|
|
64
|
+
readonly step: "unavailable";
|
|
65
|
+
readonly preview: InvitationPreview;
|
|
66
|
+
readonly status: string;
|
|
67
|
+
}
|
|
68
|
+
/** Signed in with a non-matching account — logout CTA (host slot). */
|
|
69
|
+
| {
|
|
70
|
+
readonly step: "wrongAccount";
|
|
71
|
+
readonly preview: InvitationPreview;
|
|
72
|
+
}
|
|
73
|
+
/** No session, account exists — the host's login slot; call
|
|
74
|
+
* `sessionEstablished(email)` once signed in. */
|
|
75
|
+
| {
|
|
76
|
+
readonly step: "loginRequired";
|
|
77
|
+
readonly preview: InvitationPreview;
|
|
78
|
+
}
|
|
79
|
+
/** No session, no account — deliberate CTA before minting the grant. */
|
|
80
|
+
| {
|
|
81
|
+
readonly step: "newUser";
|
|
82
|
+
readonly preview: InvitationPreview;
|
|
83
|
+
} | {
|
|
84
|
+
readonly step: "claiming";
|
|
85
|
+
readonly preview: InvitationPreview;
|
|
86
|
+
} | {
|
|
87
|
+
readonly step: "claimError";
|
|
88
|
+
readonly preview: InvitationPreview;
|
|
89
|
+
readonly error: FlowError;
|
|
90
|
+
}
|
|
91
|
+
/** The grant is out via `onLoginGrant` — waiting for the host to exchange
|
|
92
|
+
* it at auth and call `grantExchanged()`. */
|
|
93
|
+
| {
|
|
94
|
+
readonly step: "grantIssued";
|
|
95
|
+
readonly preview: InvitationPreview;
|
|
96
|
+
readonly grantToken: string;
|
|
97
|
+
}
|
|
98
|
+
/** Host's basic-data slot (profiles-react InitialSetupPrompt canon, §B5). */
|
|
99
|
+
| {
|
|
100
|
+
readonly step: "basicData";
|
|
101
|
+
readonly preview: InvitationPreview;
|
|
102
|
+
} | {
|
|
103
|
+
readonly step: "acceptPrompt";
|
|
104
|
+
readonly preview: InvitationPreview;
|
|
105
|
+
} | {
|
|
106
|
+
readonly step: "accepting";
|
|
107
|
+
readonly preview: InvitationPreview;
|
|
108
|
+
} | {
|
|
109
|
+
readonly step: "declining";
|
|
110
|
+
readonly preview: InvitationPreview;
|
|
111
|
+
} | {
|
|
112
|
+
readonly step: "acceptError";
|
|
113
|
+
readonly preview: InvitationPreview;
|
|
114
|
+
readonly error: FlowError;
|
|
115
|
+
} | {
|
|
116
|
+
readonly step: "accepted";
|
|
117
|
+
readonly member: Member;
|
|
118
|
+
readonly preview: InvitationPreview;
|
|
119
|
+
} | {
|
|
120
|
+
readonly step: "declined";
|
|
121
|
+
readonly preview: InvitationPreview;
|
|
122
|
+
};
|
|
123
|
+
export interface InviteAcceptFlow {
|
|
124
|
+
readonly machine: FlowMachine<InviteAcceptState>;
|
|
125
|
+
/** Fetch the preview and route per §B4. `sessionEmail` = the signed-in
|
|
126
|
+
* account's email, or null when there is no session. */
|
|
127
|
+
load(sessionEmail: string | null): Promise<void>;
|
|
128
|
+
/** From `newUser`/`claimError`: mint the login grant (`onLoginGrant` fires
|
|
129
|
+
* with the token; the flow parks in `grantIssued`). */
|
|
130
|
+
claim(): Promise<void>;
|
|
131
|
+
/** From `loginRequired`/`wrongAccount`: a session now exists (host's login
|
|
132
|
+
* slot finished, or the user switched accounts) — re-route on its email. */
|
|
133
|
+
sessionEstablished(email: string): void;
|
|
134
|
+
/** From `grantIssued`: the host exchanged the grant at auth — proceed to
|
|
135
|
+
* the basic-data step. */
|
|
136
|
+
grantExchanged(): void;
|
|
137
|
+
/** From `basicData`: the initial-setup slot finished — show the accept prompt. */
|
|
138
|
+
completeBasicData(): void;
|
|
139
|
+
accept(): Promise<void>;
|
|
140
|
+
decline(): Promise<void>;
|
|
141
|
+
reset(): void;
|
|
142
|
+
}
|
|
143
|
+
export interface InviteAcceptFlowDeps {
|
|
144
|
+
readonly api: WorkspacesApi;
|
|
145
|
+
/** The invite token from the `/invite/{token}` URL — a bearer secret. */
|
|
146
|
+
readonly token: string;
|
|
147
|
+
readonly analytics?: Analytics | null;
|
|
148
|
+
/** The grant_token hand-off seam (see the module doc). A credential:
|
|
149
|
+
* exchange it, never log it. */
|
|
150
|
+
readonly onLoginGrant?: (grantToken: string) => void;
|
|
151
|
+
readonly onAccepted?: (member: Member) => void;
|
|
152
|
+
readonly onDeclined?: () => void;
|
|
153
|
+
}
|
|
154
|
+
export declare function createInviteAcceptFlow(deps: InviteAcceptFlowDeps): InviteAcceptFlow;
|
|
155
|
+
//# sourceMappingURL=inviteAcceptFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inviteAcceptFlow.d.ts","sourceRoot":"","sources":["../../src/flows/inviteAcceptFlow.ts"],"names":[],"mappings":"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"}
|