Files
VRCT/src-ui/app/_app_controllers/StartPythonController.jsx
2025-06-11 20:22:38 +09:00

81 lines
2.8 KiB
JavaScript

import { invoke } from "@tauri-apps/api/core";
import { Command } from "@tauri-apps/plugin-shell";
import { useEffect, useRef } from "react";
import { useStdoutToPython } from "@useStdoutToPython";
import { useReceiveRoutes } from "@useReceiveRoutes";
import { store, useStore_SelectableFontFamilyList } from "@store";
import { arrayToObject } from "@utils";
import {
useNotificationStatus,
} from "@logics_common";
export const StartPythonController = () => {
const { asyncStartPython } = useStartPython();
const hasRunRef = useRef(false);
const { asyncFetchFonts } = useAsyncFetchFonts();
useEffect(() => {
if (!hasRunRef.current) {
asyncStartPython().then(() => {
startFeedingToWatchDogController();
asyncFetchFonts();
}).catch((err) => {
console.error(err);
});
}
return () => hasRunRef.current = true;
}, []);
return null;
};
const useStartPython = () => {
const { receiveRoutes } = useReceiveRoutes();
const { showNotification_Success, showNotification_Error } = useNotificationStatus();
const asyncStartPython = async () => {
const command = Command.sidecar("bin/VRCT-sidecar");
command.on("error", error => console.error(`error: "${error}"`));
command.stdout.on("data", (line) => {
let parsed_data = "";
try {
parsed_data = JSON.parse(line);
receiveRoutes(parsed_data);
} catch (error) {
console.log(error, line);
}
});
command.stderr.on("data", line => {
showNotification_Error(
`An error occurred. Please restart VRCT or contact the developers. The last line:${JSON.stringify(line)}`, { hide_duration: null });
console.error("stderr", line);
});
const backend_subprocess = await command.spawn();
store.backend_subprocess = backend_subprocess;
};
return { asyncStartPython };
};
const useAsyncFetchFonts = () => {
const { updateSelectableFontFamilyList } = useStore_SelectableFontFamilyList();
const asyncFetchFonts = async () => {
try {
let fonts = await invoke("get_font_list");
fonts = fonts.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" }));
updateSelectableFontFamilyList(arrayToObject(fonts));
} catch (error) {
console.error("Error fetching fonts:", error);
}
};
return { asyncFetchFonts };
};
const startFeedingToWatchDogController = () => {
const { asyncStdoutToPython } = useStdoutToPython();
setInterval(() => {
asyncStdoutToPython("/run/feed_watchdog");
}, 20000); // 20000ミリ秒 = 20秒
};