@@ -5,18 +5,22 @@ import { motion } from "framer-motion";
55import { switchServer , updateAddModalVisible } from "@/app/slices/data" ;
66import { useAppSelector } from "@/app/store" ;
77import { ReactComponent as IconAdd } from "@/assets/icons/add.svg" ;
8- // import { ReactComponent as IconDrag } from "@/assets/icons/drag.svg";
98import { ReactComponent as IconRefresh } from "@/assets/icons/refresh.svg" ;
10- // import { isDarkMode } from "@/utils ";
9+ import { ReactComponent as IconDebug } from "@/assets/icons/debug.svg " ;
1110import ServerTip from "./server-tip" ;
1211import AddServerModal from "./modal-add-server" ;
1312import RemoveServerModal from "./modal-remove-server" ;
14- import { WebviewTag } from "electron" ;
13+ import { WebviewTag , ipcRenderer } from "electron" ;
1514import Tippy from "@tippyjs/react" ;
1615import { hideAll } from "tippy.js" ;
1716import ContextMenu , { MenuItem } from "./context-menu" ;
1817import TitleBar from "./titlebar" ;
19-
18+ // const LevelMap = {
19+ // 0: "verbose",
20+ // 1: "info",
21+ // 2: "warning",
22+ // 3: "error"
23+ // };
2024const Layout = ( ) => {
2125 const [ removeServer , setRemoveServer ] = useState < undefined | string > ( ) ;
2226 const [ reloadVisible , setReloadVisible ] = useState ( false ) ;
@@ -26,6 +30,22 @@ const Layout = () => {
2630 useEffect ( ( ) => {
2731 if ( servers . length == 0 ) {
2832 handleAddServer ( ) ;
33+ } else {
34+ const webviews = [ ...document . querySelectorAll ( "webview" ) ] as WebviewTag [ ] ;
35+ webviews . forEach ( ( webview ) => {
36+ webview . addEventListener ( "dom-ready" , ( ) => {
37+ const url = webview . dataset . src ;
38+ console . log ( `${ url } dom-ready` ) ;
39+ } ) ;
40+ webview . addEventListener ( "console-message" , ( e ) => {
41+ const { level, message, sourceId } = e ;
42+ if ( level == 3 ) {
43+ // error
44+ // console.log("Guest page logged a message:", message, sourceId);
45+ ipcRenderer . send ( "vocechat-logging" , { level, message, sourceId } ) ;
46+ }
47+ } ) ;
48+ } ) ;
2949 }
3050 } , [ servers ] ) ;
3151 const handleSwitch = ( evt : MouseEvent < HTMLLIElement > ) => {
@@ -45,6 +65,12 @@ const Layout = () => {
4565 wv . loadURL ( wv . dataset . src ) ;
4666 }
4767 } ;
68+ const handleOpenWebviewDevTools = ( ) => {
69+ const wv = document . querySelector ( "webview[data-visible='true']" ) as WebviewTag ;
70+ if ( wv && wv . dataset . src ) {
71+ wv . openDevTools ( ) ;
72+ }
73+ } ;
4874 const showContextMenu = ( _key : string ) => {
4975 setMenuVisibleMap ( ( prev ) => {
5076 return {
@@ -92,6 +118,7 @@ const Layout = () => {
92118 >
93119 < aside
94120 className = { clsx (
121+ "relative" ,
95122 "flex h-full w-[66px] flex-col items-center gap-3 bg-neutral-200 dark:bg-gray-900" ,
96123 contextMenuVisible ? "" : "app-drag" ,
97124 isMac ? "pt-8" : "pt-1"
@@ -185,6 +212,13 @@ const Layout = () => {
185212 < IconRefresh className = "outline-none group-hover:stroke-white" />
186213 </ div >
187214 </ ServerTip >
215+ < button
216+ title = "Open DevTools"
217+ onClick = { handleOpenWebviewDevTools }
218+ className = "app-no-drag group absolute bottom-2 left-4 flex h-9 w-9 cursor-pointer items-center justify-center rounded hover:bg-gray-500/50"
219+ >
220+ < IconDebug className = "invisible outline-none group-hover:visible group-hover:stroke-white" />
221+ </ button >
188222 </ aside >
189223 < motion . main className = "relative flex h-full flex-1 items-center justify-center" >
190224 { servers . map ( ( server ) => {
0 commit comments