88 * Import RTK slices and api
99 */
1010import { CustomLogger , logger as loggerFn , LogLevel } from '@forgerock/sdk-logger' ;
11+ import { createStorage } from '@forgerock/storage' ;
1112
1213import { createClientStore , handleUpdateValidateError , RootState } from './client.store.utils.js' ;
1314import { nodeSlice } from './node.slice.js' ;
@@ -28,7 +29,6 @@ import type {
2829} from './davinci.types.js' ;
2930import type {
3031 SingleValueCollectors ,
31- IdpCollector ,
3232 MultiSelectCollector ,
3333 ObjectValueCollectors ,
3434 PhoneNumberInputValue ,
@@ -41,8 +41,7 @@ import type {
4141 Validator ,
4242} from './client.types.js' ;
4343import { returnValidator } from './collector.utils.js' ;
44- import { StartNode } from './node.types.js' ;
45- import { returnRedirectUrlForSocialLogin } from './davinci.utils.js' ;
44+ import { ContinueNode , StartNode } from './node.types.js' ;
4645
4746/**
4847 * Create a client function that returns a set of methods
@@ -66,7 +65,10 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
6665} ) {
6766 const log = loggerFn ( { level : logger ?. level || 'error' , custom : logger ?. custom } ) ;
6867 const store = createClientStore ( { requestMiddleware, logger : log } ) ;
69-
68+ const serverStorage = createStorage < ContinueNode [ 'server' ] > (
69+ { storeType : 'localStorage' } ,
70+ 'socialLoginUrl' ,
71+ ) ;
7072 if ( ! config . serverConfig . wellknown ) {
7173 const error = new Error (
7274 '`wellknown` property is a required as part of the `config.serverConfig`' ,
@@ -114,17 +116,23 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
114116 * @param collector IdpCollector
115117 * @returns {function }
116118 */
117- externalIdp : ( collector : IdpCollector ) : ( ( ) => string | InternalErrorResponse ) => {
119+ externalIdp : ( ) : ( ( ) => Promise < void | InternalErrorResponse > ) => {
118120 const rootState : RootState = store . getState ( ) ;
119-
120121 const serverSlice = nodeSlice . selectors . selectServer ( rootState ) ;
121122
122- return ( ) => {
123- const result = returnRedirectUrlForSocialLogin ( serverSlice , collector , log ) ;
124- if ( typeof result == 'string' ) {
125- return result ;
126- }
127- return result ;
123+ if ( serverSlice && serverSlice . status === 'continue' ) {
124+ return async ( ) => {
125+ await serverStorage . set ( serverSlice ) ;
126+ } ;
127+ }
128+ return async ( ) => {
129+ return {
130+ error : {
131+ message :
132+ 'Not in a continue node state, must be in a continue node to use external idp method' ,
133+ type : 'state_error' ,
134+ } ,
135+ } as InternalErrorResponse ;
128136 } ;
129137 } ,
130138
@@ -178,12 +186,34 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
178186 * @method : resume - Resume a social login flow when returned to application
179187 * @returns unknown
180188 */
181- resume : async ( { continueToken } : { continueToken : string } ) => {
182- await store . dispatch ( davinciApi . endpoints . resume . initiate ( { continueToken } ) ) ;
183-
184- const node = nodeSlice . selectSlice ( store . getState ( ) ) ;
185-
186- return node ;
189+ resume : async ( {
190+ continueToken,
191+ } : {
192+ continueToken : string ;
193+ } ) : Promise < InternalErrorResponse | NodeStates > => {
194+ try {
195+ const serverInfo = await serverStorage . get ( ) ;
196+ if ( serverInfo && '_links' in serverInfo ) {
197+ await store . dispatch ( davinciApi . endpoints . resume . initiate ( { continueToken, serverInfo } ) ) ;
198+ await serverStorage . remove ( ) ;
199+
200+ const node = nodeSlice . selectSlice ( store . getState ( ) ) ;
201+
202+ return node ;
203+ } else {
204+ throw new Error ( 'failure to get continue url' ) ;
205+ }
206+ } catch {
207+ // logger.error('No url found in collector, social login needs a url in the collector');
208+ return {
209+ error : {
210+ message :
211+ 'No url found in storage, social login needs a continue url which is saved in local storage. You may have cleared your browser data' ,
212+ type : 'internal_error' ,
213+ } ,
214+ type : 'internal_error' ,
215+ } ;
216+ }
187217 } ,
188218
189219 /**
0 commit comments