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 all 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
37 changes: 34 additions & 3 deletions examples/app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
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';
import ManageUsers from './ManageUsers';

const Layout = () => (
<div style={{ height: '100vh', position: 'relative' }}>
Expand All @@ -12,7 +14,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 +27,39 @@ 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="/user-management"
element={
<ProtectedRoute>
<ManageUsers />
</ProtectedRoute>
}
/>
<Route path="/login" element={<Login />} />
<Route path="/step-up" element={<StepUp />} />
</Route>
Expand Down
102 changes: 48 additions & 54 deletions examples/app/Home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@ 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';

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 +19,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>
<a href="/user-management">Manage Users</a>
</p>
<p>
{process.env.DESCOPE_STEP_UP_FLOW_ID && (
<Link id="step-up-button" to="/step-up">
Step Up
</Link>
)}
</p>
</div>

<div>
<p>
User:{' '}
<span style={{ fontWeight: 'bold' }}>
{getUserDisplayName(user)}
</span>
</p>
<p>
<button
type="button"
id="logout-button"
onClick={onLogout}
style={{
display: 'block',
marginLeft: 'auto',
padding: 5
}}
>
Logout
</button>
</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>
)}
</>
)}
<p>
Roles: <span style={{ fontWeight: 'bold' }}>{roles || 'No Roles'}</span>
</p>
</>
);
};
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
68 changes: 68 additions & 0 deletions examples/app/ManageUsers.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import type { UserResponse } from '@descope/web-js-sdk';
import React, { useCallback } from 'react';
import { Link } from 'react-router-dom';
import { useDescope, useUser, UserManagement } from '../../src';

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

const ManageUsers = () => {
// useUser retrieves the logged in user information
const { user } = useUser();
// useDescope retrieves Descope SDK for further operations related to authentication
// such as logout
const sdk = useDescope();

const onLogout = useCallback(() => {
sdk.logout();
}, [sdk]);

return (
<>
<header
style={{
borderBottom: '1px solid gray',
display: 'flex',
justifyContent: 'space-between'
}}
>
<p>
<a href="/">Home</a>
</p>
<div>
<p>
User:{' '}
<span style={{ fontWeight: 'bold' }}>
{getUserDisplayName(user)}
</span>
</p>
<p>
<button
type="button"
id="logout-button"
onClick={onLogout}
style={{
display: 'block',
marginLeft: '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>
<UserManagement tenant={process.env.DESCOPE_TENANT} />
</>
);
};

export default ManageUsers;
Loading
Loading