From 8c52839c02e7b03a49c0ff5aeb3131ae2b10ce5f Mon Sep 17 00:00:00 2001 From: smanylov Date: Fri, 13 Mar 2026 13:42:07 +0700 Subject: [PATCH] continue: work on violation page --- src/app/actions/violationActions.ts | 36 ++++++++---- .../violations-check-all-section.tsx | 58 ++++++++++++++++--- src/i18n/messages/en.json | 4 +- src/i18n/messages/ru.json | 4 +- 4 files changed, 83 insertions(+), 19 deletions(-) diff --git a/src/app/actions/violationActions.ts b/src/app/actions/violationActions.ts index 91be8a2..e1780e8 100644 --- a/src/app/actions/violationActions.ts +++ b/src/app/actions/violationActions.ts @@ -5,7 +5,6 @@ import { API_BASE_URL } from '@/app/actions/definitions'; export async function getViolationSearchStatus() { const token = await getSessionData('token'); - console.log('getViolationSearchStatus'); try { const response = await fetch(`${API_BASE_URL}/api/v1/global-search/actual-task`, { @@ -16,14 +15,25 @@ export async function getViolationSearchStatus() { 'Authorization': `Bearer ${token}`, } }); - /* console.log(response); */ if (response.ok) { - console.log('parsed'); - const parsed = await response.json(); - console.log(parsed); + const text = await response.text(); + + if (text) { + try { + const parsed = JSON.parse(text); + console.log('Parsed:', parsed); + return parsed; + } catch (e) { + console.log('Not JSON, raw text:', text); + return { + status: text === 'Task not found' ? 'task-not-found' : text + }; + } + } else { + return null; + } - return parsed } else { return null } @@ -40,19 +50,25 @@ export async function startGlobalMonitoring(monitoringType: 'monitoring' | 'all_ const response = await fetch(`${API_BASE_URL}/api/v1/global-search/start`, { method: 'POST', body: JSON.stringify({ - searchType: monitoringType + searchType: monitoringType, + ...(monitoringType === 'all_files' && { fileIds: [] }) + }), headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, } }); - console.log(response); if (response.ok) { - const parsed = await response.json(); + const parsed: { + taskId: string, + status: string, + totalFiles: number + } = await response.json(); + console.log(parsed); - if (parsed?.message_code === 0) { + if (parsed?.status === 'ACCEPTED') { return parsed } else { return null diff --git a/src/app/ui/violations/violations-check-all-section.tsx b/src/app/ui/violations/violations-check-all-section.tsx index 2f721fc..99db6ad 100644 --- a/src/app/ui/violations/violations-check-all-section.tsx +++ b/src/app/ui/violations/violations-check-all-section.tsx @@ -1,11 +1,32 @@ 'use client' -import { useQuery } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useTranslations } from 'next-intl'; import { getViolationSearchStatus, startGlobalMonitoring } from '@/app/actions/violationActions'; import { useState } from 'react'; import ModalWindow from '@/app/components/ModalWindow'; -import { fa } from 'zod/v4/locales'; +import { toast } from 'sonner'; + +/* { + taskId: "9647fcd6-cf9b-4503-b399-b8d53794cd49", + userId: 1, + searchType: "all_files", + status: "PROCESSING", + totalFiles: 2, + processedFiles: 0, + createdAt: "2026-03-13T05:21:39.850518", + updatedAt: null +} */ +interface violationSearchStatus { + taskId?: string, + userId?: number, + searchType?: 'all_files' | 'monitoring', + status: string, + totalFiles?: number, + processedFiles?: number, + createdAt?: string, + updatedAt?: null +} export default function ViolationsCheckAllSection() { const { @@ -18,20 +39,32 @@ export default function ViolationsCheckAllSection() { queryFn: () => { return getViolationSearchStatus(); }, - select: (data) => { - /* console.log(data); */ + select: (data: violationSearchStatus) => { + console.log('violationSearchStatus'); + console.log(data); + if (data) { return data; } else { return null } + }, + refetchInterval: (query) => { + const status = query.state.data?.status; + if (status === 'PROCESSING') { + return 10000; + } + + return false; } }); - const t = useTranslations('Global'); + const queryClient = useQueryClient(); const [isProcessing, setIsProcessing] = useState(false); const [openWindow, setOpenWindow] = useState(false); + const t = useTranslations('Global'); - function openModalWindow() { + async function openModalWindow() { + await queryClient.invalidateQueries({ queryKey: ['violationSearchStatus'] }); setOpenWindow(true); } @@ -40,8 +73,14 @@ export default function ViolationsCheckAllSection() { try { const response = await startGlobalMonitoring(type); + if (response?.taskId) { + toast.success(t('file-verification-started-successfully')); + queryClient.invalidateQueries({ queryKey: ['violationSearchStatus'] }); + } else { + throw 'error' + } } catch (error) { - console.error(error); + toast.error(t('an-error-occurred-while-starting-file-verification')); } finally { setIsProcessing(false); setOpenWindow(false); @@ -96,6 +135,11 @@ export default function ViolationsCheckAllSection() {
Поиск нарушений во всех ваших изображениях. Проверка только точных совпадений (95%+).
+ {violationSearchStatus?.status && ( +
+ {violationSearchStatus?.status} +
+ )}