diff --git a/app/dashboard/admin/users/page.tsx b/app/dashboard/admin/users/page.tsx index bbe5716..0304732 100644 --- a/app/dashboard/admin/users/page.tsx +++ b/app/dashboard/admin/users/page.tsx @@ -55,12 +55,19 @@ export default function AdminUsersPage() { useEffect(() => { fetchUsers(); - }, [page]); + }, [page, searchQuery]); const fetchUsers = async () => { try { setLoading(true); - const data = await fetchClient(`/admin/users?page=${page}&limit=25`); + const params = new URLSearchParams({ + page: page.toString(), + limit: '25' + }); + if (searchQuery.trim()) { + params.append('search', searchQuery.trim()); + } + const data = await fetchClient(`/admin/users?${params.toString()}`); setUsers(data.users); setPagination(data.pagination); } catch (error: any) { @@ -75,15 +82,6 @@ export default function AdminUsersPage() { } }; - const filteredUsers = users.filter((user) => { - if (!searchQuery) return true; - const query = searchQuery.toLowerCase(); - return ( - user.telegramUserId.toLowerCase().includes(query) || - user.telegramUsername.toLowerCase().includes(query) - ); - }); - const usersWithOrders = users.filter(u => u.totalOrders > 0); const returningCustomers = users.filter(u => u.totalOrders > 1); const blockedUsers = users.filter(u => u.isBlocked); @@ -208,7 +206,10 @@ export default function AdminUsersPage() { placeholder="Search users..." className="pl-8 w-64" value={searchQuery} - onChange={(e) => setSearchQuery(e.target.value)} + onChange={(e) => { + setSearchQuery(e.target.value); + setPage(1); + }} /> @@ -219,7 +220,7 @@ export default function AdminUsersPage() {
- ) : filteredUsers.length === 0 ? ( + ) : users.length === 0 ? (
{searchQuery ? "No users found matching your search" : "No users found"}
@@ -238,7 +239,7 @@ export default function AdminUsersPage() { - {filteredUsers.map((user) => ( + {users.map((user) => (
{user.telegramUserId}
diff --git a/next.config.mjs b/next.config.mjs index 629f957..b952d72 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -6,6 +6,7 @@ const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === 'tr const baseConfig = { output: 'standalone', reactStrictMode: false, + compress: process.env.NODE_ENV === 'production', images: { remotePatterns: [ { @@ -16,7 +17,6 @@ const baseConfig = { protocol: "https", hostname: "telegram.org", }, - // Backend API hostname configured via environment variable ...(process.env.API_HOSTNAME ? [{ protocol: "https", hostname: process.env.API_HOSTNAME, @@ -26,7 +26,6 @@ const baseConfig = { async rewrites() { const apiBaseUrl = process.env.API_BASE_URL; - // Ensure API_BASE_URL is valid to prevent 500 errors if (!apiBaseUrl || apiBaseUrl === 'undefined') { console.warn('⚠️ API_BASE_URL not set! Set it to your backend domain'); console.warn('⚠️ Using localhost fallback - this will fail in production!'); @@ -46,8 +45,64 @@ const baseConfig = { }, ]; }, - experimental: { - // serverExternalPackages has been deprecated in Next.js 15 + compiler: { + removeConsole: process.env.NODE_ENV === 'production' ? { + exclude: ['error', 'warn'], + } : false, + }, + poweredByHeader: false, + webpack: (config, { isServer, dev }) => { + if (!isServer && !dev) { + // Only apply aggressive code splitting in production + config.optimization = { + ...config.optimization, + moduleIds: 'deterministic', + splitChunks: { + chunks: 'all', + cacheGroups: { + default: false, + vendors: false, + recharts: { + test: /[\\/]node_modules[\\/]recharts[\\/]/, + name: 'recharts', + chunks: 'all', + priority: 30, + }, + radix: { + test: /[\\/]node_modules[\\/]@radix-ui[\\/]/, + name: 'radix-ui', + chunks: 'all', + priority: 25, + }, + reactMarkdown: { + test: /[\\/]node_modules[\\/]react-markdown[\\/]/, + name: 'react-markdown', + chunks: 'all', + priority: 20, + }, + dateFns: { + test: /[\\/]node_modules[\\/]date-fns[\\/]/, + name: 'date-fns', + chunks: 'all', + priority: 15, + }, + framework: { + name: 'framework', + chunks: 'all', + test: /[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/, + priority: 40, + enforce: true, + }, + commons: { + name: 'commons', + minChunks: 2, + priority: 10, + }, + }, + }, + }; + } + return config; }, onDemandEntries: { maxInactiveAge: 15 * 1000, diff --git a/public/git-info.json b/public/git-info.json index d7004a3..95f0e66 100644 --- a/public/git-info.json +++ b/public/git-info.json @@ -1,4 +1,4 @@ { - "commitHash": "0062aa2", - "buildTime": "2025-12-31T05:39:04.712Z" + "commitHash": "5f1e294", + "buildTime": "2025-12-31T06:44:25.736Z" } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index d81d4ee..19b3cc8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,7 +26,7 @@ "./*" ] }, - "target": "ES2017" + "target": "ES2020" }, "include": [ "next-env.d.ts",