import { extend, hasOwn } from '@vue/shared' import { removePlatformStyle } from '../pages' import { AppWindowOptions, PageWindowOptions, TabBar } from './types' function trimJson(json: Record) { delete json.maxWidth delete json.topWindow delete json.leftWindow delete json.rightWindow if (json.tabBar) { delete json.tabBar.matchMedia } return json } function convert( to: Record, from: Record, map: Record ) { Object.keys(map).forEach((key) => { if (hasOwn(from, map[key])) { to[key] = from[map[key]] } }) return to } export function parseWindowOptions( style: UniApp.PagesJsonPageStyle, platform: UniApp.PLATFORM, windowOptionsMap?: Record ): PageWindowOptions | AppWindowOptions { if (!style) { return { component: true, } } const platformStyle = style[platform] || {} removePlatformStyle(trimJson(style) as any) const res: PageWindowOptions | AppWindowOptions = { component: true, } if (windowOptionsMap) { return extend(convert(res, style, windowOptionsMap), platformStyle) } return extend(res, style, platformStyle) } function trimTabBarJson(tabBar: UniApp.TabBarOptions) { ;( [ 'fontSize', 'height', 'iconWidth', 'midButton', 'selectedIndex', 'spacing', ] as const ).forEach((name) => { delete tabBar[name] }) return tabBar } export function parseTabBar( tabBar: UniApp.TabBarOptions, platform: UniApp.PLATFORM, tabBarOptionsMap?: Record, tabBarItemOptionsMap?: Record ): TabBar { const platformStyle = (tabBar as any)[platform] || {} removePlatformStyle(trimTabBarJson(tabBar) as any) const res = {} as TabBar if (tabBarOptionsMap) { if (tabBarItemOptionsMap && tabBar.list) { tabBar.list = tabBar.list.map((item) => { return convert( {}, item, tabBarItemOptionsMap ) as UniApp.TabBarItemOptions }) } convert(res, tabBar, tabBarOptionsMap) return extend(res, platformStyle) } return extend(res, tabBar, platformStyle) }