From ddc6408828e33c35b442d9a8647411f78ddf4ef4 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 13 Apr 2025 17:14:54 +0900 Subject: [PATCH] [Update/bugfix] Fix handling flag 'is_latest_version_already' that was overrode unexpectedly. Add some patterns to plugin list. it shows update-able if the user update vrct. Add auto update function if the plugin is enabled. Add safety that turn to disable the plugin if it's not supported with current vrct version. --- .../_app_controllers/PluginsController.jsx | 32 ++++++++++++++++--- .../PluginsControlComponent.jsx | 18 +++++++++-- src-ui/logics/configs/plugins/usePlugins.js | 10 +++--- src-ui/ui_configs.js | 1 + 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src-ui/app/_app_controllers/PluginsController.jsx b/src-ui/app/_app_controllers/PluginsController.jsx index 2fad4376..98327baf 100644 --- a/src-ui/app/_app_controllers/PluginsController.jsx +++ b/src-ui/app/_app_controllers/PluginsController.jsx @@ -15,6 +15,7 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => { updatePluginsData, currentSavedPluginsStatus, updateIsPluginsInitialized, + downloadAndExtractPlugin, } = usePlugins(); useEffect(() => { @@ -36,19 +37,19 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => { const is_latest_version_available = !(target_downloaded_plugin.plugin_version === info.plugin_version); new_plugin_info = { - is_downloaded: true, - is_latest_version_already: (target_downloaded_plugin.downloaded_plugin_info?.plugin_version === info.plugin_version), - is_latest_version_available: is_latest_version_available, - latest_plugin_info: { ...info }, ...target_downloaded_plugin, + is_downloaded: true, + latest_plugin_info: { ...info }, + is_latest_version_available: is_latest_version_available, + is_latest_version_already: (target_downloaded_plugin.downloaded_plugin_info?.plugin_version === info.plugin_version), }; } else { // infoにもあり登録済みだがダウンロードされていない new_plugin_info = { + ...target_downloaded_plugin, is_downloaded: false, is_latest_version_already: false, is_latest_version_available: info.is_latest_version_available, latest_plugin_info: { ...info }, - ...target_downloaded_plugin, } } } else { // 未ダウンロード @@ -75,8 +76,29 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => { plugin.is_latest_version_available = (plugin.latest_plugin_info.is_plugin_supported); } }); + + // ダウンロード済みで最新版じゃない場合、自動的にアップデート + // is_latest_version_supported: true のみ。 + // 失敗した場合、現在のバージョンが非対応の場合はdisabledにする。 + new_data.forEach(async plugin => { + if (plugin.is_enabled) { + if (!plugin.is_latest_version_already && plugin.is_latest_version_available) { + await downloadAndExtractPlugin(plugin); + } + } + }); + + new_data.forEach(async plugin => { + if (plugin.is_enabled) { + if (!plugin.downloaded_plugin_info?.is_plugin_supported) { + plugin.is_enabled = false + } + } + }); + return new_data; }); + } catch (error) { console.error(error); } diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/plugins_control_component/PluginsControlComponent.jsx b/src-ui/app/config_page/setting_section/setting_box/_components/plugins_control_component/PluginsControlComponent.jsx index 4408d6cc..e6ddd500 100644 --- a/src-ui/app/config_page/setting_section/setting_box/_components/plugins_control_component/PluginsControlComponent.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/_components/plugins_control_component/PluginsControlComponent.jsx @@ -52,7 +52,14 @@ const DownloadedPluginControl = ({ const latest_version = plugin_status.latest_plugin_info?.plugin_version; - if (plugin_status.is_latest_version_already) { + + if (!plugin_status.downloaded_plugin_info.is_plugin_supported) { + return ( +
+

現在利用不可 使用中VRCTバージョンとの互換性なし

