diff --git a/src/shared/config/i18n/messages/en.json b/src/shared/config/i18n/messages/en.json index ec716b8..1ba37ea 100644 --- a/src/shared/config/i18n/messages/en.json +++ b/src/shared/config/i18n/messages/en.json @@ -210,5 +210,6 @@ "payButton": "Pay with Payme" }, "unknownUser": "Username not found", - "file": "File" + "file": "File", + "upload":"Download certificate" } diff --git a/src/shared/config/i18n/messages/ru.json b/src/shared/config/i18n/messages/ru.json index 459bbee..534d693 100644 --- a/src/shared/config/i18n/messages/ru.json +++ b/src/shared/config/i18n/messages/ru.json @@ -210,5 +210,6 @@ "payButton": "Оплатить через Payme" }, "unknownUser": "Имя пользователя не найдено", - "file":"Файл" + "file":"Файл", + "upload":"Скачать сертификат" } diff --git a/src/shared/config/i18n/messages/uz.d.json.ts b/src/shared/config/i18n/messages/uz.d.json.ts index 230b72e..fbaa83c 100644 --- a/src/shared/config/i18n/messages/uz.d.json.ts +++ b/src/shared/config/i18n/messages/uz.d.json.ts @@ -214,5 +214,6 @@ declare const messages: { }; unknownUser: 'Foydalanuvchi topilmadi'; file: 'Fayl'; + upload: 'Sertifikatni yuklab olish'; }; export default messages; diff --git a/src/shared/config/i18n/messages/uz.json b/src/shared/config/i18n/messages/uz.json index 9f30bfa..46511de 100644 --- a/src/shared/config/i18n/messages/uz.json +++ b/src/shared/config/i18n/messages/uz.json @@ -210,5 +210,6 @@ "payButton": "Payme orqali to'lash" }, "unknownUser":"Foydalanuvchi topilmadi", - "file":"Fayl" + "file":"Fayl", + "upload":"Sertifikatni yuklab olish" } diff --git a/src/shared/request/links.ts b/src/shared/request/links.ts index 3b901a1..f9a684e 100644 --- a/src/shared/request/links.ts +++ b/src/shared/request/links.ts @@ -4,4 +4,7 @@ export const links = { plagiarismCheck: '/shared/documents/', history: '/shared/documents/list/', detail: (id: number) => `/shared/documents/${id}/`, + payment: (order_id: number) => `/users/payme/link/${order_id}/`, + sertifikat: (document_id: number) => + `/shared/certificate/${document_id}/pdf/`, }; diff --git a/src/widgets/detail/pageDetail.tsx b/src/widgets/detail/pageDetail.tsx index 6b573f0..b1d0306 100644 --- a/src/widgets/detail/pageDetail.tsx +++ b/src/widgets/detail/pageDetail.tsx @@ -4,6 +4,7 @@ import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { links } from '@/shared/request/links'; import { apiRequest } from '@/shared/request/apiRequest'; +import Sertifikat from './sertifikat'; // ── Types ──────────────────────────────────────────────────────────────────── @@ -156,7 +157,7 @@ function StatCard({ label, value }: { label: string; value: string | number }) { {label} - + {String(value)} @@ -293,7 +294,7 @@ export default function DocumentDetailPage({ id }: { id: number }) { if (isLoading) { return ( - + ); @@ -303,7 +304,7 @@ export default function DocumentDetailPage({ id }: { id: number }) { if (isError || !doc) { return ( - + ); @@ -385,22 +386,7 @@ export default function DocumentDetailPage({ id }: { id: number }) { - {doc.certificate && ( - - - - - Certificate - - )} + {doc.certificate && } {doc.file && ( diff --git a/src/widgets/fileUpload/lib/usePlagiraism.ts b/src/widgets/fileUpload/lib/usePlagiraism.ts index da648c0..5e98d3d 100644 --- a/src/widgets/fileUpload/lib/usePlagiraism.ts +++ b/src/widgets/fileUpload/lib/usePlagiraism.ts @@ -1,5 +1,5 @@ 'use client'; -import { useState, useCallback } from 'react'; +import { useState, useCallback, useEffect } from 'react'; import { PlagiarismFormErrors, PlagiarismFormState, @@ -11,7 +11,6 @@ import { useUserPlagiatStore } from '@/shared/zustand/user'; import { useMutation } from '@tanstack/react-query'; import { links } from '@/shared/request/links'; import { apiRequest } from '@/shared/request/apiRequest'; -import { useRouter } from '@/shared/config/i18n/navigation'; // ─── Initial States ────────────────────────────────────────────────────────── @@ -32,12 +31,28 @@ const INITIAL_SUBMISSION: SubmissionState = { export function usePlagiarismForm() { const user = useUserPlagiatStore((state) => state.user); + const [localUser, setLocalUser] = useState<{ + id: number; + name: string; + surname: string; + } | null>(null); + useEffect(() => { + const data = localStorage.getItem('user'); + + if (data) { + setLocalUser(JSON.parse(data)); + } else { + setLocalUser(null); + } + }, [user]); const [form, setForm] = useState(INITIAL_FORM); const [errors, setErrors] = useState({}); const [isPaymentOpen, setIsPaymentOpen] = useState(false); const [submission, setSubmission] = useState(INITIAL_SUBMISSION); - const route = useRouter(); + // const route = useRouter(); + // const [document_id, setDocument_id] = useState(0); + const [order_id, setOrder_id] = useState(0); const checkdocumentRequest = useMutation({ mutationKey: ['plagiarismCheck'], @@ -47,9 +62,27 @@ export function usePlagiarismForm() { console.log('uploda: ', res); const resdata = res.data as { id: number; order_id: number }; console.log('order_id:', resdata.id); - route.push(`/${resdata.id}`); + // setDocument_id(resdata.id); + setOrder_id(resdata.order_id); setSubmission({ status: 'success', error: null }); setForm(INITIAL_FORM); + setIsPaymentOpen(true); + }, + onError: (err) => { + const message = + err instanceof Error ? err.message : 'An unexpected error occurred.'; + setSubmission({ status: 'error', error: message }); + }, + }); + + const payment = useMutation({ + mutationKey: ['payload'], + mutationFn: ({ order_id }: { order_id: number }) => + apiRequest<{ payment_link: string }>('POST', links.payment(order_id)), + onSuccess: (res) => { + console.log('payment res: ', res); + window.open(res.data.payment_link, '_self'); + //route.push(`/${document_id}`); setIsPaymentOpen(false); }, onError: (err) => { @@ -84,7 +117,7 @@ export function usePlagiarismForm() { e.preventDefault(); console.log('Form submitted user:', user); // Debugging log - if (user === null) { + if (localUser === null) { toast.error('Iltimos, avval tizimga kiring!'); return; } @@ -95,21 +128,21 @@ export function usePlagiarismForm() { return; // Don't open modal if invalid } - // Validation passed → open the payment modal - setIsPaymentOpen(true); + const fd = new FormData(); + fd.append('title', form.title.trim()); + fd.append('text', `${user?.name} ${user?.surname}` || ''); + fd.append('file', form.file!); // File object — multipart/form-data + fd.append('certificate', String(form.certificate)); + fd.append('total_price', '41200'); + checkdocumentRequest.mutate(fd); }, [form], ); const handleSubmit = useCallback(async () => { setSubmission({ status: 'loading', error: null }); - const fd = new FormData(); - fd.append('title', form.title.trim()); - fd.append('text', `${user?.name} ${user?.surname}` || ''); - fd.append('file', form.file!); // File object — multipart/form-data - fd.append('certificate', String(form.certificate)); - fd.append('total_price', '41200'); - checkdocumentRequest.mutate(fd); + + payment.mutate({ order_id }); }, [form, user]); const resetSubmission = useCallback(() => { diff --git a/src/widgets/navbar/ui/authButtons.tsx b/src/widgets/navbar/ui/authButtons.tsx index 165628d..39afab4 100644 --- a/src/widgets/navbar/ui/authButtons.tsx +++ b/src/widgets/navbar/ui/authButtons.tsx @@ -14,9 +14,15 @@ import { useLoginModal, useRegisterModal } from '@/shared/zustand/auth'; import { useTranslations } from 'next-intl'; import { useUserPlagiatStore } from '@/shared/zustand/user'; import { LogOut } from 'lucide-react'; +import { useEffect, useState } from 'react'; function AuthButtons() { const t = useTranslations('Navbar'); + const [localUser, setLocalUser] = useState<{ + id: number; + name: string; + surname: string; + } | null>(null); const auth = { login: { title: t('login'), url: '#' }, @@ -38,7 +44,17 @@ function AuthButtons() { }; console.log('Current user:', user); - if (user) { + useEffect(() => { + const data = localStorage.getItem('user'); + + if (data) { + setLocalUser(JSON.parse(data)); + } else { + setLocalUser(null); + } + }, [user]); + + if (localUser) { return ( @@ -47,7 +63,7 @@ function AuthButtons() { - {user.name} {user.surname} + {localUser.name} {localUser.surname} {userItem.map((subItem) => (