update errors handler

This commit is contained in:
smanylov
2026-02-04 13:21:32 +07:00
parent 362df2f609
commit 584f0dda2f
9 changed files with 140 additions and 20 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
import SectionSearchFile from '@/app/ui/search/section-search-file'; import SectionSearchFile from '@/app/ui/search/section-search-file';
import { SupportedFormats } from '@/app/ui/search/supported-formats';
export default function Page() { export default function Page() {
return ( return (
<> <>
@@ -17,7 +18,7 @@ export default function Page() {
fileType="image" fileType="image"
/> />
<div className="search-sidebar"> <div className="search-sidebar">
side <SupportedFormats />
</div> </div>
</div> </div>
</> </>
+4
View File
@@ -1,4 +1,8 @@
export function convertBytes(bytes: number) { export function convertBytes(bytes: number) {
if (!bytes) {
return 0;
}
const units = ['B', 'KB', 'MB', 'GB', 'TB']; const units = ['B', 'KB', 'MB', 'GB', 'TB'];
if (bytes === 0) return '0 B'; if (bytes === 0) return '0 B';
+60
View File
@@ -3695,4 +3695,64 @@
color: #d97706; color: #d97706;
white-space: nowrap; white-space: nowrap;
} }
}
.supported-formats {
background: v.$white;
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 6px v.$shadow-1;
.formats-title {
font-weight: 600;
color: v.$text-p;
;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 8px;
}
.format-group {
margin-bottom: 16px;
}
.format-type {
font-weight: 500;
color: v.$text-p;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 8px;
&.image {
svg {
color: v.$color-image;
}
}
&.audio {
svg {
color: v.$color-audio;
}
}
&.video {
svg {
color: v.$color-video;
}
}
&.document {
svg {
color: v.$color-document;
}
}
}
.format-list {
color: v.$text-s;
font-size: 14px;
line-height: 1.5;
}
} }
+1
View File
@@ -34,6 +34,7 @@
padding: 16px; padding: 16px;
text-align: center; text-align: center;
border: 1px solid #e2e8f0; border: 1px solid #e2e8f0;
height: 100%;
} }
.stat-value { .stat-value {
+19 -5
View File
@@ -3,7 +3,7 @@
import { getUserData } from '@/app/actions/action'; import { getUserData } from '@/app/actions/action';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { useEffect } from 'react'; import { useEffect } from 'react';
import {convertBytes} from '@/app/lib/convertBytes'; import { convertBytes } from '@/app/lib/convertBytes';
export default function UserUsage() { export default function UserUsage() {
const { const {
@@ -15,6 +15,18 @@ export default function UserUsage() {
queryKey: ['userData'], queryKey: ['userData'],
queryFn: () => { queryFn: () => {
return getUserData(); return getUserData();
},
select: (data) => {
if (data.tariffInfo) {
return {
diskSize: data.tariffInfo?.maxFileOnDisk,
id: data.tariffInfo?.id,
maxFilesCount: data.tariffInfo?.maxFileCounts,
name: data.tariffInfo?.tariffName,
endTariff: data.tariffInfo?.endTariff,
tokens: data.tariffInfo?.tokens
}
}
} }
}); });
@@ -25,7 +37,7 @@ export default function UserUsage() {
</h3> </h3>
<div className="stats-grid"> <div className="stats-grid">
<div className="stat-card"> <div className="stat-card">
<div className="stat-value">0 / {userData?.tariffInfo?.tariff?.maxFilesCount}</div> <div className="stat-value">0 / {userData?.maxFilesCount}</div>
<div className="stat-label">Файлов в месяц</div> <div className="stat-label">Файлов в месяц</div>
<div className="progress-bar"> <div className="progress-bar">
<div <div
@@ -36,7 +48,7 @@ export default function UserUsage() {
</div> </div>
</div> </div>
<div className="stat-card"> <div className="stat-card">
<div className="stat-value">0 / {convertBytes(userData?.tariffInfo?.tariff?.diskSize)}</div> <div className="stat-value">0 / {userData?.diskSize ? convertBytes(userData?.diskSize) : 0}</div>
<div className="stat-label">Объём хранилища</div> <div className="stat-label">Объём хранилища</div>
<div className="progress-bar"> <div className="progress-bar">
<div <div
@@ -47,12 +59,14 @@ export default function UserUsage() {
</div> </div>
</div> </div>
<div className="stat-card"> <div className="stat-card">
<div className="stat-value">0</div> <div className="stat-value">
{userData?.tokens ? userData?.tokens : 0}
</div>
<div className="stat-label">Токенов на балансе</div> <div className="stat-label">Токенов на балансе</div>
</div> </div>
<div className="stat-card"> <div className="stat-card">
<div className="stat-value"> <div className="stat-value">
{userData?.tariffInfo?.tariff?.name} {userData?.name ? userData?.name : 'ERROR'}
</div> </div>
<div className="stat-label">Текущий план</div> <div className="stat-label">Текущий план</div>
</div> </div>
View File
+46
View File
@@ -0,0 +1,46 @@
import { IconImageFile, IconVideoFile, IconAudioFile, IconDocument } from '@/app/ui/icons/icons';
export function SupportedFormats() {
return (
<div className="supported-formats">
<div className="formats-title">
Поддерживаемые форматы
</div>
<div className="format-group">
<div className="format-type image">
<IconImageFile /> Изображения
</div>
<div className="format-list">
JPEG, PNG, GIF, BMP
</div>
</div>
<div className="format-group hidden">
<div className="format-type video">
<IconVideoFile /> Видео
</div>
<div className="format-list">
MP4, AVI, MOV, WMV
</div>
</div>
<div className="format-group hidden">
<div className="format-type audio">
<IconAudioFile /> Аудио
</div>
<div className="format-list">
MP3, WAV, FLAC, AAC
</div>
</div>
<div className="format-group hidden">
<div className="format-type document">
<IconDocument /> Документы
</div>
<div className="format-list">
PDF, DOC, DOCX
</div>
</div>
</div>
)
}
@@ -25,11 +25,6 @@ export default function PersonalDataSettings() {
} }
}); });
useEffect(() => {
console.log('show => userData');
console.log(userData);
}, [])
const [selectedValue, setSelectedValue] = useState('male'); const [selectedValue, setSelectedValue] = useState('male');
const t = useTranslations('Global'); const t = useTranslations('Global');
@@ -18,16 +18,12 @@ export default function SubscriptionSettings() {
return getUserData(); return getUserData();
}, },
select: (data) => { select: (data) => {
if (data.tariffInfo?.tariff) { if (data.tariffInfo) {
return { return {
diskSize: data.tariffInfo?.tariff?.diskSize, diskSize: data.tariffInfo?.maxFileOnDisk,
id: data.tariffInfo?.tariff?.id, id: data.tariffInfo?.id,
maxFilesCount: data.tariffInfo?.tariff?.maxFilesCount, maxFilesCount: data.tariffInfo?.maxFileCounts,
maxUsers: data.tariffInfo?.tariff?.maxUsers, name: data.tariffInfo?.tariffName,
name: data.tariffInfo?.tariff?.name,
price: data.tariffInfo?.tariff?.price,
tokens: data.tariffInfo?.tariff?.tokens,
type: data.tariffInfo?.tariff?.type,
endTariff: data.tariffInfo?.endTariff endTariff: data.tariffInfo?.endTariff
} }
} }
@@ -35,6 +31,9 @@ export default function SubscriptionSettings() {
}); });
function dateHandler(date: string) { function dateHandler(date: string) {
if (!date) {
return 'error'
}
return date.split(' ')[0]; return date.split(' ')[0];
} }