feat: updated logic

This commit is contained in:
2026-01-23 20:43:12 +00:00
parent 27f7660093
commit fa7d397018
3 changed files with 94 additions and 31 deletions

View File

@@ -4,10 +4,28 @@ import Hero from '@/components/Hero';
import Features from '@/components/Features';
import HowItWorks from '@/components/HowItWorks';
import CallToAction from '@/components/CallToAction';
import Toast from '@/components/Toast';
import { useSearchParams, useRouter } from 'next/navigation';
import { Suspense, useEffect, useState } from 'react';
function HomeContent() {
const searchParams = useSearchParams();
const router = useRouter();
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const errorMsg = searchParams.get('error');
if (errorMsg) {
setError(errorMsg);
// Clean up URL
const newUrl = window.location.pathname;
window.history.replaceState({}, '', newUrl);
}
}, [searchParams]);
export default function Home() {
return (
<main>
{error && <Toast message={error} onClose={() => setError(null)} />}
<Hero />
<Features />
<HowItWorks />
@@ -15,3 +33,11 @@ export default function Home() {
</main>
);
}
export default function Home() {
return (
<Suspense fallback={<main><Hero /><Features /><HowItWorks /><CallToAction /></main>}>
<HomeContent />
</Suspense>
);
}

View File

@@ -7,6 +7,7 @@ export default function SharePage({ params }: { params: { code: string } }) {
const code = params.code;
useEffect(() => {
try {
const deepLink = "nemia://share/" + code;
const playStoreLink = "https://play.google.com/store/apps/details?id=app.nemia.android";
const waitlistLink = "https://nemia.app/waitlist";
@@ -23,23 +24,22 @@ export default function SharePage({ params }: { params: { code: string } }) {
// Android Detection
if (/android/i.test(userAgent)) {
// Try to open the app via Intent Scheme
// Fallback to Play Store if app not installed
const intentUrl =
"intent://share/" +
code +
"#Intent;scheme=nemia;package=app.nemia.android;S.browser_fallback_url=" +
encodeURIComponent(landingPage) +
encodeURIComponent(playStoreLink) +
";end";
window.location.href = intentUrl;
// Fallback attempt (optional, if intent fails)
// setTimeout(() => {
// window.location.href = playStoreLink;
// }, 2000);
return;
}
// Desktop / Other: Stay on the page or redirect to landing
// window.location.href = landingPage;
// Desktop / Other: Stay on the page
} catch (e) {
console.error("Redirection error:", e);
window.location.href = `/?error=${encodeURIComponent("An error occurred while redirecting.")}`;
}
}, [code]);
return (

37
components/Toast.tsx Normal file
View File

@@ -0,0 +1,37 @@
"use client";
import { useEffect, useState } from "react";
import { X } from "lucide-react";
interface ToastProps {
message: string;
onClose: () => void;
duration?: number;
}
export default function Toast({ message, onClose, duration = 5000 }: ToastProps) {
const [visible, setVisible] = useState(true);
useEffect(() => {
const timer = setTimeout(() => {
setVisible(false);
setTimeout(onClose, 300); // Wait for fade out animation
}, duration);
return () => clearTimeout(timer);
}, [duration, onClose]);
if (!message) return null;
return (
<div
className={`fixed top-5 left-1/2 transform -translate-x-1/2 z-50 flex items-center gap-3 px-4 py-3 bg-red-600 text-white rounded-lg shadow-lg transition-opacity duration-300 ${visible ? "opacity-100" : "opacity-0"
}`}
>
<span className="text-sm font-medium">{message}</span>
<button onClick={() => setVisible(false)} className="hover:opacity-80">
<X size={16} />
</button>
</div>
);
}