From c8f68b74863e1e333b88cb24a14f3ef9b3e5f436 Mon Sep 17 00:00:00 2001 From: lnn0q Date: Tue, 17 Jun 2025 21:46:40 +0300 Subject: [PATCH] added profile description editing, fixed light theme and viewer caching --- app/client/components/BookChapterCard.tsx | 2 +- app/client/components/EditorSlate.tsx | 2 +- app/client/components/WorkingListCard.tsx | 2 +- app/client/components/ui/provider.tsx | 14 +- app/client/pages/profile/$username.tsx | 130 ++++++++++++++++-- .../book/$bookId/chapter/$chapterId/view.tsx | 2 +- app/server/graphql/graphql.ts | 8 +- .../graphql/resolvers/mappers/userMapper.ts | 3 +- .../graphql/resolvers/userUpdateResolver.ts | 36 +++++ app/server/graphql/schema.graphql | 6 + 10 files changed, 187 insertions(+), 18 deletions(-) create mode 100644 app/server/graphql/resolvers/userUpdateResolver.ts diff --git a/app/client/components/BookChapterCard.tsx b/app/client/components/BookChapterCard.tsx index 8bcb8f2..0d8d41e 100644 --- a/app/client/components/BookChapterCard.tsx +++ b/app/client/components/BookChapterCard.tsx @@ -24,7 +24,7 @@ export function BookChapterCard({ refetchQueries: [bookChapterListQuery, bookChapterQuery] }); return ( - + diff --git a/app/client/components/EditorSlate.tsx b/app/client/components/EditorSlate.tsx index 408ae1c..50650fb 100644 --- a/app/client/components/EditorSlate.tsx +++ b/app/client/components/EditorSlate.tsx @@ -1,6 +1,6 @@ import { Button, Card, Stack, Text, Wrap } from '@chakra-ui/react'; import isHotkey from 'is-hotkey'; -import React, { KeyboardEvent, MouseEvent, useCallback, useMemo } from 'react'; +import React, { KeyboardEvent, MouseEvent, useCallback, useEffect, useMemo } from 'react'; import { createEditor, Descendant, Editor, Element as SlateElement, Transforms } from 'slate'; import { withHistory } from 'slate-history'; import { diff --git a/app/client/components/WorkingListCard.tsx b/app/client/components/WorkingListCard.tsx index 1840db7..a56b4c7 100644 --- a/app/client/components/WorkingListCard.tsx +++ b/app/client/components/WorkingListCard.tsx @@ -19,7 +19,7 @@ export function WorkingListCard({ reviewsTotal }: BookOne) { return ( - + diff --git a/app/client/components/ui/provider.tsx b/app/client/components/ui/provider.tsx index ed76f8a..0f6098a 100644 --- a/app/client/components/ui/provider.tsx +++ b/app/client/components/ui/provider.tsx @@ -6,9 +6,21 @@ import { ColorModeProvider, type ColorModeProviderProps } from './color-mode'; export function Provider(props: ColorModeProviderProps) { const system = createSystem(defaultConfig, { theme: { - tokens: {} + tokens: { + colors: { + cyan: { + 400: { + value: { + base: '#0c5c72', + _dark: '#67e8f9' + } as any // todo: find a better way to overwrite it + } + } + } + } } }); + return ( diff --git a/app/client/pages/profile/$username.tsx b/app/client/pages/profile/$username.tsx index 7e97e6b..c3d9e87 100644 --- a/app/client/pages/profile/$username.tsx +++ b/app/client/pages/profile/$username.tsx @@ -1,8 +1,26 @@ +import { gql } from '@apollo/client'; import { Avatar } from '@app/client/components/ui/avatar'; +import { userFragment } from '@app/client/fragments'; import { toFormattedDate } from '@app/client/helpers'; +import { useIdentity } from '@app/client/hooks/identity'; +import { useToastMutation } from '@app/client/hooks/useToastMutation'; import { useUserOneQuery } from '@app/client/hooks/useUserOneQuery'; -import { Card, Heading, HStack, SkeletonCircle, SkeletonText, Stack, Text } from '@chakra-ui/react'; +import { + Box, + Button, + Card, + Heading, + HStack, + Icon, + SkeletonCircle, + SkeletonText, + Stack, + Text, + Textarea +} from '@chakra-ui/react'; +import { UserProfileUpdateMutation } from '@generated/types'; import { createFileRoute } from '@tanstack/react-router'; +import { useState } from 'react'; export const Route = createFileRoute('/profile/$username')({ component: RouteComponent @@ -36,6 +54,16 @@ function UserOverview({ readonly createdAt: string; }; }) { + const identity = useIdentity(); + + const { update: userUpdate } = useToastMutation({ + mutation: userUpdateMutation, + successMsg: 'Profile updated successfully!' + }); + + const [isEditMode, setIsEditMode] = useState(false); + const [description, setDescription] = useState(user.description ?? ''); + return ( @@ -45,17 +73,92 @@ function UserOverview({ {user.username} - - joined: - {toFormattedDate({ value: user.createdAt })} + + + joined: + {toFormattedDate({ value: user.createdAt })} + + {identity != null && isEditMode && ( + + + + + + + )} + + {!isEditMode && identity?.data.id === user.id && ( + + )} - - - {user.description ?? 'No user description =('} - - + {isEditMode ? ( + +