@civitai/blocks-react 0.15.3 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -1
- package/dist/hooks/useAppStorage.d.ts +10 -0
- package/dist/hooks/useAppStorage.d.ts.map +1 -1
- package/dist/hooks/useAppStorage.js +10 -0
- package/dist/hooks/useAppStorage.js.map +1 -1
- package/dist/hooks/useBlockAnalytics.d.ts +4 -0
- package/dist/hooks/useBlockAnalytics.d.ts.map +1 -1
- package/dist/hooks/useBlockAnalytics.js +4 -0
- package/dist/hooks/useBlockAnalytics.js.map +1 -1
- package/dist/hooks/useBlockContext.d.ts +12 -0
- package/dist/hooks/useBlockContext.d.ts.map +1 -1
- package/dist/hooks/useBlockContext.js +12 -0
- package/dist/hooks/useBlockContext.js.map +1 -1
- package/dist/hooks/useBlockResize.d.ts +7 -0
- package/dist/hooks/useBlockResize.d.ts.map +1 -1
- package/dist/hooks/useBlockResize.js +7 -0
- package/dist/hooks/useBlockResize.js.map +1 -1
- package/dist/hooks/useBlockSettings.d.ts +6 -1
- package/dist/hooks/useBlockSettings.d.ts.map +1 -1
- package/dist/hooks/useBlockSettings.js +6 -1
- package/dist/hooks/useBlockSettings.js.map +1 -1
- package/dist/hooks/useBlockToken.d.ts +7 -0
- package/dist/hooks/useBlockToken.d.ts.map +1 -1
- package/dist/hooks/useBlockToken.js +7 -0
- package/dist/hooks/useBlockToken.js.map +1 -1
- package/dist/hooks/useBuzzBalance.d.ts +48 -0
- package/dist/hooks/useBuzzBalance.d.ts.map +1 -0
- package/dist/hooks/useBuzzBalance.js +64 -0
- package/dist/hooks/useBuzzBalance.js.map +1 -0
- package/dist/hooks/useBuzzPurchase.d.ts +6 -0
- package/dist/hooks/useBuzzPurchase.d.ts.map +1 -1
- package/dist/hooks/useBuzzPurchase.js +6 -0
- package/dist/hooks/useBuzzPurchase.js.map +1 -1
- package/dist/hooks/useBuzzWorkflow.d.ts +21 -0
- package/dist/hooks/useBuzzWorkflow.d.ts.map +1 -1
- package/dist/hooks/useBuzzWorkflow.js +21 -0
- package/dist/hooks/useBuzzWorkflow.js.map +1 -1
- package/dist/hooks/useCheckpointPicker.d.ts +5 -0
- package/dist/hooks/useCheckpointPicker.d.ts.map +1 -1
- package/dist/hooks/useCheckpointPicker.js +5 -0
- package/dist/hooks/useCheckpointPicker.js.map +1 -1
- package/dist/hooks/useCivitaiNavigate.d.ts +4 -0
- package/dist/hooks/useCivitaiNavigate.d.ts.map +1 -1
- package/dist/hooks/useCivitaiNavigate.js +4 -0
- package/dist/hooks/useCivitaiNavigate.js.map +1 -1
- package/dist/hooks/useRequestConsent.d.ts +5 -0
- package/dist/hooks/useRequestConsent.d.ts.map +1 -1
- package/dist/hooks/useRequestConsent.js +5 -0
- package/dist/hooks/useRequestConsent.js.map +1 -1
- package/dist/hooks/useRequestSignIn.d.ts +4 -0
- package/dist/hooks/useRequestSignIn.d.ts.map +1 -1
- package/dist/hooks/useRequestSignIn.js +4 -0
- package/dist/hooks/useRequestSignIn.js.map +1 -1
- package/dist/hooks/useResourcePicker.d.ts +6 -0
- package/dist/hooks/useResourcePicker.d.ts.map +1 -1
- package/dist/hooks/useResourcePicker.js +6 -0
- package/dist/hooks/useResourcePicker.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/liveHost.d.ts.map +1 -1
- package/dist/internal/liveHost.js +21 -0
- package/dist/internal/liveHost.js.map +1 -1
- package/dist/internal/validate.d.ts +15 -0
- package/dist/internal/validate.d.ts.map +1 -1
- package/dist/internal/validate.js +31 -0
- package/dist/internal/validate.js.map +1 -1
- package/dist/ui/Button.d.ts +5 -0
- package/dist/ui/Button.d.ts.map +1 -1
- package/dist/ui/Button.js +5 -0
- package/dist/ui/Button.js.map +1 -1
- package/dist/ui/Modal.d.ts +6 -0
- package/dist/ui/Modal.d.ts.map +1 -1
- package/dist/ui/Modal.js +6 -0
- package/dist/ui/Modal.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -128,8 +128,17 @@ The generation flow: `estimate` → `submit` → `poll`, host-mediated. Returns
|
|
|
128
128
|
`{ estimate, submit, poll, status, result, error }`.
|
|
129
129
|
|
|
130
130
|
```tsx
|
|
131
|
+
import type { WorkflowBody } from '@civitai/app-sdk/blocks';
|
|
132
|
+
|
|
131
133
|
const { estimate, submit, poll, status, result } = useBuzzWorkflow();
|
|
132
|
-
const
|
|
134
|
+
declare const modelId: number, modelVersionId: number, userPrompt: string;
|
|
135
|
+
|
|
136
|
+
const body: WorkflowBody = {
|
|
137
|
+
kind: 'textToImage',
|
|
138
|
+
modelId,
|
|
139
|
+
modelVersionId,
|
|
140
|
+
params: { prompt: userPrompt },
|
|
141
|
+
};
|
|
133
142
|
await estimate(body); // status 'estimating' → 'confirming' (cost in result.cost.total)
|
|
134
143
|
const snap = await submit(body); // status 'submitting' → 'polling'; returns a workflowId
|
|
135
144
|
await poll(snap.workflowId); // you loop this on a backoff until terminal
|
|
@@ -70,6 +70,16 @@ export interface UseAppStorage {
|
|
|
70
70
|
* The hook is stable across renders — it returns the same object identity
|
|
71
71
|
* once the transport singleton is created, so it's safe to put in
|
|
72
72
|
* dependency arrays of `useEffect` / `useMemo`.
|
|
73
|
+
*
|
|
74
|
+
* 64 KB per value, 50 MB + ~1M rows per app.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* const storage = useAppStorage();
|
|
78
|
+
* await storage.set('key', { any: 'json' }); // throws "PAYLOAD_TOO_LARGE" over a limit
|
|
79
|
+
* const v = await storage.get<{ any: string }>('key'); // null if unset / anon
|
|
80
|
+
* await storage.delete('key'); // idempotent
|
|
81
|
+
* const { keys } = await storage.list({ prefix: 'note-' });
|
|
82
|
+
* const quota = await storage.getQuota(); // { usedBytes, rowCount, limitBytes, limitRows }
|
|
73
83
|
*/
|
|
74
84
|
export declare function useAppStorage(): UseAppStorage;
|
|
75
85
|
//# sourceMappingURL=useAppStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useAppStorage.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD;;;;OAIG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D;;;OAGG;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClC;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACtC;AAED
|
|
1
|
+
{"version":3,"file":"useAppStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useAppStorage.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD;;;;OAIG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D;;;OAGG;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClC;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,IAAI,aAAa,CAyE7C"}
|
|
@@ -12,6 +12,16 @@ import { sendTypedRequest } from '../internal/transport.js';
|
|
|
12
12
|
* The hook is stable across renders — it returns the same object identity
|
|
13
13
|
* once the transport singleton is created, so it's safe to put in
|
|
14
14
|
* dependency arrays of `useEffect` / `useMemo`.
|
|
15
|
+
*
|
|
16
|
+
* 64 KB per value, 50 MB + ~1M rows per app.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const storage = useAppStorage();
|
|
20
|
+
* await storage.set('key', { any: 'json' }); // throws "PAYLOAD_TOO_LARGE" over a limit
|
|
21
|
+
* const v = await storage.get<{ any: string }>('key'); // null if unset / anon
|
|
22
|
+
* await storage.delete('key'); // idempotent
|
|
23
|
+
* const { keys } = await storage.list({ prefix: 'note-' });
|
|
24
|
+
* const quota = await storage.getQuota(); // { usedBytes, rowCount, limitBytes, limitRows }
|
|
15
25
|
*/
|
|
16
26
|
export function useAppStorage() {
|
|
17
27
|
return useMemo(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppStorage.js","sourceRoot":"","sources":["../../src/hooks/useAppStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA6D5D
|
|
1
|
+
{"version":3,"file":"useAppStorage.js","sourceRoot":"","sources":["../../src/hooks/useAppStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* Fire-and-forget analytics tracking. The host forwards events to its
|
|
3
3
|
* analytics pipeline (ClickHouse in production); the block doesn't see
|
|
4
4
|
* acknowledgements and shouldn't block on them.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const { track } = useBlockAnalytics();
|
|
8
|
+
* track('generate_clicked', { modelId });
|
|
5
9
|
*/
|
|
6
10
|
export declare function useBlockAnalytics(): {
|
|
7
11
|
track: (eventName: string, properties?: Record<string, unknown>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockAnalytics.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockAnalytics.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"useBlockAnalytics.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockAnalytics.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1E,CAKA"}
|
|
@@ -4,6 +4,10 @@ import { getTransport } from '../internal/singleton.js';
|
|
|
4
4
|
* Fire-and-forget analytics tracking. The host forwards events to its
|
|
5
5
|
* analytics pipeline (ClickHouse in production); the block doesn't see
|
|
6
6
|
* acknowledgements and shouldn't block on them.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const { track } = useBlockAnalytics();
|
|
10
|
+
* track('generate_clicked', { modelId });
|
|
7
11
|
*/
|
|
8
12
|
export function useBlockAnalytics() {
|
|
9
13
|
const track = useCallback((eventName, properties) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockAnalytics.js","sourceRoot":"","sources":["../../src/hooks/useBlockAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"useBlockAnalytics.js","sourceRoot":"","sources":["../../src/hooks/useBlockAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAG/B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,SAAiB,EAAE,UAAoC,EAAE,EAAE;QACpF,YAAY,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -11,6 +11,18 @@ declare function useTransportSnapshot(): BlockSnapshot;
|
|
|
11
11
|
*
|
|
12
12
|
* The transport detection (iframe vs inline) happens on first call and is
|
|
13
13
|
* cached process-wide; block apps don't branch on render mode.
|
|
14
|
+
*
|
|
15
|
+
* @returns The per-instance block context: `ready` gate plus `renderMode`,
|
|
16
|
+
* `context` (narrow to `ModelSlotContext` on model-page slots), `token`,
|
|
17
|
+
* `settings`, `viewer` (`null` = anonymous), `theme` (`'light' | 'dark'` —
|
|
18
|
+
* set `data-theme={theme}` on your root, gotcha #60), `blockId`,
|
|
19
|
+
* `blockInstanceId`, and `appId`.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const { ready, context, viewer, theme, settings } = useBlockContext();
|
|
23
|
+
* if (!ready) return <div>Loading…</div>;
|
|
24
|
+
* // Set data-theme on YOUR root — the host can't reach into the iframe (gotcha #60).
|
|
25
|
+
* return <div data-theme={theme}>Hi {viewer?.username ?? 'anon'}</div>;
|
|
14
26
|
*/
|
|
15
27
|
export declare function useBlockContext(): Pick<BlockSnapshot, 'ready' | 'renderMode' | 'context' | 'token' | 'settings' | 'viewer' | 'theme' | 'blockId' | 'blockInstanceId' | 'appId'>;
|
|
16
28
|
/** Re-exported so other hooks in this package can share the subscription. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockContext.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;GAGG;AACH,iBAAS,oBAAoB,IAAI,aAAa,CAS7C;AAED
|
|
1
|
+
{"version":3,"file":"useBlockContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockContext.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;GAGG;AACH,iBAAS,oBAAoB,IAAI,aAAa,CAS7C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,IAAI,IAAI,CACrC,aAAa,EACX,OAAO,GACP,YAAY,GACZ,SAAS,GACT,OAAO,GACP,UAAU,GACV,QAAQ,GACR,OAAO,GACP,SAAS,GACT,iBAAiB,GACjB,OAAO,CACV,CAcA;AAED,6EAA6E;AAC7E,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -18,6 +18,18 @@ function useTransportSnapshot() {
|
|
|
18
18
|
*
|
|
19
19
|
* The transport detection (iframe vs inline) happens on first call and is
|
|
20
20
|
* cached process-wide; block apps don't branch on render mode.
|
|
21
|
+
*
|
|
22
|
+
* @returns The per-instance block context: `ready` gate plus `renderMode`,
|
|
23
|
+
* `context` (narrow to `ModelSlotContext` on model-page slots), `token`,
|
|
24
|
+
* `settings`, `viewer` (`null` = anonymous), `theme` (`'light' | 'dark'` —
|
|
25
|
+
* set `data-theme={theme}` on your root, gotcha #60), `blockId`,
|
|
26
|
+
* `blockInstanceId`, and `appId`.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const { ready, context, viewer, theme, settings } = useBlockContext();
|
|
30
|
+
* if (!ready) return <div>Loading…</div>;
|
|
31
|
+
* // Set data-theme on YOUR root — the host can't reach into the iframe (gotcha #60).
|
|
32
|
+
* return <div data-theme={theme}>Hi {viewer?.username ?? 'anon'}</div>;
|
|
21
33
|
*/
|
|
22
34
|
export function useBlockContext() {
|
|
23
35
|
const snap = useTransportSnapshot();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockContext.js","sourceRoot":"","sources":["../../src/hooks/useBlockContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD;;;GAGG;AACH,SAAS,oBAAoB;IAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO,oBAAoB,CACzB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAC/B,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE;IAC7B,iEAAiE;IACjE,mEAAmE;IACnE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAC9B,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"useBlockContext.js","sourceRoot":"","sources":["../../src/hooks/useBlockContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD;;;GAGG;AACH,SAAS,oBAAoB;IAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO,oBAAoB,CACzB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAC/B,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE;IAC7B,iEAAiE;IACjE,mEAAmE;IACnE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,eAAe;IAa7B,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -8,6 +8,13 @@ import { type RefObject } from 'react';
|
|
|
8
8
|
* - Iframe path: posts `RESIZE_IFRAME` with the integer-rounded height.
|
|
9
9
|
* - Inline path: `InlineTransport.sendMessage` is a no-op (the host DOM
|
|
10
10
|
* reflows naturally), so the observer fires but no message goes out.
|
|
11
|
+
*
|
|
12
|
+
* @param ref - Ref to the block's root DOM element to observe.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const rootRef = useRef<HTMLDivElement>(null);
|
|
16
|
+
* useBlockResize(rootRef); // host fits the iframe to content
|
|
17
|
+
* return <div ref={rootRef}>…</div>;
|
|
11
18
|
*/
|
|
12
19
|
export declare function useBlockResize(ref: RefObject<HTMLElement | null>): void;
|
|
13
20
|
//# sourceMappingURL=useBlockResize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockResize.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockResize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlD
|
|
1
|
+
{"version":3,"file":"useBlockResize.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockResize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAiBvE"}
|
|
@@ -9,6 +9,13 @@ import { getTransport } from '../internal/singleton.js';
|
|
|
9
9
|
* - Iframe path: posts `RESIZE_IFRAME` with the integer-rounded height.
|
|
10
10
|
* - Inline path: `InlineTransport.sendMessage` is a no-op (the host DOM
|
|
11
11
|
* reflows naturally), so the observer fires but no message goes out.
|
|
12
|
+
*
|
|
13
|
+
* @param ref - Ref to the block's root DOM element to observe.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const rootRef = useRef<HTMLDivElement>(null);
|
|
17
|
+
* useBlockResize(rootRef); // host fits the iframe to content
|
|
18
|
+
* return <div ref={rootRef}>…</div>;
|
|
12
19
|
*/
|
|
13
20
|
export function useBlockResize(ref) {
|
|
14
21
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockResize.js","sourceRoot":"","sources":["../../src/hooks/useBlockResize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"useBlockResize.js","sourceRoot":"","sources":["../../src/hooks/useBlockResize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,GAAkC;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QAElD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC;YAC5E,IAAI,MAAM,KAAK,UAAU;gBAAE,OAAO;YAClC,UAAU,GAAG,MAAM,CAAC;YACpB,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACZ,CAAC"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { BlockSettings } from '@civitai/app-sdk/blocks';
|
|
2
2
|
/**
|
|
3
3
|
* Shorthand for `useBlockContext().settings`. Returns the publisher- and
|
|
4
|
-
* user-controlled settings the host forwarded at init.
|
|
4
|
+
* user-controlled settings the host forwarded at init. Read-only from the
|
|
5
|
+
* iframe — settings are *written* on the platform `/apps/installed` page,
|
|
6
|
+
* not via a bridge message.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const { publisherSettings, userSettings } = useBlockSettings();
|
|
5
10
|
*/
|
|
6
11
|
export declare function useBlockSettings(): BlockSettings;
|
|
7
12
|
//# sourceMappingURL=useBlockSettings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D
|
|
1
|
+
{"version":3,"file":"useBlockSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { useTransportSnapshot } from './useBlockContext.js';
|
|
2
2
|
/**
|
|
3
3
|
* Shorthand for `useBlockContext().settings`. Returns the publisher- and
|
|
4
|
-
* user-controlled settings the host forwarded at init.
|
|
4
|
+
* user-controlled settings the host forwarded at init. Read-only from the
|
|
5
|
+
* iframe — settings are *written* on the platform `/apps/installed` page,
|
|
6
|
+
* not via a bridge message.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const { publisherSettings, userSettings } = useBlockSettings();
|
|
5
10
|
*/
|
|
6
11
|
export function useBlockSettings() {
|
|
7
12
|
return useTransportSnapshot().settings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockSettings.js","sourceRoot":"","sources":["../../src/hooks/useBlockSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"useBlockSettings.js","sourceRoot":"","sources":["../../src/hooks/useBlockSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,EAAE,CAAC,QAAQ,CAAC;AACzC,CAAC"}
|
|
@@ -9,6 +9,13 @@ import type { BlockToken } from '@civitai/app-sdk/blocks';
|
|
|
9
9
|
* Consumers also get a `refresh()` callable for the 401-retry path. Call it
|
|
10
10
|
* after any API request returns 401 — it forces an immediate token mint and
|
|
11
11
|
* resolves once the new token is applied to the snapshot.
|
|
12
|
+
*
|
|
13
|
+
* @returns The {@link BlockToken} fields (`raw`, `scopes`, `expiresAt`,
|
|
14
|
+
* `buzzBudget`, …) plus a `refresh()` for the 401-retry path.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const { raw, scopes, expiresAt, buzzBudget, refresh } = useBlockToken();
|
|
18
|
+
* // after a 401: await refresh(); then retry the request once with the new `raw`.
|
|
12
19
|
*/
|
|
13
20
|
export declare function useBlockToken(): BlockToken & {
|
|
14
21
|
refresh: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockToken.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAS1D
|
|
1
|
+
{"version":3,"file":"useBlockToken.d.ts","sourceRoot":"","sources":["../../src/hooks/useBlockToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAS1D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAwB7E"}
|
|
@@ -14,6 +14,13 @@ const REFRESH_LEAD_MS = 2 * 60 * 1000;
|
|
|
14
14
|
* Consumers also get a `refresh()` callable for the 401-retry path. Call it
|
|
15
15
|
* after any API request returns 401 — it forces an immediate token mint and
|
|
16
16
|
* resolves once the new token is applied to the snapshot.
|
|
17
|
+
*
|
|
18
|
+
* @returns The {@link BlockToken} fields (`raw`, `scopes`, `expiresAt`,
|
|
19
|
+
* `buzzBudget`, …) plus a `refresh()` for the 401-retry path.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const { raw, scopes, expiresAt, buzzBudget, refresh } = useBlockToken();
|
|
23
|
+
* // after a 401: await refresh(); then retry the request once with the new `raw`.
|
|
17
24
|
*/
|
|
18
25
|
export function useBlockToken() {
|
|
19
26
|
const snap = useTransportSnapshot();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlockToken.js","sourceRoot":"","sources":["../../src/hooks/useBlockToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,sEAAsE;AACtE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC
|
|
1
|
+
{"version":3,"file":"useBlockToken.js","sourceRoot":"","sources":["../../src/hooks/useBlockToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,sEAAsE;AACtE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;QAChF,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACxB,iDAAiD;YACjD,oEAAoE;YACpE,6CAA6C;YAC7C,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACzB,oEAAoE;YACpE,6CAA6C;YAC7C,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,cAAc,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAE9C,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;GAMG;AACH,IAAI,eAAe,GAAyB,IAAI,CAAC;AAEjD,KAAK,UAAU,cAAc,CAAC,eAAuB;IACnD,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAC5C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,eAAe,GAAG,gBAAgB,CAChC,SAAS,EACT,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,EACvD,wBAAwB,CACzB;SACE,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SACrB,OAAO,CAAC,GAAG,EAAE;QACZ,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC,CAAC,CAAC;IACL,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The viewer's per-pool Buzz balance, in the domain-clamped set an App Block
|
|
3
|
+
* can read (mirrors `@civitai/app-sdk/blocks`' `BuzzAccountType`). Never
|
|
4
|
+
* includes the platform-internal pools (`red`/`purple`).
|
|
5
|
+
*/
|
|
6
|
+
export interface BuzzBalance {
|
|
7
|
+
blue: number;
|
|
8
|
+
green: number;
|
|
9
|
+
yellow: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* What {@link useBuzzBalance} returns.
|
|
13
|
+
*/
|
|
14
|
+
export interface UseBuzzBalance {
|
|
15
|
+
/** The viewer's per-pool balance, or `null` until the first successful fetch. */
|
|
16
|
+
balance: BuzzBalance | null;
|
|
17
|
+
/** `true` while a fetch (initial or `refetch`) is in flight. */
|
|
18
|
+
loading: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The last fetch's failure — a host-reported error (anon viewer / missing
|
|
21
|
+
* scope / host failure) or the transport timeout when the host never answers.
|
|
22
|
+
* Cleared at the start of the next fetch.
|
|
23
|
+
*/
|
|
24
|
+
error: Error | null;
|
|
25
|
+
/** Re-request the balance (e.g. after a generation debits it). */
|
|
26
|
+
refetch: () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read the signed-in viewer's per-pool Buzz balance ({ blue, green, yellow })
|
|
30
|
+
* through the host-mediated `GET_BUZZ_BALANCE` → `BUZZ_BALANCE_RESULT` bridge.
|
|
31
|
+
* Token-bound: the host resolves the viewer from the block token and reads the
|
|
32
|
+
* balance via its `blocks.getMyBuzzBalance` tRPC mutation — the block never
|
|
33
|
+
* touches the balance API or credentials directly (same trust model as
|
|
34
|
+
* `useBuzzWorkflow` / `useBuzzPurchase`).
|
|
35
|
+
*
|
|
36
|
+
* Fetches once on mount and exposes `refetch` for on-demand refreshes (e.g.
|
|
37
|
+
* after a generation debits the balance). A host that never answers surfaces as
|
|
38
|
+
* an `error` after the transport's request timeout — the hook never hangs. Late
|
|
39
|
+
* responses that arrive after unmount are ignored (no state update).
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const { balance, loading, error, refetch } = useBuzzBalance();
|
|
43
|
+
* if (loading) return <Spinner />;
|
|
44
|
+
* if (error) return <RetryButton onClick={refetch} />;
|
|
45
|
+
* return <span>Yellow: {balance?.yellow ?? 0}</span>;
|
|
46
|
+
*/
|
|
47
|
+
export declare function useBuzzBalance(): UseBuzzBalance;
|
|
48
|
+
//# sourceMappingURL=useBuzzBalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBuzzBalance.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuzzBalance.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,IAAI,cAAc,CA8C/C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { getTransport } from '../internal/singleton.js';
|
|
3
|
+
import { sendTypedRequest } from '../internal/transport.js';
|
|
4
|
+
/**
|
|
5
|
+
* Read the signed-in viewer's per-pool Buzz balance ({ blue, green, yellow })
|
|
6
|
+
* through the host-mediated `GET_BUZZ_BALANCE` → `BUZZ_BALANCE_RESULT` bridge.
|
|
7
|
+
* Token-bound: the host resolves the viewer from the block token and reads the
|
|
8
|
+
* balance via its `blocks.getMyBuzzBalance` tRPC mutation — the block never
|
|
9
|
+
* touches the balance API or credentials directly (same trust model as
|
|
10
|
+
* `useBuzzWorkflow` / `useBuzzPurchase`).
|
|
11
|
+
*
|
|
12
|
+
* Fetches once on mount and exposes `refetch` for on-demand refreshes (e.g.
|
|
13
|
+
* after a generation debits the balance). A host that never answers surfaces as
|
|
14
|
+
* an `error` after the transport's request timeout — the hook never hangs. Late
|
|
15
|
+
* responses that arrive after unmount are ignored (no state update).
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const { balance, loading, error, refetch } = useBuzzBalance();
|
|
19
|
+
* if (loading) return <Spinner />;
|
|
20
|
+
* if (error) return <RetryButton onClick={refetch} />;
|
|
21
|
+
* return <span>Yellow: {balance?.yellow ?? 0}</span>;
|
|
22
|
+
*/
|
|
23
|
+
export function useBuzzBalance() {
|
|
24
|
+
const [balance, setBalance] = useState(null);
|
|
25
|
+
const [loading, setLoading] = useState(true);
|
|
26
|
+
const [error, setError] = useState(null);
|
|
27
|
+
// Guards against a late response resolving after the component unmounted
|
|
28
|
+
// (React would warn about a state update on an unmounted component, and the
|
|
29
|
+
// work is wasted anyway).
|
|
30
|
+
const mountedRef = useRef(true);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
mountedRef.current = true;
|
|
33
|
+
return () => {
|
|
34
|
+
mountedRef.current = false;
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
const refetch = useCallback(() => {
|
|
38
|
+
setLoading(true);
|
|
39
|
+
setError(null);
|
|
40
|
+
sendTypedRequest(getTransport(), { type: 'GET_BUZZ_BALANCE', payload: {} }, 'BUZZ_BALANCE_RESULT')
|
|
41
|
+
.then((result) => {
|
|
42
|
+
if (!mountedRef.current)
|
|
43
|
+
return;
|
|
44
|
+
if (result.error || !result.balance) {
|
|
45
|
+
setError(new Error(result.error ?? 'failed to fetch buzz balance'));
|
|
46
|
+
setLoading(false);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
setBalance(result.balance);
|
|
50
|
+
setLoading(false);
|
|
51
|
+
})
|
|
52
|
+
.catch((err) => {
|
|
53
|
+
if (!mountedRef.current)
|
|
54
|
+
return;
|
|
55
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
56
|
+
setLoading(false);
|
|
57
|
+
});
|
|
58
|
+
}, []);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
refetch();
|
|
61
|
+
}, [refetch]);
|
|
62
|
+
return { balance, loading, error, refetch };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=useBuzzBalance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBuzzBalance.js","sourceRoot":"","sources":["../../src/hooks/useBuzzBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA+B5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,yEAAyE;IACzE,4EAA4E;IAC5E,0BAA0B;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,gBAAgB,CACd,YAAY,EAAE,EACd,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,EACzC,qBAAqB,CACtB;aACE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,OAAO;YAChC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC,CAAC;gBACpE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,OAAO;YAChC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
* Opens the Civitai Buzz purchase modal on the host. Resolves with the
|
|
3
3
|
* outcome when the user closes the modal — `purchased: true` means the
|
|
4
4
|
* balance increased; the new balance is included if the host reports it.
|
|
5
|
+
* The insufficient-budget recovery path for {@link useBuzzWorkflow}.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const { openPurchaseModal } = useBuzzPurchase();
|
|
9
|
+
* const { purchased, newBalance } = await openPurchaseModal(suggestedAmount);
|
|
10
|
+
* if (purchased) { /* retry the generation *\/ }
|
|
5
11
|
*/
|
|
6
12
|
export declare function useBuzzPurchase(): {
|
|
7
13
|
openPurchaseModal: (suggestedAmount?: number) => Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuzzPurchase.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuzzPurchase.ts"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"useBuzzPurchase.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuzzPurchase.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI;IACjC,iBAAiB,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvG,CAUA"}
|
|
@@ -5,6 +5,12 @@ import { sendTypedRequest } from '../internal/transport.js';
|
|
|
5
5
|
* Opens the Civitai Buzz purchase modal on the host. Resolves with the
|
|
6
6
|
* outcome when the user closes the modal — `purchased: true` means the
|
|
7
7
|
* balance increased; the new balance is included if the host reports it.
|
|
8
|
+
* The insufficient-budget recovery path for {@link useBuzzWorkflow}.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const { openPurchaseModal } = useBuzzPurchase();
|
|
12
|
+
* const { purchased, newBalance } = await openPurchaseModal(suggestedAmount);
|
|
13
|
+
* if (purchased) { /* retry the generation *\/ }
|
|
8
14
|
*/
|
|
9
15
|
export function useBuzzPurchase() {
|
|
10
16
|
const openPurchaseModal = useCallback(async (suggestedAmount) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuzzPurchase.js","sourceRoot":"","sources":["../../src/hooks/useBuzzPurchase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"useBuzzPurchase.js","sourceRoot":"","sources":["../../src/hooks/useBuzzPurchase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe;IAG7B,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,EAAE,eAAwB,EAAE,EAAE;QACvE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CACtD,YAAY,EAAE,EACd,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,EAC5D,sBAAsB,CACvB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACnC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -23,6 +23,27 @@ interface UseBuzzWorkflowReturn {
|
|
|
23
23
|
* before forwarding to the orchestrator; submit() will reject if the host
|
|
24
24
|
* refuses. Block apps should call `useBuzzPurchase().openPurchaseModal()`
|
|
25
25
|
* when that happens.
|
|
26
|
+
*
|
|
27
|
+
* The hook does NOT auto-poll: after `submit` flips `status` to `'polling'`,
|
|
28
|
+
* the caller runs a `useEffect` that calls `poll(workflowId)` on a backoff
|
|
29
|
+
* until the snapshot is terminal. `status === 'confirming'` is IDLE (estimate
|
|
30
|
+
* landed, user reviewing cost) — keep the Generate button enabled.
|
|
31
|
+
*
|
|
32
|
+
* @returns `{ estimate, submit, poll, cancel, status, result, error }`.
|
|
33
|
+
* `submit` takes a full {@link WorkflowBody} (`{ kind, modelId,
|
|
34
|
+
* modelVersionId, params }`), not `{ prompt }`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* const { estimate, submit, poll, status, result } = useBuzzWorkflow();
|
|
38
|
+
* const body = {
|
|
39
|
+
* kind: 'textToImage' as const,
|
|
40
|
+
* modelId,
|
|
41
|
+
* modelVersionId,
|
|
42
|
+
* params: { prompt: 'a cat' },
|
|
43
|
+
* };
|
|
44
|
+
* await estimate(body); // status 'estimating' → 'confirming' (cost in result.cost.total)
|
|
45
|
+
* const snap = await submit(body); // status 'submitting' → 'polling'; returns a workflowId
|
|
46
|
+
* await poll(snap.workflowId); // caller loops this on a backoff until terminal
|
|
26
47
|
*/
|
|
27
48
|
export declare function useBuzzWorkflow(): UseBuzzWorkflowReturn;
|
|
28
49
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuzzWorkflow.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuzzWorkflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA8BnG,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7D;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/D,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED
|
|
1
|
+
{"version":3,"file":"useBuzzWorkflow.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuzzWorkflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA8BnG,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7D;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/D,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CAuFvD"}
|
|
@@ -32,6 +32,27 @@ const WORKFLOW_REQUEST_TIMEOUT_MS = 120_000;
|
|
|
32
32
|
* before forwarding to the orchestrator; submit() will reject if the host
|
|
33
33
|
* refuses. Block apps should call `useBuzzPurchase().openPurchaseModal()`
|
|
34
34
|
* when that happens.
|
|
35
|
+
*
|
|
36
|
+
* The hook does NOT auto-poll: after `submit` flips `status` to `'polling'`,
|
|
37
|
+
* the caller runs a `useEffect` that calls `poll(workflowId)` on a backoff
|
|
38
|
+
* until the snapshot is terminal. `status === 'confirming'` is IDLE (estimate
|
|
39
|
+
* landed, user reviewing cost) — keep the Generate button enabled.
|
|
40
|
+
*
|
|
41
|
+
* @returns `{ estimate, submit, poll, cancel, status, result, error }`.
|
|
42
|
+
* `submit` takes a full {@link WorkflowBody} (`{ kind, modelId,
|
|
43
|
+
* modelVersionId, params }`), not `{ prompt }`.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const { estimate, submit, poll, status, result } = useBuzzWorkflow();
|
|
47
|
+
* const body = {
|
|
48
|
+
* kind: 'textToImage' as const,
|
|
49
|
+
* modelId,
|
|
50
|
+
* modelVersionId,
|
|
51
|
+
* params: { prompt: 'a cat' },
|
|
52
|
+
* };
|
|
53
|
+
* await estimate(body); // status 'estimating' → 'confirming' (cost in result.cost.total)
|
|
54
|
+
* const snap = await submit(body); // status 'submitting' → 'polling'; returns a workflowId
|
|
55
|
+
* await poll(snap.workflowId); // caller loops this on a backoff until terminal
|
|
35
56
|
*/
|
|
36
57
|
export function useBuzzWorkflow() {
|
|
37
58
|
const [status, setStatus] = useState('idle');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuzzWorkflow.js","sourceRoot":"","sources":["../../src/hooks/useBuzzWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;GAIG;AACH,MAAM,iBAAiB,GAAiD,IAAI,GAAG,CAAC;IAC9E,WAAW;IACX,QAAQ;IACR,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAmB5C
|
|
1
|
+
{"version":3,"file":"useBuzzWorkflow.js","sourceRoot":"","sources":["../../src/hooks/useBuzzWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,11 @@ export declare const PICKER_REQUEST_TIMEOUT_MS: number;
|
|
|
21
21
|
* Both flows are host-mediated: the block never touches the picker UI or
|
|
22
22
|
* the user-settings table directly. Same trust model as useBuzzPurchase /
|
|
23
23
|
* useBuzzWorkflow.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const { open, persist } = useCheckpointPicker();
|
|
27
|
+
* const { selected } = await open({ baseModelGroup: 'SDXL', currentVersionId });
|
|
28
|
+
* if (selected) await persist(selected.versionId); // null clears the override
|
|
24
29
|
*/
|
|
25
30
|
export declare function useCheckpointPicker(): {
|
|
26
31
|
open: (opts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCheckpointPicker.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckpointPicker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAc,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"useCheckpointPicker.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckpointPicker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAc,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,IAAI,EAAE,CAAC,IAAI,EAAE;QACX;;;;;WAKG;QACH,cAAc,EAAE,MAAM,CAAC;QACvB,uEAAuE;QACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,KAAK,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,mBAAmB,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAkCA"}
|
|
@@ -23,6 +23,11 @@ export const PICKER_REQUEST_TIMEOUT_MS = 10 * 60_000;
|
|
|
23
23
|
* Both flows are host-mediated: the block never touches the picker UI or
|
|
24
24
|
* the user-settings table directly. Same trust model as useBuzzPurchase /
|
|
25
25
|
* useBuzzWorkflow.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const { open, persist } = useCheckpointPicker();
|
|
29
|
+
* const { selected } = await open({ baseModelGroup: 'SDXL', currentVersionId });
|
|
30
|
+
* if (selected) await persist(selected.versionId); // null clears the override
|
|
26
31
|
*/
|
|
27
32
|
export function useCheckpointPicker() {
|
|
28
33
|
const open = useCallback(async (opts) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCheckpointPicker.js","sourceRoot":"","sources":["../../src/hooks/useCheckpointPicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAIpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,MAAM,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"useCheckpointPicker.js","sourceRoot":"","sources":["../../src/hooks/useCheckpointPicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAIpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,MAAM,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB;IAcjC,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,EAAE,IAA2D,EAAE,EAAE;QACpE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CACzC,YAAY,EAAE,EACd;YACE,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI;oBAC/B,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;oBAC7C,CAAC,CAAC,EAAE,CAAC;aACR;SACF,EACD,0BAA0B,EAC1B,EAAE,SAAS,EAAE,yBAAyB,EAAE,CACzC,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAwB,EAAE,EAAE;QAC7D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAgB,CAC1C,YAAY,EAAE,EACd,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EACvD,qBAAqB,CACtB,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* requires `allow-popups-to-escape-sandbox` in the manifest sandbox).
|
|
5
5
|
*
|
|
6
6
|
* Fire-and-forget: the host doesn't reply with confirmation.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const { navigate } = useCivitaiNavigate();
|
|
10
|
+
* navigate('/models/12345', 'new_tab'); // 'new_tab' needs allow-popups* in the manifest sandbox
|
|
7
11
|
*/
|
|
8
12
|
export declare function useCivitaiNavigate(): {
|
|
9
13
|
navigate: (path: string, target?: 'current' | 'new_tab') => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCivitaiNavigate.d.ts","sourceRoot":"","sources":["../../src/hooks/useCivitaiNavigate.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"useCivitaiNavigate.d.ts","sourceRoot":"","sources":["../../src/hooks/useCivitaiNavigate.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;CAClE,CAKA"}
|