// @flow import * as React from "react"; import styled from "styled-components"; import useStores from "hooks/useStores"; type Props = {| onSubmit: (title: string) => Promise, title: string, canUpdate: boolean, |}; function EditableTitle({ title, onSubmit, canUpdate }: Props) { const [isEditing, setIsEditing] = React.useState(false); const [originalValue, setOriginalValue] = React.useState(title); const [value, setValue] = React.useState(title); const { ui } = useStores(); React.useEffect(() => { setValue(title); }, [title]); const handleChange = React.useCallback((event) => { setValue(event.target.value); }, []); const handleDoubleClick = React.useCallback((event) => { event.preventDefault(); event.stopPropagation(); setIsEditing(true); }, []); const handleKeyDown = React.useCallback( (event) => { if (event.key === "Escape") { setIsEditing(false); setValue(originalValue); } }, [originalValue] ); const handleSave = React.useCallback(async () => { setIsEditing(false); if (value === originalValue) { return; } if (document) { try { await onSubmit(value); setOriginalValue(value); } catch (error) { setValue(originalValue); ui.showToast(error.message, { type: "error", }); throw error; } } }, [ui, originalValue, value, onSubmit]); return ( <> {isEditing ? (
) : ( {value} )} ); } const Input = styled.input` margin-left: -4px; color: ${(props) => props.theme.sidebarText}; background: ${(props) => props.theme.background}; width: calc(100% - 10px); border-radius: 3px; border: 1px solid ${(props) => props.theme.inputBorderFocused}; padding: 5px 6px; margin: -4px; height: 32px; &:focus { outline-color: ${(props) => props.theme.primary}; } `; export default EditableTitle;