import { FolderKanban, Home, Monitor, Palette, Search, UserRound, } from 'lucide-react'; import { type ComponentType, type FormEvent, lazy, Suspense, useCallback, useEffect, useState, } from 'react'; import { PlatformMudPointWalletEntry } from '../../../packages/shared/src/components/PlatformMudPointWalletEntry'; import { PlatformProfileRechargeModal } from '../../../packages/shared/src/components/PlatformProfileRechargeModal'; import { PlatformProfileWalletLedgerModal } from '../../../packages/shared/src/components/PlatformProfileWalletLedgerModal'; import type { ProfileDashboardSummary } from '../../../packages/shared/src/contracts/runtime'; import { pushAppHistoryPath, replaceAppHistoryPath, } from '../../routing/activeAppPageRoutes'; import { getPlatformProfileDashboard } from '../../services/platform-entry/platformProfileClient'; import { usePlatformWalletLifecycle, usePlatformWalletStore, } from '../../stores/usePlatformWalletStore'; import { useAuthUi } from '../auth/AuthUiContext'; import { FLOATING_FEEDBACK_FORM_URL } from '../common/floatingFeedbackEntryModel'; import { PlatformActionButton } from '../common/PlatformActionButton'; import { PlatformSubpanel } from '../common/PlatformSubpanel'; import { resolveActivePublicUserCode, resolveActiveUserAvatarLabel, } from './platformActiveProfileModel'; import { PlatformActiveProfileView } from './PlatformActiveProfileView'; import type { PlatformEntryFlowShellProps } from './platformEntryActiveTypes'; import { usePlatformDesktopLayout } from './platformEntryResponsive'; import { PlatformProfileApiKeysModal } from './PlatformProfileApiKeysModal'; import { PlatformProfileReferralModal } from './PlatformProfileReferralModal'; import { PlatformProfileRewardCodeRedeemModal } from './PlatformProfileRewardCodeRedeemModal'; import { PlatformRechargePaymentConfirmationMask, PlatformRechargePaymentResultDialog, } from './PlatformRechargePaymentStatusDialogs'; import { usePlatformProfileCenterController } from './usePlatformProfileCenterController'; const ImageCanvasEditorView = lazy(async () => { const module = await import('../image-editor/ImageCanvasEditorView'); return { default: module.ImageCanvasEditorView }; }); const CreationLandingView = lazy(async () => { const module = await import('../creation-home/CreationLandingView'); return { default: module.CreationLandingView }; }); const ProjectGalleryView = lazy(async () => { const module = await import('../project/ProjectGalleryView'); return { default: module.ProjectGalleryView }; }); type ActiveRailButtonProps = { active: boolean; emphasized?: boolean; icon: ComponentType<{ className?: string }>; iconSrc: string; label: string; onClick: () => void; }; function ActiveRailButton({ active, emphasized = false, icon: Icon, iconSrc, label, onClick, }: ActiveRailButtonProps) { return ( ); } function ActiveBottomNavButton({ active, emphasized = false, icon: Icon, label, onClick, }: Omit) { return ( ); } function ActivePlatformBrand() { return ( 陶泥 GENARRATIVE ); } function LoadingPanel({ label }: { label: string }) { return (
{label}
); } function MobileCreationDesktopGuide({ onReturnHome, }: { onReturnHome: () => void; }) { return (

请在桌面端打开创作工具

图片画布、项目管理和素材库需要更大的操作空间。

); } export function PlatformEntryFlowShellImpl({ selectionStage, setSelectionStage, }: PlatformEntryFlowShellProps) { const authUi = useAuthUi(); const [dashboard, setDashboard] = useState( null, ); const [isLoadingDashboard, setIsLoadingDashboard] = useState(false); const [isApiKeysOpen, setIsApiKeysOpen] = useState(false); const [searchInput, setSearchInput] = useState(''); const [activeSearchKeyword, setActiveSearchKeyword] = useState(''); const [isMobileDesktopGuideOpen, setIsMobileDesktopGuideOpen] = useState(false); const isDesktopLayout = usePlatformDesktopLayout(); const currentWalletOwnerUserId = authUi?.canAccessProtectedData && authUi.user?.id ? authUi.user.id : null; usePlatformWalletLifecycle( currentWalletOwnerUserId, Boolean(authUi?.canAccessProtectedData), ); const walletOwnerUserId = usePlatformWalletStore( (state) => state.ownerUserId, ); const storedMudPointBalance = usePlatformWalletStore( (state) => state.mudPointBalance, ); const storedLegacyWalletBalance = usePlatformWalletStore( (state) => state.legacyWalletBalance, ); const storedMudPointBalanceStatus = usePlatformWalletStore( (state) => state.mudPointBalanceStatus, ); const storedMudPointBalanceError = usePlatformWalletStore( (state) => state.mudPointBalanceError, ); const walletOwnerMatchesCurrentUser = Boolean(currentWalletOwnerUserId) && walletOwnerUserId === currentWalletOwnerUserId; const mudPointBalance = walletOwnerMatchesCurrentUser ? storedMudPointBalance : null; const mudPointBalanceError = walletOwnerMatchesCurrentUser ? storedMudPointBalanceError : ''; const isWalletBalanceLoading = Boolean(currentWalletOwnerUserId) && (!walletOwnerMatchesCurrentUser || storedMudPointBalanceStatus === 'idle' || storedMudPointBalanceStatus === 'loading'); const refreshDashboard = useCallback(async () => { if (!authUi?.user || !authUi.canAccessProtectedData) { setDashboard(null); return; } setIsLoadingDashboard(true); try { setDashboard(await getPlatformProfileDashboard()); } catch { setDashboard(null); } finally { setIsLoadingDashboard(false); } }, [authUi?.canAccessProtectedData, authUi?.user]); useEffect(() => { void refreshDashboard(); }, [refreshDashboard]); const isProfileStage = selectionStage === 'profile'; const profileCenter = usePlatformProfileCenterController({ activeTab: isProfileStage ? 'profile' : 'project', isAuthenticated: Boolean(authUi?.user), showRechargeEntry: true, requestLogin: () => authUi?.openLoginModal(), currentUser: authUi?.user, }); const legacyWalletBalance = walletOwnerMatchesCurrentUser ? (storedLegacyWalletBalance ?? profileCenter.rechargeCenter?.walletBalance ?? null) : null; const openCreation = useCallback(() => { if (!isDesktopLayout) { setIsMobileDesktopGuideOpen(true); return; } pushAppHistoryPath('/creation'); setSelectionStage('creation-home', { path: '/creation' }); }, [isDesktopLayout, setSelectionStage]); const openProjects = useCallback(() => { if (!isDesktopLayout) { setIsMobileDesktopGuideOpen(true); return; } pushAppHistoryPath('/project'); setSelectionStage('project', { path: '/project' }); }, [isDesktopLayout, setSelectionStage]); const openProfile = useCallback(() => { pushAppHistoryPath('/profile'); setSelectionStage('profile', { path: '/profile' }); }, [setSelectionStage]); const openEditorProject = useCallback( (projectId: string, options?: { guide?: boolean; tool?: string }) => { if (!isDesktopLayout) { setIsMobileDesktopGuideOpen(true); return; } const params = new URLSearchParams(); params.set('projectid', projectId); if (options?.guide) { params.set('guide', 'toolbar'); } if (options?.tool) { params.set('tool', options.tool); } const path = `/editor/canvas?${params.toString()}`; pushAppHistoryPath(path); setSelectionStage('image-editor', { path }); }, [isDesktopLayout, setSelectionStage], ); const replaceWithProjectGallery = useCallback(() => { replaceAppHistoryPath('/project'); setSelectionStage('project', { path: '/project' }); }, [setSelectionStage]); const isMobileToolStage = !isDesktopLayout && (selectionStage === 'creation-home' || selectionStage === 'project' || selectionStage === 'image-editor'); if ((!isDesktopLayout && isMobileDesktopGuideOpen) || isMobileToolStage) { return ( { setIsMobileDesktopGuideOpen(false); if (selectionStage === 'platform') { return; } setSelectionStage('platform', { path: '/' }); }} /> ); } if (selectionStage === 'image-editor') { return (
}>
); } const isAuthenticated = Boolean(authUi?.user); const balance = mudPointBalance?.totalPoints ?? legacyWalletBalance; const isCreationStage = !isProfileStage && (selectionStage === 'platform' || selectionStage === 'creation-home'); const avatarUrl = authUi?.user?.avatarUrl?.trim() || null; const avatarLabel = resolveActiveUserAvatarLabel(authUi?.user); const publicUserCode = resolveActivePublicUserCode(authUi?.user); const openRecharge = () => { profileCenter.setIsRechargeOpen(true); profileCenter.loadRechargeCenter(); }; const openUserSurface = () => { if (isAuthenticated) { authUi?.openAccountModal(); return; } authUi?.openLoginModal(); }; const openFeedback = () => { window.open(FLOATING_FEEDBACK_FORM_URL, '_blank', 'noopener,noreferrer'); }; const submitSearch = (event: FormEvent) => { event.preventDefault(); const keyword = searchInput.trim(); setActiveSearchKeyword(keyword); if (isProfileStage) { openCreation(); } }; return ( <>
{isAuthenticated ? ( ) : null}
{isProfileStage ? ( authUi?.openLoginModal()} onOpenApiKeys={() => setIsApiKeysOpen(true)} onOpenCommunity={() => profileCenter.openProfilePopupPanel('community') } onOpenFeedback={openFeedback} onOpenRecharge={openRecharge} onOpenRewardCode={profileCenter.openRewardCodeModal} onOpenSettings={() => authUi?.openSettingsModal()} onOpenWalletLedger={profileCenter.openWalletLedgerPanel} onUserUpdated={(user) => authUi?.setCurrentUser(user)} /> ) : isCreationStage ? ( } > ) : ( }> )}
{profileCenter.isRechargeOpen ? ( profileCenter.setIsRechargeOpen(false)} onRetry={profileCenter.loadRechargeCenter} onBuy={profileCenter.buyRechargeProduct} onConfirmNativePayment={profileCenter.confirmNativeWechatPayment} onCloseNativePayment={profileCenter.closeNativeWechatPayment} /> ) : null} {profileCenter.isRewardCodeOpen ? ( profileCenter.setIsRewardCodeOpen(false)} /> ) : null} {profileCenter.profilePopupPanel ? ( ) : null} {isApiKeysOpen ? ( setIsApiKeysOpen(false)} /> ) : null} {profileCenter.isWalletLedgerOpen ? ( profileCenter.setIsWalletLedgerOpen(false)} onRetry={profileCenter.loadWalletLedger} /> ) : null} {profileCenter.rechargePaymentResult ? ( profileCenter.setRechargePaymentResult(null)} /> ) : null} {profileCenter.wechatRechargeOrderConfirmationState ? ( ) : null} ); } export default PlatformEntryFlowShellImpl;