import { useContext, useEffect, useState } from 'react' import LargeArrayNode from './large-array-node' import { JsonViewContext } from './json-view' import { CustomizeOptions } from '../types' import { customAdd, customCopy, customDelete, editableAdd, editableDelete, ifDisplay, isCollapsed, isCollapsed_largeArray } from '../utils' import { ReactComponent as AngleDownSVG } from '../svgs/angle-down.svg' import CopyButton from './copy-button' import { ReactComponent as DeleteSVG } from '../svgs/trash.svg' import { ReactComponent as AddSVG } from '../svgs/add-square.svg' import { ReactComponent as DoneSVG } from '../svgs/done.svg' import { ReactComponent as CancelSVG } from '../svgs/cancel.svg' interface Props { node: Array depth: number indexOrName?: number | string deleteHandle?: (_: string | number) => void customOptions?: CustomizeOptions } export default function LargeArray({ node, depth, deleteHandle: _deleteSelf, indexOrName, customOptions }: Props) { const nestCollapsedArray: any[] = [] for (let i = 0; i < node.length; i += 100) { nestCollapsedArray.push(node.slice(i, i + 100)) } const { collapsed, enableClipboard, collapseObjectsAfterLength, editable, onDelete, src, onAdd, onEdit, onChange, forceUpdate, displaySize } = useContext(JsonViewContext) const [fold, setFold] = useState(isCollapsed_largeArray(node, depth, indexOrName, collapsed, collapseObjectsAfterLength, customOptions)) useEffect(() => { setFold(isCollapsed_largeArray(node, depth, indexOrName, collapsed, collapseObjectsAfterLength, customOptions)) }, [collapsed, collapseObjectsAfterLength]) // Delete self const [deleting, setDeleting] = useState(false) const deleteSelf = () => { setDeleting(false) if (_deleteSelf) _deleteSelf(indexOrName!) if (onDelete) onDelete({ value: node, depth, src, indexOrName: indexOrName!, parentType: 'array' }) if (onChange) onChange({ type: 'delete', depth, src, indexOrName: indexOrName!, parentType: 'array' }) } // Add const [adding, setAdding] = useState(false) const add = () => { const arr = node as unknown as any[] arr.push(null) if (onAdd) onAdd({ indexOrName: arr.length - 1, depth, src, parentType: 'array' }) if (onChange) onChange({ type: 'add', indexOrName: arr.length - 1, depth, src, parentType: 'array' }) forceUpdate() } const isEditing = deleting || adding const cancel = () => { setDeleting(false) setAdding(false) } const Icons = ( <> {!fold && !isEditing && ( setFold(true)} className='jv-size-chevron'> {ifDisplay(displaySize, depth, fold) && {node.length} Items} )} {isEditing && } {isEditing && } {!fold && !isEditing && enableClipboard && customCopy(customOptions) && } {!fold && !isEditing && editableAdd(editable) && customAdd(customOptions) && ( { add() }} /> )} {!fold && !isEditing && editableDelete(editable) && customDelete(customOptions) && _deleteSelf && ( setDeleting(true)} /> )} ) return ( <> {'['} {Icons} {!fold ? (
{nestCollapsedArray.map((item, index) => ( ))}
) : ( )} {']'} {fold && ifDisplay(displaySize, depth, fold) && ( setFold(false)} className='jv-size'> {node.length} Items )} ) }