/** * WordPress dependencies */ import { Button, ExternalLink } from '@safe-wordpress/components'; import { useDispatch, useSelect } from '@safe-wordpress/data'; import { useMemo } from '@safe-wordpress/element'; import { _x } from '@safe-wordpress/i18n'; /** * External dependencies */ import clsx from 'clsx'; import { keyBy, values, without } from 'lodash'; import { DeleteButton } from '@nelio-content/components'; import { store as NC_DATA, useAuthorName, withSubscriptionCheck, } from '@nelio-content/data'; import { store as NC_TASK_EDITOR, TaskEditor, } from '@nelio-content/task-editor'; import { createTask, getHumanDateDue } from '@nelio-content/utils'; import type { AuthorId, EditorialTask, PostId, PostStatusSlug, PostTypeName, Url, } from '@nelio-content/types'; /** * Internal dependencies */ import { TaskPresets } from './task-presets'; import { store as NC_POST_EDITOR } from '../../store'; import { useIsSaving } from '../../hooks'; export const Tasks = (): JSX.Element => ; const InternalTasks = withSubscriptionCheck( 'raw/editorial-tasks', () => (
) ); // ======= // HELPERS // ======= const TaskList = (): JSX.Element | null => { const tasks = useSelect( ( select ) => select( NC_POST_EDITOR ).getTasks(), [] ); return ( ); }; const TaskListActions = (): JSX.Element => { const post = usePost(); const { openTaskPresetLoader } = useDispatch( NC_POST_EDITOR ); const { openNewTaskEditor } = useDispatch( NC_TASK_EDITOR ); const { addTask } = useTaskActions(); const { canEditSettings, hasTaskPresets, settingsUrl } = useSelect( ( select ) => ( { canEditSettings: select( NC_DATA ).canCurrentUserManagePlugin(), hasTaskPresets: !! select( NC_DATA ).getTaskPresets().length, settingsUrl: select( NC_DATA ).getAdminUrl( '/admin.php?page=nelio-content-settings&subpage=tools--task-presets' ), } ), [] ); const isSaving = useIsSaving(); return ( <>
{ hasTaskPresets && ( ) }
{ ! isSaving && ! hasTaskPresets && canEditSettings && (
{ _x( 'Create reusable task presets now', 'user', 'nelio-content' ) }
) } ); }; const Task = ( { task }: { task: EditorialTask } ) => { const assignee = useAuthorName( task.assigneeId, _x( 'Unknown Assignee', 'text', 'nelio-content' ) ); const date = getHumanDateDue( undefined, task.dateType, task.dateValue ); const post = usePost(); const isSaving = useIsSaving(); const { editTask, deleteTask } = useTaskActions(); const { openExistingTaskEditor } = useDispatch( NC_TASK_EDITOR ); const onEdit = () => openExistingTaskEditor( task, { post, context: 'post', onSave: editTask, } ); return (
  • { task.task }
    { `${ assignee } • ${ date }` }
    deleteTask( task ) } />
  • ); }; // ===== // HOOKS // ===== const usePost = () => { const title = useSelect( ( s ) => s( NC_POST_EDITOR ).getTitle(), [] ); const type = useSelect( ( s ) => s( NC_POST_EDITOR ).getPostType(), [] ); const author = useSelect( ( s ) => s( NC_POST_EDITOR ).getAuthorId(), [] ); const date = useSelect( ( s ) => s( NC_POST_EDITOR ).getDateValue(), [] ); const status = useSelect( ( s ) => s( NC_POST_EDITOR ).getPostStatus(), [] ); return useMemo( () => ( { id: 0 as PostId, title, type: type || ( 'post' as PostTypeName ), author: author || ( 0 as AuthorId ), date, status: status || ( 'draft' as PostStatusSlug ), viewLink: '' as Url, } ), [ title, type, author, date, status ] ); }; const useTaskActions = () => { const tasks = useSelect( ( select ) => select( NC_POST_EDITOR ).getTasks(), [] ); const { setTasks } = useDispatch( NC_POST_EDITOR ); return { addTask: ( t: EditorialTask ) => setTasks( [ ...tasks, t ] ), editTask: ( t: EditorialTask ) => setTasks( values( keyBy( [ ...tasks, t ], 'id' ) ) ), deleteTask: ( t: EditorialTask ) => setTasks( without( tasks, t ) ), }; };