/**
* External Dependencies
*/
import { useState } from 'react';
import cx from 'classnames';
import { useFormContext } from 'react-hook-form';
/**
* WordPress Dependencies
*/
import { __, _n, sprintf } from '@wordpress/i18n';
/**
* Internal Dependencies
*/
import { CancelIcon, TrashIcon } from '@givewp/components/AdminDetailsPage/Icons';
import AdminDetailsPage from '@givewp/components/AdminDetailsPage';
import ConfirmationDialog from '@givewp/components/AdminDetailsPage/ConfirmationDialog';
import { getSubscriptionOptionsWindowData, useSubscriptionEntityRecord } from '@givewp/subscriptions/utils';
import tabDefinitions from './Tabs/definitions';
import { useSubscriptionAmounts } from '@givewp/subscriptions/hooks';
import { useDispatch } from '@wordpress/data';
import { store as coreDataStore } from '@wordpress/core-data';
import useSubscriptionSync from '@givewp/subscriptions/hooks/useSubscriptionSync';
import SubscriptionSyncList from '../SubscriptionSyncList';
import styles from './SubscriptionDetailsPage.module.scss';
import CancelSubscriptionDialog from './components/CancelSubscriptionDialog';
const { subscriptionStatuses } = getSubscriptionOptionsWindowData();
/**
* @since 4.8.0
*/
const StatusBadge = ({ status, isTest }: { status: string, isTest: boolean }) => {
const statusMap = subscriptionStatuses;
if (!statusMap[status]) {
return null;
}
return (
<>
{statusMap[status]}
{isTest && (
{__('Test Subscription', 'give')}
)}
>
);
};
/**
* @since 4.8.0
*/
export default function SubscriptionDetailsPage() {
const { adminUrl, subscriptionsAdminUrl } = getSubscriptionOptionsWindowData();
const [showConfirmationDialog, setShowConfirmationDialog] = useState(null);
const [hasSyncBeenPerformed, setHasSyncBeenPerformed] = useState(false);
// Get subscription ID from URL parameters
const urlParams = new URLSearchParams(window.location.search);
const subscriptionId = urlParams.get('id');
const { record: subscription } = useSubscriptionEntityRecord(subscriptionId ? parseInt(subscriptionId) : undefined);
const { formatter } = useSubscriptionAmounts(subscription);
const { deleteEntityRecord } = useDispatch(coreDataStore);
const { syncSubscription, isLoading, hasResolved, syncResult } = useSubscriptionSync();
const subscriptionCanSync = subscription?.gateway?.canSync;
const PageTitle = () => {
if (subscription?.amount?.value == null) {
return null;
}
const periodsLabels = {
day: _n('day', 'days', subscription?.frequency, 'give'),
week: _n('week', 'weeks', subscription?.frequency, 'give'),
month: _n('month', 'months', subscription?.frequency, 'give'),
quarter: _n('quarter', 'quarters', subscription?.frequency, 'give'),
year: _n('year', 'years', subscription?.frequency, 'give'),
};
const period = [
__('every', 'give'),
subscription?.frequency > 1 ? subscription?.frequency : '',
periodsLabels[subscription?.period],
].filter(Boolean).join(' ');
return (
<>
{formatter.format(subscription?.amount?.value)} {period}
>
);
};
function SecondaryActionButton({ className }: { className: string }) {
return (
{
setShowConfirmationDialog('sync');
setHasSyncBeenPerformed(false);
}}
>
{__('Sync subscription', 'give')}
);
}
const ContextMenuItems = ({ className }: { className: string }) => {
return (
<>
{subscription?.status !== 'cancelled' ? (
setShowConfirmationDialog('cancel')}
>
{__('Cancel subscription', 'give')}
) : (
setShowConfirmationDialog('delete')}
>
{__('Trash subscription', 'give')}
)}
>
);
};
/**
* @since 4.8.0
*/
const handleDelete = async () => {
try {
await deleteEntityRecord('givewp', 'subscription', subscription?.id, { force: false })
window.location.href = subscriptionsAdminUrl;
} catch (error) {
setShowConfirmationDialog(null);
}
};
/**
* @since 4.8.0
*/
const handleSyncSubscription = async () => {
try {
await syncSubscription(subscription);
setHasSyncBeenPerformed(true);
console.log('Sync result:', syncResult);
} catch (error) {
console.error('Sync failed:', error);
setShowConfirmationDialog(null);
}
};
return (
}
SecondaryActionButton={subscriptionCanSync && SecondaryActionButton}
StatusBadge={() => }
ContextMenuItems={ContextMenuItems}
>
setShowConfirmationDialog(null)}
handleConfirm={handleDelete}
>
{__('Are you sure you want to move this subscription to the trash? You can restore it later if needed.', 'give')}
{
setShowConfirmationDialog(null);
}}
handleConfirm={handleSyncSubscription}
footer={
hasSyncBeenPerformed && hasResolved && syncResult?.notice && (
)
}
>
{hasSyncBeenPerformed && hasResolved ? : __('This will update the subscription details using the most recent data from the gateway. However, no changes will be made to existing payments.', 'give')}
);
}