aethex.live/app/onboarding/page.tsx

164 lines
5.4 KiB
TypeScript

'use client'
import { useState, useEffect } from 'react'
import { createClient } from '@/lib/supabase/client'
import { useRouter } from 'next/navigation'
export default function OnboardingPage() {
const [user, setUser] = useState<any>(null)
const [loading, setLoading] = useState(false)
const [channelName, setChannelName] = useState('')
const [channelSlug, setChannelSlug] = useState('')
const [bio, setBio] = useState('')
const [category, setCategory] = useState('creative')
const [error, setError] = useState('')
const router = useRouter()
const supabase = createClient()
useEffect(() => {
async function getUser() {
const { data: { user } } = await supabase.auth.getUser()
setUser(user)
}
getUser()
}, [])
// Auto-generate slug from channel name
const handleNameChange = (name: string) => {
setChannelName(name)
const slug = name
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
setChannelSlug(slug)
}
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
setLoading(true)
setError('')
try {
const response = await fetch('/api/auth/create-channel', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: channelName,
slug: channelSlug,
bio,
category,
}),
})
if (!response.ok) {
const data = await response.json()
setError(data.error || 'Failed to create channel')
return
}
// Redirect to dashboard
router.push('/dashboard')
} catch (err) {
setError('An error occurred. Please try again.')
console.error(err)
} finally {
setLoading(false)
}
}
if (!user) {
return (
<div className="text-center mt-20">
<p>Please sign in first</p>
<button
onClick={() => router.push('/login')}
className="mt-4 bg-purple-600 hover:bg-purple-700 px-6 py-2 rounded"
>
Sign In
</button>
</div>
)
}
return (
<div className="min-h-screen bg-black text-white flex items-center justify-center px-4">
<div className="w-full max-w-md">
<h1 className="text-3xl font-bold mb-8 text-center">Create Your Channel</h1>
<form onSubmit={handleSubmit} className="space-y-6">
{error && (
<div className="bg-red-900 border border-red-700 text-red-200 px-4 py-3 rounded">
{error}
</div>
)}
<div>
<label className="block text-sm font-medium mb-2">Channel Name *</label>
<input
type="text"
required
value={channelName}
onChange={(e) => handleNameChange(e.target.value)}
placeholder="My Awesome Channel"
className="w-full bg-gray-900 border border-gray-700 rounded px-4 py-2 text-white placeholder-gray-500 focus:outline-none focus:border-purple-500"
/>
</div>
<div>
<label className="block text-sm font-medium mb-2">Channel URL (slug) *</label>
<div className="flex items-center">
<span className="text-gray-400">aethex.live/</span>
<input
type="text"
required
value={channelSlug}
onChange={(e) => setChannelSlug(e.target.value)}
className="flex-1 bg-gray-900 border border-gray-700 rounded ml-2 px-4 py-2 text-white focus:outline-none focus:border-purple-500"
/>
</div>
</div>
<div>
<label className="block text-sm font-medium mb-2">Category *</label>
<select
value={category}
onChange={(e) => setCategory(e.target.value)}
className="w-full bg-gray-900 border border-gray-700 rounded px-4 py-2 text-white focus:outline-none focus:border-purple-500"
>
<option value="creative">Creative</option>
<option value="gaming">Gaming</option>
<option value="music">Music</option>
<option value="education">Education</option>
<option value="sports">Sports</option>
<option value="entertainment">Entertainment</option>
<option value="other">Other</option>
</select>
</div>
<div>
<label className="block text-sm font-medium mb-2">Bio</label>
<textarea
value={bio}
onChange={(e) => setBio(e.target.value)}
placeholder="Tell viewers about yourself..."
rows={4}
className="w-full bg-gray-900 border border-gray-700 rounded px-4 py-2 text-white placeholder-gray-500 focus:outline-none focus:border-purple-500 resize-none"
/>
</div>
<button
type="submit"
disabled={!channelName || !channelSlug || loading}
className="w-full bg-purple-600 hover:bg-purple-700 disabled:opacity-50 disabled:cursor-not-allowed rounded px-6 py-3 font-medium transition-colors"
>
{loading ? 'Creating Channel...' : 'Create Channel'}
</button>
</form>
<p className="text-center text-gray-400 text-sm mt-6">
You can change these details later in your creator settings.
</p>
</div>
</div>
)
}