{
  "version": 3,
  "sources": ["../../src/hook/index.js"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useRef, useLayoutEffect, useReducer } from '@wordpress/element';\nimport { useMergeRefs, useRefEffect } from '@wordpress/compose';\nimport { useRegistry } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport { create, RichTextData } from '../create';\nimport { apply } from '../to-dom';\nimport { toHTMLString } from '../to-html-string';\nimport { removeFormat } from '../remove-format';\nimport { useDefaultStyle } from './use-default-style';\nimport { useBoundaryStyle } from './use-boundary-style';\nimport { useEventListeners } from './event-listeners';\nimport { useFormatTypes } from './use-format-types';\n\nfunction useRichTextBase( {\n\tvalue = '',\n\tselectionStart,\n\tselectionEnd,\n\tplaceholder,\n\tonSelectionChange,\n\tpreserveWhiteSpace,\n\tonChange,\n\t__unstableDisableFormats: disableFormats,\n\t__unstableIsSelected: isSelected,\n\t__unstableDependencies = [],\n\t__unstableAfterParse,\n\t__unstableBeforeSerialize,\n\t__unstableAddInvisibleFormats,\n} ) {\n\tconst registry = useRegistry();\n\tconst [ , forceRender ] = useReducer( () => ( {} ) );\n\tconst ref = useRef();\n\n\tfunction createRecord() {\n\t\tconst {\n\t\t\townerDocument: { defaultView },\n\t\t} = ref.current;\n\t\tconst selection = defaultView.getSelection();\n\t\tconst range =\n\t\t\tselection.rangeCount > 0 ? selection.getRangeAt( 0 ) : null;\n\n\t\treturn create( {\n\t\t\telement: ref.current,\n\t\t\trange,\n\t\t\t__unstableIsEditableTree: true,\n\t\t} );\n\t}\n\n\tfunction applyRecord( newRecord, { domOnly } = {} ) {\n\t\tapply( {\n\t\t\tvalue: newRecord,\n\t\t\tcurrent: ref.current,\n\t\t\tprepareEditableTree: __unstableAddInvisibleFormats,\n\t\t\t__unstableDomOnly: domOnly,\n\t\t\tplaceholder,\n\t\t} );\n\t}\n\n\t// Internal values are updated synchronously, unlike props and state.\n\tconst _valueRef = useRef( value );\n\tconst recordRef = useRef();\n\n\tfunction setRecordFromProps() {\n\t\tconst activeFormats = recordRef.current?.activeFormats;\n\t\t_valueRef.current = value;\n\t\trecordRef.current = value;\n\t\tif ( ! ( value instanceof RichTextData ) ) {\n\t\t\trecordRef.current = value\n\t\t\t\t? RichTextData.fromHTMLString( value, { preserveWhiteSpace } )\n\t\t\t\t: RichTextData.empty();\n\t\t}\n\t\t// To do: make rich text internally work with RichTextData.\n\t\trecordRef.current = {\n\t\t\ttext: recordRef.current.text,\n\t\t\tformats: recordRef.current.formats,\n\t\t\treplacements: recordRef.current.replacements,\n\t\t\tactiveFormats,\n\t\t};\n\t\tif ( disableFormats ) {\n\t\t\trecordRef.current.formats = Array( value.length );\n\t\t\trecordRef.current.replacements = Array( value.length );\n\t\t}\n\t\tif ( __unstableAfterParse ) {\n\t\t\trecordRef.current.formats = __unstableAfterParse(\n\t\t\t\trecordRef.current\n\t\t\t);\n\t\t}\n\t\trecordRef.current.start = selectionStart;\n\t\trecordRef.current.end = selectionEnd;\n\t}\n\n\tconst hadSelectionUpdateRef = useRef( false );\n\n\tif ( ! recordRef.current ) {\n\t\thadSelectionUpdateRef.current = isSelected;\n\t\tsetRecordFromProps();\n\t} else if (\n\t\tselectionStart !== recordRef.current.start ||\n\t\tselectionEnd !== recordRef.current.end\n\t) {\n\t\thadSelectionUpdateRef.current = isSelected;\n\t\trecordRef.current = {\n\t\t\t...recordRef.current,\n\t\t\tstart: selectionStart,\n\t\t\tend: selectionEnd,\n\t\t\tactiveFormats: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Sync the value to global state. The node tree and selection will also be\n\t * updated if differences are found.\n\t *\n\t * @param {Object} newRecord The record to sync and apply.\n\t */\n\tfunction handleChange( newRecord ) {\n\t\trecordRef.current = newRecord;\n\t\tapplyRecord( newRecord );\n\n\t\tif ( disableFormats ) {\n\t\t\t_valueRef.current = newRecord.text;\n\t\t} else {\n\t\t\tconst newFormats = __unstableBeforeSerialize\n\t\t\t\t? __unstableBeforeSerialize( newRecord )\n\t\t\t\t: newRecord.formats;\n\t\t\tnewRecord = { ...newRecord, formats: newFormats };\n\t\t\tif ( typeof value === 'string' ) {\n\t\t\t\t_valueRef.current = toHTMLString( {\n\t\t\t\t\tvalue: newRecord,\n\t\t\t\t\tpreserveWhiteSpace,\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t_valueRef.current = new RichTextData( newRecord );\n\t\t\t}\n\t\t}\n\n\t\tconst { start, end, formats, text } = recordRef.current;\n\n\t\t// Selection must be updated first, so it is recorded in history when\n\t\t// the content change happens.\n\t\t// We batch both calls to only attempt to rerender once.\n\t\tregistry.batch( () => {\n\t\t\tonSelectionChange( start, end );\n\t\t\tonChange( _valueRef.current, {\n\t\t\t\t__unstableFormats: formats,\n\t\t\t\t__unstableText: text,\n\t\t\t} );\n\t\t} );\n\t\tforceRender();\n\t}\n\n\tfunction applyFromProps() {\n\t\t// Get previous value before updating\n\t\tconst previousValue = _valueRef.current;\n\n\t\tsetRecordFromProps();\n\n\t\t// Check if content length changed (text was added/removed, not just formatted)\n\t\tconst contentLengthChanged =\n\t\t\tpreviousValue &&\n\t\t\ttypeof previousValue === 'string' &&\n\t\t\ttypeof value === 'string' &&\n\t\t\tpreviousValue.length !== value.length;\n\n\t\t// Check if focus is on this element\n\t\tconst hasFocus = ref.current?.contains(\n\t\t\tref.current.ownerDocument.activeElement\n\t\t);\n\n\t\t// Skip re-applying the selection state when content changed from external source\n\t\t// (e.g., typing in sidebar input changes canvas text)\n\t\tconst skipSelection = contentLengthChanged && ! hasFocus;\n\n\t\tapplyRecord( recordRef.current, { domOnly: skipSelection } );\n\t}\n\n\tconst didMountRef = useRef( false );\n\n\t// Value updates must happen synchronously to avoid overwriting newer values.\n\tuseLayoutEffect( () => {\n\t\tif ( didMountRef.current && value !== _valueRef.current ) {\n\t\t\tapplyFromProps();\n\t\t\tforceRender();\n\t\t}\n\t}, [ value ] );\n\n\t// Value updates must happen synchronously to avoid overwriting newer values.\n\tuseLayoutEffect( () => {\n\t\tif ( ! hadSelectionUpdateRef.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ref.current.ownerDocument.activeElement !== ref.current ) {\n\t\t\tref.current.focus();\n\t\t}\n\n\t\tapplyRecord( recordRef.current );\n\t\thadSelectionUpdateRef.current = false;\n\t}, [ hadSelectionUpdateRef.current ] );\n\n\tconst mergedRefs = useMergeRefs( [\n\t\tref,\n\t\tuseDefaultStyle(),\n\t\tuseBoundaryStyle( { record: recordRef } ),\n\t\tuseEventListeners( {\n\t\t\trecord: recordRef,\n\t\t\thandleChange,\n\t\t\tapplyRecord,\n\t\t\tcreateRecord,\n\t\t\tisSelected,\n\t\t\tonSelectionChange,\n\t\t\tforceRender,\n\t\t} ),\n\t\tuseRefEffect( () => {\n\t\t\tapplyFromProps();\n\t\t\tdidMountRef.current = true;\n\t\t}, [ placeholder, ...__unstableDependencies ] ),\n\t] );\n\n\treturn {\n\t\tvalue: recordRef.current,\n\t\t// A function to get the most recent value so event handlers in\n\t\t// useRichText implementations have access to it. For example when\n\t\t// listening to input events, we internally update the state, but this\n\t\t// state is not yet available to the input event handler because React\n\t\t// may re-render asynchronously.\n\t\tgetValue: () => recordRef.current,\n\t\tonChange: handleChange,\n\t\tref: mergedRefs,\n\t};\n}\n\nexport function useRichText( {\n\tallowedFormats,\n\twithoutInteractiveFormatting,\n\tonChange,\n\t__unstableDependencies = [],\n\t__unstableFormatTypeHandlerContext,\n\t...props\n} ) {\n\tconst {\n\t\tformatTypes,\n\t\tprepareHandlers,\n\t\tvalueHandlers,\n\t\tchangeHandlers,\n\t\tdependencies,\n\t} = useFormatTypes( {\n\t\tallowedFormats,\n\t\twithoutInteractiveFormatting,\n\t\t__unstableFormatTypeHandlerContext,\n\t} );\n\n\tfunction addEditorOnlyFormats( record ) {\n\t\treturn valueHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, record.text ),\n\t\t\trecord.formats\n\t\t);\n\t}\n\n\tfunction removeEditorOnlyFormats( record ) {\n\t\tformatTypes.forEach( ( formatType ) => {\n\t\t\tif ( formatType.__experimentalCreatePrepareEditableTree ) {\n\t\t\t\trecord = removeFormat(\n\t\t\t\t\trecord,\n\t\t\t\t\tformatType.name,\n\t\t\t\t\t0,\n\t\t\t\t\trecord.text.length\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\t\treturn record.formats;\n\t}\n\n\tfunction addInvisibleFormats( record ) {\n\t\treturn prepareHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, record.text ),\n\t\t\trecord.formats\n\t\t);\n\t}\n\n\tconst result = useRichTextBase( {\n\t\t...props,\n\t\tonChange( value, { __unstableFormats, __unstableText } ) {\n\t\t\tonChange( value, { __unstableFormats, __unstableText } );\n\t\t\tObject.values( changeHandlers ).forEach( ( changeHandler ) => {\n\t\t\t\tchangeHandler( __unstableFormats, __unstableText );\n\t\t\t} );\n\t\t},\n\t\t__unstableDependencies: [ ...dependencies, ...__unstableDependencies ],\n\t\t__unstableAfterParse: addEditorOnlyFormats,\n\t\t__unstableBeforeSerialize: removeEditorOnlyFormats,\n\t\t__unstableAddInvisibleFormats: addInvisibleFormats,\n\t} );\n\n\treturn { ...result, formatTypes };\n}\n\nexport function useDeprecatedRichText( props ) {\n\tdeprecated( '`__unstableUseRichText` hook', {\n\t\tsince: '7.0',\n\t} );\n\treturn useRichTextBase( props );\n}\n"],
  "mappings": "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",
  "names": ["deprecated"]
}
