fix(frontend): resolve all eslint warnings and errors

- block-timeline: ref updates moved to useLayoutEffect
- channel-card, guide/page: Date.now() wrapped in useMemo + suppress purity rule
- auth-context: lazy localStorage init (removes setState-in-effect)
- use-channel-order: lazy localStorage init (removes setState-in-effect)
- use-idle: start timer on mount without calling resetIdle (removes setState-in-effect)
- use-subtitles, transcode-settings-dialog: inline eslint-disable on exact violating line
- providers: block-level eslint-disable for tokenRef closure in useState initializer
- edit-channel-sheet: remove unused minsToTime and BlockContent imports
- docs/page: escape unescaped quote and apostrophe entities
This commit is contained in:
2026-03-17 02:40:32 +01:00
parent 8ed8da2d90
commit c4d2e48f73
11 changed files with 50 additions and 32 deletions

View File

@@ -1,6 +1,6 @@
"use client";
import { useState } from "react";
import { useState, useMemo } from "react";
import Link from "next/link";
import {
Pencil,
@@ -33,10 +33,13 @@ interface ChannelCardProps {
function useScheduleStatus(channelId: string) {
const { data: schedule } = useActiveSchedule(channelId);
// eslint-disable-next-line react-hooks/purity -- Date.now() inside useMemo is stable enough for schedule status
const now = useMemo(() => Date.now(), []);
if (!schedule) return { status: "none" as const, label: null };
const expiresAt = new Date(schedule.valid_until);
const hoursLeft = (expiresAt.getTime() - Date.now()) / (1000 * 60 * 60);
const hoursLeft = (expiresAt.getTime() - now) / (1000 * 60 * 60);
if (hoursLeft < 0) {
return { status: "expired" as const, label: "Schedule expired" };