fix: resolve all eslint errors (set-state-in-effect, nested components, no-explicit-any)
- Wrap synchronous setState calls in useEffect with startTransition to avoid cascading renders - Convert nested SortIcon components to renderSortIcon helper functions - Replace all `any` types with proper interfaces (OverviewData, TrendPoint, RankItem) - Remove unused formatTokens import in logs page - Add no-any rule to CLAUDE.md
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useState, useCallback } from "react";
|
||||
import { useEffect, useState, useCallback, startTransition } from "react";
|
||||
import { useParams } from "next/navigation";
|
||||
import { motion } from "motion/react";
|
||||
import { ArrowLeft, Hash, Zap, MessageSquare } from "lucide-react";
|
||||
@@ -30,11 +30,11 @@ export default function DetailPage() {
|
||||
|
||||
const { getEffectiveRange } = useTimeRange();
|
||||
const [data, setData] = useState<DetailData | null>(null);
|
||||
const [trends, setTrends] = useState<any[]>([]);
|
||||
const [trends, setTrends] = useState<{ date: string; calls: number; total_tokens: number; prompt_tokens: number; completion_tokens: number }[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
const fetchData = useCallback(async () => {
|
||||
setLoading(true);
|
||||
startTransition(() => setLoading(true));
|
||||
const { start, end } = getEffectiveRange();
|
||||
const tp = { start, end };
|
||||
const [detail, tr] = await Promise.all([
|
||||
@@ -45,7 +45,7 @@ export default function DetailPage() {
|
||||
...(type === "channel" ? { channel_id: decodedId } : {}),
|
||||
})).then(r => r.json()),
|
||||
]);
|
||||
setData(detail); setTrends(tr); setLoading(false);
|
||||
startTransition(() => { setData(detail); setTrends(tr); setLoading(false); });
|
||||
}, [type, decodedId, getEffectiveRange]);
|
||||
|
||||
useEffect(() => { fetchData(); }, [fetchData]);
|
||||
|
||||
Reference in New Issue
Block a user