Add Home v2 with universal search, contacts, and prices screens

Home v2 leads with a search-first layout: prominent AI-badged search
field, booking CTA, quick tiles (contacts/prices/results/recovery),
upcoming appointment, clinic stats, and articles.

Search screen: real filtering across doctors, services, symptoms,
articles, and upcoming appointments (date-aware matching). Empty
state shows popular query chips and symptom list.

Contacts: clinic phone card + two address cards with CSS-mocked
building illustrations (windows, roof, sign, trees) and mini-map
(streets, park, building footprints, pin), route/call/video buttons,
transport tip.

Prices: service search + category pills, grouped listing with price
range summary, booking CTA, empty-state reset.

Exposed as "Главная 2" in Tweaks screen selector alongside
"Главная 1" (existing home variants remain under it).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-19 21:45:07 +05:00
parent de96895e9c
commit f9a0cb6b87
3 changed files with 698 additions and 2 deletions
+7 -1
View File
@@ -14,6 +14,7 @@ import {
TelemedScreen, MedcardScreen, NotificationsScreen,
} from './screens/screens-misc.jsx';
import { ArticlesScreen, ArticleDetailScreen } from './screens/screens-articles.jsx';
import { HomeV2Screen, SearchScreen, ContactsScreen, PricesScreen } from './screens/screens-v2.jsx';
function renderScreen(screenId, nav, ctx) {
const parts = screenId.split(':');
@@ -21,6 +22,7 @@ function renderScreen(screenId, nav, ctx) {
const HOME = { cards: HomeCardsScreen, list: HomeListScreen, feed: HomeFeedScreen }[ctx.homeVariant] || HomeCardsScreen;
switch (id) {
case 'home': return <HOME nav={nav} ctx={ctx} />;
case 'home-v2': return <HomeV2Screen nav={nav} ctx={ctx} />;
case 'doctors': return <DoctorsTabScreen nav={nav} ctx={ctx} />;
case 'doctor': return <DoctorDetailScreen nav={nav} doctorId={parts[1]} />;
case 'booking-specs': return <BookingSpecsScreen nav={nav} />;
@@ -43,6 +45,9 @@ function renderScreen(screenId, nav, ctx) {
case 'notifications': return <NotificationsScreen nav={nav} />;
case 'articles': return <ArticlesScreen nav={nav} />;
case 'article': return <ArticleDetailScreen nav={nav} articleId={parts[1]} />;
case 'search': return <SearchScreen nav={nav} />;
case 'contacts': return <ContactsScreen nav={nav} />;
case 'prices': return <PricesScreen nav={nav} />;
default: return <div style={{padding: 40, textAlign: 'center'}}>Экран не найден: {screenId}</div>;
}
}
@@ -62,7 +67,8 @@ export function PhoneApp({ initialScreen, ctx }) {
}), []);
const current = stack[stack.length - 1];
const tabId = TAB_IDS.includes(current.split(':')[0]) ? current.split(':')[0] : null;
const rootId = current.split(':')[0];
const tabId = rootId === 'home-v2' ? 'home' : (TAB_IDS.includes(rootId) ? rootId : null);
const showTabBar = tabId !== null;
const modalScreens = ['qr', 'telemed', 'booking-success', 'audiotest'];