import React, {ChangeEvent, useEffect, useRef, useState} from 'react'; import Grid from '@mui/material/Grid'; import IconButton from '@mui/material/IconButton'; import Paper from '@mui/material/Paper'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Delete from '@mui/icons-material/Delete'; import Edit from '@mui/icons-material/Edit'; import CloudUpload from '@mui/icons-material/CloudUpload'; import Button from '@mui/material/Button'; import ConfirmDialog from '../common/ConfirmDialog'; import DefaultPage from '../common/DefaultPage'; import CopyableSecret from '../common/CopyableSecret'; import {AddApplicationDialog} from './AddApplicationDialog'; import * as config from '../config'; import {UpdateApplicationDialog} from './UpdateApplicationDialog'; import {IApplication} from '../types'; import {LastUsedCell} from '../common/LastUsedCell'; import {useStores} from '../stores'; import {observer} from 'mobx-react-lite'; const Applications = observer(() => { const {appStore} = useStores(); const apps = appStore.getItems(); const [toDeleteApp, setToDeleteApp] = useState(); const [toUpdateApp, setToUpdateApp] = useState(); const [createDialog, setCreateDialog] = useState(false); const fileInputRef = useRef(null); const uploadId = useRef(-1); useEffect(() => void appStore.refresh(), []); const handleImageUploadClick = (id: number) => { uploadId.current = id; if (fileInputRef.current) { fileInputRef.current.click(); } }; const onUploadImage = (e: ChangeEvent) => { const file = e.target.files?.[0]; if (!file) { return; } if (['image/png', 'image/jpeg', 'image/gif'].indexOf(file.type) !== -1) { appStore.uploadImage(uploadId.current, file); } else { alert('Uploaded file must be of type png, jpeg or gif.'); } }; return ( setCreateDialog(true)}> Create Application } maxWidth={1000}> Name Token Description Priority Last Used {apps.map((app: IApplication) => ( handleImageUploadClick(app.id)} fDelete={() => setToDeleteApp(app)} fEdit={() => setToUpdateApp(app)} noDelete={app.internal} /> ))}
{createDialog && ( setCreateDialog(false)} fOnSubmit={appStore.create} /> )} {toUpdateApp != null && ( setToUpdateApp(undefined)} fOnSubmit={(name, description, defaultPriority) => appStore.update(toUpdateApp.id, name, description, defaultPriority) } initialDescription={toUpdateApp?.description} initialName={toUpdateApp?.name} initialDefaultPriority={toUpdateApp?.defaultPriority} /> )} {toDeleteApp != null && ( setToDeleteApp(undefined)} fOnSubmit={() => appStore.remove(toDeleteApp.id)} /> )}
); }); interface IRowProps { name: string; value: string; noDelete: boolean; description: string; defaultPriority: number; lastUsed: string | null; fUpload: VoidFunction; image: string; fDelete: VoidFunction; fEdit: VoidFunction; } const Row = ({ name, value, noDelete, description, defaultPriority, lastUsed, fDelete, fUpload, image, fEdit, }: IRowProps) => { return (
app logo
{name} {description} {defaultPriority}
); }; export default Applications;