import { __, sprintf } from '@wordpress/i18n'; import { useState, useMemo } from '@wordpress/element'; import { Button, Icon } from '@wordpress/components'; import { useDispatch } from '@wordpress/data'; import { reusableBlock } from '@wordpress/icons'; import { store as noticesStore } from '@wordpress/notices'; import { TodoSettingsBlock, FeatureSettingsBlock, } from '../../../ReusableComponents/SettingsBlocks'; import { Content, ContentWrapper } from '../../../ReusableComponents/Elements'; import SettingsCard from '../../../ReusableComponents/SettingsCard'; import { TITLE_BADGE_POSITIVE } from '../../../ReusableComponents/TitleBadge'; import { CommonStoreName, TodosStoreName, CommonHooks, TodosHooks, } from '../../../../data'; import { getFeatures } from '../Components/Overview/features-config'; import { NOTIFICATION_ERROR, NOTIFICATION_SUCCESS, } from '../../../ReusableComponents/Icons'; import SpinnerOverlay from '../../../ReusableComponents/SpinnerOverlay'; const TabOverview = () => { const { isReady: areTodosReady } = TodosHooks.useStore(); const { isReady: merchantIsReady } = CommonHooks.useStore(); // TODO: Workaround before we implement the standard "persistentData" resolver. // Calling this hook ensures that todos are loaded from the REST API at this point. const {} = TodosHooks.useTodos(); if ( ! areTodosReady || ! merchantIsReady ) { return ; } return (
); }; export default TabOverview; const OverviewTodos = () => { const [ isResetting, setIsResetting ] = useState( false ); const { todos, dismissTodo } = TodosHooks.useTodos(); const { isReady: areTodosReady } = TodosHooks.useStore(); const { setActiveModal, setActiveHighlight } = useDispatch( CommonStoreName ); const { resetDismissedTodos, setDismissedTodos } = useDispatch( TodosStoreName ); const { createSuccessNotice } = useDispatch( noticesStore ); const showTodos = areTodosReady && todos.length > 0; const resetHandler = async () => { setIsResetting( true ); try { await setDismissedTodos( [] ); await resetDismissedTodos(); createSuccessNotice( __( 'Dismissed items restored successfully.', 'woocommerce-paypal-payments' ), { icon: NOTIFICATION_SUCCESS } ); } finally { setIsResetting( false ); } }; if ( ! showTodos ) { return null; } return (

{ __( 'Complete these tasks to keep your store updated with the latest products and services.', 'woocommerce-paypal-payments' ) }

} >
); }; const OverviewFeatures = () => { const [ isRefreshing, setIsRefreshing ] = useState( false ); const { merchant, features: merchantFeatures } = CommonHooks.useMerchantInfo(); const { refreshFeatureStatuses, setActiveModal } = useDispatch( CommonStoreName ); const { createSuccessNotice, createErrorNotice } = useDispatch( noticesStore ); // Get the features data with access to setActiveModal const featuresData = useMemo( () => getFeatures( setActiveModal ), [ setActiveModal ] ); // Map merchant features status to the config const features = useMemo( () => { return featuresData.map( ( feature ) => { const merchantFeature = merchantFeatures?.[ feature.id ]; return { ...feature, enabled: merchantFeature?.enabled ?? false, }; } ); }, [ featuresData, merchantFeatures ] ); const refreshHandler = async () => { setIsRefreshing( true ); try { const result = await refreshFeatureStatuses(); if ( result && ! result.success ) { const errorMessage = sprintf( /* translators: %s: error message */ __( 'Operation failed: %s Check WooCommerce logs for more details.', 'woocommerce-paypal-payments' ), result.message || __( 'Unknown error', 'woocommerce-paypal-payments' ) ); createErrorNotice( errorMessage, { icon: NOTIFICATION_ERROR, } ); console.error( 'Failed to refresh features:', result.message || 'Unknown error' ); } else { createSuccessNotice( __( 'Features refreshed successfully.', 'woocommerce-paypal-payments' ), { icon: NOTIFICATION_SUCCESS, } ); } } finally { setIsRefreshing( false ); } }; return ( } contentContainer={ false } > { features.map( ( { id, ...feature } ) => ( ) ) } ); }; const OverviewFeatureItem = ( { isBusy, isSandbox, title, description, buttons, enabled, notes, } ) => { const getButtonUrl = ( button ) => { if ( button.urls ) { return isSandbox ? button.urls.sandbox : button.urls.live; } return button.url; }; const visibleButtons = buttons.filter( ( button ) => ! button.showWhen || // Learn more buttons ( enabled && button.showWhen === 'enabled' ) || ( ! enabled && button.showWhen === 'disabled' ) ); const actionProps = { isBusy, enabled, notes, buttons: visibleButtons.map( ( button ) => ( { ...button, url: getButtonUrl( button ), } ) ), }; if ( enabled ) { actionProps.badge = { text: __( 'Active', 'woocommerce-paypal-payments' ), type: TITLE_BADGE_POSITIVE, }; } return ( ); }; const OverviewFeatureDescription = ( { refreshHandler, isRefreshing } ) => { const buttonLabel = isRefreshing ? __( 'Refreshing…', 'woocommerce-paypal-payments' ) : __( 'Refresh', 'woocommerce-paypal-payments' ); return ( <>

{ __( 'Enable additional features and capabilities on your WooCommerce store.', 'woocommerce-paypal-payments' ) }

{ __( 'Click Refresh to update your current features after making changes.', 'woocommerce-paypal-payments' ) }

); }; const OverviewHelp = () => { return ( ); };