- {currentLoadedPluginsList.data
- .filter((plugin) => plugin.location === "main_section")
+ {currentPluginsData.data
+ .filter((plugin) => plugin.is_enabled && plugin.location === "main_section")
.map((plugin, index) => {
const PluginComponent = plugin.component;
return PluginComponent ?
: null;
diff --git a/src-ui/logics/configs/plugins/usePlugins.js b/src-ui/logics/configs/plugins/usePlugins.js
index c8c18749..7bc55256 100644
--- a/src-ui/logics/configs/plugins/usePlugins.js
+++ b/src-ui/logics/configs/plugins/usePlugins.js
@@ -3,10 +3,10 @@ import semver from "semver";
import { invoke } from "@tauri-apps/api/tauri";
import {
createAtomWithHook,
- useStore_LoadedPluginsList,
useStore_SavedPluginsStatus,
- useStore_PluginsInfoList,
+ useStore_PluginsData,
} from "@store";
+import { useStdoutToPython } from "@logics/useStdoutToPython";
import { transform } from "@babel/standalone";
import { writeFile, createDir, exists, removeDir, readDir, BaseDirectory, readTextFile } from "@tauri-apps/api/fs";
@@ -21,9 +21,10 @@ import { useSoftwareVersion } from "@logics_configs";
const PLUGIN_LIST_URL = "https://raw.githubusercontent.com/ShiinaSakamoto/vrct_plugins_list/main/vrct_plugins_list.json";
export const usePlugins = () => {
- const { currentLoadedPluginsList, updateLoadedPluginsList } = useStore_LoadedPluginsList();
- const { currentSavedPluginsStatus, updateSavedPluginsStatus } = useStore_SavedPluginsStatus();
- const { currentPluginsInfoList, updatePluginsInfoList, pendingPluginsInfoList } = useStore_PluginsInfoList();
+ const { asyncStdoutToPython } = useStdoutToPython();
+ // const { currentLoadedPluginsList, updateLoadedPluginsList } = useStore_LoadedPluginsList();
+ const { currentSavedPluginsStatus, updateSavedPluginsStatus, pendingSavedPluginsStatus } = useStore_SavedPluginsStatus();
+ const { currentPluginsData, updatePluginsData, pendingPluginsData } = useStore_PluginsData();
const { currentSoftwareVersion } = useSoftwareVersion();
const { asyncTauriFetchGithub } = useFetch();
@@ -33,9 +34,17 @@ export const usePlugins = () => {
if (!plugin_id || !location || !component) {
return console.error("An invalid plugin was detected.", plugin_id, location, component);
}
- updateLoadedPluginsList((prev) => {
- const filtered = prev.data.filter(item => item.plugin_id !== plugin_id);
- return [...filtered, { plugin_id, location, component }];
+ updatePluginsData(prev => {
+ const is_already_registered = prev.data.some(old_value => old_value.plugin_id === plugin_id);
+ const new_value = prev.data.map(old_value =>
+ old_value.plugin_id === plugin_id
+ ? { ...old_value, location, component, is_downloaded: true }
+ : old_value
+ );
+
+ return is_already_registered
+ ? new_value
+ : [...new_value, { plugin_id, location, component, is_downloaded: true }];
});
},
createAtomWithHook: (...args) => createAtomWithHook(...args)
@@ -66,7 +75,7 @@ export const usePlugins = () => {
}
};
- const loadAllPlugins = async () => {
+ const asyncLoadAllPlugins = async () => {
if (import.meta.env.DEV) {
// 開発時: ホットリロード対応、src-tauri以下のpluginsから直接読み込み
Object.entries(dev_plugin_mapping).forEach(([key, plugin_module]) => {
@@ -169,8 +178,7 @@ export const usePlugins = () => {
};
- const asyncUpdatePluginInfoList = async () => {
- pendingPluginsInfoList();
+ const asyncFetchPluginsInfo = async () => {
try {
const response = await asyncTauriFetchGithub(PLUGIN_LIST_URL);
if (response.status !== 200) {
@@ -194,7 +202,7 @@ export const usePlugins = () => {
}
})
);
- updatePluginsInfoList(updated_list);
+ return updated_list;
} catch (error) {
console.error("Error fetching plugin info list:", error);
}
@@ -236,22 +244,26 @@ export const usePlugins = () => {
};
}
+ const setSavedPluginsStatus = (plugins_status) => {
+ pendingSavedPluginsStatus();
+ asyncStdoutToPython("/set/data/plugins_status", plugins_status);
+ };
+
return {
- asyncUpdatePluginInfoList,
+ asyncFetchPluginsInfo,
- loadAllPlugins,
+ asyncLoadAllPlugins,
downloadAndExtractPlugin,
- currentLoadedPluginsList,
- updateLoadedPluginsList,
-
currentSavedPluginsStatus,
updateSavedPluginsStatus,
- currentPluginsInfoList,
- updatePluginsInfoList,
+ currentPluginsData,
+ updatePluginsData,
+
+ setSavedPluginsStatus,
};
};
diff --git a/src-ui/logics/useReceiveRoutes.js b/src-ui/logics/useReceiveRoutes.js
index 53a2feb3..4575c3d8 100644
--- a/src-ui/logics/useReceiveRoutes.js
+++ b/src-ui/logics/useReceiveRoutes.js
@@ -73,6 +73,7 @@ import {
useOverlayShowOnlyTranslatedMessages,
useEnableNotificationVrcSfx,
useHotkeys,
+ usePlugins,
useOscIpAddress,
useOscPort,
} from "@logics_configs";
@@ -176,6 +177,7 @@ export const useReceiveRoutes = () => {
const { updateEnableNotificationVrcSfx } = useEnableNotificationVrcSfx();
const { updateHotkeys } = useHotkeys();
+ const { updateSavedPluginsStatus } = usePlugins();
const { updateOscIpAddress } = useOscIpAddress();
const { updateOscPort } = useOscPort();
@@ -488,6 +490,10 @@ export const useReceiveRoutes = () => {
"/get/data/hotkeys": updateHotkeys,
"/set/data/hotkeys": updateHotkeys,
+ // Plugins
+ "/get/data/plugins_status": updateSavedPluginsStatus,
+ "/set/data/plugins_status": updateSavedPluginsStatus,
+
// Advanced Settings
"/get/data/osc_ip_address": updateOscIpAddress,
"/set/data/osc_ip_address": updateOscIpAddress,
diff --git a/src-ui/store.js b/src-ui/store.js
index 2da4c128..410a3809 100644
--- a/src-ui/store.js
+++ b/src-ui/store.js
@@ -275,12 +275,9 @@ export const { atomInstance: Atom_Hotkeys, useHook: useStore_Hotkeys } = createA
}, "Hotkeys");
// Plugins
-export const { atomInstance: Atom_LoadedPluginsList, useHook: useStore_LoadedPluginsList } = createAtomWithHook([], "LoadedPluginsList");
-export const { atomInstance: Atom_SavedPluginsStatus, useHook: useStore_SavedPluginsStatus } = createAtomWithHook([
- { plugin_id: "vrct_plugin_example_1", is_enabled: true },
- { plugin_id: "vrct_plugin_example_2", is_enabled: false }
-], "SavedPluginsStatus");
-export const { atomInstance: Atom_PluginsInfoList, useHook: useStore_PluginsInfoList } = createAtomWithHook([], "PluginsInfoList");
+// export const { atomInstance: Atom_LoadedPluginsList, useHook: useStore_LoadedPluginsList } = createAtomWithHook([], "LoadedPluginsList");
+export const { atomInstance: Atom_SavedPluginsStatus, useHook: useStore_SavedPluginsStatus } = createAtomWithHook([], "SavedPluginsStatus");
+export const { atomInstance: Atom_PluginsData, useHook: useStore_PluginsData } = createAtomWithHook([], "PluginsData");
// Advanced Settings
export const { atomInstance: Atom_OscIpAddress, useHook: useStore_OscIpAddress } = createAtomWithHook("127.0.0.1", "OscIpAddress");