Files
purewhiter--mobilegym/apps/Map/navigation.declaration.ts
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

450 lines
13 KiB
TypeScript

import { NavigationDeclaration, ScrollContainerDeclaration } from './navigation.types';
const MAIN_SCROLL: ScrollContainerDeclaration[] = [
{ name: 'main', direction: 'vertical', description: '主内容区' },
];
export const NAVIGATION_DECLARATION = {
app: 'map',
routes: [
// =========================
// Main Tabs
// =========================
{
path: '/',
component: 'ExplorePage',
params: {},
entryPoint: 'home',
scrollContainers: [], // Map view itself usually isn't a standard scroll container in this context, but maybe bottom sheet is. keeping empty for now or maybe 'bottomSheet'
uiStates: [
{ id: 'explore.base', search: {}, description: '探索首页-地图视图' },
{
id: 'explore.category_search',
search: { category: 'string' },
description: '探索-分类搜索结果(如购物)',
actions: [
{ id: 'placeResults.sheet.close', label: '关闭搜索结果', behavior: 'submit' },
{
id: 'placeResults.result.select.item',
label: '点击搜索结果',
behavior: 'select',
scope: 'item',
paramsSchema: { itemId: 'string' },
},
],
},
],
queryParams: {},
description: '探索',
},
{
path: '/me',
component: 'MePage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'me.base', search: {}, description: '我-个人页(列表/保存)' },
],
queryParams: {},
description: '我的',
},
{
path: '/contribute',
component: 'ContributePage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'contribute.base', search: {}, description: '贡献首页' },
],
queryParams: {},
description: '贡献',
},
// =========================
// Sub Pages
// =========================
{
path: '/search',
component: 'SearchPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{
id: 'search.base',
search: {},
description: '搜索页-历史记录',
actions: [
{
id: 'search.bar.input',
label: '搜索地点',
behavior: 'input',
paramsSchema: { value: 'string' },
},
{
id: 'search.voice.tap',
label: '语音搜索',
behavior: 'other', // Or just a button that triggers a mock voice UI
}
]
},
],
queryParams: {},
description: '搜索页',
},
// =========================
// Profile & Settings
// =========================
{
path: '/profile',
component: 'ProfilePage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'profile.base', search: {}, description: '个人资料菜单' }],
queryParams: {},
description: '个人资料',
},
{
path: '/settings',
component: 'SettingsPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.base', search: {}, description: '设置主页' }],
queryParams: {},
description: '设置',
},
{
path: '/settings/app-display',
component: 'AppDisplayPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.app-display.base', search: {}, description: '应用和显示设置' }],
queryParams: {},
description: '应用和显示',
},
{
path: '/settings/app-display/language',
component: 'LanguagePage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{
id: 'settings.app-display.language.base',
search: {},
description: '应用语言',
actions: [
{ id: 'settings.appDisplay.language.select.system', label: '选择系统默认语言', behavior: 'select' },
{ id: 'settings.appDisplay.language.select.zhHans', label: '选择中文', behavior: 'select' },
{ id: 'settings.appDisplay.language.select.en', label: '选择英文', behavior: 'select' },
],
},
],
queryParams: {},
description: '应用语言',
},
{
path: '/settings/nav',
component: 'NavSettingsPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.nav.base', search: {}, description: '导航设置' }],
queryParams: {},
description: '导航设置',
},
{
path: '/settings/getting-around',
component: 'GettingAroundPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.getting-around.base', search: {}, description: '出行设置' }],
queryParams: {},
description: '出行',
},
{
path: '/settings/location-privacy',
component: 'LocationPrivacyPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.location-privacy.base', search: {}, description: '位置信息和隐私' }],
queryParams: {},
description: '位置信息和隐私',
},
{
path: '/settings/offline-maps',
component: 'OfflineMapsSettingsPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.offline-maps.base', search: {}, description: '离线地图设置' }],
queryParams: {},
description: '离线地图',
},
{
path: '/settings/notifications',
component: 'NotificationsPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.notifications.base', search: {}, description: '通知设置' }],
queryParams: {},
description: '通知',
},
{
path: '/settings/notifications/traffic',
component: 'TrafficInfoPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.notifications.traffic.base', search: {}, description: '交通信息通知' }],
queryParams: {},
description: '交通信息',
},
{
path: '/settings/notifications/traffic/:subId',
component: 'TrafficSubPage',
params: { subId: 'string' },
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.notifications.traffic.sub.base', search: {}, description: '交通信息子页' }],
queryParams: {},
description: '交通信息详情',
},
{
path: '/settings/notifications/recommendations',
component: 'RecommendationsPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.notifications.rec.base', search: {}, description: '个性化推荐通知' }],
queryParams: {},
description: '个性化推荐',
},
{
path: '/settings/notifications/recommendations/:subId',
component: 'RecommendationSubPage',
params: { subId: 'string' },
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [{ id: 'settings.notifications.rec.sub.base', search: {}, description: '推荐子页' }],
queryParams: {},
description: '推荐详情',
},
],
transitions: [
// =========================
// Tab Switching
// =========================
{
id: 'tab.explore',
from: ['/me', '/contribute'],
to: '/',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到探索',
ui: { placement: 'tabbar', icon: 'tab_explore', gesture: 'tap' },
},
{
id: 'tab.me',
from: ['/', '/contribute'],
to: '/me',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到我',
ui: { placement: 'tabbar', icon: 'tab_me', gesture: 'tap' },
},
{
id: 'tab.contribute',
from: ['/', '/me'],
to: '/contribute',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到贡献',
ui: { placement: 'tabbar', icon: 'tab_contribute', gesture: 'tap' },
},
// =========================
// Search Flow
// =========================
{
id: 'search.open',
from: '/',
to: '/search',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开搜索页',
ui: { placement: 'topbar', icon: 'search_bar', gesture: 'tap' },
},
// =========================
// Profile & Settings Flow
// =========================
{
id: 'profile.open',
from: '/',
to: '/profile',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开个人资料',
ui: { placement: 'topbar', icon: 'avatar', gesture: 'tap' },
},
{
id: 'settings.open',
from: '/profile',
to: '/settings',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开设置',
ui: { placement: 'content', icon: 'settings', gesture: 'tap' },
},
{
id: 'settings.app-display.open',
from: '/settings',
to: '/settings/app-display',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开应用和显示',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.app-display.language.open',
from: '/settings/app-display',
to: '/settings/app-display/language',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开应用语言',
ui: { placement: 'content', icon: 'language_item', gesture: 'tap' },
},
{
id: 'settings.nav.open',
from: '/settings',
to: '/settings/nav',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开导航设置',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.getting-around.open',
from: '/settings',
to: '/settings/getting-around',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开出行设置',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.location-privacy.open',
from: '/settings',
to: '/settings/location-privacy',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开位置信息和隐私',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.offline-maps.open',
from: '/settings',
to: '/settings/offline-maps',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开离线地图设置',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.notifications.open',
from: '/settings',
to: '/settings/notifications',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开通知设置',
ui: { placement: 'content', icon: 'settings_item', gesture: 'tap' },
},
{
id: 'settings.notifications.traffic.open',
from: '/settings/notifications',
to: '/settings/notifications/traffic',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开交通信息',
ui: { placement: 'content', icon: 'traffic_info', gesture: 'tap' },
},
{
id: 'settings.notifications.traffic.sub.open',
from: '/settings/notifications/traffic',
to: '/settings/notifications/traffic/:subId',
search: {},
searchParams: {},
mode: 'push',
params: { subId: 'string' },
label: '打开交通信息子页',
ui: { placement: 'content', icon: 'traffic_sub_item', gesture: 'tap' },
},
{
id: 'settings.notifications.recommendations.open',
from: '/settings/notifications',
to: '/settings/notifications/recommendations',
search: {},
searchParams: {},
mode: 'push',
params: {},
label: '打开个性化推荐',
ui: { placement: 'content', icon: 'recommendation', gesture: 'tap' },
},
{
id: 'settings.notifications.rec.sub.open',
from: '/settings/notifications/recommendations',
to: '/settings/notifications/recommendations/:subId',
search: {},
searchParams: {},
mode: 'push',
params: { subId: 'string' },
label: '打开推荐子页',
ui: { placement: 'content', icon: 'rec_sub_item', gesture: 'tap' },
},
],
capabilities: {
historyBack: true,
},
} as const satisfies NavigationDeclaration;
export type TransitionId = typeof NAVIGATION_DECLARATION.transitions[number]['id'];