chore: upgrade dependencies, restructure shared libs, and fix UI

- Upgrade Nx 22.1.1 → 22.6.3 and all patch/minor dependencies
- Restructure shared libs: move business logic from utils to service
- Consolidate shadcn-ui into ui lib with atomic design pattern
- Fix container centering for landing app (Tailwind v4 compatibility)
- Fix button styling by updating @source directive in globals.css
- Fix SiCss3 → SiCss rename in react-icons 5.6
- Fix duplicate useSession export conflict
- Remove dead code, comments, and unused files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
maulanasdqn
2026-03-31 01:44:17 +07:00
co-authored by Claude Opus 4.6
parent f68d97188c
commit 3f4461c65c
231 changed files with 6062 additions and 39166 deletions
@@ -18,7 +18,6 @@ const CallbackPage: FC = (): ReactElement => {
hasRunRef.current = true;
try {
// Check URL hash for Supabase email confirmation callback
const hashParams = new URLSearchParams(
globalThis.location.hash.substring(1)
);
@@ -28,7 +27,6 @@ const CallbackPage: FC = (): ReactElement => {
const accessToken =
hashParams.get('access_token') || urlParams.get('access_token');
// Debug: log what we received
console.log('[Callback] Params:', {
type,
accessToken: !!accessToken,
@@ -36,19 +34,15 @@ const CallbackPage: FC = (): ReactElement => {
search: globalThis.location.search,
});
// Handle Supabase email callbacks (has access_token in hash or query)
// This includes: signup confirmation, email confirmation, password recovery
if (accessToken) {
setIsProcessing(false);
// Password recovery - type is 'recovery' or we have access_token from reset email
if (type === 'recovery' || type === 'magiclink') {
toast.success('Email verified! Please set your new password.');
navigate('/auth/reset-password?access_token=' + accessToken);
return;
}
// Signup/Email confirmation
if (type === 'signup' || type === 'email_confirmation') {
toast.success(
'Email verified successfully! Please log in to continue.'
@@ -57,27 +51,22 @@ const CallbackPage: FC = (): ReactElement => {
return;
}
// If we have access_token but unknown type, assume it's password recovery
// (Supabase sometimes sends without explicit type)
toast.success('Email verified! Please set your new password.');
navigate('/auth/reset-password?access_token=' + accessToken);
return;
}
// Get the code from URL query params (GitHub OAuth)
const code = urlParams.get('code');
if (!code) {
throw new Error('No authorization code received');
}
// Exchange the code for tokens using backend API (GitHub OAuth)
const result = await exchangeGitHubCode({ code });
toast.success('Login successful!');
setIsProcessing(false);
// Check if user has completed onboarding (has location)
if (result.user.location) {
globalThis.location.replace('/dashboard');
} else {
@@ -100,7 +89,6 @@ const CallbackPage: FC = (): ReactElement => {
}, []);
if (error) {
// Check if error is related to private email
const isPrivateEmailError =
error.toLowerCase().includes('failed to create user') ||
error.toLowerCase().includes('email') ||
+2 -14
View File
@@ -23,7 +23,6 @@ export default function LoginPage() {
}
}, [isAuthenticated, navigate]);
// Check for password reset tokens in URL and redirect to reset-password page
useEffect(() => {
const hashParams = new URLSearchParams(
globalThis.location.hash.substring(1)
@@ -34,13 +33,11 @@ export default function LoginPage() {
hashParams.get('access_token') || urlParams.get('access_token');
const type = hashParams.get('type') || urlParams.get('type');
// If we have an access_token, this is likely a password reset redirect that landed on the wrong page
if (accessToken) {
console.log(
'[Login] Detected access_token, redirecting to reset-password page'
);
// Check if it's a password recovery
if (type === 'recovery' || type === 'magiclink' || !type) {
toast.info('Redirecting to password reset...');
navigate('/auth/reset-password?access_token=' + accessToken);
@@ -76,22 +73,14 @@ export default function LoginPage() {
};
const handleGithubLogin = async () => {
// TODO: Implement GitHub login with new auth service if needed
toast.info('GitHub login coming soon');
};
return (
<div className="flex justify-center items-center min-h-screen bg-gray-50 p-4">
<div className="bg-white w-full max-w-md p-8 rounded-2xl shadow-lg border border-gray-200">
{/* <div className="flex items-center justify-between mb-6">
<button
onClick={() => navigate('/')}
className="cursor-pointer text-primary-500 hover:text-primary-600 text-base font-sans flex items-center"
>
<Icon icon="ic:baseline-chevron-left" width="24" height="24" />
Back to Homepage
</button>
</div> */}
{
}
<div className="text-center mb-8">
<h2 className="text-3xl font-bold text-gray-900 mb-2">
@@ -106,7 +95,6 @@ export default function LoginPage() {
</div>
)}
{/* Traditional Login Form */}
<form onSubmit={handleEmailLogin} className="space-y-4 mb-6">
<div>
<label
@@ -18,8 +18,6 @@ export default function ResetPasswordPage() {
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
useEffect(() => {
// Get the access_token from URL hash (Supabase sends it as hash fragment)
// or from query params (when redirected from callback page)
const hashParams = new URLSearchParams(
globalThis.location.hash.substring(1)
);
@@ -61,7 +59,6 @@ export default function ResetPasswordPage() {
toast.success('Password updated successfully!');
// Clear session and redirect to login
clearSession();
navigate('/auth/login');
} catch (err) {
@@ -62,7 +62,6 @@ export default function SignupPage() {
navigate('/');
} catch (err: any) {
console.error('[Signup] Email signup failed:', err);
// Construct a user-friendly error message
const errorMessage =
err.response?.data?.message || err.message || 'Signup failed';
setError(errorMessage);