fix: 修复 svelte 升级后 status-editor 按钮无法点击的问题 (#603)

This commit is contained in:
ᴀᴍᴛᴏᴀᴇʀ
2026-01-12 11:22:48 +08:00
committed by GitHub
parent ea575b04e6
commit 264de2487e
2 changed files with 67 additions and 53 deletions
@@ -11,11 +11,19 @@
import type { StatusUpdate, UpdateFilteredVideoStatusRequest } from '$lib/types'; import type { StatusUpdate, UpdateFilteredVideoStatusRequest } from '$lib/types';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
export let open = false; let {
export let hasFilters = false; open = $bindable(false),
export let loading = false; hasFilters = false,
export let filterDescriptionParts: string[] = []; loading = false,
export let onsubmit: (request: UpdateFilteredVideoStatusRequest) => void; filterDescriptionParts = [],
onsubmit
}: {
open?: boolean;
hasFilters?: boolean;
loading?: boolean;
filterDescriptionParts?: string[];
onsubmit: (request: UpdateFilteredVideoStatusRequest) => void;
} = $props();
// 视频任务名称(与后端 VideoStatus 对应) // 视频任务名称(与后端 VideoStatus 对应)
const videoTaskNames = ['视频封面', '视频信息', 'UP 主头像', 'UP 主信息', '分页下载']; const videoTaskNames = ['视频封面', '视频信息', 'UP 主头像', 'UP 主信息', '分页下载'];
@@ -27,29 +35,25 @@
type StatusValue = null | 0 | 7; type StatusValue = null | 0 | 7;
// 视频任务状态,默认都是 null(未选择) // 视频任务状态,默认都是 null(未选择)
let videoStatuses: StatusValue[] = Array(5).fill(null); let videoStatuses = $state<StatusValue[]>(Array(5).fill(null));
// 分页任务状态,默认都是 null(未选择) // 分页任务状态,默认都是 null(未选择)
let pageStatuses: StatusValue[] = Array(5).fill(null); let pageStatuses = $state<StatusValue[]>(Array(5).fill(null));
function setVideoStatus(taskIndex: number, value: StatusValue) { function setVideoStatus(taskIndex: number, value: StatusValue) {
videoStatuses[taskIndex] = value; videoStatuses[taskIndex] = value;
videoStatuses = [...videoStatuses];
} }
function setPageStatus(taskIndex: number, value: StatusValue) { function setPageStatus(taskIndex: number, value: StatusValue) {
pageStatuses[taskIndex] = value; pageStatuses[taskIndex] = value;
pageStatuses = [...pageStatuses];
} }
function resetVideoStatus(taskIndex: number) { function resetVideoStatus(taskIndex: number) {
videoStatuses[taskIndex] = null; videoStatuses[taskIndex] = null;
videoStatuses = [...videoStatuses];
} }
function resetPageStatus(taskIndex: number) { function resetPageStatus(taskIndex: number) {
pageStatuses[taskIndex] = null; pageStatuses[taskIndex] = null;
pageStatuses = [...pageStatuses];
} }
function resetAllStatuses() { function resetAllStatuses() {
@@ -57,13 +61,16 @@
pageStatuses = Array(5).fill(null); pageStatuses = Array(5).fill(null);
} }
function hasAnyChanges(): boolean { function hasVideoChanges(): boolean {
return ( return videoStatuses.some((status) => status !== null);
videoStatuses.some((status) => status !== null) ||
pageStatuses.some((status) => status !== null)
);
} }
function hasPageChanges(): boolean {
return pageStatuses.some((status) => status !== null);
}
let hasAnyChanges = $derived(hasVideoChanges() || hasPageChanges());
function buildRequest(): UpdateFilteredVideoStatusRequest { function buildRequest(): UpdateFilteredVideoStatusRequest {
const request: UpdateFilteredVideoStatusRequest = {}; const request: UpdateFilteredVideoStatusRequest = {};
@@ -99,7 +106,7 @@
} }
function handleSubmit() { function handleSubmit() {
if (!hasAnyChanges()) { if (!hasAnyChanges) {
toast.info('请至少选择一个状态进行修改'); toast.info('请至少选择一个状态进行修改');
return; return;
} }
@@ -108,9 +115,11 @@
} }
// 当 Sheet 关闭时重置状态 // 当 Sheet 关闭时重置状态
$: if (!open) { $effect(() => {
resetAllStatuses(); if (!open) {
} resetAllStatuses();
}
});
function getStatusInfo(status: StatusValue) { function getStatusInfo(status: StatusValue) {
if (status === 0) { if (status === 0) {
@@ -305,14 +314,14 @@
<Button <Button
variant="outline" variant="outline"
onclick={resetAllStatuses} onclick={resetAllStatuses}
disabled={!hasAnyChanges() || loading} disabled={!hasAnyChanges || loading}
class="flex-1 cursor-pointer" class="flex-1 cursor-pointer"
> >
重置所有状态 重置所有状态
</Button> </Button>
<Button <Button
onclick={handleSubmit} onclick={handleSubmit}
disabled={loading || !hasAnyChanges()} disabled={loading || !hasAnyChanges}
class="flex-1 cursor-pointer" class="flex-1 cursor-pointer"
> >
{loading ? '提交中...' : '提交更改'} {loading ? '提交中...' : '提交更改'}
+36 -31
View File
@@ -12,11 +12,19 @@
import type { VideoInfo, PageInfo, StatusUpdate, UpdateVideoStatusRequest } from '$lib/types'; import type { VideoInfo, PageInfo, StatusUpdate, UpdateVideoStatusRequest } from '$lib/types';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
export let open = false; let {
export let video: VideoInfo; open = $bindable(false),
export let pages: PageInfo[] = []; video,
export let loading = false; pages = [],
export let onsubmit: (request: UpdateVideoStatusRequest) => void; loading = false,
onsubmit
}: {
open?: boolean;
video: VideoInfo;
pages?: PageInfo[];
loading?: boolean;
onsubmit: (request: UpdateVideoStatusRequest) => void;
} = $props();
// 视频任务名称(与后端 VideoStatus 对应) // 视频任务名称(与后端 VideoStatus 对应)
const videoTaskNames = ['视频封面', '视频信息', 'UP 主头像', 'UP 主信息', '分页下载']; const videoTaskNames = ['视频封面', '视频信息', 'UP 主头像', 'UP 主信息', '分页下载'];
@@ -24,28 +32,13 @@
// 分页任务名称(与后端 PageStatus 对应) // 分页任务名称(与后端 PageStatus 对应)
const pageTaskNames = ['视频封面', '视频内容', '视频信息', '视频弹幕', '视频字幕']; const pageTaskNames = ['视频封面', '视频内容', '视频信息', '视频弹幕', '视频字幕'];
// 重置单个视频任务到原始状态 let videoStatuses = $state<number[]>([]);
function resetVideoTask(taskIndex: number) { let pageStatuses = $state<Record<number, number[]>>({});
videoStatuses[taskIndex] = originalVideoStatuses[taskIndex];
videoStatuses = [...videoStatuses];
}
// 重置单个分页任务到原始状态 let originalVideoStatuses = $state<number[]>([]);
function resetPageTask(pageId: number, taskIndex: number) { let originalPageStatuses = $state<Record<number, number[]>>({});
if (!pageStatuses[pageId]) {
pageStatuses[pageId] = [];
}
pageStatuses[pageId][taskIndex] = originalPageStatuses[pageId]?.[taskIndex] ?? 0;
pageStatuses = { ...pageStatuses };
}
let videoStatuses: number[] = []; $effect(() => {
let pageStatuses: Record<number, number[]> = {};
let originalVideoStatuses: number[] = [];
let originalPageStatuses: Record<number, number[]> = {};
$: {
videoStatuses = [...video.download_status]; videoStatuses = [...video.download_status];
originalVideoStatuses = [...video.download_status]; originalVideoStatuses = [...video.download_status];
@@ -68,6 +61,19 @@
pageStatuses = {}; pageStatuses = {};
originalPageStatuses = {}; originalPageStatuses = {};
} }
});
// 重置单个视频任务到原始状态
function resetVideoTask(taskIndex: number) {
videoStatuses[taskIndex] = originalVideoStatuses[taskIndex];
}
// 重置单个分页任务到原始状态
function resetPageTask(pageId: number, taskIndex: number) {
if (!pageStatuses[pageId]) {
pageStatuses[pageId] = [];
}
pageStatuses[pageId][taskIndex] = originalPageStatuses[pageId]?.[taskIndex] ?? 0;
} }
function handleVideoStatusChange(taskIndex: number, newValue: number) { function handleVideoStatusChange(taskIndex: number, newValue: number) {
@@ -108,9 +114,8 @@
}); });
} }
function hasAnyChanges(): boolean { // 使用 $derived 创建派生状态
return hasVideoChanges() || hasPageChanges(); let hasAnyChanges = $derived(hasVideoChanges() || hasPageChanges());
}
function buildRequest(): UpdateVideoStatusRequest { function buildRequest(): UpdateVideoStatusRequest {
const request: UpdateVideoStatusRequest = {}; const request: UpdateVideoStatusRequest = {};
@@ -151,7 +156,7 @@
} }
function handleSubmit() { function handleSubmit() {
if (!hasAnyChanges()) { if (!hasAnyChanges) {
toast.info('没有状态变更需要提交'); toast.info('没有状态变更需要提交');
return; return;
} }
@@ -231,14 +236,14 @@
<Button <Button
variant="outline" variant="outline"
onclick={resetAllStatuses} onclick={resetAllStatuses}
disabled={!hasAnyChanges()} disabled={!hasAnyChanges}
class="flex-1 cursor-pointer" class="flex-1 cursor-pointer"
> >
重置所有状态 重置所有状态
</Button> </Button>
<Button <Button
onclick={handleSubmit} onclick={handleSubmit}
disabled={loading || !hasAnyChanges()} disabled={loading || !hasAnyChanges}
class="flex-1 cursor-pointer" class="flex-1 cursor-pointer"
> >
{loading ? '提交中...' : '提交更改'} {loading ? '提交中...' : '提交更改'}