Skip to content
Extraits de code Groupes Projets
+page.svelte 4,27 ko
Newer Older
  • Learn to ignore specific revisions
  • DavePk04's avatar
    DavePk04 a validé
    <script lang="ts">
    	import { t } from '$lib/services/i18n';
    
    	import { patchUserAPI } from '$lib/api/users';
    
    DavePk04's avatar
    DavePk04 a validé
    	import type { PageData } from './$types';
    
    	let { data }: { data: PageData } = $props();
    
    
    	const formatBirthdate = (dateStr: string | Date | undefined): string => {
    
    DavePk04's avatar
    DavePk04 a validé
    		if (!dateStr) return '';
    
    		const date = new Date(dateStr);
    
    		if (!isNaN(date.getTime())) return date.toISOString().split('T')[0];
    
    		if (typeof dateStr === 'string') {
    			const [day, month, year] = dateStr.split('/');
    
    			if (year?.length === 4) return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;
    
    DavePk04's avatar
    DavePk04 a validé
    		}
    		return '';
    	};
    
    	let email = data.user?.email || '';
    	let nickname = data.user?.nickname || '';
    
    	let birthdate = formatBirthdate(data.user?.birthdate ?? undefined);
    
    DavePk04's avatar
    DavePk04 a validé
    	let gender = data.user?.gender || '';
    	let bio = data.user?.bio || '';
    	let availabilities = data.user?.availabilities
    		? JSON.stringify(data.user.availabilities, null, 2)
    		: '';
    
    
    	async function updateProfile() {
    
    DavePk04's avatar
    DavePk04 a validé
    		try {
    
    			const parsedAvailabilities = availabilities ? JSON.parse(availabilities) : [];
    			const updateData = {
    				email,
    				nickname,
    				birthdate,
    				gender,
    				bio,
    				availabilities: parsedAvailabilities
    			};
    
    			let success = false;
    			if (data.user) {
    				success = await patchUserAPI(fetch, data.user.id, updateData);
    			} else {
    				throw new Error($t('header.tutor.userNotFound'));
    			}
    			if (success) {
    				alert($t('header.tutor.updatedSuccessfully'));
    			} else {
    				alert($t('header.tutor.updateError'));
    			}
    
    DavePk04's avatar
    DavePk04 a validé
    		} catch (error) {
    
    			console.error('Update failed:', error);
    			alert(error instanceof Error ? error.message : $t('errors.updateFailed'));
    
    DavePk04's avatar
    DavePk04 a validé
    		}
    	}
    </script>
    
    
    <h1 class="text-3xl font-bold text-center mb-8 text-primary">
    	{$t('header.tutor.profile')}
    </h1>
    
    <div class="card bg-base-100 shadow-xl max-w-2xl mx-auto p-8">
    	<form on:submit|preventDefault={updateProfile} class="space-y-4">
    		<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
    			<div class="form-control">
    				<label class="label" for="email">
    					<span class="label-text">{$t('home.email')}</span>
    				</label>
    				<input
    					type="email"
    					id="email"
    					bind:value={email}
    					class="input input-bordered focus:input-primary"
    					required
    				/>
    			</div>
    
    			<div class="form-control">
    				<label class="label" for="nickname">
    					<span class="label-text">{$t('home.nickname')}</span>
    				</label>
    				<input
    					type="text"
    					id="nickname"
    					bind:value={nickname}
    					class="input input-bordered focus:input-primary"
    					required
    				/>
    			</div>
    
    			<div class="form-control">
    				<label class="label" for="birthdate">
    					<span class="label-text">{$t('home.birthdate')}</span>
    				</label>
    				<input
    					type="date"
    					id="birthdate"
    					bind:value={birthdate}
    					class="input input-bordered focus:input-primary"
    					required
    				/>
    			</div>
    
    			<div class="form-control">
    				<label class="label" for="gender">
    					<span class="label-text">{$t('users.gender')}</span>
    				</label>
    				<select
    					id="gender"
    					bind:value={gender}
    					class="select select-bordered focus:select-primary"
    					required
    				>
    					<option value="" disabled>{$t('header.tutor.selectGender')}</option>
    					<option value="male">{$t('users.genders.male')}</option>
    					<option value="female">{$t('users.genders.female')}</option>
    					<option value="other">{$t('users.genders.other')}</option>
    				</select>
    			</div>
    
    DavePk04's avatar
    DavePk04 a validé
    		</div>
    
    
    		<div class="form-control">
    			<label class="label" for="bio">
    				<span class="label-text">{$t('register.bio')}</span>
    			</label>
    
    DavePk04's avatar
    DavePk04 a validé
    			<textarea
    				id="bio"
    				rows="4"
    				bind:value={bio}
    				placeholder={$t('header.tutor.bio')}
    
    				class="textarea textarea-bordered focus:textarea-primary h-24"
    
    DavePk04's avatar
    DavePk04 a validé
    				required
    			></textarea>
    		</div>
    
    
    		<div class="form-control">
    			<label class="label" for="availabilities">
    				<span class="label-text">
    					{$t('register.availabilities')}
    					<span class="text-xs text-info ml-2">(JSON format)</span>
    				</span>
    			</label>
    
    DavePk04's avatar
    DavePk04 a validé
    			<textarea
    				id="availabilities"
    				rows="4"
    				bind:value={availabilities}
    				placeholder={$t('header.tutor.availabilities')}
    
    				class="textarea textarea-bordered focus:textarea-primary font-mono h-32"
    
    DavePk04's avatar
    DavePk04 a validé
    				required
    			></textarea>
    		</div>
    
    
    		<button type="submit" class="btn btn-primary w-full mt-6 text-lg">
    
    DavePk04's avatar
    DavePk04 a validé
    			{$t('header.tutor.update')}
    		</button>
    	</form>
    </div>