[Refactor] Unify and encapsulate slider UI logic into useSliderLogic hook. Part 1.

This commit is contained in:
Sakamoto Shiina
2025-11-06 12:36:03 +09:00
parent 4adfc8fbc1
commit c76b2981c6
3 changed files with 99 additions and 49 deletions

View File

@@ -200,4 +200,66 @@ export const useConfigFunctions = (Category) => {
default: default:
return {}; return {};
} }
};
import { useState, useEffect, useCallback, useMemo } from "react";
export const useSliderLogic = ({
current_value,
setterFunction,
postUpdateAction,
min,
max,
step = 1,
hidden_label_values
}) => {
const [ui_value, setUiValue] = useState(current_value.data);
const labelFormatter = useCallback((value) => {
if (hidden_label_values && hidden_label_values.includes(value)) {
return "";
}
return value;
}, [hidden_label_values]);
const marks = useMemo(() => {
return createMarks(min, max, step, labelFormatter);
}, [min, max, step, labelFormatter]);
const onchangeFunction = useCallback((value) => {
setUiValue(value);
}, []);
const onchangeCommittedFunction = useCallback((value) => {
setterFunction(value);
}, [setterFunction]);
useEffect(() => {
if (current_value.data !== ui_value) {
setUiValue(current_value.data);
}
if (postUpdateAction) {
postUpdateAction();
}
}, [current_value.data]);
return {
ui_value,
onchangeFunction,
onchangeCommittedFunction,
marks,
};
};
const createMarks = (min, max, step = 1, labelFormatter = (value) => value) => {
const marks = [];
let current_value = min;
while (current_value <= max) {
const fixedValue = parseFloat(current_value.toFixed(1));
const label = labelFormatter(fixedValue);
marks.push({ value: fixedValue, label: `${label}` });
current_value += step;
}
return marks;
}; };

View File

@@ -13,4 +13,9 @@ export { useHotkeys } from "./config_page_setter/hotkeys/useHotkeys.js";
export { useSupporters } from "./config_page_setter/supporters/useSupporters.js"; export { useSupporters } from "./config_page_setter/supporters/useSupporters.js";
export { usePlugins } from "./config_page_setter/plugins/usePlugins.js"; export { usePlugins } from "./config_page_setter/plugins/usePlugins.js";
export { useSettingBoxScrollPosition } from "./config_page_setter/_aux/useSettingBoxScrollPosition.js"; export { useSettingBoxScrollPosition } from "./config_page_setter/_aux/useSettingBoxScrollPosition.js";
export {
useSliderLogic,
} from "./config_page_setter/useSettingsLogics.js";

View File

@@ -11,6 +11,8 @@ import {
import { import {
useAppearance, useAppearance,
useSliderLogic,
} from "@logics_configs"; } from "@logics_configs";
import { import {
@@ -56,30 +58,20 @@ const UiScalingContainer = () => {
const { currentUiScaling, setUiScaling } = useAppearance(); const { currentUiScaling, setUiScaling } = useAppearance();
const { asyncUpdateBreakPoint } = useWindow(); const { asyncUpdateBreakPoint } = useWindow();
const [ui_ui_scaling, setUiUiScaling] = useState(currentUiScaling.data); const {
ui_value,
const onchangeFunction = (value) => { onchangeFunction,
setUiUiScaling(value); onchangeCommittedFunction,
}; marks
const onchangeCommittedFunction = (value) => { } = useSliderLogic({
setUiScaling(value); current_value: currentUiScaling,
}; setterFunction: setUiScaling,
useEffect(() => { postUpdateAction: asyncUpdateBreakPoint,
setUiUiScaling(currentUiScaling.data); min: 40,
asyncUpdateBreakPoint(); max: 200,
}, [currentUiScaling.data]); step: 10,
hidden_label_values: [50, 70, 90, 110, 130, 150, 170, 190],
// [Duplicated] });
const createMarks = (min, max) => {
const marks = [];
for (let value = min; value <= max; value += 10) {
const label = ([50,70,90,110,130,150,170,190].includes(value)) ? "" : value;
marks.push({ value, label: `${label}` });
}
return marks;
};
const marks = createMarks(40, 200);
return ( return (
<SliderContainer <SliderContainer
@@ -88,7 +80,7 @@ const UiScalingContainer = () => {
max="200" max="200"
onchangeCommittedFunction={onchangeCommittedFunction} onchangeCommittedFunction={onchangeCommittedFunction}
onchangeFunction={onchangeFunction} onchangeFunction={onchangeFunction}
variable={ui_ui_scaling} variable={ui_value}
marks={marks} marks={marks}
step={null} step={null}
track={false} track={false}
@@ -100,29 +92,20 @@ const UiScalingContainer = () => {
export const MessageLogUiScalingContainer = () => { export const MessageLogUiScalingContainer = () => {
const { t } = useI18n(); const { t } = useI18n();
const { currentMessageLogUiScaling, setMessageLogUiScaling } = useAppearance(); const { currentMessageLogUiScaling, setMessageLogUiScaling } = useAppearance();
const [ui_message_log_ui_scaling, setUiMessageLogUiScaling] = useState(currentMessageLogUiScaling.data);
const onchangeFunction = (value) => { const {
setUiMessageLogUiScaling(value); ui_value,
}; onchangeFunction,
const onchangeCommittedFunction = (value) => { onchangeCommittedFunction,
setMessageLogUiScaling(value); marks
}; } = useSliderLogic({
useEffect(() => { current_value: currentMessageLogUiScaling,
setUiMessageLogUiScaling(currentMessageLogUiScaling.data); setterFunction: setMessageLogUiScaling,
}, [currentMessageLogUiScaling.data]); min: 40,
max: 200,
// [Duplicated] step: 10,
const createMarks = (min, max) => { hidden_label_values: [50, 70, 90, 110, 130, 150, 170, 190],
const marks = []; });
for (let value = min; value <= max; value += 10) {
const label = ([50,70,90,110,130,150,170,190].includes(value)) ? "" : value;
marks.push({ value, label: `${label}` });
}
return marks;
};
const marks = createMarks(40, 200);
return ( return (
<SliderContainer <SliderContainer
@@ -131,7 +114,7 @@ export const MessageLogUiScalingContainer = () => {
max="200" max="200"
onchangeCommittedFunction={onchangeCommittedFunction} onchangeCommittedFunction={onchangeCommittedFunction}
onchangeFunction={onchangeFunction} onchangeFunction={onchangeFunction}
variable={ui_message_log_ui_scaling} variable={ui_value}
marks={marks} marks={marks}
step={null} step={null}
track={false} track={false}