import { createCampaignPage, getCampaignOptionsWindowData, updateCampaignStatus, useCampaignEntityRecord } from '@givewp/campaigns/utils'; import { useDispatch } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import cx from 'classnames'; import { useForm } from 'react-hook-form'; import { ArrowReverse, TrashIcon, ViewIcon } from '../Icons'; import { Campaign } from '../types'; import ArchivedCampaignNotice from './Components/Notices/ArchivedCampaignNotice'; import styles from './CampaignDetailsPage.module.scss'; import AdminDetailsPage from '@givewp/components/AdminDetailsPage'; import ConfirmationDialog from '@givewp/components/AdminDetailsPage/ConfirmationDialog'; import tabDefinitions from './Tabs/definitions'; import '@givewp/campaigns/store'; const StatusBadge = ({ status }: { status: string }) => { const statusMap = { active: __('Active', 'give'), archived: __('Archived', 'give'), }; return (

{statusMap[status]}

); }; export default function CampaignsDetailsPage({ campaignId }) { const { adminUrl } = getCampaignOptionsWindowData(); const [isCreatingPage, setIsCreatingPage] = useState(false); const [showConfirmationDialog, setShowConfirmationDialog] = useState(null); const dispatch = useDispatch(`givewp/admin-details-page-notifications`); const { receiveEntityRecords } = useDispatch(coreStore); const { record: campaign } = useCampaignEntityRecord(campaignId); const methods = useForm({ mode: 'onBlur', shouldFocusError: true, }); const { setValue } = methods; // Show campaign archived notice useEffect(() => { if (campaign?.status !== 'archived') { return; } dispatch.addNotice({ id: 'update-archive-notice', type: 'warning', content: (onDismiss) => ( { onDismiss(); updateStatus('active'); }} /> ), }); }, [campaign?.status]); const updateStatus = async (status: 'archived' | 'active') => { const campaignStatusResponse = await updateCampaignStatus(campaign.id, status); if (campaignStatusResponse) { receiveEntityRecords('givewp', 'campaign', campaignStatusResponse, undefined, false); setValue('status', campaignStatusResponse?.status); dispatch.addSnackbarNotice({ id: `save-success`, content: getMessageByStatus(status), }); } else { dispatch.addSnackbarNotice({ id: `save-error`, type: 'error', content: __('Failed to update campaign status', 'give'), }); } }; async function handleCampaignPageCreation() { setIsCreatingPage(true); const campaignPageResponse = await createCampaignPage(campaign.id); setIsCreatingPage(false); if (campaignPageResponse) { receiveEntityRecords('givewp', 'campaign', {...campaign, pageId: campaignPageResponse?.id}, undefined, false); setValue('pageId', campaignPageResponse?.id); dispatch.addSnackbarNotice({ id: `save-success`, content: __('Campaign page created', 'give'), }); } else { dispatch.addSnackbarNotice({ id: `save-error`, type: 'error', content: __('Failed to create campaign page', 'give'), }); } } const SecondaryActionButton = ({ className }: { className: string }) => { return ( !isCreatingPage && campaign.pageId > 0 ? ( {__('Edit campaign page', 'give')} ) : ( ) ); }; const ContextMenuItems = ({ className }: { className: string }) => { return ( <> {campaign.pagePermalink && ( {__('View Campaign', 'give')} )} {campaign.status === 'archived' ? ( { updateStatus('active'); dispatch.dismissNotification('update-archive-notice'); }} > {__('Move to Active', 'give')} ) : ( setShowConfirmationDialog('archive')} > {__('Archive Campaign', 'give')} )} ); }; return ( } SecondaryActionButton={SecondaryActionButton} ContextMenuItems={ContextMenuItems} > setShowConfirmationDialog(null)} handleConfirm={() => { updateStatus('archived'); setShowConfirmationDialog(null); }} > {__('Are you sure you want to archive your campaign? All forms associated with this campaign will be inaccessible to donors.', 'give')} ); } const getMessageByStatus = (status: string) => { switch (status) { case 'archived': return __('Campaign is moved to archive', 'give'); case 'active': return __('Campaign is now active', 'give'); } return null; };