From fa7d3970182e2f2eea034ebbcf4e69195581ba98 Mon Sep 17 00:00:00 2001 From: Matiss Jurevics Date: Fri, 23 Jan 2026 20:43:12 +0000 Subject: [PATCH] feat: updated logic --- app/(marketing)/page.tsx | 28 +++++++++++++++++- app/share/[code]/page.tsx | 60 +++++++++++++++++++-------------------- components/Toast.tsx | 37 ++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 31 deletions(-) create mode 100644 components/Toast.tsx diff --git a/app/(marketing)/page.tsx b/app/(marketing)/page.tsx index 8fed704..70b49a2 100644 --- a/app/(marketing)/page.tsx +++ b/app/(marketing)/page.tsx @@ -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(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 (
+ {error && setError(null)} />} @@ -15,3 +33,11 @@ export default function Home() {
); } + +export default function Home() { + return ( + }> + + + ); +} diff --git a/app/share/[code]/page.tsx b/app/share/[code]/page.tsx index f7ecdec..e2312fe 100644 --- a/app/share/[code]/page.tsx +++ b/app/share/[code]/page.tsx @@ -7,39 +7,39 @@ export default function SharePage({ params }: { params: { code: string } }) { const code = params.code; useEffect(() => { - const deepLink = "nemia://share/" + code; - const playStoreLink = "https://play.google.com/store/apps/details?id=app.nemia.android"; - const waitlistLink = "https://nemia.app/waitlist"; - const landingPage = "https://nemia.app"; + 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"; + const landingPage = "https://nemia.app"; - const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera; + const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera; - // iOS Detection - if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) { - window.location.href = waitlistLink; - return; + // iOS Detection + if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) { + window.location.href = waitlistLink; + return; + } + + // 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(playStoreLink) + + ";end"; + window.location.href = intentUrl; + return; + } + + // Desktop / Other: Stay on the page + } catch (e) { + console.error("Redirection error:", e); + window.location.href = `/?error=${encodeURIComponent("An error occurred while redirecting.")}`; } - - // Android Detection - if (/android/i.test(userAgent)) { - // Try to open the app via Intent Scheme - const intentUrl = - "intent://share/" + - code + - "#Intent;scheme=nemia;package=app.nemia.android;S.browser_fallback_url=" + - encodeURIComponent(landingPage) + - ";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; }, [code]); return ( diff --git a/components/Toast.tsx b/components/Toast.tsx new file mode 100644 index 0000000..bbd2845 --- /dev/null +++ b/components/Toast.tsx @@ -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 ( +
+ {message} + +
+ ); +}