diff --git a/package-lock.json b/package-lock.json index 2287382..e69944e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18707,7 +18707,7 @@ }, "package": { "name": "@userfront/toolkit", - "version": "1.0.9-alpha.0", + "version": "1.0.9-alpha.1", "license": "MIT", "dependencies": { "@r2wc/react-to-web-component": "^2.0.2", diff --git a/package/package-lock.json b/package/package-lock.json index fe8248b..43d2d1f 100644 --- a/package/package-lock.json +++ b/package/package-lock.json @@ -1,12 +1,12 @@ { "name": "@userfront/react", - "version": "1.0.9-alpha.0", + "version": "1.0.9-alpha.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@userfront/react", - "version": "1.0.9-alpha.0", + "version": "1.0.9-alpha.1", "license": "MIT", "dependencies": { "@r2wc/react-to-web-component": "^2.0.2", diff --git a/package/package.json b/package/package.json index f4ea137..2d66e0f 100644 --- a/package/package.json +++ b/package/package.json @@ -1,6 +1,6 @@ { "name": "@userfront/toolkit", - "version": "1.0.9-alpha.0", + "version": "1.0.9-alpha.1", "description": "Bindings and components for authentication with Userfront with React, Vue, other frameworks, and plain JS + HTML", "type": "module", "directories": { diff --git a/package/src/forms/UniversalForm.jsx b/package/src/forms/UniversalForm.jsx index 70a7b0a..9608653 100644 --- a/package/src/forms/UniversalForm.jsx +++ b/package/src/forms/UniversalForm.jsx @@ -553,6 +553,7 @@ const componentForStep = (state) => { // Already logged in - for forms on pages without redirect-on-load case "alreadyLoggedIn": + case "refreshTokens": return { title: strings.general.welcome, Component: AlreadyLoggedIn, diff --git a/package/src/models/forms/universal.ts b/package/src/models/forms/universal.ts index b5f099b..026918a 100644 --- a/package/src/models/forms/universal.ts +++ b/package/src/models/forms/universal.ts @@ -363,9 +363,9 @@ const universalMachineConfig: AuthMachineConfig = { }, // This is a signup or login form, do shared initialization - // If there's already a user, proceed. + // If there's already a user refresh their tokens, proceed. { - target: "alreadyLoggedIn", + target: "refreshTokens", cond: "isLoggedIn", }, @@ -397,6 +397,21 @@ const universalMachineConfig: AuthMachineConfig = { ], }, + refreshTokens: { + invoke: { + // Update the tokens + // @ts-ignore - TS doesn't infer all of the valid methods correctly + src: () => callUserfront({ method: "refresh" }), + + onDone: { + target: "alreadyLoggedIn", + }, + onError: { + target: "alreadyLoggedIn", + }, + }, + }, + // This is a login or signup form, but we're already logged in. // Show a message, and redirect if config.redirectOnLoad !== false. alreadyLoggedIn: { diff --git a/package/src/services/userfront.ts b/package/src/services/userfront.ts index 811afff..b3d08eb 100644 --- a/package/src/services/userfront.ts +++ b/package/src/services/userfront.ts @@ -28,7 +28,11 @@ export const overrideUserfrontSingleton = (newSingleton: any) => { // A type with the keys of all functions in Type type Functions = { - [Key in keyof Type]-?: Type[Key] extends Function ? Key : never; + [Key in keyof Type]-?: Type[Key] extends Function + ? Key + : Type[Key] extends object + ? Functions // Recursively check nested objects + : never; }[keyof Type]; export interface CallUserfront {