1- import { PathHelper } from '@sensenet/client-utils'
21import { InjectorContext , LoggerContextProvider } from '@sensenet/hooks-react'
32import React , { ReactNode , Suspense , useCallback , useEffect , useState } from 'react'
43import { BrowserRouter } from 'react-router-dom'
87 LocalizationProvider ,
98 PersonalSettingsContextProvider ,
109 RepositoryProvider ,
10+ RepositorySwitchContext ,
1111 ResponsiveContextProvider ,
1212 ThemeProvider ,
1313} from '../context'
@@ -22,6 +22,12 @@ import {
2222 NavigationCommandProvider ,
2323 SearchCommandProvider ,
2424} from '../services'
25+ import {
26+ clearActiveRepositorySelection ,
27+ hasSnAuthRepositoryTokens ,
28+ normalizeRepositoryUrl ,
29+ startSnAuthRepositoryLogin ,
30+ } from '../services/repository-session'
2531import { DialogProvider } from './dialogs/dialog-provider'
2632
2733import { GridLoadingProvider } from './grid/Providers/GridLoadingProvider'
@@ -34,28 +40,56 @@ export type AppProvidersProps = {
3440}
3541
3642export default function AppProviders ( { children } : AppProvidersProps ) {
37- const initAuthType : AuthServerType = ( window . localStorage . getItem ( 'authType' ) as AuthServerType ) ?? 'IdentityServer'
43+ const initAuthType : AuthServerType =
44+ ( window . localStorage . getItem ( 'authType' ) as AuthServerType ) ?? defaultAuthConfig . authType
3845 const [ authType , setAuthType ] = useState < 'IdentityServer' | 'SNAuth' > ( initAuthType )
3946 const [ url , setUrl ] = useState < string > ( '' )
4047
48+ const selectRepository = useCallback ( ( providedUrl : string ) => {
49+ const normalizedUrl = normalizeRepositoryUrl ( providedUrl )
50+
51+ clearActiveRepositorySelection ( )
52+ startSnAuthRepositoryLogin ( normalizedUrl )
53+ setUrl ( normalizedUrl )
54+ } , [ ] )
55+
4156 const changeAuthType = useCallback ( ( providedUrl : string ) => {
42- setUrl ( PathHelper . ensureDefaultSchema ( providedUrl ) )
57+ const normalizedUrl = normalizeRepositoryUrl ( providedUrl )
58+
59+ setUrl ( normalizedUrl )
4360 setAuthType ( ( prev ) => {
4461 const newAuthType = prev === 'IdentityServer' ? 'SNAuth' : 'IdentityServer'
62+ if ( newAuthType === 'SNAuth' ) {
63+ startSnAuthRepositoryLogin ( normalizedUrl )
64+ }
4565 window . localStorage . setItem ( 'authType' , newAuthType )
4666 return newAuthType
4767 } )
4868 } , [ ] )
4969
70+ const switchRepository = useCallback ( ( providedUrl : string ) => {
71+ const normalizedUrl = normalizeRepositoryUrl ( providedUrl )
72+
73+ if ( ! hasSnAuthRepositoryTokens ( normalizedUrl ) ) {
74+ startSnAuthRepositoryLogin ( normalizedUrl )
75+ }
76+
77+ window . localStorage . setItem ( 'authType' , 'SNAuth' )
78+ setAuthType ( 'SNAuth' )
79+ setUrl ( normalizedUrl )
80+ } , [ ] )
81+
5082 useEffect ( ( ) => {
51- const IsAuthKey = localStorage . getItem ( authConfigKeyIS )
52- const SnAuthKey = localStorage . getItem ( authConfigKeySN )
53- if ( IsAuthKey || SnAuthKey ) return
5483 const repoUrl = new URL ( window . location . href ) . searchParams . get ( 'repoUrl' )
5584 if ( repoUrl ) {
56- changeAuthType ( repoUrl )
85+ selectRepository ( repoUrl )
86+ return
5787 }
58- } , [ changeAuthType ] )
88+
89+ const IsAuthKey = localStorage . getItem ( authConfigKeyIS )
90+ const SnAuthKey = localStorage . getItem ( authConfigKeySN )
91+ if ( IsAuthKey || SnAuthKey ) return
92+ } , [ selectRepository ] )
5993
6094 snInjector
6195 . getInstance ( CommandProviderManager )
@@ -76,31 +110,33 @@ export default function AppProviders({ children }: AppProvidersProps) {
76110 < GridLoadingProvider >
77111 < TreeLoadingProvider >
78112 < ThemeProvider >
79- { authType === 'IdentityServer' ? (
80- < RepositoryProvider url = { url } changeAuthType = { changeAuthType } >
81- < ShareProvider >
82- < ISAuthProvider >
83- < ResponsiveContextProvider >
84- < ExpandedItemsProvider >
85- < DialogProvider > { children } </ DialogProvider >
86- </ ExpandedItemsProvider >
87- </ ResponsiveContextProvider >
88- </ ISAuthProvider >
89- </ ShareProvider >
90- </ RepositoryProvider >
91- ) : (
92- < SnAuthRepositoryProvider url = { url } changeAuthType = { changeAuthType } >
93- < ShareProvider >
94- < SNAuthProvider >
95- < ResponsiveContextProvider >
96- < ExpandedItemsProvider >
97- < DialogProvider > { children } </ DialogProvider >
98- </ ExpandedItemsProvider >
99- </ ResponsiveContextProvider >
100- </ SNAuthProvider >
101- </ ShareProvider >
102- </ SnAuthRepositoryProvider >
103- ) }
113+ < RepositorySwitchContext . Provider value = { { authType, switchRepository } } >
114+ { authType === 'IdentityServer' ? (
115+ < RepositoryProvider url = { url } changeAuthType = { changeAuthType } >
116+ < ShareProvider >
117+ < ISAuthProvider >
118+ < ResponsiveContextProvider >
119+ < ExpandedItemsProvider >
120+ < DialogProvider > { children } </ DialogProvider >
121+ </ ExpandedItemsProvider >
122+ </ ResponsiveContextProvider >
123+ </ ISAuthProvider >
124+ </ ShareProvider >
125+ </ RepositoryProvider >
126+ ) : (
127+ < SnAuthRepositoryProvider url = { url } changeAuthType = { changeAuthType } >
128+ < ShareProvider >
129+ < SNAuthProvider >
130+ < ResponsiveContextProvider >
131+ < ExpandedItemsProvider >
132+ < DialogProvider > { children } </ DialogProvider >
133+ </ ExpandedItemsProvider >
134+ </ ResponsiveContextProvider >
135+ </ SNAuthProvider >
136+ </ ShareProvider >
137+ </ SnAuthRepositoryProvider >
138+ ) }
139+ </ RepositorySwitchContext . Provider >
104140 </ ThemeProvider >
105141 </ TreeLoadingProvider >
106142 </ GridLoadingProvider >
0 commit comments