8 Commits
main ... dev

Author SHA1 Message Date
john kevin asprec
9adabb6f5d feat: add impersonate page to handle session token injection and redirection 2026-06-16 22:33:18 +08:00
kevin-asprec
9f031a6757 fix: override NODE_ENV=development for npm install in Coolify
Coolify injects ARG NODE_ENV=production which causes npm to skip
devDependencies (typescript, tailwindcss, postcss). Override with
ENV NODE_ENV=development before npm install, then set production
before next build.
2026-04-14 20:41:57 +08:00
kevin-asprec
342e17aed2 fix: remove ENV NODE_ENV=development that breaks Next.js static generation 2026-04-14 20:12:54 +08:00
kevin-asprec
428b6f58d8 fix: add not-found.tsx to prevent Html import error during build 2026-04-14 09:42:38 +08:00
kevin-asprec
af20fcb1dc fix: set NODE_ENV=development during build to include devDependencies 2026-04-14 09:00:52 +08:00
kevin-asprec
f069b84f87 fix: add cache bust arg to force clean Docker build 2026-04-14 06:41:20 +08:00
kevin-asprec
60159970aa fix: use next.config.mjs to avoid typescript build dependency 2026-04-14 06:30:59 +08:00
kevin-asprec
dcadef92b6 fix: install typescript for next.config.ts transpilation in Dockerfile 2026-04-14 06:05:30 +08:00
2 changed files with 42 additions and 0 deletions

View File

@@ -3,4 +3,5 @@ const nextConfig = {
transpilePackages: ['@fiberops/shared'], transpilePackages: ['@fiberops/shared'],
output: 'standalone', output: 'standalone',
}; };
export default nextConfig; export default nextConfig;

View File

@@ -0,0 +1,41 @@
'use client';
import { useEffect, Suspense } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
function ImpersonateHandler() {
const router = useRouter();
const searchParams = useSearchParams();
useEffect(() => {
const token = searchParams.get('token');
const userStr = searchParams.get('user');
const tenantStr = searchParams.get('tenant');
if (token && userStr && tenantStr) {
localStorage.setItem('accessToken', token);
localStorage.setItem('user', userStr);
localStorage.setItem('tenant', tenantStr);
localStorage.setItem('is_impersonating', 'true');
router.push('/dashboard');
} else {
router.push('/login');
}
}, [router, searchParams]);
return null;
}
export default function ImpersonatePage() {
return (
<div className="min-h-screen flex items-center justify-center bg-surface-50 dark:bg-surface-900">
<div className="text-center">
<div className="w-10 h-10 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto mb-4"></div>
<p className="text-surface-600 dark:text-surface-400">Loading impersonation session...</p>
</div>
<Suspense fallback={null}>
<ImpersonateHandler />
</Suspense>
</div>
);
}