Skip to content

Commit

Permalink
[desk-tool] Move undo changes logic to separate file
Browse files Browse the repository at this point in the history
  • Loading branch information
rexxars committed Oct 6, 2020
1 parent 0253027 commit 190a8e4
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
/* eslint-disable max-depth */
import React, {useCallback, Fragment, useContext} from 'react'
import {diffItem} from 'sanity-diff-patch'
import {useDocumentOperation} from '@sanity/react-hooks'
import {Diff, NoDiff, Path} from '@sanity/diff'
import {toString as pathToString} from '@sanity/util/paths'
import {Diff, NoDiff} from '@sanity/diff'
import {FallbackDiff} from '../../../diffs/FallbackDiff'
import {resolveDiffComponent} from '../../../diffs/resolveDiffComponent'
import {Annotation} from '../history/types'
import {SchemaType, ChangeNode, FieldChangeNode, GroupChangeNode} from '../types'
import {buildChangeList} from './buildChangeList'
import {InsertPatch, UnsetPatch, SetPatch, OperationsAPI} from './types'
import {OperationsAPI} from './types'
import {undoChange} from './undoChange'
import styles from './ChangesPanel.css'

type Props = {
Expand Down Expand Up @@ -118,30 +117,3 @@ function ChangeResolver({change, level = 0}: {change: ChangeNode; level: number}
<GroupChange change={change} />
)
}

function undoChange(diff: Diff, path: Path, documentOperations: OperationsAPI) {
const patches = diffItem(diff.toValue, diff.fromValue, {diffMatchPatch: {enabled: false}}, path)

const inserts = patches
.filter((patch): patch is InsertPatch => patch.op === 'insert')
.map(({after, items}) => ({insert: {after, items}}))

const unsets = patches
.filter((patch): patch is UnsetPatch => patch.op === 'unset')
.reduce((acc, patch) => acc.concat(pathToString(patch.path)), [] as string[])

let hasSets = false
const sets = patches
.filter((patch): patch is SetPatch => patch.op === 'set')
.reduce((acc, patch) => {
hasSets = true
acc[pathToString(patch.path)] = patch.value
return acc
}, {} as Record<string, unknown>)

return documentOperations.patch.execute([
...inserts,
...(unsets.length > 0 ? [{unset: unsets}] : []),
...(hasSets ? [{set: sets}] : [])
])
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {diffItem} from 'sanity-diff-patch'
import {Diff, Path} from '@sanity/diff'
import {toString as pathToString} from '@sanity/util/paths'
import {InsertPatch, UnsetPatch, SetPatch, OperationsAPI} from './types'

export function undoChange(diff: Diff, path: Path, documentOperations: OperationsAPI) {
const patches = diffItem(diff.toValue, diff.fromValue, {diffMatchPatch: {enabled: false}}, path)

const inserts = patches
.filter((patch): patch is InsertPatch => patch.op === 'insert')
.map(({after, items}) => ({insert: {after, items}}))

const unsets = patches
.filter((patch): patch is UnsetPatch => patch.op === 'unset')
.reduce((acc, patch) => acc.concat(pathToString(patch.path)), [] as string[])

let hasSets = false
const sets = patches
.filter((patch): patch is SetPatch => patch.op === 'set')
.reduce((acc, patch) => {
hasSets = true
acc[pathToString(patch.path)] = patch.value
return acc
}, {} as Record<string, unknown>)

return documentOperations.patch.execute([
...inserts,
...(unsets.length > 0 ? [{unset: unsets}] : []),
...(hasSets ? [{set: sets}] : [])
])
}

0 comments on commit 190a8e4

Please sign in to comment.