/* eslint-disable react-hooks/exhaustive-deps */ import {useDocumentOperation} from '@sanity/react-hooks' import React, {useCallback, useContext, useMemo, useState} from 'react' import {unstable_useDocumentPairPermissions as useDocumentPairPermissions} from '@sanity/base/hooks' import {Box, Stack, Button, Grid, Text, useClickOutside} from '@sanity/ui' import {useConditionalReadOnly} from '@sanity/base/_internal' import {undoChange} from '../changes/undoChange' import {isFieldChange} from '../helpers' import {isPTSchemaType} from '../../types/portableText/diff' import {GroupChangeNode, OperationsAPI} from '../../types' import {useHover} from '../../utils/useHover' import {pathsAreEqual} from '../../paths' import {DiffContext} from '../contexts/DiffContext' import {ChangeBreadcrumb} from './ChangeBreadcrumb' import {ChangeResolver} from './ChangeResolver' import {DocumentChangeContext} from './DocumentChangeContext' import {RevertChangesButton} from './RevertChangesButton' import {ChangeListWrapper, GroupChangeContainer, PopoverWrapper} from './GroupChange.styled' export function GroupChange({ change: group, readOnly, hidden, ...restProps }: {change: GroupChangeNode; readOnly?: boolean; hidden?: boolean} & React.HTMLAttributes< HTMLDivElement >): React.ReactElement | null { const {titlePath, changes, path: groupPath} = group const {path: diffPath} = useContext(DiffContext) const {documentId, schemaType, FieldWrapper, rootDiff, isComparingCurrent} = useContext( DocumentChangeContext ) const conditionalReadOnly = useConditionalReadOnly() ?? readOnly const isPortableText = changes.every( (change) => isFieldChange(change) && isPTSchemaType(change.schemaType) ) const isNestedInDiff = pathsAreEqual(diffPath, groupPath) const [hoverRef, isHoveringRevert] = useHover() const docOperations = useDocumentOperation(documentId, schemaType.name) as OperationsAPI const [confirmRevertOpen, setConfirmRevertOpen] = useState(false) const [revertButtonElement, setRevertButtonElement] = useState(null) const [permissions, isPermissionsLoading] = useDocumentPairPermissions({ id: documentId, type: schemaType.name, permission: 'update', }) const handleRevertChanges = useCallback(() => undoChange(group, rootDiff, docOperations), [ group, rootDiff, docOperations, ]) const handleRevertChangesConfirm = useCallback(() => { setConfirmRevertOpen(true) }, []) const closeRevertChangesConfirmDialog = useCallback(() => { setConfirmRevertOpen(false) }, []) useClickOutside(() => setConfirmRevertOpen(false), [revertButtonElement]) const setRevertButtonRef = useCallback( (el: HTMLDivElement | null) => { hoverRef.current = el setRevertButtonElement(el) }, [hoverRef] ) const content = useMemo( () => ( {changes.map((change) => ( {isComparingCurrent && !isPermissionsLoading && permissions?.granted && ( Are you sure you want to revert the changes? } portal padding={4} placement={'left'} open={confirmRevertOpen} ref={setRevertButtonElement} > )} ), [conditionalReadOnly, hidden, confirmRevertOpen, isPermissionsLoading, permissions] ) return hidden ? null : ( {isNestedInDiff || !FieldWrapper ? ( content ) : ( {content} )} ) }