diff --git a/apps/web/src/components/default-font/index.tsx b/apps/web/src/components/default-font/index.tsx index 0a909d18f..ef576559e 100644 --- a/apps/web/src/components/default-font/index.tsx +++ b/apps/web/src/components/default-font/index.tsx @@ -19,14 +19,19 @@ along with this program. If not, see . import { Flex, Slider, Text } from "@theme-ui/components"; import { useEffect, useState } from "react"; +import { useStore as useEditorStore } from "../../stores/editor-store"; import Config from "../../utils/config"; import DropdownButton from "../dropdown-button"; export function DefaultFont() { - const fonts = ["sans-serif", "serif", "monoSpace"]; + const { setFontSize, setFontFamily } = useEditorStore((store) => store); + const fontSize = useEditorStore((store) => store.session.fontSize); + //const fontFamily = useEditorStore((store) => store.session.fontFamily); + + const fonts = ["Sans-serif", "Serif", "Monospace"]; const getOptions = () => - Config.get("fontFamily", fonts).map((font) => ({ - title: () => capitalizeFirstLetter(font), + getFonts(Config.get("fontFamily", "Sans-serif")).map((font) => ({ + title: () => font, onClick: () => { const newFonts = [font]; for (const item of fonts) { @@ -34,14 +39,16 @@ export function DefaultFont() { newFonts.push(item); } } - Config.set("fontFamily", newFonts); + Config.set("fontFamily", font); + setFontFamily(font); setOptions(getOptions()); }, key: font })); - const [fontSize, setFontSize] = useState(Config.get("fontSize", 16)); const [options, setOptions] = useState(getOptions()); + useEffect(() => { + //setFontFamily(options.at(0)); console.log("options changed"); }, [options]); @@ -51,11 +58,11 @@ export function DefaultFont() { { - setFontSize(parseInt(e.target.value)); - Config.set("fontSize", parseInt(e.target.value)); + setFontSize(`${parseInt(e.target.value)}px`); + Config.set("fontSize", `${e.target.value}px`); }} sx={{ width: "75%" }} /> @@ -66,7 +73,7 @@ export function DefaultFont() { textAlign: "center" }} > - {`${fontSize}px`} + {fontSize} store.session.fontSize); + const fontFamily = useStore((store) => store.session.fontFamily); const editor = useEditorInstance(); @@ -287,6 +293,8 @@ export function Editor(props: EditorProps) { return ( { - editorContainer.style.fontSize = `${Config.get("fontSize", 16)}px`; + editorContainer.style.fontSize = fontSize; }); if (!toolbarContainerId) return null; - return ( <> @@ -294,6 +298,8 @@ function TipTap(props: TipTapProps) { theme={theme} location={isMobile ? "bottom" : "top"} tools={toolbarConfig} + defaultFontFamily={fontFamily} + defaultFontSize={fontSize} /> diff --git a/apps/web/src/stores/editor-store.js b/apps/web/src/stores/editor-store.js index 094a81e97..1ed9eb430 100644 --- a/apps/web/src/stores/editor-store.js +++ b/apps/web/src/stores/editor-store.js @@ -27,6 +27,7 @@ import BaseStore from "."; import { EV, EVENTS } from "@notesnook/core/common"; import { hashNavigate } from "../navigation"; import { logger } from "../utils/logger"; +import Config from "../utils/config"; const SESSION_STATES = { stale: "stale", @@ -56,7 +57,9 @@ export const getDefaultSession = (sessionId = Date.now()) => { color: undefined, dateEdited: 0, attachmentsLength: 0, - isDeleted: false + isDeleted: false, + fontFamily: Config.get("fontFamily", "Sans-serif"), + fontSize: Config.get("fontSize", "16px") }; }; @@ -280,6 +283,18 @@ class EditorStore extends BaseStore { return this._setTag(tag); }; + setFontSize = (fontSize) => { + this.set((state) => { + state.session.fontSize = fontSize; + }); + }; + + setFontFamily = (fontFamily) => { + this.set((state) => { + state.session.fontFamily = fontFamily; + }); + }; + setSaveState = (saveState) => { this.set((state) => { state.session.saveState = saveState; diff --git a/packages/editor/src/toolbar/stores/toolbar-store.ts b/packages/editor/src/toolbar/stores/toolbar-store.ts index e0ef41843..bda1d75a3 100644 --- a/packages/editor/src/toolbar/stores/toolbar-store.ts +++ b/packages/editor/src/toolbar/stores/toolbar-store.ts @@ -20,6 +20,7 @@ along with this program. If not, see . import { Theme } from "@notesnook/theme"; import create from "zustand"; import { DownloadOptions } from "../../utils/downloader"; +import { FontFamily } from "../tools/font"; export type ToolbarLocation = "top" | "bottom"; @@ -41,6 +42,10 @@ interface ToolbarState { closePopup: (popupId: string) => void; closePopupGroup: (groupId: string, excluded: string[]) => void; closeAllPopups: () => void; + fontFamily: string; + setFontFamily: (fontFamily: string) => void; + fontSize: string; + setFontSize: (fontSize: string) => void; } export const useToolbarStore = create((set, get) => ({ @@ -99,6 +104,16 @@ export const useToolbarStore = create((set, get) => ({ for (const key in state.openedPopups) { state.openedPopups[key] = false; } + }), + fontFamily: "", + setFontFamily: (fontFamily) => + set((state) => { + state.fontFamily = fontFamily; + }), + fontSize: "", + setFontSize: (fontSize) => + set((state) => { + state.fontSize = fontSize; }) })); diff --git a/packages/editor/src/toolbar/toolbar.tsx b/packages/editor/src/toolbar/toolbar.tsx index de1980175..4419a18d8 100644 --- a/packages/editor/src/toolbar/toolbar.tsx +++ b/packages/editor/src/toolbar/toolbar.tsx @@ -41,6 +41,8 @@ type ToolbarProps = FlexProps & { editor: Editor | null; location: ToolbarLocation; tools?: ToolbarDefinition; + defaultFontFamily: string; + defaultFontSize: string; }; export function Toolbar(props: ToolbarProps) { @@ -49,10 +51,11 @@ export function Toolbar(props: ToolbarProps) { theme, location, tools = getDefaultPresets().default, + defaultFontFamily, + defaultFontSize, sx, ...flexProps } = props; - const toolbarTools = useMemo( () => [...STATIC_TOOLBAR_GROUPS, ...tools], [tools] @@ -63,11 +66,23 @@ export function Toolbar(props: ToolbarProps) { const setToolbarLocation = useToolbarStore( (store) => store.setToolbarLocation ); + const setDefaultFontFamily = useToolbarStore((store) => store.setFontFamily); + const setDefaultFontSize = useToolbarStore((store) => store.setFontSize); useEffect(() => { setToolbarLocation(location); }, [location, setToolbarLocation]); + useEffect(() => { + setDefaultFontFamily(defaultFontFamily); + setDefaultFontSize(defaultFontSize); + }, [ + defaultFontFamily, + defaultFontSize, + setDefaultFontFamily, + setDefaultFontSize + ]); + if (!editor) return null; return ( diff --git a/packages/editor/src/toolbar/tools/font.tsx b/packages/editor/src/toolbar/tools/font.tsx index 4985386bd..a0c695c51 100644 --- a/packages/editor/src/toolbar/tools/font.tsx +++ b/packages/editor/src/toolbar/tools/font.tsx @@ -21,15 +21,15 @@ import { ToolProps } from "../types"; import { Editor } from "../../types"; import { Dropdown } from "../components/dropdown"; import { MenuItem } from "../../components/menu/types"; -import { useCallback, useMemo } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import { Counter } from "../components/counter"; import { useRefValue } from "../../hooks/use-ref-value"; -import { config } from "../../utils/config"; +import { useToolbarStore } from "../stores/toolbar-store"; export function FontSize(props: ToolProps) { const { editor } = props; + const defaultFontSize = useToolbarStore((store) => store.fontSize); const { fontSize: _fontSize } = editor.getAttributes("textStyle"); - const defaultFontSize = `${config.get("fontSize", 16)}px`; const fontSize = _fontSize || defaultFontSize; const fontSizeAsNumber = useRefValue(parseInt(fontSize.replace("px", ""))); @@ -66,23 +66,39 @@ export function FontSize(props: ToolProps) { ); } -const fontFamilies = { - "Sans-serif": "Open Sans", - Serif: "serif", - Monospace: "monospace" -}; +interface CustomFonts { + [key: string]: string; +} +function fontFamilies(defaultFontFamily: string) { + const fonts: { [key: string]: string } = { + "Sans-serif": "Open Sans", + Serif: "serif", + Monospace: "monospace" + }; + + const customFonts: CustomFonts = {}; + customFonts[defaultFontFamily] = fonts[defaultFontFamily]; + + Object.entries(fonts).map(([key, value]) => { + if (key !== defaultFontFamily) customFonts[key] = value; + }); + return customFonts; +} + export function FontFamily(props: ToolProps) { const { editor } = props; - + const defaultFontFamily = useToolbarStore((store) => store.fontFamily); + const customFonts = fontFamilies(defaultFontFamily); const currentFontFamily = - Object.entries(fontFamilies) + Object.entries(customFonts) .find(([_key, value]) => editor.isActive("textStyle", { fontFamily: value }) ) ?.map((a) => a) - ?.at(0) || "Sans-serif"; + ?.at(0) || defaultFontFamily; + const items = useMemo( - () => toMenuItems(editor, currentFontFamily), + () => toMenuItems(editor, currentFontFamily, customFonts), // eslint-disable-next-line react-hooks/exhaustive-deps [currentFontFamily] ); @@ -98,10 +114,14 @@ export function FontFamily(props: ToolProps) { ); } -function toMenuItems(editor: Editor, currentFontFamily: string): MenuItem[] { +function toMenuItems( + editor: Editor, + currentFontFamily: string, + customFonts: CustomFonts +): MenuItem[] { const menuItems: MenuItem[] = []; - for (const key in fontFamilies) { - const value = fontFamilies[key as keyof typeof fontFamilies]; + for (const key in customFonts) { + const value = customFonts[key as keyof typeof customFonts]; menuItems.push({ key, type: "button", diff --git a/packages/editor/src/toolbar/types.ts b/packages/editor/src/toolbar/types.ts index fec60f5df..b48018359 100644 --- a/packages/editor/src/toolbar/types.ts +++ b/packages/editor/src/toolbar/types.ts @@ -28,6 +28,8 @@ export type ToolProps = ToolDefinition & { variant?: ToolButtonVariant; force?: boolean; selectedNode?: NodeWithOffset; + defaultFontFamily?: string; + defaultFontSize?: string; }; export type ToolDefinition = {