diff --git a/.changeset/admin-rte-strict-mode.md b/.changeset/admin-rte-strict-mode.md new file mode 100644 index 00000000000..f44d7bd515f --- /dev/null +++ b/.changeset/admin-rte-strict-mode.md @@ -0,0 +1,9 @@ +--- +"@dextinity/admin-rte": patch +--- + +Type `requiredValidator` and `ControlButton`'s `onButtonClick` more precisely + +`requiredValidator` is now generic over the field value. `FieldValidator` is invariant in it, so the previous single instantiation could not be passed to a `string`-valued `Field`. + +`ControlButton` receives its `onButtonClick` handler with a `MouseEvent`, matching the `button` element the handler is attached to. diff --git a/packages/admin/admin-rte/src/core/Controls/ControlButton.tsx b/packages/admin/admin-rte/src/core/Controls/ControlButton.tsx index c9a01d721b1..617143463a7 100644 --- a/packages/admin/admin-rte/src/core/Controls/ControlButton.tsx +++ b/packages/admin/admin-rte/src/core/Controls/ControlButton.tsx @@ -72,7 +72,7 @@ export interface IProps }> { disabled?: boolean; selected?: boolean; - onButtonClick?: (e: MouseEvent) => void; + onButtonClick?: (e: MouseEvent) => void; icon?: ForwardRefExoticComponent & RefAttributes>; /** @deprecated use icon instead */ diff --git a/packages/admin/admin-rte/src/core/Controls/useBlockTypes.tsx b/packages/admin/admin-rte/src/core/Controls/useBlockTypes.tsx index ddc35e420bd..434f6386d9f 100644 --- a/packages/admin/admin-rte/src/core/Controls/useBlockTypes.tsx +++ b/packages/admin/admin-rte/src/core/Controls/useBlockTypes.tsx @@ -44,7 +44,7 @@ const createFeaturesFromBlocktypeMap = })), ]; -type BlockChangeEvent = SelectChangeEvent; +type BlockChangeEvent = SelectChangeEvent; export interface BlockTypesApi { dropdownFeatures: IFeatureConfig[]; @@ -87,13 +87,15 @@ export default function useBlockTypes({ (e: BlockChangeEvent) => { e.preventDefault(); - if (!e.target.value) { + const blockType = typeof e.target.value === "string" ? e.target.value : undefined; + + if (!blockType) { const currentBlock = getCurrentBlock(editorState); if (currentBlock) { setEditorState(RichUtils.toggleBlockType(editorState, currentBlock.getType())); } } else { - setEditorState(RichUtils.toggleBlockType(editorState, e.target.value)); + setEditorState(RichUtils.toggleBlockType(editorState, blockType)); } // keeps editor focused setTimeout(() => { diff --git a/packages/admin/admin-rte/src/core/Controls/useInlineStyleType.tsx b/packages/admin/admin-rte/src/core/Controls/useInlineStyleType.tsx index 436709026d0..68243130106 100644 --- a/packages/admin/admin-rte/src/core/Controls/useInlineStyleType.tsx +++ b/packages/admin/admin-rte/src/core/Controls/useInlineStyleType.tsx @@ -1,7 +1,7 @@ import { RteBold, RteItalic, RteStrikethrough, RteSub, RteSup, RteUnderlined } from "@dextinity/admin-icons"; import * as detectBrowser from "detect-browser"; import { type Editor, type EditorState, RichUtils } from "draft-js"; -import { type RefObject, useCallback, useMemo } from "react"; +import { type MouseEvent, type RefObject, useCallback, useMemo } from "react"; import { FormattedMessage } from "react-intl"; import type { SupportedThings } from "../Rte"; diff --git a/packages/admin/admin-rte/src/utils/requiredValidator.tsx b/packages/admin/admin-rte/src/utils/requiredValidator.tsx index 0a6eee71956..7e7ff5f6f24 100644 --- a/packages/admin/admin-rte/src/utils/requiredValidator.tsx +++ b/packages/admin/admin-rte/src/utils/requiredValidator.tsx @@ -1,10 +1,11 @@ import { convertFromRaw, type RawDraftContentState } from "draft-js"; import type { FieldValidator } from "final-form"; +import type { ReactNode } from "react"; import { FormattedMessage } from "react-intl"; const requiredMessage = ; -export const requiredValidator: FieldValidator = (value) => { +export const requiredValidator = (...[value]: Parameters>): ReactNode => { if (value === undefined) { return requiredMessage; } diff --git a/packages/admin/admin-rte/tsconfig.json b/packages/admin/admin-rte/tsconfig.json index b27b6630db3..ba4a34821aa 100644 --- a/packages/admin/admin-rte/tsconfig.json +++ b/packages/admin/admin-rte/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { "outDir": "lib", - "rootDir": "src" + "rootDir": "src", + "strict": true }, "extends": "../tsconfig.base.json", "include": ["./src"]