import { useEffect, useMemo, useRef, useState } from 'react'; import { ArrowLeft, ExternalLink, Loader2, RefreshCcw, ShoppingBag } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { useYinianStore } from '@/stores/yinian'; import { buildProductCenterSrc, getProductCenterBaseUrl } from './url'; const PRODUCT_CENTER_PARTITION = 'persist:yinian-travel-resource-ordering'; type ProductCenterWebviewElement = HTMLElement & { reload?: () => void; }; export function ProductCenter() { const { t } = useTranslation('appCenter'); const navigate = useNavigate(); const session = useYinianStore((state) => state.session); const webviewRef = useRef(null); const [reloadKey, setReloadKey] = useState(0); const [isLoading, setIsLoading] = useState(true); const baseUrl = useMemo(() => getProductCenterBaseUrl(), []); const embeddedSrc = useMemo(() => buildProductCenterSrc({ baseUrl, reloadKey, session, }), [baseUrl, reloadKey, session]); useEffect(() => { const webview = webviewRef.current; if (!webview) return; const handleStart = () => setIsLoading(true); const handleStop = () => setIsLoading(false); webview.addEventListener('did-start-loading', handleStart); webview.addEventListener('did-stop-loading', handleStop); webview.addEventListener('did-fail-load', handleStop); return () => { webview.removeEventListener('did-start-loading', handleStart); webview.removeEventListener('did-stop-loading', handleStop); webview.removeEventListener('did-fail-load', handleStop); }; }, [reloadKey]); const reloadApp = () => { setIsLoading(true); if (typeof webviewRef.current?.reload === 'function') { webviewRef.current.reload(); return; } setReloadKey((value) => value + 1); }; const openExternal = () => { void window.electron.openExternal(baseUrl); }; return (

{t('productCenter.title')}

{t('productCenter.badge')}
{isLoading && (
{t('productCenter.loading')}

{t('productCenter.loadingDesc')}

)}
); } export default ProductCenter;