UNPKG

@pierre/diffs

Version:

108 lines (106 loc) 4.15 kB
import { areOptionsEqual } from "../../utils/areOptionsEqual.js"; import { parseMergeConflictDiffFromFile } from "../../utils/parseMergeConflictDiffFromFile.js"; import { UnresolvedFile } from "../../components/UnresolvedFile.js"; import { noopRender } from "../constants.js"; import { useStableCallback } from "./useStableCallback.js"; import { WorkerPoolContext } from "../WorkerPoolContext.js"; import { useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from "react"; //#region src/react/utils/useUnresolvedFileInstance.ts const useIsometricEffect = typeof window === "undefined" ? useEffect : useLayoutEffect; function useUnresolvedFileInstance({ file, options, lineAnnotations, selectedLines, prerenderedHTML, hasConflictUtility, hasGutterRenderUtility, hasCustomHeader, disableWorkerPool }) { const [{ fileDiff, actions, markerRows }, setState] = useState(() => { const { fileDiff: fileDiff$1, actions: actions$1, markerRows: markerRows$1 } = parseMergeConflictDiffFromFile(file, options?.maxContextLines); return { fileDiff: fileDiff$1, actions: actions$1, markerRows: markerRows$1 }; }); const onMergeConflictAction = useStableCallback((payload, instance) => { setState((prevState) => { const { fileDiff: fileDiff$1, actions: actions$1, markerRows: markerRows$1 } = instance.resolveConflict(payload.conflict.conflictIndex, payload.resolution, prevState.fileDiff) ?? {}; if (fileDiff$1 == null || actions$1 == null || markerRows$1 == null) return prevState; else return { fileDiff: fileDiff$1, actions: actions$1, markerRows: markerRows$1 }; }); }); const controlledSelection = selectedLines !== void 0; const poolManager = useContext(WorkerPoolContext); const instanceRef = useRef(null); const ref = useStableCallback((fileContainer) => { if (fileContainer != null) { if (instanceRef.current != null) throw new Error("useUnresolvedFileInstance: An instance should not already exist when a node is created"); instanceRef.current = new UnresolvedFile(mergeUnresolvedOptions({ controlledSelection, hasConflictUtility, hasCustomHeader, hasGutterRenderUtility, onMergeConflictAction, options }), !disableWorkerPool ? poolManager : void 0, true); instanceRef.current.hydrate({ fileDiff, actions, markerRows, fileContainer, lineAnnotations, prerenderedHTML }); } else { if (instanceRef.current == null) throw new Error("useUnresolvedFileInstance: A UnresolvedFile instance should exist when unmounting"); instanceRef.current.cleanUp(); instanceRef.current = null; } }); useIsometricEffect(() => { if (instanceRef.current == null) return; const instance = instanceRef.current; const newOptions = mergeUnresolvedOptions({ controlledSelection, hasConflictUtility, hasCustomHeader, hasGutterRenderUtility, onMergeConflictAction, options }); const forceRender = !areOptionsEqual(instance.options, newOptions); instance.setOptions(newOptions); instance.render({ fileDiff, actions, markerRows, lineAnnotations, forceRender }); if (selectedLines !== void 0) instance.setSelectedLines(selectedLines); }); return { ref, getHoveredLine: useCallback(() => { return instanceRef.current?.getHoveredLine(); }, []), fileDiff, actions, markerRows, getInstance: useCallback(() => { return instanceRef.current ?? void 0; }, []) }; } function mergeUnresolvedOptions({ options, controlledSelection, onMergeConflictAction, hasConflictUtility, hasCustomHeader, hasGutterRenderUtility }) { return { ...options, controlledSelection, onMergeConflictAction, hunkSeparators: options?.hunkSeparators === "custom" ? noopRender : options?.hunkSeparators, mergeConflictActionsType: hasConflictUtility || options?.mergeConflictActionsType === "custom" ? noopRender : options?.mergeConflictActionsType, renderCustomHeader: hasCustomHeader ? noopRender : void 0, renderGutterUtility: hasGutterRenderUtility ? noopRender : void 0 }; } //#endregion export { useUnresolvedFileInstance }; //# sourceMappingURL=useUnresolvedFileInstance.js.map