@zautha/react 0.11.0 → 0.12.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/LICENSE +1 -1
- package/README.md +3 -63
- package/dist/index.cjs +8 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -14
- package/dist/index.d.mts +7 -14
- package/dist/index.mjs +8 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -6
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -30,70 +30,10 @@ export function App() {
|
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
##
|
|
33
|
+
## Documentation
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
for a dedicated page, render `<AuthenticateWithRedirectCallback />` there and pass its URL:
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
<SignIn ssoCallbackUrl="/sso-callback" redirectUrl="/dashboard" />;
|
|
41
|
-
|
|
42
|
-
// app/sso-callback page:
|
|
43
|
-
<AuthenticateWithRedirectCallback />;
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
It finishes the sign-in or sign-up, asks on the same page for whatever is left (the second factor, a missing username,
|
|
47
|
-
the email code when the provider did not verify the address) and goes on to `redirectUrl`. A modal sign-in offers
|
|
48
|
-
providers only with an `ssoCallbackUrl`. With no target at all (neither the flow's `redirectUrl` nor its own
|
|
49
|
-
`redirectUrlComplete` prop) it stays on its waiting card once signed in: pass `redirectUrlComplete`, or go on yourself
|
|
50
|
-
from `onEvent` (`sign_in.completed`, `sign_up.completed`). It is not the page for connecting an account: `<UserProfile />`
|
|
51
|
-
on its own page finishes a connection itself.
|
|
52
|
-
|
|
53
|
-
## Account management
|
|
54
|
-
|
|
55
|
-
`<UserProfile />` is the signed-in user's account page: name and username, email addresses, connected accounts
|
|
56
|
-
(connecting a provider leaves for it and comes back to the same page, which finishes it), password, passkeys,
|
|
57
|
-
two-step verification, active devices and (when the instance allows it) account deletion. Passkeys show only where the
|
|
58
|
-
browser and the page can use them: on a page under the instance's passkey domain (production: your domain, shared with
|
|
59
|
-
the hosted pages; development: the page's own host, so a passkey added on `localhost` does not work on the hosted pages
|
|
60
|
-
and the other way round). See `@zautha/js`'s "Passkeys". `<UserButton />`'s "Manage account" opens it in a modal, or
|
|
61
|
-
goes to `userProfileUrl` when you pass one (e.g. your instance's hosted `/user` page). Connecting an account from
|
|
62
|
-
inside that modal does not finish: the provider sends the user back to the app's page, not into the modal, so
|
|
63
|
-
nothing completes the connection there — pass `userProfileUrl`, or render `<UserProfile />` on its own page, for
|
|
64
|
-
connecting accounts.
|
|
65
|
-
|
|
66
|
-
## Organizations: roles and permissions
|
|
67
|
-
|
|
68
|
-
`useAuth()` gives the session's active organization from its token: `orgId`, `orgRole` (`org:admin`), `orgSlug` and
|
|
69
|
-
`orgPermissions` (the role's custom permissions, `org:invoices:read`), all null without one. `has({ role })` and
|
|
70
|
-
`has({ permission })` take full keys and answer the same as your server does (`@zautha/backend`, `@zautha/nextjs`,
|
|
71
|
-
`Zautha.AspNetCore`); a system permission (`org:sys_…`) is never in the token, so it is false. `<Show>` takes the same
|
|
72
|
-
conditions. Switch organizations with `useZautha()?.setActive({ organization })` (an id, a slug while slugs are on, or
|
|
73
|
-
`null` for the personal account); the hooks follow once the new token is in.
|
|
74
|
-
|
|
75
|
-
```tsx
|
|
76
|
-
<Show when={{ permission: "org:invoices:read" }} fallback={<p>No access</p>}>
|
|
77
|
-
<Invoices />
|
|
78
|
-
</Show>
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
`<Show>` only hides UI: check the same permission on your server.
|
|
82
|
-
|
|
83
|
-
## Sensitive actions (reverification)
|
|
84
|
-
|
|
85
|
-
`useReverification(fetcher)` wraps an action that may need a recent identity check. When `fetcher` throws
|
|
86
|
-
`ReverificationRequiredError` (e.g. `user.updatePassword`) or resolves to your backend's `403 reverification_required`
|
|
87
|
-
response (`requireReverification` in `@zautha/backend`, `reverificationError` in `@zautha/nextjs`,
|
|
88
|
-
`RequireZauthaReverification` in `Zautha.AspNetCore`), a modal asks the user to verify and the action runs once more.
|
|
89
|
-
Closing the modal rejects with `ReverificationCancelledError`.
|
|
90
|
-
|
|
91
|
-
```tsx
|
|
92
|
-
const { getToken } = useAuth();
|
|
93
|
-
const transfer = useReverification(async () =>
|
|
94
|
-
fetch("/api/transfer", { method: "POST", headers: { Authorization: `Bearer ${await getToken()}` } }),
|
|
95
|
-
);
|
|
96
|
-
```
|
|
35
|
+
Everything else (the full API, guides and examples) is at
|
|
36
|
+
<https://zautha.com/docs/sdk/react/>.
|
|
97
37
|
|
|
98
38
|
## License
|
|
99
39
|
|
package/dist/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
let _zautha_js = require("@zautha/js");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
-
|
|
6
|
+
// src/provider.tsx
|
|
7
7
|
const ZauthaContext = (0, react.createContext)(void 0);
|
|
8
8
|
/**
|
|
9
9
|
* Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR
|
|
@@ -67,8 +67,7 @@ function useZauthaState() {
|
|
|
67
67
|
const { zautha, pending } = useZauthaContext();
|
|
68
68
|
return (0, react.useSyncExternalStore)(zautha?.subscribe ?? noop, () => zautha?.getSnapshot() ?? pending, () => pending);
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
//#region src/pagination.ts
|
|
70
|
+
// src/pagination.ts
|
|
72
71
|
/**
|
|
73
72
|
* The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on
|
|
74
73
|
* the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never
|
|
@@ -166,8 +165,7 @@ function usePages(source, params) {
|
|
|
166
165
|
revalidate
|
|
167
166
|
};
|
|
168
167
|
}
|
|
169
|
-
|
|
170
|
-
//#region src/hooks.ts
|
|
168
|
+
// src/hooks.ts
|
|
171
169
|
const isLoadedStatus = (status) => status === "ready" || status === "degraded";
|
|
172
170
|
/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */
|
|
173
171
|
const activeSession = (state) => state.session?.status === "active" ? state.session : null;
|
|
@@ -182,6 +180,7 @@ function useAuth() {
|
|
|
182
180
|
const sessionId = initial === null ? session?.id ?? null : initial.sessionId;
|
|
183
181
|
const signedIn = userId !== null;
|
|
184
182
|
const organization = initial === null ? session === null ? null : state.organization : initial.organization;
|
|
183
|
+
const actor = initial === null ? session?.actor ?? null : initial.actor;
|
|
185
184
|
const has = (0, react.useCallback)((params) => (0, _zautha_js.checkAuthorization)(organization, params), [organization]);
|
|
186
185
|
return {
|
|
187
186
|
isLoaded: isLoadedStatus(state.status) || initial !== null,
|
|
@@ -192,6 +191,7 @@ function useAuth() {
|
|
|
192
191
|
orgRole: organization?.role ?? null,
|
|
193
192
|
orgSlug: organization?.slug ?? null,
|
|
194
193
|
orgPermissions: organization?.permissions ?? null,
|
|
194
|
+
actor,
|
|
195
195
|
getToken,
|
|
196
196
|
signOut,
|
|
197
197
|
has
|
|
@@ -342,8 +342,7 @@ function useOrganizationList(params = {}) {
|
|
|
342
342
|
};
|
|
343
343
|
}
|
|
344
344
|
const notLoaded = () => Promise.reject(new _zautha_js.ZauthaError("Zautha is not loaded yet."));
|
|
345
|
-
|
|
346
|
-
//#region src/control.tsx
|
|
345
|
+
// src/control.tsx
|
|
347
346
|
/**
|
|
348
347
|
* Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has
|
|
349
348
|
* loaded, so a signed-in user never sees a signed-out flash.
|
|
@@ -397,8 +396,7 @@ function RedirectToSignUp(props) {
|
|
|
397
396
|
]);
|
|
398
397
|
return null;
|
|
399
398
|
}
|
|
400
|
-
|
|
401
|
-
//#region src/buttons.tsx
|
|
399
|
+
// src/buttons.tsx
|
|
402
400
|
/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */
|
|
403
401
|
function Trigger(props) {
|
|
404
402
|
const child = react.Children.count(props.children) === 1 ? react.Children.only(props.children) : null;
|
|
@@ -441,8 +439,7 @@ function SignOutButton(props) {
|
|
|
441
439
|
children: props.children
|
|
442
440
|
});
|
|
443
441
|
}
|
|
444
|
-
|
|
445
|
-
//#region src/prebuilt.tsx
|
|
442
|
+
// src/prebuilt.tsx
|
|
446
443
|
/**
|
|
447
444
|
* Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in
|
|
448
445
|
* place. SSR renders only the empty div.
|
|
@@ -525,7 +522,6 @@ function OrganizationSwitcher(props) {
|
|
|
525
522
|
componentProps: props
|
|
526
523
|
});
|
|
527
524
|
}
|
|
528
|
-
//#endregion
|
|
529
525
|
exports.AuthenticateWithRedirectCallback = AuthenticateWithRedirectCallback;
|
|
530
526
|
exports.CreateOrganization = CreateOrganization;
|
|
531
527
|
exports.OAuthConsent = OAuthConsent;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createContext","useState","Zautha","useMemo","useContext","useSyncExternalStore","useState","useRef","useCallback","useCallback","checkAuthorization","useRef","withReverification","useSyncExternalStore","ZauthaError","Children","isValidElement","cloneElement","useRef"],"sources":["../src/provider.tsx","../src/pagination.ts","../src/hooks.ts","../src/control.tsx","../src/buttons.tsx","../src/prebuilt.tsx"],"sourcesContent":["import { Zautha, type ZauthaOptions, type ZauthaState } from \"@zautha/js\";\nimport { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from \"react\";\n\ninterface ZauthaContextValue {\n readonly zautha: Zautha | null;\n /** The snapshot before the instance exists and during server rendering (carries `initialState`). */\n readonly pending: ZauthaState;\n}\n\nconst ZauthaContext = createContext<ZauthaContextValue | undefined>(undefined);\n\nexport interface ZauthaProviderProps extends Omit<ZauthaOptions, \"fetch\"> {\n publishableKey: string;\n children?: ReactNode;\n}\n\n/**\n * Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR\n * create no timers or channels), loads it, and disposes it on unmount. Until then hooks report\n * `isLoaded: false`, unless `initialState` (the server's view, e.g. from @zautha/nextjs) says who is signed in.\n */\nexport function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode {\n const [zautha, setZautha] = useState<Zautha | null>(null);\n const { ui, appearance, localization, signInUrl, signUpUrl, navigate, initialState } = options;\n const [pending] = useState<ZauthaState>(() => ({ ...NO_STATE, initialState: initialState ?? null }));\n\n useEffect(() => {\n const instance = new Zautha(publishableKey, {\n ...(ui === undefined ? {} : { ui }),\n ...(appearance === undefined ? {} : { appearance }),\n ...(localization === undefined ? {} : { localization }),\n ...(signInUrl === undefined ? {} : { signInUrl }),\n ...(signUpUrl === undefined ? {} : { signUpUrl }),\n ...(navigate === undefined ? {} : { navigate }),\n ...(initialState === undefined ? {} : { initialState }),\n });\n // The instance is an external system: it is created here, never during render, and published through state.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setZautha(instance);\n void instance.load();\n return () => {\n instance.dispose();\n setZautha(null);\n };\n // Appearance/localization objects are read at mount; changing the key re-creates the instance.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [publishableKey]);\n\n const value = useMemo(() => ({ zautha, pending }), [zautha, pending]);\n return <ZauthaContext.Provider value={value}>{children}</ZauthaContext.Provider>;\n}\n\n/** The Zautha instance, or null before the provider has created it. */\nexport function useZautha(): Zautha | null {\n return useZauthaContext().zautha;\n}\n\nfunction useZauthaContext(): ZauthaContextValue {\n const value = useContext(ZauthaContext);\n if (value === undefined) throw new Error(\"Zautha hooks and components must be used inside <ZauthaProvider>.\");\n return value;\n}\n\nconst NO_STATE: ZauthaState = {\n status: \"loading\",\n environment: null,\n client: null,\n session: null,\n user: null,\n organization: null,\n initialState: null,\n};\nconst noop = (): (() => void) => () => undefined;\n\n/** Reactive snapshot of the instance state (the loading state, with any initial state, before the instance exists). */\nexport function useZauthaState(): ZauthaState {\n const { zautha, pending } = useZauthaContext();\n return useSyncExternalStore(\n zautha?.subscribe ?? noop,\n () => zautha?.getSnapshot() ?? pending,\n () => pending,\n );\n}\n","import type { Paginated } from \"@zautha/js\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** A list's page size (default 10, the API's) and the page to start on (default 1). */\nexport interface PaginationParams {\n pageSize?: number;\n initialPage?: number;\n}\n\n/**\n * One page of a list and how to move through it. `isLoading`: the page has no data yet; `isFetching`: a request for it\n * is in flight (also while `revalidate()` reads it again). A failed read leaves `data` empty and sets `error`.\n */\nexport interface PaginatedResult<T> {\n data: T[];\n /** How many there are in all. */\n count: number;\n page: number;\n pageCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchNext: () => void;\n fetchPrevious: () => void;\n fetchPage: (page: number) => void;\n /** Reads the current page again; resolves once it has been read. */\n revalidate: () => Promise<void>;\n}\n\n/** What a page read gets: 1–100 items after `offset`. */\nexport type PageLoader<T> = (page: { limit: number; offset: number }) => Promise<Paginated<T>>;\n\n/** A list to read: `key` names what is listed (the user, the organization, the filters); `load` reads one page. */\nexport interface PageSource<T> {\n readonly key: string;\n readonly load: PageLoader<T>;\n}\n\ninterface Settled<T> {\n readonly request: string;\n readonly key: string;\n readonly page: number;\n readonly data: T[];\n readonly count: number;\n readonly error: Error | null;\n}\n\n/**\n * The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on\n * the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never\n * overwrites a newer one.\n */\nexport function usePages<T>(\n source: PageSource<T> | null,\n params: PaginationParams | true | undefined,\n): PaginatedResult<T> {\n const key = source?.key ?? null;\n const { pageSize = 10, initialPage = 1 } = params === true || params === undefined ? {} : params;\n const [at, setAt] = useState({ key, page: initialPage, version: 0 });\n const [settled, setSettled] = useState<Settled<T> | null>(null);\n const latest = useRef(0);\n const waiting = useRef<(() => void)[]>([]);\n if (at.key !== key) {\n // Another list (also an earlier one again): start on its initial page with a fresh read, whatever was shown before.\n setAt({ key, page: initialPage, version: 0 });\n setSettled(null);\n }\n const { page, version } = at.key === key ? at : { page: initialPage, version: 0 };\n const request = JSON.stringify([key, page, pageSize, version]);\n const loader = useRef(source?.load);\n useEffect(() => {\n loader.current = source?.load;\n });\n\n useEffect(() => {\n const id = ++latest.current;\n const settle = (data: T[], count: number, error: Error | null): void => {\n if (latest.current !== id) return;\n if (key !== null) setSettled({ request, key, page, data, count, error });\n for (const resolve of waiting.current.splice(0)) resolve();\n };\n if (key === null || loader.current === undefined) return settle([], 0, null);\n loader.current({ limit: pageSize, offset: (page - 1) * pageSize }).then(\n (r) => settle(r.data, r.totalCount, null),\n (error: unknown) => settle([], 0, error instanceof Error ? error : new Error(String(error))),\n );\n // `request` covers key, page, pageSize and version.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request]);\n\n const shown = settled !== null && settled.key === key && settled.page === page ? settled : null;\n const isFetching = key !== null && settled?.request !== request;\n const count = shown?.count ?? 0;\n const pageCount = Math.ceil(count / pageSize);\n const go = useCallback(\n (to: (page: number) => number) =>\n setAt((a) => {\n const from = a.key === key ? a.page : initialPage;\n return { key, page: Math.max(1, to(from)), version: a.key === key ? a.version : 0 };\n }),\n [key, initialPage],\n );\n const revalidate = useCallback(\n () =>\n new Promise<void>((resolve) => {\n waiting.current.push(resolve);\n setAt((a) => (a.key === key ? { ...a, version: a.version + 1 } : { key, page: initialPage, version: 1 }));\n }),\n [key, initialPage],\n );\n return {\n data: shown?.data ?? [],\n count,\n page,\n pageCount,\n isLoading: isFetching && shown === null,\n isFetching,\n error: shown?.error ?? null,\n hasNextPage: page < pageCount,\n hasPreviousPage: page > 1,\n fetchNext: useCallback(() => go((p) => p + 1), [go]),\n fetchPrevious: useCallback(() => go((p) => p - 1), [go]),\n fetchPage: useCallback((n: number) => go(() => n), [go]),\n revalidate,\n };\n}\n","import {\n checkAuthorization,\n withReverification,\n ZauthaError,\n type AttemptErrors,\n type FetchStatus,\n type OrganizationInvitationResource,\n type OrganizationInvitationStatus,\n type OrganizationMembership,\n type OrganizationMembershipResource,\n type OrganizationResource,\n type Session,\n type SignInResource,\n type SignUpResource,\n type UserOrganizationInvitationResource,\n type UserResource,\n type ZauthaState,\n} from \"@zautha/js\";\nimport { useCallback, useLayoutEffect, useRef, useSyncExternalStore } from \"react\";\nimport { usePages, type PageLoader, type PageSource, type PaginatedResult, type PaginationParams } from \"./pagination\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\n/**\n * What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition\n * given must hold; with none, false.\n */\nexport type HasParams = { role?: string; permission?: string };\nexport type Has = (params: HasParams) => boolean;\n\nexport interface UseAuthResult {\n isLoaded: boolean;\n isSignedIn: boolean;\n userId: string | null;\n sessionId: string | null;\n /** The active organization (`org_…`); null without one, and while signed out. */\n orgId: string | null;\n /** The user's role in it, a full key such as `org:admin`. */\n orgRole: string | null;\n /** Its slug; null without one or while the instance has slugs off. */\n orgSlug: string | null;\n /** The role's custom permissions, full keys such as `org:invoices:read`. */\n orgPermissions: readonly string[] | null;\n getToken: (options?: { skipCache?: boolean }) => Promise<string | null>;\n signOut: (options?: { redirectUrl?: string }) => Promise<void>;\n /**\n * From the session token alone, the same rule as every Zautha SDK and your server: false without an active\n * organization, and always false for a system permission (`org:sys_…`, never in the token).\n */\n has: Has;\n}\n\nconst isLoadedStatus = (status: string): boolean => status === \"ready\" || status === \"degraded\";\n\n/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */\nconst activeSession = (state: ZauthaState): Session | null =>\n state.session?.status === \"active\" ? state.session : null;\n\nexport function useAuth(): UseAuthResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const getToken = useCallback(\n (options?: { skipCache?: boolean }) => zautha?.getToken(options) ?? Promise.resolve(null),\n [zautha],\n );\n const signOut = useCallback(\n (options?: { redirectUrl?: string }) => zautha?.signOut(options) ?? Promise.resolve(),\n [zautha],\n );\n // Until the first load settles, the server's initial state (if any) answers, so nothing flickers.\n const initial = state.status === \"loading\" ? state.initialState : null;\n const session = activeSession(state);\n const userId = initial === null ? (session?.userId ?? null) : initial.userId;\n const sessionId = initial === null ? (session?.id ?? null) : initial.sessionId;\n const signedIn = userId !== null;\n const organization = initial === null ? (session === null ? null : state.organization) : initial.organization;\n const has = useCallback<Has>((params) => checkAuthorization(organization, params), [organization]);\n return {\n isLoaded: isLoadedStatus(state.status) || initial !== null,\n isSignedIn: signedIn,\n userId,\n sessionId,\n orgId: organization?.id ?? null,\n orgRole: organization?.role ?? null,\n orgSlug: organization?.slug ?? null,\n orgPermissions: organization?.permissions ?? null,\n getToken,\n signOut,\n has,\n };\n}\n\n/** The signed-in user with its self-service actions (`user.update`, `user.createEmailAddress`, …). */\nexport function useUser(): { isLoaded: boolean; isSignedIn: boolean; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const signedIn = activeSession(state) !== null;\n // zautha.user is rebuilt only when state.user changes, so the resource is stable between renders.\n const user = !signedIn || state.user === null ? null : (zautha?.user ?? null);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: signedIn, user };\n}\n\n/**\n * Wraps a sensitive action so that it completes after an identity check when it needs one: when `fetcher` throws\n * `ReverificationRequiredError` (e.g. `user.updatePassword`) or resolves to a `Response` with the `403\n * reverification_required` body (your backend with @zautha/backend, @zautha/nextjs or Zautha.AspNetCore), the\n * reverification modal opens and, once the user has verified, `fetcher` runs once more with the same arguments (its\n * token is fresh by then). Closing the modal rejects with `ReverificationCancelledError`. Needs `ui` from @zautha/ui on\n * the provider. The returned function is stable; it always calls the latest `fetcher`.\n */\nexport function useReverification<Args extends unknown[], Result>(\n fetcher: (...args: Args) => Promise<Result>,\n): (...args: Args) => Promise<Result> {\n const zautha = useZautha();\n const latest = useRef(fetcher);\n useLayoutEffect(() => {\n latest.current = fetcher;\n });\n return useCallback(\n (...args: Args) => {\n const call = (...callArgs: Args): Promise<Result> => latest.current(...callArgs);\n // Before the provider has created the instance no modal can open: the action runs as it is.\n return zautha === null ? call(...args) : withReverification(zautha, call)(...args);\n },\n [zautha],\n );\n}\n\n/** The signed-in session; null while signed out or while the session is pending (tasks left). */\nexport function useSession(): { isLoaded: boolean; isSignedIn: boolean; session: Session | null } {\n const state = useZauthaState();\n const session = activeSession(state);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: session !== null, session };\n}\n\nconst noopSubscribe = (): (() => void) => () => undefined;\n\nfunction useResource<T extends SignInResource | SignUpResource>(resource: T | null) {\n const snapshot = useSyncExternalStore(\n resource?.subscribe ?? noopSubscribe,\n () => resource?.snapshot ?? null,\n () => null,\n );\n return snapshot;\n}\n\nexport interface UseSignInResult {\n isLoaded: boolean;\n /** The sign-in resource; null until the provider has created the instance. */\n signIn: SignInResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nconst NO_ERRORS: AttemptErrors = { fields: {}, global: [] };\n\nexport function useSignIn(): UseSignInResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signIn ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signIn: zautha?.signIn ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\nexport interface UseSignUpResult {\n isLoaded: boolean;\n signUp: SignUpResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nexport function useSignUp(): UseSignUpResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signUp ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signUp: zautha?.signUp ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\n/** A list a hook reads only when asked: `true` for the defaults, or the page size, the first page and the filters. */\nexport type ListParams<Filters = object> = true | (PaginationParams & Filters);\n\nexport interface UseOrganizationParams {\n /** The active organization's members (needs `org:sys_memberships:read`), filtered by a role key. */\n memberships?: ListParams<{ role?: string }>;\n /** Its invitations, filtered by status; read only for a member with `org:sys_memberships:manage` (else empty). */\n invitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationResult {\n isLoaded: boolean;\n /** The session's active organization with the member's actions; null without one, while signed out or pending. */\n organization: OrganizationResource | null;\n /** The user's membership of it: role and every permission of the role, system ones included (to show buttons). */\n membership: OrganizationMembershipResource | null;\n /** Only when asked for in the params. */\n memberships?: PaginatedResult<OrganizationMembership>;\n invitations?: PaginatedResult<OrganizationInvitationResource>;\n}\n\nexport interface UseOrganizationListParams {\n /** The user's memberships, newest first. */\n userMemberships?: ListParams;\n /** The invitations to the user's verified addresses; by default the pending ones. */\n userInvitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationListResult {\n isLoaded: boolean;\n /** Creates an organization with the user in it; it is not made active (`setActive` does that). */\n createOrganization: (params: { name: string; slug?: string }) => Promise<OrganizationResource>;\n /** Makes an organization (id or slug) the session's active one; null is the personal account. */\n setActive: (params: { organization: string | null }) => Promise<void>;\n userMemberships?: PaginatedResult<OrganizationMembershipResource>;\n userInvitations?: PaginatedResult<UserOrganizationInvitationResource>;\n}\n\n/** A list's filters: its params without the page size and the first page. */\nfunction filtersOf<F extends object>(params: ListParams<F>): F {\n const filters = { ...(params === true ? {} : params) } as PaginationParams & F;\n delete filters.pageSize;\n delete filters.initialPage;\n return filters;\n}\n\n/** A list of `owner` read with `load`: its key (`owner` and the params, so new filters start the list again). */\nconst list = <T>(owner: string, params: ListParams<object>, load: PageLoader<T>): PageSource<T> => ({\n key: `${owner}:${JSON.stringify(params)}`,\n load,\n});\n\n/** The signed-in user (an active session's) and whether hooks that read it are loaded. */\nfunction useSignedInUser(): { isLoaded: boolean; state: ZauthaState; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const user = activeSession(state) === null ? null : (zautha?.user ?? null);\n // An active session is loaded once its user is.\n return { isLoaded: isLoadedStatus(state.status) && (activeSession(state) === null || user !== null), state, user };\n}\n\n/**\n * The session's active organization and the user's membership of it, from the session token and the user (no request of\n * its own), and on request its members and invitations, page by page. The lists start again on their first page when\n * the active organization changes.\n */\nexport function useOrganization(params: UseOrganizationParams = {}): UseOrganizationResult {\n const { isLoaded, state, user } = useSignedInUser();\n const id = state.organization?.id;\n const membership = user?.organizationMemberships.find((m) => m.organization.id === id) ?? null;\n const organization = membership?.organization ?? null;\n // The user's own membership: its user is the signed-in one.\n const owner = membership === null ? \"\" : `${membership.publicUserData.userId}:${membership.organization.id}`;\n const { memberships, invitations } = params;\n const manages = membership?.permissions.includes(\"org:sys_memberships:manage\") === true;\n const members = usePages(\n organization === null || memberships === undefined\n ? null\n : list(owner, memberships, (page) => organization.getMemberships({ ...filtersOf(memberships), ...page })),\n memberships,\n );\n const invited = usePages(\n organization === null || invitations === undefined || !manages\n ? null\n : list(owner, invitations, (page) => organization.getInvitations({ ...filtersOf(invitations), ...page })),\n invitations,\n );\n return {\n isLoaded,\n organization,\n membership,\n ...(memberships === undefined ? {} : { memberships: members }),\n ...(invitations === undefined ? {} : { invitations: invited }),\n };\n}\n\n/**\n * Creating an organization and choosing the active one, and on request the user's memberships and the invitations to\n * the user, page by page.\n */\nexport function useOrganizationList(params: UseOrganizationListParams = {}): UseOrganizationListResult {\n const zautha = useZautha();\n const { isLoaded, user } = useSignedInUser();\n const { userMemberships, userInvitations } = params;\n const memberships = usePages(\n user === null || userMemberships === undefined\n ? null\n : list(user.id, userMemberships, (page) => user.getOrganizationMemberships(page)),\n userMemberships,\n );\n const invitations = usePages(\n user === null || userInvitations === undefined\n ? null\n : list(user.id, userInvitations, (page) =>\n user.getOrganizationInvitations({ ...filtersOf(userInvitations), ...page }),\n ),\n userInvitations,\n );\n const createOrganization = useCallback(\n (p: { name: string; slug?: string }) => zautha?.createOrganization(p) ?? notLoaded(),\n [zautha],\n );\n const setActive = useCallback((p: { organization: string | null }) => zautha?.setActive(p) ?? notLoaded(), [zautha]);\n return {\n isLoaded,\n createOrganization,\n setActive,\n ...(userMemberships === undefined ? {} : { userMemberships: memberships }),\n ...(userInvitations === undefined ? {} : { userInvitations: invitations }),\n };\n}\n\nconst notLoaded = (): Promise<never> => Promise.reject(new ZauthaError(\"Zautha is not loaded yet.\"));\n","import { useEffect, type ReactNode } from \"react\";\nimport { useAuth, type Has, type HasParams } from \"./hooks\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\nexport type ShowWhen = \"signed-in\" | \"signed-out\" | HasParams | ((has: Has) => boolean);\n\n/**\n * Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has\n * loaded, so a signed-in user never sees a signed-out flash.\n */\nexport function Show(props: { when: ShowWhen; fallback?: ReactNode; children?: ReactNode }): ReactNode {\n const { isLoaded, isSignedIn, has } = useAuth();\n if (!isLoaded) return null;\n const { when } = props;\n const pass =\n when === \"signed-in\"\n ? isSignedIn\n : when === \"signed-out\"\n ? !isSignedIn\n : typeof when === \"function\"\n ? when(has)\n : has(when);\n return pass ? props.children : (props.fallback ?? null);\n}\n\nexport function ZauthaLoading(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"loading\" ? props.children : null;\n}\n\n/** Loaded, including degraded (network trouble after load: last known state is shown). */\nexport function ZauthaLoaded(props: { children?: ReactNode }): ReactNode {\n const { status } = useZauthaState();\n return status === \"ready\" || status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaDegraded(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaFailed(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"failed\" ? props.children : null;\n}\n\n/** Sends a signed-out visitor to sign-in once loaded; renders nothing. */\nexport function RedirectToSignIn(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignIn(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n\nexport function RedirectToSignUp(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignUp(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n","import { Children, cloneElement, isValidElement, type MouseEvent, type ReactElement, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\ninterface ButtonProps {\n /** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */\n mode?: \"redirect\" | \"modal\";\n redirectUrl?: string;\n children?: ReactNode;\n}\n\n/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */\nfunction Trigger(props: { children: ReactNode; label: string; onClick: () => void }): ReactNode {\n const child = Children.count(props.children) === 1 ? Children.only(props.children) : null;\n if (isValidElement<{ onClick?: (event: MouseEvent) => void }>(child)) {\n const original = child.props.onClick;\n return cloneElement(child as ReactElement<{ onClick?: (event: MouseEvent) => void }>, {\n onClick: (event: MouseEvent) => {\n original?.(event);\n if (!event.defaultPrevented) props.onClick();\n },\n });\n }\n return (\n <button type=\"button\" onClick={props.onClick}>\n {props.children ?? props.label}\n </button>\n );\n}\n\nexport function SignInButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign in\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignIn(options) : zautha?.redirectToSignIn(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignUpButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign up\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignUp(options) : zautha?.redirectToSignUp(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignOutButton(props: { redirectUrl?: string; children?: ReactNode }): ReactNode {\n const zautha = useZautha();\n return (\n <Trigger\n label=\"Sign out\"\n onClick={() => void zautha?.signOut(props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl })}\n >\n {props.children}\n </Trigger>\n );\n}\n","import type { UiComponentName } from \"@zautha/js\";\nimport { useEffect, useRef, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\n/**\n * Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in\n * place. SSR renders only the empty div.\n */\nfunction Mounted(props: { name: UiComponentName; componentProps: object }): ReactNode {\n const zautha = useZautha();\n const ref = useRef<HTMLDivElement>(null);\n const mountedWith = useRef<object | null>(null);\n const { name, componentProps } = props;\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null) return;\n zautha.mount(name, element, componentProps);\n mountedWith.current = componentProps;\n return () => {\n mountedWith.current = null;\n zautha.unmount(element);\n };\n // componentProps changes are applied by the effect below without remounting.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zautha, name]);\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null || mountedWith.current === null || mountedWith.current === componentProps)\n return;\n mountedWith.current = componentProps;\n zautha.updateMounted(element, componentProps);\n }, [zautha, componentProps]);\n\n return <div ref={ref} />;\n}\n\n// Prop types live in @zautha/ui; they are structural here so @zautha/react has no runtime dependency on it.\nexport function SignIn(props: import(\"@zautha/ui\").SignInProps): ReactNode {\n return <Mounted name=\"SignIn\" componentProps={props} />;\n}\n\nexport function SignUp(props: import(\"@zautha/ui\").SignUpProps): ReactNode {\n return <Mounted name=\"SignUp\" componentProps={props} />;\n}\n\n/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */\nexport function AuthenticateWithRedirectCallback(\n props: import(\"@zautha/ui\").AuthenticateWithRedirectCallbackProps,\n): ReactNode {\n return <Mounted name=\"AuthenticateWithRedirectCallback\" componentProps={props} />;\n}\n\nexport function UserButton(props: import(\"@zautha/ui\").UserButtonProps): ReactNode {\n return <Mounted name=\"UserButton\" componentProps={props} />;\n}\n\nexport function UserProfile(props: import(\"@zautha/ui\").UserProfileProps): ReactNode {\n return <Mounted name=\"UserProfile\" componentProps={props} />;\n}\n\nexport function OAuthConsent(props: import(\"@zautha/ui\").OAuthConsentProps): ReactNode {\n return <Mounted name=\"OAuthConsent\" componentProps={props} />;\n}\n\nexport function CreateOrganization(props: import(\"@zautha/ui\").CreateOrganizationProps): ReactNode {\n return <Mounted name=\"CreateOrganization\" componentProps={props} />;\n}\n\nexport function OrganizationProfile(props: import(\"@zautha/ui\").OrganizationProfileProps): ReactNode {\n return <Mounted name=\"OrganizationProfile\" componentProps={props} />;\n}\n\nexport function OrganizationSwitcher(props: import(\"@zautha/ui\").OrganizationSwitcherProps): ReactNode {\n return <Mounted name=\"OrganizationSwitcher\" componentProps={props} />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createContext","useState","Zautha","useMemo","useContext","useSyncExternalStore","useState","useRef","useCallback","useCallback","checkAuthorization","useRef","withReverification","useSyncExternalStore","ZauthaError","Children","isValidElement","cloneElement","useRef"],"sources":["../src/provider.tsx","../src/pagination.ts","../src/hooks.ts","../src/control.tsx","../src/buttons.tsx","../src/prebuilt.tsx"],"sourcesContent":["import { Zautha, type ZauthaOptions, type ZauthaState } from \"@zautha/js\";\nimport { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from \"react\";\n\ninterface ZauthaContextValue {\n readonly zautha: Zautha | null;\n /** The snapshot before the instance exists and during server rendering (carries `initialState`). */\n readonly pending: ZauthaState;\n}\n\nconst ZauthaContext = createContext<ZauthaContextValue | undefined>(undefined);\n\nexport interface ZauthaProviderProps extends Omit<ZauthaOptions, \"fetch\"> {\n publishableKey: string;\n children?: ReactNode;\n}\n\n/**\n * Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR\n * create no timers or channels), loads it, and disposes it on unmount. Until then hooks report\n * `isLoaded: false`, unless `initialState` (the server's view, e.g. from @zautha/nextjs) says who is signed in.\n */\nexport function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode {\n const [zautha, setZautha] = useState<Zautha | null>(null);\n const { ui, appearance, localization, signInUrl, signUpUrl, navigate, initialState } = options;\n const [pending] = useState<ZauthaState>(() => ({ ...NO_STATE, initialState: initialState ?? null }));\n\n useEffect(() => {\n const instance = new Zautha(publishableKey, {\n ...(ui === undefined ? {} : { ui }),\n ...(appearance === undefined ? {} : { appearance }),\n ...(localization === undefined ? {} : { localization }),\n ...(signInUrl === undefined ? {} : { signInUrl }),\n ...(signUpUrl === undefined ? {} : { signUpUrl }),\n ...(navigate === undefined ? {} : { navigate }),\n ...(initialState === undefined ? {} : { initialState }),\n });\n // The instance is an external system: it is created here, never during render, and published through state.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setZautha(instance);\n void instance.load();\n return () => {\n instance.dispose();\n setZautha(null);\n };\n // Appearance/localization objects are read at mount; changing the key re-creates the instance.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [publishableKey]);\n\n const value = useMemo(() => ({ zautha, pending }), [zautha, pending]);\n return <ZauthaContext.Provider value={value}>{children}</ZauthaContext.Provider>;\n}\n\n/** The Zautha instance, or null before the provider has created it. */\nexport function useZautha(): Zautha | null {\n return useZauthaContext().zautha;\n}\n\nfunction useZauthaContext(): ZauthaContextValue {\n const value = useContext(ZauthaContext);\n if (value === undefined) throw new Error(\"Zautha hooks and components must be used inside <ZauthaProvider>.\");\n return value;\n}\n\nconst NO_STATE: ZauthaState = {\n status: \"loading\",\n environment: null,\n client: null,\n session: null,\n user: null,\n organization: null,\n initialState: null,\n};\nconst noop = (): (() => void) => () => undefined;\n\n/** Reactive snapshot of the instance state (the loading state, with any initial state, before the instance exists). */\nexport function useZauthaState(): ZauthaState {\n const { zautha, pending } = useZauthaContext();\n return useSyncExternalStore(\n zautha?.subscribe ?? noop,\n () => zautha?.getSnapshot() ?? pending,\n () => pending,\n );\n}\n","import type { Paginated } from \"@zautha/js\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** A list's page size (default 10, the API's) and the page to start on (default 1). */\nexport interface PaginationParams {\n pageSize?: number;\n initialPage?: number;\n}\n\n/**\n * One page of a list and how to move through it. `isLoading`: the page has no data yet; `isFetching`: a request for it\n * is in flight (also while `revalidate()` reads it again). A failed read leaves `data` empty and sets `error`.\n */\nexport interface PaginatedResult<T> {\n data: T[];\n /** How many there are in all. */\n count: number;\n page: number;\n pageCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchNext: () => void;\n fetchPrevious: () => void;\n fetchPage: (page: number) => void;\n /** Reads the current page again; resolves once it has been read. */\n revalidate: () => Promise<void>;\n}\n\n/** What a page read gets: 1–100 items after `offset`. */\nexport type PageLoader<T> = (page: { limit: number; offset: number }) => Promise<Paginated<T>>;\n\n/** A list to read: `key` names what is listed (the user, the organization, the filters); `load` reads one page. */\nexport interface PageSource<T> {\n readonly key: string;\n readonly load: PageLoader<T>;\n}\n\ninterface Settled<T> {\n readonly request: string;\n readonly key: string;\n readonly page: number;\n readonly data: T[];\n readonly count: number;\n readonly error: Error | null;\n}\n\n/**\n * The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on\n * the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never\n * overwrites a newer one.\n */\nexport function usePages<T>(\n source: PageSource<T> | null,\n params: PaginationParams | true | undefined,\n): PaginatedResult<T> {\n const key = source?.key ?? null;\n const { pageSize = 10, initialPage = 1 } = params === true || params === undefined ? {} : params;\n const [at, setAt] = useState({ key, page: initialPage, version: 0 });\n const [settled, setSettled] = useState<Settled<T> | null>(null);\n const latest = useRef(0);\n const waiting = useRef<(() => void)[]>([]);\n if (at.key !== key) {\n // Another list (also an earlier one again): start on its initial page with a fresh read, whatever was shown before.\n setAt({ key, page: initialPage, version: 0 });\n setSettled(null);\n }\n const { page, version } = at.key === key ? at : { page: initialPage, version: 0 };\n const request = JSON.stringify([key, page, pageSize, version]);\n const loader = useRef(source?.load);\n useEffect(() => {\n loader.current = source?.load;\n });\n\n useEffect(() => {\n const id = ++latest.current;\n const settle = (data: T[], count: number, error: Error | null): void => {\n if (latest.current !== id) return;\n if (key !== null) setSettled({ request, key, page, data, count, error });\n for (const resolve of waiting.current.splice(0)) resolve();\n };\n if (key === null || loader.current === undefined) return settle([], 0, null);\n loader.current({ limit: pageSize, offset: (page - 1) * pageSize }).then(\n (r) => settle(r.data, r.totalCount, null),\n (error: unknown) => settle([], 0, error instanceof Error ? error : new Error(String(error))),\n );\n // `request` covers key, page, pageSize and version.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request]);\n\n const shown = settled !== null && settled.key === key && settled.page === page ? settled : null;\n const isFetching = key !== null && settled?.request !== request;\n const count = shown?.count ?? 0;\n const pageCount = Math.ceil(count / pageSize);\n const go = useCallback(\n (to: (page: number) => number) =>\n setAt((a) => {\n const from = a.key === key ? a.page : initialPage;\n return { key, page: Math.max(1, to(from)), version: a.key === key ? a.version : 0 };\n }),\n [key, initialPage],\n );\n const revalidate = useCallback(\n () =>\n new Promise<void>((resolve) => {\n waiting.current.push(resolve);\n setAt((a) => (a.key === key ? { ...a, version: a.version + 1 } : { key, page: initialPage, version: 1 }));\n }),\n [key, initialPage],\n );\n return {\n data: shown?.data ?? [],\n count,\n page,\n pageCount,\n isLoading: isFetching && shown === null,\n isFetching,\n error: shown?.error ?? null,\n hasNextPage: page < pageCount,\n hasPreviousPage: page > 1,\n fetchNext: useCallback(() => go((p) => p + 1), [go]),\n fetchPrevious: useCallback(() => go((p) => p - 1), [go]),\n fetchPage: useCallback((n: number) => go(() => n), [go]),\n revalidate,\n };\n}\n","import {\n checkAuthorization,\n withReverification,\n ZauthaError,\n type AttemptErrors,\n type FetchStatus,\n type OrganizationInvitationResource,\n type OrganizationInvitationStatus,\n type OrganizationMembership,\n type OrganizationMembershipResource,\n type OrganizationResource,\n type Session,\n type SessionActor,\n type SignInResource,\n type SignUpResource,\n type UserOrganizationInvitationResource,\n type UserResource,\n type ZauthaState,\n} from \"@zautha/js\";\nimport { useCallback, useLayoutEffect, useRef, useSyncExternalStore } from \"react\";\nimport { usePages, type PageLoader, type PageSource, type PaginatedResult, type PaginationParams } from \"./pagination\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\n/**\n * What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition\n * given must hold; with none, false.\n */\nexport type HasParams = { role?: string; permission?: string };\nexport type Has = (params: HasParams) => boolean;\n\nexport interface UseAuthResult {\n isLoaded: boolean;\n isSignedIn: boolean;\n userId: string | null;\n sessionId: string | null;\n /** The active organization (`org_…`); null without one, and while signed out. */\n orgId: string | null;\n /** The user's role in it, a full key such as `org:admin`. */\n orgRole: string | null;\n /** Its slug; null without one or while the instance has slugs off. */\n orgSlug: string | null;\n /** The role's custom permissions, full keys such as `org:invoices:read`. */\n orgPermissions: readonly string[] | null;\n /**\n * Who is impersonating the user (an impersonation session; the token's `act` claim); null for the user's own session\n * and while signed out. With `ui` from @zautha/ui the provider shows the impersonation band by itself.\n */\n actor: SessionActor | null;\n getToken: (options?: { skipCache?: boolean }) => Promise<string | null>;\n signOut: (options?: { redirectUrl?: string }) => Promise<void>;\n /**\n * From the session token alone, the same rule as every Zautha SDK and your server: false without an active\n * organization, and always false for a system permission (`org:sys_…`, never in the token).\n */\n has: Has;\n}\n\nconst isLoadedStatus = (status: string): boolean => status === \"ready\" || status === \"degraded\";\n\n/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */\nconst activeSession = (state: ZauthaState): Session | null =>\n state.session?.status === \"active\" ? state.session : null;\n\nexport function useAuth(): UseAuthResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const getToken = useCallback(\n (options?: { skipCache?: boolean }) => zautha?.getToken(options) ?? Promise.resolve(null),\n [zautha],\n );\n const signOut = useCallback(\n (options?: { redirectUrl?: string }) => zautha?.signOut(options) ?? Promise.resolve(),\n [zautha],\n );\n // Until the first load settles, the server's initial state (if any) answers, so nothing flickers.\n const initial = state.status === \"loading\" ? state.initialState : null;\n const session = activeSession(state);\n const userId = initial === null ? (session?.userId ?? null) : initial.userId;\n const sessionId = initial === null ? (session?.id ?? null) : initial.sessionId;\n const signedIn = userId !== null;\n const organization = initial === null ? (session === null ? null : state.organization) : initial.organization;\n const actor = initial === null ? (session?.actor ?? null) : initial.actor;\n const has = useCallback<Has>((params) => checkAuthorization(organization, params), [organization]);\n return {\n isLoaded: isLoadedStatus(state.status) || initial !== null,\n isSignedIn: signedIn,\n userId,\n sessionId,\n orgId: organization?.id ?? null,\n orgRole: organization?.role ?? null,\n orgSlug: organization?.slug ?? null,\n orgPermissions: organization?.permissions ?? null,\n actor,\n getToken,\n signOut,\n has,\n };\n}\n\n/** The signed-in user with its self-service actions (`user.update`, `user.createEmailAddress`, …). */\nexport function useUser(): { isLoaded: boolean; isSignedIn: boolean; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const signedIn = activeSession(state) !== null;\n // zautha.user is rebuilt only when state.user changes, so the resource is stable between renders.\n const user = !signedIn || state.user === null ? null : (zautha?.user ?? null);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: signedIn, user };\n}\n\n/**\n * Wraps a sensitive action so that it completes after an identity check when it needs one: when `fetcher` throws\n * `ReverificationRequiredError` (e.g. `user.updatePassword`) or resolves to a `Response` with the `403\n * reverification_required` body (your backend with @zautha/backend, @zautha/nextjs or Zautha.AspNetCore), the\n * reverification modal opens and, once the user has verified, `fetcher` runs once more with the same arguments (its\n * token is fresh by then). Closing the modal rejects with `ReverificationCancelledError`. Needs `ui` from @zautha/ui on\n * the provider. The returned function is stable; it always calls the latest `fetcher`.\n */\nexport function useReverification<Args extends unknown[], Result>(\n fetcher: (...args: Args) => Promise<Result>,\n): (...args: Args) => Promise<Result> {\n const zautha = useZautha();\n const latest = useRef(fetcher);\n useLayoutEffect(() => {\n latest.current = fetcher;\n });\n return useCallback(\n (...args: Args) => {\n const call = (...callArgs: Args): Promise<Result> => latest.current(...callArgs);\n // Before the provider has created the instance no modal can open: the action runs as it is.\n return zautha === null ? call(...args) : withReverification(zautha, call)(...args);\n },\n [zautha],\n );\n}\n\n/** The signed-in session; null while signed out or while the session is pending (tasks left). */\nexport function useSession(): { isLoaded: boolean; isSignedIn: boolean; session: Session | null } {\n const state = useZauthaState();\n const session = activeSession(state);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: session !== null, session };\n}\n\nconst noopSubscribe = (): (() => void) => () => undefined;\n\nfunction useResource<T extends SignInResource | SignUpResource>(resource: T | null) {\n const snapshot = useSyncExternalStore(\n resource?.subscribe ?? noopSubscribe,\n () => resource?.snapshot ?? null,\n () => null,\n );\n return snapshot;\n}\n\nexport interface UseSignInResult {\n isLoaded: boolean;\n /** The sign-in resource; null until the provider has created the instance. */\n signIn: SignInResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nconst NO_ERRORS: AttemptErrors = { fields: {}, global: [] };\n\nexport function useSignIn(): UseSignInResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signIn ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signIn: zautha?.signIn ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\nexport interface UseSignUpResult {\n isLoaded: boolean;\n signUp: SignUpResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nexport function useSignUp(): UseSignUpResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signUp ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signUp: zautha?.signUp ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\n/** A list a hook reads only when asked: `true` for the defaults, or the page size, the first page and the filters. */\nexport type ListParams<Filters = object> = true | (PaginationParams & Filters);\n\nexport interface UseOrganizationParams {\n /** The active organization's members (needs `org:sys_memberships:read`), filtered by a role key. */\n memberships?: ListParams<{ role?: string }>;\n /** Its invitations, filtered by status; read only for a member with `org:sys_memberships:manage` (else empty). */\n invitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationResult {\n isLoaded: boolean;\n /** The session's active organization with the member's actions; null without one, while signed out or pending. */\n organization: OrganizationResource | null;\n /** The user's membership of it: role and every permission of the role, system ones included (to show buttons). */\n membership: OrganizationMembershipResource | null;\n /** Only when asked for in the params. */\n memberships?: PaginatedResult<OrganizationMembership>;\n invitations?: PaginatedResult<OrganizationInvitationResource>;\n}\n\nexport interface UseOrganizationListParams {\n /** The user's memberships, newest first. */\n userMemberships?: ListParams;\n /** The invitations to the user's verified addresses; by default the pending ones. */\n userInvitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationListResult {\n isLoaded: boolean;\n /** Creates an organization with the user in it; it is not made active (`setActive` does that). */\n createOrganization: (params: { name: string; slug?: string }) => Promise<OrganizationResource>;\n /** Makes an organization (id or slug) the session's active one; null is the personal account. */\n setActive: (params: { organization: string | null }) => Promise<void>;\n userMemberships?: PaginatedResult<OrganizationMembershipResource>;\n userInvitations?: PaginatedResult<UserOrganizationInvitationResource>;\n}\n\n/** A list's filters: its params without the page size and the first page. */\nfunction filtersOf<F extends object>(params: ListParams<F>): F {\n const filters = { ...(params === true ? {} : params) } as PaginationParams & F;\n delete filters.pageSize;\n delete filters.initialPage;\n return filters;\n}\n\n/** A list of `owner` read with `load`: its key (`owner` and the params, so new filters start the list again). */\nconst list = <T>(owner: string, params: ListParams<object>, load: PageLoader<T>): PageSource<T> => ({\n key: `${owner}:${JSON.stringify(params)}`,\n load,\n});\n\n/** The signed-in user (an active session's) and whether hooks that read it are loaded. */\nfunction useSignedInUser(): { isLoaded: boolean; state: ZauthaState; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const user = activeSession(state) === null ? null : (zautha?.user ?? null);\n // An active session is loaded once its user is.\n return { isLoaded: isLoadedStatus(state.status) && (activeSession(state) === null || user !== null), state, user };\n}\n\n/**\n * The session's active organization and the user's membership of it, from the session token and the user (no request of\n * its own), and on request its members and invitations, page by page. The lists start again on their first page when\n * the active organization changes.\n */\nexport function useOrganization(params: UseOrganizationParams = {}): UseOrganizationResult {\n const { isLoaded, state, user } = useSignedInUser();\n const id = state.organization?.id;\n const membership = user?.organizationMemberships.find((m) => m.organization.id === id) ?? null;\n const organization = membership?.organization ?? null;\n // The user's own membership: its user is the signed-in one.\n const owner = membership === null ? \"\" : `${membership.publicUserData.userId}:${membership.organization.id}`;\n const { memberships, invitations } = params;\n const manages = membership?.permissions.includes(\"org:sys_memberships:manage\") === true;\n const members = usePages(\n organization === null || memberships === undefined\n ? null\n : list(owner, memberships, (page) => organization.getMemberships({ ...filtersOf(memberships), ...page })),\n memberships,\n );\n const invited = usePages(\n organization === null || invitations === undefined || !manages\n ? null\n : list(owner, invitations, (page) => organization.getInvitations({ ...filtersOf(invitations), ...page })),\n invitations,\n );\n return {\n isLoaded,\n organization,\n membership,\n ...(memberships === undefined ? {} : { memberships: members }),\n ...(invitations === undefined ? {} : { invitations: invited }),\n };\n}\n\n/**\n * Creating an organization and choosing the active one, and on request the user's memberships and the invitations to\n * the user, page by page.\n */\nexport function useOrganizationList(params: UseOrganizationListParams = {}): UseOrganizationListResult {\n const zautha = useZautha();\n const { isLoaded, user } = useSignedInUser();\n const { userMemberships, userInvitations } = params;\n const memberships = usePages(\n user === null || userMemberships === undefined\n ? null\n : list(user.id, userMemberships, (page) => user.getOrganizationMemberships(page)),\n userMemberships,\n );\n const invitations = usePages(\n user === null || userInvitations === undefined\n ? null\n : list(user.id, userInvitations, (page) =>\n user.getOrganizationInvitations({ ...filtersOf(userInvitations), ...page }),\n ),\n userInvitations,\n );\n const createOrganization = useCallback(\n (p: { name: string; slug?: string }) => zautha?.createOrganization(p) ?? notLoaded(),\n [zautha],\n );\n const setActive = useCallback((p: { organization: string | null }) => zautha?.setActive(p) ?? notLoaded(), [zautha]);\n return {\n isLoaded,\n createOrganization,\n setActive,\n ...(userMemberships === undefined ? {} : { userMemberships: memberships }),\n ...(userInvitations === undefined ? {} : { userInvitations: invitations }),\n };\n}\n\nconst notLoaded = (): Promise<never> => Promise.reject(new ZauthaError(\"Zautha is not loaded yet.\"));\n","import { useEffect, type ReactNode } from \"react\";\nimport { useAuth, type Has, type HasParams } from \"./hooks\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\nexport type ShowWhen = \"signed-in\" | \"signed-out\" | HasParams | ((has: Has) => boolean);\n\n/**\n * Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has\n * loaded, so a signed-in user never sees a signed-out flash.\n */\nexport function Show(props: { when: ShowWhen; fallback?: ReactNode; children?: ReactNode }): ReactNode {\n const { isLoaded, isSignedIn, has } = useAuth();\n if (!isLoaded) return null;\n const { when } = props;\n const pass =\n when === \"signed-in\"\n ? isSignedIn\n : when === \"signed-out\"\n ? !isSignedIn\n : typeof when === \"function\"\n ? when(has)\n : has(when);\n return pass ? props.children : (props.fallback ?? null);\n}\n\nexport function ZauthaLoading(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"loading\" ? props.children : null;\n}\n\n/** Loaded, including degraded (network trouble after load: last known state is shown). */\nexport function ZauthaLoaded(props: { children?: ReactNode }): ReactNode {\n const { status } = useZauthaState();\n return status === \"ready\" || status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaDegraded(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaFailed(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"failed\" ? props.children : null;\n}\n\n/** Sends a signed-out visitor to sign-in once loaded; renders nothing. */\nexport function RedirectToSignIn(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignIn(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n\nexport function RedirectToSignUp(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignUp(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n","import { Children, cloneElement, isValidElement, type MouseEvent, type ReactElement, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\ninterface ButtonProps {\n /** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */\n mode?: \"redirect\" | \"modal\";\n redirectUrl?: string;\n children?: ReactNode;\n}\n\n/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */\nfunction Trigger(props: { children: ReactNode; label: string; onClick: () => void }): ReactNode {\n const child = Children.count(props.children) === 1 ? Children.only(props.children) : null;\n if (isValidElement<{ onClick?: (event: MouseEvent) => void }>(child)) {\n const original = child.props.onClick;\n return cloneElement(child as ReactElement<{ onClick?: (event: MouseEvent) => void }>, {\n onClick: (event: MouseEvent) => {\n original?.(event);\n if (!event.defaultPrevented) props.onClick();\n },\n });\n }\n return (\n <button type=\"button\" onClick={props.onClick}>\n {props.children ?? props.label}\n </button>\n );\n}\n\nexport function SignInButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign in\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignIn(options) : zautha?.redirectToSignIn(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignUpButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign up\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignUp(options) : zautha?.redirectToSignUp(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignOutButton(props: { redirectUrl?: string; children?: ReactNode }): ReactNode {\n const zautha = useZautha();\n return (\n <Trigger\n label=\"Sign out\"\n onClick={() => void zautha?.signOut(props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl })}\n >\n {props.children}\n </Trigger>\n );\n}\n","import type { UiComponentName } from \"@zautha/js\";\nimport { useEffect, useRef, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\n/**\n * Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in\n * place. SSR renders only the empty div.\n */\nfunction Mounted(props: { name: UiComponentName; componentProps: object }): ReactNode {\n const zautha = useZautha();\n const ref = useRef<HTMLDivElement>(null);\n const mountedWith = useRef<object | null>(null);\n const { name, componentProps } = props;\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null) return;\n zautha.mount(name, element, componentProps);\n mountedWith.current = componentProps;\n return () => {\n mountedWith.current = null;\n zautha.unmount(element);\n };\n // componentProps changes are applied by the effect below without remounting.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zautha, name]);\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null || mountedWith.current === null || mountedWith.current === componentProps)\n return;\n mountedWith.current = componentProps;\n zautha.updateMounted(element, componentProps);\n }, [zautha, componentProps]);\n\n return <div ref={ref} />;\n}\n\n// Prop types live in @zautha/ui; they are structural here so @zautha/react has no runtime dependency on it.\nexport function SignIn(props: import(\"@zautha/ui\").SignInProps): ReactNode {\n return <Mounted name=\"SignIn\" componentProps={props} />;\n}\n\nexport function SignUp(props: import(\"@zautha/ui\").SignUpProps): ReactNode {\n return <Mounted name=\"SignUp\" componentProps={props} />;\n}\n\n/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */\nexport function AuthenticateWithRedirectCallback(\n props: import(\"@zautha/ui\").AuthenticateWithRedirectCallbackProps,\n): ReactNode {\n return <Mounted name=\"AuthenticateWithRedirectCallback\" componentProps={props} />;\n}\n\nexport function UserButton(props: import(\"@zautha/ui\").UserButtonProps): ReactNode {\n return <Mounted name=\"UserButton\" componentProps={props} />;\n}\n\nexport function UserProfile(props: import(\"@zautha/ui\").UserProfileProps): ReactNode {\n return <Mounted name=\"UserProfile\" componentProps={props} />;\n}\n\nexport function OAuthConsent(props: import(\"@zautha/ui\").OAuthConsentProps): ReactNode {\n return <Mounted name=\"OAuthConsent\" componentProps={props} />;\n}\n\nexport function CreateOrganization(props: import(\"@zautha/ui\").CreateOrganizationProps): ReactNode {\n return <Mounted name=\"CreateOrganization\" componentProps={props} />;\n}\n\nexport function OrganizationProfile(props: import(\"@zautha/ui\").OrganizationProfileProps): ReactNode {\n return <Mounted name=\"OrganizationProfile\" componentProps={props} />;\n}\n\nexport function OrganizationSwitcher(props: import(\"@zautha/ui\").OrganizationSwitcherProps): ReactNode {\n return <Mounted name=\"OrganizationSwitcher\" componentProps={props} />;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import { AttemptErrors, EmailAddress, Environment, ExternalAccount, ExternalAccountResource, FetchStatus, OAuthStrategy, Organization, OrganizationInvitation, OrganizationInvitationResource, OrganizationInvitationResource as OrganizationInvitationResource$1, OrganizationInvitationStatus, OrganizationInvitationStatus as OrganizationInvitationStatus$1, OrganizationMembership, OrganizationMembership as OrganizationMembership$1, OrganizationMembershipResource, OrganizationMembershipResource as OrganizationMembershipResource$1, OrganizationResource, OrganizationResource as OrganizationResource$1, OrganizationRole, Passkey, PasskeyCreation, RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, ReverificationRequirement, Session, Session as Session$1, SessionWithActivity, SignInResource, SignInResource as SignInResource$1, SignUpResource, SignUpResource as SignUpResource$1, SocialProvider, User, UserOrganizationInvitationResource, UserOrganizationInvitationResource as UserOrganizationInvitationResource$1, UserResource, UserResource as UserResource$1, Zautha, ZauthaApiError, ZauthaCaptchaError, ZauthaError, ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaOptions, ZauthaPasskeyError, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError } from "@zautha/js";
|
|
2
|
+
import { AttemptErrors, EmailAddress, Environment, ExternalAccount, ExternalAccountResource, FetchStatus, OAuthStrategy, Organization, OrganizationInvitation, OrganizationInvitationResource, OrganizationInvitationResource as OrganizationInvitationResource$1, OrganizationInvitationStatus, OrganizationInvitationStatus as OrganizationInvitationStatus$1, OrganizationMembership, OrganizationMembership as OrganizationMembership$1, OrganizationMembershipResource, OrganizationMembershipResource as OrganizationMembershipResource$1, OrganizationResource, OrganizationResource as OrganizationResource$1, OrganizationRole, Passkey, PasskeyCreation, RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, ReverificationRequirement, Session, Session as Session$1, SessionActor, SessionActor as SessionActor$1, SessionWithActivity, SignInResource, SignInResource as SignInResource$1, SignUpResource, SignUpResource as SignUpResource$1, SocialProvider, User, UserOrganizationInvitationResource, UserOrganizationInvitationResource as UserOrganizationInvitationResource$1, UserResource, UserResource as UserResource$1, Zautha, ZauthaApiError, ZauthaCaptchaError, ZauthaError, ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaOptions, ZauthaPasskeyError, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError } from "@zautha/js";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
|
-
//#region src/provider.d.ts
|
|
5
4
|
interface ZauthaProviderProps extends Omit<ZauthaOptions, "fetch"> {
|
|
6
5
|
publishableKey: string;
|
|
7
6
|
children?: ReactNode;
|
|
@@ -14,8 +13,6 @@ interface ZauthaProviderProps extends Omit<ZauthaOptions, "fetch"> {
|
|
|
14
13
|
export declare function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode;
|
|
15
14
|
/** The Zautha instance, or null before the provider has created it. */
|
|
16
15
|
export declare function useZautha(): Zautha | null;
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/pagination.d.ts
|
|
19
16
|
/** A list's page size (default 10, the API's) and the page to start on (default 1). */
|
|
20
17
|
interface PaginationParams {
|
|
21
18
|
pageSize?: number;
|
|
@@ -42,8 +39,6 @@ interface PaginatedResult<T> {
|
|
|
42
39
|
/** Reads the current page again; resolves once it has been read. */
|
|
43
40
|
revalidate: () => Promise<void>;
|
|
44
41
|
}
|
|
45
|
-
//#endregion
|
|
46
|
-
//#region src/hooks.d.ts
|
|
47
42
|
/**
|
|
48
43
|
* What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition
|
|
49
44
|
* given must hold; with none, false.
|
|
@@ -66,6 +61,11 @@ interface UseAuthResult {
|
|
|
66
61
|
orgSlug: string | null;
|
|
67
62
|
/** The role's custom permissions, full keys such as `org:invoices:read`. */
|
|
68
63
|
orgPermissions: readonly string[] | null;
|
|
64
|
+
/**
|
|
65
|
+
* Who is impersonating the user (an impersonation session; the token's `act` claim); null for the user's own session
|
|
66
|
+
* and while signed out. With `ui` from @zautha/ui the provider shows the impersonation band by itself.
|
|
67
|
+
*/
|
|
68
|
+
actor: SessionActor$1 | null;
|
|
69
69
|
getToken: (options?: {
|
|
70
70
|
skipCache?: boolean;
|
|
71
71
|
}) => Promise<string | null>;
|
|
@@ -170,8 +170,6 @@ export declare function useOrganization(params?: UseOrganizationParams): UseOrga
|
|
|
170
170
|
* the user, page by page.
|
|
171
171
|
*/
|
|
172
172
|
export declare function useOrganizationList(params?: UseOrganizationListParams): UseOrganizationListResult;
|
|
173
|
-
//#endregion
|
|
174
|
-
//#region src/control.d.ts
|
|
175
173
|
type ShowWhen = "signed-in" | "signed-out" | HasParams | ((has: Has) => boolean);
|
|
176
174
|
/**
|
|
177
175
|
* Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has
|
|
@@ -202,8 +200,6 @@ export declare function RedirectToSignIn(props: {
|
|
|
202
200
|
export declare function RedirectToSignUp(props: {
|
|
203
201
|
redirectUrl?: string;
|
|
204
202
|
}): ReactNode;
|
|
205
|
-
//#endregion
|
|
206
|
-
//#region src/buttons.d.ts
|
|
207
203
|
interface ButtonProps {
|
|
208
204
|
/** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */
|
|
209
205
|
mode?: "redirect" | "modal";
|
|
@@ -216,8 +212,6 @@ export declare function SignOutButton(props: {
|
|
|
216
212
|
redirectUrl?: string;
|
|
217
213
|
children?: ReactNode;
|
|
218
214
|
}): ReactNode;
|
|
219
|
-
//#endregion
|
|
220
|
-
//#region src/prebuilt.d.ts
|
|
221
215
|
export declare function SignIn(props: import("@zautha/ui").SignInProps): ReactNode;
|
|
222
216
|
export declare function SignUp(props: import("@zautha/ui").SignUpProps): ReactNode;
|
|
223
217
|
/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */
|
|
@@ -228,6 +222,5 @@ export declare function OAuthConsent(props: import("@zautha/ui").OAuthConsentPro
|
|
|
228
222
|
export declare function CreateOrganization(props: import("@zautha/ui").CreateOrganizationProps): ReactNode;
|
|
229
223
|
export declare function OrganizationProfile(props: import("@zautha/ui").OrganizationProfileProps): ReactNode;
|
|
230
224
|
export declare function OrganizationSwitcher(props: import("@zautha/ui").OrganizationSwitcherProps): ReactNode;
|
|
231
|
-
|
|
232
|
-
export { type EmailAddress, type Environment, type ExternalAccount, type ExternalAccountResource, type Has, type HasParams, type ListParams, type OAuthStrategy, type Organization, type OrganizationInvitation, type OrganizationInvitationResource, type OrganizationInvitationStatus, type OrganizationMembership, type OrganizationMembershipResource, type OrganizationResource, type OrganizationRole, type PaginatedResult, type PaginationParams, type Passkey, type PasskeyCreation, type RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, type ReverificationRequirement, type Session, type SessionWithActivity, type ShowWhen, type SignInResource, type SignUpResource, type SocialProvider, type UseAuthResult, type UseOrganizationListParams, type UseOrganizationListResult, type UseOrganizationParams, type UseOrganizationResult, type UseSignInResult, type UseSignUpResult, type User, type UserOrganizationInvitationResource, type UserResource, ZauthaApiError, ZauthaCaptchaError, ZauthaError, type ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, type ZauthaProviderProps, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError };
|
|
225
|
+
export { type EmailAddress, type Environment, type ExternalAccount, type ExternalAccountResource, type Has, type HasParams, type ListParams, type OAuthStrategy, type Organization, type OrganizationInvitation, type OrganizationInvitationResource, type OrganizationInvitationStatus, type OrganizationMembership, type OrganizationMembershipResource, type OrganizationResource, type OrganizationRole, type PaginatedResult, type PaginationParams, type Passkey, type PasskeyCreation, type RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, type ReverificationRequirement, type Session, type SessionActor, type SessionWithActivity, type ShowWhen, type SignInResource, type SignUpResource, type SocialProvider, type UseAuthResult, type UseOrganizationListParams, type UseOrganizationListResult, type UseOrganizationParams, type UseOrganizationResult, type UseSignInResult, type UseSignUpResult, type User, type UserOrganizationInvitationResource, type UserResource, ZauthaApiError, ZauthaCaptchaError, ZauthaError, type ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, type ZauthaProviderProps, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError };
|
|
233
226
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import { AttemptErrors, EmailAddress, Environment, ExternalAccount, ExternalAccountResource, FetchStatus, OAuthStrategy, Organization, OrganizationInvitation, OrganizationInvitationResource, OrganizationInvitationResource as OrganizationInvitationResource$1, OrganizationInvitationStatus, OrganizationInvitationStatus as OrganizationInvitationStatus$1, OrganizationMembership, OrganizationMembership as OrganizationMembership$1, OrganizationMembershipResource, OrganizationMembershipResource as OrganizationMembershipResource$1, OrganizationResource, OrganizationResource as OrganizationResource$1, OrganizationRole, Passkey, PasskeyCreation, RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, ReverificationRequirement, Session, Session as Session$1, SessionWithActivity, SignInResource, SignInResource as SignInResource$1, SignUpResource, SignUpResource as SignUpResource$1, SocialProvider, User, UserOrganizationInvitationResource, UserOrganizationInvitationResource as UserOrganizationInvitationResource$1, UserResource, UserResource as UserResource$1, Zautha, ZauthaApiError, ZauthaCaptchaError, ZauthaError, ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaOptions, ZauthaPasskeyError, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError } from "@zautha/js";
|
|
2
|
+
import { AttemptErrors, EmailAddress, Environment, ExternalAccount, ExternalAccountResource, FetchStatus, OAuthStrategy, Organization, OrganizationInvitation, OrganizationInvitationResource, OrganizationInvitationResource as OrganizationInvitationResource$1, OrganizationInvitationStatus, OrganizationInvitationStatus as OrganizationInvitationStatus$1, OrganizationMembership, OrganizationMembership as OrganizationMembership$1, OrganizationMembershipResource, OrganizationMembershipResource as OrganizationMembershipResource$1, OrganizationResource, OrganizationResource as OrganizationResource$1, OrganizationRole, Passkey, PasskeyCreation, RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, ReverificationRequirement, Session, Session as Session$1, SessionActor, SessionActor as SessionActor$1, SessionWithActivity, SignInResource, SignInResource as SignInResource$1, SignUpResource, SignUpResource as SignUpResource$1, SocialProvider, User, UserOrganizationInvitationResource, UserOrganizationInvitationResource as UserOrganizationInvitationResource$1, UserResource, UserResource as UserResource$1, Zautha, ZauthaApiError, ZauthaCaptchaError, ZauthaError, ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaOptions, ZauthaPasskeyError, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError } from "@zautha/js";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
|
-
//#region src/provider.d.ts
|
|
5
4
|
interface ZauthaProviderProps extends Omit<ZauthaOptions, "fetch"> {
|
|
6
5
|
publishableKey: string;
|
|
7
6
|
children?: ReactNode;
|
|
@@ -14,8 +13,6 @@ interface ZauthaProviderProps extends Omit<ZauthaOptions, "fetch"> {
|
|
|
14
13
|
export declare function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode;
|
|
15
14
|
/** The Zautha instance, or null before the provider has created it. */
|
|
16
15
|
export declare function useZautha(): Zautha | null;
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/pagination.d.ts
|
|
19
16
|
/** A list's page size (default 10, the API's) and the page to start on (default 1). */
|
|
20
17
|
interface PaginationParams {
|
|
21
18
|
pageSize?: number;
|
|
@@ -42,8 +39,6 @@ interface PaginatedResult<T> {
|
|
|
42
39
|
/** Reads the current page again; resolves once it has been read. */
|
|
43
40
|
revalidate: () => Promise<void>;
|
|
44
41
|
}
|
|
45
|
-
//#endregion
|
|
46
|
-
//#region src/hooks.d.ts
|
|
47
42
|
/**
|
|
48
43
|
* What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition
|
|
49
44
|
* given must hold; with none, false.
|
|
@@ -66,6 +61,11 @@ interface UseAuthResult {
|
|
|
66
61
|
orgSlug: string | null;
|
|
67
62
|
/** The role's custom permissions, full keys such as `org:invoices:read`. */
|
|
68
63
|
orgPermissions: readonly string[] | null;
|
|
64
|
+
/**
|
|
65
|
+
* Who is impersonating the user (an impersonation session; the token's `act` claim); null for the user's own session
|
|
66
|
+
* and while signed out. With `ui` from @zautha/ui the provider shows the impersonation band by itself.
|
|
67
|
+
*/
|
|
68
|
+
actor: SessionActor$1 | null;
|
|
69
69
|
getToken: (options?: {
|
|
70
70
|
skipCache?: boolean;
|
|
71
71
|
}) => Promise<string | null>;
|
|
@@ -170,8 +170,6 @@ export declare function useOrganization(params?: UseOrganizationParams): UseOrga
|
|
|
170
170
|
* the user, page by page.
|
|
171
171
|
*/
|
|
172
172
|
export declare function useOrganizationList(params?: UseOrganizationListParams): UseOrganizationListResult;
|
|
173
|
-
//#endregion
|
|
174
|
-
//#region src/control.d.ts
|
|
175
173
|
type ShowWhen = "signed-in" | "signed-out" | HasParams | ((has: Has) => boolean);
|
|
176
174
|
/**
|
|
177
175
|
* Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has
|
|
@@ -202,8 +200,6 @@ export declare function RedirectToSignIn(props: {
|
|
|
202
200
|
export declare function RedirectToSignUp(props: {
|
|
203
201
|
redirectUrl?: string;
|
|
204
202
|
}): ReactNode;
|
|
205
|
-
//#endregion
|
|
206
|
-
//#region src/buttons.d.ts
|
|
207
203
|
interface ButtonProps {
|
|
208
204
|
/** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */
|
|
209
205
|
mode?: "redirect" | "modal";
|
|
@@ -216,8 +212,6 @@ export declare function SignOutButton(props: {
|
|
|
216
212
|
redirectUrl?: string;
|
|
217
213
|
children?: ReactNode;
|
|
218
214
|
}): ReactNode;
|
|
219
|
-
//#endregion
|
|
220
|
-
//#region src/prebuilt.d.ts
|
|
221
215
|
export declare function SignIn(props: import("@zautha/ui").SignInProps): ReactNode;
|
|
222
216
|
export declare function SignUp(props: import("@zautha/ui").SignUpProps): ReactNode;
|
|
223
217
|
/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */
|
|
@@ -228,6 +222,5 @@ export declare function OAuthConsent(props: import("@zautha/ui").OAuthConsentPro
|
|
|
228
222
|
export declare function CreateOrganization(props: import("@zautha/ui").CreateOrganizationProps): ReactNode;
|
|
229
223
|
export declare function OrganizationProfile(props: import("@zautha/ui").OrganizationProfileProps): ReactNode;
|
|
230
224
|
export declare function OrganizationSwitcher(props: import("@zautha/ui").OrganizationSwitcherProps): ReactNode;
|
|
231
|
-
|
|
232
|
-
export { type EmailAddress, type Environment, type ExternalAccount, type ExternalAccountResource, type Has, type HasParams, type ListParams, type OAuthStrategy, type Organization, type OrganizationInvitation, type OrganizationInvitationResource, type OrganizationInvitationStatus, type OrganizationMembership, type OrganizationMembershipResource, type OrganizationResource, type OrganizationRole, type PaginatedResult, type PaginationParams, type Passkey, type PasskeyCreation, type RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, type ReverificationRequirement, type Session, type SessionWithActivity, type ShowWhen, type SignInResource, type SignUpResource, type SocialProvider, type UseAuthResult, type UseOrganizationListParams, type UseOrganizationListResult, type UseOrganizationParams, type UseOrganizationResult, type UseSignInResult, type UseSignUpResult, type User, type UserOrganizationInvitationResource, type UserResource, ZauthaApiError, ZauthaCaptchaError, ZauthaError, type ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, type ZauthaProviderProps, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError };
|
|
225
|
+
export { type EmailAddress, type Environment, type ExternalAccount, type ExternalAccountResource, type Has, type HasParams, type ListParams, type OAuthStrategy, type Organization, type OrganizationInvitation, type OrganizationInvitationResource, type OrganizationInvitationStatus, type OrganizationMembership, type OrganizationMembershipResource, type OrganizationResource, type OrganizationRole, type PaginatedResult, type PaginationParams, type Passkey, type PasskeyCreation, type RedirectCallbackResult, ReverificationCancelledError, ReverificationRequiredError, type ReverificationRequirement, type Session, type SessionActor, type SessionWithActivity, type ShowWhen, type SignInResource, type SignUpResource, type SocialProvider, type UseAuthResult, type UseOrganizationListParams, type UseOrganizationListResult, type UseOrganizationParams, type UseOrganizationResult, type UseSignInResult, type UseSignUpResult, type User, type UserOrganizationInvitationResource, type UserResource, ZauthaApiError, ZauthaCaptchaError, ZauthaError, type ZauthaErrorCode, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, type ZauthaProviderProps, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError };
|
|
233
226
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { ReverificationCancelledError, ReverificationRequiredError, Zautha, ZauthaApiError, ZauthaCaptchaError, ZauthaError, ZauthaError as ZauthaError$1, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, checkAuthorization, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError, withReverification } from "@zautha/js";
|
|
3
3
|
import { Children, cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/provider.tsx
|
|
6
6
|
const ZauthaContext = createContext(void 0);
|
|
7
7
|
/**
|
|
8
8
|
* Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR
|
|
@@ -66,8 +66,7 @@ function useZauthaState() {
|
|
|
66
66
|
const { zautha, pending } = useZauthaContext();
|
|
67
67
|
return useSyncExternalStore(zautha?.subscribe ?? noop, () => zautha?.getSnapshot() ?? pending, () => pending);
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
//#region src/pagination.ts
|
|
69
|
+
// src/pagination.ts
|
|
71
70
|
/**
|
|
72
71
|
* The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on
|
|
73
72
|
* the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never
|
|
@@ -165,8 +164,7 @@ function usePages(source, params) {
|
|
|
165
164
|
revalidate
|
|
166
165
|
};
|
|
167
166
|
}
|
|
168
|
-
|
|
169
|
-
//#region src/hooks.ts
|
|
167
|
+
// src/hooks.ts
|
|
170
168
|
const isLoadedStatus = (status) => status === "ready" || status === "degraded";
|
|
171
169
|
/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */
|
|
172
170
|
const activeSession = (state) => state.session?.status === "active" ? state.session : null;
|
|
@@ -181,6 +179,7 @@ function useAuth() {
|
|
|
181
179
|
const sessionId = initial === null ? session?.id ?? null : initial.sessionId;
|
|
182
180
|
const signedIn = userId !== null;
|
|
183
181
|
const organization = initial === null ? session === null ? null : state.organization : initial.organization;
|
|
182
|
+
const actor = initial === null ? session?.actor ?? null : initial.actor;
|
|
184
183
|
const has = useCallback((params) => checkAuthorization(organization, params), [organization]);
|
|
185
184
|
return {
|
|
186
185
|
isLoaded: isLoadedStatus(state.status) || initial !== null,
|
|
@@ -191,6 +190,7 @@ function useAuth() {
|
|
|
191
190
|
orgRole: organization?.role ?? null,
|
|
192
191
|
orgSlug: organization?.slug ?? null,
|
|
193
192
|
orgPermissions: organization?.permissions ?? null,
|
|
193
|
+
actor,
|
|
194
194
|
getToken,
|
|
195
195
|
signOut,
|
|
196
196
|
has
|
|
@@ -341,8 +341,7 @@ function useOrganizationList(params = {}) {
|
|
|
341
341
|
};
|
|
342
342
|
}
|
|
343
343
|
const notLoaded = () => Promise.reject(new ZauthaError$1("Zautha is not loaded yet."));
|
|
344
|
-
|
|
345
|
-
//#region src/control.tsx
|
|
344
|
+
// src/control.tsx
|
|
346
345
|
/**
|
|
347
346
|
* Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has
|
|
348
347
|
* loaded, so a signed-in user never sees a signed-out flash.
|
|
@@ -396,8 +395,7 @@ function RedirectToSignUp(props) {
|
|
|
396
395
|
]);
|
|
397
396
|
return null;
|
|
398
397
|
}
|
|
399
|
-
|
|
400
|
-
//#region src/buttons.tsx
|
|
398
|
+
// src/buttons.tsx
|
|
401
399
|
/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */
|
|
402
400
|
function Trigger(props) {
|
|
403
401
|
const child = Children.count(props.children) === 1 ? Children.only(props.children) : null;
|
|
@@ -440,8 +438,7 @@ function SignOutButton(props) {
|
|
|
440
438
|
children: props.children
|
|
441
439
|
});
|
|
442
440
|
}
|
|
443
|
-
|
|
444
|
-
//#region src/prebuilt.tsx
|
|
441
|
+
// src/prebuilt.tsx
|
|
445
442
|
/**
|
|
446
443
|
* Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in
|
|
447
444
|
* place. SSR renders only the empty div.
|
|
@@ -524,7 +521,6 @@ function OrganizationSwitcher(props) {
|
|
|
524
521
|
componentProps: props
|
|
525
522
|
});
|
|
526
523
|
}
|
|
527
|
-
//#endregion
|
|
528
524
|
export { AuthenticateWithRedirectCallback, CreateOrganization, OAuthConsent, OrganizationProfile, OrganizationSwitcher, RedirectToSignIn, RedirectToSignUp, ReverificationCancelledError, ReverificationRequiredError, Show, SignIn, SignInButton, SignOutButton, SignUp, SignUpButton, UserButton, UserProfile, ZauthaApiError, ZauthaCaptchaError, ZauthaDegraded, ZauthaError, ZauthaFailed, ZauthaLoaded, ZauthaLoading, ZauthaNetworkError, ZauthaOfflineError, ZauthaPasskeyError, ZauthaProvider, isReverificationCancelledError, isReverificationRequiredError, isZauthaApiError, isZauthaCaptchaError, isZauthaError, isZauthaNetworkError, isZauthaOfflineError, isZauthaPasskeyError, useAuth, useOrganization, useOrganizationList, useReverification, useSession, useSignIn, useSignUp, useUser, useZautha };
|
|
529
525
|
|
|
530
526
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["ZauthaError"],"sources":["../src/provider.tsx","../src/pagination.ts","../src/hooks.ts","../src/control.tsx","../src/buttons.tsx","../src/prebuilt.tsx"],"sourcesContent":["import { Zautha, type ZauthaOptions, type ZauthaState } from \"@zautha/js\";\nimport { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from \"react\";\n\ninterface ZauthaContextValue {\n readonly zautha: Zautha | null;\n /** The snapshot before the instance exists and during server rendering (carries `initialState`). */\n readonly pending: ZauthaState;\n}\n\nconst ZauthaContext = createContext<ZauthaContextValue | undefined>(undefined);\n\nexport interface ZauthaProviderProps extends Omit<ZauthaOptions, \"fetch\"> {\n publishableKey: string;\n children?: ReactNode;\n}\n\n/**\n * Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR\n * create no timers or channels), loads it, and disposes it on unmount. Until then hooks report\n * `isLoaded: false`, unless `initialState` (the server's view, e.g. from @zautha/nextjs) says who is signed in.\n */\nexport function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode {\n const [zautha, setZautha] = useState<Zautha | null>(null);\n const { ui, appearance, localization, signInUrl, signUpUrl, navigate, initialState } = options;\n const [pending] = useState<ZauthaState>(() => ({ ...NO_STATE, initialState: initialState ?? null }));\n\n useEffect(() => {\n const instance = new Zautha(publishableKey, {\n ...(ui === undefined ? {} : { ui }),\n ...(appearance === undefined ? {} : { appearance }),\n ...(localization === undefined ? {} : { localization }),\n ...(signInUrl === undefined ? {} : { signInUrl }),\n ...(signUpUrl === undefined ? {} : { signUpUrl }),\n ...(navigate === undefined ? {} : { navigate }),\n ...(initialState === undefined ? {} : { initialState }),\n });\n // The instance is an external system: it is created here, never during render, and published through state.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setZautha(instance);\n void instance.load();\n return () => {\n instance.dispose();\n setZautha(null);\n };\n // Appearance/localization objects are read at mount; changing the key re-creates the instance.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [publishableKey]);\n\n const value = useMemo(() => ({ zautha, pending }), [zautha, pending]);\n return <ZauthaContext.Provider value={value}>{children}</ZauthaContext.Provider>;\n}\n\n/** The Zautha instance, or null before the provider has created it. */\nexport function useZautha(): Zautha | null {\n return useZauthaContext().zautha;\n}\n\nfunction useZauthaContext(): ZauthaContextValue {\n const value = useContext(ZauthaContext);\n if (value === undefined) throw new Error(\"Zautha hooks and components must be used inside <ZauthaProvider>.\");\n return value;\n}\n\nconst NO_STATE: ZauthaState = {\n status: \"loading\",\n environment: null,\n client: null,\n session: null,\n user: null,\n organization: null,\n initialState: null,\n};\nconst noop = (): (() => void) => () => undefined;\n\n/** Reactive snapshot of the instance state (the loading state, with any initial state, before the instance exists). */\nexport function useZauthaState(): ZauthaState {\n const { zautha, pending } = useZauthaContext();\n return useSyncExternalStore(\n zautha?.subscribe ?? noop,\n () => zautha?.getSnapshot() ?? pending,\n () => pending,\n );\n}\n","import type { Paginated } from \"@zautha/js\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** A list's page size (default 10, the API's) and the page to start on (default 1). */\nexport interface PaginationParams {\n pageSize?: number;\n initialPage?: number;\n}\n\n/**\n * One page of a list and how to move through it. `isLoading`: the page has no data yet; `isFetching`: a request for it\n * is in flight (also while `revalidate()` reads it again). A failed read leaves `data` empty and sets `error`.\n */\nexport interface PaginatedResult<T> {\n data: T[];\n /** How many there are in all. */\n count: number;\n page: number;\n pageCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchNext: () => void;\n fetchPrevious: () => void;\n fetchPage: (page: number) => void;\n /** Reads the current page again; resolves once it has been read. */\n revalidate: () => Promise<void>;\n}\n\n/** What a page read gets: 1–100 items after `offset`. */\nexport type PageLoader<T> = (page: { limit: number; offset: number }) => Promise<Paginated<T>>;\n\n/** A list to read: `key` names what is listed (the user, the organization, the filters); `load` reads one page. */\nexport interface PageSource<T> {\n readonly key: string;\n readonly load: PageLoader<T>;\n}\n\ninterface Settled<T> {\n readonly request: string;\n readonly key: string;\n readonly page: number;\n readonly data: T[];\n readonly count: number;\n readonly error: Error | null;\n}\n\n/**\n * The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on\n * the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never\n * overwrites a newer one.\n */\nexport function usePages<T>(\n source: PageSource<T> | null,\n params: PaginationParams | true | undefined,\n): PaginatedResult<T> {\n const key = source?.key ?? null;\n const { pageSize = 10, initialPage = 1 } = params === true || params === undefined ? {} : params;\n const [at, setAt] = useState({ key, page: initialPage, version: 0 });\n const [settled, setSettled] = useState<Settled<T> | null>(null);\n const latest = useRef(0);\n const waiting = useRef<(() => void)[]>([]);\n if (at.key !== key) {\n // Another list (also an earlier one again): start on its initial page with a fresh read, whatever was shown before.\n setAt({ key, page: initialPage, version: 0 });\n setSettled(null);\n }\n const { page, version } = at.key === key ? at : { page: initialPage, version: 0 };\n const request = JSON.stringify([key, page, pageSize, version]);\n const loader = useRef(source?.load);\n useEffect(() => {\n loader.current = source?.load;\n });\n\n useEffect(() => {\n const id = ++latest.current;\n const settle = (data: T[], count: number, error: Error | null): void => {\n if (latest.current !== id) return;\n if (key !== null) setSettled({ request, key, page, data, count, error });\n for (const resolve of waiting.current.splice(0)) resolve();\n };\n if (key === null || loader.current === undefined) return settle([], 0, null);\n loader.current({ limit: pageSize, offset: (page - 1) * pageSize }).then(\n (r) => settle(r.data, r.totalCount, null),\n (error: unknown) => settle([], 0, error instanceof Error ? error : new Error(String(error))),\n );\n // `request` covers key, page, pageSize and version.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request]);\n\n const shown = settled !== null && settled.key === key && settled.page === page ? settled : null;\n const isFetching = key !== null && settled?.request !== request;\n const count = shown?.count ?? 0;\n const pageCount = Math.ceil(count / pageSize);\n const go = useCallback(\n (to: (page: number) => number) =>\n setAt((a) => {\n const from = a.key === key ? a.page : initialPage;\n return { key, page: Math.max(1, to(from)), version: a.key === key ? a.version : 0 };\n }),\n [key, initialPage],\n );\n const revalidate = useCallback(\n () =>\n new Promise<void>((resolve) => {\n waiting.current.push(resolve);\n setAt((a) => (a.key === key ? { ...a, version: a.version + 1 } : { key, page: initialPage, version: 1 }));\n }),\n [key, initialPage],\n );\n return {\n data: shown?.data ?? [],\n count,\n page,\n pageCount,\n isLoading: isFetching && shown === null,\n isFetching,\n error: shown?.error ?? null,\n hasNextPage: page < pageCount,\n hasPreviousPage: page > 1,\n fetchNext: useCallback(() => go((p) => p + 1), [go]),\n fetchPrevious: useCallback(() => go((p) => p - 1), [go]),\n fetchPage: useCallback((n: number) => go(() => n), [go]),\n revalidate,\n };\n}\n","import {\n checkAuthorization,\n withReverification,\n ZauthaError,\n type AttemptErrors,\n type FetchStatus,\n type OrganizationInvitationResource,\n type OrganizationInvitationStatus,\n type OrganizationMembership,\n type OrganizationMembershipResource,\n type OrganizationResource,\n type Session,\n type SignInResource,\n type SignUpResource,\n type UserOrganizationInvitationResource,\n type UserResource,\n type ZauthaState,\n} from \"@zautha/js\";\nimport { useCallback, useLayoutEffect, useRef, useSyncExternalStore } from \"react\";\nimport { usePages, type PageLoader, type PageSource, type PaginatedResult, type PaginationParams } from \"./pagination\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\n/**\n * What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition\n * given must hold; with none, false.\n */\nexport type HasParams = { role?: string; permission?: string };\nexport type Has = (params: HasParams) => boolean;\n\nexport interface UseAuthResult {\n isLoaded: boolean;\n isSignedIn: boolean;\n userId: string | null;\n sessionId: string | null;\n /** The active organization (`org_…`); null without one, and while signed out. */\n orgId: string | null;\n /** The user's role in it, a full key such as `org:admin`. */\n orgRole: string | null;\n /** Its slug; null without one or while the instance has slugs off. */\n orgSlug: string | null;\n /** The role's custom permissions, full keys such as `org:invoices:read`. */\n orgPermissions: readonly string[] | null;\n getToken: (options?: { skipCache?: boolean }) => Promise<string | null>;\n signOut: (options?: { redirectUrl?: string }) => Promise<void>;\n /**\n * From the session token alone, the same rule as every Zautha SDK and your server: false without an active\n * organization, and always false for a system permission (`org:sys_…`, never in the token).\n */\n has: Has;\n}\n\nconst isLoadedStatus = (status: string): boolean => status === \"ready\" || status === \"degraded\";\n\n/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */\nconst activeSession = (state: ZauthaState): Session | null =>\n state.session?.status === \"active\" ? state.session : null;\n\nexport function useAuth(): UseAuthResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const getToken = useCallback(\n (options?: { skipCache?: boolean }) => zautha?.getToken(options) ?? Promise.resolve(null),\n [zautha],\n );\n const signOut = useCallback(\n (options?: { redirectUrl?: string }) => zautha?.signOut(options) ?? Promise.resolve(),\n [zautha],\n );\n // Until the first load settles, the server's initial state (if any) answers, so nothing flickers.\n const initial = state.status === \"loading\" ? state.initialState : null;\n const session = activeSession(state);\n const userId = initial === null ? (session?.userId ?? null) : initial.userId;\n const sessionId = initial === null ? (session?.id ?? null) : initial.sessionId;\n const signedIn = userId !== null;\n const organization = initial === null ? (session === null ? null : state.organization) : initial.organization;\n const has = useCallback<Has>((params) => checkAuthorization(organization, params), [organization]);\n return {\n isLoaded: isLoadedStatus(state.status) || initial !== null,\n isSignedIn: signedIn,\n userId,\n sessionId,\n orgId: organization?.id ?? null,\n orgRole: organization?.role ?? null,\n orgSlug: organization?.slug ?? null,\n orgPermissions: organization?.permissions ?? null,\n getToken,\n signOut,\n has,\n };\n}\n\n/** The signed-in user with its self-service actions (`user.update`, `user.createEmailAddress`, …). */\nexport function useUser(): { isLoaded: boolean; isSignedIn: boolean; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const signedIn = activeSession(state) !== null;\n // zautha.user is rebuilt only when state.user changes, so the resource is stable between renders.\n const user = !signedIn || state.user === null ? null : (zautha?.user ?? null);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: signedIn, user };\n}\n\n/**\n * Wraps a sensitive action so that it completes after an identity check when it needs one: when `fetcher` throws\n * `ReverificationRequiredError` (e.g. `user.updatePassword`) or resolves to a `Response` with the `403\n * reverification_required` body (your backend with @zautha/backend, @zautha/nextjs or Zautha.AspNetCore), the\n * reverification modal opens and, once the user has verified, `fetcher` runs once more with the same arguments (its\n * token is fresh by then). Closing the modal rejects with `ReverificationCancelledError`. Needs `ui` from @zautha/ui on\n * the provider. The returned function is stable; it always calls the latest `fetcher`.\n */\nexport function useReverification<Args extends unknown[], Result>(\n fetcher: (...args: Args) => Promise<Result>,\n): (...args: Args) => Promise<Result> {\n const zautha = useZautha();\n const latest = useRef(fetcher);\n useLayoutEffect(() => {\n latest.current = fetcher;\n });\n return useCallback(\n (...args: Args) => {\n const call = (...callArgs: Args): Promise<Result> => latest.current(...callArgs);\n // Before the provider has created the instance no modal can open: the action runs as it is.\n return zautha === null ? call(...args) : withReverification(zautha, call)(...args);\n },\n [zautha],\n );\n}\n\n/** The signed-in session; null while signed out or while the session is pending (tasks left). */\nexport function useSession(): { isLoaded: boolean; isSignedIn: boolean; session: Session | null } {\n const state = useZauthaState();\n const session = activeSession(state);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: session !== null, session };\n}\n\nconst noopSubscribe = (): (() => void) => () => undefined;\n\nfunction useResource<T extends SignInResource | SignUpResource>(resource: T | null) {\n const snapshot = useSyncExternalStore(\n resource?.subscribe ?? noopSubscribe,\n () => resource?.snapshot ?? null,\n () => null,\n );\n return snapshot;\n}\n\nexport interface UseSignInResult {\n isLoaded: boolean;\n /** The sign-in resource; null until the provider has created the instance. */\n signIn: SignInResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nconst NO_ERRORS: AttemptErrors = { fields: {}, global: [] };\n\nexport function useSignIn(): UseSignInResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signIn ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signIn: zautha?.signIn ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\nexport interface UseSignUpResult {\n isLoaded: boolean;\n signUp: SignUpResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nexport function useSignUp(): UseSignUpResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signUp ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signUp: zautha?.signUp ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\n/** A list a hook reads only when asked: `true` for the defaults, or the page size, the first page and the filters. */\nexport type ListParams<Filters = object> = true | (PaginationParams & Filters);\n\nexport interface UseOrganizationParams {\n /** The active organization's members (needs `org:sys_memberships:read`), filtered by a role key. */\n memberships?: ListParams<{ role?: string }>;\n /** Its invitations, filtered by status; read only for a member with `org:sys_memberships:manage` (else empty). */\n invitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationResult {\n isLoaded: boolean;\n /** The session's active organization with the member's actions; null without one, while signed out or pending. */\n organization: OrganizationResource | null;\n /** The user's membership of it: role and every permission of the role, system ones included (to show buttons). */\n membership: OrganizationMembershipResource | null;\n /** Only when asked for in the params. */\n memberships?: PaginatedResult<OrganizationMembership>;\n invitations?: PaginatedResult<OrganizationInvitationResource>;\n}\n\nexport interface UseOrganizationListParams {\n /** The user's memberships, newest first. */\n userMemberships?: ListParams;\n /** The invitations to the user's verified addresses; by default the pending ones. */\n userInvitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationListResult {\n isLoaded: boolean;\n /** Creates an organization with the user in it; it is not made active (`setActive` does that). */\n createOrganization: (params: { name: string; slug?: string }) => Promise<OrganizationResource>;\n /** Makes an organization (id or slug) the session's active one; null is the personal account. */\n setActive: (params: { organization: string | null }) => Promise<void>;\n userMemberships?: PaginatedResult<OrganizationMembershipResource>;\n userInvitations?: PaginatedResult<UserOrganizationInvitationResource>;\n}\n\n/** A list's filters: its params without the page size and the first page. */\nfunction filtersOf<F extends object>(params: ListParams<F>): F {\n const filters = { ...(params === true ? {} : params) } as PaginationParams & F;\n delete filters.pageSize;\n delete filters.initialPage;\n return filters;\n}\n\n/** A list of `owner` read with `load`: its key (`owner` and the params, so new filters start the list again). */\nconst list = <T>(owner: string, params: ListParams<object>, load: PageLoader<T>): PageSource<T> => ({\n key: `${owner}:${JSON.stringify(params)}`,\n load,\n});\n\n/** The signed-in user (an active session's) and whether hooks that read it are loaded. */\nfunction useSignedInUser(): { isLoaded: boolean; state: ZauthaState; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const user = activeSession(state) === null ? null : (zautha?.user ?? null);\n // An active session is loaded once its user is.\n return { isLoaded: isLoadedStatus(state.status) && (activeSession(state) === null || user !== null), state, user };\n}\n\n/**\n * The session's active organization and the user's membership of it, from the session token and the user (no request of\n * its own), and on request its members and invitations, page by page. The lists start again on their first page when\n * the active organization changes.\n */\nexport function useOrganization(params: UseOrganizationParams = {}): UseOrganizationResult {\n const { isLoaded, state, user } = useSignedInUser();\n const id = state.organization?.id;\n const membership = user?.organizationMemberships.find((m) => m.organization.id === id) ?? null;\n const organization = membership?.organization ?? null;\n // The user's own membership: its user is the signed-in one.\n const owner = membership === null ? \"\" : `${membership.publicUserData.userId}:${membership.organization.id}`;\n const { memberships, invitations } = params;\n const manages = membership?.permissions.includes(\"org:sys_memberships:manage\") === true;\n const members = usePages(\n organization === null || memberships === undefined\n ? null\n : list(owner, memberships, (page) => organization.getMemberships({ ...filtersOf(memberships), ...page })),\n memberships,\n );\n const invited = usePages(\n organization === null || invitations === undefined || !manages\n ? null\n : list(owner, invitations, (page) => organization.getInvitations({ ...filtersOf(invitations), ...page })),\n invitations,\n );\n return {\n isLoaded,\n organization,\n membership,\n ...(memberships === undefined ? {} : { memberships: members }),\n ...(invitations === undefined ? {} : { invitations: invited }),\n };\n}\n\n/**\n * Creating an organization and choosing the active one, and on request the user's memberships and the invitations to\n * the user, page by page.\n */\nexport function useOrganizationList(params: UseOrganizationListParams = {}): UseOrganizationListResult {\n const zautha = useZautha();\n const { isLoaded, user } = useSignedInUser();\n const { userMemberships, userInvitations } = params;\n const memberships = usePages(\n user === null || userMemberships === undefined\n ? null\n : list(user.id, userMemberships, (page) => user.getOrganizationMemberships(page)),\n userMemberships,\n );\n const invitations = usePages(\n user === null || userInvitations === undefined\n ? null\n : list(user.id, userInvitations, (page) =>\n user.getOrganizationInvitations({ ...filtersOf(userInvitations), ...page }),\n ),\n userInvitations,\n );\n const createOrganization = useCallback(\n (p: { name: string; slug?: string }) => zautha?.createOrganization(p) ?? notLoaded(),\n [zautha],\n );\n const setActive = useCallback((p: { organization: string | null }) => zautha?.setActive(p) ?? notLoaded(), [zautha]);\n return {\n isLoaded,\n createOrganization,\n setActive,\n ...(userMemberships === undefined ? {} : { userMemberships: memberships }),\n ...(userInvitations === undefined ? {} : { userInvitations: invitations }),\n };\n}\n\nconst notLoaded = (): Promise<never> => Promise.reject(new ZauthaError(\"Zautha is not loaded yet.\"));\n","import { useEffect, type ReactNode } from \"react\";\nimport { useAuth, type Has, type HasParams } from \"./hooks\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\nexport type ShowWhen = \"signed-in\" | \"signed-out\" | HasParams | ((has: Has) => boolean);\n\n/**\n * Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has\n * loaded, so a signed-in user never sees a signed-out flash.\n */\nexport function Show(props: { when: ShowWhen; fallback?: ReactNode; children?: ReactNode }): ReactNode {\n const { isLoaded, isSignedIn, has } = useAuth();\n if (!isLoaded) return null;\n const { when } = props;\n const pass =\n when === \"signed-in\"\n ? isSignedIn\n : when === \"signed-out\"\n ? !isSignedIn\n : typeof when === \"function\"\n ? when(has)\n : has(when);\n return pass ? props.children : (props.fallback ?? null);\n}\n\nexport function ZauthaLoading(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"loading\" ? props.children : null;\n}\n\n/** Loaded, including degraded (network trouble after load: last known state is shown). */\nexport function ZauthaLoaded(props: { children?: ReactNode }): ReactNode {\n const { status } = useZauthaState();\n return status === \"ready\" || status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaDegraded(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaFailed(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"failed\" ? props.children : null;\n}\n\n/** Sends a signed-out visitor to sign-in once loaded; renders nothing. */\nexport function RedirectToSignIn(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignIn(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n\nexport function RedirectToSignUp(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignUp(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n","import { Children, cloneElement, isValidElement, type MouseEvent, type ReactElement, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\ninterface ButtonProps {\n /** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */\n mode?: \"redirect\" | \"modal\";\n redirectUrl?: string;\n children?: ReactNode;\n}\n\n/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */\nfunction Trigger(props: { children: ReactNode; label: string; onClick: () => void }): ReactNode {\n const child = Children.count(props.children) === 1 ? Children.only(props.children) : null;\n if (isValidElement<{ onClick?: (event: MouseEvent) => void }>(child)) {\n const original = child.props.onClick;\n return cloneElement(child as ReactElement<{ onClick?: (event: MouseEvent) => void }>, {\n onClick: (event: MouseEvent) => {\n original?.(event);\n if (!event.defaultPrevented) props.onClick();\n },\n });\n }\n return (\n <button type=\"button\" onClick={props.onClick}>\n {props.children ?? props.label}\n </button>\n );\n}\n\nexport function SignInButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign in\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignIn(options) : zautha?.redirectToSignIn(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignUpButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign up\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignUp(options) : zautha?.redirectToSignUp(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignOutButton(props: { redirectUrl?: string; children?: ReactNode }): ReactNode {\n const zautha = useZautha();\n return (\n <Trigger\n label=\"Sign out\"\n onClick={() => void zautha?.signOut(props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl })}\n >\n {props.children}\n </Trigger>\n );\n}\n","import type { UiComponentName } from \"@zautha/js\";\nimport { useEffect, useRef, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\n/**\n * Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in\n * place. SSR renders only the empty div.\n */\nfunction Mounted(props: { name: UiComponentName; componentProps: object }): ReactNode {\n const zautha = useZautha();\n const ref = useRef<HTMLDivElement>(null);\n const mountedWith = useRef<object | null>(null);\n const { name, componentProps } = props;\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null) return;\n zautha.mount(name, element, componentProps);\n mountedWith.current = componentProps;\n return () => {\n mountedWith.current = null;\n zautha.unmount(element);\n };\n // componentProps changes are applied by the effect below without remounting.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zautha, name]);\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null || mountedWith.current === null || mountedWith.current === componentProps)\n return;\n mountedWith.current = componentProps;\n zautha.updateMounted(element, componentProps);\n }, [zautha, componentProps]);\n\n return <div ref={ref} />;\n}\n\n// Prop types live in @zautha/ui; they are structural here so @zautha/react has no runtime dependency on it.\nexport function SignIn(props: import(\"@zautha/ui\").SignInProps): ReactNode {\n return <Mounted name=\"SignIn\" componentProps={props} />;\n}\n\nexport function SignUp(props: import(\"@zautha/ui\").SignUpProps): ReactNode {\n return <Mounted name=\"SignUp\" componentProps={props} />;\n}\n\n/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */\nexport function AuthenticateWithRedirectCallback(\n props: import(\"@zautha/ui\").AuthenticateWithRedirectCallbackProps,\n): ReactNode {\n return <Mounted name=\"AuthenticateWithRedirectCallback\" componentProps={props} />;\n}\n\nexport function UserButton(props: import(\"@zautha/ui\").UserButtonProps): ReactNode {\n return <Mounted name=\"UserButton\" componentProps={props} />;\n}\n\nexport function UserProfile(props: import(\"@zautha/ui\").UserProfileProps): ReactNode {\n return <Mounted name=\"UserProfile\" componentProps={props} />;\n}\n\nexport function OAuthConsent(props: import(\"@zautha/ui\").OAuthConsentProps): ReactNode {\n return <Mounted name=\"OAuthConsent\" componentProps={props} />;\n}\n\nexport function CreateOrganization(props: import(\"@zautha/ui\").CreateOrganizationProps): ReactNode {\n return <Mounted name=\"CreateOrganization\" componentProps={props} />;\n}\n\nexport function OrganizationProfile(props: import(\"@zautha/ui\").OrganizationProfileProps): ReactNode {\n return <Mounted name=\"OrganizationProfile\" componentProps={props} />;\n}\n\nexport function OrganizationSwitcher(props: import(\"@zautha/ui\").OrganizationSwitcherProps): ReactNode {\n return <Mounted name=\"OrganizationSwitcher\" componentProps={props} />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["ZauthaError"],"sources":["../src/provider.tsx","../src/pagination.ts","../src/hooks.ts","../src/control.tsx","../src/buttons.tsx","../src/prebuilt.tsx"],"sourcesContent":["import { Zautha, type ZauthaOptions, type ZauthaState } from \"@zautha/js\";\nimport { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from \"react\";\n\ninterface ZauthaContextValue {\n readonly zautha: Zautha | null;\n /** The snapshot before the instance exists and during server rendering (carries `initialState`). */\n readonly pending: ZauthaState;\n}\n\nconst ZauthaContext = createContext<ZauthaContextValue | undefined>(undefined);\n\nexport interface ZauthaProviderProps extends Omit<ZauthaOptions, \"fetch\"> {\n publishableKey: string;\n children?: ReactNode;\n}\n\n/**\n * Creates the Zautha instance after mount (never during render, so StrictMode's double mount and SSR\n * create no timers or channels), loads it, and disposes it on unmount. Until then hooks report\n * `isLoaded: false`, unless `initialState` (the server's view, e.g. from @zautha/nextjs) says who is signed in.\n */\nexport function ZauthaProvider({ publishableKey, children, ...options }: ZauthaProviderProps): ReactNode {\n const [zautha, setZautha] = useState<Zautha | null>(null);\n const { ui, appearance, localization, signInUrl, signUpUrl, navigate, initialState } = options;\n const [pending] = useState<ZauthaState>(() => ({ ...NO_STATE, initialState: initialState ?? null }));\n\n useEffect(() => {\n const instance = new Zautha(publishableKey, {\n ...(ui === undefined ? {} : { ui }),\n ...(appearance === undefined ? {} : { appearance }),\n ...(localization === undefined ? {} : { localization }),\n ...(signInUrl === undefined ? {} : { signInUrl }),\n ...(signUpUrl === undefined ? {} : { signUpUrl }),\n ...(navigate === undefined ? {} : { navigate }),\n ...(initialState === undefined ? {} : { initialState }),\n });\n // The instance is an external system: it is created here, never during render, and published through state.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setZautha(instance);\n void instance.load();\n return () => {\n instance.dispose();\n setZautha(null);\n };\n // Appearance/localization objects are read at mount; changing the key re-creates the instance.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [publishableKey]);\n\n const value = useMemo(() => ({ zautha, pending }), [zautha, pending]);\n return <ZauthaContext.Provider value={value}>{children}</ZauthaContext.Provider>;\n}\n\n/** The Zautha instance, or null before the provider has created it. */\nexport function useZautha(): Zautha | null {\n return useZauthaContext().zautha;\n}\n\nfunction useZauthaContext(): ZauthaContextValue {\n const value = useContext(ZauthaContext);\n if (value === undefined) throw new Error(\"Zautha hooks and components must be used inside <ZauthaProvider>.\");\n return value;\n}\n\nconst NO_STATE: ZauthaState = {\n status: \"loading\",\n environment: null,\n client: null,\n session: null,\n user: null,\n organization: null,\n initialState: null,\n};\nconst noop = (): (() => void) => () => undefined;\n\n/** Reactive snapshot of the instance state (the loading state, with any initial state, before the instance exists). */\nexport function useZauthaState(): ZauthaState {\n const { zautha, pending } = useZauthaContext();\n return useSyncExternalStore(\n zautha?.subscribe ?? noop,\n () => zautha?.getSnapshot() ?? pending,\n () => pending,\n );\n}\n","import type { Paginated } from \"@zautha/js\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** A list's page size (default 10, the API's) and the page to start on (default 1). */\nexport interface PaginationParams {\n pageSize?: number;\n initialPage?: number;\n}\n\n/**\n * One page of a list and how to move through it. `isLoading`: the page has no data yet; `isFetching`: a request for it\n * is in flight (also while `revalidate()` reads it again). A failed read leaves `data` empty and sets `error`.\n */\nexport interface PaginatedResult<T> {\n data: T[];\n /** How many there are in all. */\n count: number;\n page: number;\n pageCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchNext: () => void;\n fetchPrevious: () => void;\n fetchPage: (page: number) => void;\n /** Reads the current page again; resolves once it has been read. */\n revalidate: () => Promise<void>;\n}\n\n/** What a page read gets: 1–100 items after `offset`. */\nexport type PageLoader<T> = (page: { limit: number; offset: number }) => Promise<Paginated<T>>;\n\n/** A list to read: `key` names what is listed (the user, the organization, the filters); `load` reads one page. */\nexport interface PageSource<T> {\n readonly key: string;\n readonly load: PageLoader<T>;\n}\n\ninterface Settled<T> {\n readonly request: string;\n readonly key: string;\n readonly page: number;\n readonly data: T[];\n readonly count: number;\n readonly error: Error | null;\n}\n\n/**\n * The pages of one list. Without a source nothing is read and the list is empty; a source with a new key starts again on\n * the initial page. A response to an older request (another page, key or revalidation) is dropped, so it never\n * overwrites a newer one.\n */\nexport function usePages<T>(\n source: PageSource<T> | null,\n params: PaginationParams | true | undefined,\n): PaginatedResult<T> {\n const key = source?.key ?? null;\n const { pageSize = 10, initialPage = 1 } = params === true || params === undefined ? {} : params;\n const [at, setAt] = useState({ key, page: initialPage, version: 0 });\n const [settled, setSettled] = useState<Settled<T> | null>(null);\n const latest = useRef(0);\n const waiting = useRef<(() => void)[]>([]);\n if (at.key !== key) {\n // Another list (also an earlier one again): start on its initial page with a fresh read, whatever was shown before.\n setAt({ key, page: initialPage, version: 0 });\n setSettled(null);\n }\n const { page, version } = at.key === key ? at : { page: initialPage, version: 0 };\n const request = JSON.stringify([key, page, pageSize, version]);\n const loader = useRef(source?.load);\n useEffect(() => {\n loader.current = source?.load;\n });\n\n useEffect(() => {\n const id = ++latest.current;\n const settle = (data: T[], count: number, error: Error | null): void => {\n if (latest.current !== id) return;\n if (key !== null) setSettled({ request, key, page, data, count, error });\n for (const resolve of waiting.current.splice(0)) resolve();\n };\n if (key === null || loader.current === undefined) return settle([], 0, null);\n loader.current({ limit: pageSize, offset: (page - 1) * pageSize }).then(\n (r) => settle(r.data, r.totalCount, null),\n (error: unknown) => settle([], 0, error instanceof Error ? error : new Error(String(error))),\n );\n // `request` covers key, page, pageSize and version.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request]);\n\n const shown = settled !== null && settled.key === key && settled.page === page ? settled : null;\n const isFetching = key !== null && settled?.request !== request;\n const count = shown?.count ?? 0;\n const pageCount = Math.ceil(count / pageSize);\n const go = useCallback(\n (to: (page: number) => number) =>\n setAt((a) => {\n const from = a.key === key ? a.page : initialPage;\n return { key, page: Math.max(1, to(from)), version: a.key === key ? a.version : 0 };\n }),\n [key, initialPage],\n );\n const revalidate = useCallback(\n () =>\n new Promise<void>((resolve) => {\n waiting.current.push(resolve);\n setAt((a) => (a.key === key ? { ...a, version: a.version + 1 } : { key, page: initialPage, version: 1 }));\n }),\n [key, initialPage],\n );\n return {\n data: shown?.data ?? [],\n count,\n page,\n pageCount,\n isLoading: isFetching && shown === null,\n isFetching,\n error: shown?.error ?? null,\n hasNextPage: page < pageCount,\n hasPreviousPage: page > 1,\n fetchNext: useCallback(() => go((p) => p + 1), [go]),\n fetchPrevious: useCallback(() => go((p) => p - 1), [go]),\n fetchPage: useCallback((n: number) => go(() => n), [go]),\n revalidate,\n };\n}\n","import {\n checkAuthorization,\n withReverification,\n ZauthaError,\n type AttemptErrors,\n type FetchStatus,\n type OrganizationInvitationResource,\n type OrganizationInvitationStatus,\n type OrganizationMembership,\n type OrganizationMembershipResource,\n type OrganizationResource,\n type Session,\n type SessionActor,\n type SignInResource,\n type SignUpResource,\n type UserOrganizationInvitationResource,\n type UserResource,\n type ZauthaState,\n} from \"@zautha/js\";\nimport { useCallback, useLayoutEffect, useRef, useSyncExternalStore } from \"react\";\nimport { usePages, type PageLoader, type PageSource, type PaginatedResult, type PaginationParams } from \"./pagination\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\n/**\n * What `has` checks in the session's active organization: full keys (`org:admin`, `org:invoices:read`). Every condition\n * given must hold; with none, false.\n */\nexport type HasParams = { role?: string; permission?: string };\nexport type Has = (params: HasParams) => boolean;\n\nexport interface UseAuthResult {\n isLoaded: boolean;\n isSignedIn: boolean;\n userId: string | null;\n sessionId: string | null;\n /** The active organization (`org_…`); null without one, and while signed out. */\n orgId: string | null;\n /** The user's role in it, a full key such as `org:admin`. */\n orgRole: string | null;\n /** Its slug; null without one or while the instance has slugs off. */\n orgSlug: string | null;\n /** The role's custom permissions, full keys such as `org:invoices:read`. */\n orgPermissions: readonly string[] | null;\n /**\n * Who is impersonating the user (an impersonation session; the token's `act` claim); null for the user's own session\n * and while signed out. With `ui` from @zautha/ui the provider shows the impersonation band by itself.\n */\n actor: SessionActor | null;\n getToken: (options?: { skipCache?: boolean }) => Promise<string | null>;\n signOut: (options?: { redirectUrl?: string }) => Promise<void>;\n /**\n * From the session token alone, the same rule as every Zautha SDK and your server: false without an active\n * organization, and always false for a system permission (`org:sys_…`, never in the token).\n */\n has: Has;\n}\n\nconst isLoadedStatus = (status: string): boolean => status === \"ready\" || status === \"degraded\";\n\n/** The signed-in session: a pending one (tasks left, e.g. setting up two-step verification) counts as signed out. */\nconst activeSession = (state: ZauthaState): Session | null =>\n state.session?.status === \"active\" ? state.session : null;\n\nexport function useAuth(): UseAuthResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const getToken = useCallback(\n (options?: { skipCache?: boolean }) => zautha?.getToken(options) ?? Promise.resolve(null),\n [zautha],\n );\n const signOut = useCallback(\n (options?: { redirectUrl?: string }) => zautha?.signOut(options) ?? Promise.resolve(),\n [zautha],\n );\n // Until the first load settles, the server's initial state (if any) answers, so nothing flickers.\n const initial = state.status === \"loading\" ? state.initialState : null;\n const session = activeSession(state);\n const userId = initial === null ? (session?.userId ?? null) : initial.userId;\n const sessionId = initial === null ? (session?.id ?? null) : initial.sessionId;\n const signedIn = userId !== null;\n const organization = initial === null ? (session === null ? null : state.organization) : initial.organization;\n const actor = initial === null ? (session?.actor ?? null) : initial.actor;\n const has = useCallback<Has>((params) => checkAuthorization(organization, params), [organization]);\n return {\n isLoaded: isLoadedStatus(state.status) || initial !== null,\n isSignedIn: signedIn,\n userId,\n sessionId,\n orgId: organization?.id ?? null,\n orgRole: organization?.role ?? null,\n orgSlug: organization?.slug ?? null,\n orgPermissions: organization?.permissions ?? null,\n actor,\n getToken,\n signOut,\n has,\n };\n}\n\n/** The signed-in user with its self-service actions (`user.update`, `user.createEmailAddress`, …). */\nexport function useUser(): { isLoaded: boolean; isSignedIn: boolean; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const signedIn = activeSession(state) !== null;\n // zautha.user is rebuilt only when state.user changes, so the resource is stable between renders.\n const user = !signedIn || state.user === null ? null : (zautha?.user ?? null);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: signedIn, user };\n}\n\n/**\n * Wraps a sensitive action so that it completes after an identity check when it needs one: when `fetcher` throws\n * `ReverificationRequiredError` (e.g. `user.updatePassword`) or resolves to a `Response` with the `403\n * reverification_required` body (your backend with @zautha/backend, @zautha/nextjs or Zautha.AspNetCore), the\n * reverification modal opens and, once the user has verified, `fetcher` runs once more with the same arguments (its\n * token is fresh by then). Closing the modal rejects with `ReverificationCancelledError`. Needs `ui` from @zautha/ui on\n * the provider. The returned function is stable; it always calls the latest `fetcher`.\n */\nexport function useReverification<Args extends unknown[], Result>(\n fetcher: (...args: Args) => Promise<Result>,\n): (...args: Args) => Promise<Result> {\n const zautha = useZautha();\n const latest = useRef(fetcher);\n useLayoutEffect(() => {\n latest.current = fetcher;\n });\n return useCallback(\n (...args: Args) => {\n const call = (...callArgs: Args): Promise<Result> => latest.current(...callArgs);\n // Before the provider has created the instance no modal can open: the action runs as it is.\n return zautha === null ? call(...args) : withReverification(zautha, call)(...args);\n },\n [zautha],\n );\n}\n\n/** The signed-in session; null while signed out or while the session is pending (tasks left). */\nexport function useSession(): { isLoaded: boolean; isSignedIn: boolean; session: Session | null } {\n const state = useZauthaState();\n const session = activeSession(state);\n return { isLoaded: isLoadedStatus(state.status), isSignedIn: session !== null, session };\n}\n\nconst noopSubscribe = (): (() => void) => () => undefined;\n\nfunction useResource<T extends SignInResource | SignUpResource>(resource: T | null) {\n const snapshot = useSyncExternalStore(\n resource?.subscribe ?? noopSubscribe,\n () => resource?.snapshot ?? null,\n () => null,\n );\n return snapshot;\n}\n\nexport interface UseSignInResult {\n isLoaded: boolean;\n /** The sign-in resource; null until the provider has created the instance. */\n signIn: SignInResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nconst NO_ERRORS: AttemptErrors = { fields: {}, global: [] };\n\nexport function useSignIn(): UseSignInResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signIn ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signIn: zautha?.signIn ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\nexport interface UseSignUpResult {\n isLoaded: boolean;\n signUp: SignUpResource | null;\n errors: AttemptErrors;\n fetchStatus: FetchStatus;\n}\n\nexport function useSignUp(): UseSignUpResult {\n const zautha = useZautha();\n const state = useZauthaState();\n const snapshot = useResource(zautha?.signUp ?? null);\n return {\n isLoaded: isLoadedStatus(state.status),\n signUp: zautha?.signUp ?? null,\n errors: snapshot?.errors ?? NO_ERRORS,\n fetchStatus: snapshot?.fetchStatus ?? \"idle\",\n };\n}\n\n/** A list a hook reads only when asked: `true` for the defaults, or the page size, the first page and the filters. */\nexport type ListParams<Filters = object> = true | (PaginationParams & Filters);\n\nexport interface UseOrganizationParams {\n /** The active organization's members (needs `org:sys_memberships:read`), filtered by a role key. */\n memberships?: ListParams<{ role?: string }>;\n /** Its invitations, filtered by status; read only for a member with `org:sys_memberships:manage` (else empty). */\n invitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationResult {\n isLoaded: boolean;\n /** The session's active organization with the member's actions; null without one, while signed out or pending. */\n organization: OrganizationResource | null;\n /** The user's membership of it: role and every permission of the role, system ones included (to show buttons). */\n membership: OrganizationMembershipResource | null;\n /** Only when asked for in the params. */\n memberships?: PaginatedResult<OrganizationMembership>;\n invitations?: PaginatedResult<OrganizationInvitationResource>;\n}\n\nexport interface UseOrganizationListParams {\n /** The user's memberships, newest first. */\n userMemberships?: ListParams;\n /** The invitations to the user's verified addresses; by default the pending ones. */\n userInvitations?: ListParams<{ status?: OrganizationInvitationStatus[] }>;\n}\n\nexport interface UseOrganizationListResult {\n isLoaded: boolean;\n /** Creates an organization with the user in it; it is not made active (`setActive` does that). */\n createOrganization: (params: { name: string; slug?: string }) => Promise<OrganizationResource>;\n /** Makes an organization (id or slug) the session's active one; null is the personal account. */\n setActive: (params: { organization: string | null }) => Promise<void>;\n userMemberships?: PaginatedResult<OrganizationMembershipResource>;\n userInvitations?: PaginatedResult<UserOrganizationInvitationResource>;\n}\n\n/** A list's filters: its params without the page size and the first page. */\nfunction filtersOf<F extends object>(params: ListParams<F>): F {\n const filters = { ...(params === true ? {} : params) } as PaginationParams & F;\n delete filters.pageSize;\n delete filters.initialPage;\n return filters;\n}\n\n/** A list of `owner` read with `load`: its key (`owner` and the params, so new filters start the list again). */\nconst list = <T>(owner: string, params: ListParams<object>, load: PageLoader<T>): PageSource<T> => ({\n key: `${owner}:${JSON.stringify(params)}`,\n load,\n});\n\n/** The signed-in user (an active session's) and whether hooks that read it are loaded. */\nfunction useSignedInUser(): { isLoaded: boolean; state: ZauthaState; user: UserResource | null } {\n const zautha = useZautha();\n const state = useZauthaState();\n const user = activeSession(state) === null ? null : (zautha?.user ?? null);\n // An active session is loaded once its user is.\n return { isLoaded: isLoadedStatus(state.status) && (activeSession(state) === null || user !== null), state, user };\n}\n\n/**\n * The session's active organization and the user's membership of it, from the session token and the user (no request of\n * its own), and on request its members and invitations, page by page. The lists start again on their first page when\n * the active organization changes.\n */\nexport function useOrganization(params: UseOrganizationParams = {}): UseOrganizationResult {\n const { isLoaded, state, user } = useSignedInUser();\n const id = state.organization?.id;\n const membership = user?.organizationMemberships.find((m) => m.organization.id === id) ?? null;\n const organization = membership?.organization ?? null;\n // The user's own membership: its user is the signed-in one.\n const owner = membership === null ? \"\" : `${membership.publicUserData.userId}:${membership.organization.id}`;\n const { memberships, invitations } = params;\n const manages = membership?.permissions.includes(\"org:sys_memberships:manage\") === true;\n const members = usePages(\n organization === null || memberships === undefined\n ? null\n : list(owner, memberships, (page) => organization.getMemberships({ ...filtersOf(memberships), ...page })),\n memberships,\n );\n const invited = usePages(\n organization === null || invitations === undefined || !manages\n ? null\n : list(owner, invitations, (page) => organization.getInvitations({ ...filtersOf(invitations), ...page })),\n invitations,\n );\n return {\n isLoaded,\n organization,\n membership,\n ...(memberships === undefined ? {} : { memberships: members }),\n ...(invitations === undefined ? {} : { invitations: invited }),\n };\n}\n\n/**\n * Creating an organization and choosing the active one, and on request the user's memberships and the invitations to\n * the user, page by page.\n */\nexport function useOrganizationList(params: UseOrganizationListParams = {}): UseOrganizationListResult {\n const zautha = useZautha();\n const { isLoaded, user } = useSignedInUser();\n const { userMemberships, userInvitations } = params;\n const memberships = usePages(\n user === null || userMemberships === undefined\n ? null\n : list(user.id, userMemberships, (page) => user.getOrganizationMemberships(page)),\n userMemberships,\n );\n const invitations = usePages(\n user === null || userInvitations === undefined\n ? null\n : list(user.id, userInvitations, (page) =>\n user.getOrganizationInvitations({ ...filtersOf(userInvitations), ...page }),\n ),\n userInvitations,\n );\n const createOrganization = useCallback(\n (p: { name: string; slug?: string }) => zautha?.createOrganization(p) ?? notLoaded(),\n [zautha],\n );\n const setActive = useCallback((p: { organization: string | null }) => zautha?.setActive(p) ?? notLoaded(), [zautha]);\n return {\n isLoaded,\n createOrganization,\n setActive,\n ...(userMemberships === undefined ? {} : { userMemberships: memberships }),\n ...(userInvitations === undefined ? {} : { userInvitations: invitations }),\n };\n}\n\nconst notLoaded = (): Promise<never> => Promise.reject(new ZauthaError(\"Zautha is not loaded yet.\"));\n","import { useEffect, type ReactNode } from \"react\";\nimport { useAuth, type Has, type HasParams } from \"./hooks\";\nimport { useZautha, useZauthaState } from \"./provider\";\n\nexport type ShowWhen = \"signed-in\" | \"signed-out\" | HasParams | ((has: Has) => boolean);\n\n/**\n * Renders `children` when the condition holds, else `fallback`. Renders nothing until Zautha has\n * loaded, so a signed-in user never sees a signed-out flash.\n */\nexport function Show(props: { when: ShowWhen; fallback?: ReactNode; children?: ReactNode }): ReactNode {\n const { isLoaded, isSignedIn, has } = useAuth();\n if (!isLoaded) return null;\n const { when } = props;\n const pass =\n when === \"signed-in\"\n ? isSignedIn\n : when === \"signed-out\"\n ? !isSignedIn\n : typeof when === \"function\"\n ? when(has)\n : has(when);\n return pass ? props.children : (props.fallback ?? null);\n}\n\nexport function ZauthaLoading(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"loading\" ? props.children : null;\n}\n\n/** Loaded, including degraded (network trouble after load: last known state is shown). */\nexport function ZauthaLoaded(props: { children?: ReactNode }): ReactNode {\n const { status } = useZauthaState();\n return status === \"ready\" || status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaDegraded(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"degraded\" ? props.children : null;\n}\n\nexport function ZauthaFailed(props: { children?: ReactNode }): ReactNode {\n return useZauthaState().status === \"failed\" ? props.children : null;\n}\n\n/** Sends a signed-out visitor to sign-in once loaded; renders nothing. */\nexport function RedirectToSignIn(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignIn(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n\nexport function RedirectToSignUp(props: { redirectUrl?: string }): ReactNode {\n const zautha = useZautha();\n const { isLoaded, isSignedIn } = useAuth();\n const { redirectUrl } = props;\n useEffect(() => {\n if (zautha !== null && isLoaded && !isSignedIn)\n zautha.redirectToSignUp(redirectUrl === undefined ? {} : { redirectUrl });\n }, [zautha, isLoaded, isSignedIn, redirectUrl]);\n return null;\n}\n","import { Children, cloneElement, isValidElement, type MouseEvent, type ReactElement, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\ninterface ButtonProps {\n /** `redirect` (default) goes to the sign-in page; `modal` opens the prebuilt component (needs `ui`). */\n mode?: \"redirect\" | \"modal\";\n redirectUrl?: string;\n children?: ReactNode;\n}\n\n/** Wraps its single child (or renders a plain button) and wires the click. Unstyled by design. */\nfunction Trigger(props: { children: ReactNode; label: string; onClick: () => void }): ReactNode {\n const child = Children.count(props.children) === 1 ? Children.only(props.children) : null;\n if (isValidElement<{ onClick?: (event: MouseEvent) => void }>(child)) {\n const original = child.props.onClick;\n return cloneElement(child as ReactElement<{ onClick?: (event: MouseEvent) => void }>, {\n onClick: (event: MouseEvent) => {\n original?.(event);\n if (!event.defaultPrevented) props.onClick();\n },\n });\n }\n return (\n <button type=\"button\" onClick={props.onClick}>\n {props.children ?? props.label}\n </button>\n );\n}\n\nexport function SignInButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign in\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignIn(options) : zautha?.redirectToSignIn(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignUpButton(props: ButtonProps): ReactNode {\n const zautha = useZautha();\n const options = props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl };\n return (\n <Trigger\n label=\"Sign up\"\n onClick={() => (props.mode === \"modal\" ? zautha?.openSignUp(options) : zautha?.redirectToSignUp(options))}\n >\n {props.children}\n </Trigger>\n );\n}\n\nexport function SignOutButton(props: { redirectUrl?: string; children?: ReactNode }): ReactNode {\n const zautha = useZautha();\n return (\n <Trigger\n label=\"Sign out\"\n onClick={() => void zautha?.signOut(props.redirectUrl === undefined ? {} : { redirectUrl: props.redirectUrl })}\n >\n {props.children}\n </Trigger>\n );\n}\n","import type { UiComponentName } from \"@zautha/js\";\nimport { useEffect, useRef, type ReactNode } from \"react\";\nimport { useZautha } from \"./provider\";\n\n/**\n * Mounts a @zautha/ui component into a div once the instance exists; later prop changes update it in\n * place. SSR renders only the empty div.\n */\nfunction Mounted(props: { name: UiComponentName; componentProps: object }): ReactNode {\n const zautha = useZautha();\n const ref = useRef<HTMLDivElement>(null);\n const mountedWith = useRef<object | null>(null);\n const { name, componentProps } = props;\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null) return;\n zautha.mount(name, element, componentProps);\n mountedWith.current = componentProps;\n return () => {\n mountedWith.current = null;\n zautha.unmount(element);\n };\n // componentProps changes are applied by the effect below without remounting.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zautha, name]);\n\n useEffect(() => {\n const element = ref.current;\n if (zautha === null || element === null || mountedWith.current === null || mountedWith.current === componentProps)\n return;\n mountedWith.current = componentProps;\n zautha.updateMounted(element, componentProps);\n }, [zautha, componentProps]);\n\n return <div ref={ref} />;\n}\n\n// Prop types live in @zautha/ui; they are structural here so @zautha/react has no runtime dependency on it.\nexport function SignIn(props: import(\"@zautha/ui\").SignInProps): ReactNode {\n return <Mounted name=\"SignIn\" componentProps={props} />;\n}\n\nexport function SignUp(props: import(\"@zautha/ui\").SignUpProps): ReactNode {\n return <Mounted name=\"SignUp\" componentProps={props} />;\n}\n\n/** The page a provider sends the user back to: finishes the social sign-in or sign-up (see @zautha/ui). */\nexport function AuthenticateWithRedirectCallback(\n props: import(\"@zautha/ui\").AuthenticateWithRedirectCallbackProps,\n): ReactNode {\n return <Mounted name=\"AuthenticateWithRedirectCallback\" componentProps={props} />;\n}\n\nexport function UserButton(props: import(\"@zautha/ui\").UserButtonProps): ReactNode {\n return <Mounted name=\"UserButton\" componentProps={props} />;\n}\n\nexport function UserProfile(props: import(\"@zautha/ui\").UserProfileProps): ReactNode {\n return <Mounted name=\"UserProfile\" componentProps={props} />;\n}\n\nexport function OAuthConsent(props: import(\"@zautha/ui\").OAuthConsentProps): ReactNode {\n return <Mounted name=\"OAuthConsent\" componentProps={props} />;\n}\n\nexport function CreateOrganization(props: import(\"@zautha/ui\").CreateOrganizationProps): ReactNode {\n return <Mounted name=\"CreateOrganization\" componentProps={props} />;\n}\n\nexport function OrganizationProfile(props: import(\"@zautha/ui\").OrganizationProfileProps): ReactNode {\n return <Mounted name=\"OrganizationProfile\" componentProps={props} />;\n}\n\nexport function OrganizationSwitcher(props: import(\"@zautha/ui\").OrganizationSwitcherProps): ReactNode {\n return <Mounted name=\"OrganizationSwitcher\" componentProps={props} />;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zautha/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "React bindings for Zautha: provider, hooks, <Show>, buttons and prebuilt components.",
|
|
6
|
+
"homepage": "https://zautha.com/docs/sdk/react/",
|
|
6
7
|
"license": "MIT",
|
|
7
8
|
"repository": {
|
|
8
9
|
"type": "git",
|
|
@@ -31,12 +32,12 @@
|
|
|
31
32
|
"LICENSE"
|
|
32
33
|
],
|
|
33
34
|
"dependencies": {
|
|
34
|
-
"@zautha/js": "^0.
|
|
35
|
+
"@zautha/js": "^0.12.1"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
38
|
"react": "^19.0.0",
|
|
38
39
|
"react-dom": "^19.0.0",
|
|
39
|
-
"@zautha/ui": "^0.
|
|
40
|
+
"@zautha/ui": "^0.12.1"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@size-limit/preset-small-lib": "14.0.1",
|
|
@@ -44,15 +45,15 @@
|
|
|
44
45
|
"@testing-library/user-event": "14.6.7",
|
|
45
46
|
"@types/react": "19.3.0",
|
|
46
47
|
"@types/react-dom": "19.3.0",
|
|
47
|
-
"@zautha/ui": "0.
|
|
48
|
-
"happy-dom": "
|
|
48
|
+
"@zautha/ui": "0.12.1",
|
|
49
|
+
"happy-dom": "21.0.4",
|
|
49
50
|
"msw": "2.15.0",
|
|
50
51
|
"react": "19.3.0",
|
|
51
52
|
"react-dom": "19.3.0",
|
|
52
53
|
"size-limit": "14.0.1",
|
|
53
54
|
"tsdown": "0.23.0",
|
|
54
55
|
"typescript": "6.0.3",
|
|
55
|
-
"vitest": "5.0.
|
|
56
|
+
"vitest": "5.0.5"
|
|
56
57
|
},
|
|
57
58
|
"size-limit": [
|
|
58
59
|
{
|