/** * WordPress dependencies */ import { select as doSelect, useSelect, useDispatch, } from '@safe-wordpress/data'; /** * External dependencies */ import clsx from 'clsx'; import { noop } from 'lodash'; import { useDrop } from 'react-dnd'; import { store as NC_CALENDAR, useDraggingItem } from '@nelio-content/calendar'; import { store as NC_DATA } from '@nelio-content/data'; import { isRecurringMessage, isRecurringSource } from '@nelio-content/utils'; import type { DraggableItemSummary, Maybe } from '@nelio-content/types'; export type TrashProps = { readonly children: string | JSX.Element; }; export const Trash = ( { children }: TrashProps ): JSX.Element | null => { const item = useDraggingItem(); const canTrash = useCanTrash( item ); const trash = useTrash(); const [ { isHovered }, drop ] = useDrop( { accept: [ 'post', 'social', 'task' ], drop: trash, collect: ( monitor ) => ( { isHovered: monitor.canDrop() && monitor.isOver(), } ), } ); if ( ! canTrash ) { return null; } return (
{ children }
); }; // ===== // HOOKS // ===== const useCanTrash = ( item: Maybe< DraggableItemSummary > ) => useSelect( ( select ): boolean => { select( NC_DATA ); if ( ! item ) { return false; } switch ( item.type ) { case 'reusable-message': return false; case 'social': const { getSocialMessage, canCurrentUserDeleteSocialMessage, } = select( NC_DATA ); const message = getSocialMessage( item.id ); return canCurrentUserDeleteSocialMessage( message ); case 'task': const { getTask, canCurrentUserDeleteTask } = select( NC_DATA ); const task = getTask( item.id ); return canCurrentUserDeleteTask( task ); case 'post': const { getPost, canCurrentUserDeletePost } = select( NC_DATA ); const post = getPost( item.id ); return canCurrentUserDeletePost( post ); } }, [ item ] ); const useTrash = () => { const { deleteSocialMessage, deleteTask, dragEnd, requestRecurringTrashMode, trashPost, } = useDispatch( NC_CALENDAR ); const trash = ( { id, type }: DraggableItemSummary ) => { switch ( type ) { case 'post': return trashPost( id ); case 'social': { const m = doSelect( NC_DATA ).getSocialMessage( id ); return isRecurringMessage( m ) && ! isRecurringSource( m ) ? requestRecurringTrashMode( { id } ) : deleteSocialMessage( id, isRecurringMessage( m ) && isRecurringSource( m ) ? 'following' : undefined ); } case 'task': return deleteTask( id ); case 'reusable-message': return noop(); } }; return ( item: DraggableItemSummary ) => { void trash( item ); void dragEnd(); return undefined; }; };