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 { GlobalHotKeys, KeyMap } from "react-hotkeys"; 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 () => { // make sure link, room, and type are selected if (!roomName) { toast.error("Please fill in room link and name."); return; } if (!roomLink && !hasGSuite) { toast.error("must provide room link if you don't have a GSuite"); return; } try { const newRoom = new Room(); if (roomAttachment) { newRoom.attachments = [roomAttachment]; } if (hasGSuite) { // create google meet link based on the room name without spaces var slugName = user.firstName + "-" + "room" + moment(new Date()).format("dddddohmma"); slugName = slugName.replace(/\s/g, "-"); const autoLink = "https://accounts.google.com/AccountChooser/signinchooser?continue=https://g.co/meet/" + slugName; newRoom.link = autoLink; } else { newRoom.link = roomLink; } 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 = []; // 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.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; toast.success("updated room"); } else { toast.success("created room"); } console.log(newRoom); handleModalType(ShowModalType.na); await roomService.createOrUpdateRoom(newRoom); resetForm(); } catch (error) { toast.error("problem creating/updating room"); console.log(error); } }; function resetForm() { setRoomLink(""); setRoomName( user.firstName + "'s Room - " + moment(new Date()).format("dddd do h:mm a") ); setRoomDescription(""); setMembersSelected([currUser.uid] as string[]); setRoomAttachment(""); setRoomAppxDateTime(""); setRoomType(RoomType.now); setDateTimePicker(null); setShowMoreDetails(false); sethasGSuite(true); } const [roomLink, setRoomLink] = useState(pastedLink ?? ""); const [roomName, setRoomName] = useState( user.firstName + "'s Room - " + moment(new Date()).format("dddd do h:mm a") ); 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); const [hasGSuite, sethasGSuite] = useState(true); 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 ( ); }; async function createRoomNow() { console.log("creating room"); // reset form for the right values to be in there resetForm(); // submit form // handleSubmit().then((res) => console.log(res)); const newRoom = new Room(); // create google meet link based on the room name without spaces var slugName = user.firstName + "-" + "room" + moment(new Date()).format("dddddohmma"); slugName = slugName.replace(/\s/g, "-"); const autoLink = "https://accounts.google.com/AccountChooser/signinchooser?continue=https://g.co/meet/" + slugName; newRoom.link = autoLink; newRoom.status = RoomStatus.empty; newRoom.membersInRoom = []; newRoom.approximateDateTime = null; newRoom.members = [currUser.uid]; // add currUser to the list of "people" newRoom.type = RoomType.now; newRoom.name = roomName; newRoom.createdByUserId = currUser.uid; newRoom.teamId = team.id; console.log(newRoom); handleModalType(ShowModalType.na); await roomService.createOrUpdateRoom(newRoom); resetForm(); toast.success("created room"); } const keyMap: KeyMap = { CREATE_ROOM_NOW: { name: "create room now", sequence: "q", action: "keyup", }, }; const handlers = { CREATE_ROOM_NOW: createRoomNow, }; return ( <>
{hasGSuite ? ( Link We'll create a link for you. Don't have a GSuite?{" "} ) : ( 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