Skip to content
This repository has been archived by the owner on Jul 11, 2024. It is now read-only.

added user-management-widget #458

Merged
merged 8 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions examples/app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import React from 'react';
import { Outlet, Route, Routes } from 'react-router-dom';
import { Outlet, Route, Routes, Navigate } from 'react-router-dom';
import Home from './Home';
import Login from './Login';
import StepUp from './StepUp';
import { useSession } from '../../src';

const Layout = () => (
<div style={{ height: '100vh', position: 'relative' }}>
Expand All @@ -12,7 +13,7 @@ const Layout = () => (
margin: 'auto',
border: '1px solid lightgray',
padding: 20,
maxWidth: '400px',
maxWidth: '600px',
boxShadow: '13px 13px 20px #cbced1, -13px -13px 20px #fff',
background: '#ecf0f3',
position: 'relative',
Expand All @@ -25,10 +26,31 @@ const Layout = () => (
</div>
);

const ProtectedRoute = ({ children }: { children: JSX.Element }) => {
const { isAuthenticated, isSessionLoading } = useSession();

if (isSessionLoading) {
return <div>Loading...</div>;
}

if (!isAuthenticated) {
return <Navigate to="/login" replace />;
}

return children;
};

const App = () => (
<Routes>
<Route element={<Layout />}>
<Route index element={<Home />} />
<Route
index
element={
<ProtectedRoute>
<Home />
</ProtectedRoute>
}
/>
<Route path="/login" element={<Login />} />
<Route path="/step-up" element={<StepUp />} />
</Route>
Expand Down
110 changes: 55 additions & 55 deletions examples/app/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import type { UserResponse } from '@descope/web-js-sdk';
import React, { useCallback, useMemo } from 'react';
import { Link } from 'react-router-dom';
import { getJwtRoles, useDescope, useSession, useUser } from '../../src';
import { fetchData } from './api';
import {
getJwtRoles,
useDescope,
useSession,
useUser,
UserManagement
} from '../../src';

const getUserDisplayName = (user?: UserResponse) =>
user?.name || user?.loginIds?.[0] || '';

const Home = () => {
// useSession retrieves authentication state, session loading status, and session token
const { isAuthenticated, isSessionLoading, sessionToken } = useSession();
const { sessionToken } = useSession();
// useUser retrieves the logged in user information
const { user } = useUser();
// useDescope retrieves Descope SDK for further operations related to authentication
Expand All @@ -20,65 +25,60 @@ const Home = () => {
sdk.logout();
}, [sdk]);

const onFetch = useCallback(async () => {
const data = await fetchData();
alert(data); // eslint-disable-line no-alert
}, []);
const roles = useMemo(
() => sessionToken && JSON.stringify(getJwtRoles(sessionToken) || []),
() => sessionToken && (getJwtRoles(sessionToken) || []).join(', '),
[sessionToken]
);

if (isSessionLoading) return <div>Loading...</div>;
return (
<>
<header
style={{
borderBottom: '1px solid gray',
display: 'flex',
justifyContent: 'space-between'
}}
>
<div>
<p>
User:{' '}
<span style={{ fontWeight: 'bold' }}>
{getUserDisplayName(user)}
</span>
</p>
<p>
{' '}
Roles:{' '}
<span style={{ fontWeight: 'bold' }}>{roles || 'No Roles'}</span>
</p>
</div>

<div>
<p>
<button
type="button"
id="logout-button"
onClick={onLogout}
style={{
display: 'block',
margin: 'auto',
padding: 5
}}
>
Logout
</button>
</p>
<p>
{process.env.DESCOPE_STEP_UP_FLOW_ID && (
<Link id="step-up-button" to="/step-up">
Step Up
</Link>
)}
</p>
</div>
</header>
<h2>Home</h2>
{!isAuthenticated && (
<Link id="login-button" to="/login">
Login
</Link>
)}
{isAuthenticated && (
<>
<div className="username"> Hello {getUserDisplayName(user)}!</div>
<div className="username"> Roles: {roles}</div>
<button
type="button"
id="logout-button"
onClick={onLogout}
style={{
display: 'block',
margin: 'auto',
background: 'none',
border: 'none',
color: 'blue',
padding: 5
}}
>
Logout
</button>
<button
type="button"
id="fetch-button"
onClick={onFetch}
style={{
display: 'block',
margin: 'auto',
background: 'none',
border: 'none',
color: 'blue',
padding: 5
}}
>
Fetch Fact
</button>
{process.env.DESCOPE_STEP_UP_FLOW_ID && (
<Link id="step-up-button" to="/step-up">
Step Up
</Link>
)}
</>
)}
<UserManagement tenant={process.env.DESCOPE_TENANT} />
</>
);
};
Expand Down
1 change: 1 addition & 0 deletions examples/app/Login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const Login = () => {
}
return (
<>
<h2>Login</h2>
<Descope
flowId={process.env.DESCOPE_FLOW_ID || 'sign-up-or-in'}
onSuccess={onSuccess}
Expand Down
Loading
Loading