+
+ ); + } else if (plugin_status.is_latest_version_already) { return (

最新のバージョン: {latest_version}

@@ -72,7 +79,7 @@ const DownloadedPluginControl = ({ } else { return (
-

最新のバージョン: {latest_version}

+

最新版は現在利用不可

); @@ -90,6 +97,13 @@ const NotDownloadedPluginControl = ({ option, plugin_status, downloadStartFuncti <_DownloadButton option={option} downloadStartFunction={downloadStartFunction} />
); + } else if (plugin_status.latest_plugin_info?.is_plugin_supported_latest_vrct) { + return ( +
+

最新のバージョン: {latest_version}

+

VRCT最新版で利用可能

+
+ ); } else { return (
diff --git a/src-ui/logics/configs/plugins/usePlugins.js b/src-ui/logics/configs/plugins/usePlugins.js index ef1acd04..9f1be315 100644 --- a/src-ui/logics/configs/plugins/usePlugins.js +++ b/src-ui/logics/configs/plugins/usePlugins.js @@ -52,12 +52,14 @@ export const usePlugins = () => { let new_value = {}; const { is_plugin_supported, is_plugin_supported_latest_vrct } = checkVrctVerCompatibility(downloaded_plugin_info.min_supported_vrct_version, downloaded_plugin_info.max_supported_vrct_version); - if (!prev_map.has(downloaded_plugin_info.plugin_id)) { // 未ダウンロード 新規登録 + const target_plugin = prev_map.get(downloaded_plugin_info.plugin_id); + if (!target_plugin) { // 未ダウンロード 新規登録 new_value = { plugin_id: downloaded_plugin_info.plugin_id, component: component, is_downloaded: true, is_latest_version_available: false, + is_latest_version_already: true, downloaded_plugin_info: { ...downloaded_plugin_info, component: component, @@ -70,9 +72,7 @@ export const usePlugins = () => { for (const old_plugin_data of prev.data) { - if (prev_map.has(downloaded_plugin_info.plugin_id) && old_plugin_data.plugin_id === downloaded_plugin_info.plugin_id) { // ダウンロード済み アップデート - - + if (old_plugin_data.plugin_id === downloaded_plugin_info.plugin_id) { // ダウンロード済み or 登録済 アップデート const target_prev_plugin = prev_map.get(downloaded_plugin_info.plugin_id); const is_latest_version_available = (target_prev_plugin.is_downloaded) && !(downloaded_plugin_info.plugin_version === target_prev_plugin.latest_plugin_info.plugin_version); @@ -82,6 +82,7 @@ export const usePlugins = () => { component: component, is_downloaded: true, is_latest_version_available: is_latest_version_available, + is_latest_version_already: (target_plugin.plugin_version === old_plugin_data.latest_plugin_info?.plugin_info), downloaded_plugin_info: { ...downloaded_plugin_info, component: component, @@ -168,6 +169,7 @@ export const usePlugins = () => { const latest_plugin_info = plugin.latest_plugin_info; try { const plugin_zip_url = await fetchLatestPluginZipUrl(latest_plugin_info); + console.log("start download", plugin_zip_url); // Rust コマンド経由で ZIP をダウンロード const base64_zip = await invoke("download_zip_asset", { url: plugin_zip_url }); // base64_zip をデコードして Uint8Array に変換 diff --git a/src-ui/ui_configs.js b/src-ui/ui_configs.js index f5f89b0c..6db3193f 100644 --- a/src-ui/ui_configs.js +++ b/src-ui/ui_configs.js @@ -53,6 +53,7 @@ export const ui_configs = { }; export const IS_PLUGIN_DEV_MODE = false; +if (IS_PLUGIN_DEV_MODE) console.warn("ui_configs IS_PLUGIN_DEV_MODE: true. Turn to 'false' when it's production environment."); export const getPluginsList = () => { const base_url = "https://raw.githubusercontent.com/ShiinaSakamoto/vrct_plugins_list/main/"; const plugins_list_url = (IS_PLUGIN_DEV_MODE)