import { normallizeStyles } from 'uni-shared' import { weexGetSystemInfoSync } from '../api/device/system' import { setStatusBarStyle } from '../bridge' import { getCurrentPages } from './page' const ON_THEME_CHANGE = 'api.onThemeChange' function onThemeChange (callback = () => { }) { UniServiceJSBridge.on(ON_THEME_CHANGE, callback) } function offThemeChange (callback = () => { }) { UniServiceJSBridge.off(ON_THEME_CHANGE, callback) } function getNavigatorStyle () { return plus.navigator.getUIStyle() === 'dark' ? 'light' : 'dark' } export function changePagesNavigatorStyle () { if (__uniConfig.darkmode) { const theme = getNavigatorStyle() setStatusBarStyle(theme) const pages = getCurrentPages(true) pages.forEach((page) => { page.$page.meta.statusBarStyle = theme }) } } export function parseTheme (pageStyle) { if (__uniConfig.darkmode) { let parsedStyle = {} let theme = plus.navigator.getUIStyle() const systemInfo = weexGetSystemInfoSync() // 小程序 SDK if (systemInfo && systemInfo.hostTheme) { theme = systemInfo.hostTheme } parsedStyle = normallizeStyles(pageStyle, __uniConfig.themeConfig, theme) return parsedStyle } return pageStyle } export function useTabBarThemeChange (tabBar, options) { if (__uniConfig.darkmode) { const fn = () => { const { list = [], color, selectedColor, backgroundColor, borderStyle } = parseTheme(options, false) const tabbarStyle = { color, selectedColor, backgroundColor, borderStyle } tabBar && tabBar.setTabBarStyle(tabbarStyle) tabBar && tabBar.setTabBarItems({ list: list.map((item) => ({ iconPath: item.iconPath, selectedIconPath: item.selectedIconPath, visible: item.visible })) }) // TODO 暂未实现 // tabBar && tabBar.setAnimationAlphaBGColor(parseTheme((__uniConfig.window || {}).backgroundColor, false)) } fn() onThemeChange(fn) } } export function useWebviewThemeChange (webview, getWebviewStyle) { if (__uniConfig.darkmode) { const fn = () => { const webviewStyle = getWebviewStyle() const style = { animationAlphaBGColor: webviewStyle.animationAlphaBGColor, background: webviewStyle.background, backgroundColorBottom: webviewStyle.backgroundColorBottom, backgroundColorTop: webviewStyle.backgroundColorTop } var titleNView = webviewStyle.titleNView if (typeof titleNView !== 'undefined') { style.titleNView = typeof titleNView === 'object' ? { backgroundColor: titleNView.backgroundColor, titleColor: titleNView.titleColor } : titleNView } webview && webview.setStyle(webviewStyle) } onThemeChange(fn) webview.addEventListener('close', () => offThemeChange(fn)) } }