import { useState, useMemo } from "react"; import { WhenToWrite } from "@calcom/app-store/_lib/crm-enums"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Button } from "@calcom/ui/components/button"; import { Switch } from "@calcom/ui/components/form"; import { InputField } from "@calcom/ui/components/form"; import { Select } from "@calcom/ui/components/form"; import { Section } from "@calcom/ui/components/section"; import { showToast } from "@calcom/ui/components/toast"; import type { WriteToRecordEntrySchema, WriteToObjectSettingsProps } from "./WriteToObjectSettings.types"; import { DATE_FIELD_TYPE, CHECKBOX_FIELD_TYPE, buildFieldTypeOptions, buildDateFieldValueOptions, buildWhenToWriteOptions, buildCheckboxFieldValueOptions, } from "./WriteToObjectSettings.utils"; const WriteToObjectSettings = ({ bookingAction, optionLabel, optionEnabled, optionSwitchOnChange, writeToObjectData, updateWriteToObjectData, supportedFieldTypes, supportedDateFields, supportedWriteTriggers = [WhenToWrite.EVERY_BOOKING, WhenToWrite.FIELD_EMPTY], }: WriteToObjectSettingsProps) => { const { t } = useLocale(); const fieldTypeOptions = useMemo( () => buildFieldTypeOptions(supportedFieldTypes, t), [supportedFieldTypes, t] ); const dateFieldValueOptions = useMemo( () => buildDateFieldValueOptions(bookingAction, supportedDateFields, t), [supportedDateFields, bookingAction, t] ); const whenToWriteOptions = useMemo( () => buildWhenToWriteOptions(supportedWriteTriggers, bookingAction, t), [supportedWriteTriggers, bookingAction, t] ); const showWhenToWriteColumn = whenToWriteOptions.length > 1; const checkboxFieldValueOptions = useMemo(() => buildCheckboxFieldValueOptions(t), [t]); const [fieldTypeSelectedOption, setFieldTypeSelectedOption] = useState(fieldTypeOptions[0]); const [dateFieldSelectedOption, setDateFieldSelectedOption] = useState(dateFieldValueOptions[0]); const [checkboxFieldSelectedOption, setCheckboxFieldSelectedOption] = useState( checkboxFieldValueOptions[0] ); const [whenToWriteSelectedOption, setWhenToWriteSelectedOption] = useState(whenToWriteOptions[0]); const [editingRows, setEditingRows] = useState>({}); const [editingData, setEditingData] = useState>({}); const [newOnWriteToRecordEntry, setNewOnWriteToRecordEntry] = useState({ field: "", fieldType: fieldTypeSelectedOption.value, value: "", whenToWrite: whenToWriteSelectedOption.value, }); const startEditing = (key: string) => { Object.keys(editingRows).forEach((rowKey) => { if (editingRows[rowKey] && rowKey !== key) { cancelEditing(rowKey); } }); setEditingRows((prev) => ({ ...prev, [key]: true })); setEditingData((prev) => ({ ...prev, [key]: { field: key, fieldType: writeToObjectData[key].fieldType, value: writeToObjectData[key].value, whenToWrite: writeToObjectData[key].whenToWrite, }, })); }; const cancelEditing = (key: string) => { setEditingRows((prev) => ({ ...prev, [key]: false })); setEditingData((prev) => { const newData = { ...prev }; delete newData[key]; return newData; }); }; const saveEditing = (key: string) => { const editData = editingData[key]; if (!editData) return; if (!editData.field.trim()) { showToast(t("field_name_cannot_be_empty"), "error"); return; } if (editData.field !== key && Object.keys(writeToObjectData).includes(editData.field.trim())) { showToast(t("field_already_exists"), "error"); return; } const newWriteToObjectData = { ...writeToObjectData }; if (editData.field !== key) { delete newWriteToObjectData[key]; } newWriteToObjectData[editData.field.trim()] = { fieldType: editData.fieldType, value: editData.value, whenToWrite: editData.whenToWrite, }; updateWriteToObjectData(newWriteToObjectData); cancelEditing(key); }; return ( <> {optionEnabled ? (
{t("field_name")}
{t("field_type")}
{t("value")}
{showWhenToWriteColumn &&
{t("when_to_write")}
}
{Object.keys(writeToObjectData).map((key) => { const isEditing = editingRows[key]; const editData = editingData[key]; return (
{isEditing ? ( setEditingData((prev) => ({ ...prev, [key]: { ...editData, field: e.target.value }, })) } size="sm" className="w-full" /> ) : ( )}
{isEditing ? ( option.value === writeToObjectData[key].fieldType )} isDisabled={true} /> )}
{isEditing ? ( editData?.fieldType === DATE_FIELD_TYPE ? ( option.value === editData.value)} onChange={(e) => { if (e) { setEditingData((prev) => ({ ...prev, [key]: { ...editData, value: e.value }, })); } }} /> ) : ( setEditingData((prev) => ({ ...prev, [key]: { ...editData, value: e.target.value }, })) } size="sm" className="w-full" /> ) ) : writeToObjectData[key].fieldType === DATE_FIELD_TYPE ? ( option.value === writeToObjectData[key].value )} isDisabled={true} /> ) : ( )}
{showWhenToWriteColumn && (
{isEditing ? ( option.value === writeToObjectData[key].whenToWrite )} isDisabled={true} /> )}
)}
{isEditing ? ( <>
); })}
setNewOnWriteToRecordEntry({ ...newOnWriteToRecordEntry, field: e.target.value, }) } />
{ if (e) { setDateFieldSelectedOption(e); setNewOnWriteToRecordEntry({ ...newOnWriteToRecordEntry, value: e.value, }); } }} /> ) : newOnWriteToRecordEntry.fieldType === CHECKBOX_FIELD_TYPE ? ( { if (e) { setWhenToWriteSelectedOption(e); setNewOnWriteToRecordEntry({ ...newOnWriteToRecordEntry, whenToWrite: e.value, }); } }} />
)}
) : null} ); }; export { BookingActionEnum, type SelectOption, type WriteToRecordEntry, type WriteToRecordEntrySchema, type WriteToObjectSettingsProps, } from "./WriteToObjectSettings.types"; export default WriteToObjectSettings;