import React, { useCallback, useMemo } from "react"; import * as Popover from "@radix-ui/react-popover"; import { FontPickerList } from "./FontPickerList"; import { FontPickerTrigger } from "./FontPickerTrigger"; import { ButtonIconSelect } from "../ButtonIconSelect"; import { FontFamilyCodeIcon, FontFamilyNormalIcon, FreedrawIcon, } from "../icons"; import { ButtonSeparator } from "../ButtonSeparator"; import type { FontFamilyValues } from "../../element/types"; import { FONT_FAMILY } from "../../constants"; import { t } from "../../i18n"; import "./FontPicker.scss"; export const DEFAULT_FONTS = [ { value: FONT_FAMILY.Excalifont, icon: FreedrawIcon, text: t("labels.handDrawn"), testId: "font-family-hand-drawn", }, { value: FONT_FAMILY.Nunito, icon: FontFamilyNormalIcon, text: t("labels.normal"), testId: "font-family-normal", }, { value: FONT_FAMILY["Comic Shanns"], icon: FontFamilyCodeIcon, text: t("labels.code"), testId: "font-family-code", }, ]; const defaultFontFamilies = new Set(DEFAULT_FONTS.map((x) => x.value)); export const isDefaultFont = (fontFamily: number | null) => { if (!fontFamily) { return false; } return defaultFontFamilies.has(fontFamily); }; interface FontPickerProps { isOpened: boolean; selectedFontFamily: FontFamilyValues | null; hoveredFontFamily: FontFamilyValues | null; onSelect: (fontFamily: FontFamilyValues) => void; onHover: (fontFamily: FontFamilyValues) => void; onLeave: () => void; onPopupChange: (open: boolean) => void; } export const FontPicker = React.memo( ({ isOpened, selectedFontFamily, hoveredFontFamily, onSelect, onHover, onLeave, onPopupChange, }: FontPickerProps) => { const defaultFonts = useMemo(() => DEFAULT_FONTS, []); const onSelectCallback = useCallback( (value: number | false) => { if (value) { onSelect(value); } }, [onSelect], ); return (
type="button" options={defaultFonts} value={selectedFontFamily} onClick={onSelectCallback} /> {isOpened && ( onPopupChange(true)} onClose={() => onPopupChange(false)} /> )}
); }, (prev, next) => prev.isOpened === next.isOpened && prev.selectedFontFamily === next.selectedFontFamily && prev.hoveredFontFamily === next.hoveredFontFamily, );