diff --git a/client/src/features/order-chat/ui/OrderChat.tsx b/client/src/features/order-chat/ui/OrderChat.tsx index 27d1c8a..65eac11 100644 --- a/client/src/features/order-chat/ui/OrderChat.tsx +++ b/client/src/features/order-chat/ui/OrderChat.tsx @@ -56,7 +56,6 @@ export function OrderChat({ messages, isPending, onSend }: Props) { @@ -64,7 +63,6 @@ export function OrderChat({ messages, isPending, onSend }: Props) { diff --git a/client/src/features/order-detail/ui/OrderDetailContent.tsx b/client/src/features/order-detail/ui/OrderDetailContent.tsx index 721c478..36f5b0c 100644 --- a/client/src/features/order-detail/ui/OrderDetailContent.tsx +++ b/client/src/features/order-detail/ui/OrderDetailContent.tsx @@ -175,7 +175,6 @@ export function OrderDetailContent({ detail, orderId }: { detail: AdminOrderDeta @@ -184,7 +183,6 @@ export function OrderDetailContent({ detail, orderId }: { detail: AdminOrderDeta diff --git a/client/src/features/product-review/ui/ProductReviewsList.tsx b/client/src/features/product-review/ui/ProductReviewsList.tsx index ed03e3d..a7f05e4 100644 --- a/client/src/features/product-review/ui/ProductReviewsList.tsx +++ b/client/src/features/product-review/ui/ProductReviewsList.tsx @@ -22,7 +22,6 @@ function ReviewItem({ rv }: { rv: PublicProductReviewItem }) { diff --git a/client/src/features/user/user-menu/ui/UserMenu.tsx b/client/src/features/user/user-menu/ui/UserMenu.tsx index ab661c3..44b7828 100644 --- a/client/src/features/user/user-menu/ui/UserMenu.tsx +++ b/client/src/features/user/user-menu/ui/UserMenu.tsx @@ -46,7 +46,6 @@ export function UserMenu({ user, isAdmin = false, onNavigate, onLogout }: Props) diff --git a/client/src/pages/admin-settings/ui/AdminSettingsPage.tsx b/client/src/pages/admin-settings/ui/AdminSettingsPage.tsx index 41adb80..b4da721 100644 --- a/client/src/pages/admin-settings/ui/AdminSettingsPage.tsx +++ b/client/src/pages/admin-settings/ui/AdminSettingsPage.tsx @@ -56,9 +56,7 @@ export function AdminSettingsPage() { mode: 'onChange', }) - const hasOAuthAvatar = Boolean(user?.avatar && user.avatarType !== 'generated') - const useOAuth = user?.avatarType === 'oauth' - const useGenerated = user?.avatarType === 'generated' + const hasAvatar = Boolean(user?.avatar) const [selectedStyle, setSelectedStyle] = useState(user?.avatarStyle || DEFAULT_STYLE_ID) const [previewSrc, setPreviewSrc] = useState(null) @@ -70,14 +68,12 @@ export function AdminSettingsPage() { mutationFn: (params: { displayName: string | null avatar?: string | null - avatarType?: string | null avatarStyle?: string | null }) => apiClient.patch('admin/profile', params), onSuccess: (_data, variables) => { const p: UpdateProfileParams = { displayName: variables.displayName ?? null } if (variables.avatar !== undefined) { p.avatar = variables.avatar - p.avatarType = variables.avatarType ?? null p.avatarStyle = variables.avatarStyle ?? null } updateProfileFx(p) @@ -144,7 +140,6 @@ export function AdminSettingsPage() { - {hasUnsavedPreview ? 'Предпросмотр' : useOAuth ? 'Сохранён' : useGenerated ? 'Сохранён' : 'Авто'} + {hasUnsavedPreview ? 'Предпросмотр' : hasAvatar ? 'Сохранён' : 'Авто'} {hasUnsavedPreview && ( @@ -161,7 +156,6 @@ export function AdminSettingsPage() { )} - - {hasOAuthAvatar && !hasUnsavedPreview && ( - - )} diff --git a/client/src/pages/admin-users/ui/AdminUsersPage.tsx b/client/src/pages/admin-users/ui/AdminUsersPage.tsx index 6e5d85b..cabc230 100644 --- a/client/src/pages/admin-users/ui/AdminUsersPage.tsx +++ b/client/src/pages/admin-users/ui/AdminUsersPage.tsx @@ -195,7 +195,6 @@ export function AdminUsersPage() { diff --git a/client/src/pages/me/ui/sections/MessagesPage.tsx b/client/src/pages/me/ui/sections/MessagesPage.tsx index 220753d..f225f78 100644 --- a/client/src/pages/me/ui/sections/MessagesPage.tsx +++ b/client/src/pages/me/ui/sections/MessagesPage.tsx @@ -181,7 +181,6 @@ export function MessagesPage() { @@ -189,7 +188,6 @@ export function MessagesPage() { diff --git a/client/src/pages/me/ui/sections/SettingsPage.tsx b/client/src/pages/me/ui/sections/SettingsPage.tsx index 2b0e403..54cb98e 100644 --- a/client/src/pages/me/ui/sections/SettingsPage.tsx +++ b/client/src/pages/me/ui/sections/SettingsPage.tsx @@ -56,9 +56,7 @@ export function SettingsPage() { const emailErrorMsg = getApiErrorMessage(errorEmailReq) ?? getApiErrorMessage(errorEmailVerify) const profileErrorMsg = getApiErrorMessage(errorProfile) - const hasOAuthAvatar = Boolean(user?.avatar && user.avatarType !== 'generated') - const useOAuth = user?.avatarType === 'oauth' - const useGenerated = user?.avatarType === 'generated' + const hasAvatar = Boolean(user?.avatar) const [selectedStyle, setSelectedStyle] = useState(user?.avatarStyle || DEFAULT_STYLE_ID) const [previewSrc, setPreviewSrc] = useState(null) @@ -128,7 +126,6 @@ export function SettingsPage() { - {hasUnsavedPreview ? 'Предпросмотр' : useOAuth ? 'Сохранён' : useGenerated ? 'Сохранён' : 'Авто'} + {hasUnsavedPreview ? 'Предпросмотр' : hasAvatar ? 'Сохранён' : 'Авто'} {hasUnsavedPreview && ( @@ -145,7 +142,6 @@ export function SettingsPage() { )} - - {hasOAuthAvatar && !hasUnsavedPreview && ( - - )} diff --git a/client/src/shared/model/auth.ts b/client/src/shared/model/auth.ts index 6761582..0e4e96d 100644 --- a/client/src/shared/model/auth.ts +++ b/client/src/shared/model/auth.ts @@ -11,11 +11,15 @@ export type AuthUser = { lastName?: string | null gender?: string | null avatar?: string | null - avatarType?: string | null avatarStyle?: string | null isAdmin?: boolean } +export type AuthMethod = { + type: 'password' | 'vk' | 'yandex' + active: boolean +} + export const tokenSet = createEvent() export const logout = createEvent() @@ -72,7 +76,6 @@ export const verifyEmailChangeFx = createEffect(async (params: { newEmail: strin export type UpdateProfileParams = { displayName: string | null avatar?: string | null - avatarType?: string | null avatarStyle?: string | null } @@ -81,6 +84,35 @@ export const updateProfileFx = createEffect(async (params: UpdateProfileParams) return data.user }) +// ----- Auth effects ----- + +export const loginFx = createEffect(async (params: { email: string; password: string }) => { + const { data } = await apiClient.post<{ token: string; user: AuthUser }>('auth/login', params) + tokenSet(data.token) + return data.user +}) + +export const registerFx = createEffect( + async (params: { email: string; password: string; displayName?: string }) => { + const { data } = await apiClient.post<{ token: string; user: AuthUser }>('auth/register', params) + tokenSet(data.token) + return data.user + }, +) + +export const fetchAuthMethodsFx = createEffect(async () => { + const { data } = await apiClient.get<{ methods: AuthMethod[] }>('me/auth-methods') + return data.methods +}) + +export const setPasswordFx = createEffect(async (password: string) => { + await apiClient.post('me/password', { password }) +}) + +export const unlinkOAuthFx = createEffect(async (provider: 'vk' | 'yandex') => { + await apiClient.delete(`me/oauth/${provider}`) +}) + // ----- Error stores ----- export const $requestEmailChangeCodeError = createErrorStore(requestEmailChangeCodeFx).$error diff --git a/client/src/shared/ui/UserAvatar.tsx b/client/src/shared/ui/UserAvatar.tsx index bc3eecf..7dd1fbe 100644 --- a/client/src/shared/ui/UserAvatar.tsx +++ b/client/src/shared/ui/UserAvatar.tsx @@ -7,20 +7,19 @@ import { DEFAULT_STYLE_ID, getStyleById } from '@/shared/lib/avatar-styles' type UserAvatarProps = { userId: string avatarUrl?: string | null - avatarType?: string | null avatarStyle?: string | null size?: number sx?: SxProps } -export function UserAvatar({ userId, avatarUrl, avatarType, avatarStyle, size = 40, sx }: UserAvatarProps) { +export function UserAvatar({ userId, avatarUrl, avatarStyle, size = 40, sx }: UserAvatarProps) { const generatedSrc = useMemo(() => { const styleDef = getStyleById(avatarStyle || DEFAULT_STYLE_ID) const avatar = createAvatar(styleDef.style, { seed: userId }) return avatar.toDataUri() }, [userId, avatarStyle]) - const src = avatarType && avatarUrl ? avatarUrl : generatedSrc + const src = avatarUrl || generatedSrc return ( diff --git a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx index 4e5cb76..2a2f622 100644 --- a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx +++ b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx @@ -104,7 +104,6 @@ export function ReviewsBlock() { diff --git a/server/prisma/prisma/dev.db b/server/prisma/prisma/dev.db index e8e8ce5..037559b 100644 Binary files a/server/prisma/prisma/dev.db and b/server/prisma/prisma/dev.db differ