import { Callout, Field, Flex, InputBox, Margins, Skeleton } from '@rocket.chat/fuselage';
import React, { memo, useEffect, useMemo, useState, useCallback } from 'react';
import { useDebouncedCallback } from '@rocket.chat/fuselage-hooks';
import MarkdownText from '../../components/basic/MarkdownText';
import { useEditableSetting, useEditableSettingsDispatch } from '../../contexts/EditableSettingsContext';
import { useTranslation } from '../../contexts/TranslationContext';
import { GenericSettingInput } from './inputs/GenericSettingInput';
import { BooleanSettingInput } from './inputs/BooleanSettingInput';
import { StringSettingInput } from './inputs/StringSettingInput';
import { RelativeUrlSettingInput } from './inputs/RelativeUrlSettingInput';
import { PasswordSettingInput } from './inputs/PasswordSettingInput';
import { IntSettingInput } from './inputs/IntSettingInput';
import { SelectSettingInput } from './inputs/SelectSettingInput';
import { MultiSelectSettingInput } from './inputs/MultiSelectSettingInput';
import { LanguageSettingInput } from './inputs/LanguageSettingInput';
import { ColorSettingInput } from './inputs/ColorSettingInput';
import { FontSettingInput } from './inputs/FontSettingInput';
import { CodeSettingInput } from './inputs/CodeSettingInput';
import { ActionSettingInput } from './inputs/ActionSettingInput';
import { AssetSettingInput } from './inputs/AssetSettingInput';
import { RoomPickSettingInput } from './inputs/RoomPickSettingInput';
import { useSettingStructure } from '../../contexts/SettingsContext';
export const MemoizedSetting = memo(function MemoizedSetting({
type,
hint,
callout,
value,
editor,
onChangeValue = () => {},
onChangeEditor = () => {},
className,
...inputProps
}) {
const InputComponent = {
boolean: BooleanSettingInput,
string: StringSettingInput,
relativeUrl: RelativeUrlSettingInput,
password: PasswordSettingInput,
int: IntSettingInput,
select: SelectSettingInput,
multiSelect: MultiSelectSettingInput,
language: LanguageSettingInput,
color: ColorSettingInput,
font: FontSettingInput,
code: CodeSettingInput,
action: ActionSettingInput,
asset: AssetSettingInput,
roomPick: RoomPickSettingInput,
}[type] || GenericSettingInput;
return
{hint && {hint}}
{callout &&
{callout}
}
;
});
export function Setting({ className, settingId, sectionChanged }) {
const setting = useEditableSetting(settingId);
const persistedSetting = useSettingStructure(settingId);
const dispatch = useEditableSettingsDispatch();
const update = useDebouncedCallback(({ value, editor }) => {
if (!persistedSetting) {
return;
}
dispatch([{
_id: persistedSetting._id,
...value !== undefined && { value },
...editor !== undefined && { editor },
changed:
JSON.stringify(persistedSetting.value) !== JSON.stringify(value)
|| JSON.stringify(persistedSetting.editor) !== JSON.stringify(editor),
}]);
}, 230, [persistedSetting, dispatch]);
const t = useTranslation();
const [value, setValue] = useState(setting.value);
const [editor, setEditor] = useState(setting.editor);
useEffect(() => {
setValue(setting.value);
}, [setting.value]);
useEffect(() => {
setEditor(setting.editor);
}, [setting.editor]);
const onChangeValue = useCallback((value) => {
setValue(value);
update({ value });
}, [update]);
const onChangeEditor = useCallback((editor) => {
setEditor(editor);
update({ editor });
}, [update]);
const onResetButtonClick = useCallback(() => {
setValue(setting.value);
setEditor(setting.editor);
update({
value: persistedSetting.packageValue,
editor: persistedSetting.packageEditor,
});
}, [setting.value, setting.editor, update, persistedSetting]);
const {
_id,
disabled,
disableReset,
readonly,
type,
packageEditor,
packageValue,
i18nLabel,
i18nDescription,
alert,
} = setting;
const label = (i18nLabel && t(i18nLabel)) || (_id || t(_id));
const hint = useMemo(() => t.has(i18nDescription) && , [i18nDescription, t]);
const callout = useMemo(() => alert && , [alert, t]);
const hasResetButton = !disableReset && !readonly && type !== 'asset' && (JSON.stringify(packageEditor) !== JSON.stringify(editor) || JSON.stringify(value) !== JSON.stringify(packageValue)) && !disabled;
return ;
}
export function SettingSkeleton() {
return
;
}
Setting.Memoized = MemoizedSetting;
Setting.Skeleton = SettingSkeleton;