import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import TagInput from '@/components/tag-input'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { onHandleChange } from '@/lib/inertia'; import { SharedData } from '@/types/global'; import { useForm, usePage } from '@inertiajs/react'; import { Camera } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; import { toast } from 'sonner'; interface SocialLink { host: string; profile_link: string; } type SocialLinksMap = { website: string; github: string; twitter: string; linkedin: string; }; const UpdateProfile = ({ instructor }: { instructor: Instructor }) => { const { auth, system, errors } = usePage().props; const user = auth.user; const [userPhoto, setUserPhoto] = useState(user.photo); const [socialLinks, setSocialLinks] = useState({ website: '', github: '', twitter: '', linkedin: '', }); const parseSocialLinks = useCallback((socialLinksData: unknown) => { try { if (!socialLinksData) return; const links: SocialLink[] = typeof socialLinksData === 'string' ? JSON.parse(socialLinksData) : (socialLinksData as SocialLink[]); const linkMap: SocialLinksMap = { website: '', github: '', twitter: '', linkedin: '', }; links.forEach((link) => { if (link.host in linkMap) { linkMap[link.host as keyof SocialLinksMap] = link.profile_link; } }); setSocialLinks(linkMap); } catch (error) { toast.error('Failed to parse social links'); } }, []); useEffect(() => { parseSocialLinks(user.social_links); }, [user.social_links]); const formatSocialLinks = useCallback((links: SocialLinksMap): any[] => { const formattedLinks = Object.entries(links) .filter(([_, value]) => value) .map(([host, profile_link]) => ({ host, profile_link })); return formattedLinks; }, []); const updateSocialLink = useCallback((platform: keyof SocialLinksMap, value: string) => { setSocialLinks((prev) => ({ ...prev, [platform]: value, })); }, []); // Parse the options and answers if they're strings const initialOptions = instructor?.skills ? (typeof instructor.skills === 'string' ? JSON.parse(instructor.skills) : instructor.skills) : []; const { data, post, setData, processing } = useForm({ name: user.name || '', photo: null as File | null, social_links: [] as any[], user_id: user.id, skills: initialOptions, designation: instructor?.designation || '', biography: instructor?.biography || '', resume: null, }); useEffect(() => { setData('social_links', formatSocialLinks(socialLinks)); }, [socialLinks, formatSocialLinks, setData]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); post(route('account.profile')); }; const onImageChange = (name: string, value: unknown) => { setData(name as any, value as any); setUserPhoto(URL.createObjectURL(value as File)); }; return (
{userPhoto ? ( item-1 ) : (
)} onHandleChange(e, onImageChange)} />
Allowed: JPG, JPEG, PNG, SVG File, Maximum 2MB {errors.photo &&

{errors.photo}

}
updateSocialLink('website', e.target.value)} className="mt-1" placeholder="https://example.com" />
updateSocialLink('github', e.target.value)} className="mt-1" placeholder="https://github.com/my-profile" />
updateSocialLink('twitter', e.target.value)} className="mt-1" placeholder="https://twitter.com/my-profile" />
updateSocialLink('linkedin', e.target.value)} className="mt-1" placeholder="https://linkedin.com/my-profile" />
onHandleChange(e, setData)} className="mt-1" placeholder="John Doe" />
{((user.role === 'admin' && user.instructor_id) || user.role === 'instructor') && ( <>
onHandleChange(e, setData)} placeholder="Software Engineer" />
{user.role === 'instructor' && (
onHandleChange(e, setData)} />
)}
setData('skills', values)} />