From c9ef4f791d0e27d2aebf0e185a6cb08b34f1b03a Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 10 Jan 2024 01:41:25 +0100 Subject: [PATCH 1/4] Added Function Declaration on Rust Site --- src-tauri/src/app_handle/format_console_text.rs | 6 ++++++ src-tauri/src/main.rs | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src-tauri/src/app_handle/format_console_text.rs diff --git a/src-tauri/src/app_handle/format_console_text.rs b/src-tauri/src/app_handle/format_console_text.rs new file mode 100644 index 0000000..ffa7320 --- /dev/null +++ b/src-tauri/src/app_handle/format_console_text.rs @@ -0,0 +1,6 @@ + +// hello world function +#[tauri::command] +pub fn format_console_text() -> String { + "Hello World from Rust!".to_string() +} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c63f588..674cb0a 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -11,6 +11,7 @@ mod jenkins { mod app_handle { pub mod jenkins_calls; + pub mod format_console_text; } #[tokio::main] @@ -24,7 +25,8 @@ async fn main() { app_handle::jenkins_calls::start_build_with_parameters, app_handle::jenkins_calls::start_build, app_handle::jenkins_calls::get_test_result_data, - app_handle::jenkins_calls::get_jenkins_data + app_handle::jenkins_calls::get_jenkins_data, + app_handle::format_console_text::format_console_text, ]) .setup(|app| { let main_window = app.get_window("main").unwrap(); From f4bdfcd4eca3b8922f28286bc62cd6766dabde56 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 10 Jan 2024 03:04:11 +0100 Subject: [PATCH 2/4] Working URL --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + .../src/app_handle/format_console_text.rs | 58 +++++++++++++++++-- .../Jarvis/Views/ConsoleView/ConsoleView.tsx | 18 +++--- 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 4a92794..7684911 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1805,6 +1805,7 @@ name = "jarvis" version = "0.0.0" dependencies = [ "base64 0.21.6", + "regex", "reqwest", "serde", "serde_json", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 746eec2..7a0f922 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,6 +20,7 @@ reqwest = "0.11.22" tokio = { version = "1.33.0", features = ["full"] } base64 = "0.21.6" window-shadows = "0.2.2" +regex = "1.10.2" [features] # this feature is used for production builds or when `devPath` points to the filesystem diff --git a/src-tauri/src/app_handle/format_console_text.rs b/src-tauri/src/app_handle/format_console_text.rs index ffa7320..185bf1f 100644 --- a/src-tauri/src/app_handle/format_console_text.rs +++ b/src-tauri/src/app_handle/format_console_text.rs @@ -1,6 +1,56 @@ +use std::collections::HashMap; +use regex::Regex; -// hello world function #[tauri::command] -pub fn format_console_text() -> String { - "Hello World from Rust!".to_string() -} \ No newline at end of file +pub fn format_console_text( + console_text: Vec, + chunk_size: usize, + style_dict: HashMap>, +) -> String { + // Define a regex pattern to find URLs + let url_pattern = Regex::new(r"https?://\S+").unwrap(); + + // Split the console text into chunks of size chunk_size and format each chunk. + let mut chunks: Vec = Vec::new(); + let mut chunk: String = String::new(); + + for line in console_text { + if chunk.len() + line.len() > chunk_size { + chunks.push(format_chunk(&chunk, &style_dict, &url_pattern)); + chunk.clear(); + } + chunk.push_str(&line); + chunk.push('\n'); + } + + if !chunk.is_empty() { + chunks.push(format_chunk(&chunk, &style_dict, &url_pattern)); + } + + chunks.join("\n") +} + +// If the chunk contains a URL, wrap it in HTML tags with href. +fn format_chunk( + chunk: &str, + style_dict: &HashMap>, + url_pattern: &Regex, +) -> String { + // Function to replace URLs with HTML tags + fn replace_url_with_link(captures: ®ex::Captures) -> String { + let url = captures.get(0).unwrap().as_str(); + format!("{}", url, url) + } + + let mut formatted_chunk = chunk.to_owned(); + + // Replace URLs with HTML tags + formatted_chunk = url_pattern + .replace_all(&formatted_chunk, replace_url_with_link) + .to_string(); + + // Apply any additional formatting based on the style_dict if needed + // You can iterate through the style_dict and apply formatting rules here. + + formatted_chunk +} diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx index d1d29da..e394089 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx @@ -13,6 +13,8 @@ import { formatConsoleData } from "./ConsoleViewUtils"; import { generateRandomString } from "../../../../helpers/utils"; import { clearIntervalId, setIntervalId } from "./IntervalManager"; import { IcoArrowDown, IcoDownload, IcoFile, IcoLinear } from "@/Icons/pack_1"; +import { invoke } from "@tauri-apps/api"; +import { getConsoleViewStyleDict } from "./ConsoleViewStyleDict"; interface Props { buildData: IJenkinsBuild; @@ -31,16 +33,18 @@ const ConsoleView: React.FC = ({ buildData }) => { const lines = await fetchUtils.consoleText(projectName, buildNumber); - const chunks = Array.from({ length: Math.ceil(lines.length / CONSOLE_VIEW_CHUNK_SIZE) }, (_, index) => - lines.slice(index * CONSOLE_VIEW_CHUNK_SIZE, (index + 1) * CONSOLE_VIEW_CHUNK_SIZE) - ); + // set last line to a https://google.com/ + lines[1] = "https://google.com/"; - const formattedChunks = await Promise.all( - chunks.map((chunk) => formatConsoleData(chunk)) - ); + const formattedData: string = await invoke("format_console_text", { + consoleText: lines, + chunkSize: CONSOLE_VIEW_CHUNK_SIZE, + styleDict: await getConsoleViewStyleDict() + }) - const formattedData = formattedChunks.join("\n"); + console.log(formattedData); + setConsoleData(formattedData); setIsLoading(false); From c8e398a9505dd8bb8ca14a6cf68ac73748abdad9 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 10 Jan 2024 03:39:36 +0100 Subject: [PATCH 3/4] Rewrote ConsoleView Style Apply in Rust --- .../src/app_handle/format_console_text.rs | 46 +++++++++++--- src/config/constants.ts | 2 +- .../Jarvis/Views/ConsoleView/ConsoleView.tsx | 21 ++----- .../Views/ConsoleView/ConsoleViewLoading.tsx | 1 - .../Views/ConsoleView/ConsoleViewUtils.tsx | 63 +++---------------- .../Jarvis/Views/ConsoleView/worker.ts | 30 --------- src/styles.css | 2 +- 7 files changed, 52 insertions(+), 113 deletions(-) delete mode 100644 src/screens/Jarvis/Views/ConsoleView/worker.ts diff --git a/src-tauri/src/app_handle/format_console_text.rs b/src-tauri/src/app_handle/format_console_text.rs index 185bf1f..db14406 100644 --- a/src-tauri/src/app_handle/format_console_text.rs +++ b/src-tauri/src/app_handle/format_console_text.rs @@ -15,16 +15,28 @@ pub fn format_console_text( let mut chunk: String = String::new(); for line in console_text { - if chunk.len() + line.len() > chunk_size { - chunks.push(format_chunk(&chunk, &style_dict, &url_pattern)); - chunk.clear(); + if chunk.len() >= chunk_size { + if let Ok(formatted_chunk) = format_chunk(&chunk, &style_dict, &url_pattern) { + chunks.push(formatted_chunk); + } else { + chunks.push(chunk.clone()); // Use unformatted chunk if formatting fails + } + chunk = String::new(); } + + if !chunk.is_empty() { + chunk.push('\n'); + } + chunk.push_str(&line); - chunk.push('\n'); } if !chunk.is_empty() { - chunks.push(format_chunk(&chunk, &style_dict, &url_pattern)); + if let Ok(formatted_chunk) = format_chunk(&chunk, &style_dict, &url_pattern) { + chunks.push(formatted_chunk); + } else { + chunks.push(chunk.clone()); // Use unformatted chunk if formatting fails + } } chunks.join("\n") @@ -35,22 +47,38 @@ fn format_chunk( chunk: &str, style_dict: &HashMap>, url_pattern: &Regex, -) -> String { +) -> Result { // Function to replace URLs with HTML tags fn replace_url_with_link(captures: ®ex::Captures) -> String { let url = captures.get(0).unwrap().as_str(); format!("{}", url, url) } + // Apply any additional formatting based on the style_dict let mut formatted_chunk = chunk.to_owned(); + for (key, styles) in style_dict { + let pattern = format!(r"(\b{}\b)", regex::escape(key)); + let regex = regex::Regex::new(&pattern)?; + + formatted_chunk = regex + .replace_all(&formatted_chunk, |captures: ®ex::Captures| { + let match_str = captures.get(0).unwrap().as_str(); + apply_styled_text(match_str.to_string(), styles.clone()) + }) + .to_string(); + } + // Replace URLs with HTML tags formatted_chunk = url_pattern .replace_all(&formatted_chunk, replace_url_with_link) .to_string(); - // Apply any additional formatting based on the style_dict if needed - // You can iterate through the style_dict and apply formatting rules here. + Ok(formatted_chunk) +} - formatted_chunk +// Function to wrap text in tags with class names for styles/colors +fn apply_styled_text(text: String, styles: Vec) -> String { + let class_names = styles.join(" "); + format!("{}", class_names, text) } diff --git a/src/config/constants.ts b/src/config/constants.ts index 1108979..c3ef444 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -40,4 +40,4 @@ export const JARVIS_LOADING_MESSAGES = [ "Reviewing the etiquette rulebook", ]; -export const CONSOLE_VIEW_CHUNK_SIZE = 50; \ No newline at end of file +export const CONSOLE_VIEW_CHUNK_SIZE = 10000; \ No newline at end of file diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx index e394089..6cb6b82 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx @@ -5,16 +5,14 @@ import { IJenkinsBuild } from "../../../../Interfaces/IBuildInterface"; import StorageManager from "../../../../helpers/StorageManager"; import ConsoleViewLoading from "./ConsoleViewLoading"; import { fetchUtils } from "../../Utils/fetchUtils"; -import { CONSOLE_RELOAD_TIME, CONSOLE_VIEW_CHUNK_SIZE } from "../../../../config/constants"; +import { CONSOLE_RELOAD_TIME } from "../../../../config/constants"; import { motion } from "framer-motion"; import { WebviewWindow } from "@tauri-apps/api/window"; -import { formatConsoleData } from "./ConsoleViewUtils"; import { generateRandomString } from "../../../../helpers/utils"; import { clearIntervalId, setIntervalId } from "./IntervalManager"; import { IcoArrowDown, IcoDownload, IcoFile, IcoLinear } from "@/Icons/pack_1"; -import { invoke } from "@tauri-apps/api"; -import { getConsoleViewStyleDict } from "./ConsoleViewStyleDict"; +import { formatConsoleData } from "./ConsoleViewUtils"; interface Props { buildData: IJenkinsBuild; @@ -33,19 +31,10 @@ const ConsoleView: React.FC = ({ buildData }) => { const lines = await fetchUtils.consoleText(projectName, buildNumber); - // set last line to a https://google.com/ - lines[1] = "https://google.com/"; - - const formattedData: string = await invoke("format_console_text", { - consoleText: lines, - chunkSize: CONSOLE_VIEW_CHUNK_SIZE, - styleDict: await getConsoleViewStyleDict() - }) - + const formattedData = await formatConsoleData(lines) - console.log(formattedData); - - setConsoleData(formattedData); + // add the new data to the console data + setConsoleData(consoleData + formattedData); setIsLoading(false); if (buildData.result !== null) { diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewLoading.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewLoading.tsx index 3e1cae1..12bd0d7 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewLoading.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewLoading.tsx @@ -4,7 +4,6 @@ const ConsoleViewLoading: React.FC = () => { return (
-
diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx index 7053270..611b0ee 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx @@ -1,60 +1,13 @@ -import Logger from "@/helpers/Logger"; -import { IStylingDict } from "../../../../Interfaces/StylingDict"; +import { CONSOLE_VIEW_CHUNK_SIZE } from "@/config/constants"; +import { invoke } from "@tauri-apps/api"; import { getConsoleViewStyleDict } from "./ConsoleViewStyleDict"; -import { type } from "@tauri-apps/api/os"; -let osType: string; - -(async () => { - osType = await type(); - Logger.info("ConsoleView/ConsoleViewUtils.tsx", `OS Type: ${osType}`); -})(); - - -const handleApplyStyledDataWebWorker = (data: string, stylingDict: IStylingDict): Promise => { - return new Promise((resolve, reject) => { - const worker = new Worker(new URL("./worker", import.meta.url), { type: "module" }); - - worker.onmessage = (e) => { - resolve(e.data); - worker.terminate(); - }; - - worker.onerror = (e) => { - reject(e); - worker.terminate(); - }; - - worker.postMessage({ data, stylingDict }); +export const formatConsoleData = async (lines: string[]): Promise => { + const formattedData: string = await invoke("format_console_text", { + consoleText: lines, + chunkSize: CONSOLE_VIEW_CHUNK_SIZE, + styleDict: await getConsoleViewStyleDict() }); -}; - -export const formatConsoleData = async (lines: string[]) => { - // Process each line to replace URLs with clickable links - const formattedLines = lines.map((line) => line.replace( - /https?:\/\/[^\s]+/g, - (match) => `${match}`, - )); - - // Join the formatted lines back together with newline characters - const formattedData = formattedLines.join("\n"); - - // If Browser is Safari return the formatted data - if (osType === "Darwin") { - return formattedData; - } - - const stylingDict: IStylingDict = await getConsoleViewStyleDict(); - // if stylingDict is empty return the formatted data - if (!stylingDict || Object.keys(stylingDict).length === 0) { - console.log("stylingDict is empty"); - - return formattedData; - } - - - // Apply styles based on the dictionary and get the styled data - const styledData = await handleApplyStyledDataWebWorker(formattedData, stylingDict); - return styledData; + return formattedData; }; diff --git a/src/screens/Jarvis/Views/ConsoleView/worker.ts b/src/screens/Jarvis/Views/ConsoleView/worker.ts deleted file mode 100644 index 2bde5d9..0000000 --- a/src/screens/Jarvis/Views/ConsoleView/worker.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IStylingDict } from "../../../../Interfaces/StylingDict"; -import Logger from "../../../../helpers/Logger"; - -self.addEventListener("message", (e) => { - const { data, stylingDict } = e.data; - - const applyStyles = (text: string, styles: string[]) => styles.reduce((result, style) => `${result}`, text); - - // Modified function to apply styles - const applyStyledText = (text: string, stylingDict: IStylingDict) => { - try { - let styledText: string = text; - - for (const key in stylingDict) { - if (stylingDict.hasOwnProperty(key)) { - const styles = stylingDict[key]; - const regex = new RegExp(`(?]*)${key}(?![^<]*>)`, "g"); - - styledText = styledText.replace(regex, (match: string) => applyStyles(match, styles)); - } - } - - self.postMessage(styledText); - } catch (error) { - Logger.error("ConsoleView/worker.ts", error); - return text; - } - }; - applyStyledText(data, stylingDict); -}); diff --git a/src/styles.css b/src/styles.css index 4112fe1..8c84ab8 100644 --- a/src/styles.css +++ b/src/styles.css @@ -24,7 +24,7 @@ @apply text-text-color; @apply antialiased; - overscroll-behavior-y: none; + overscroll-behavior: none; } From 962c76c444bb74771a0e37f0949d320ae0afc57e Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 10 Jan 2024 10:35:15 +0100 Subject: [PATCH 4/4] Fixed ConsoleView not Refreshing during Build --- src/Icons/pack_1.tsx | 8 +++--- .../ConsoleViewRenderHTML.tsx | 17 +++++++++++ .../Jarvis/Views/ConsoleView/ConsoleView.tsx | 26 +++++++++-------- .../Views/ConsoleView/ConsoleViewStyleDict.ts | 26 ----------------- .../Views/ConsoleView/ConsoleViewUtils.tsx | 28 ++++++++++++++++++- .../Views/SettingsView/ButtonEvents.tsx | 2 +- 6 files changed, 63 insertions(+), 44 deletions(-) create mode 100644 src/components/ConsoleViewRenderHTML/ConsoleViewRenderHTML.tsx delete mode 100644 src/screens/Jarvis/Views/ConsoleView/ConsoleViewStyleDict.ts diff --git a/src/Icons/pack_1.tsx b/src/Icons/pack_1.tsx index d2894a2..877ed06 100644 --- a/src/Icons/pack_1.tsx +++ b/src/Icons/pack_1.tsx @@ -308,16 +308,16 @@ export const IcoMaximize = ({ size = 24, color = "currentColor", className }: Ic // Used in: Feature Buttons export const IcoMinimize = ({ size = 24, color = "currentColor", className }: IconProps) => ( - + -) +); // Icon Pack: Jarvis // License: MIT - Copyright (c) 2024 JNSAPH // Used in: Feature Buttons export const IcoClose = ({ size = 24, color = "currentColor", className }: IconProps) => ( - - + + ); diff --git a/src/components/ConsoleViewRenderHTML/ConsoleViewRenderHTML.tsx b/src/components/ConsoleViewRenderHTML/ConsoleViewRenderHTML.tsx new file mode 100644 index 0000000..bbf4390 --- /dev/null +++ b/src/components/ConsoleViewRenderHTML/ConsoleViewRenderHTML.tsx @@ -0,0 +1,17 @@ +import React from "react"; + +// react component that takes in a string and returns that string as rendered html +interface Props { + htmlString: string; +} + +const ConsoleViewRenderHTML: React.FC = ({ htmlString }) => { + return /*#__PURE__*/React.createElement("pre", { + dangerouslySetInnerHTML: { + __html: htmlString + }, + className: "overflow-auto px-6 py-4 console-custom-scroll" + }); +}; + +export default ConsoleViewRenderHTML; diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx index 6cb6b82..da535d3 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleView.tsx @@ -13,13 +13,13 @@ import { generateRandomString } from "../../../../helpers/utils"; import { clearIntervalId, setIntervalId } from "./IntervalManager"; import { IcoArrowDown, IcoDownload, IcoFile, IcoLinear } from "@/Icons/pack_1"; import { formatConsoleData } from "./ConsoleViewUtils"; +import ConsoleViewRenderHTML from "@/components/ConsoleViewRenderHTML/ConsoleViewRenderHTML"; interface Props { buildData: IJenkinsBuild; } const ConsoleView: React.FC = ({ buildData }) => { const consoleRef = useRef(null); - const preElementRef = useRef(null); const [consoleData, setConsoleData] = useState(""); const [isLoading, setIsLoading] = useState(true); const [autoScroll, setAutoScroll] = useState(false); @@ -31,19 +31,25 @@ const ConsoleView: React.FC = ({ buildData }) => { const lines = await fetchUtils.consoleText(projectName, buildNumber); - const formattedData = await formatConsoleData(lines) + const formattedData = await formatConsoleData(lines); // add the new data to the console data - setConsoleData(consoleData + formattedData); + setConsoleData(formattedData); setIsLoading(false); if (buildData.result !== null) { - clearIntervalId() - Logger.info("ConsoleView/ConsoleView.tsx", "ConsoleView: Build is finished, clearing interval") + clearIntervalId(); + Logger.info( + "ConsoleView/ConsoleView.tsx", + "ConsoleView: Build is finished, clearing interval" + ); return true; } } catch (error) { - Logger.error("ConsoleView/ConsoleView.tsx", "ConsoleView: Error while fetching console data: " + error); + Logger.error( + "ConsoleView/ConsoleView.tsx", + "ConsoleView: Error while fetching console data: " + error + ); } }; @@ -95,7 +101,7 @@ const ConsoleView: React.FC = ({ buildData }) => { setIntervalId(setInterval(() => { fetchAndSetConsoleData(); }, CONSOLE_RELOAD_TIME)); - } + }; startConsole(); @@ -133,11 +139,7 @@ const ConsoleView: React.FC = ({ buildData }) => { {/*

Full Output

*/}
-
 element
-									dangerouslySetInnerHTML={{ __html: consoleData }}
-								/>
+								
 							
{buildData.result === null && ( diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewStyleDict.ts b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewStyleDict.ts deleted file mode 100644 index c026f60..0000000 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewStyleDict.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - exists, BaseDirectory, createDir, writeTextFile, readTextFile, -} from "@tauri-apps/api/fs"; -import { stylingDict as defaultStylingDict } from "./styleDict"; -import { CONSOLE_VIEW_STYLE_FILE } from "../../../../config/constants"; -import Logger from "../../../../helpers/Logger"; -import { IStylingDict } from "../../../../Interfaces/StylingDict"; - -export async function getConsoleViewStyleDict(): Promise { - try { - const appDataDirExists = await exists("", { dir: BaseDirectory.AppData }); - - if (!appDataDirExists) { - await createDir("", { dir: BaseDirectory.AppData }); - } - - if (await exists(CONSOLE_VIEW_STYLE_FILE, { dir: BaseDirectory.AppData })) { - return await JSON.parse(await readTextFile(CONSOLE_VIEW_STYLE_FILE, { dir: BaseDirectory.AppData })); - } - await writeTextFile(CONSOLE_VIEW_STYLE_FILE, await JSON.stringify(defaultStylingDict), { dir: BaseDirectory.AppData }); - return defaultStylingDict; - } catch (error) { - Logger.error("ConsoleView/ConsoleViewStyleDict.tsx", `Error getting ${CONSOLE_VIEW_STYLE_FILE}. The File might be empty. \n${error}`); - return defaultStylingDict; - } -} diff --git a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx index 611b0ee..318c0d9 100644 --- a/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx +++ b/src/screens/Jarvis/Views/ConsoleView/ConsoleViewUtils.tsx @@ -1,6 +1,13 @@ import { CONSOLE_VIEW_CHUNK_SIZE } from "@/config/constants"; import { invoke } from "@tauri-apps/api"; -import { getConsoleViewStyleDict } from "./ConsoleViewStyleDict"; +import { + exists, BaseDirectory, createDir, writeTextFile, readTextFile, +} from "@tauri-apps/api/fs"; +import { stylingDict as defaultStylingDict } from "./styleDict"; +import { CONSOLE_VIEW_STYLE_FILE } from "../../../../config/constants"; +import Logger from "../../../../helpers/Logger"; +import { IStylingDict } from "../../../../Interfaces/StylingDict"; + export const formatConsoleData = async (lines: string[]): Promise => { const formattedData: string = await invoke("format_console_text", { @@ -11,3 +18,22 @@ export const formatConsoleData = async (lines: string[]): Promise => { return formattedData; }; + +export async function getConsoleViewStyleDict(): Promise { + try { + const appDataDirExists = await exists("", { dir: BaseDirectory.AppData }); + + if (!appDataDirExists) { + await createDir("", { dir: BaseDirectory.AppData }); + } + + if (await exists(CONSOLE_VIEW_STYLE_FILE, { dir: BaseDirectory.AppData })) { + return await JSON.parse(await readTextFile(CONSOLE_VIEW_STYLE_FILE, { dir: BaseDirectory.AppData })); + } + await writeTextFile(CONSOLE_VIEW_STYLE_FILE, await JSON.stringify(defaultStylingDict), { dir: BaseDirectory.AppData }); + return defaultStylingDict; + } catch (error) { + Logger.error("ConsoleView/ConsoleViewStyleDict.tsx", `Error getting ${CONSOLE_VIEW_STYLE_FILE}. The File might be empty. \n${error}`); + return defaultStylingDict; + } +} \ No newline at end of file diff --git a/src/screens/Jarvis/Views/SettingsView/ButtonEvents.tsx b/src/screens/Jarvis/Views/SettingsView/ButtonEvents.tsx index 4c023eb..e05d54f 100644 --- a/src/screens/Jarvis/Views/SettingsView/ButtonEvents.tsx +++ b/src/screens/Jarvis/Views/SettingsView/ButtonEvents.tsx @@ -4,7 +4,7 @@ import { appDataDir } from "@tauri-apps/api/path"; import { invoke } from "@tauri-apps/api/tauri"; import { CONSOLE_VIEW_STYLE_FILE, LOGS_FILE } from "../../../../config/constants"; -import { getConsoleViewStyleDict } from "../ConsoleView/ConsoleViewStyleDict"; +import { getConsoleViewStyleDict } from "../ConsoleView/ConsoleViewUtils"; import Logger from "../../../../helpers/Logger"; import StorageManager from "../../../../helpers/StorageManager";