import { SharedStyle, StyleProp, tlmenus, useEditor } from '@tldraw/editor' import * as React from 'react' import { StyleValuesForUi } from '../../../styles' import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey' import { useTranslation } from '../../hooks/useTranslation/useTranslation' import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon' import { TldrawUiMenuContextProvider } from '../primitives/menus/TldrawUiMenuContext' import { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger, } from '../primitives/TldrawUiPopover' import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar' import { useStylePanelContext } from './StylePanelContext' /** @public */ export interface StylePanelDoubleDropdownPickerProps { uiTypeA: string uiTypeB: string label: TLUiTranslationKey | Exclude labelA: TLUiTranslationKey | Exclude labelB: TLUiTranslationKey | Exclude itemsA: StyleValuesForUi itemsB: StyleValuesForUi styleA: StyleProp styleB: StyleProp valueA: SharedStyle valueB: SharedStyle onValueChange?(style: StyleProp, value: T): void } function StylePanelDoubleDropdownPickerInner( props: StylePanelDoubleDropdownPickerProps ) { const msg = useTranslation() return (
{msg(props.label)}
) } function StylePanelDoubleDropdownPickerInlineInner( props: StylePanelDoubleDropdownPickerProps ) { const ctx = useStylePanelContext() const { uiTypeA, uiTypeB, labelA, labelB, itemsA, itemsB, styleA, styleB, valueA, valueB, onValueChange = ctx.onValueChange, } = props const editor = useEditor() const msg = useTranslation() const [isOpenA, setIsOpenA] = React.useState(false) const [isOpenB, setIsOpenB] = React.useState(false) const iconA = React.useMemo( () => itemsA.find((item) => valueA.type === 'shared' && valueA.value === item.value)?.icon ?? 'mixed', [itemsA, valueA] ) const iconB = React.useMemo( () => itemsB.find((item) => valueB.type === 'shared' && valueB.value === item.value)?.icon ?? 'mixed', [itemsB, valueB] ) if (valueA === undefined && valueB === undefined) return null const idA = `style panel ${uiTypeA} A` const idB = `style panel ${uiTypeB} B` return ( <> {itemsA.map((item) => { return ( { onValueChange(styleA, item.value) tlmenus.deleteOpenMenu(idA, editor.contextId) setIsOpenA(false) }} title={`${msg(labelA)} — ${msg(`${uiTypeA}-style.${item.value}`)}`} > ) })} {itemsB.map((item) => { return ( { onValueChange(styleB, item.value) tlmenus.deleteOpenMenu(idB, editor.contextId) setIsOpenB(false) }} > ) })} ) } // need to memo like this to get generics /** @public @react */ export const StylePanelDoubleDropdownPicker = React.memo(StylePanelDoubleDropdownPickerInner) as < T extends string, >( props: StylePanelDoubleDropdownPickerProps ) => React.JSX.Element /** @public @react */ export const StylePanelDoubleDropdownPickerInline = React.memo( StylePanelDoubleDropdownPickerInlineInner ) as (props: StylePanelDoubleDropdownPickerProps) => React.JSX.Element