complated si check request

This commit is contained in:
nabijonovdavronbek619@gmail.com
2026-04-07 11:52:29 +05:00
parent 3dd9157346
commit 88f22a342a
8 changed files with 48 additions and 31 deletions

View File

@@ -74,7 +74,6 @@ export function useLoginForm() {
}
loginReqest.mutate({ phone: `998${phone}`, password: password });
sessionStorage.setItem('prev_page', 'login');
};
return {

View File

@@ -1,28 +1,11 @@
'use client';
import { useState } from 'react';
import { ArrowRight, BrainCircuit } from 'lucide-react';
import { ArrowRight, BrainCircuit, Plus } from 'lucide-react';
import { FileUploadModal } from './ui/fileUploadModal';
export default function SiCTACard() {
export function SiCTACard() {
const [isOpen, setIsOpen] = useState(false);
const [lastSubmission, setLastSubmission] = useState<{
name: string;
words: number;
} | null>(null);
const handleSubmit = (
documentName: string,
_file: File,
wordCount: number,
) => {
// Here you would send the file to your backend for plagiarism check.
// The word count is already computed client-side for instant pricing display.
console.log(lastSubmission);
console.log('Submitting:', { documentName, wordCount });
setLastSubmission({ name: documentName, words: wordCount });
setIsOpen(false);
};
return (
<>
@@ -42,11 +25,23 @@ export default function SiCTACard() {
Yuborish <ArrowRight size={12} />
</span>
</button>
<FileUploadModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
onSubmit={handleSubmit}
/>
<FileUploadModal isOpen={isOpen} onClose={() => setIsOpen(false)} />
</>
);
}
export function SiButton() {
const [isOpen, setIsOpen] = useState<boolean>(false);
return (
<>
<button
onClick={() => setIsOpen(true)}
className="flex items-center gap-2 py-1 px-2 group relative overflow-hidden rounded-sm bg-linear-to-br from-violet-500 to-violet-600 text-left shadow-md hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5 active:translate-y-0 active:shadow-md"
>
<Plus size={15} className="text-white" />
<h3 className="text-white font-semibold text-base">SI detektor</h3>
</button>
<FileUploadModal isOpen={isOpen} onClose={() => setIsOpen(false)} />
</>
);
}

View File

@@ -12,7 +12,6 @@ import { DropZone } from './dropZone';
export function FileUploadModal({
isOpen,
onClose,
onSubmit,
pricing = DEFAULT_PRICING,
}: FileUploadModalProps) {
const {
@@ -59,7 +58,6 @@ export function FileUploadModal({
const handleSubmit = () => {
if (!canSubmit || !uploadedFile) return;
onSubmit(documentName.trim(), uploadedFile.file, wordCount);
};
return (

View File

@@ -14,7 +14,6 @@ export interface PricingConfig {
export interface FileUploadModalProps {
isOpen: boolean;
onClose: () => void;
onSubmit: (documentName: string, file: File, wordCount: number) => void;
pricing?: PricingConfig;
}

View File

@@ -3,6 +3,10 @@
import { useState, useCallback, useRef } from 'react';
import { UploadedFile } from './tyeps';
import { countWordsFromFile, SUPPORTED_EXTENSIONS } from './wordCount';
import { useMutation } from '@tanstack/react-query';
import { apiRequest } from '@/shared/request/apiRequest';
import { links } from '@/shared/request/links';
import { toast } from 'react-toastify';
interface UseFileUploadReturn {
documentName: string;
@@ -28,6 +32,17 @@ export function useFileUpload(): UseFileUploadReturn {
const [error, setError] = useState<string | null>(null);
const fileInputRef = useRef<HTMLInputElement | null>(null);
const wordCount = useMutation({
mutationFn: (data: FormData) => apiRequest('POST', links.si_create, data),
onSuccess: (res) => {
console.log(res);
},
onError: (err) => {
console.log(err instanceof Error ? err.message : 'Unknown error');
toast.error(err instanceof Error ? err.message : 'Unknown error');
},
});
const validateFile = (file: File): string | null => {
const ext = '.' + file.name.split('.').pop()?.toLowerCase();
if (!SUPPORTED_EXTENSIONS.includes(ext)) {
@@ -77,7 +92,14 @@ export function useFileUpload(): UseFileUploadReturn {
wordCount: result.count,
});
}
console.log('running');
if (!file) return;
console.log('running inner');
const fd = new FormData();
fd.append('title', file.name.replace(/\.[^/.]+$/, ''));
fd.append('file', file);
wordCount.mutate(fd);
console.log('stop');
setIsProcessing(false);
}, []);

View File

@@ -11,4 +11,6 @@ export const links = {
si_id: (si_id: number) => `/shared/ai_document/list/${si_id}/`,
si_payment: (document_id: number) => `/shared/ai_document/pay/${document_id}`,
si_create: '/shared/ai_document/create/',
document_types: '/shared/document_types/',
pay_history: '/shared/orders/all/',
};

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { FileSearch, ArrowRight } from 'lucide-react';
import Link from 'next/link';
import SiCTACard from '@/features/modals/siModal/page';
import { SiCTACard } from '@/features/modals/siModal/page';
export const CtaCards = () => (
<>

View File

@@ -8,6 +8,7 @@ import { apiRequest } from '@/shared/request/apiRequest';
import { links } from '@/shared/request/links';
import { toast } from 'react-toastify';
import type { SiDocument } from '../../lib/types';
import { SiButton } from '@/features/modals/siModal/page';
// ─── State badge ───────────────────────────────────────────────────────────────
@@ -181,13 +182,14 @@ export const SiTable: React.FC = () => {
return (
<div className="space-y-4">
<div className="flex items-center">
<div className="flex items-center justify-between">
<div>
<h2 className="text-xl font-bold text-slate-900">SI detektor</h2>
<p className="text-sm text-slate-500 mt-0.5">
{isLoading ? '...' : `${items.length} ta tekshiruv`}
</p>
</div>
<SiButton />
</div>
<div className="bg-white rounded-2xl border border-slate-100 shadow-sm overflow-hidden">