UNPKG

@brizy/ui

Version:
59 lines (58 loc) 3.02 kB
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))); };