Skip to content

Commit b4caa6f

Browse files
committed
feat(verifyToken): add & expose verifyToken reject instead of error
1 parent 76ddacd commit b4caa6f

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

src/index.tsx

+37-20
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ const errors = {
4141
tokenMissingOrInvalid: 'either no token found or invalid for this purpose',
4242
};
4343

44-
type MaybeUserPromise = Promise<User | undefined>;
45-
4644
export type ReactNetlifyIdentityAPI = {
4745
user: User | undefined;
4846
/** not meant for normal use! you should mostly use one of the other exported methods to update the user instance */
@@ -54,32 +52,33 @@ export type ReactNetlifyIdentityAPI = {
5452
password: string,
5553
data: Object,
5654
directLogin: boolean
57-
) => MaybeUserPromise;
55+
) => Promise<User | undefined>;
5856
loginUser: (
5957
email: string,
6058
password: string,
6159
remember?: boolean
62-
) => MaybeUserPromise;
63-
logoutUser: () => MaybeUserPromise;
60+
) => Promise<User | undefined>;
61+
logoutUser: () => Promise<User | undefined>;
6462
requestPasswordRecovery: (email: string) => Promise<void>;
65-
recoverAccount: (remember?: boolean) => MaybeUserPromise;
66-
updateUser: (fields: object) => MaybeUserPromise;
67-
getFreshJWT: () => Promise<string>;
63+
recoverAccount: (remember?: boolean) => Promise<User | undefined>;
64+
updateUser: (fields: object) => Promise<User | undefined>;
65+
getFreshJWT: () => Promise<string> | undefined;
6866
authedFetch: {
69-
get: (endpoint: string, obj?: {}) => Promise<any>;
70-
post: (endpoint: string, obj?: {}) => Promise<any>;
71-
put: (endpoint: string, obj?: {}) => Promise<any>;
72-
delete: (endpoint: string, obj?: {}) => Promise<any>;
67+
get: (endpoint: string, obj?: RequestInit) => Promise<any>;
68+
post: (endpoint: string, obj?: RequestInit) => Promise<any>;
69+
put: (endpoint: string, obj?: RequestInit) => Promise<any>;
70+
delete: (endpoint: string, obj?: RequestInit) => Promise<any>;
7371
};
7472
_goTrueInstance: GoTrue;
7573
_url: string;
7674
loginProvider: (provider: Provider) => void;
7775
acceptInviteExternalUrl: (
7876
provider: Provider,
7977
autoRedirect: boolean
80-
) => void | string;
78+
) => string | undefined;
8179
settings: Settings;
8280
param: TokenParam;
81+
verifyToken: () => Promise<User | undefined>;
8382
};
8483

8584
const [_useIdentityContext, _IdentityCtxProvider] = createCtx<
@@ -184,7 +183,8 @@ export function useNetlifyIdentity(
184183
const acceptInviteExternalUrl = useCallback(
185184
(provider: Provider, autoRedirect: boolean = true) => {
186185
if (!param.token || param.type !== 'invite') {
187-
throw new Error(errors.tokenMissingOrInvalid);
186+
console.error(errors.tokenMissingOrInvalid);
187+
return;
188188
}
189189

190190
const url = goTrueInstance.acceptInviteExternalUrl(provider, param.token);
@@ -201,6 +201,22 @@ export function useNetlifyIdentity(
201201
[goTrueInstance, param]
202202
);
203203

204+
/**
205+
* @see https://github.com/netlify/gotrue-js/blob/master/src/index.js#L123
206+
*/
207+
const verifyToken = useCallback(() => {
208+
if (!param.type || !param.token) {
209+
return Promise.reject(errors.tokenMissingOrInvalid);
210+
}
211+
212+
return goTrueInstance.verify(param.type, param.token).then(user => {
213+
// cleanup consumed token
214+
setParam(defaultParam);
215+
216+
return user;
217+
});
218+
}, [goTrueInstance, param]);
219+
204220
/******* email auth */
205221
/**
206222
* @see https://github.com/netlify/gotrue-js/blob/master/src/index.js#L50
@@ -245,7 +261,7 @@ export function useNetlifyIdentity(
245261
const recoverAccount = useCallback(
246262
(remember?: boolean) => {
247263
if (!param.token || param.type !== 'recovery') {
248-
throw new Error(errors.tokenMissingOrInvalid);
264+
return Promise.reject(errors.tokenMissingOrInvalid);
249265
}
250266

251267
return goTrueInstance
@@ -267,7 +283,7 @@ export function useNetlifyIdentity(
267283
const updateUser = useCallback(
268284
(fields: object) => {
269285
if (!user) {
270-
throw new Error(errors.noUserFound);
286+
return Promise.reject(errors.noUserFound);
271287
}
272288

273289
return user!
@@ -282,7 +298,7 @@ export function useNetlifyIdentity(
282298
*/
283299
const getFreshJWT = useCallback(() => {
284300
if (!user) {
285-
throw new Error(errors.noUserFound);
301+
return Promise.reject(errors.noUserFound);
286302
}
287303

288304
return user.jwt();
@@ -293,18 +309,18 @@ export function useNetlifyIdentity(
293309
*/
294310
const logoutUser = useCallback(() => {
295311
if (!user) {
296-
throw new Error(errors.noUserFound);
312+
return Promise.reject(errors.noUserFound);
297313
}
298314

299315
return user.logout().then(() => _setUser(undefined));
300316
}, [user]);
301317

302-
const genericAuthedFetch = (method: string) => (
318+
const genericAuthedFetch = (method: RequestInit['method']) => (
303319
endpoint: string,
304320
options: RequestInit = {}
305321
) => {
306322
if (!user?.token?.access_token) {
307-
throw new Error(errors.noUserTokenFound);
323+
return Promise.reject(errors.noUserFound);
308324
}
309325

310326
const defaultObj = {
@@ -349,6 +365,7 @@ export function useNetlifyIdentity(
349365
acceptInviteExternalUrl,
350366
settings,
351367
param,
368+
verifyToken,
352369
};
353370
}
354371

0 commit comments

Comments
 (0)