1
0
mirror of https://github.com/ellmau/adf-obdd.git synced 2025-12-20 09:39:38 +01:00

Show colored snackbars

This commit is contained in:
monsterkrampe 2023-04-03 18:48:16 +02:00
parent b7fd34ee48
commit da8e79147b
No known key found for this signature in database
GPG Key ID: B8ADC1F5A5CE5057

View File

@ -3,6 +3,7 @@ import React, {
} from 'react'; } from 'react';
import { import {
AlertColor,
Alert, Alert,
AppBar, AppBar,
Button, Button,
@ -25,7 +26,7 @@ enum UserFormType {
interface UserFormProps { interface UserFormProps {
formType: UserFormType | null; formType: UserFormType | null;
close: (message?: string) => void; close: (message?: string, severity?: AlertColor) => void;
username?: string; username?: string;
} }
@ -76,7 +77,7 @@ function UserForm({ username: propUsername, formType, close }: UserFormProps) {
.then((res) => { .then((res) => {
switch (res.status) { switch (res.status) {
case 200: case 200:
close(`Action '${formType}' successful!`); close(`Action '${formType}' successful!`, 'success');
break; break;
default: default:
setError(true); setError(true);
@ -89,22 +90,35 @@ function UserForm({ username: propUsername, formType, close }: UserFormProps) {
); );
return ( return (
<> <form onSubmit={(e) => { e.preventDefault(); submitHandler(false); }}>
<DialogTitle>{formType}</DialogTitle> <DialogTitle>{formType}</DialogTitle>
<DialogContent> <DialogContent>
<TextField variant="standard" type="text" label="Username" value={username} onChange={(event) => { setUsername(event.target.value); }} /> <TextField
variant="standard"
type="text"
label="Username"
value={username}
onChange={(event) => { setUsername(event.target.value); }}
/>
<br /> <br />
<TextField variant="standard" type="password" label="Password" value={password} onChange={(event) => { setPassword(event.target.value); }} /> <TextField
variant="standard"
type="password"
label="Password"
value={password}
onChange={(event) => { setPassword(event.target.value); }}
/>
{errorOccurred {errorOccurred
&& <Alert severity="error">Check your inputs!</Alert>} && <Alert severity="error">Check your inputs!</Alert>}
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button onClick={() => close()}>Cancel</Button> <Button type="button" onClick={() => close()}>Cancel</Button>
<Button onClick={() => submitHandler(false)}>{formType}</Button> <Button type="submit">{formType}</Button>
{formType === UserFormType.Update {formType === UserFormType.Update
// TODO: add another confirm dialog here // TODO: add another confirm dialog here
&& ( && (
<Button <Button
type="button"
variant="outlined" variant="outlined"
onClick={() => { onClick={() => {
// eslint-disable-next-line no-alert // eslint-disable-next-line no-alert
@ -117,7 +131,7 @@ function UserForm({ username: propUsername, formType, close }: UserFormProps) {
</Button> </Button>
)} )}
</DialogActions> </DialogActions>
</> </form>
); );
} }
@ -127,7 +141,10 @@ function Footer() {
const [username, setUsername] = useState<string>(); const [username, setUsername] = useState<string>();
const [tempUser, setTempUser] = useState<boolean>(); const [tempUser, setTempUser] = useState<boolean>();
const [dialogTypeOpen, setDialogTypeOpen] = useState<UserFormType | null>(null); const [dialogTypeOpen, setDialogTypeOpen] = useState<UserFormType | null>(null);
const [snackbarMessage, setSnackbarMessage] = useState<string | undefined>(); const [snackbarInfo, setSnackbarInfo] = useState<{
message: string,
severity: AlertColor,
} | undefined>();
const logout = useCallback(() => { const logout = useCallback(() => {
fetch(`${process.env.NODE_ENV === 'development' ? '//localhost:8080' : ''}/users/logout`, { fetch(`${process.env.NODE_ENV === 'development' ? '//localhost:8080' : ''}/users/logout`, {
@ -140,15 +157,15 @@ function Footer() {
.then((res) => { .then((res) => {
switch (res.status) { switch (res.status) {
case 200: case 200:
setSnackbarMessage('Logout successful!'); setSnackbarInfo({ message: 'Logout successful!', severity: 'success' });
setUsername(undefined); setUsername(undefined);
break; break;
default: default:
setSnackbarMessage('An error occurred while trying to log out.'); setSnackbarInfo({ message: 'An error occurred while trying to log out.', severity: 'error' });
break; break;
} }
}); });
}, [setSnackbarMessage]); }, [setSnackbarInfo]);
useEffect(() => { useEffect(() => {
// Intuition: If the dialog was just closed (or on first render). // Intuition: If the dialog was just closed (or on first render).
@ -203,16 +220,20 @@ function Footer() {
<Dialog open={!!dialogTypeOpen} onClose={() => setDialogTypeOpen(null)}> <Dialog open={!!dialogTypeOpen} onClose={() => setDialogTypeOpen(null)}>
<UserForm <UserForm
formType={dialogTypeOpen} formType={dialogTypeOpen}
close={(message) => { setDialogTypeOpen(null); setSnackbarMessage(message); }} close={(message, severity) => {
setDialogTypeOpen(null);
setSnackbarInfo((!!message && !!severity) ? { message, severity } : undefined);
}}
username={dialogTypeOpen === UserFormType.Update ? username : undefined} username={dialogTypeOpen === UserFormType.Update ? username : undefined}
/> />
</Dialog> </Dialog>
<Snackbar <Snackbar
open={!!snackbarMessage} open={!!snackbarInfo}
autoHideDuration={5000} autoHideDuration={10000}
message={snackbarMessage} onClose={() => setSnackbarInfo(undefined)}
onClose={() => setSnackbarMessage(undefined)} >
/> <Alert severity={snackbarInfo?.severity}>{snackbarInfo?.message}</Alert>
</Snackbar>
</> </>
); );
} }