diff options
| author | Dhravya <[email protected]> | 2025-09-01 07:12:37 +0000 |
|---|---|---|
| committer | Dhravya <[email protected]> | 2025-09-01 07:12:37 +0000 |
| commit | 48e23c13edff6308e03ed430c53c5586cfb28f2a (patch) | |
| tree | 756ca8f6ea6945bbcc2a7090aafaa611c348ddb6 | |
| parent | fix: tour guide fix on overlap (#403) (diff) | |
| download | supermemory-48e23c13edff6308e03ed430c53c5586cfb28f2a.tar.xz supermemory-48e23c13edff6308e03ed430c53c5586cfb28f2a.zip | |
completely remove waitlist (#404)
| -rw-r--r-- | apps/web/app/page.tsx | 29 | ||||
| -rw-r--r-- | apps/web/app/ref/[code]/page.tsx | 25 | ||||
| -rw-r--r-- | apps/web/app/ref/page.tsx | 9 | ||||
| -rw-r--r-- | apps/web/app/waitlist/page.tsx | 216 | ||||
| -rw-r--r-- | apps/web/components/views/chat/chat-messages.tsx | 40 |
5 files changed, 33 insertions, 286 deletions
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index b9205928..4c20bf67 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -510,7 +510,7 @@ const MemoryGraphPage = () => { variant="consumer" > <div className="absolute inset-0 flex items-center justify-center"> - <ConnectAIModal + <ConnectAIModal onOpenChange={setShowConnectAIModal} open={showConnectAIModal} > @@ -566,7 +566,7 @@ const MemoryGraphPage = () => { totalLoaded={totalLoaded} > <div className="absolute inset-0 flex items-center justify-center"> - <ConnectAIModal + <ConnectAIModal onOpenChange={setShowConnectAIModal} open={showConnectAIModal} > @@ -714,23 +714,6 @@ export default function Page() { const router = useRouter(); const { user } = useAuth(); - const { data: waitlistStatus, isLoading: isCheckingWaitlist } = useQuery({ - queryKey: ["waitlist-status", user?.id], - queryFn: async () => { - try { - const response = await $fetch("@get/waitlist/status"); - return response.data; - } catch (error) { - console.error("Error checking waitlist status:", error); - // Return null to indicate error, will handle in useEffect - return null; - } - }, - enabled: !!user && !user.isAnonymous, - staleTime: 5 * 60 * 1000, // 5 minutes - retry: 1, // Only retry once on failure - }); - useEffect(() => { // save the token for chrome extension const url = new URL(window.location.href); @@ -744,14 +727,8 @@ export default function Page() { } }, []); - useEffect(() => { - if (waitlistStatus && !waitlistStatus.accessGranted) { - router.push("/waitlist"); - } - }, [waitlistStatus, router]); - // Show loading state while checking authentication and waitlist status - if (!user || isCheckingWaitlist) { + if (!user) { return ( <div className="min-h-screen flex items-center justify-center bg-[#0f1419]"> <div className="flex flex-col items-center gap-4"> diff --git a/apps/web/app/ref/[code]/page.tsx b/apps/web/app/ref/[code]/page.tsx index 3acbe657..98afcfe5 100644 --- a/apps/web/app/ref/[code]/page.tsx +++ b/apps/web/app/ref/[code]/page.tsx @@ -20,7 +20,6 @@ export default function ReferralPage() { const params = useParams(); const referralCode = params.code as string; - const [isJoiningWaitlist, setIsJoiningWaitlist] = useState(false); const [isLoading, setIsLoading] = useState(true); const [referralData, setReferralData] = useState<{ referrerName?: string; @@ -56,18 +55,7 @@ export default function ReferralPage() { checkReferral(); }, [referralCode]); - const handleJoinWaitlist = async () => { - setIsJoiningWaitlist(true); - try { - // Redirect to waitlist signup with referral code - router.push(`/waitlist?ref=${referralCode}`); - } catch (error) { - console.error("Error joining waitlist:", error); - toast.error("Failed to join waitlist. Please try again."); - } finally { - setIsJoiningWaitlist(false); - } - }; + const handleCopyLink = async () => { try { @@ -158,17 +146,6 @@ export default function ReferralPage() { </p> </div> - <Button - onClick={handleJoinWaitlist} - disabled={isJoiningWaitlist} - className="w-full bg-orange-500 hover:bg-orange-600 text-white" - > - {isJoiningWaitlist ? ( - <LoaderIcon className="w-4 h-4 animate-spin" /> - ) : ( - "Join the Waitlist" - )} - </Button> <div className="text-center"> <Link diff --git a/apps/web/app/ref/page.tsx b/apps/web/app/ref/page.tsx index 38be47b0..78373693 100644 --- a/apps/web/app/ref/page.tsx +++ b/apps/web/app/ref/page.tsx @@ -40,17 +40,10 @@ export default function ReferralHomePage() { </p> </div> - <Button - asChild - className="w-full bg-orange-500 hover:bg-orange-600 text-white" - > - <Link href="/waitlist">Join the Waitlist</Link> - </Button> - <div className="text-center"> <Link - href="https://supermemory.ai" className="text-orange-500 hover:text-orange-400 text-sm underline" + href="https://supermemory.ai" > Learn more about supermemory </Link> diff --git a/apps/web/app/waitlist/page.tsx b/apps/web/app/waitlist/page.tsx deleted file mode 100644 index c5c2dfd6..00000000 --- a/apps/web/app/waitlist/page.tsx +++ /dev/null @@ -1,216 +0,0 @@ -"use client"; - -import { $fetch } from "@lib/api"; -import { authClient } from "@lib/auth"; -import { useAuth } from "@lib/auth-context"; -import { fetchConsumerProProduct } from "@lib/queries"; -import { Button } from "@ui/components/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@ui/components/card"; -import { useCustomer } from "autumn-js/react"; -import { Clock, LoaderIcon, LogOut, SkipForwardIcon } from "lucide-react"; -import Link from "next/link"; -import { useRouter, useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; -import { toast } from "sonner"; - -export default function WaitlistPage() { - const router = useRouter(); - const searchParams = useSearchParams(); - const referralCode = searchParams.get("ref"); - const { user } = useAuth(); - const [isChecking, setIsChecking] = useState(true); - const [isSkippingWaitlist, setIsSkippingWaitlist] = useState(false); - const [waitlistStatus, setWaitlistStatus] = useState<{ - inWaitlist: boolean; - accessGranted: boolean; - createdAt: string; - } | null>(null); - const autumn = useCustomer(); - - const { data: earlyAccess } = fetchConsumerProProduct(autumn); - - const handleSkipWaitlist = async () => { - setIsSkippingWaitlist(true); - try { - const res = await autumn.attach({ - productId: "consumer_pro", - forceCheckout: true, - successUrl: "https://app.supermemory.ai/", - }); - if (res.data && "checkout_url" in res.data && res.data.checkout_url) { - router.push(res.data.checkout_url); - } - } catch (error) { - console.error("Error skipping waitlist:", error); - } finally { - setIsSkippingWaitlist(false); - } - }; - - const handleLogout = async () => { - try { - await authClient.signOut(); - router.push("/"); - } catch (error) { - console.error("Error signing out:", error); - toast.error("Failed to sign out"); - } - }; - - useEffect(() => { - async function checkAccess() { - if (!user) { - router.push("/"); - return; - } - - // Anonymous users should sign in first - if (user.isAnonymous) { - authClient.signOut(); - router.push("/"); - return; - } - - try { - // Check waitlist status using the new endpoint - const response = await $fetch("@get/waitlist/status"); - - if (response.data) { - setWaitlistStatus(response.data); - - if (!response.data.inWaitlist) { - authClient.signOut(); - router.push("/login"); - } - - // If user has access, redirect to home - if (response.data.accessGranted) { - router.push("/"); - } - } - } catch (error) { - console.error("Error checking waitlist status:", error); - // If there's an error, assume user is on waitlist - setWaitlistStatus({ - inWaitlist: true, - accessGranted: false, - createdAt: new Date().toISOString(), - }); - } finally { - setIsChecking(false); - } - } - - checkAccess(); - }, [user, router]); - - if (isChecking) { - return ( - <div className="min-h-screen flex items-center justify-center p-4 bg-[#0f1419]"> - <div className="flex flex-col items-center gap-4"> - <LoaderIcon className="w-8 h-8 text-orange-500 animate-spin" /> - <p className="text-white/60">Checking access...</p> - </div> - </div> - ); - } - - return ( - <div className="min-h-screen flex items-center justify-center p-4 bg-[#0f1419]"> - <Card className="max-w-md w-full bg-[#1a1f2a] border-white/10"> - <CardHeader className="text-center"> - <div className="mx-auto mb-4 w-16 h-16 rounded-full bg-orange-500/10 flex items-center justify-center"> - <Clock className="w-8 h-8 text-orange-500" /> - </div> - <CardTitle className="text-2xl font-bold text-white"> - You're on the waitlist! - </CardTitle> - <CardDescription className="text-white/60 mt-2"> - {referralCode - ? "Thanks for joining through a friend's invitation! You've been added to the waitlist with priority access." - : "Thanks for your interest in supermemory. We'll notify you as soon as we're ready for you."} - </CardDescription> - {referralCode && ( - <div className="mt-3 px-3 py-2 bg-orange-500/10 rounded-lg border border-orange-500/20"> - <p className="text-orange-400 text-sm font-medium"> - 🎉 Referred by a friend! You'll get priority access. - </p> - </div> - )} - </CardHeader> - <CardContent> - <div className="flex flex-col gap-4"> - {!earlyAccess?.allowed && ( - <Button - disabled={isSkippingWaitlist} - onClick={handleSkipWaitlist} - > - {isSkippingWaitlist ? ( - <LoaderIcon className="w-4 h-4 animate-spin" /> - ) : ( - <SkipForwardIcon className="w-4 h-4" /> - )} - {isSkippingWaitlist - ? "Processing..." - : "Skip the waitlist for $15"} - </Button> - )} - <div className="pt-4 border-t border-white/10"> - <p className="text-white/60 text-sm"> - We're working hard to bring you the best experience. In the - meantime, you can: - </p> - <ul className="mt-3 space-y-2 text-sm"> - <li className="flex items-center gap-2 text-white/80"> - <span className="text-orange-500">•</span> - <a - className="hover:text-white transition-colors underline" - href="https://x.com/supermemoryai" - rel="noopener noreferrer" - target="_blank" - > - Follow our X for updates - </a> - </li> - <li className="flex items-center gap-2 text-white/80"> - <span className="text-orange-500">•</span> - <a - className="hover:text-white transition-colors underline" - href="https://supermemory.link/discord" - rel="noopener noreferrer" - target="_blank" - > - Join our community Discord - </a> - </li> - </ul> - </div> - - {user && ( - <div className="pt-4 text-center space-y-3"> - <p className="text-white/50 text-xs"> - Signed in as {user.email} - </p> - <Button - variant="outline" - size="sm" - onClick={handleLogout} - className="border-white/20 hover:bg-white/5" - > - <LogOut className="w-4 h-4 mr-2" /> - Sign out - </Button> - </div> - )} - </div> - </CardContent> - </Card> - </div> - ); -} diff --git a/apps/web/components/views/chat/chat-messages.tsx b/apps/web/components/views/chat/chat-messages.tsx index 1b338b0f..85f91565 100644 --- a/apps/web/components/views/chat/chat-messages.tsx +++ b/apps/web/components/views/chat/chat-messages.tsx @@ -5,7 +5,15 @@ import { cn } from "@lib/utils"; import { Button } from "@ui/components/button"; import { Input } from "@ui/components/input"; import { DefaultChatTransport } from "ai"; -import { ArrowUp, Check, Copy, RotateCcw, X, ChevronDown, ChevronRight } from "lucide-react"; +import { + ArrowUp, + Check, + ChevronDown, + ChevronRight, + Copy, + RotateCcw, + X, +} from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { Streamdown } from "streamdown"; @@ -41,8 +49,9 @@ function ExpandableMemories({ foundCount, results }: ExpandableMemoriesProps) { return ( <div className="text-sm"> <button - onClick={() => setIsExpanded(!isExpanded)} className="flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors" + onClick={() => setIsExpanded(!isExpanded)} + type="button" > {isExpanded ? ( <ChevronDown className="size-4" /> @@ -52,12 +61,15 @@ function ExpandableMemories({ foundCount, results }: ExpandableMemoriesProps) { <Check className="size-4" /> Found {foundCount} {foundCount === 1 ? "memory" : "memories"} </button> - + {isExpanded && results.length > 0 && ( <div className="mt-2 ml-6 space-y-2 max-h-48 overflow-y-auto"> {results.map((result, index) => { - const isClickable = result.url && (result.url.startsWith('http://') || result.url.startsWith('https://')); - + const isClickable = + result.url && + (result.url.startsWith("http://") || + result.url.startsWith("https://")); + const content = ( <> {result.title && ( @@ -86,11 +98,11 @@ function ExpandableMemories({ foundCount, results }: ExpandableMemoriesProps) { if (isClickable) { return ( <a - key={result.documentId || index} + className="block p-2 bg-white/5 rounded-md border border-white/10 hover:bg-white/10 hover:border-white/20 transition-colors cursor-pointer" href={result.url} - target="_blank" + key={result.documentId || index} rel="noopener noreferrer" - className="block p-2 bg-white/5 rounded-md border border-white/10 hover:bg-white/10 hover:border-white/20 transition-colors cursor-pointer" + target="_blank" > {content} </a> @@ -99,8 +111,8 @@ function ExpandableMemories({ foundCount, results }: ExpandableMemoriesProps) { return ( <div - key={result.documentId || index} className="p-2 bg-white/5 rounded-md border border-white/10" + key={result.documentId || index} > {content} </div> @@ -376,12 +388,16 @@ export function ChatMessages() { "count" in output ? Number(output.count) || 0 : 0; - const results = Array.isArray(output?.results) ? output.results : []; - + // @ts-expect-error + const results = Array.isArray(output?.results) + ? // @ts-expect-error + output.results + : []; + return ( <ExpandableMemories - key={message.id + part.type} foundCount={foundCount} + key={message.id + part.type} results={results} /> ); |