From 68a9c01027efebe42ab440fa34bc09fa7bdcf7d2 Mon Sep 17 00:00:00 2001 From: Tomas Mirchev Date: Tue, 1 Jul 2025 13:46:32 +0000 Subject: [PATCH] add view socket --- reader/src/App.jsx | 99 +---------- reader/src/ViewPage.jsx | 323 ++++++++++++++++++++++++++++++++++++ reader/src/icons/Icons.jsx | 19 +++ resource-provider/server.js | 58 +++---- 4 files changed, 372 insertions(+), 127 deletions(-) create mode 100644 reader/src/ViewPage.jsx diff --git a/reader/src/App.jsx b/reader/src/App.jsx index c873adf..abd0978 100644 --- a/reader/src/App.jsx +++ b/reader/src/App.jsx @@ -28,104 +28,10 @@ import { VRuleIcon, } from "./icons/Icons"; import ResourcePage from "./ResourcePage.jsx"; -import NamePage from "./NamePage.jsx"; -import io from "socket.io-client"; - -//const socket = io("http://localhost:3000"); +import { ViewPage, EditViewPage } from "./ViewPage.jsx"; const DIVIDER_AT = 16; -//function SocketTest() { -// const [booleanArray, setBooleanArray] = useState(new Array(10).fill(false)); -// const [isConnected, setIsConnected] = useState(false); -// -// useEffect(() => { -// // Connection status -// socket.on("connect", () => { -// setIsConnected(true); -// console.log("Connected to server"); -// }); -// -// socket.on("disconnect", () => { -// setIsConnected(false); -// console.log("Disconnected from server"); -// }); -// -// // Listen for array updates -// socket.on("arrayChanged", (newArray) => { -// setBooleanArray(newArray); -// }); -// -// // Cleanup on unmount -// return () => { -// socket.off("connect"); -// socket.off("disconnect"); -// socket.off("arrayChanged"); -// }; -// }, []); -// -// const toggleValue = (index) => { -// const newValue = !booleanArray[index]; -// -// // Emit update to server -// socket.emit("setArrayValue", { index, value: newValue }); -// }; -// -// const refreshArray = () => { -// socket.emit("getArray"); -// }; -// -// return ( -//
-//

Socket.IO Boolean Array

-// -//
-// Status:{" "} -// -// {isConnected ? "Connected" : "Disconnected"} -// -//
-// -// -// -//
-// {booleanArray.map((value, index) => ( -// -// ))} -//
-// -//
-//

Current Array:

-//
{JSON.stringify(booleanArray)}
-//
-//
-// ); -//} - -const contextClass = { - success: "bg-blue-600", - error: "bg-red-600", - info: "bg-gray-600", - warning: "bg-orange-400", - default: "bg-indigo-600", - dark: "bg-white-600 font-gray-300", -}; - export function App() { return ( <> @@ -143,7 +49,8 @@ export function App() { } /> } /> - } /> + } /> + } /> diff --git a/reader/src/ViewPage.jsx b/reader/src/ViewPage.jsx new file mode 100644 index 0000000..b085251 --- /dev/null +++ b/reader/src/ViewPage.jsx @@ -0,0 +1,323 @@ +import { useState, useEffect, useMemo, useRef } from "react"; +import io from "socket.io-client"; +import { useStore } from "./store.js"; +import { marked } from "marked"; +import { TextIncreaseIcon, TextDecreaseIcon, HeartIcon } from "./icons/Icons.jsx"; + +const socket = io(import.meta.env.VITE_API_BASE_URL); + +export function ViewPage() { + const iframeRef = useRef(null); + const config = useStore((state) => state.config); + const changeConfig = useStore((state) => state.changeConfig); + + const [isConnected, setIsConnected] = useState(false); + const [data, setData] = useState(null); + const [selectedOptionId, setSelectedOptionId] = useState(null); + const [selectedIdx, setSelectedIdx] = useState(0); + + const options = useMemo(() => { + return data?.options.map((option) => { + let fileContent = option.text || "**No Data!**"; + fileContent = marked.parse(fileContent); + + fileContent = ` + + + + + + + + + ${fileContent} + + + `; + return { ...option, text: fileContent }; + }); + }, [data?.options]); + + useEffect(() => { + socket.on("connect", () => setIsConnected(true)); + socket.on("disconnect", () => setIsConnected(false)); + socket.on("dataChanged", (newData) => { + setData(newData); + setSelectedOptionId(null); + setSelectedIdx(0); + }); + + return () => { + socket.off("connect"); + socket.off("disconnect"); + }; + }, []); + + useEffect(() => { + if (iframeRef.current && iframeRef.current.contentDocument) { + iframeRef.current.contentDocument.body.style.zoom = `${config.contentZoomLevel}%`; + } + }, [config.contentZoomLevel]); + + if (!data) { + return ( +
+
+ Status:{" "} + + {isConnected ? "Connected" : "Disconnected"} + +
+
+ ); + } + + return ( +
+
+ {data.title} +
+
+
+