From 7e637b795d627300aafbb6b7b7f0a409d6f419da Mon Sep 17 00:00:00 2001
From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com>
Date: Wed, 9 Apr 2025 17:29:31 +0900
Subject: [PATCH] [Update/Refactor/bugfix] Update: Add functions and test ui.
Update, backend: send latest vrct version to frontend. Refactor: Change the
plugins data structure. bugfix: fix endless showing update button.
---
src-python/controller.py | 6 +-
src-python/mainloop.py | 2 +-
src-python/model.py | 6 +-
.../_app_controllers/PluginsController.jsx | 72 +++++----
.../PluginsControlComponent.jsx | 145 +++++++++++++++---
.../setting_box/plugins/Plugins.jsx | 81 +++++-----
.../version_label/VersionLabel.jsx | 3 +-
.../main_page/main_section/MainSection.jsx | 2 +-
.../RightSideComponents.jsx | 6 +-
.../update_modal/UpdateModal.jsx | 35 ++++-
src-ui/logics/common/index.js | 2 +-
.../common/useIsSoftwareUpdateAvailable.js | 10 --
src-ui/logics/common/useSoftwareVersion.js | 40 +++++
src-ui/logics/configs/index.js | 4 +-
src-ui/logics/configs/plugins/usePlugins.js | 138 ++++++++++++-----
src-ui/logics/configs/useSoftwareVersion.js | 18 ---
src-ui/logics/useReceiveRoutes.js | 7 +-
src-ui/store.js | 7 +-
18 files changed, 404 insertions(+), 180 deletions(-)
delete mode 100644 src-ui/logics/common/useIsSoftwareUpdateAvailable.js
create mode 100644 src-ui/logics/common/useSoftwareVersion.js
delete mode 100644 src-ui/logics/configs/useSoftwareVersion.js
diff --git a/src-python/controller.py b/src-python/controller.py
index 02ba5e34..faa659b2 100644
--- a/src-python/controller.py
+++ b/src-python/controller.py
@@ -447,11 +447,11 @@ class Controller:
return {"status":200, "result":config.VERSION}
def checkSoftwareUpdated(self) -> dict:
- update_flag = model.checkSoftwareUpdated()
+ software_update_info = model.checkSoftwareUpdated()
self.run(
200,
- self.run_mapping["update_software_flag"],
- update_flag,
+ self.run_mapping["software_update_info"],
+ software_update_info,
)
@staticmethod
diff --git a/src-python/mainloop.py b/src-python/mainloop.py
index edd5356a..5c5fb744 100644
--- a/src-python/mainloop.py
+++ b/src-python/mainloop.py
@@ -38,7 +38,7 @@ run_mapping = {
"mic_device_list":"/run/mic_device_list",
"speaker_device_list":"/run/speaker_device_list",
- "update_software_flag":"/run/update_software_flag",
+ "software_update_info":"/run/software_update_info",
"initialization_progress":"/run/initialization_progress",
"initialization_complete":"/run/initialization_complete",
diff --git a/src-python/model.py b/src-python/model.py
index f393314d..afe0d565 100644
--- a/src-python/model.py
+++ b/src-python/model.py
@@ -320,6 +320,7 @@ class Model:
def checkSoftwareUpdated():
# check update
update_flag = False
+ version = ""
try:
response = requests_get(config.GITHUB_URL)
json_data = response.json()
@@ -331,7 +332,10 @@ class Model:
update_flag = True
except Exception:
errorLogging()
- return update_flag
+ return {
+ "is_update_available": update_flag,
+ "new_version": version,
+ }
@staticmethod
def updateSoftware():
diff --git a/src-ui/app/_app_controllers/PluginsController.jsx b/src-ui/app/_app_controllers/PluginsController.jsx
index ec181bb9..2fad4376 100644
--- a/src-ui/app/_app_controllers/PluginsController.jsx
+++ b/src-ui/app/_app_controllers/PluginsController.jsx
@@ -14,6 +14,7 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => {
currentPluginsData,
updatePluginsData,
currentSavedPluginsStatus,
+ updateIsPluginsInitialized,
} = usePlugins();
useEffect(() => {
@@ -26,40 +27,55 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => {
const info_map = new Map(info_array.map(info => [info.plugin_id, info]));
const prev_map = new Map(prev.data.map(item => [item.plugin_id, item]));
- // info_array にある各アイテムについて、prev.data に同じ plugin_id があればマージ
- const merged = info_array.map(info => {
- if (prev_map.has(info.plugin_id)) {
- return {
- ...info,
- latest_plugin_version: info.plugin_version,
- ...prev_map.get(info.plugin_id),
+ const new_data = [];
+ for (const info of info_array) {
+ let new_plugin_info = {};
+ if (prev_map.has(info.plugin_id)) { // plugin_id 登録済み
+ const target_downloaded_plugin = prev_map.get(info.plugin_id);
+ if (target_downloaded_plugin.is_downloaded) { // 既にダウンロード済み
+ 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,
+ };
+ } else { // infoにもあり登録済みだがダウンロードされていない
+ new_plugin_info = {
+ 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 { // 未ダウンロード
+ new_plugin_info = {
+ plugin_id: info.plugin_id,
+ is_downloaded: false,
+ is_latest_version_already: false,
+ latest_plugin_info: { ...info },
};
}
- return {
- ...info,
- latest_plugin_version: info.plugin_version,
- };
- });
+ new_data.push(new_plugin_info);
+ }
// prev.data にのみ存在するアイテム = latest plugin infoには存在しない
// を追加し、is_outdated: true を付与
prev.data.forEach(item => {
if (!info_map.has(item.plugin_id)) {
- merged.push({ ...item, is_outdated: true });
+ new_data.push({ ...item, is_outdated: true });
}
});
- let new_value = [];
- for (const plugin of merged) {
- if (plugin.downloaded_plugin_version !== plugin.latest_plugin_version && plugin.is_plugin_supported) {
- plugin.is_latest_version_available = true;
- } else {
- plugin.is_latest_version_available = false;
+ new_data.forEach(plugin => {
+ if (!plugin.is_outdated) {
+ plugin.is_latest_version_available = (plugin.latest_plugin_info.is_plugin_supported);
}
- new_value.push(plugin);
- }
-
- return new_value;
+ });
+ return new_data;
});
} catch (error) {
console.error(error);
@@ -68,6 +84,7 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => {
if (!fetchPluginsHasRunRef.current) {
loadPlugins();
+ updateIsPluginsInitialized(true);
}
return () => fetchPluginsHasRunRef.current = true;
}, []);
@@ -76,13 +93,13 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => {
useEffect(() => {
updatePluginsData(prev => {
// currentSavedPluginsStatus.data の各要素を Map 化して plugin_id で参照
- const savedMap = new Map(currentSavedPluginsStatus.data.map(saved => [saved.plugin_id, saved]));
+ const saved_map = new Map(currentSavedPluginsStatus.data.map(saved => [saved.plugin_id, saved]));
const prev_map = new Map(prev.data.map(item => [item.plugin_id, item]));
-
// prev.data にある各アイテムについて、保存済みの状態情報があればマージ
const merged = prev.data.map(item => {
- if (savedMap.has(item.plugin_id)) {
- return { ...item, is_enabled: savedMap.get(item.plugin_id).is_enabled };
+
+ if (saved_map.has(item.plugin_id)) {
+ return { ...item, is_enabled: saved_map.get(item.plugin_id).is_enabled };
}
return item;
});
@@ -93,7 +110,6 @@ export const PluginsController = ({ fetchPluginsHasRunRef }) => {
merged.push({ plugin_id: saved.plugin_id, is_enabled: saved.is_enabled });
}
});
-
return merged;
});
}, [currentSavedPluginsStatus]);
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 a8f70b73..0fd7c33a 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
@@ -1,31 +1,136 @@
+import React from "react";
import { SwitchBox } from "../index";
import { _DownloadButton } from "../_atoms/_download_button/_DownloadButton";
import styles from "./PluginsControlComponent.module.scss";
-export const PluginsControlComponent = ({ variable_state, plugin_status, toggleFunction, downloadStartFunction }) => {
- const { plugin_id, is_pending, is_downloaded, is_enabled, is_latest_version_available, is_plugin_supported, is_outdated } = plugin_status;
-
+// メインのコントロールコンポーネント。ダウンロード済み / 未ダウンロードで分岐して表示する
+export const PluginsControlComponent = ({
+ variable_state,
+ plugin_status,
+ toggleFunction,
+ downloadStartFunction,
+}) => {
+ // 共通オプション(各子コンポーネントに引き回す情報)
const option = {
- id: plugin_id,
- is_pending: is_pending,
- is_downloaded: is_downloaded,
- data: is_enabled,
- update_button: is_downloaded && is_latest_version_available,
+ id: plugin_status.plugin_id,
+ is_pending: plugin_status.is_pending,
+ is_downloaded: plugin_status.is_downloaded,
+ data: plugin_status.is_enabled,
+ update_button: plugin_status.is_downloaded && plugin_status.is_latest_version_available,
state: variable_state,
progress: null,
};
- const togglePlugin = () => toggleFunction(plugin_id);
- const is_turn_on_able = is_downloaded && (is_plugin_supported || is_outdated);
+ if (plugin_status.is_downloaded) {
+ return (
+
{title}
+現在のバージョン: {current_version}
+最新版を使用中
+{title}
+現在のバージョン: {current_version}
+最新版を利用可能
<_DownloadButton option={option} downloadStartFunction={downloadStartFunction} /> - ) : ( -{title}
+現在のバージョン: {current_version}
+{desc}
+{title}
+現在のバージョン: {current_version}
+最新バージョン: {latest_version}
+ <_DownloadButton option={option} downloadStartFunction={downloadStartFunction} /> +{title}
+現在のバージョン: {current_version}
+最新バージョン: {latest_version}
+現在利用不可
+{plugin.title}
++ {plugin.is_downloaded + ? plugin.downloaded_plugin_info?.title || plugin.latest_plugin_info.title + : plugin.latest_plugin_info.title} +
{plugin.plugin_id}
{plugin.error ? (Error: {plugin.error}
) : (Downloaded Version: {plugin.downloaded_plugin_version}
-Latest Version: {plugin.latest_plugin_version}
+ {/* 状態に応じた情報表示(例:バージョン等) */}- Compatible: {plugin.min_supported_vrct_version} ~ {plugin.max_supported_vrct_version} + {plugin.is_downloaded + ? `現在のバージョン: ${plugin.downloaded_plugin_info?.plugin_version}` + : `最新バージョン: ${plugin.latest_plugin_info.plugin_version}`}
{t("update_modal.is_latest_version_already")}
; } return{t("update_modal.is_current_compute_device")}
; +}; + +const PluginUpdateNotification = () => { + const { enabledPluginsList } = usePlugins(); + + const incompatible_plugins_list = enabledPluginsList(); + + return ( +{plugin.title}
+ })} +