feat(tradein-ui): Yandex admin scraper page — mirror Avito + global delay control #488

Merged
lekss361 merged 2 commits from feat/tradein-yandex-admin-frontend into main 2026-05-23 20:07:49 +00:00
Showing only changes of commit 271b5daeea - Show all commits

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { useEffect, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import "@/components/trade-in/trade-in.css"; import "@/components/trade-in/trade-in.css";
@ -17,6 +17,7 @@ interface ScraperSetting {
} }
interface ScraperSettingUpdate { interface ScraperSettingUpdate {
source: string;
request_delay_sec: number; request_delay_sec: number;
} }
@ -79,7 +80,10 @@ interface YandexValuationTriggerResp {
function useScraperSettings() { function useScraperSettings() {
return useQuery<ScraperSetting[]>({ return useQuery<ScraperSetting[]>({
queryKey: ["scraper-settings"], queryKey: ["scraper-settings"],
queryFn: () => apiFetch<ScraperSetting[]>("/api/v1/admin/scraper-settings"), queryFn: () =>
apiFetch<{ settings: ScraperSetting[] }>("/api/v1/admin/scraper-settings").then(
(r) => r.settings,
),
refetchInterval: 30_000, refetchInterval: 30_000,
}); });
} }
@ -89,12 +93,12 @@ function useUpdateScraperSetting() {
return useMutation< return useMutation<
ScraperSetting, ScraperSetting,
Error, Error,
{ source: string; payload: ScraperSettingUpdate } { source: string; payload: Omit<ScraperSettingUpdate, "source"> }
>({ >({
mutationFn: ({ source, payload }) => mutationFn: ({ source, payload }) =>
apiFetch<ScraperSetting>(`/api/v1/admin/scraper-settings/${source}`, { apiFetch<ScraperSetting>(`/api/v1/admin/scraper-settings/${source}`, {
method: "PUT", method: "PUT",
body: JSON.stringify(payload), body: JSON.stringify({ source, ...payload }),
}), }),
onSuccess: () => { onSuccess: () => {
qc.invalidateQueries({ queryKey: ["scraper-settings"] }); qc.invalidateQueries({ queryKey: ["scraper-settings"] });
@ -212,10 +216,14 @@ export default function YandexScraperPage() {
const settingsQ = useScraperSettings(); const settingsQ = useScraperSettings();
const updateSettingMut = useUpdateScraperSetting(); const updateSettingMut = useUpdateScraperSetting();
const [delayInput, setDelayInput] = useState<string>("5.0"); const [delayInput, setDelayInput] = useState<string>("5.0");
const delayInitializedRef = useRef(false);
useEffect(() => { useEffect(() => {
const yandex = settingsQ.data?.find((s) => s.source === "yandex"); const yandex = settingsQ.data?.find((s) => s.source === "yandex");
if (yandex) setDelayInput(String(yandex.request_delay_sec)); if (yandex && !delayInitializedRef.current) {
setDelayInput(String(yandex.request_delay_sec));
delayInitializedRef.current = true;
}
}, [settingsQ.data]); }, [settingsQ.data]);
// Around // Around