@gusnips/react 0.9.33 → 0.10.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 +51 -6
- package/dist/oauth.d.ts +25 -13
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +164 -37
- package/dist/oauth.js.map +1 -1
- package/package.json +1 -1
- package/src/oauth.test.ts +726 -26
- package/src/oauth.ts +217 -47
package/README.md
CHANGED
|
@@ -703,12 +703,37 @@ export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
|
|
|
703
703
|
```
|
|
704
704
|
|
|
705
705
|
That is both pages' calls to the server's `oauthConsoleRoutes`, mounted at `/auth/oauth` behind
|
|
706
|
-
your sign-in. `api` is your `createApiClient` client, or any object with its `get` and `post
|
|
706
|
+
your sign-in. `api` is your `createApiClient` client, or any object with its typed `get` and `post`
|
|
707
|
+
methods, including their `RequestOptions` argument.
|
|
708
|
+
|
|
709
|
+
Both hooks require `scope`, captured from your app's identity store:
|
|
710
|
+
|
|
711
|
+
```ts
|
|
712
|
+
import type { OAuthScope } from "@gusnips/react/oauth";
|
|
713
|
+
|
|
714
|
+
const scope: OAuthScope = {
|
|
715
|
+
key: ["identity", accountId, workspaceId, generation],
|
|
716
|
+
isCurrent: () => identityStore.getState().generation === generation,
|
|
717
|
+
};
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
Those ids, `generation` and `identityStore` belong to your app. Read them from the same snapshot.
|
|
721
|
+
Advance the generation whenever the account or workspace changes, including sign-out and signing
|
|
722
|
+
back into the same account. Do not use an access token: refreshing a token is not a new identity.
|
|
723
|
+
`isCurrent` compares that captured generation with the live store, not another render's copy.
|
|
724
|
+
|
|
725
|
+
Query keys start with `scope.key`, followed by `"@gusnips/react/oauth"`, the hook kind and the
|
|
726
|
+
request without its leading `?` or the device code's eight uppercase letters. Equal requests can
|
|
727
|
+
share data within one scope, never across identities. Keep your app's normal query cancellation
|
|
728
|
+
and cache clearing at identity boundaries; clearing a cache alone does not stop a running write.
|
|
729
|
+
|
|
730
|
+
This required argument is a breaking API change. It needs a new React 0.x minor and a paired Vite
|
|
731
|
+
minor before publication. Existing callers must pass a scope when adopting that release.
|
|
707
732
|
|
|
708
733
|
```tsx
|
|
709
734
|
import { useConsentRequest } from "@gusnips/react/oauth";
|
|
710
735
|
|
|
711
|
-
const consent = useConsentRequest(oauthApi.consent, useLocation().search);
|
|
736
|
+
const consent = useConsentRequest(oauthApi.consent, useLocation().search, scope);
|
|
712
737
|
|
|
713
738
|
if (consent.state.status === "ready")
|
|
714
739
|
return (
|
|
@@ -718,9 +743,13 @@ if (consent.state.status === "ready")
|
|
|
718
743
|
);
|
|
719
744
|
```
|
|
720
745
|
|
|
721
|
-
If your routes are your own, pass your own two calls instead: `describe(query)` and
|
|
722
|
-
`approve(query, choice)`.
|
|
723
|
-
|
|
746
|
+
If your routes are your own, pass your own two calls instead: `describe(query, options)` and
|
|
747
|
+
`approve(query, choice, options)`. `options` is `RequestOptions` from `@gusnips/react`. Forward it
|
|
748
|
+
to your HTTP client, including its `signal`. Reads receive TanStack Query's cancellation signal;
|
|
749
|
+
writes receive a signal owned by the initiating operation. For an identity-aware adapter, capture
|
|
750
|
+
the same account and workspace used in `scope` when building the adapter. Do not read a different
|
|
751
|
+
identity's headers at dispatch time. The choice is anything your page adds, such as a workspace,
|
|
752
|
+
and it reaches the server's approver. With no choice, call `approve()`.
|
|
724
753
|
|
|
725
754
|
When your server adds fields to the view, type them after the choice:
|
|
726
755
|
`createOAuthConsoleApi<string, { spaces: Space[] }>(api, "/auth/oauth")`, and
|
|
@@ -741,10 +770,22 @@ With your own calls, it is `ConsentApi<Choice, { spaces: Space[] }>`.
|
|
|
741
770
|
for a second press. Approve sends the browser on with `window.location.assign`, which also opens
|
|
742
771
|
an app's own scheme such as `cursor://`.
|
|
743
772
|
|
|
773
|
+
A decision captures its API calls, request and identity when pressed. A changed scope, request,
|
|
774
|
+
code or unmounted page invalidates it. Late answers reject with `OAuthOperationChangedError`
|
|
775
|
+
before successful data can enter the mutation cache. Consent checks again before redirecting.
|
|
776
|
+
Transport is aborted on code/request changes or cleanup, but the generation check still applies
|
|
777
|
+
if an adapter ignores cancellation. Aborting cannot undo a decision the server already made.
|
|
778
|
+
Show request errors beside the button with `approveError` or `decideError`, and let the person
|
|
779
|
+
press again. A stale decision does not become the new page's result or error.
|
|
780
|
+
|
|
781
|
+
Both hooks set `retry: false` and `refetchOnWindowFocus: false` for reads, even if your client's
|
|
782
|
+
defaults say otherwise. Writes also set `retry: false` and `networkMode: "always"`: an offline
|
|
783
|
+
press tries once and can fail, but it is never queued to run when the connection returns.
|
|
784
|
+
|
|
744
785
|
```tsx
|
|
745
786
|
import { useDeviceApproval, useDeviceCodeField } from "@gusnips/react/oauth";
|
|
746
787
|
|
|
747
|
-
const device = useDeviceApproval(oauthApi.device, useLocation().search);
|
|
788
|
+
const device = useDeviceApproval(oauthApi.device, useLocation().search, scope);
|
|
748
789
|
const field = useDeviceCodeField(device);
|
|
749
790
|
|
|
750
791
|
<label htmlFor={field.inputProps.id}>Code</label>
|
|
@@ -770,6 +811,10 @@ page stays decided: it never asks the server again, because the server no longer
|
|
|
770
811
|
and asking on the next focus would tell someone who just said yes that their code is wrong.
|
|
771
812
|
|
|
772
813
|
`approve(choice)` sends a choice with the yes, as on the consent page; `deny()` sends none.
|
|
814
|
+
For your own routes, the calls are `describe(code, options)` and
|
|
815
|
+
`decide(code, decision, choice, options)`, with the same `RequestOptions` forwarding as consent.
|
|
816
|
+
A new link's code replaces the field; editing a code starts a new operation. Approved and denied
|
|
817
|
+
states last only for that code in that scope.
|
|
773
818
|
`pending` is `"approve"` or `"deny"` from the press until the server answers, so the spinner goes
|
|
774
819
|
on the button that was pressed.
|
|
775
820
|
|
package/dist/oauth.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type QueryKey } from "@tanstack/react-query";
|
|
1
2
|
import { type ChangeEvent } from "react";
|
|
2
|
-
import type { ApiClient } from "./api-client.ts";
|
|
3
|
+
import type { ApiClient, RequestOptions } from "./api-client.ts";
|
|
3
4
|
/**
|
|
4
5
|
* The two pages behind an agent's sign-in: the consent page, where Claude or ChatGPT sends a
|
|
5
6
|
* person to connect, and the device page, where a script's short code is typed and approved.
|
|
@@ -46,11 +47,22 @@ export type DeviceView<Extra extends object = object> = Extra & {
|
|
|
46
47
|
/** ISO time: JSON carries the server's `Date` as a string. */
|
|
47
48
|
expiresAt: string;
|
|
48
49
|
};
|
|
50
|
+
/** Capture this from your app's identity store on each account or workspace generation. */
|
|
51
|
+
export interface OAuthScope {
|
|
52
|
+
/** Query-key prefix, including account, workspace and the identity generation. Never a token. */
|
|
53
|
+
readonly key: QueryKey;
|
|
54
|
+
/** Compare the captured generation with the live store, even before React renders again. */
|
|
55
|
+
isCurrent(): boolean;
|
|
56
|
+
}
|
|
57
|
+
/** A decision outlived its account, request or page. Aborting does not undo a server-side decision. */
|
|
58
|
+
export declare class OAuthOperationChangedError extends Error {
|
|
59
|
+
constructor();
|
|
60
|
+
}
|
|
49
61
|
export interface ConsentApi<Choice = void, Extra extends object = object> {
|
|
50
|
-
/**
|
|
51
|
-
describe(query: string): Promise<ConsentView<Extra> | OAuthRefusal>;
|
|
62
|
+
/** Forward `options`, including its signal, to your HTTP client. */
|
|
63
|
+
describe(query: string, options?: RequestOptions): Promise<ConsentView<Extra> | OAuthRefusal>;
|
|
52
64
|
/** Your API's call to `approve`. `choice` is anything your page adds, such as a workspace. */
|
|
53
|
-
approve(query: string, choice: Choice): Promise<{
|
|
65
|
+
approve(query: string, choice: Choice, options?: RequestOptions): Promise<{
|
|
54
66
|
ok: true;
|
|
55
67
|
redirectTo: string;
|
|
56
68
|
} | OAuthRefusal>;
|
|
@@ -81,15 +93,15 @@ export interface ConsentRequest<Choice = void, Extra extends object = object> {
|
|
|
81
93
|
approveError: unknown;
|
|
82
94
|
}
|
|
83
95
|
/**
|
|
84
|
-
* const consent = useConsentRequest(api.oauth, useLocation().search);
|
|
96
|
+
* const consent = useConsentRequest(api.oauth, useLocation().search, scope);
|
|
85
97
|
* if (consent.state.status === "ready") ... consent.approve(workspaceId)
|
|
86
98
|
*/
|
|
87
|
-
export declare function useConsentRequest<Choice = void, Extra extends object = object>(api: ConsentApi<Choice, Extra>, search: string): ConsentRequest<Choice, Extra>;
|
|
99
|
+
export declare function useConsentRequest<Choice = void, Extra extends object = object>(api: ConsentApi<Choice, Extra>, search: string, scope: OAuthScope): ConsentRequest<Choice, Extra>;
|
|
88
100
|
export interface DeviceApi<Choice = void, Extra extends object = object> {
|
|
89
|
-
/**
|
|
90
|
-
describe(code: string): Promise<DeviceView<Extra> | OAuthRefusal>;
|
|
101
|
+
/** Forward `options`, including its signal, to your HTTP client. */
|
|
102
|
+
describe(code: string, options?: RequestOptions): Promise<DeviceView<Extra> | OAuthRefusal>;
|
|
91
103
|
/** Your API's call to `decideDevice`. `choice` comes with a yes only, as on the consent page. */
|
|
92
|
-
decide(code: string, decision: "approve" | "deny", choice?: Choice): Promise<{
|
|
104
|
+
decide(code: string, decision: "approve" | "deny", choice?: Choice, options?: RequestOptions): Promise<{
|
|
93
105
|
ok: true;
|
|
94
106
|
} | OAuthRefusal>;
|
|
95
107
|
}
|
|
@@ -142,12 +154,12 @@ export interface DeviceApproval<Choice = void, Extra extends object = object> {
|
|
|
142
154
|
/** Upper case, letters only, at most 8, with the dash after the fourth: what the field shows. */
|
|
143
155
|
export declare function formatUserCode(input: string): string;
|
|
144
156
|
/**
|
|
145
|
-
* const device = useDeviceApproval(api.device, useLocation().search);
|
|
157
|
+
* const device = useDeviceApproval(api.device, useLocation().search, scope);
|
|
146
158
|
* <input value={device.code} onChange={(e) => device.setCode(e.target.value)} />
|
|
147
159
|
*
|
|
148
160
|
* The link the script prints carries `?code=`, so the field usually starts full.
|
|
149
161
|
*/
|
|
150
|
-
export declare function useDeviceApproval<Choice = void, Extra extends object = object>(api: DeviceApi<Choice, Extra>, search: string): DeviceApproval<Choice, Extra>;
|
|
162
|
+
export declare function useDeviceApproval<Choice = void, Extra extends object = object>(api: DeviceApi<Choice, Extra>, search: string, scope: OAuthScope): DeviceApproval<Choice, Extra>;
|
|
151
163
|
export interface DeviceCodeField {
|
|
152
164
|
/** Spread on the code's `<input>`. Point your `<label htmlFor>` at its `id`. */
|
|
153
165
|
inputProps: {
|
|
@@ -186,8 +198,8 @@ export declare function useDeviceCodeField<Choice, Extra extends object>(device:
|
|
|
186
198
|
export type OAuthConsoleHttp = Pick<ApiClient, "get" | "post">;
|
|
187
199
|
/**
|
|
188
200
|
* export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
|
|
189
|
-
* useConsentRequest(oauthApi.consent, search);
|
|
190
|
-
* useDeviceApproval(oauthApi.device, search);
|
|
201
|
+
* useConsentRequest(oauthApi.consent, search, scope);
|
|
202
|
+
* useDeviceApproval(oauthApi.device, search, scope);
|
|
191
203
|
*
|
|
192
204
|
* Both pages' calls to the server's `oauthConsoleRoutes`, mounted at `basePath` behind your
|
|
193
205
|
* sign-in. A choice travels as `choice`, which is where those routes hand it to your approver.
|
package/dist/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.js
CHANGED
|
@@ -1,25 +1,105 @@
|
|
|
1
|
-
import { useMutation, useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { useEffect, useId, useState } from "react";
|
|
1
|
+
import { hashKey, useMutation, useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useState, } from "react";
|
|
3
|
+
/** A decision outlived its account, request or page. Aborting does not undo a server-side decision. */
|
|
4
|
+
export class OAuthOperationChangedError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super("The account, sign-in request or page changed before the decision finished. Check connected apps in the account you used before trying again.");
|
|
7
|
+
this.name = "OAuthOperationChangedError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function assertCurrent(operation) {
|
|
11
|
+
if (!operation.isCurrent())
|
|
12
|
+
throw new OAuthOperationChangedError();
|
|
13
|
+
}
|
|
14
|
+
function createOperationLifetime(identity) {
|
|
15
|
+
let mounted = false;
|
|
16
|
+
let generation = 0;
|
|
17
|
+
const controllers = new Set();
|
|
18
|
+
return {
|
|
19
|
+
identity,
|
|
20
|
+
invalidate() {
|
|
21
|
+
generation++;
|
|
22
|
+
for (const controller of controllers)
|
|
23
|
+
controller.abort();
|
|
24
|
+
controllers.clear();
|
|
25
|
+
},
|
|
26
|
+
mount() {
|
|
27
|
+
mounted = true;
|
|
28
|
+
return () => {
|
|
29
|
+
mounted = false;
|
|
30
|
+
this.invalidate();
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
capture(isCurrent) {
|
|
34
|
+
const started = generation;
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
controllers.add(controller);
|
|
37
|
+
return {
|
|
38
|
+
identity,
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
isCurrent: () => mounted && started === generation && isCurrent(),
|
|
41
|
+
release: () => controllers.delete(controller),
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Both pages reject late answers, even when the adapter ignores abort or the cache was cleared. */
|
|
47
|
+
function useOAuthOperation(scope, kind, input) {
|
|
48
|
+
const key = [...scope.key, "@gusnips/react/oauth", kind, input];
|
|
49
|
+
const identity = hashKey(key);
|
|
50
|
+
const lifetime = useMemo(() => createOperationLifetime(identity), [identity]);
|
|
51
|
+
// Invalidate by the commit, before passive cleanup can leave a late redirect window.
|
|
52
|
+
// Layout effects work on native too and do not run during SSR. StrictMode can mount again.
|
|
53
|
+
useLayoutEffect(() => lifetime.mount(), [lifetime]);
|
|
54
|
+
return { key, lifetime, capture: () => lifetime.capture(() => scope.isCurrent()) };
|
|
55
|
+
}
|
|
3
56
|
/**
|
|
4
|
-
* const consent = useConsentRequest(api.oauth, useLocation().search);
|
|
57
|
+
* const consent = useConsentRequest(api.oauth, useLocation().search, scope);
|
|
5
58
|
* if (consent.state.status === "ready") ... consent.approve(workspaceId)
|
|
6
59
|
*/
|
|
7
|
-
export function useConsentRequest(api, search) {
|
|
60
|
+
export function useConsentRequest(api, search, scope) {
|
|
8
61
|
const query = search.replace(/^\?/, "");
|
|
62
|
+
const { key, lifetime, capture } = useOAuthOperation(scope, "consent", query);
|
|
9
63
|
const request = useQuery({
|
|
10
|
-
queryKey:
|
|
11
|
-
queryFn: () => api.describe(query),
|
|
64
|
+
queryKey: key,
|
|
65
|
+
queryFn: ({ signal }) => api.describe(query, { signal }),
|
|
66
|
+
// A previous description is never a safe stand-in for this approval target.
|
|
67
|
+
placeholderData: () => undefined,
|
|
68
|
+
retry: false,
|
|
69
|
+
refetchOnWindowFocus: false,
|
|
12
70
|
});
|
|
13
71
|
const approval = useMutation({
|
|
14
|
-
mutationFn: (
|
|
15
|
-
|
|
16
|
-
|
|
72
|
+
mutationFn: async (pressed) => {
|
|
73
|
+
const { api, query, choice, operation } = pressed;
|
|
74
|
+
try {
|
|
75
|
+
assertCurrent(operation);
|
|
76
|
+
const answer = await api.approve(query, choice, { signal: operation.signal });
|
|
77
|
+
// Before returning: stale success data must never enter the mutation cache.
|
|
78
|
+
assertCurrent(operation);
|
|
79
|
+
return answer;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
operation.release();
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
onSettled: (answer, error, { operation }) => {
|
|
86
|
+
// Global success and settlement callbacks may await an identity change. Check last.
|
|
87
|
+
if (error !== null)
|
|
88
|
+
return;
|
|
89
|
+
assertCurrent(operation);
|
|
90
|
+
if (answer?.ok)
|
|
17
91
|
window.location.assign(answer.redirectTo);
|
|
18
92
|
},
|
|
93
|
+
retry: false,
|
|
94
|
+
networkMode: "always",
|
|
19
95
|
});
|
|
96
|
+
const currentApproval = approval.variables?.operation.identity === lifetime.identity &&
|
|
97
|
+
approval.variables.operation.isCurrent();
|
|
20
98
|
// A refusal from approve (the request went stale between the two calls) outranks the view.
|
|
21
99
|
const answer = request.data;
|
|
22
|
-
|
|
100
|
+
let refusal = answer?.ok === false ? answer : null;
|
|
101
|
+
if (currentApproval && approval.data?.ok === false)
|
|
102
|
+
refusal = approval.data;
|
|
23
103
|
let state;
|
|
24
104
|
if (refusal)
|
|
25
105
|
state = { status: "refused", refusal };
|
|
@@ -31,14 +111,16 @@ export function useConsentRequest(api, search) {
|
|
|
31
111
|
state = { status: "loading" };
|
|
32
112
|
return {
|
|
33
113
|
state,
|
|
34
|
-
approve: (choice) => approval.mutate(choice),
|
|
35
|
-
leaving: approval.isPending || approval.data?.ok === true,
|
|
36
|
-
approveError: approval.error,
|
|
114
|
+
approve: (choice) => approval.mutate({ api, query, choice, operation: capture() }),
|
|
115
|
+
leaving: currentApproval && (approval.isPending || approval.data?.ok === true),
|
|
116
|
+
approveError: currentApproval ? approval.error : null,
|
|
37
117
|
};
|
|
38
118
|
}
|
|
39
119
|
/** The server's alphabet: no vowels, so a code never spells a word. */
|
|
40
120
|
const ALPHABET = "BCDFGHJKLMNPQRSTVWXZ";
|
|
41
121
|
const LENGTH = 8;
|
|
122
|
+
// Private wiring between the approval and field hooks, without adding to the public page API.
|
|
123
|
+
const deviceAddressWrites = new WeakMap();
|
|
42
124
|
/** Upper case, letters only, at most 8, with the dash after the fourth: what the field shows. */
|
|
43
125
|
export function formatUserCode(input) {
|
|
44
126
|
const letters = input
|
|
@@ -48,27 +130,63 @@ export function formatUserCode(input) {
|
|
|
48
130
|
return letters.length > 4 ? `${letters.slice(0, 4)}-${letters.slice(4)}` : letters;
|
|
49
131
|
}
|
|
50
132
|
/**
|
|
51
|
-
* const device = useDeviceApproval(api.device, useLocation().search);
|
|
133
|
+
* const device = useDeviceApproval(api.device, useLocation().search, scope);
|
|
52
134
|
* <input value={device.code} onChange={(e) => device.setCode(e.target.value)} />
|
|
53
135
|
*
|
|
54
136
|
* The link the script prints carries `?code=`, so the field usually starts full.
|
|
55
137
|
*/
|
|
56
|
-
export function useDeviceApproval(api, search) {
|
|
57
|
-
const
|
|
138
|
+
export function useDeviceApproval(api, search, scope) {
|
|
139
|
+
const fromLink = formatUserCode(new URLSearchParams(search).get("code") ?? "");
|
|
140
|
+
const [input, setInput] = useState({ fromLink, code: fromLink });
|
|
141
|
+
const recordAddressWrite = useCallback((ownAddress) => {
|
|
142
|
+
setInput((current) => ({ ...current, ownAddress }));
|
|
143
|
+
}, []);
|
|
144
|
+
// Only external links replace input. The field also writes the address while typing and
|
|
145
|
+
// clears it after a decision; neither write should replace input or invalidate the decision.
|
|
146
|
+
const code = input.fromLink === fromLink || input.ownAddress === fromLink ? input.code : fromLink;
|
|
147
|
+
if (input.fromLink !== fromLink)
|
|
148
|
+
setInput({ fromLink, code });
|
|
58
149
|
const letters = code.replace("-", "");
|
|
59
150
|
const invalidLetter = [...letters].some((letter) => !ALPHABET.includes(letter));
|
|
60
151
|
const complete = letters.length === LENGTH && !invalidLetter;
|
|
152
|
+
const { key, lifetime, capture } = useOAuthOperation(scope, "device", letters);
|
|
61
153
|
const decision = useMutation({
|
|
62
|
-
mutationFn: (pressed) =>
|
|
154
|
+
mutationFn: async (pressed) => {
|
|
155
|
+
const { api, code, decision, choice, operation } = pressed;
|
|
156
|
+
try {
|
|
157
|
+
assertCurrent(operation);
|
|
158
|
+
const answer = await api.decide(code, decision, choice, { signal: operation.signal });
|
|
159
|
+
assertCurrent(operation);
|
|
160
|
+
return answer;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
operation.release();
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
onSettled: (_answer, error, { operation }) => {
|
|
167
|
+
if (error === null)
|
|
168
|
+
assertCurrent(operation);
|
|
169
|
+
},
|
|
170
|
+
retry: false,
|
|
171
|
+
networkMode: "always",
|
|
63
172
|
});
|
|
64
|
-
const
|
|
173
|
+
const currentDecision = decision.variables?.operation.identity === lifetime.identity &&
|
|
174
|
+
decision.variables.operation.isCurrent();
|
|
175
|
+
const decided = currentDecision && decision.isSuccess && decision.data.ok
|
|
176
|
+
? decision.variables.decision
|
|
177
|
+
: undefined;
|
|
65
178
|
const request = useQuery({
|
|
66
|
-
queryKey:
|
|
67
|
-
queryFn: () => api.describe(letters),
|
|
179
|
+
queryKey: key,
|
|
180
|
+
queryFn: ({ signal }) => api.describe(letters, { signal }),
|
|
68
181
|
enabled: complete && decided === undefined,
|
|
182
|
+
placeholderData: () => undefined,
|
|
183
|
+
retry: false,
|
|
184
|
+
refetchOnWindowFocus: false,
|
|
69
185
|
});
|
|
70
186
|
const answer = request.data;
|
|
71
|
-
|
|
187
|
+
let refusal = answer?.ok === false ? answer : null;
|
|
188
|
+
if (currentDecision && decision.data?.ok === false)
|
|
189
|
+
refusal = decision.data;
|
|
72
190
|
let state;
|
|
73
191
|
if (decided !== undefined)
|
|
74
192
|
state = { status: decided === "approve" ? "approved" : "denied" };
|
|
@@ -82,20 +200,26 @@ export function useDeviceApproval(api, search) {
|
|
|
82
200
|
state = { status: "failed", error: request.error, retry: () => void request.refetch() };
|
|
83
201
|
else
|
|
84
202
|
state = { status: "loading" };
|
|
85
|
-
|
|
203
|
+
const device = {
|
|
86
204
|
state,
|
|
87
205
|
code,
|
|
88
|
-
setCode: (
|
|
206
|
+
setCode: (value) => {
|
|
207
|
+
const next = formatUserCode(value);
|
|
208
|
+
if (next === code)
|
|
209
|
+
return;
|
|
210
|
+
lifetime.invalidate();
|
|
89
211
|
decision.reset();
|
|
90
|
-
|
|
212
|
+
setInput((current) => ({ ...current, code: next }));
|
|
91
213
|
},
|
|
92
214
|
invalidLetter,
|
|
93
|
-
approve: (choice) => decision.mutate({ decision: "approve", choice }),
|
|
94
|
-
deny: () => decision.mutate({ decision: "deny" }),
|
|
95
|
-
deciding: decision.isPending,
|
|
96
|
-
pending: decision.isPending ? decision.variables.decision : null,
|
|
97
|
-
decideError: decision.error,
|
|
215
|
+
approve: (choice) => decision.mutate({ api, code: letters, decision: "approve", choice, operation: capture() }),
|
|
216
|
+
deny: () => decision.mutate({ api, code: letters, decision: "deny", operation: capture() }),
|
|
217
|
+
deciding: currentDecision && decision.isPending,
|
|
218
|
+
pending: currentDecision && decision.isPending ? decision.variables.decision : null,
|
|
219
|
+
decideError: currentDecision ? decision.error : null,
|
|
98
220
|
};
|
|
221
|
+
deviceAddressWrites.set(device, recordAddressWrite);
|
|
222
|
+
return device;
|
|
99
223
|
}
|
|
100
224
|
/**
|
|
101
225
|
* const field = useDeviceCodeField(device);
|
|
@@ -113,15 +237,18 @@ export function useDeviceCodeField(device) {
|
|
|
113
237
|
const statusId = `${id}-status`;
|
|
114
238
|
const { status } = device.state;
|
|
115
239
|
const inAddress = status === "approved" || status === "denied" ? "" : device.code;
|
|
240
|
+
const recordAddressWrite = deviceAddressWrites.get(device);
|
|
116
241
|
useEffect(() => {
|
|
117
242
|
const url = new URL(window.location.href);
|
|
118
243
|
if (inAddress)
|
|
119
244
|
url.searchParams.set("code", inAddress);
|
|
120
245
|
else
|
|
121
246
|
url.searchParams.delete("code");
|
|
122
|
-
if (url.href !== window.location.href)
|
|
247
|
+
if (url.href !== window.location.href) {
|
|
248
|
+
recordAddressWrite?.(inAddress);
|
|
123
249
|
window.history.replaceState(window.history.state, "", url);
|
|
124
|
-
|
|
250
|
+
}
|
|
251
|
+
}, [inAddress, recordAddressWrite]);
|
|
125
252
|
return {
|
|
126
253
|
inputProps: {
|
|
127
254
|
id,
|
|
@@ -141,8 +268,8 @@ export function useDeviceCodeField(device) {
|
|
|
141
268
|
}
|
|
142
269
|
/**
|
|
143
270
|
* export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
|
|
144
|
-
* useConsentRequest(oauthApi.consent, search);
|
|
145
|
-
* useDeviceApproval(oauthApi.device, search);
|
|
271
|
+
* useConsentRequest(oauthApi.consent, search, scope);
|
|
272
|
+
* useDeviceApproval(oauthApi.device, search, scope);
|
|
146
273
|
*
|
|
147
274
|
* Both pages' calls to the server's `oauthConsoleRoutes`, mounted at `basePath` behind your
|
|
148
275
|
* sign-in. A choice travels as `choice`, which is where those routes hand it to your approver.
|
|
@@ -151,12 +278,12 @@ export function useDeviceCodeField(device) {
|
|
|
151
278
|
export function createOAuthConsoleApi(http, basePath) {
|
|
152
279
|
return {
|
|
153
280
|
consent: {
|
|
154
|
-
describe: (query) => http.get(`${basePath}/request?${query}
|
|
155
|
-
approve: (query, choice) => http.post(`${basePath}/approve`, { query, choice }),
|
|
281
|
+
describe: (query, options) => http.get(`${basePath}/request?${query}`, options),
|
|
282
|
+
approve: (query, choice, options) => http.post(`${basePath}/approve`, { query, choice }, options),
|
|
156
283
|
},
|
|
157
284
|
device: {
|
|
158
|
-
describe: (code) => http.get(`${basePath}/device?code=${encodeURIComponent(code)}
|
|
159
|
-
decide: (code, decision, choice) => http.post(`${basePath}/device`, { code, decision, choice }),
|
|
285
|
+
describe: (code, options) => http.get(`${basePath}/device?code=${encodeURIComponent(code)}`, options),
|
|
286
|
+
decide: (code, decision, choice, options) => http.post(`${basePath}/device`, { code, decision, choice }, options),
|
|
160
287
|
},
|
|
161
288
|
};
|
|
162
289
|
}
|
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gusnips/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "The headless runtime under a Vite + React SPA: typed fetch client with single-flight refresh, auth store, query defaults, route guards, error boundary, stale-tab recovery, i18n bootstrap.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|