import { type FormEvent, useEffect, useState } from 'react'; import { httpGet, httpPatch } from '../../lib/http'; import { pageProgressMessage } from '../../stores/page'; import type { AllowedCustomRoadmapVisibility, AllowedProfileVisibility, AllowedRoadmapVisibility, UserDocument, } from '../../api/user'; import { SelectionButton } from '../RoadCard/SelectionButton'; import { ArrowUpRight, Check, CheckCircle, Copy, Eye, EyeOff, FileBadge, Trophy, } from 'lucide-react'; import { useToast } from '../../hooks/use-toast'; import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx'; import { VisibilityDropdown } from './VisibilityDropdown.tsx'; import { ProfileUsername } from './ProfileUsername.tsx'; import UploadProfilePicture from './UploadProfilePicture.tsx'; import { SkillProfileAlert } from './SkillProfileAlert.tsx'; import { useCopyText } from '../../hooks/use-copy-text.ts'; import { cn } from '../../lib/classname.ts'; type RoadmapType = { id: string; title: string; isCustomResource: boolean; }; type GetProfileSettingsResponse = Pick< UserDocument, 'username' | 'profileVisibility' | 'publicConfig' | 'links' >; export function UpdatePublicProfileForm() { const [profileVisibility, setProfileVisibility] = useState('public'); const toast = useToast(); const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false); const [publicProfileUrl, setPublicProfileUrl] = useState(''); const [isAvailableForHire, setIsAvailableForHire] = useState(false); const [isEmailVisible, setIsEmailVisible] = useState(true); const [headline, setHeadline] = useState(''); const [username, setUsername] = useState(''); const [email, setEmail] = useState(''); const [roadmapVisibility, setRoadmapVisibility] = useState('all'); const [customRoadmapVisibility, setCustomRoadmapVisibility] = useState('all'); const [roadmaps, setRoadmaps] = useState([]); const [customRoadmaps, setCustomRoadmaps] = useState([]); const [currentUsername, setCurrentUsername] = useState(''); const [name, setName] = useState(''); const [avatar, setAvatar] = useState(''); const [github, setGithub] = useState(''); const [twitter, setTwitter] = useState(''); const [linkedin, setLinkedin] = useState(''); const [dailydev, setDailydev] = useState(''); const [website, setWebsite] = useState(''); const [profileRoadmaps, setProfileRoadmaps] = useState([]); const [isLoading, setIsLoading] = useState(false); const { isCopied, copyText } = useCopyText(); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); const { response, error } = await httpPatch( `${import.meta.env.PUBLIC_API_URL}/v1-update-public-profile-config`, { isAvailableForHire, isEmailVisible, profileVisibility, headline, username, roadmapVisibility, customRoadmapVisibility, roadmaps, customRoadmaps, github, twitter, linkedin, website, name, email, dailydev, }, ); if (error || !response) { setIsLoading(false); toast.error(error?.message || 'Something went wrong'); return; } await loadProfileSettings(); toast.success('Profile updated successfully'); }; const loadProfileSettings = async () => { setIsLoading(true); const { error, response } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-profile-settings`, ); if (error || !response) { setIsLoading(false); toast.error(error?.message || 'Something went wrong'); return; } const { name, email, links, username, profileVisibility: defaultProfileVisibility, publicConfig, avatar, } = response; setAvatar(avatar || ''); setPublicProfileUrl(username ? `/u/${username}` : ''); setUsername(username || ''); setCurrentUsername(username || ''); setName(name || ''); setEmail(email || ''); setGithub(links?.github || ''); setTwitter(links?.twitter || ''); setLinkedin(links?.linkedin || ''); setDailydev(links?.dailydev || ''); setWebsite(links?.website || ''); setProfileVisibility(defaultProfileVisibility || 'public'); setHeadline(publicConfig?.headline || ''); setRoadmapVisibility(publicConfig?.roadmapVisibility || 'all'); setCustomRoadmapVisibility(publicConfig?.customRoadmapVisibility || 'all'); setCustomRoadmaps(publicConfig?.customRoadmaps || []); setRoadmaps(publicConfig?.roadmaps || []); setIsAvailableForHire(publicConfig?.isAvailableForHire || false); setIsEmailVisible(publicConfig?.isEmailVisible ?? true); setIsLoading(false); }; const loadProfileRoadmaps = async () => { setIsLoading(true); const { error, response } = await httpGet<{ roadmaps: RoadmapType[]; }>(`${import.meta.env.PUBLIC_API_URL}/v1-get-profile-roadmaps`); if (error || !response) { setIsLoading(false); toast.error(error?.message || 'Something went wrong'); return; } setProfileRoadmaps(response?.roadmaps || []); setIsLoading(false); }; // Make a request to the backend to fill in the form with the current values useEffect(() => { Promise.all([loadProfileSettings(), loadProfileRoadmaps()]).finally(() => { pageProgressMessage.set(''); }); }, []); const publicCustomRoadmaps = profileRoadmaps.filter( (r) => r.isCustomResource, ); const publicRoadmaps = profileRoadmaps.filter((r) => !r.isCustomResource); return (
{isCreatingRoadmap && ( setIsCreatingRoadmap(false)} /> )}

Skill Profile

{publicProfileUrl && ( <> Visit )}

Create your skill profile to showcase your skills.

setName((e.target as HTMLInputElement).value)} />
setIsEmailVisible(e.target.checked)} />
setHeadline((e.target as HTMLInputElement).value)} required={profileVisibility === 'public'} />

Which roadmap progresses do you want to show on your profile?

{ setRoadmapVisibility('all'); setRoadmaps([]); }} /> { setRoadmapVisibility('none'); setRoadmaps([]); }} />

Or select the roadmaps you want to show

{publicRoadmaps.length > 0 ? (
{publicRoadmaps.map((r) => ( { if (roadmapVisibility !== 'selected') { setRoadmapVisibility('selected'); } if (roadmaps.includes(r.id)) { setRoadmaps(roadmaps.filter((id) => id !== r.id)); } else { setRoadmaps([...roadmaps, r.id]); } }} /> ))}
) : (

Update{' '} your progress on roadmaps {' '} to show your learning activity.

)}

Pick your custom roadmaps to show on your profile

{ setCustomRoadmapVisibility('all'); setCustomRoadmaps([]); }} /> { setCustomRoadmapVisibility('none'); setCustomRoadmaps([]); }} />

Or select the custom roadmaps you want to show

{publicCustomRoadmaps.length > 0 ? (
{publicCustomRoadmaps.map((r) => ( { if (customRoadmapVisibility !== 'selected') { setCustomRoadmapVisibility('selected'); } if (customRoadmaps.includes(r.id)) { setCustomRoadmaps( customRoadmaps.filter((id) => id !== r.id), ); } else { setCustomRoadmaps([...customRoadmaps, r.id]); } }} /> ))}
) : (

You do not have any custom roadmaps.{' '} .

)}
setGithub((e.target as HTMLInputElement).value)} />
setTwitter((e.target as HTMLInputElement).value)} />
setLinkedin((e.target as HTMLInputElement).value)} />
setDailydev((e.target as HTMLInputElement).value)} />
setWebsite((e.target as HTMLInputElement).value)} />
setIsAvailableForHire(e.target.checked)} />
); }