164 lines
5.4 KiB
TypeScript
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>
|
|
)
|
|
}
|