import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; 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'; interface SocialLink { host: string; profile_link: string; } type SocialLinksMap = { website: string; facebook: string; twitter: string; linkedin: string; }; const MyProfile = () => { const { auth, errors, translate } = usePage().props; const { button, input, common } = translate; const user = auth.user; const [userPhoto, setUserPhoto] = useState(user.photo); const [socialLinks, setSocialLinks] = useState({ website: '', facebook: '', 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: '', facebook: '', twitter: '', linkedin: '', }; links.forEach((link) => { if (link.host in linkMap) { linkMap[link.host as keyof SocialLinksMap] = link.profile_link; } }); setSocialLinks(linkMap); } catch (error) { // Failed to parse social links } }, []); useEffect(() => { parseSocialLinks(user.social_links); }, [user.social_links]); const formatSocialLinks = useCallback((links: SocialLinksMap): string => { const formattedLinks = Object.entries(links) .filter(([_, value]) => value) .map(([host, profile_link]) => ({ host, profile_link })); return JSON.stringify(formattedLinks); }, []); const updateSocialLink = useCallback((platform: keyof SocialLinksMap, value: string) => { setSocialLinks((prev) => ({ ...prev, [platform]: value, })); }, []); const { data, post, setData, processing } = useForm({ name: user.name || '', photo: null as File | null, social_links: null as string | null, }); useEffect(() => { setData('social_links', formatSocialLinks(socialLinks)); }, [socialLinks, formatSocialLinks, setData]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); post(route('student.profile.update')); }; const onImageChange = (name: string, value: unknown) => { setData(name as any, value as any); setUserPhoto(URL.createObjectURL(value as File)); }; return (
{`${auth.user.name}'s onHandleChange(e, onImageChange)} />
{errors.photo &&

{errors.photo}

}
onHandleChange(e, setData)} placeholder={input.full_name_placeholder} />
updateSocialLink('website', e.target.value)} placeholder={input.https_placeholder} />
updateSocialLink('facebook', e.target.value)} placeholder={input.https_placeholder} />
updateSocialLink('twitter', e.target.value)} placeholder={input.https_placeholder} />
updateSocialLink('linkedin', e.target.value)} placeholder={input.https_placeholder} />
{button.update}
); }; export default MyProfile;