@brizy/ui
Version:
React elements in Brizy style
59 lines (58 loc) • 3.02 kB
JavaScript
import React, { useCallback, useMemo, useRef, useState } from "react";
import { Option } from "./Option";
import { OnChangeCases } from "./types";
import { Select, SelectOption } from "../Select";
import { Text } from "../Input/Text";
import { Popover } from "../Popover";
import { ClickOutside } from "../ClickOutside";
import { BRZ_PREFIX } from "../constants";
const inputTheme = { background: "darkest", color: "white", borderColor: "darkest" };
export const SelectEditable = ({ value, placeholder, error, choices, title, onChange, getPopoverContainer, getDropdownContainer, }) => {
const ref = useRef(null);
const [isEditMode, setIsEditMode] = useState(false);
const handleInputChange = useCallback((e) => {
onChange({ type: OnChangeCases.Edit, payload: e });
}, [onChange]);
const handleEdit = useCallback(() => {
setIsEditMode(true);
requestAnimationFrame(() => {
if (ref.current) {
ref.current.focus();
}
});
}, []);
const handleDuplicate = useCallback(() => {
onChange({ type: OnChangeCases.Duplicate });
}, [onChange]);
const handleDelete = useCallback(() => {
onChange({ type: OnChangeCases.Delete });
}, [onChange]);
const handleMFChange = useCallback((s) => {
onChange({ type: OnChangeCases.Symbol, payload: s });
}, [onChange]);
const handleChangeName = useCallback(() => {
setIsEditMode(false);
}, []);
const options = useMemo(() => [
{
title: "Edit Name",
onClick: handleEdit,
},
{
title: "Duplicate",
onClick: handleDuplicate,
},
{
title: "Delete",
onClick: handleDelete,
},
], [handleEdit, handleDuplicate, handleDelete]);
const content = options.map(({ title, onClick, disabled }, index) => (React.createElement(Option, { key: index, title: title, disabled: disabled, onClick: value ? onClick : undefined })));
return (React.createElement(React.Fragment, null,
React.createElement("div", { className: `${BRZ_PREFIX}-editable-select` },
isEditMode ? (React.createElement(ClickOutside, { onClickOutside: handleChangeName },
React.createElement(Text, { theme: inputTheme, value: title !== null && title !== void 0 ? title : "", onChange: handleInputChange }))) : (React.createElement(Select, { theme: "dark", value: value, onChange: handleMFChange, placeholder: placeholder, getContainer: getDropdownContainer }, choices.map(({ title, value }, i) => (React.createElement(SelectOption, { key: i, value: value }, title))))),
React.createElement(Popover, { color: "blue-darkest", content: content, trigger: "click", getPopupContainer: getPopoverContainer },
React.createElement("div", { className: `${BRZ_PREFIX}-editable-select-dots` }))),
error && React.createElement("div", { className: `${BRZ_PREFIX}-editable-select-error` }, error)));
};