import { Button, Checkbox, Flex, Grid, Popover, PopoverAnchor, PopoverArrow, PopoverBody, PopoverCloseButton, PopoverContent, PopoverTrigger, Slider, SliderFilledTrack, SliderThumb, SliderTrack, Spacer, Tooltip, useBoolean, useColorMode, useColorModeValue, useId, } from "@chakra-ui/react"; import { FlagIcon, QuestionMarkCircleIcon } from "@heroicons/react/20/solid"; import { useEffect, useState } from "react"; import fetcher from "src/lib/fetcher"; import poster from "src/lib/poster"; import { colors } from "styles/Theme/colors"; import useSWR from "swr"; import useSWRMutation from "swr/mutation"; interface textFlagLabels { attributeName: string; labelText: string; additionalExplanation?: string; } export const FlaggableElement = (props) => { const [labels, setLabels] = useState([]); const [checkboxValues, setCheckboxValues] = useState([]); const [sliderValues, setSliderValues] = useState([]); const [isEditing, setIsEditing] = useBoolean(); const backgroundColor = useColorModeValue("gray.200", "gray.700"); const { data, isLoading } = useSWR("/api/valid_labels", fetcher); useEffect(() => { if (isLoading) { return; } const { valid_labels } = data; const newLabels = valid_labels.map((valid_label) => ({ attributeName: valid_label.name, labelText: valid_label.display_text, additionalExplanation: valid_label.help_text, })); setSliderValues(new Array(newLabels.length).fill(1)); setCheckboxValues(new Array(newLabels.length).fill(false)); setLabels(newLabels); }, [data, isLoading]); const { trigger } = useSWRMutation("/api/set_label", poster, { onSuccess: () => { setIsEditing.off(); }, }); const submitResponse = () => { const label_map: Map = new Map(); labels.forEach((flag, i) => { if (checkboxValues[i]) { label_map.set(flag.attributeName, sliderValues[i]); } }); trigger({ message_id: props.message_id, post_id: props.post_id, label_map: Object.fromEntries(label_map), text: props.text, }); }; const handleCheckboxState = (isChecked, idx) => { setCheckboxValues( checkboxValues.map((val, i) => { return i === idx ? isChecked : val; }) ); }; const handleSliderState = (newVal, idx) => { setSliderValues( sliderValues.map((val, i) => { return i === idx ? newVal : val; }) ); }; return ( {props.children}
{labels.map((option, i) => ( ))}
); }; export function FlagCheckbox(props: { option: textFlagLabels; idx: number; checkboxValues: boolean[]; sliderValues: number[]; checkboxHandler: (newVal: boolean, idx: number) => void; sliderHandler: (newVal: number, idx: number) => void; }): JSX.Element { let AdditionalExplanation = null; if (props.option.additionalExplanation) { AdditionalExplanation = ( ); } const id = useId(); const { colorMode } = useColorMode(); const labelTextClass = colorMode === "light" ? `text-${colors.light.text} hover:text-blue-700 float-left` : `text-${colors.dark.text} hover:text-blue-400 float-left`; return ( { props.checkboxHandler(e.target.checked, props.idx); }} /> { props.sliderHandler(val / 100, props.idx); }} > ); }