browser / src /components /Browser.tsx
no-name-here's picture
Upload 86 files
9b63060 verified
import React, { useRef, useEffect, useState } from 'react';
import ChromeTabBar from './ChromeTabBar';
import ChromeAddressBar from './ChromeAddressBar';
import ChromeBookmarkBar from './ChromeBookmarkBar';
import SummaryPanel from './SummaryPanel';
import ScriptPanel from './ScriptPanel';
import IframeManager, { IframeManagerRef } from './IframeManager';
import MessageHandler from './MessageHandler';
import { useBrowserState } from '@/hooks/useBrowserState';
import { useChromeTabs } from '@/hooks/useChromeTabs';
const Browser = () => {
const iframeRef = useRef<IframeManagerRef>(null);
const [showBookmarkBar] = useState(true);
const [showScriptPanel, setShowScriptPanel] = useState(false);
const {
bookmarks,
summary,
isSummaryVisible,
canGoBack,
canGoForward,
loadUrl,
goBack,
goForward,
addBookmark,
setSummaryAndShow,
hideSummary
} = useBrowserState();
const {
tabs,
activeTab,
addNewTab,
selectTab,
closeTab,
updateTabTitle,
updateTabUrl
} = useChromeTabs();
const loadUrlIntoIframe = async (url: string, pushToHistory = true) => {
if (iframeRef.current && activeTab) {
await iframeRef.current.loadUrl(url);
updateTabUrl(activeTab.id, url);
if (pushToHistory) {
await loadUrl(url, true);
}
}
};
const handleBack = async () => {
const prevUrl = goBack();
if (prevUrl) {
await loadUrlIntoIframe(prevUrl, false);
}
};
const handleForward = async () => {
const nextUrl = goForward();
if (nextUrl) {
await loadUrlIntoIframe(nextUrl, false);
}
};
const handleRefresh = () => {
if (iframeRef.current) {
iframeRef.current.refresh();
}
};
const handleHome = () => {
const homeUrl = 'https://www.example.com/';
loadUrlIntoIframe(homeUrl);
};
const handleSummarize = () => {
if (iframeRef.current) {
iframeRef.current.requestSummary();
}
};
const handleShowScriptPanel = () => {
setShowScriptPanel(true);
};
const handleCloseScriptPanel = () => {
setShowScriptPanel(false);
};
const handleInjectScript = (script: string) => {
if (iframeRef.current) {
iframeRef.current.injectScript(script);
}
};
const handleNavigateToBookmark = (url: string) => {
loadUrlIntoIframe(url);
};
const handleTitleChange = (title: string) => {
if (activeTab) {
updateTabTitle(activeTab.id, title);
}
};
useEffect(() => {
if (activeTab) {
loadUrlIntoIframe(activeTab.url);
}
}, [activeTab?.id]);
useEffect(() => {
// Load default page for initial tab
const defaultUrl = 'https://www.example.com/';
loadUrlIntoIframe(defaultUrl);
}, []);
return (
<div className="h-screen w-screen overflow-hidden bg-gray-100 flex flex-col">
<MessageHandler
onNavigate={loadUrlIntoIframe}
onSummary={setSummaryAndShow}
onTitleChange={handleTitleChange}
/>
<ChromeTabBar
tabs={tabs}
onTabSelect={selectTab}
onTabClose={closeTab}
onNewTab={addNewTab}
/>
<ChromeAddressBar
currentUrl={activeTab?.url}
onNavigate={loadUrlIntoIframe}
onBack={handleBack}
onForward={handleForward}
onRefresh={handleRefresh}
onHome={handleHome}
onBookmark={addBookmark}
onSummarize={handleSummarize}
onShowScriptPanel={handleShowScriptPanel}
canGoBack={canGoBack}
canGoForward={canGoForward}
/>
<ChromeBookmarkBar
bookmarks={bookmarks}
onNavigateToBookmark={handleNavigateToBookmark}
isVisible={showBookmarkBar}
/>
<div className="relative flex-1">
<SummaryPanel
summary={summary}
isVisible={isSummaryVisible}
onClose={hideSummary}
/>
{showScriptPanel && (
<ScriptPanel
onInjectScript={handleInjectScript}
onClose={handleCloseScriptPanel}
/>
)}
<IframeManager
ref={iframeRef}
onTitleChange={handleTitleChange}
/>
</div>
</div>
);
};
export default Browser;