Spaces:
Sleeping
Sleeping
| 'use client'; | |
| import { useState } from 'react'; | |
| import dynamic from 'next/dynamic'; | |
| import { Form, Input, Button, message } from 'antd'; | |
| const Modal = dynamic(() => import('antd/lib/modal'), { | |
| ssr: false | |
| }); | |
| interface CreateRoomModalProps { | |
| onClose: () => void; | |
| onSubmit: (data: { name: string; objective: string; participants: { id: string }[] }) => void; | |
| currentSecondMeId: string; | |
| } | |
| function CreateRoomModal({ onClose, onSubmit, currentSecondMeId }: CreateRoomModalProps) { | |
| const [form] = Form.useForm(); | |
| const [participants, setParticipants] = useState([{ id: currentSecondMeId }]); | |
| const handleSubmit = () => { | |
| if (participants.length < 2) { | |
| message.error('A room must have at least 2 participants.'); | |
| return; | |
| } | |
| // Verify all participants have valid URLs | |
| const invalidParticipants = participants.filter( | |
| (p) => !p.id.startsWith('https://secondme.com/') | |
| ); | |
| if (invalidParticipants.length > 0) { | |
| message.error('All participants must have valid SecondMe URLs (https://secondme.com/xxxxx)'); | |
| return; | |
| } | |
| form.validateFields().then((values) => { | |
| onSubmit({ | |
| name: values.name, | |
| objective: values.objective, | |
| participants | |
| }); | |
| }); | |
| }; | |
| const addParticipant = () => { | |
| setParticipants([...participants, { id: '' }]); | |
| }; | |
| const updateParticipant = (index: number, id: string) => { | |
| const newParticipants = [...participants]; | |
| newParticipants[index] = { id }; | |
| setParticipants(newParticipants); | |
| }; | |
| return ( | |
| <Modal | |
| footer={[ | |
| <Button key="cancel" onClick={onClose}> | |
| Cancel | |
| </Button>, | |
| <Button | |
| key="submit" | |
| disabled={participants.length < 2} | |
| onClick={handleSubmit} | |
| type="primary" | |
| > | |
| Create Room | |
| </Button> | |
| ]} | |
| onCancel={onClose} | |
| open={true} | |
| title="Create New Room" | |
| width={600} | |
| > | |
| <Form | |
| form={form} | |
| initialValues={{ | |
| name: '', | |
| description: '' | |
| }} | |
| layout="vertical" | |
| > | |
| <Form.Item | |
| label="Room Name" | |
| name="name" | |
| rules={[{ required: true, message: 'Please enter a room name' }]} | |
| > | |
| <Input placeholder="Enter room name" /> | |
| </Form.Item> | |
| <Form.Item | |
| label="Room Objective" | |
| name="objective" | |
| rules={[{ required: true, message: 'Please enter the room objective' }]} | |
| > | |
| <Input.TextArea placeholder="What do you want to achieve in this room?" rows={4} /> | |
| </Form.Item> | |
| <div className="mb-4"> | |
| <div className="flex justify-between items-center mb-2"> | |
| <div> | |
| <h4 className="text-base font-medium">Participants</h4> | |
| <p className="text-sm text-gray-500">At least 2 participants required</p> | |
| </div> | |
| <Button onClick={addParticipant} type="link"> | |
| Add Participant | |
| </Button> | |
| </div> | |
| {participants.map((participant, index) => ( | |
| <div key={index} className="mb-4 p-4 border border-gray-200 rounded-lg"> | |
| <div className="mb-3"> | |
| <label className="block text-sm font-medium text-gray-700 mb-1">SecondMe URL</label> | |
| <div className="text-xs text-gray-500 mb-2"> | |
| Enter the full URL of the SecondMe instance (e.g., https://secondme.com/23581) | |
| </div> | |
| <Input | |
| disabled={index === 0} | |
| onChange={(e) => updateParticipant(index, e.target.value)} | |
| placeholder="https://secondme.com/xxxxx" | |
| value={participant.id} | |
| /> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </Form> | |
| </Modal> | |
| ); | |
| } | |
| export default dynamic(() => Promise.resolve(CreateRoomModal), { | |
| ssr: false | |
| }); | |