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 (
);
};
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;
};