This commit is contained in:
beabigegg
2025-08-17 15:26:44 +08:00
commit 0fee703b84
60 changed files with 8042 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
import React, { useState } from 'react';
import {
Button, TextField, Dialog, DialogTitle, DialogContent, DialogActions,
CircularProgress, Alert
} from '@mui/material';
const NewMeetingDialog = ({ open, onClose, onCreate }) => {
const [topic, setTopic] = useState('');
const [meetingDate, setMeetingDate] = useState(new Date().toISOString().split('T')[0]); // Defaults to today
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
const handleCreate = async () => {
if (!topic || !meetingDate) {
setError('Both topic and date are required.');
return;
}
setError('');
setLoading(true);
try {
// The onCreate prop is expected to be an async function
// that returns the newly created meeting.
await onCreate(topic, meetingDate);
handleClose(); // Close the dialog on success
} catch (err) {
setError(err.message || 'Failed to create meeting.');
} finally {
setLoading(false);
}
};
const handleClose = () => {
if (loading) return; // Prevent closing while loading
setTopic('');
setMeetingDate(new Date().toISOString().split('T')[0]);
setError('');
onClose(); // Call the parent's onClose handler
};
return (
<Dialog open={open} onClose={handleClose} fullWidth maxWidth="xs">
<DialogTitle>Create a New Meeting</DialogTitle>
<DialogContent>
{error && <Alert severity="error" sx={{ mb: 2, mt: 1 }}>{error}</Alert>}
<TextField
autoFocus
margin="dense"
id="topic"
label="Meeting Topic"
type="text"
fullWidth
variant="standard"
value={topic}
onChange={(e) => setTopic(e.target.value)}
sx={{ mt: 2 }}
/>
<TextField
margin="dense"
id="meetingDate"
label="Meeting Date"
type="date"
fullWidth
variant="standard"
value={meetingDate}
onChange={(e) => setMeetingDate(e.target.value)}
InputLabelProps={{
shrink: true,
}}
sx={{ mt: 2 }}
/>
</DialogContent>
<DialogActions>
<Button onClick={handleClose} disabled={loading}>Cancel</Button>
<Button onClick={handleCreate} variant="contained" disabled={loading}>
{loading ? <CircularProgress size={24} /> : 'Create'}
</Button>
</DialogActions>
</Dialog>
);
};
export default NewMeetingDialog;