import React, { useEffect, useMemo, useState } from 'react'; import { TabBar } from './components.jsx'; import { HomeCardsScreen, HomeListScreen, HomeFeedScreen, HomeTimelineXScreen, HomeSplashScreen } from './screens/screens-home.jsx'; import { BookingSpecsScreen, BookingDoctorScreen, BookingTimeScreen, BookingConfirmScreen, BookingSuccessScreen, DoctorsTabScreen, DoctorDetailScreen, } from './screens/screens-booking.jsx'; import { ApptsTabScreen, ApptDetailScreen, ResultsScreen, ResultAudioScreen, ResultEndoscopyScreen, RecoveryScreen, AudioTestScreen, ProfileTabScreen, QRScreen, TelemedScreen, MedcardScreen, NotificationsScreen, } from './screens/screens-misc.jsx'; import { ChatsListScreen, ChatConversationScreen } from './screens/screens-chats.jsx'; import { ArticlesScreen, ArticleDetailScreen } from './screens/screens-articles.jsx'; import { HomeV2Screen, SearchScreen, ContactsScreen, PricesScreen } from './screens/screens-v2.jsx'; import { DevColorsScreen, DevExamplesScreen } from './screens/screens-dev.jsx'; import { DocsScreen } from './screens/screens-docs.jsx'; import { ProfilePlateScreen, ApptsPlateScreen, ApptDetailPlateScreen, MedcardPlateScreen } from './screens/screens-plate.jsx'; function renderScreen(screenId, nav, ctx) { const parts = screenId.split(':'); const id = parts[0]; const plate = ctx.design === 'plate'; // В plate-режиме главная всегда «Светлая плитка», независимо от homeVariant const homeVariant = plate ? 'splash' : ctx.homeVariant; const HOME = { cards: HomeCardsScreen, list: HomeListScreen, feed: HomeFeedScreen, timelineX: HomeTimelineXScreen, splash: HomeSplashScreen }[homeVariant] || HomeCardsScreen; // Plate-подмены (fallback на Клод если plate-версии нет) if (plate) { switch (id) { case 'profile': return ; case 'appts': return ; case 'appt': return ; case 'medcard': return ; } } switch (id) { case 'home': return ; case 'home-v2': return ; case 'doctors': return ; case 'doctor': return ; case 'booking-specs': return ; case 'booking-doctor': return ; case 'booking-time': return ; case 'booking-confirm': return ; case 'booking-success': return ; case 'appts': return ; case 'appt': return ; case 'results': return ; case 'result-audio': return ; case 'result': return ; case 'recovery': return ; case 'audiotest': return ; case 'chat': return parts[1] ? : ; case 'profile': return ; case 'qr': return ; case 'telemed': return ; case 'medcard': return ; case 'notifications': return ; case 'articles': return ; case 'article': return ; case 'search': return ; case 'contacts': return ; case 'prices': return ; case 'dev-colors': return ; case 'dev-examples': return ; case 'docs': return ; default: return
Экран не найден: {screenId}
; } } const TAB_IDS = ['home', 'appts', 'doctors', 'chat', 'profile']; export function PhoneApp({ initialScreen, ctx, onCurrentChange }) { const [stack, setStack] = useState([initialScreen]); useEffect(() => { setStack([initialScreen]); }, [initialScreen]); const current = stack[stack.length - 1]; useEffect(() => { if (onCurrentChange) onCurrentChange(current); }, [current, onCurrentChange]); const nav = useMemo(() => ({ push: (id) => setStack(s => [...s, id]), pop: () => setStack(s => s.length > 1 ? s.slice(0, -1) : s), set: (id) => setStack([id]), reset:() => setStack(['home']), }), []); const rootId = current.split(':')[0]; const hasSubId = current.includes(':'); const tabId = hasSubId ? null : (rootId === 'home-v2' ? 'home' : (TAB_IDS.includes(rootId) ? rootId : null)); const showTabBar = tabId !== null; const modalScreens = ['qr', 'telemed', 'booking-success', 'audiotest']; const isModal = modalScreens.includes(current.split(':')[0]); return (
{renderScreen(current, nav, ctx)}
{showTabBar && !isModal && ( nav.set(t)} /> )}
); }