diff --git a/src/app/actions/action.ts b/src/app/actions/action.ts index 0241efc..af3ea8b 100644 --- a/src/app/actions/action.ts +++ b/src/app/actions/action.ts @@ -27,7 +27,7 @@ export async function getUserData() { return await response.json(); } } catch (error) { - console.error('error'); + return null } } diff --git a/src/app/hooks/react-query/useUserDataInfo.ts b/src/app/hooks/react-query/useUserDataInfo.ts new file mode 100644 index 0000000..30452c4 --- /dev/null +++ b/src/app/hooks/react-query/useUserDataInfo.ts @@ -0,0 +1,81 @@ +import { useQuery } from '@tanstack/react-query'; +import { getUserData } from '@/app/actions/action'; + +export interface Tariff { + id: number; + type: string; + name: string; + price: number; + tokens: number; + maxFilesCount: number; + diskSize: number; + maxUsers?: number; +} + +export interface TariffInfo { + id: string; + status: string; + startTariff: string; + endTariff: string; + tariffId: number | null; + tariffName: string | null; + tokens: number | null; + maxFileOnDisk: number | null; + currentFileOnDisk: number; + currentFileCounts: number; + maxFileCounts: number; +} + +export interface UserData { + fullName: string; + company: string | null; + email: string; + active: boolean; + phone: string; + genderType: string | null; + birthday: string | null; + createdAt: string; + subscriptionType: string; + tariffs: Tariff[]; + tariffInfo: TariffInfo; + permission: number; +} + +export const useUserProfile = () => { + return useQuery({ + queryKey: ['userData'], + queryFn: getUserData, + select: (data): UserData => { + if (!data) { + return { + fullName: '', + company: null, + email: '', + active: false, + phone: '', + genderType: '', + birthday: null, + createdAt: '', + subscriptionType: '', + tariffs: [], + tariffInfo: { + id: '', + status: '', + startTariff: '', + endTariff: '', + tariffId: 0, + tariffName: null, + tokens: 0, + maxFileOnDisk: null, + currentFileOnDisk: 0, + currentFileCounts: 0, + maxFileCounts: 0, + }, + permission: 0, + }; + } + + return data; + }, + }); +}; \ No newline at end of file diff --git a/src/app/hooks/react-query/useUserFilesInfo.ts b/src/app/hooks/react-query/useUserFilesInfo.ts index 9919a48..56783eb 100644 --- a/src/app/hooks/react-query/useUserFilesInfo.ts +++ b/src/app/hooks/react-query/useUserFilesInfo.ts @@ -43,7 +43,7 @@ export const useUserFilesInfo = () => { return useQuery({ queryKey: ['userFilesInfo'], queryFn: getUserFilesInfo, - select: (data): FilesInfo => { + select: (data): FilesInfo | null => { if (!data) { return { total: { size: 0, quantity: 0, check: 0, violation: 0, protected: 0 }, diff --git a/src/app/lib/getProcents.ts b/src/app/lib/getProcents.ts index eb43f48..686bb8a 100644 --- a/src/app/lib/getProcents.ts +++ b/src/app/lib/getProcents.ts @@ -1,13 +1,13 @@ export function getProcents( currentNumber: number | undefined, - totalNumber: number, + totalNumber: number | undefined, decimals: number = 0 ): number { if (!currentNumber && !totalNumber) { return 0; } - if (totalNumber === 0 || typeof currentNumber === 'undefined') { + if (totalNumber === 0 || typeof currentNumber === 'undefined' || typeof totalNumber === 'undefined') { return 0; } diff --git a/src/app/ui/header/headerPanel.tsx b/src/app/ui/header/headerPanel.tsx index 6e0e675..0c842a1 100644 --- a/src/app/ui/header/headerPanel.tsx +++ b/src/app/ui/header/headerPanel.tsx @@ -6,37 +6,17 @@ import Link from 'next/link'; import LanguageSwitcher from '@/app/components/LanguageSwitcher'; import { useTranslations } from 'next-intl'; import BurgerMenu from '@/app/ui/navigation/burger-menu'; -import { getUserData } from '@/app/actions/action'; -import { useQuery } from '@tanstack/react-query'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function HeaderPanel() { const t = useTranslations("Global"); - const { - data: tokens, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - return getUserData(); - }, - select: (data) => { - if (typeof data?.tariffInfo?.tokens === 'number') { - return data?.tariffInfo?.tokens - } else { - return null; - } - - } - }); - + const { data: userData, isLoading, isError, error } = useUserProfile(); return (
{/* */} - {typeof tokens === 'number' && ( + {typeof userData?.tariffInfo.tokens === 'number' && ( - {tokens} + {userData?.tariffInfo.tokens} {t('tokens')} diff --git a/src/app/ui/header/userMenuButton.tsx b/src/app/ui/header/userMenuButton.tsx index f813a44..35d9ce6 100644 --- a/src/app/ui/header/userMenuButton.tsx +++ b/src/app/ui/header/userMenuButton.tsx @@ -3,27 +3,15 @@ import { useState, useRef, useEffect } from 'react'; import { useClickOutside } from '@/app/hooks/useClickOutside'; import Link from 'next/link'; -import { getUserData } from '@/app/actions/action'; -import { useQuery } from '@tanstack/react-query'; import { logout } from '@/app/actions/auth'; import { useTranslations } from 'next-intl'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function UserMenuButton() { const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); const t = useTranslations("Global"); - const { - data: userData, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - return getUserData(); - } - }) - + const { data: userData, isLoading, isError, error } = useUserProfile(); useClickOutside( menuRef, @@ -50,7 +38,7 @@ export default function UserMenuButton() {
{userData?.fullName ? userData.fullName[0] : ''}
@@ -61,10 +49,10 @@ export default function UserMenuButton() {
- {userData?.fullName ? userData.fullName : ''} + {userData?.fullName ?? ''}
- {userData?.email ? userData.email : ''} + {userData?.email ?? ''}
{t('rate')}: diff --git a/src/app/ui/payment/user-usage.tsx b/src/app/ui/payment/user-usage.tsx index ca870db..3fb17b5 100644 --- a/src/app/ui/payment/user-usage.tsx +++ b/src/app/ui/payment/user-usage.tsx @@ -1,37 +1,11 @@ 'use client' -import { getUserData } from '@/app/actions/action'; -import { useQuery } from '@tanstack/react-query'; -import { useEffect } from 'react'; import { convertBytes } from '@/app/lib/convertBytes'; import { getProcents } from '@/app/lib/getProcents'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function UserUsage() { - const { - data: userData, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - 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, - currentFileCounts: data.tariffInfo?.currentFileCounts, - currentFileOnDisk: data.tariffInfo?.currentFileOnDisk, - } - } - } - }); + const { data: userData, isLoading, isError, error } = useUserProfile(); return (
@@ -41,27 +15,27 @@ export default function UserUsage() {
- {userData?.currentFileCounts} / {userData?.maxFilesCount} + {userData?.tariffInfo.currentFileCounts} / {userData?.tariffInfo.maxFileCounts}
Файлов в месяц
- {userData?.currentFileOnDisk ? convertBytes(userData?.currentFileOnDisk) : 0} / {userData?.diskSize ? convertBytes(userData?.diskSize) : 0} + {convertBytes(userData?.tariffInfo.currentFileOnDisk ?? 0)} / {convertBytes(userData?.tariffInfo.maxFileOnDisk ?? 0)}
Объём хранилища
@@ -69,13 +43,13 @@ export default function UserUsage() {
- {userData?.tokens ? userData?.tokens : 0} + {userData?.tariffInfo.tokens ?? 0}
Токенов на балансе
- {userData?.name ? userData?.name : 'ERROR'} + {userData?.tariffInfo.tariffName ? userData?.tariffInfo.tariffName : 'ERROR'}
Текущий план
diff --git a/src/app/ui/settings/company-users-setting-panel.tsx b/src/app/ui/settings/company-users-setting-panel.tsx index 0289a24..3ac5c0b 100644 --- a/src/app/ui/settings/company-users-setting-panel.tsx +++ b/src/app/ui/settings/company-users-setting-panel.tsx @@ -12,21 +12,12 @@ import * as z from 'zod'; import PhoneInput from '@/app/ui/inputs/phone-input'; import { IconEye } from '@/app/ui/icons/icons'; import { toast } from 'sonner'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export function CompanyUsersSettingPanel() { - const { - data: userData, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - return getUserData(); - } - }); + const { data: userData, isLoading, isError, error } = useUserProfile(); - if (userData.permission !== 3) { + if (userData?.permission !== 3) { return null } diff --git a/src/app/ui/settings/personal-data-settings.tsx b/src/app/ui/settings/personal-data-settings.tsx index 8e4086c..37cd0c1 100644 --- a/src/app/ui/settings/personal-data-settings.tsx +++ b/src/app/ui/settings/personal-data-settings.tsx @@ -4,6 +4,7 @@ import { useTranslations } from 'next-intl'; import { useActionState, useState, useEffect } from 'react'; import { getUserData } from '@/app/actions/action'; import { useQuery } from '@tanstack/react-query'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function PersonalDataSettings() { const [errorMessage, formAction, isPending] = useActionState( @@ -13,17 +14,7 @@ export default function PersonalDataSettings() { undefined ); - const { - data: userData, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - return getUserData(); - } - }); + const { data: userData, isLoading, isError, error } = useUserProfile(); useEffect(() => { console.log(userData) diff --git a/src/app/ui/settings/subscription-settings.tsx b/src/app/ui/settings/subscription-settings.tsx index 88ccb45..8fa51e0 100644 --- a/src/app/ui/settings/subscription-settings.tsx +++ b/src/app/ui/settings/subscription-settings.tsx @@ -4,37 +4,23 @@ import { useTranslations } from 'next-intl'; import { getUserData } from '@/app/actions/action'; import { useQuery } from '@tanstack/react-query'; import { convertBytes } from '@/app/lib/convertBytes'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function SubscriptionSettings() { const t = useTranslations('Global'); - const { - data: userData, - isLoading, - isError, - error - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - 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 - } - } - } - }); + const { data: userData, isLoading, isError, error } = useUserProfile(); - function dateHandler(date: string) { + function dateHandler(date: string | undefined) { if (!date) { return 'error' } - return date.split(' ')[0]; + + const newDate = new Date(date); + const day = newDate.getDate().toString().padStart(2, '0'); + const month = (newDate.getMonth() + 1).toString().padStart(2, '0'); + const year = newDate.getFullYear(); + + return `${day}.${month}.${year}`; } return ( @@ -46,18 +32,18 @@ export default function SubscriptionSettings() {
-

Подписка {userData?.name}

-

📅 Активна до {dateHandler(userData?.endTariff)}

+

Подписка {userData?.tariffInfo.tariffName}

+

📅 Активна до {dateHandler(userData?.tariffInfo.endTariff)}

-
{userData?.maxFilesCount}
+
{userData?.tariffInfo.maxFileCounts}

файлов в месяц

💾 Хранилище
- {userData?.diskSize ? convertBytes(userData?.diskSize) : 0} + {userData?.tariffInfo.maxFileOnDisk ? convertBytes(userData?.tariffInfo.maxFileOnDisk) : 0}
🔌 API доступ
diff --git a/src/app/ui/test.tsx b/src/app/ui/test.tsx index b1c4047..534facc 100644 --- a/src/app/ui/test.tsx +++ b/src/app/ui/test.tsx @@ -1,20 +1,9 @@ 'use client'; -import { useQuery } from '@tanstack/react-query'; -import { getUserData } from '@/app/actions/action'; +import { useUserProfile } from '@/app/hooks/react-query/useUserDataInfo'; export default function HomePage() { - const { - data: userData, - isLoading, - isError, - error, - } = useQuery({ - queryKey: ['userData'], - queryFn: () => { - return getUserData(); - }, - }); + const { data: userData, isLoading, isError, error } = useUserProfile(); if (isLoading) return
Loading...
; if (isError) return
Error: {error.message}
; @@ -23,7 +12,7 @@ export default function HomePage() {

user email

- {userData.email} + {userData?.email}
);