/** * 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 ( ); } 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 && (
{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')}
); }