//Lib import { toast } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import classes from '../UserSettings.module.css'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { SpinnerDotted } from 'spinners-react'; import { v4 as uuidv4 } from 'uuid'; import timestampConverter from '../../../helpers/functions/timestampConverter'; import { IconTrash, IconExternalLink } from '@tabler/icons-react'; import Link from 'next/link'; //Components import Error from '../../../Components/UI/Error/Error'; import CopyButton from '../../../Components/UI/CopyButton/CopyButton'; import Info from '../../../Components/UI/Info/Info'; export default function Integrations() { //Var const toastOptions = { position: 'top-right', autoClose: 5000, hideProgressBar: false, closeOnClick: true, pauseOnHover: true, draggable: true, progress: undefined, }; const { register, handleSubmit, reset, formState: { errors, isSubmitting, isValid }, } = useForm({ mode: 'onChange' }); ////State const [isLoading, setIsLoading] = useState(false); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [tokenList, setTokenList] = useState([]); const [error, setError] = useState(); const [lastGeneratedToken, setLastGeneratedToken] = useState(); const [deletingToken, setDeletingToken] = useState(null); const [permissions, setPermissions] = useState({ create: false, read: false, update: false, delete: false, }); const fetchTokenList = async () => { try { const response = await fetch('/api/account/tokenManager', { method: 'GET', headers: { 'Content-type': 'application/json', }, }); const tokensArray = await response.json(); setTokenList(tokensArray); } catch (error) { console.log('Fetching token list failed.'); } }; ////LifeCycle useEffect(() => { fetchTokenList(); }, []); // Permissions handler const hasNoPermissionSelected = () => { return !Object.values(permissions).some((value) => value); }; const togglePermission = (permissionType) => { const updatedPermissions = { ...permissions, [permissionType]: !permissions[permissionType], }; setPermissions(updatedPermissions); }; const resetPermissions = () => { setPermissions({ create: false, read: false, update: false, delete: false, }); }; //Form submit Handler for ADD a new token const formSubmitHandler = async (data) => { //Remove old error setError(); //Loading button on submit to avoid multiple send. setIsLoading(true); //Generate a UUIDv4 const token = uuidv4(); setLastGeneratedToken({ name: data.tokenName, value: token }); // Post API to send the new token integration try { const response = await fetch('/api/account/tokenManager', { method: 'POST', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ name: data.tokenName, token: token, creation: Math.floor(Date.now() / 1000), expiration: null, permissions: permissions, }), }); const result = await response.json(); if (!response.ok) { setIsLoading(false); reset(); resetPermissions(); toast.error(result.message, toastOptions); setTimeout(() => setError(), 4000); } else { reset(); resetPermissions(); fetchTokenList(); setIsLoading(false); toast.success('🔑 Token generated !', toastOptions); } } catch (error) { reset(); resetPermissions(); setIsLoading(false); toast.error("Can't generate your token. Contact your administrator.", toastOptions); setTimeout(() => setError(), 4000); } }; //Delete token const deleteTokenHandler = async (tokenName) => { setIsDeleteLoading(true); try { const response = await fetch('/api/account/tokenManager', { method: 'DELETE', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ name: tokenName, }), }); const result = await response.json(); if (!response.ok) { toast.error(result.message, toastOptions); setTimeout(() => setError(), 4000); setIsDeleteLoading(false); } else { fetchTokenList(); setIsDeleteLoading(false); toast.success('🗑️ Token deleted !', toastOptions); } } catch (error) { setIsDeleteLoading(false); toast.error("Can't delete your token. Contact your administrator.", toastOptions); setTimeout(() => setError(), 4000); } finally { setIsDeleteLoading(false); setDeletingToken(null); } }; return ( <>
Created at: {timestampConverter(token.creation)}
Permission:
Token: