(props: DiffFileProps<T>)
| 919 | // --------------------------------------------------------------------------- |
| 920 | |
| 921 | function DiffViewer<T>(props: DiffFileProps<T>) { |
| 922 | let instance: FileDiff<T> | undefined |
| 923 | let instanceVirtualizer: Virtualizer | undefined |
| 924 | let instanceWorkerPool: ReturnType<typeof getWorkerPool> |
| 925 | let instanceVirtualHunkSeparators: FileDiffOptions<T>["hunkSeparators"] | undefined |
| 926 | let instanceFileDiff: FileDiffMetadata | undefined |
| 927 | let instanceBefore: FileContents | undefined |
| 928 | let instanceAfter: FileContents | undefined |
| 929 | let dragSide: DiffSelectionSide | undefined |
| 930 | let dragEndSide: DiffSelectionSide | undefined |
| 931 | let viewer!: Viewer |
| 932 | |
| 933 | const [local, others] = splitProps(props, diffKeys) |
| 934 | |
| 935 | const mobile = createMediaQuery("(max-width: 640px)") |
| 936 | |
| 937 | const lineFromMouseEvent = (event: MouseEvent): MouseHit => mouseHit(event, findDiffLineNumber, diffMouseSide) |
| 938 | |
| 939 | const setSelectedLines = (range: SelectedLineRange | null, preserve?: { root: ShadowRoot; text: Range }) => { |
| 940 | const active = instance |
| 941 | if (!active) return |
| 942 | |
| 943 | const fixed = fixDiffSelection(viewer.getRoot(), range) |
| 944 | if (fixed === undefined) { |
| 945 | viewer.lastSelection = range |
| 946 | return |
| 947 | } |
| 948 | |
| 949 | viewer.lastSelection = fixed |
| 950 | active.setSelectedLines(fixed) |
| 951 | restoreShadowTextSelection(preserve?.root, preserve?.text) |
| 952 | } |
| 953 | |
| 954 | const adapter: ModeAdapter = { |
| 955 | lineFromMouseEvent, |
| 956 | setSelectedLines, |
| 957 | updateSelection: (preserveTextSelection) => { |
| 958 | const root = viewer.getRoot() |
| 959 | if (!root) return |
| 960 | |
| 961 | const selected = readShadowLineSelection({ |
| 962 | root, |
| 963 | lineForNode: findDiffLineNumber, |
| 964 | sideForNode: diffSelectionSide, |
| 965 | preserveTextSelection, |
| 966 | }) |
| 967 | if (!selected) return |
| 968 | |
| 969 | if (selected.text) { |
| 970 | setSelectedLines(selected.range, { root, text: selected.text }) |
| 971 | return |
| 972 | } |
| 973 | |
| 974 | setSelectedLines(selected.range) |
| 975 | }, |
| 976 | buildDragSelection: () => { |
| 977 | if (viewer.dragStart === undefined || viewer.dragEnd === undefined) return |
| 978 | const selected: SelectedLineRange = { start: viewer.dragStart, end: viewer.dragEnd } |
no test coverage detected