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)