diff --git a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.jsx b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.jsx index 903ca26b..72d48e48 100644 --- a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.jsx @@ -1,40 +1,28 @@ import styles from "./SupportersContainer.module.scss"; -import { useState, useEffect } from "react"; -import vrct_supporters_title from "@images/supporters/vrct_supporters_title.png"; +import { useEffect } from "react"; import { SupportersWrapper } from "./supporters_wrapper/SupportersWrapper"; -import { clsx } from "clsx"; -const SHUFFLE_INTERVAL_TIME = 20000; +import { useSupporters } from "@logics_configs"; +import { supporters_images_url } from "@ui_configs"; export const SupportersContainer = () => { + const { currentSupportersData, asyncFetchSupportersData } = useSupporters(); + + useEffect(() => { + asyncFetchSupportersData(); + }, []); + + if (currentSupportersData.state === "error") + return
Failed to retrieve data.
; + + if (currentSupportersData.state === "pending" || currentSupportersData.data === null) + return
Loading...
; + + const supporters_settings = currentSupportersData.data.supporters_settings; return (
- - - - + +

{`みなさんのおかげで、みしゃ社長は布団で寝ることを許され(in開発室) しいなは喜び庭駆け回っています!!!ふわもちもぐもぐです!ありがとうございます。これからもまだまだ進化するVRCTをどうかよろしくお願いします!\nThanks to everyone, Misha has been granted the privilege of sleeping in a proper bed (in the development room), and Shiina is so happy, running around the yard! Fuwa-mochi-mogu-mogu! Thank you so much! We hope you'll continue to support the ever-evolving VRCT!`}

); -}; - -const ProgressBar = () => { - const [is_active, setIsActive] = useState(false); - - useEffect(() => { - setIsActive(true); - const interval = setInterval(() => { - setIsActive(false); - setTimeout(() => setIsActive(true), 50); - }, SHUFFLE_INTERVAL_TIME); - - return () => clearInterval(interval); - }, []); - - return ( -
- ); }; \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.module.scss b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.module.scss index 4b525879..7174d6f4 100644 --- a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/SupportersContainer.module.scss @@ -13,14 +13,4 @@ font-size: 1.4rem; margin-top: 2rem; color: var(--dark_300_color); -} - -.progress_bar { - height: 0.2rem; - width: 0%; - &.progress_bar_active { - transition: width 20000ms linear; - background-color: var(--primary_400_color); - width: 100%; - } } \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.jsx b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.jsx index 1a0a0a31..58b2a4c8 100644 --- a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.jsx @@ -6,222 +6,162 @@ import { shuffleArray, randomIntMinMax, randomMinMax } from "@utils"; import { useSettingBoxScrollPosition, -} from "@logics_configs" + useSupporters, +} from "@logics_configs"; -import json_data from "./data.json"; - -const target_supporting_month = "2025-01"; -const calc_support_period = ["2024-10", "2024-11", "2024-12", "2025-01"]; +import { supporters_images_url } from "@ui_configs"; const SHUFFLE_INTERVAL_TIME = 20000; - - const and_you_data = { supporter_id: "and_you", }; -const getImagePath = (images, file_name) => { - const image_path = Object.keys(images).find((path) => path.endsWith(`${file_name}.png`)); - return image_path ? images[image_path]?.default : null; -}; - const image_sets = { - supporter_cards: import.meta.glob("@images/supporters/supporter_cards/*.png", { eager: true }), - chato_expressions: import.meta.glob("@images/supporters/chato_expressions/*.png", { eager: true }), - supporters_labels: import.meta.glob("@images/supporters/supporters_labels/*.png", { eager: true }), - supporters_icons: import.meta.glob("@images/supporters/supporters_icons/*.png", { eager: true }), + supporter_cards: `${supporters_images_url}/supporter_cards/`, + chato_expressions: `${supporters_images_url}/chato_expressions/`, + supporters_labels: `${supporters_images_url}/supporters_labels/`, + supporters_icons: `${supporters_images_url}/supporters_icons/`, }; const getSupporterCard = (plan_name) => { const card_map = { - "もぐもぐ_2000": "mogu_card", - "もちもち_1000": "mochi_card", - "ふわふわ_500": "fuwa_card", - "Basic_300": "basic_card", + "mogu_2000": "mogu_card", + "mochi_1000": "mochi_card", + "fuwa_500": "fuwa_card", + "basic_300": "basic_card", }; - return getImagePath(image_sets.supporter_cards, card_map[plan_name] || "basic_card"); + if (!card_map[plan_name]) return `${image_sets.supporter_cards}basic_card.png`; + + return `${image_sets.supporter_cards}${card_map[plan_name]}.png`; }; -const getChatoExpressionsPath = (file_name) => - getImagePath(image_sets.chato_expressions, file_name); +const getChatoExpressionsPath = (file_name) => `${image_sets.chato_expressions}${file_name}.png`; +const getSupportersLabelsPath = (file_name) => `${image_sets.supporters_labels}${file_name}.png`; +const getSupportersIconsPath = (file_name) => `${image_sets.supporters_icons}${file_name}.png`; -const getSupportersLabelsPath = (file_name) => - getImagePath(image_sets.supporters_labels, file_name); -const getSupportersIconsPath = (file_name) => - getImagePath(image_sets.supporters_icons, file_name); - -const chato_ex_count = Object.keys(image_sets.chato_expressions).length; - -export const SupportersWrapper = () => { +export const SupportersWrapper = ({supporters_settings}) => { const { saveScrollPosition, restoreScrollPosition } = useSettingBoxScrollPosition(); + const { currentSupportersData } = useSupporters(); - let credit_pending_count = 0; - const filtered_data = json_data.filter((supporter) => { - if (!supporter.supporter_id) return false; + const [json_data, setJsonData] = useState(); + const [supportersData, setSupportersData] = useState([]); + const [chatoExpressions, setChatoExpressions] = useState([]); - const months = Object.keys(supporter).filter((key) => key.match(/^\d{4}-\d{2}$/)); - const has_valid_month = months.some((month) => supporter[month]); - if (!has_valid_month) return false; - - const basic_300_months = months.filter((month) => supporter[month] === "Basic_300"); - const has_special_plan = months.some((month) => ["ふわふわ_500", "もちもち_1000", "もぐもぐ_2000"].includes(supporter[month])); - - if (basic_300_months.length === 1 && !has_special_plan) { - credit_pending_count++; - return false; - } - - return true; - }); - - const grouped_data = { - もぐもぐ_2000: [], - もちもち_1000: [], - ふわふわ_500: [], - Basic_300: [], - empty: [], - and_you: [], - }; - - filtered_data.forEach((supporter) => { - const value = supporter[target_supporting_month] || "empty"; - if (grouped_data[value]) { - grouped_data[value].push(supporter); - } else { - grouped_data["empty"].push(supporter); - } - }); - - const [supportersData, setSupportersData] = useState(() => [ - ...grouped_data["もぐもぐ_2000"], - ...grouped_data["もちもち_1000"], - ...grouped_data["ふわふわ_500"], - ...grouped_data["Basic_300"], - ...grouped_data["empty"], - and_you_data, - ]); + useEffect(() => { + setJsonData(currentSupportersData.data); + }, [currentSupportersData.data]); - const [chatoExpressions, setChatoExpressions] = useState(() => - supportersData.map(() => - getChatoExpressionsPath(`chato_expression_${randomIntMinMax(1, chato_ex_count)}`) - ) - ); + const target_supporting_month = supporters_settings.target_supporting_month; + const calc_support_period = supporters_settings.calc_support_period; + const chato_ex_count = supporters_settings.chato_ex_count; + const last_updated_local_date = new Date(supporters_settings.last_updated_utc_date)?.toString(); + const recalcAndUpdateSupporters = useCallback(() => { + if (!json_data) return; + + let credit_pending_count = 0; + const newGroupedData = { + "mogu_2000": [], + "mochi_1000": [], + "fuwa_500": [], + "basic_300": [], + "empty": [], + "and_you": [], + }; + + const filtered_data = json_data.supporters_data.filter((supporter) => { + if (!supporter.supporter_id) return false; + + const months = Object.keys(supporter).filter((key) => + key.match(/^\d{4}-\d{2}$/) + ); + const has_valid_month = months.some((month) => supporter[month]); + if (!has_valid_month) return false; + + const basic_300_months = months.filter( + (month) => supporter[month] === "basic_300" + ); + const has_special_plan = months.some((month) => + ["fuwa_500", "mochi_1000", "mogu_2000"].includes(supporter[month]) + ); + + if (basic_300_months.length === 1 && !has_special_plan) { + credit_pending_count++; + return false; + } + + return true; + }); + + filtered_data.forEach((supporter) => { + const value = supporter[target_supporting_month] || "empty"; + if (newGroupedData[value]) { + newGroupedData[value].push(supporter); + } else { + newGroupedData["empty"].push(supporter); + } + }); - const shuffleSupporters = useCallback(() => { - saveScrollPosition(); const newSupportersData = [ - ...shuffleArray(grouped_data["もぐもぐ_2000"]), - ...shuffleArray(grouped_data["もちもち_1000"]), - ...shuffleArray(grouped_data["ふわふわ_500"]), - ...shuffleArray(grouped_data["Basic_300"]), - ...shuffleArray(grouped_data["empty"]), + ...shuffleArray(newGroupedData["mogu_2000"]), + ...shuffleArray(newGroupedData["mochi_1000"]), + ...shuffleArray(newGroupedData["fuwa_500"]), + ...shuffleArray(newGroupedData["basic_300"]), + ...shuffleArray(newGroupedData["empty"]), and_you_data, ]; - setSupportersData(newSupportersData); + setSupportersData(newSupportersData); setChatoExpressions( newSupportersData.map(() => - getChatoExpressionsPath(`chato_expression_${randomIntMinMax(1, chato_ex_count)}`) + getChatoExpressionsPath( + `chato_expression_${randomIntMinMax(1, chato_ex_count)}` + ) ) ); - setTimeout(() => restoreScrollPosition(), 0); - }, [grouped_data]); - - const renderImages = () => { - return supportersData.map((item, index) => { - const target_plan = item[target_supporting_month]; - const img_src = getSupporterCard(target_plan); - const is_default_icon = item.supporter_icon_id === ""; - const is_icon_plan = ["もぐもぐ_2000", "もちもち_1000"].includes(target_plan); - const is_and_you = item.supporter_id === "and_you"; - - const random_delay = `${randomMinMax(0.1, 6).toFixed(1)}s`; - - - - const file_name = is_and_you ? "and_you" : `supporter_${item.supporter_id}`; - const label_img_src = getSupportersLabelsPath(file_name); - const icon_img_src = getSupportersIconsPath(`supporter_icon_${item.supporter_icon_id}`); - - const supporter_label_component_classname = clsx(styles.supporter_label_component, { - [styles.is_icon_plan]: is_icon_plan, - }); - - const supporterLabelComponent = () => ( -
- {is_icon_plan && ( -
- {is_default_icon ? ( - - ) : ( - - )} -
- )} - -
- ); - - - - const supporter_image_wrapper_classname = clsx(styles.supporter_image_wrapper, { - [styles.mogu_image]: target_plan === "もぐもぐ_2000", - }); - - return is_and_you ? ( - -
-
- - {supporterLabelComponent()} - -
-
- -
- ): img_src ? ( -
-
- - {supporterLabelComponent()} -
- -
- ) : null; - }); - }; - + }, [json_data]); + + useEffect(() => { + recalcAndUpdateSupporters(); + }, [json_data, recalcAndUpdateSupporters]); + + const shuffleSupporters = useCallback(() => { + if (!json_data) return; + saveScrollPosition(); + recalcAndUpdateSupporters(); + setTimeout(() => restoreScrollPosition(), 0); + }, [json_data, recalcAndUpdateSupporters, saveScrollPosition, restoreScrollPosition]); useEffect(() => { - shuffleSupporters(); const interval = setInterval(() => { shuffleSupporters(); }, SHUFFLE_INTERVAL_TIME); return () => clearInterval(interval); - }, []); + }, [shuffleSupporters]); return ( -
{renderImages()}
+
+ +
+ +
+

{`Last updated date:\n${last_updated_local_date}`}

+ +
); }; - const AndYouIcon = () => { return ( <> @@ -237,29 +177,136 @@ const AndYouIcon = () => { ); }; -const SupporterPeriodContainer = ({settings}) => { +const SupporterCardsComponent = ({ supportersData, chatoExpressions, target_supporting_month, calc_support_period }) => { + return supportersData.map((item, index) => { + const target_plan = item[target_supporting_month]; + const img_src = getSupporterCard(target_plan); + + const is_and_you = item.supporter_id === "and_you"; + + const random_delay = `${randomMinMax(0.1, 6).toFixed(1)}s`; + + const supporter_image_wrapper_classname = clsx( + styles.supporter_image_wrapper, + { + [styles.mogu_image]: target_plan === "mogu_2000", + } + ); + + return is_and_you ? ( + +
+
+ supporter + + +
+
+
+ ) : img_src ? ( +
+
+ supporter + +
+ +
+ ) : null; + }); +}; + +const SupporterLabelComponent = ({ item, target_plan, chato_src }) => { + const is_icon_plan = ["mogu_2000", "mochi_1000"].includes( + target_plan + ); + + const supporter_label_component_classname = clsx( + styles.supporter_label_component, + { + [styles.is_icon_plan]: is_icon_plan, + } + ); + + const is_and_you = item.supporter_id === "and_you"; + const is_default_icon = item.supporter_icon_id === ""; + + const file_name = is_and_you ? "and_you" : `supporter_${item.supporter_id}`; + const label_img_src = getSupportersLabelsPath(file_name); + const icon_img_src = getSupportersIconsPath( + `supporter_icon_${item.supporter_icon_id}` + ); + + return ( +
+ {is_icon_plan && ( +
+ {is_default_icon ? ( + chato expression + ) : ( + supporter icon + )} +
+ )} + supporter label +
+ ); +}; + +const SupporterPeriodContainer = ({ settings, calc_support_period }) => { const period_data = extractKeys(settings, calc_support_period); - return (
{Object.entries(period_data).map(([key, item], index) => { if (item === "") return null; const class_name = clsx(styles.period_box, { - [styles.mogu_bar]: item === "もぐもぐ_2000", - [styles.mochi_bar]: item === "もちもち_1000", - [styles.fuwa_bar]: item === "ふわふわ_500", - [styles.basic_bar]: item === "Basic_300", + [styles.mogu_bar]: item === "mogu_2000", + [styles.mochi_bar]: item === "mochi_1000", + [styles.fuwa_bar]: item === "fuwa_500", + [styles.basic_bar]: item === "basic_300", }); - return
+ return
; })}
); }; - - const extractKeys = (data, keys_to_extract) => { const result = {}; for (const key of keys_to_extract) { @@ -268,4 +315,31 @@ const extractKeys = (data, keys_to_extract) => { } } return result; +}; + + +const ProgressBar = () => { + const [is_active, setIsActive] = useState(false); + useEffect(() => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setIsActive(true); + }); + }); + + const interval = setInterval(() => { + setIsActive(false); + setTimeout(() => setIsActive(true), 50); + }, SHUFFLE_INTERVAL_TIME); + + return () => clearInterval(interval); + }, []); + + return ( +
+ ); }; \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.module.scss b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.module.scss index b4135b87..25c6f967 100644 --- a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/SupportersWrapper.module.scss @@ -1,3 +1,11 @@ +.container { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 2rem; +} + .supporters_wrapper { display: flex; justify-content: center; @@ -218,4 +226,22 @@ &.basic_bar { background-color: var(--dark_800_color); } +} + + +.progress_bar { + height: 0.2rem; + width: 0%; + &.progress_bar_active { + transition: width 20000ms linear; + background-color: var(--primary_400_color); + width: 100%; + } +} + +.last_updated_local_date { + font-size: 1rem; + color: var(--dark_800_color); + width: 100%; + text-align: end; } \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/data.json b/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/data.json deleted file mode 100644 index 12ef65eb..00000000 --- a/src-ui/app/config_page/setting_section/setting_box/supporters/supporters_container/supporters_wrapper/data.json +++ /dev/null @@ -1,343 +0,0 @@ -[ - { - "supporter_id": 1, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "Basic_300", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 2, - "supporter_icon_id": 8, - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 3, - "supporter_icon_id": 4, - "2024-10": "もちもち_1000", - "2024-11": "もちもち_1000", - "2024-12": "もちもち_1000", - "2025-01": "もちもち_1000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 4, - "supporter_icon_id": "", - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 5, - "supporter_icon_id": "", - "2024-10": "ふわふわ_500", - "2024-11": "ふわふわ_500", - "2024-12": "ふわふわ_500", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 6, - "supporter_icon_id": "", - "2024-10": "ふわふわ_500", - "2024-11": "ふわふわ_500", - "2024-12": "ふわふわ_500", - "2025-01": "ふわふわ_500", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 7, - "supporter_icon_id": "", - "2024-10": "ふわふわ_500", - "2024-11": "ふわふわ_500", - "2024-12": "ふわふわ_500", - "2025-01": "ふわふわ_500", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 8, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "Basic_300", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 9, - "supporter_icon_id": 6, - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 10, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "Basic_300", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 11, - "supporter_icon_id": "", - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 12, - "supporter_icon_id": "", - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 13, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "Basic_300", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 14, - "supporter_icon_id": 2, - "2024-10": "もちもち_1000", - "2024-11": "もちもち_1000", - "2024-12": "もちもち_1000", - "2025-01": "もちもち_1000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 15, - "supporter_icon_id": 5, - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 16, - "supporter_icon_id": "", - "2024-10": "もぐもぐ_2000", - "2024-11": "", - "2024-12": "", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 17, - "supporter_icon_id": "", - "2024-10": "もちもち_1000", - "2024-11": "もちもち_1000", - "2024-12": "もちもち_1000", - "2025-01": "もちもち_1000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 18, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 19, - "supporter_icon_id": 1, - "2024-10": "もぐもぐ_2000", - "2024-11": "もぐもぐ_2000", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 20, - "supporter_icon_id": "", - "2024-10": "Basic_300", - "2024-11": "Basic_300", - "2024-12": "Basic_300", - "2025-01": "ふわふわ_500", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 21, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "ふわふわ_500", - "2024-12": "ふわふわ_500", - "2025-01": "ふわふわ_500", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 22, - "supporter_icon_id": 3, - "2024-10": "", - "2024-11": "", - "2024-12": "もぐもぐ_2000", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 23, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "ふわふわ_500", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 24, - "supporter_icon_id": 7, - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 25, - "supporter_icon_id": 9, - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "もぐもぐ_2000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 26, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "もちもち_1000", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 27, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 28, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "Basic_300", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 29, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": 30, - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - }, - { - "supporter_id": "", - "supporter_icon_id": "", - "2024-10": "", - "2024-11": "", - "2024-12": "", - "2025-01": "", - "2025-02": "", - "2025-03": "", - "2025-04": "" - } -] \ No newline at end of file diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_1.png b/src-ui/assets/supporters/chato_expressions/chato_expression_1.png deleted file mode 100644 index 849ce433..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_1.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_2.png b/src-ui/assets/supporters/chato_expressions/chato_expression_2.png deleted file mode 100644 index 8274f9b0..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_2.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_3.png b/src-ui/assets/supporters/chato_expressions/chato_expression_3.png deleted file mode 100644 index 4cc17cf6..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_3.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_4.png b/src-ui/assets/supporters/chato_expressions/chato_expression_4.png deleted file mode 100644 index e39e830f..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_4.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_5.png b/src-ui/assets/supporters/chato_expressions/chato_expression_5.png deleted file mode 100644 index c0544641..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_5.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_6.png b/src-ui/assets/supporters/chato_expressions/chato_expression_6.png deleted file mode 100644 index 21b04d09..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_6.png and /dev/null differ diff --git a/src-ui/assets/supporters/chato_expressions/chato_expression_7.png b/src-ui/assets/supporters/chato_expressions/chato_expression_7.png deleted file mode 100644 index e53800aa..00000000 Binary files a/src-ui/assets/supporters/chato_expressions/chato_expression_7.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporter_cards/basic_card.png b/src-ui/assets/supporters/supporter_cards/basic_card.png deleted file mode 100644 index c3a015ef..00000000 Binary files a/src-ui/assets/supporters/supporter_cards/basic_card.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporter_cards/fuwa_card.png b/src-ui/assets/supporters/supporter_cards/fuwa_card.png deleted file mode 100644 index 379540ef..00000000 Binary files a/src-ui/assets/supporters/supporter_cards/fuwa_card.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporter_cards/mochi_card.png b/src-ui/assets/supporters/supporter_cards/mochi_card.png deleted file mode 100644 index b8459285..00000000 Binary files a/src-ui/assets/supporters/supporter_cards/mochi_card.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporter_cards/mogu_card.png b/src-ui/assets/supporters/supporter_cards/mogu_card.png deleted file mode 100644 index c049481d..00000000 Binary files a/src-ui/assets/supporters/supporter_cards/mogu_card.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_1.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_1.png deleted file mode 100644 index b8629841..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_1.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_2.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_2.png deleted file mode 100644 index ee0d91ac..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_2.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_3.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_3.png deleted file mode 100644 index 3bfe93d3..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_3.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_4.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_4.png deleted file mode 100644 index 7c088051..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_4.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_5.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_5.png deleted file mode 100644 index 28eff424..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_5.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_6.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_6.png deleted file mode 100644 index 5d7a6d97..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_6.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_7.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_7.png deleted file mode 100644 index 11d0860d..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_7.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_8.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_8.png deleted file mode 100644 index b72e7e91..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_8.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_icons/supporter_icon_9.png b/src-ui/assets/supporters/supporters_icons/supporter_icon_9.png deleted file mode 100644 index 10456112..00000000 Binary files a/src-ui/assets/supporters/supporters_icons/supporter_icon_9.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/and_you.png b/src-ui/assets/supporters/supporters_labels/and_you.png deleted file mode 100644 index 5dba52d7..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/and_you.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_1.png b/src-ui/assets/supporters/supporters_labels/supporter_1.png deleted file mode 100644 index da84f7bc..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_1.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_10.png b/src-ui/assets/supporters/supporters_labels/supporter_10.png deleted file mode 100644 index adcb90e1..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_10.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_11.png b/src-ui/assets/supporters/supporters_labels/supporter_11.png deleted file mode 100644 index 34874cdb..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_11.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_12.png b/src-ui/assets/supporters/supporters_labels/supporter_12.png deleted file mode 100644 index 91b4434c..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_12.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_13.png b/src-ui/assets/supporters/supporters_labels/supporter_13.png deleted file mode 100644 index 97874ce5..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_13.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_14.png b/src-ui/assets/supporters/supporters_labels/supporter_14.png deleted file mode 100644 index ccc0dd1d..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_14.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_15.png b/src-ui/assets/supporters/supporters_labels/supporter_15.png deleted file mode 100644 index 3856a8c0..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_15.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_16.png b/src-ui/assets/supporters/supporters_labels/supporter_16.png deleted file mode 100644 index 01f48ec8..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_16.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_17.png b/src-ui/assets/supporters/supporters_labels/supporter_17.png deleted file mode 100644 index 2597f4d1..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_17.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_18.png b/src-ui/assets/supporters/supporters_labels/supporter_18.png deleted file mode 100644 index 91f6997b..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_18.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_19.png b/src-ui/assets/supporters/supporters_labels/supporter_19.png deleted file mode 100644 index 40cdbf4f..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_19.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_2.png b/src-ui/assets/supporters/supporters_labels/supporter_2.png deleted file mode 100644 index f739f4f1..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_2.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_20.png b/src-ui/assets/supporters/supporters_labels/supporter_20.png deleted file mode 100644 index fa54e057..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_20.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_21.png b/src-ui/assets/supporters/supporters_labels/supporter_21.png deleted file mode 100644 index be534d66..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_21.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_22.png b/src-ui/assets/supporters/supporters_labels/supporter_22.png deleted file mode 100644 index ae85a713..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_22.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_23.png b/src-ui/assets/supporters/supporters_labels/supporter_23.png deleted file mode 100644 index 578ec516..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_23.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_24.png b/src-ui/assets/supporters/supporters_labels/supporter_24.png deleted file mode 100644 index 28da5526..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_24.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_25.png b/src-ui/assets/supporters/supporters_labels/supporter_25.png deleted file mode 100644 index 5531503c..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_25.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_26.png b/src-ui/assets/supporters/supporters_labels/supporter_26.png deleted file mode 100644 index 58efb139..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_26.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_3.png b/src-ui/assets/supporters/supporters_labels/supporter_3.png deleted file mode 100644 index 4989b4d6..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_3.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_4.png b/src-ui/assets/supporters/supporters_labels/supporter_4.png deleted file mode 100644 index df433dba..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_4.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_5.png b/src-ui/assets/supporters/supporters_labels/supporter_5.png deleted file mode 100644 index ea70c489..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_5.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_6.png b/src-ui/assets/supporters/supporters_labels/supporter_6.png deleted file mode 100644 index e2c5952a..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_6.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_7.png b/src-ui/assets/supporters/supporters_labels/supporter_7.png deleted file mode 100644 index 29f8df44..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_7.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_8.png b/src-ui/assets/supporters/supporters_labels/supporter_8.png deleted file mode 100644 index 78b2349f..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_8.png and /dev/null differ diff --git a/src-ui/assets/supporters/supporters_labels/supporter_9.png b/src-ui/assets/supporters/supporters_labels/supporter_9.png deleted file mode 100644 index cb25ec43..00000000 Binary files a/src-ui/assets/supporters/supporters_labels/supporter_9.png and /dev/null differ diff --git a/src-ui/assets/supporters/vrct_supporters_title.png b/src-ui/assets/supporters/vrct_supporters_title.png deleted file mode 100644 index c15324af..00000000 Binary files a/src-ui/assets/supporters/vrct_supporters_title.png and /dev/null differ diff --git a/src-ui/logics/configs/index.js b/src-ui/logics/configs/index.js index 8bcf2a7c..e47621c2 100644 --- a/src-ui/logics/configs/index.js +++ b/src-ui/logics/configs/index.js @@ -56,5 +56,9 @@ export { useHotkeys } from "./hotkeys/useHotkeys"; export { useOscIpAddress } from "./advanced_settings/useOscIpAddress"; export { useOscPort } from "./advanced_settings/useOscPort"; + +export { useSupporters } from "./supporters/useSupporters"; + + export { useSettingBoxScrollPosition } from "./useSettingBoxScrollPosition"; export { useSoftwareVersion } from "./useSoftwareVersion"; \ No newline at end of file diff --git a/src-ui/logics/configs/supporters/useSupporters.jsx b/src-ui/logics/configs/supporters/useSupporters.jsx new file mode 100644 index 00000000..f465643d --- /dev/null +++ b/src-ui/logics/configs/supporters/useSupporters.jsx @@ -0,0 +1,29 @@ +import { useStore_SupportersData } from "@store"; +import { supporters_data_url } from "@ui_configs"; +export const useSupporters = () => { + const { currentSupportersData, updateSupportersData, pendingSupportersData, errorSupportersData } = useStore_SupportersData(); + + const asyncFetchSupportersData = async () => { + if (currentSupportersData.state === "pending") return; + pendingSupportersData(); + try { + const res = await fetch(supporters_data_url); + // const res = await fetch(supporters_data_url, { cache: "no-store" }); + if (!res.ok) { + throw new Error("Network response was not ok"); + } + const data = await res.json(); + updateSupportersData(data); + } catch (error) { + console.error("Error fetching supporters' data:", error); + errorSupportersData(); + } + }; + + return { + asyncFetchSupportersData, + currentSupportersData, + updateSupportersData, + pendingSupportersData, + }; +}; \ No newline at end of file diff --git a/src-ui/store.js b/src-ui/store.js index 24043576..3f8391f0 100644 --- a/src-ui/store.js +++ b/src-ui/store.js @@ -280,5 +280,7 @@ export const { atomInstance: Atom_OscPort, useHook: useStore_OscPort } = createA export const { atomInstance: Atom_IsOpenedTranslatorSelector, useHook: useStore_IsOpenedTranslatorSelector } = createAtomWithHook(false, "IsOpenedTranslatorSelector"); +export const { atomInstance: Atom_SupportersData, useHook: useStore_SupportersData } = createAtomWithHook(null, "SupportersData", {is_state_ok: true}); + export const { atomInstance: Atom_VrctPosterIndex, useHook: useStore_VrctPosterIndex } = createAtomWithHook(0, "VrctPosterIndex"); export const { atomInstance: Atom_PosterShowcaseWorldPageIndex, useHook: useStore_PosterShowcaseWorldPageIndex } = createAtomWithHook(0, "PosterShowcaseWorldPageIndex"); \ No newline at end of file diff --git a/src-ui/ui_configs.js b/src-ui/ui_configs.js index 1b854015..ef58fba8 100644 --- a/src-ui/ui_configs.js +++ b/src-ui/ui_configs.js @@ -74,4 +74,7 @@ export const whisper_weight_type_status = [ { id: "large-v1", label: "large-v1", is_downloaded: false, progress: null }, { id: "large-v2", label: "large-v2", is_downloaded: false, progress: null }, { id: "large-v3", label: "large-v3", is_downloaded: false, progress: null }, -]; \ No newline at end of file +]; + +export const supporters_data_url = "https://shiinasakamoto.github.io/vrct_supporters/assets/supporters/data.json"; +export const supporters_images_url = "https://ShiinaSakamoto.github.io/vrct_supporters/assets/supporters"; \ No newline at end of file