Added delay in redirect
This commit is contained in:
parent
3495cd38b5
commit
f1eeb65fe8
@ -13,7 +13,7 @@ type Show = {
|
|||||||
|
|
||||||
const GET_URL = "/api/v1/shows";
|
const GET_URL = "/api/v1/shows";
|
||||||
const POST_URL = "/api/v1/current";
|
const POST_URL = "/api/v1/current";
|
||||||
const REDIRECT_DELAY_MS = 1200;
|
const REDIRECT_DELAY_S = 3;
|
||||||
|
|
||||||
const HHMM = /^(\d{1,2}):([0-5]\d)$/;
|
const HHMM = /^(\d{1,2}):([0-5]\d)$/;
|
||||||
|
|
||||||
@ -38,8 +38,10 @@ export default function ShowsPage() {
|
|||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [posting, setPosting] = useState(false);
|
const [posting, setPosting] = useState(false);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
const navigate = useNavigate();
|
const [redirectIn, setRedirectIn] = useState<number | null>(null);
|
||||||
const redirectTid = useRef<number | null>(null);
|
const redirectTid = useRef<number | null>(null);
|
||||||
|
const isRedirecting = redirectIn !== null;
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
// フォーム状態
|
// フォーム状態
|
||||||
const [selectedId, setSelectedId] = useState<number | null>(null);
|
const [selectedId, setSelectedId] = useState<number | null>(null);
|
||||||
@ -83,13 +85,16 @@ export default function ShowsPage() {
|
|||||||
})();
|
})();
|
||||||
return () => { cancelled = true; };
|
return () => { cancelled = true; };
|
||||||
}, []);
|
}, []);
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
if (redirectTid.current) {
|
||||||
|
window.clearInterval(redirectTid.current);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
const current = useMemo(() => shows.find(s => s.id === selectedId) || null, [shows, selectedId]);
|
const current = useMemo(() => shows.find(s => s.id === selectedId) || null, [shows, selectedId]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
return () => { if (redirectTid.current) window.clearTimeout(redirectTid.current); };
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
async function submit() {
|
async function submit() {
|
||||||
setError(null);
|
setError(null);
|
||||||
if (!selectedId) { setError("エピソードを選択してください。"); return; }
|
if (!selectedId) { setError("エピソードを選択してください。"); return; }
|
||||||
@ -115,11 +120,13 @@ export default function ShowsPage() {
|
|||||||
body: JSON.stringify(payload),
|
body: JSON.stringify(payload),
|
||||||
});
|
});
|
||||||
if (!res.ok) throw new Error(`POST 失敗 (${res.status})`);
|
if (!res.ok) throw new Error(`POST 失敗 (${res.status})`);
|
||||||
setError("設定しました。少々お待ちください…");
|
setRedirectIn(REDIRECT_DELAY_S);
|
||||||
redirectTid.current = window.setTimeout(
|
const start = Date.now();
|
||||||
() => navigate("/", { replace: true }),
|
redirectTid.current = window.setInterval(() => {
|
||||||
REDIRECT_DELAY_MS
|
const left = REDIRECT_DELAY_S - Math.floor((Date.now() - start) / 1000);
|
||||||
);
|
if (left <= 0) { window.clearInterval(redirectTid.current!); navigate("/", { replace: true }); }
|
||||||
|
else setRedirectIn(left);
|
||||||
|
}, 250);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
setError(e.message || "現在のエピソード設定に失敗しました。");
|
setError(e.message || "現在のエピソード設定に失敗しました。");
|
||||||
} finally {
|
} finally {
|
||||||
@ -178,11 +185,12 @@ export default function ShowsPage() {
|
|||||||
disabled={
|
disabled={
|
||||||
posting ||
|
posting ||
|
||||||
!selectedId ||
|
!selectedId ||
|
||||||
|
isRedirecting ||
|
||||||
(!!startTime && !toHHMMSS(startTime))
|
(!!startTime && !toHHMMSS(startTime))
|
||||||
}
|
}
|
||||||
onClick={submit}
|
onClick={submit}
|
||||||
>
|
>
|
||||||
{posting ? "設定中…" : "現在のエピソードに設定"}
|
{redirectIn !== null ? `設定しました(${redirectIn})` : posting ? "設定中…" : "現在のエピソードに設定"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user