veza/apps/web/src/components/modals/CreatorModal.tsx

173 lines
7.2 KiB
TypeScript
Raw Normal View History

import React, { useState } from 'react';
import { Card } from '../ui/card';
import { Button } from '../ui/button';
import { Input, FileUpload } from '../ui/input';
import {
X,
Music,
Package,
BookOpen,
CheckCircle,
Tag,
Lock,
DollarSign,
} from 'lucide-react';
interface CreatorModalProps {
isOpen: boolean;
onClose: () => void;
}
export const CreatorModal: React.FC<CreatorModalProps> = ({
isOpen,
onClose,
}) => {
const [activeTab, setActiveTab] = useState<'track' | 'product' | 'course'>(
'track',
);
const [step, setStep] = useState(1);
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-[100] flex items-center justify-center p-4">
<div
className="absolute inset-0 bg-kodo-void/90 backdrop-blur-sm"
onClick={onClose}
></div>
<div className="relative w-full max-w-4xl bg-kodo-graphite border border-kodo-steel rounded-2xl shadow-2xl animate-scaleIn overflow-hidden flex flex-col max-h-[90vh]">
{/* Header */}
<div className="flex justify-between items-center p-6 border-b border-kodo-steel bg-kodo-ink">
<div className="flex items-center gap-4">
<h2 className="text-2xl font-display font-bold text-white">
CREATOR STUDIO
</h2>
<div className="flex bg-kodo-slate rounded-lg p-1">
<button
onClick={() => setActiveTab('track')}
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'track' ? 'bg-kodo-cyan text-black' : 'text-kodo-content-dim hover:text-white'}`}
>
<Music className="w-4 h-4" /> Track
</button>
<button
onClick={() => setActiveTab('product')}
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'product' ? 'bg-kodo-magenta text-white' : 'text-kodo-content-dim hover:text-white'}`}
>
<Package className="w-4 h-4" /> Product
</button>
<button
onClick={() => setActiveTab('course')}
className={`px-4 py-1.5 rounded text-sm font-bold transition-all flex items-center gap-2 ${activeTab === 'course' ? 'bg-kodo-gold text-black' : 'text-kodo-content-dim hover:text-white'}`}
>
<BookOpen className="w-4 h-4" /> Course
</button>
</div>
</div>
<button onClick={onClose} className="text-kodo-content-dim hover:text-white">
<X className="w-6 h-6" />
</button>
</div>
{/* Content */}
<div className="p-8 flex-1 overflow-y-auto">
{/* Progress Stepper */}
<div className="flex justify-between max-w-lg mx-auto mb-10 relative">
<div className="absolute top-1/2 left-0 w-full h-1 bg-kodo-steel -z-10"></div>
{[1, 2, 3].map((i) => (
<div
key={i}
className={`w-8 h-8 rounded-full flex items-center justify-center font-bold text-sm transition-colors ${step >= i ? 'bg-kodo-cyan text-black' : 'bg-kodo-slate text-kodo-content-dim'}`}
>
{step > i ? <CheckCircle className="w-5 h-5" /> : i}
</div>
))}
</div>
{activeTab === 'track' && (
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="space-y-6">
<FileUpload />
<div className="bg-kodo-slate p-4 rounded-lg border border-kodo-steel">
<h4 className="font-bold text-kodo-content-dim text-sm mb-2 uppercase">
File Requirements
</h4>
<ul className="text-xs text-kodo-content-dim space-y-1">
<li> WAV, FLAC, AIFF (Lossless preferred)</li>
<li> Max size 500MB</li>
<li> 44.1kHz / 24-bit minimum</li>
</ul>
</div>
</div>
<div className="space-y-4">
<Input label="Track Title" placeholder="e.g. Neon Nights" />
<div className="grid grid-cols-2 gap-4">
<Input label="BPM" placeholder="128" />
<Input label="Key" placeholder="F# Minor" />
</div>
<Input label="Genre" placeholder="Cyberpunk / Synthwave" />
<div className="pt-4">
<label className="block text-sm font-medium text-kodo-content-dim mb-2 font-body">
Visibility
</label>
<div className="grid grid-cols-3 gap-2">
<button className="p-3 rounded border border-kodo-cyan bg-kodo-cyan/10 text-kodo-cyan flex flex-col items-center justify-center gap-2">
<Tag className="w-5 h-5" />{' '}
<span className="text-xs font-bold">Public</span>
</button>
<button className="p-3 rounded border border-kodo-steel bg-kodo-slate text-kodo-content-dim flex flex-col items-center justify-center gap-2 hover:border-white hover:text-white">
<Lock className="w-5 h-5" />{' '}
<span className="text-xs font-bold">Private</span>
</button>
<button className="p-3 rounded border border-kodo-steel bg-kodo-slate text-kodo-content-dim flex flex-col items-center justify-center gap-2 hover:border-white hover:text-white">
<DollarSign className="w-5 h-5" />{' '}
<span className="text-xs font-bold">Premium</span>
</button>
</div>
</div>
</div>
</div>
)}
{activeTab === 'product' && (
<div className="text-center py-10">
<h3 className="text-xl font-bold text-white mb-2">
Sell Your Sounds
</h3>
<p className="text-kodo-content-dim mb-6">
Create Sample Packs, Presets, or DAW Templates.
</p>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
{['Sample Pack', 'Serum Presets', 'Ableton Template'].map(
(type) => (
<Card
key={type}
variant="default"
className="hover:border-kodo-magenta cursor-pointer group"
>
<Package className="w-8 h-8 text-kodo-magenta mb-4 group-hover:scale-110 transition-transform" />
<h4 className="font-bold">{type}</h4>
</Card>
),
)}
</div>
</div>
)}
</div>
{/* Footer */}
<div className="p-6 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
<Button variant="ghost" onClick={onClose}>
CANCEL
</Button>
<Button
variant="primary"
onClick={() => setStep((s) => Math.min(3, s + 1))}
>
{step === 3 ? 'PUBLISH RELEASE' : 'NEXT STEP'}
</Button>
</div>
</div>
</div>
);
};