218 lines
6.8 KiB
TypeScript
218 lines
6.8 KiB
TypeScript
import { OnboardingData } from "@/pages/Onboarding";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Label } from "@/components/ui/label";
|
|
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
|
|
interface InterestsProps {
|
|
data: OnboardingData;
|
|
updateData: (data: Partial<OnboardingData>) => void;
|
|
nextStep: () => void;
|
|
prevStep: () => void;
|
|
}
|
|
|
|
const goalOptions = {
|
|
'game-developer': [
|
|
'Learn new game development technologies',
|
|
'Get mentorship from industry experts',
|
|
'Collaborate on innovative projects',
|
|
'Build a portfolio of game projects',
|
|
'Join a development team',
|
|
'Start freelancing in game development',
|
|
'Improve programming skills',
|
|
'Learn game design principles'
|
|
],
|
|
'client': [
|
|
'Develop a custom game or application',
|
|
'Get technical consulting for my project',
|
|
'Find reliable development partners',
|
|
'Scale my existing game/platform',
|
|
'Implement new features or technologies',
|
|
'Optimize performance and user experience',
|
|
'Launch a new digital product',
|
|
'Build a development team'
|
|
],
|
|
'member': [
|
|
'Stay updated on industry trends',
|
|
'Network with tech professionals',
|
|
'Access research and insights',
|
|
'Participate in innovation projects',
|
|
'Share knowledge with the community',
|
|
'Explore new technologies',
|
|
'Contribute to open source projects',
|
|
'Attend workshops and events'
|
|
],
|
|
'customer': [
|
|
'Play cutting-edge games',
|
|
'Access premium development tools',
|
|
'Get early access to new releases',
|
|
'Join beta testing programs',
|
|
'Connect with other gamers',
|
|
'Learn about game development',
|
|
'Provide feedback on products',
|
|
'Explore interactive experiences'
|
|
]
|
|
};
|
|
|
|
const serviceOptions = {
|
|
'game-developer': [
|
|
'Mentorship Programs',
|
|
'Development Tools Access',
|
|
'Collaborative Projects',
|
|
'Technical Workshops',
|
|
'Code Review Services',
|
|
'Career Guidance',
|
|
'Networking Events',
|
|
'Skill Assessments'
|
|
],
|
|
'client': [
|
|
'Custom Game Development',
|
|
'Technical Consulting',
|
|
'Project Management',
|
|
'Quality Assurance',
|
|
'Performance Optimization',
|
|
'Team Augmentation',
|
|
'Technology Integration',
|
|
'Ongoing Support'
|
|
],
|
|
'member': [
|
|
'Research Access',
|
|
'Community Forums',
|
|
'Expert Insights',
|
|
'Innovation Labs',
|
|
'Knowledge Base',
|
|
'Networking Platform',
|
|
'Event Participation',
|
|
'Content Library'
|
|
],
|
|
'customer': [
|
|
'Premium Games',
|
|
'Development Tools',
|
|
'Beta Access',
|
|
'Community Features',
|
|
'Customer Support',
|
|
'Regular Updates',
|
|
'Educational Content',
|
|
'User Forums'
|
|
]
|
|
};
|
|
|
|
export default function Interests({ data, updateData, nextStep, prevStep }: InterestsProps) {
|
|
const goals = data.userType ? goalOptions[data.userType] || [] : [];
|
|
const services = data.userType ? serviceOptions[data.userType] || [] : [];
|
|
|
|
const handleGoalToggle = (goal: string) => {
|
|
const currentGoals = data.interests.primaryGoals;
|
|
const updatedGoals = currentGoals.includes(goal)
|
|
? currentGoals.filter(g => g !== goal)
|
|
: [...currentGoals, goal];
|
|
|
|
updateData({
|
|
interests: {
|
|
...data.interests,
|
|
primaryGoals: updatedGoals
|
|
}
|
|
});
|
|
};
|
|
|
|
const handleServiceToggle = (service: string) => {
|
|
const currentServices = data.interests.preferredServices;
|
|
const updatedServices = currentServices.includes(service)
|
|
? currentServices.filter(s => s !== service)
|
|
: [...currentServices, service];
|
|
|
|
updateData({
|
|
interests: {
|
|
...data.interests,
|
|
preferredServices: updatedServices
|
|
}
|
|
});
|
|
};
|
|
|
|
const isValid = data.interests.primaryGoals.length > 0 && data.interests.preferredServices.length > 0;
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<div className="text-center space-y-2">
|
|
<p className="text-muted-foreground">
|
|
Tell us about your goals and interests so we can personalize your experience
|
|
</p>
|
|
</div>
|
|
|
|
<div className="max-w-2xl mx-auto space-y-6">
|
|
{/* Primary Goals */}
|
|
<div className="space-y-3">
|
|
<Label className="text-sm font-medium">Primary Goals *</Label>
|
|
<p className="text-xs text-muted-foreground">Select all that apply</p>
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
|
{goals.map((goal) => {
|
|
const isSelected = data.interests.primaryGoals.includes(goal);
|
|
return (
|
|
<button
|
|
key={goal}
|
|
onClick={() => handleGoalToggle(goal)}
|
|
className={`p-3 rounded-lg border-2 text-left text-sm transition-all duration-200 ${
|
|
isSelected
|
|
? 'border-aethex-500 bg-aethex-500/10 text-aethex-300'
|
|
: 'border-border/50 hover:border-aethex-400/50 bg-background/50 hover:bg-aethex-500/5'
|
|
}`}
|
|
>
|
|
{goal}
|
|
</button>
|
|
);
|
|
})}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Preferred Services */}
|
|
<div className="space-y-3">
|
|
<Label className="text-sm font-medium">Services of Interest *</Label>
|
|
<p className="text-xs text-muted-foreground">Select all that interest you</p>
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
|
{services.map((service) => {
|
|
const isSelected = data.interests.preferredServices.includes(service);
|
|
return (
|
|
<button
|
|
key={service}
|
|
onClick={() => handleServiceToggle(service)}
|
|
className={`p-3 rounded-lg border-2 text-left text-sm transition-all duration-200 ${
|
|
isSelected
|
|
? 'border-neon-blue bg-neon-blue/10 text-neon-blue'
|
|
: 'border-border/50 hover:border-neon-blue/50 bg-background/50 hover:bg-neon-blue/5'
|
|
}`}
|
|
>
|
|
{service}
|
|
</button>
|
|
);
|
|
})}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="flex justify-between pt-6">
|
|
<Button
|
|
variant="outline"
|
|
onClick={prevStep}
|
|
className="flex items-center space-x-2"
|
|
>
|
|
<ArrowLeft className="h-4 w-4" />
|
|
<span>Back</span>
|
|
</Button>
|
|
|
|
<Button
|
|
onClick={nextStep}
|
|
disabled={!isValid}
|
|
className="flex items-center space-x-2 bg-gradient-to-r from-aethex-500 to-neon-blue hover:from-aethex-600 hover:to-neon-blue/90"
|
|
>
|
|
<span>Complete Setup</span>
|
|
<ArrowRight className="h-4 w-4" />
|
|
</Button>
|
|
</div>
|
|
|
|
<div className="text-center">
|
|
<p className="text-xs text-muted-foreground">
|
|
You can always update your preferences later in your account settings
|
|
</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|