Separate plugins controller. Add ui pattern for outdated plugins and the plugin that is not supported current vrct version but supported in newest vrct version.
115 lines
5.1 KiB
JavaScript
115 lines
5.1 KiB
JavaScript
import { useEffect } from "react";
|
|
import { usePlugins } from "@logics_configs";
|
|
|
|
export const FetchLatestPluginsDataController = () => {
|
|
const {
|
|
asyncFetchPluginsInfo,
|
|
updatePluginsData,
|
|
downloadAndExtractPlugin,
|
|
currentIsInitializedLoadPlugin,
|
|
currentIsFetchedPluginsInfo,
|
|
updateIsFetchedPluginsInfo,
|
|
} = usePlugins();
|
|
|
|
const asyncUpdateLatestPluginsData = async () => {
|
|
try {
|
|
const info_array = await asyncFetchPluginsInfo();
|
|
updatePluginsData(prev => {
|
|
// Map を利用してそれぞれの配列を plugin_id で参照できるようにする
|
|
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]));
|
|
|
|
console.log(prev_map);
|
|
|
|
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 = {
|
|
...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 },
|
|
}
|
|
}
|
|
} else { // 未ダウンロード
|
|
new_plugin_info = {
|
|
plugin_id: info.plugin_id,
|
|
is_downloaded: false,
|
|
is_latest_version_already: false,
|
|
latest_plugin_info: { ...info },
|
|
};
|
|
}
|
|
|
|
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)) {
|
|
new_data.push({ ...item, is_outdated: true });
|
|
}
|
|
});
|
|
|
|
new_data.forEach(plugin => {
|
|
if (!plugin.is_outdated) {
|
|
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) {
|
|
console.log(plugin);
|
|
|
|
if (!plugin.is_latest_version_already && plugin.is_latest_version_available) {
|
|
await downloadAndExtractPlugin(plugin);
|
|
}
|
|
}
|
|
});
|
|
|
|
new_data.forEach(async plugin => {
|
|
if (plugin.is_downloaded && plugin.is_enabled) {
|
|
if (!plugin.downloaded_plugin_info?.is_plugin_supported && !plugin.latest_plugin_info?.is_plugin_supported) {
|
|
plugin.is_enabled = false
|
|
}
|
|
}
|
|
});
|
|
|
|
return new_data;
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
console.log(currentIsInitializedLoadPlugin.data);
|
|
if (currentIsInitializedLoadPlugin.data && !currentIsFetchedPluginsInfo.data) {
|
|
asyncUpdateLatestPluginsData().then(() => {
|
|
updateIsFetchedPluginsInfo(true);
|
|
});
|
|
}
|
|
|
|
}, [currentIsInitializedLoadPlugin.data]);
|
|
|
|
return null;
|
|
}; |