diff --git a/.flowconfig b/.flowconfig index 1fe4c4c4f..965a8fe7f 100644 --- a/.flowconfig +++ b/.flowconfig @@ -23,8 +23,8 @@ module.name_mapper='^outline-react/useOutlineRichText' -> '/packag module.name_mapper='^outline-react/useOutlinePlainText' -> '/packages/outline-react/src/useOutlinePlainText.js' module.name_mapper='^outline-react/useOutlineEditorEvents' -> '/packages/outline-react/src/useOutlineEditorEvents.js' module.name_mapper='^outline-react/useOutlineAutoFormatter' -> '/packages/outline-react/src/useOutlineAutoFormatter.js' -module.name_mapper='^outline-react/useOutlineHistory' -> '/packages/outline-react/src/useOutlineHistory.js' module.name_mapper='^outline-react/useOutlineDragonSupport' -> '/packages/outline-react/src/useOutlineDragonSupport.js' +module.name_mapper='^outline-react/OutlineHistory' -> '/packages/outline-react/src/OutlineHistory.js' module.name_mapper='^outline-react/OutlineKeyHelpers' -> '/packages/outline-react/src/OutlineKeyHelpers.js' module.name_mapper='^outline-react/OutlineSelectionHelpers' -> '/packages/outline-react/src/OutlineSelectionHelpers.js' module.name_mapper='^outline-react/OutlineTextHelpers' -> '/packages/outline-react/src/OutlineTextHelpers.js' diff --git a/packages/outline-playground/src/CharacterLimit.js b/packages/outline-playground/src/CharacterLimit.js index c6aa7e4bd..6e47be897 100644 --- a/packages/outline-playground/src/CharacterLimit.js +++ b/packages/outline-playground/src/CharacterLimit.js @@ -7,7 +7,7 @@ import * as React from 'react'; import {isBlockNode, isTextNode} from 'outline'; import {useCallback, useEffect, useRef, useState} from 'react'; import {findTextIntersectionFromCharacters} from 'outline-react/OutlineTextHelpers'; -import {updateWithoutHistory} from 'outline-react/useOutlineHistory'; +import {updateWithoutHistory} from 'outline-react/OutlineHistory'; const CHARACTER_LIMIT = 30; diff --git a/packages/outline-playground/src/Editor.js b/packages/outline-playground/src/Editor.js index 0ae505d29..bf87b2abc 100644 --- a/packages/outline-playground/src/Editor.js +++ b/packages/outline-playground/src/Editor.js @@ -10,13 +10,11 @@ import useEmojis from './useEmojis'; import useMentions from './useMentions'; import usePlainText from 'outline-react/useOutlinePlainText'; import useOutlineAutoFormatter from 'outline-react/useOutlineAutoFormatter'; -import {useOutlineHistory} from 'outline-react/useOutlineHistory'; import useToolbar from './useToolbar'; import useHashtags from './useHashtags'; import BlockControls from './BlockControls'; import useStepRecorder from './useStepRecorder'; import CharacterLimit from './CharacterLimit'; -import useOutlineDragonSupport from 'outline-react/useOutlineDragonSupport'; import {Typeahead} from './Typeahead'; const editorStyle = { @@ -152,8 +150,6 @@ export function RichTextEditor({ useEmojis(outlineEditor); useHashtags(outlineEditor); useOutlineAutoFormatter(outlineEditor); - useOutlineHistory(outlineEditor); - useOutlineDragonSupport(outlineEditor); return ( <> @@ -188,8 +184,6 @@ export function PlainTextEditor({ useOutlineOnChange(outlineEditor, onChange); useEmojis(outlineEditor); useHashtags(outlineEditor); - useOutlineHistory(outlineEditor); - useOutlineDragonSupport(outlineEditor); const stepRecorder = useStepRecorder(outlineEditor); return ( diff --git a/packages/outline-react/OutlineHistory.js b/packages/outline-react/OutlineHistory.js new file mode 100644 index 000000000..a31451117 --- /dev/null +++ b/packages/outline-react/OutlineHistory.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./dist/OutlineHistory'); diff --git a/packages/outline-react/src/OutlineHistory.js b/packages/outline-react/src/OutlineHistory.js new file mode 100644 index 000000000..453a37b2b --- /dev/null +++ b/packages/outline-react/src/OutlineHistory.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +import type {ViewModel, OutlineEditor, View} from 'outline'; + +export const viewModelsWithoutHistory: Set = new Set(); + +export function updateWithoutHistory( + editor: OutlineEditor, + updateFn: (view: View) => void, +): boolean { + const res = editor.update(updateFn); + const pendingViewModel = editor._pendingViewModel; + if (pendingViewModel !== null) { + viewModelsWithoutHistory.add(pendingViewModel); + } + return res; +} diff --git a/packages/outline-react/src/__tests__/OutlineSelection-test.js b/packages/outline-react/src/__tests__/OutlineSelection-test.js index 7b986df09..8091ddc9d 100644 --- a/packages/outline-react/src/__tests__/OutlineSelection-test.js +++ b/packages/outline-react/src/__tests__/OutlineSelection-test.js @@ -13,7 +13,6 @@ import ReactDOM from 'react-dom'; import ReactTestUtils from 'react-dom/test-utils'; import useOutlineRichText from 'outline-react/useOutlineRichText'; -import {useOutlineHistory} from 'outline-react/useOutlineHistory'; import { insertText, @@ -79,7 +78,6 @@ describe('OutlineSelection tests', () => { function TestBase() { editor = useOutlineEditor(ref); const props = useOutlineRichText(editor, false); - useOutlineHistory(editor); return
; } diff --git a/packages/outline-react/src/useOutlineDragonSupport.js b/packages/outline-react/src/useOutlineDragonSupport.js index 2b62eb3d8..bd92ee809 100644 --- a/packages/outline-react/src/useOutlineDragonSupport.js +++ b/packages/outline-react/src/useOutlineDragonSupport.js @@ -9,7 +9,7 @@ import type {OutlineEditor} from 'outline'; -import {insertRichText} from 'outline-react/OutlineSelectionHelpers'; +import {insertRichText} from './OutlineSelectionHelpers'; import {useEffect} from 'react'; diff --git a/packages/outline-react/src/useOutlineHistory.js b/packages/outline-react/src/useOutlineHistory.js index 60b38608d..cf9c7adae 100644 --- a/packages/outline-react/src/useOutlineHistory.js +++ b/packages/outline-react/src/useOutlineHistory.js @@ -7,13 +7,12 @@ * @flow strict-local */ -import type {OutlineEditor, ViewModel, View} from 'outline'; +import type {OutlineEditor, ViewModel} from 'outline'; import {isTextNode} from 'outline'; import {isRedo, isUndo} from './OutlineKeyHelpers'; import {useEffect, useMemo} from 'react'; - -const viewModelsWithoutHistory = new Set(); +import {viewModelsWithoutHistory} from 'outline-react/OutlineHistory'; const MERGE = 0; const NO_MERGE = 1; @@ -83,25 +82,13 @@ function getMergeAction( return NO_MERGE; } -export function updateWithoutHistory( - editor: OutlineEditor, - updateFn: (view: View) => void, -): boolean { - const res = editor.update(updateFn); - const pendingViewModel = editor._pendingViewModel; - if (pendingViewModel !== null) { - viewModelsWithoutHistory.add(pendingViewModel); - } - return res; -} - type OutlineHistoryStacks = [Array, Array]; type OutlineHistorySetter = ( undoStack: Array, redoStack: Array, ) => void; -export function useOutlineHistory( +export default function useOutlineHistory( editor: OutlineEditor, ): [OutlineHistoryStacks, OutlineHistorySetter] { const historyState: { diff --git a/packages/outline-react/src/useOutlinePlainText.js b/packages/outline-react/src/useOutlinePlainText.js index 36cd4dfbd..aef5d7c42 100644 --- a/packages/outline-react/src/useOutlinePlainText.js +++ b/packages/outline-react/src/useOutlinePlainText.js @@ -36,6 +36,8 @@ import { onPolyfilledBeforeInput, onNativeInput, } from './OutlineEventHandlers'; +import useOutlineDragonSupport from './useOutlineDragonSupport'; +import useOutlineHistory from './useOutlineHistory'; function initEditor(editor: OutlineEditor): void { editor.update((view) => { @@ -101,6 +103,8 @@ export default function useOutlinePlainText( }, [editor]); useOutlineEditorEvents(events, editor, eventHandlerState); + useOutlineDragonSupport(editor); + useOutlineHistory(editor); return CAN_USE_BEFORE_INPUT ? emptyObject diff --git a/packages/outline-react/src/useOutlineRichText.js b/packages/outline-react/src/useOutlineRichText.js index 896edd298..8f63af6d9 100644 --- a/packages/outline-react/src/useOutlineRichText.js +++ b/packages/outline-react/src/useOutlineRichText.js @@ -40,6 +40,8 @@ import { onNativeInput, onFocus, } from './OutlineEventHandlers'; +import useOutlineDragonSupport from './useOutlineDragonSupport'; +import useOutlineHistory from './useOutlineHistory'; function initEditor(editor: OutlineEditor): void { editor.update((view) => { @@ -124,6 +126,8 @@ export default function useOutlineRichText( }, [editor]); useOutlineEditorEvents(events, editor, eventHandlerState); + useOutlineDragonSupport(editor); + useOutlineHistory(editor); return CAN_USE_BEFORE_INPUT ? emptyObject diff --git a/packages/outline-react/useOutlineDragonSupport.js b/packages/outline-react/useOutlineDragonSupport.js deleted file mode 100644 index 886b0f333..000000000 --- a/packages/outline-react/useOutlineDragonSupport.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/useOutlineDragonSupport'); diff --git a/packages/outline-react/useOutlineHistory.js b/packages/outline-react/useOutlineHistory.js deleted file mode 100644 index 875082654..000000000 --- a/packages/outline-react/useOutlineHistory.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./dist/useOutlineHistory'); diff --git a/scripts/build.js b/scripts/build.js index 03f293ad6..9fdf8b3d8 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -192,11 +192,13 @@ build( ); outlineReactModules.forEach((outlineReactModule) => { - // We don't want to sync these modules + // We don't want to sync these modules, as they're bundled in the other + // modules already. if ( - isWWW && - (outlineReactModule === 'OutlineEnv' || - outlineReactModule === 'OutlineReactUtils') + outlineReactModule === 'OutlineEnv' || + outlineReactModule === 'useOutlineHistory' || + outlineReactModule === 'useOutlineDragonSupport' || + outlineReactModule === 'OutlineReactUtils' ) { return; }