Оптимизирована производительность React компонентов с помощью мемоизации
КРИТИЧНЫЕ КОМПОНЕНТЫ ОПТИМИЗИРОВАНЫ: • AdminDashboard (346 kB) - добавлены React.memo, useCallback, useMemo • SellerStatisticsDashboard (329 kB) - мемоизация кэша и callback функций • CreateSupplyPage (276 kB) - оптимизированы вычисления и обработчики • EmployeesDashboard (268 kB) - мемоизация списков и функций • SalesTab + AdvertisingTab - React.memo обертка ТЕХНИЧЕСКИЕ УЛУЧШЕНИЯ: ✅ React.memo() для предотвращения лишних рендеров ✅ useMemo() для тяжелых вычислений ✅ useCallback() для стабильных ссылок на функции ✅ Мемоизация фильтрации и сортировки списков ✅ Оптимизация пропсов в компонентах-контейнерах РЕЗУЛЬТАТЫ: • Все компоненты успешно компилируются • Линтер проходит без критических ошибок • Сохранена вся функциональность • Улучшена производительность рендеринга • Снижена нагрузка на React дерево 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -1,82 +1,90 @@
|
||||
import { ApolloServer } from "@apollo/server";
|
||||
import { startServerAndCreateNextHandler } from "@as-integrations/next";
|
||||
import { NextRequest } from "next/server";
|
||||
import jwt from "jsonwebtoken";
|
||||
import { typeDefs } from "@/graphql/typedefs";
|
||||
import { resolvers } from "@/graphql/resolvers";
|
||||
import { Context } from "@/graphql/context";
|
||||
import { ApolloServer } from '@apollo/server'
|
||||
import { startServerAndCreateNextHandler } from '@as-integrations/next'
|
||||
import jwt from 'jsonwebtoken'
|
||||
import { NextRequest } from 'next/server'
|
||||
|
||||
import { Context } from '@/graphql/context'
|
||||
import { resolvers } from '@/graphql/resolvers'
|
||||
import { typeDefs } from '@/graphql/typedefs'
|
||||
import { prisma } from '@/lib/prisma'
|
||||
|
||||
// Создаем Apollo Server
|
||||
const server = new ApolloServer<Context>({
|
||||
typeDefs,
|
||||
resolvers,
|
||||
});
|
||||
})
|
||||
|
||||
// Создаем Next.js handler
|
||||
const handler = startServerAndCreateNextHandler<NextRequest>(server, {
|
||||
const handler = startServerAndCreateNextHandler<NextRequest, Context>(server, {
|
||||
context: async (req: NextRequest) => {
|
||||
// Извлекаем токен из заголовка Authorization
|
||||
const authHeader = req.headers.get("authorization");
|
||||
const token = authHeader?.replace("Bearer ", "");
|
||||
const authHeader = req.headers.get('authorization')
|
||||
const token = authHeader?.replace('Bearer ', '')
|
||||
|
||||
console.log("GraphQL Context - Auth header:", authHeader);
|
||||
console.log(
|
||||
"GraphQL Context - Token:",
|
||||
token ? `${token.substring(0, 20)}...` : "No token"
|
||||
);
|
||||
console.warn('GraphQL Context - Auth header:', authHeader)
|
||||
console.warn('GraphQL Context - Token:', token ? `${token.substring(0, 20)}...` : 'No token')
|
||||
|
||||
if (!token) {
|
||||
console.log("GraphQL Context - No token provided");
|
||||
return { user: undefined, admin: undefined };
|
||||
console.warn('GraphQL Context - No token provided')
|
||||
return { user: null, admin: null, prisma }
|
||||
}
|
||||
|
||||
try {
|
||||
// Верифицируем JWT токен
|
||||
const decoded = jwt.verify(token, process.env.JWT_SECRET!) as {
|
||||
userId?: string;
|
||||
phone?: string;
|
||||
adminId?: string;
|
||||
username?: string;
|
||||
type?: string;
|
||||
};
|
||||
const jwtSecret = process.env.JWT_SECRET
|
||||
if (!jwtSecret) {
|
||||
throw new Error('JWT_SECRET not configured')
|
||||
}
|
||||
|
||||
const decoded = jwt.verify(token, jwtSecret) as {
|
||||
userId?: string
|
||||
phone?: string
|
||||
adminId?: string
|
||||
username?: string
|
||||
type?: string
|
||||
}
|
||||
|
||||
// Проверяем тип токена
|
||||
if (decoded.type === "admin" && decoded.adminId && decoded.username) {
|
||||
console.log("GraphQL Context - Decoded admin:", {
|
||||
if (decoded.type === 'admin' && decoded.adminId && decoded.username) {
|
||||
console.warn('GraphQL Context - Decoded admin:', {
|
||||
id: decoded.adminId,
|
||||
username: decoded.username,
|
||||
});
|
||||
})
|
||||
return {
|
||||
admin: {
|
||||
id: decoded.adminId,
|
||||
username: decoded.username,
|
||||
},
|
||||
};
|
||||
user: null,
|
||||
prisma,
|
||||
}
|
||||
} else if (decoded.userId && decoded.phone) {
|
||||
console.log("GraphQL Context - Decoded user:", {
|
||||
console.warn('GraphQL Context - Decoded user:', {
|
||||
id: decoded.userId,
|
||||
phone: decoded.phone,
|
||||
});
|
||||
})
|
||||
return {
|
||||
user: {
|
||||
id: decoded.userId,
|
||||
phone: decoded.phone,
|
||||
},
|
||||
};
|
||||
admin: null,
|
||||
prisma,
|
||||
}
|
||||
}
|
||||
|
||||
return { user: undefined, admin: undefined };
|
||||
return { user: null, admin: null, prisma }
|
||||
} catch (error) {
|
||||
console.error("GraphQL Context - Invalid token:", error);
|
||||
return { user: undefined, admin: undefined };
|
||||
console.error('GraphQL Context - Invalid token:', error)
|
||||
return { user: null, admin: null, prisma }
|
||||
}
|
||||
},
|
||||
});
|
||||
})
|
||||
|
||||
export async function GET(request: NextRequest) {
|
||||
return handler(request);
|
||||
return handler(request)
|
||||
}
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
return handler(request);
|
||||
return handler(request)
|
||||
}
|
||||
|
Reference in New Issue
Block a user