import { useForm } from '@inertiajs/react'; import classNames from 'classnames'; import React, { useState } from 'react'; import useRoute from '@/Hooks/useRoute'; import ActionMessage from '@/Components/ActionMessage'; import ActionSection from '@/Components/ActionSection'; import Checkbox from '@/Components/Checkbox'; import ConfirmationModal from '@/Components/ConfirmationModal'; import DangerButton from '@/Components/DangerButton'; import DialogModal from '@/Components/DialogModal'; import FormSection from '@/Components/FormSection'; import InputError from '@/Components/InputError'; import InputLabel from '@/Components/InputLabel'; import PrimaryButton from '@/Components/PrimaryButton'; import TextInput from '@/Components/TextInput'; import SecondaryButton from '@/Components/SecondaryButton'; import SectionBorder from '@/Components/SectionBorder'; import { ApiToken } from '@/types'; import useTypedPage from '@/Hooks/useTypedPage'; interface Props { tokens: ApiToken[]; availablePermissions: string[]; defaultPermissions: string[]; } export default function APITokenManager({ tokens, availablePermissions, defaultPermissions, }: Props) { const route = useRoute(); const createApiTokenForm = useForm({ name: '', permissions: defaultPermissions, }); const updateApiTokenForm = useForm({ permissions: [] as string[], }); const deleteApiTokenForm = useForm({}); const [displayingToken, setDisplayingToken] = useState(false); const [managingPermissionsFor, setManagingPermissionsFor] = useState(null); const [apiTokenBeingDeleted, setApiTokenBeingDeleted] = useState(null); const page = useTypedPage(); function createApiToken() { createApiTokenForm.post(route('api-tokens.store'), { preserveScroll: true, onSuccess: () => { setDisplayingToken(true); createApiTokenForm.reset(); }, }); } function manageApiTokenPermissions(token: ApiToken) { updateApiTokenForm.setData('permissions', token.abilities); setManagingPermissionsFor(token); } function updateApiToken() { if (!managingPermissionsFor) { return; } updateApiTokenForm.put( route('api-tokens.update', [managingPermissionsFor]), { preserveScroll: true, preserveState: true, onSuccess: () => setManagingPermissionsFor(null), }, ); } function confirmApiTokenDeletion(token: ApiToken) { setApiTokenBeingDeleted(token); } function deleteApiToken() { if (!apiTokenBeingDeleted) { return; } deleteApiTokenForm.delete( route('api-tokens.destroy', [apiTokenBeingDeleted]), { preserveScroll: true, preserveState: true, onSuccess: () => setApiTokenBeingDeleted(null), }, ); } return (
{/* */} ( <> Created. Create )} > {/* */}
Name createApiTokenForm.setData('name', e.currentTarget.value) } autoFocus />
{/* */} {availablePermissions.length > 0 && (
Permissions
{availablePermissions.map(permission => (
))}
)}
{tokens.length > 0 ? (
{/* */}
{/* */}
{tokens.map(token => (
{token.name}
{token.last_used_ago && (
Last used {token.last_used_ago}
)} {availablePermissions.length > 0 ? ( manageApiTokenPermissions(token)} > Permissions ) : null} confirmApiTokenDeletion(token)} > Delete
))}
) : null} {/* */} setDisplayingToken(false)} >
Please copy your new API token. For your security, it won't be shown again.
{page.props?.jetstream?.flash?.token}
setDisplayingToken(false)}> Close
{/* */} setManagingPermissionsFor(null)} >
{availablePermissions.map(permission => (
))}
setManagingPermissionsFor(null)}> Cancel Save
{/* */} setApiTokenBeingDeleted(null)} > Are you sure you would like to delete this API token? setApiTokenBeingDeleted(null)}> Cancel Delete
); }