import { Box, Button, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Popover, PopoverAnchor, PopoverTrigger, Tooltip, useColorModeValue, useDisclosure, } from "@chakra-ui/react"; import { AlertCircle } from "lucide-react"; import { useState } from "react"; import { get, post } from "src/lib/api"; import { colors } from "src/styles/Theme/colors"; import { Message } from "src/types/Conversation"; import useSWRImmutable from "swr/immutable"; import useSWRMutation from "swr/mutation"; import { LabelInputGroup } from "./Survey/LabelInputGroup"; interface Label { name: string; display_text: string; help_text: string; } interface FlaggableElementProps { children: React.ReactNode; message: Message; } interface ValidLabelsResponse { valid_labels: Label[]; } export const FlaggableElement = (props: FlaggableElementProps) => { const { data: response } = useSWRImmutable("/api/valid_labels", get); const { isOpen, onOpen, onClose } = useDisclosure(); const { valid_labels } = response || { valid_labels: [] }; const [values, setValues] = useState([]); const submittable = values.some((value) => { return value !== null; }) && values.length === valid_labels.length && valid_labels.length > 0; const { trigger } = useSWRMutation("/api/set_label", post, { onSuccess: onClose, onError: onClose, }); const submitResponse = () => { const label_map: Map = new Map(); console.assert(valid_labels.length === values.length); values.forEach((value, idx) => { if (value !== null) { label_map.set(valid_labels[idx].name, value); } }); trigger({ message_id: props.message.id, label_map: Object.fromEntries(label_map), text: props.message.text, }); }; return ( {props.children} Select one or more labels that apply. name)} onChange={setValues} /> ); };