import React, { useState } from 'react'; import { useIntl } from 'react-intl'; import { IconButton, SidePanel, Text, useNotification } from '@box/blueprint-web'; import { XMark } from '@box/blueprint-web-assets/icons/Fill/index'; import { FileDefault } from '@box/blueprint-web-assets/icons/Line/index'; import { AutofillContextProvider, FormValues, JSONPatchOperations, MetadataInstance, MetadataInstanceForm, type MetadataTemplateField, } from '@box/metadata-editor'; import type { Selection } from 'react-aria-components'; import type { BoxItem, Collection } from '../../common/types/core'; import type { MetadataTemplate } from '../../common/types/metadata'; import { useTemplateInstance, useSelectedItemText } from './utils'; import messages from '../common/messages'; import './MetadataSidePanel.scss'; export interface MetadataSidePanelProps { currentCollection: Collection; metadataTemplate: MetadataTemplate; isEditing: boolean; onEditingChange: (isEditing: boolean) => void; onClose: () => void; onUpdate: ( items: BoxItem[], operations: JSONPatchOperations, templateOldFields: MetadataTemplateField[], templateNewFields: MetadataTemplateField[], successCallback: () => void, errorCallback: ErrorCallback, ) => Promise; refreshCollection: () => void; selectedItemIds: Selection; } const MetadataSidePanel = ({ currentCollection, metadataTemplate, isEditing, onEditingChange, onClose, onUpdate, refreshCollection, selectedItemIds, }: MetadataSidePanelProps) => { const { addNotification } = useNotification(); const { formatMessage } = useIntl(); const [isUnsavedChangesModalOpen, setIsUnsavedChangesModalOpen] = useState(false); const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds); const selectedItems = selectedItemIds === 'all' ? currentCollection.items : currentCollection.items.filter(item => selectedItemIds.has(item.id)); const templateInstance = useTemplateInstance(metadataTemplate, selectedItems, isEditing); const handleMetadataInstanceEdit = () => { onEditingChange(true); }; const handleMetadataInstanceFormCancel = () => { onEditingChange(false); }; const handleMetadataInstanceFormDiscardUnsavedChanges = () => { setIsUnsavedChangesModalOpen(false); onEditingChange(false); }; const handleUpdateMetadataSuccess = () => { addNotification({ closeButtonAriaLabel: formatMessage(messages.close), sensitivity: 'foreground', styledText: formatMessage(messages.metadataUpdateSuccessNotification, { numSelected: selectedItems.length, }), typeIconAriaLabel: formatMessage(messages.success), variant: 'success', }); onEditingChange(false); refreshCollection(); }; const handleUpdateMetadataError = () => { addNotification({ closeButtonAriaLabel: formatMessage(messages.close), sensitivity: 'foreground', styledText: formatMessage(messages.metadataUpdateErrorNotification), typeIconAriaLabel: formatMessage(messages.error), variant: 'error', }); }; const handleMetadataInstanceFormSubmit = async (values: FormValues, operations: JSONPatchOperations) => { const { fields: templateNewFields } = values.metadata; const { fields: templateOldFields } = templateInstance; await onUpdate( selectedItems, operations, templateOldFields, templateNewFields, handleUpdateMetadataSuccess, handleUpdateMetadataError, ); }; return (
{formatMessage(messages.sidebarMetadataTitle)}
{selectedItemText}
{isEditing ? ( ) : ( )}
); }; export default MetadataSidePanel;