diff --git a/.gitignore b/.gitignore index 0af93d9..d943438 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ node_modules -.npmrc - dist yarn-debug.log* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..481c7c4 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +@navi:registry=https://nexus.cmd.navi-tech.in/repository/npm-packages/ + +//https://nexus.cmd.navi-tech.in/repository/npm-packages/:__authToken=NpmToken.1a3d3462-fb82-364c-bc64-0051e24635b3 \ No newline at end of file diff --git a/package.json b/package.json index 85ec3fc..9e93db7 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ ] }, "dependencies": { - "@navi/web-ui": "^1.49.8", - "@super-app/dark-knight": "^1.0.6", + "@navi/dark-knight": "^1.0.13", + "@navi/web-ui": "^1.58.13", "axios": "^1.3.4", "classnames": "^2.3.2", "node-sass": "^8.0.0", diff --git a/src/App.tsx b/src/App.tsx index 23b941a..556f1b0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,55 +1,16 @@ -import { useEffect } from 'react'; - -import DarkKnight from '@super-app/dark-knight'; -import { toast } from '@navi/web-ui/lib/primitives/Toast/index'; - +import { DarkKnightInstance } from '@navi/dark-knight'; import AppRouter from './AppRouter'; +import FallbackComponent from './components/Fallback'; +import React from 'react'; -const config = window.config ?? {}; +interface AppProps { + auth: DarkKnightInstance; +} -const initOptions = { - url: config.AUTH_BASE_URL, - clientId: config.AUTH_CLIENT_ID, - onLoad: 'login-required', -}; - -const auth = DarkKnight(initOptions); - -const App = () => { - useEffect(() => { - if (window?.config?.ENVIRONMENT === 'production') { - const token = localStorage.getItem('react-token'); - auth - .init({ - onLoad: 'check-sso', - sessionToken: token ?? undefined, - enableLogging: true, - }) - .then((authenticated: boolean) => { - if (!authenticated) { - auth.login({ - redirectUri: `${window.location.protocol}//${window.location.host}/agent/login/?redirectUri=${window.location.href}`, - }); - } - localStorage.setItem('react-token', auth.sessionToken ?? ''); - localStorage.setItem( - 'user-data', - JSON.stringify(auth.idTokenParsed) ?? '', - ); - localStorage.setItem('email-id', `${auth.idTokenParsed?.emailId}`); - }) - .catch(error => { - if (error?.response?.status === 403) { - toast.error( - 'You are not authorized to perform this action. Permission denied!', - ); - } - localStorage.setItem('react-token', 'null'); - localStorage.setItem('user-data', 'null'); - }); - } - }, []); +const App: React.FC = props => { + const { auth } = props; + if (!auth.sessionToken) return ; return ; }; diff --git a/src/main.tsx b/src/main.tsx index 25d7ff1..752585c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,19 +1,29 @@ import React from 'react'; -import ReactDOM from 'react-dom/client'; import { BrowserRouter } from 'react-router-dom'; - +import { createRoot } from 'react-dom/client'; import '@navi/web-ui/lib/styles/index.css'; import App from './App'; import ToastWrapper from './components/ToastWrapper/index'; - +import { DarkKnightInstance } from '@navi/dark-knight'; +import { initAuth } from '@src/services/auth'; import './index.css'; -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - - , -); +const renderHoustonApp = (auth: DarkKnightInstance) => { + const container = document.getElementById('root'); + if (container) { + const root = createRoot(container); + root.render( + + + + + + , + ); + } +}; + +initAuth({ + renderApp: renderHoustonApp, +}); diff --git a/src/services/auth.ts b/src/services/auth.ts new file mode 100644 index 0000000..e5d76de --- /dev/null +++ b/src/services/auth.ts @@ -0,0 +1,77 @@ +import { toast } from '@navi/web-ui/lib/primitives/Toast'; +import DarkKnight, { DarkKnightInstance } from '@navi/dark-knight'; +import { removeFromLocalStorage, setLocalStorage } from '@src/services/storage'; +import { setToken, getToken } from '@src/services/token'; + +interface InitAuth { + renderApp: (auth: DarkKnightInstance) => void; +} + +const config = window.config ?? {}; + +const initOptions = { + url: config.AUTH_BASE_URL, + clientId: config.AUTH_CLIENT_ID, + onLoad: 'login-required', +}; + +const initAuth = ({ renderApp }: InitAuth): void => { + const auth = DarkKnight(initOptions); + + if (!getToken()) { + removeFromLocalStorage('search-with-filter'); + } + + const onAuthSuccess = (auth: DarkKnightInstance) => { + setToken(auth.sessionToken || ''); + setLocalStorage('email-id', `${auth?.idTokenParsed?.emailId}`); + }; + + const onAuthError = (error: any): void => { + renderApp(auth); + + if (error?.response?.status === 403) + toast.error('You are not authorized. Permission denied!'); + + if (error?.response?.status === 404) + toast.error('You are not authorized. Please get access!'); + + toast.error('You are not authorized. Permission denied!'); + + setTimeout(() => { + window?.location?.reload(); + }, 2000); + + return; + }; + + auth + .init({ + onLoad: 'check-sso', + sessionToken: getToken() ?? undefined, + enableLogging: true, + }) + .then((authenticated: boolean) => { + if (!authenticated) { + auth.login({ + redirectUri: `${window.location.protocol}//${window.location.host}/agent/login/?redirectUri=${window.location.href}`, + }); + } + + setToken(auth.sessionToken || ''); + setLocalStorage('email-id', `${auth?.idTokenParsed?.emailId}`); + setLocalStorage('user-data', JSON.stringify(auth?.idTokenParsed)); + onAuthSuccess(auth); + renderApp(auth); + }) + .catch(error => { + toast.error( + 'You are not authorized to perform this action. Permission denied!', + ); + setToken(''); + setLocalStorage('user-data', ''); + onAuthError(error); + }); +}; + +export { initAuth }; diff --git a/src/services/storage.ts b/src/services/storage.ts new file mode 100644 index 0000000..22c94ac --- /dev/null +++ b/src/services/storage.ts @@ -0,0 +1,27 @@ +const getFromLocalStorage = (key: string) => { + try { + return localStorage.getItem(key); + } catch (error) { + return ''; + } +}; + +const setLocalStorage = (key: string, value: string) => { + try { + localStorage.setItem(key, value); + return true; + } catch (error) { + return false; + } +}; + +const removeFromLocalStorage = (key: string) => { + try { + localStorage.removeItem(key); + return true; + } catch (error) { + return false; + } +}; + +export { getFromLocalStorage, setLocalStorage, removeFromLocalStorage }; diff --git a/src/services/token.ts b/src/services/token.ts new file mode 100644 index 0000000..570057e --- /dev/null +++ b/src/services/token.ts @@ -0,0 +1,21 @@ +import { + getFromLocalStorage, + removeFromLocalStorage, + setLocalStorage, +} from '@src/services/storage'; + +const REACT_TOKEN = 'react-token'; + +const getToken = (): string => { + return getFromLocalStorage(REACT_TOKEN) || ''; +}; + +const setToken = (token: string): void => { + setLocalStorage(REACT_TOKEN, token); +}; + +const removeToken = (): void => { + removeFromLocalStorage(REACT_TOKEN); +}; + +export { setToken, getToken, removeToken };