/
viktorphp
/
front-socket
Обзор
Документация
Войти
/
viktorphp
/
front-socket
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/features/profile/updateProfile/model/actions.ts
113 строк
4 KB
Viktorphp84
feature-socket: Поправить верстку на странице профиля, исправить сохранение дат.
12 окт 2025, 01:53
12 окт 2025, 01:53
93fb0bf
Код
Авторство
О чём код?
'use server'; import { revalidatePath } from 'next/cache'; import { cookies } from 'next/headers'; import { userService } from '@entities/user'; import { convertToISO8601UTC } from '@shared/lib'; import { EProfileFormFields, IUser } from '@shared/types'; const isString = (value: unknown): value is string => { return typeof value === 'string'; }; const isFile = (value: unknown): value is File => { return value instanceof File; }; export const updateProfile = async ( _prevState: { status: string | null; message: string | null; userData: IUser | null; }, formData: FormData ): Promise<{ status: string; message: string; userData: IUser | null }> => { try { const userData = new FormData(); const username = formData.get(EProfileFormFields.USER_NAME); if (username && isString(username)) { userData.append(EProfileFormFields.USER_NAME, username); } const firstName = formData.get(EProfileFormFields.FIRST_NAME); if (firstName && isString(firstName)) { userData.append(EProfileFormFields.FIRST_NAME, firstName); } const lastName = formData.get(EProfileFormFields.LAST_NAME); if (lastName && isString(lastName)) { userData.append(EProfileFormFields.LAST_NAME, lastName); } const email = formData.get(EProfileFormFields.EMAIL); if (email && isString(email)) { userData.append(EProfileFormFields.EMAIL, email); } const patronymic = formData.get(EProfileFormFields.PATRONYMIC); if (patronymic && isString(patronymic)) { userData.append(EProfileFormFields.PATRONYMIC, patronymic); } const phoneNumber = formData.get(EProfileFormFields.PHONE_NUMBER); if (phoneNumber && isString(phoneNumber)) { userData.append(EProfileFormFields.PHONE_NUMBER, phoneNumber); } const birthDate = formData.get(EProfileFormFields.BIRTH_DATE); if (birthDate && isString(birthDate)) { const isoUtcDate = convertToISO8601UTC(birthDate); if (isoUtcDate) { userData.append(EProfileFormFields.BIRTH_DATE, isoUtcDate); } } const icon = formData.get(EProfileFormFields.ICON); if (icon && isFile(icon)) { userData.append(EProfileFormFields.ICON, icon); } const avatarField = formData.get(EProfileFormFields.AVATAR); if (avatarField && isFile(avatarField)) { userData.append(EProfileFormFields.AVATAR, avatarField); } const cookieStore = (await cookies()).getAll(); const cookieHeader = cookieStore .map((cookie) => `${cookie.name}=${encodeURIComponent(cookie.value)}`) .join('; '); const response = await userService.updateUser(userData, { headers: { Cookie: cookieHeader, }, }); // Убираем поле avatar из ответа const { avatar, ...rest } = response.data; const nextCookieStore = await cookies(); nextCookieStore.set('auth_user', JSON.stringify(rest)); // Добавляем ревалидацию всех путей, где могут использоваться данные пользователя revalidatePath('/'); // Ревалидация корневого пути revalidatePath('/profile', 'layout'); // Ревалидация layout профиля revalidatePath('/profile'); // Ревалидация страницы профиля return { status: 'success', message: 'Профиль успешно обновлен', userData: rest, }; } catch (error) { console.log(error); return { status: 'error', message: 'Ошибка обновления профиля', userData: null, }; } };