import { DatePicker, Divider, Modal, Radio, Select, Switch, TimePicker, Tooltip, } from "antd"; import { Timestamp } from "firebase/firestore"; import moment from "moment"; import React, { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { useAuth } from "../../contexts/authContext"; import { ShowModalType, useKeyboardContext, } from "../../contexts/keyboardContext"; import { useTeamDashboardContext } from "../../contexts/teamDashboardContext"; import Room, { RoomStatus, RoomType } from "../../models/room"; import { User } from "../../models/user"; import RoomService from "../../services/roomService"; const { Option } = Select; const roomService = new RoomService(); interface IModalProps { show: boolean; updateRoom: Room; handleClose: Function; } export default function CreateOrUpdateRoomModal(props: IModalProps) { const { currUser } = useAuth(); const { teamUsers, team, user } = useTeamDashboardContext(); const { pastedLink, handleModalType, showModalType } = useKeyboardContext(); // handle when we want to update a room and props changes // prefill with existing stuff useEffect(() => { console.log("change in props"); if (props.updateRoom) { setRoomLink(props.updateRoom.link); setRoomName(props.updateRoom.name); setRoomDescription(props.updateRoom.description); if (props.updateRoom.attachments && props.updateRoom.attachments[0]) { setRoomAttachment(props.updateRoom.attachments[0]); } setMembersSelected(props.updateRoom.members); setRoomType(props.updateRoom.type); setRoomAppxDateTime(props.updateRoom.approximateDateTime); if (props.updateRoom.scheduledDateTime) { const convertedToMoment = moment( props.updateRoom.scheduledDateTime.toDate() ); setDateTimePicker(convertedToMoment); } } else { // update state when user does ctrl + v resetForm(); } }, [props.updateRoom]); // update state when user does ctrl + v useEffect(() => { // todo: check if link is valid google meet link? again? console.log("updated link!!!!!"); setRoomLink(pastedLink); }, [pastedLink]); const handleCloseModal = () => { resetForm(); props.handleClose(); }; const handleSubmit = async (e) => { e.preventDefault(); // make sure link, room, and type are selected if (!roomLink || !roomName) { toast.error("Please fill in room link and name."); return; } try { const newRoom = new Room(); if (roomAttachment) { newRoom.attachments = [roomAttachment]; } if (roomType == RoomType.now) { // make sure approximate time isn't selected newRoom.approximateDateTime = null; newRoom.status = RoomStatus.live; // automatically add me to the room newRoom.membersInRoom = [currUser.uid]; // navigate to the new room automatically window.open(roomLink, "_blank"); } else if (roomType == RoomType.scheduled) { // make sure that either appx or time picker is selected, not both if (!dateTimePicker) { toast.error("Please select a date and time!"); return; } newRoom.approximateDateTime = null; newRoom.scheduledDateTime = Timestamp.fromDate(dateTimePicker.toDate()); } else if (roomType == RoomType.recurring) { // clear the field for the time picker if they ever selected that newRoom.scheduledDateTime = null; newRoom.approximateDateTime = roomAppxDateTime; } newRoom.link = roomLink; newRoom.members = [...membersSelected]; // add currUser to the list of "people" newRoom.type = roomType; newRoom.description = roomDescription; newRoom.name = roomName; newRoom.createdByUserId = currUser.uid; newRoom.teamId = team.id; if (props.updateRoom) { newRoom.id = props.updateRoom.id; newRoom.membersInRoom = props.updateRoom.membersInRoom; } console.log(newRoom); handleModalType(ShowModalType.na); await roomService.createOrUpdateRoom(newRoom); resetForm(); toast.success("done"); } catch (error) { toast.error("problem creating room"); console.log(error); } }; function resetForm() { setRoomLink(""); setRoomName(""); setRoomDescription(""); setMembersSelected([currUser.uid] as string[]); setRoomAttachment(""); setRoomAppxDateTime(""); setRoomType(RoomType.now); setDateTimePicker(null); setShowMoreDetails(false); } const [roomLink, setRoomLink] = useState(pastedLink ?? ""); const [roomName, setRoomName] = useState(""); const [roomDescription, setRoomDescription] = useState(""); const [roomAttachment, setRoomAttachment] = useState(""); const [membersSelected, setMembersSelected] = useState([ currUser.uid, ]); const [roomType, setRoomType] = useState(RoomType.now); const [roomAppxDateTime, setRoomAppxDateTime] = useState(""); // for certain room types const [dateTimePicker, setDateTimePicker] = useState(null); const [showMoreDetails, setShowMoreDetails] = useState(false); function handleSelectMember(value) { // passed in array of selections...userIds setMembersSelected(value); console.log(value); } function handleDateTimePickerChange(time) { console.log(time); setRoomAppxDateTime(""); setDateTimePicker(time); } const allUsersForSelection: User[] = [...teamUsers, user]; const MemberSelection = () => { return ( ); }; return (
Link {roomLink ? ( Please make sure this is valid so that your team can join properly. ) : ( Click here to create one {" "} and then come back and paste the link for your team. )} setRoomLink(e.target.value)} /> Room Name Be specific enough, everyone down the hall will see this. setRoomName(e.target.value)} /> {/* room type selection */} Type setRoomType(event.target.value)} > {RoomType.now} {RoomType.scheduled} {RoomType.recurring} {roomType == RoomType.recurring ? ( Approximate Slot Sometimes you don't have a specific time or want to propose a rough period. setRoomAppxDateTime(e.target.value)} /> ) : ( <> )} {roomType == RoomType.scheduled ? ( Specific Time {/* */} ) : ( <> )} {/* people selection */} People {/* team or personal */} Visible} unCheckedChildren={Private} /> Team sees this room. Optional - Add any mandatory attendees you want or just tell them later. {MemberSelection()} {showMoreDetails ? ( <> Agenda Optional