Move provider file to utils

This commit is contained in:
Takeshi Kimata
2024-05-26 20:58:14 +09:00
parent a573358a85
commit ff2d3a88e5
9 changed files with 8 additions and 9 deletions

View File

@@ -2,7 +2,7 @@
import { Button, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem } from '@nextui-org/react';
import { User, ChevronDown, PenTool, ArrowRightFromLine, ArrowRightToLine } from 'lucide-react';
import { useContext } from 'react';
import { TokenContext } from './TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import { useRouter } from '@/src/navigation';
import { AccountDropDownMessages } from '@/types/user';
import Avatar from 'boring-avatars';

View File

@@ -1,6 +1,6 @@
'use client';
import { useState, useContext } from 'react';
import { TokenContext } from './TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import { Link } from '@/src/navigation';
import Image from 'next/image';
import {

View File

@@ -1,115 +0,0 @@
'use client';
import { createContext, useState, useEffect } from 'react';
import { TokenContextType, TokenType } from '@/types/user';
import { TokenProps } from '@/types/user';
import { useRouter, usePathname } from '@/src/navigation';
import { roles } from '@/config/selection';
const LOCAL_STORAGE_KEY = 'testplat-auth-token';
function storeTokenToLocalStorage(token: TokenType) {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(token));
}
function removeTokenFromLocalStorage() {
localStorage.removeItem(LOCAL_STORAGE_KEY);
}
const defaultContext = {
token: {
access_token: '',
user: null,
},
isSignedIn: () => false,
isAdmin: () => false,
setToken: (token: TokenType) => {},
storeTokenToLocalStorage,
removeTokenFromLocalStorage,
};
const TokenContext = createContext<TokenContextType>(defaultContext);
const TokenProvider = ({ locale, children }: TokenProps) => {
const router = useRouter();
const pathname = usePathname();
const [hasRestoreFinished, setHasRestoreFinished] = useState(false);
const [token, setToken] = useState<TokenType>({
access_token: '',
expires_at: 0,
user: null,
});
const isSignedIn = () => {
// check token
if (token && token.user && token.user.username) {
// check expire date
if (Date.now() < token.expires_at) {
return true;
} else {
console.error('session expired');
}
}
return false;
};
const isAdmin = () => {
// check token
if (token && token.user && token.user.username) {
// check expire date
if (Date.now() < token.expires_at) {
// check role
const adminRoleIndex = roles.findIndex((entry) => entry.uid === 'administrator');
if (token.user.role === adminRoleIndex) {
return true;
}
}
}
return false;
};
const tokenContext = {
token,
isSignedIn,
isAdmin,
setToken,
storeTokenToLocalStorage,
removeTokenFromLocalStorage,
};
const restoreTokenFromLocalStorage = () => {
const tokenString = localStorage.getItem(LOCAL_STORAGE_KEY);
if (tokenString) {
const restoredToken = JSON.parse(tokenString);
setToken(restoredToken);
}
setHasRestoreFinished(true);
};
useEffect(() => {
restoreTokenFromLocalStorage();
}, []);
useEffect(() => {
// check current path is private. pravate path is '/account' or '/projects/*'
const isPrivatePath = (pathname: string) => {
return /^\/account(\/)?$/.test(pathname) || /^\/projects(\/)?$/.test(pathname);
};
const checkSignInPage = () => {
if (!hasRestoreFinished) {
return;
}
if (isPrivatePath(pathname) && !isSignedIn()) {
router.push(`/account/signin`, { locale: locale });
}
};
checkSignInPage();
}, [pathname, hasRestoreFinished]);
return <TokenContext.Provider value={tokenContext}>{children}</TokenContext.Provider>;
};
export { TokenContext };
export default TokenProvider;

View File

@@ -1,7 +1,7 @@
'use client';
import { useContext } from 'react';
import { Card, CardHeader, CardBody, Divider } from '@nextui-org/react';
import { TokenContext } from '../TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import Avatar from 'boring-avatars';
type AccountPageMessages = {

View File

@@ -8,7 +8,7 @@ import { UserType, AuthMessages } from '@/types/user';
import { roles } from '@/config/selection';
import { signUp, signIn, signInAsGuest } from './authControl';
import { isValidEmail, isValidPassword } from './validate';
import { TokenContext } from '../TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import { useRouter } from '@/src/navigation';
type Props = {

View File

@@ -2,7 +2,7 @@
import React from 'react';
import { useState, useEffect, useContext } from 'react';
import { UserType, AdminMessages } from '@/types/user';
import { TokenContext } from '../TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import UsersTable from './UsersTable';
import Config from '@/config/config';
const apiServer = Config.apiServer;

View File

@@ -2,7 +2,7 @@
import { useEffect, useState, useContext } from 'react';
import { Button } from '@nextui-org/react';
import { Plus } from 'lucide-react';
import { TokenContext } from '@/src/app/[locale]/TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import { ProjectType, ProjectsMessages } from '@/types/project';
import ProjectsTable from './ProjectsTable';
import ProjectDialog from './ProjectDialog';

View File

@@ -6,7 +6,7 @@ import { Folder, Clipboard, FlaskConical } from 'lucide-react';
import { CaseTypeCountType, CasePriorityCountType } from '@/types/case';
import { ProgressSeriesType } from '@/types/run';
import { HomeMessages } from './page';
import { TokenContext } from '@/src/app/[locale]/TokenProvider';
import { TokenContext } from '@/utils/TokenProvider';
import { aggregateBasicInfo, aggregateTestPriority, aggregateTestType, aggregateProgress } from './aggregate';
import TestTypesChart from './TestTypesDonutChart';
import TestPriorityChart from './TestPriorityDonutChart';

View File

@@ -5,8 +5,7 @@ import { NextUIProvider } from '@nextui-org/react';
import { useRouter } from 'next/navigation';
import { ThemeProvider as NextThemesProvider } from 'next-themes';
import { ThemeProviderProps } from 'next-themes/dist/types';
import TokenProvider from './TokenProvider';
import TokenProvider from '@/utils/TokenProvider';
import { TokenProps } from '@/types/user';
export interface ProvidersProps {