import { Box, Grid2 as Grid, IconButton, TextareaAutosize, Theme, Typography, useTheme } from "@mui/material"; import { useGlobalState, useNoteAPI, useSnackbar } from "providers"; import React, { useState } from "react"; import { Note } from "models"; import { pond } from "protobuf-ts/pond"; import { makeStyles } from "@mui/styles"; import { ArrowUpward } from "@mui/icons-material"; const useStyles = makeStyles((theme: Theme) => ({ textAreaBox: { width: "100%", padding: theme.spacing(1.5), paddingTop: theme.spacing(0.75), }, textAreaClass: { resize: "none", padding: theme.spacing(2), paddingRight: theme.spacing(7), backgroundColor: theme.palette.background.paper, borderColor: theme.palette.background.default, color: theme.palette.text.primary, borderRadius: "5px", width: "100%", fontFamily: theme.typography.fontFamily, fontSize: theme.typography.body2.fontSize, '&:focus': { outline: "none", boxShadow: "none", borderColor: "ActiveBorder", } } })) interface Props { parent: string; newNoteMethod: (note: Note) => void; parentType: string; // the object type the note is for ie "bin", "team" etc. type?: pond.NoteType; } /** * renders the text area to enter you message and the button to submit it * @returns text area to enter your message */ export default function ChatInput(props: Props) { const [message, setMessage] = useState(""); const classes = useStyles(); const { parent, type, parentType } = props; const [{ user }] = useGlobalState(); const noteAPI = useNoteAPI(); const { openSnack } = useSnackbar(); const [shift, setShift] = useState(false); const theme = useTheme(); // const [uploadedFiles, setUploadedFiles] = useState>(new Map()); const clearEntry = () => { setMessage(""); }; const onKeyDown = (event: any) => { if (event.key === "Shift") { setShift(true); } if (event.key === "Enter" && !shift) { event.preventDefault(); } }; const onKeyUp = (event: any) => { if (event.key === "Shift") { setShift(false); } if (event.key === "Enter" && !shift) { validateMessage(); } }; const validateMessage = () => { let valid = false; let i = 0; while (!valid && i < message.length) { if (message[i] !== " " && message[i] !== "\n" && message[i] !== undefined) { valid = true; } i++; } valid ? submit() : openSnack("Invalid Message"); clearEntry(); // setUploadedFiles(new Map()); }; const submit = () => { if (message !== "" && message !== "\n") { let newNote = Note.create(); newNote.settings.objectKey = parent; newNote.settings.userId = user.id(); if (type) { newNote.settings.objectType = type; } newNote.settings.timestamp = Date.now(); newNote.settings.content = message; noteAPI .addNote(newNote.settings, undefined, [parent], [parentType]) .then(resp => { newNote.settings.key = resp.data.note props.newNoteMethod(newNote); openSnack("Message Sent"); }) .catch(_err => { console.error(_err) openSnack("Message Failed to send"); }); } clearEntry(); }; const getPlaceholder = () => { if (type === pond.NoteType.NOTE_TYPE_TEAM) return "Message team..." return "Type to chat..." } return ( setMessage(e.target.value)} onKeyDown={onKeyDown} onKeyUp={onKeyUp} placeholder={getPlaceholder()} /> {/* {Array.from(uploadedFiles.values()).toString()} */} ); }