import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react'; import { dimensToCssVars, themeToCssVars } from '../../os/utils/themeToCssVars'; import { applySkinToThemeColors } from '../../os/SkinService'; import { useDarkMode } from '../../os/hooks/useDarkMode'; import { MemoryRouter, useLocation, UNSAFE_NavigationContext, Routes, Route } from 'react-router-dom'; import { IcGlobe, IcBack, IcForward, IcRefresh, IcHome, IcSearch, IcShield, IcNavBack, IcNavForward, IcTabs, IcMoreHoriz, IcClose, IcAdd } from './res/icons'; import { manifest } from './manifest'; import { colors, colorsDark } from './res/colors'; import { colorStates, colorStatesDark } from './res/colors.states'; import { dimens } from './res/dimens'; import { anim } from './res/anim'; import { useBrowserStore } from './state'; import type { Tab } from './state'; import { useAppNavigationHandler } from '../../os/hooks/useAppNavigationHandler'; import { useBrowserGestures } from './hooks/useBrowserGestures'; // --- Navigation Handler --- const BrowserNavigationHandler: React.FC = () => { const location = useLocation(); const { back } = useBrowserGestures(); const { navigator } = React.useContext(UNSAFE_NavigationContext); const historyIndexRef = useRef(0); useEffect(() => { const memoryNavigator = navigator as any; if (typeof memoryNavigator.index === 'number') { historyIndexRef.current = memoryNavigator.index; } }, [location, navigator]); const handleBackPress = useCallback((): boolean => { const memoryNavigator = navigator as any; const currentIndex = typeof memoryNavigator.index === 'number' ? memoryNavigator.index : historyIndexRef.current; if (currentIndex > 0) { back(); return true; } return false; }, [back, navigator]); useAppNavigationHandler('browser', { onBack: handleBackPress }); return null; }; // --- Home Component --- const BrowserHome: React.FC<{ onNavigate: (url: string) => void }> = ({ onNavigate }) => { const [input, setInput] = useState(''); const recommendations = [ { name: '维基百科', url: 'https://zh.m.wikipedia.org', icon: 'https://zh.wikipedia.org/favicon.ico', color: 'bg-white' }, { name: 'GitHub', url: 'https://github.com', icon: 'https://github.com/favicon.ico', color: 'bg-black' }, { name: '百度', url: 'https://www.baidu.com', icon: 'https://www.baidu.com/favicon.ico', color: 'bg-blue-500' }, { name: 'Bilibili', url: 'https://m.bilibili.com', icon: 'https://www.bilibili.com/favicon.ico', color: 'bg-pink-400' }, { name: '知乎', url: 'https://www.zhihu.com', icon: 'https://www.zhihu.com/favicon.ico', color: 'bg-blue-600' }, { name: 'React', url: 'https://react.dev', icon: 'https://react.dev/favicon.ico', color: 'bg-sky-400' }, { name: 'Google', url: 'https://www.google.com', icon: 'https://www.google.com/favicon.ico', color: 'bg-white' }, { name: 'Bing', url: 'https://www.bing.com', icon: 'https://www.bing.com/favicon.ico', color: 'bg-white' }, ]; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!input.trim()) return; onNavigate(input.trim()); }; return (

Browser

setInput(e.target.value)} placeholder="搜索或输入网址" className="w-full h-16 pl-14 pr-6 bg-slate-100/80 backdrop-blur-sm rounded-[24px] text-lg outline-none border-2 border-transparent focus:border-blue-500/20 focus:bg-white focus:shadow-xl transition-all" />
{recommendations.map((item) => ( ))}
); }; // --- WebView Component --- const BrowserView: React.FC<{ url: string }> = ({ url }) => { const [isLoading, setIsLoading] = useState(true); return (
{url}
{url ? (