import * as React from 'react'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import Modal from '@mui/material/Modal'; import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import FormControl from '@mui/material/FormControl'; import Select, { SelectChangeEvent } from '@mui/material/Select'; import TextField from '@mui/material/TextField'; import Checkbox from '@mui/material/Checkbox'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import type { IpcRendererEvent } from 'electron' import Snackbar from '@mui/material/Snackbar'; import Alert from '@mui/material/Alert'; import IconButton from '@mui/material/IconButton'; import CloseIcon from '@mui/icons-material/Close'; import './InitModal.css'; import { useTranslation } from 'react-i18next'; const { ipcRenderer } = window.require('electron'); export default function InitModal() { const { t } = useTranslation('translation', { keyPrefix: 'initModal' }); const [loadingBecauseItsSettingUp, setLoadingBecauseItsSettingUp] = React.useState(false); const [open, setOpen] = React.useState(false); const handleOpen = () => setOpen(true); const handleClose = () => { if (loadingBecauseItsSettingUp) return; setOpen(false) } const [chosenTemplate, setChosenTemplate] = React.useState(''); const handleTemplateChange = (event: SelectChangeEvent) => { setChosenTemplate(event.target.value); }; const [installPackages, setInstallPackages] = React.useState(true); const handlePackagesChange = (event: React.ChangeEvent) => { setInstallPackages(event.target.checked); }; const [chosenPackageManager, setChosenPackageManager] = React.useState(''); const handlePackageManagerChange = (event: SelectChangeEvent) => { setChosenPackageManager(event.target.value); }; const [templates, setTemplates] = React.useState>([]); React.useEffect(() => { fetch('https://raw.githubusercontent.com/sern-handler/create-bot/main/metadata/templateChoices.json') .then((res) => res.json()) .then((data) => { setTemplates(data as TemplateList[]); }) .catch((err) => { console.log(err.message); }); }, []); if (templates.length === 0) { setTemplates([{ title: t('couldntFetchTemplates'), value: 'error' }]); } const [selectedPath, setSelectedPath] = React.useState(''); const handleChooseDirButton = () => { ipcRenderer.send('openFolder'); }; const [projectName, setProjectName] = React.useState(''); const handleProjectNameChange = (event: React.ChangeEvent) => { setProjectName(event.target.value); }; React.useEffect(() => { ipcRenderer.on('folderData', handleFolderData); return () => { ipcRenderer.removeListener('folderData', handleFolderData); }; }, []); const handleFolderData = (_event: IpcRendererEvent, paths: string[]) => { const selectedPath = paths && paths.length > 0 ? paths[0] : ''; setSelectedPath(selectedPath); }; const [logFileName, setLogFileName] = React.useState('') const handleOpenLogFile = () => { ipcRenderer.send('openTxtFile', logFileName); ipcRenderer.on('openTxtFile', (_event, _args) => { ipcRenderer.removeAllListeners('openTxtFile'); }); } const [successSnackbarOpen, setSuccessSnackbarOpen] = React.useState(false) const handleSuccessSnackbarClose = () => setSuccessSnackbarOpen(false); const [errorSnackbarOpen, setErrorSnackbarOpen] = React.useState(false) const handleErrorSnackbarClose = () => setErrorSnackbarOpen(false); const snackbarAction = ( ); const [loading, setLoading] = React.useState(false); const isFormValid = () => { return projectName !== '' && selectedPath !== ''; }; const handleSubmit = () => { if (!isFormValid()) { return; } const data = { projectName, chosenTemplate, installPackages, chosenPackageManager, selectedPath, }; setLoading(true); setLoadingBecauseItsSettingUp(true) ipcRenderer.send('submitForm', data); ipcRenderer.on('submitForm', (_event, args: IPCCommandExitEvent) => { setLoading(false); setLoadingBecauseItsSettingUp(false); handleClose(); setLogFileName(args.logFileName) if (args.exitCode === 0) { setSuccessSnackbarOpen(true) } else { setErrorSnackbarOpen(true) } ipcRenderer.removeAllListeners('submitForm'); }); } return (
~$ sern init
{t('selectTemplate')}
} label={t('installPackagesCheckbox')} /> {t('selectPackageManager')}
{selectedPath ? `${t('selectedDirectory')} ${selectedPath}` : ''}
{t('commandSuccessful')} {t('commandFailed')}
); } interface TemplateList { title: string value: string } interface IPCCommandExitEvent { exitCode: number | null logFileName: string }