移除返回旧版入口和相关代码
This commit is contained in:
@@ -1,10 +1,14 @@
|
|||||||
# What's New
|
# What's New
|
||||||
|
|
||||||
> This document records feature updates and bug fixes for the Luxsin X9 controller. A new entry is appended here after each release.
|
> This document records feature updates and bug fixes for the Luxsin X9 controller. Entries are listed in reverse chronological order — the newest release appears first.
|
||||||
|
|
||||||
|
## v2026.08.17
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Removed the "Legacy version" entry from the home page. The legacy Web UI is no longer being updated or maintained — please use this new Web UI for the best experience.
|
||||||
|
|
||||||
## v2026.08.06
|
## v2026.08.06
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
- Added a "What's New" entry on the home page, allowing you to view release notes online.
|
- Added a "What's New" entry on the home page, allowing you to view release notes online.
|
||||||
- Added Undo support on the EQ page: tap the Undo button to revert your most recent change. It covers band parameter edits (frequency / gain / Q / filter type), slider drag adjustments, preamp and auto-preamp changes, A/B mode copy & switch, and batch edits. Each undo shows a toast describing exactly what was reverted (e.g. "A Band 3 GAIN +2.0 → 0.0").
|
- Added Undo support on the EQ page: tap the Undo button to revert your most recent change. It covers band parameter edits (frequency / gain / Q / filter type), slider drag adjustments, preamp and auto-preamp changes, A/B mode copy & switch, and batch edits. Each undo shows a toast describing exactly what was reverted (e.g. "A Band 3 GAIN +2.0 → 0.0").
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "Demomodus: Vom Gerät getrennt.",
|
"powerOffToastDemo": "Demomodus: Vom Gerät getrennt.",
|
||||||
"powerOffToastSent": "Abschaltbefehl gesendet.",
|
"powerOffToastSent": "Abschaltbefehl gesendet.",
|
||||||
"doubleClickHint": "Doppelklick zum Eintreten",
|
"doubleClickHint": "Doppelklick zum Eintreten",
|
||||||
"backToLegacy": "Alte Version",
|
|
||||||
"changelog": "Neuerungen",
|
"changelog": "Neuerungen",
|
||||||
"changelogLoadFailed": "Laden fehlgeschlagen, bitte später erneut versuchen"
|
"changelogLoadFailed": "Laden fehlgeschlagen, bitte später erneut versuchen"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "Demo mode: disconnected from the device.",
|
"powerOffToastDemo": "Demo mode: disconnected from the device.",
|
||||||
"powerOffToastSent": "Shutdown command sent.",
|
"powerOffToastSent": "Shutdown command sent.",
|
||||||
"doubleClickHint": "Double-click to enter",
|
"doubleClickHint": "Double-click to enter",
|
||||||
"backToLegacy": "Legacy version",
|
|
||||||
"changelog": "What's New",
|
"changelog": "What's New",
|
||||||
"changelogLoadFailed": "Failed to load, please try again later"
|
"changelogLoadFailed": "Failed to load, please try again later"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "Modo demo: desconectado del dispositivo.",
|
"powerOffToastDemo": "Modo demo: desconectado del dispositivo.",
|
||||||
"powerOffToastSent": "Comando de apagado enviado.",
|
"powerOffToastSent": "Comando de apagado enviado.",
|
||||||
"doubleClickHint": "Doble clic para entrar",
|
"doubleClickHint": "Doble clic para entrar",
|
||||||
"backToLegacy": "Versión anterior",
|
|
||||||
"changelog": "Novedades",
|
"changelog": "Novedades",
|
||||||
"changelogLoadFailed": "Error al cargar, inténtelo de nuevo más tarde"
|
"changelogLoadFailed": "Error al cargar, inténtelo de nuevo más tarde"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "Mode démo : déconnecté de l'appareil.",
|
"powerOffToastDemo": "Mode démo : déconnecté de l'appareil.",
|
||||||
"powerOffToastSent": "Commande d'extinction envoyée.",
|
"powerOffToastSent": "Commande d'extinction envoyée.",
|
||||||
"doubleClickHint": "Double-clic pour entrer",
|
"doubleClickHint": "Double-clic pour entrer",
|
||||||
"backToLegacy": "Ancienne version",
|
|
||||||
"changelog": "Nouveautés",
|
"changelog": "Nouveautés",
|
||||||
"changelogLoadFailed": "Échec du chargement, veuillez réessayer plus tard"
|
"changelogLoadFailed": "Échec du chargement, veuillez réessayer plus tard"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "演示模式:已中斷與裝置的連線",
|
"powerOffToastDemo": "演示模式:已中斷與裝置的連線",
|
||||||
"powerOffToastSent": "已傳送關機指令",
|
"powerOffToastSent": "已傳送關機指令",
|
||||||
"doubleClickHint": "按兩下進入",
|
"doubleClickHint": "按兩下進入",
|
||||||
"backToLegacy": "返回舊版",
|
|
||||||
"changelog": "更新說明",
|
"changelog": "更新說明",
|
||||||
"changelogLoadFailed": "載入失敗,請稍後再試"
|
"changelogLoadFailed": "載入失敗,請稍後再試"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
"powerOffToastDemo": "演示模式:已断开与设备的连接",
|
"powerOffToastDemo": "演示模式:已断开与设备的连接",
|
||||||
"powerOffToastSent": "已发送关机指令",
|
"powerOffToastSent": "已发送关机指令",
|
||||||
"doubleClickHint": "双击进入",
|
"doubleClickHint": "双击进入",
|
||||||
"backToLegacy": "返回旧版",
|
|
||||||
"changelog": "更新说明",
|
"changelog": "更新说明",
|
||||||
"changelogLoadFailed": "加载失败,请稍后重试"
|
"changelogLoadFailed": "加载失败,请稍后重试"
|
||||||
},
|
},
|
||||||
|
|||||||
+24
-10
@@ -36,7 +36,6 @@ import {
|
|||||||
Sliders,
|
Sliders,
|
||||||
Activity,
|
Activity,
|
||||||
Gauge,
|
Gauge,
|
||||||
Undo2,
|
|
||||||
Bluetooth,
|
Bluetooth,
|
||||||
SkipBack,
|
SkipBack,
|
||||||
SkipForward,
|
SkipForward,
|
||||||
@@ -195,12 +194,35 @@ export default function Home() {
|
|||||||
const [volumeConfirm, setVolumeConfirm] = useState<null | "min" | "max">(null);
|
const [volumeConfirm, setVolumeConfirm] = useState<null | "min" | "max">(null);
|
||||||
const [easterEggActive, setEasterEggActive] = useState(false);
|
const [easterEggActive, setEasterEggActive] = useState(false);
|
||||||
const [vuHeights, setVuHeights] = useState<number[]>(idleVuBarHeights);
|
const [vuHeights, setVuHeights] = useState<number[]>(idleVuBarHeights);
|
||||||
|
/** 更新说明入口展示的最新版本号(取自 changelog.md 首个 "## v..." 标题) */
|
||||||
|
const [changelogVersion, setChangelogVersion] = useState<string | null>(null);
|
||||||
const jackProgressRef = useRef(0);
|
const jackProgressRef = useRef(0);
|
||||||
const jackResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
const jackResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||||
const eggRafRef = useRef<number | null>(null);
|
const eggRafRef = useRef<number | null>(null);
|
||||||
/** 下次三连击成功时播放的律动:1=旋律,2=海浪(各需单独三连击触发) */
|
/** 下次三连击成功时播放的律动:1=旋律,2=海浪(各需单独三连击触发) */
|
||||||
const jackEggNextRef = useRef<1 | 2>(1);
|
const jackEggNextRef = useRef<1 | 2>(1);
|
||||||
|
|
||||||
|
// 拉取更新说明首个版本号,静默降级(失败则入口不显示版本)
|
||||||
|
useEffect(() => {
|
||||||
|
let cancelled = false;
|
||||||
|
fetch(`${import.meta.env.BASE_URL}changelog.md`)
|
||||||
|
.then((res) => {
|
||||||
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||||
|
return res.text();
|
||||||
|
})
|
||||||
|
.then((text) => {
|
||||||
|
if (cancelled) return;
|
||||||
|
const m = text.match(/^##\s+(v[^\s#]+)\s*$/m);
|
||||||
|
if (m) setChangelogVersion(m[1]);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
/* 静默:入口不显示版本号 */
|
||||||
|
});
|
||||||
|
return () => {
|
||||||
|
cancelled = true;
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
const homeText = useMemo((): HomeLocale => {
|
const homeText = useMemo((): HomeLocale => {
|
||||||
if (!deviceState) return {} as HomeLocale;
|
if (!deviceState) return {} as HomeLocale;
|
||||||
const loc =
|
const loc =
|
||||||
@@ -956,18 +978,10 @@ export default function Home() {
|
|||||||
thumbnail={`${import.meta.env.BASE_URL}images/vu/vu${(ds.vu ?? 0) + 1}.png`}
|
thumbnail={`${import.meta.env.BASE_URL}images/vu/vu${(ds.vu ?? 0) + 1}.png`}
|
||||||
onClick={() => setLocation("/vu")}
|
onClick={() => setLocation("/vu")}
|
||||||
/>
|
/>
|
||||||
<ListRow
|
|
||||||
icon={<Undo2 size={18} />}
|
|
||||||
label={homeText.backToLegacy ?? "返回旧版"}
|
|
||||||
onClick={() => {
|
|
||||||
const target = ip.trim();
|
|
||||||
if (!target) return;
|
|
||||||
window.location.href = `https://am.luxsinaudio.com/i.html?ip=${encodeURIComponent(target)}`;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<ListRow
|
<ListRow
|
||||||
icon={<BookOpenCheck size={18} />}
|
icon={<BookOpenCheck size={18} />}
|
||||||
label={homeText.changelog ?? "更新说明"}
|
label={homeText.changelog ?? "更新说明"}
|
||||||
|
value={changelogVersion ?? undefined}
|
||||||
onClick={() => setLocation("/changelog")}
|
onClick={() => setLocation("/changelog")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user