'use client' import { useState, useEffect, useRef } from 'react' import { useRouter } from 'next/navigation' import { useTranslations } from 'next-intl' import Link from 'next/link' import { createClient } from '@/lib/supabase/client' import { Button } from '@/components/ui/button' import { useToast } from '@/components/ui/use-toast' import { TurnstileChallenge, type TurnstileChallengeHandle, } from '@/components/auth/TurnstileChallenge' import { Loader2 } from 'lucide-react' import { getBranding } from '@/lib/branding/service' import { BrandWordmark } from '@/components/branding/BrandWordmark' import { getErrorMessage as getUserErrorMessage } from '@/lib/errors/get-error-message' import { captchaTokenOptions, isTurnstileSubmissionBlocked, } from '@/lib/auth/turnstile' const branding = getBranding() export default function SandboxPage() { const [isLoading, setIsLoading] = useState(false) const [isLoggedIn, setIsLoggedIn] = useState(null) const [captchaToken, setCaptchaToken] = useState(null) const turnstileRef = useRef(null) const { toast } = useToast() const router = useRouter() const supabase = createClient() const tAuth = useTranslations('auth') useEffect(() => { supabase.auth.getUser().then(({ data: { user } }) => { setIsLoggedIn(user !== null && !user.is_anonymous) }) }, [supabase.auth]) const handleStartSandbox = async () => { if (isTurnstileSubmissionBlocked(captchaToken)) { toast({ title: 'Kunde inte starta sandlådan', description: tAuth('turnstile_required'), variant: 'destructive', }) return } setIsLoading(true) try { const { error } = await supabase.auth.signInAnonymously({ options: captchaTokenOptions(captchaToken), }) if (error) { toast({ title: 'Kunde inte starta sandlådan', description: getUserErrorMessage(error), variant: 'destructive', }) return } const res = await fetch('/api/sandbox/seed', { method: 'POST' }) if (!res.ok) { const body = await res.json().catch(() => ({})) // Clean up the orphaned anonymous session so the user can retry cleanly await supabase.auth.signOut() toast({ title: 'Kunde inte skapa demodata', description: 'Försök igen om en stund.', variant: 'destructive', }) return } // Full page load to ensure middleware picks up the new session cookies window.location.href = '/' } catch { toast({ title: 'Något gick fel', description: 'Försök igen om en stund.', variant: 'destructive', }) } finally { turnstileRef.current?.reset() setIsLoading(false) } } // Loading state while checking auth if (isLoggedIn === null) { return (
) } // Already logged in as a real user if (isLoggedIn) { return (

Du är redan inloggad

Sandlådan kräver att du inte är inloggad. Öppna ett inkognitofönster eller logga ut först.

) } // Sandbox landing return (

Testa {branding.appName.toLowerCase()} utan att registrera dig

Utforska ett fullt demoföretag med riktig data: helt gratis.

AI-assistenten och externa tjänster (e-post, bankuppkoppling, valutakurser, Skatteverket) är avstängda i sandlådan: de kräver ett riktigt konto.

Dina data raderas automatiskt efter 24 timmar

Har du redan ett konto?{' '} Logga in

) }