From b5738c610d2a4b205165a6608d2167d2ca2d970e Mon Sep 17 00:00:00 2001 From: lnn0q Date: Sun, 1 Jun 2025 19:37:13 +0300 Subject: [PATCH] added book details, update, delete. fixes --- app/client/components/BookOverviewTabs.tsx | 11 +- app/client/main.tsx | 6 +- app/client/pages/profile/$username.tsx | 5 +- .../work/book/$bookId/overview/contents.tsx | 8 +- .../work/book/$bookId/overview/details.tsx | 151 ++++++++++++++++++ .../work/book/$bookId/overview/reviews.tsx | 27 +++- app/client/routeTree.gen.ts | 28 ++++ app/server/graphql/graphql.ts | 4 + .../graphql/resolvers/bookDeleteResolver.ts | 22 +++ .../graphql/resolvers/bookUpdateResolver.ts | 34 ++++ app/server/graphql/schema.graphql | 4 +- app/server/prisma/schema.prisma | 6 +- 12 files changed, 290 insertions(+), 16 deletions(-) create mode 100644 app/client/pages/work/book/$bookId/overview/details.tsx create mode 100644 app/server/graphql/resolvers/bookDeleteResolver.ts create mode 100644 app/server/graphql/resolvers/bookUpdateResolver.ts diff --git a/app/client/components/BookOverviewTabs.tsx b/app/client/components/BookOverviewTabs.tsx index 738f5f4..f8551e1 100644 --- a/app/client/components/BookOverviewTabs.tsx +++ b/app/client/components/BookOverviewTabs.tsx @@ -3,10 +3,12 @@ import { Link } from '@tanstack/react-router'; export function BookOverviewTabs({ bookId, - currentTab + currentTab, + isAuthor }: { readonly bookId: string; - readonly currentTab: 'contents' | 'reviews'; + readonly currentTab: 'contents' | 'reviews' | 'details'; + readonly isAuthor: boolean; }) { return ( @@ -17,6 +19,11 @@ export function BookOverviewTabs({ Reviews + {isAuthor && ( + + Details + + )} ); diff --git a/app/client/main.tsx b/app/client/main.tsx index ebce8f8..3c16175 100644 --- a/app/client/main.tsx +++ b/app/client/main.tsx @@ -1,7 +1,7 @@ import { ApolloClient, ApolloProvider, HttpLink, InMemoryCache, from } from '@apollo/client'; import { loadDevMessages, loadErrorMessages } from '@apollo/client/dev'; import { onError } from '@apollo/client/link/error'; -import { Box, Center, Spinner } from '@chakra-ui/react'; +import { Box, Center, Spinner, Stack } from '@chakra-ui/react'; import '@client/assets/styles/index.css'; import '@client/assets/styles/nerd-fonts-icons.css'; import { Provider as ChakraProvider } from '@client/components/ui/provider'; @@ -118,7 +118,9 @@ function App() { - + + + diff --git a/app/client/pages/profile/$username.tsx b/app/client/pages/profile/$username.tsx index f53d5af..ef20109 100644 --- a/app/client/pages/profile/$username.tsx +++ b/app/client/pages/profile/$username.tsx @@ -1,4 +1,5 @@ -import { createFileRoute } from '@tanstack/react-router'; +import {Stack} from '@chakra-ui/react'; +import {createFileRoute} from '@tanstack/react-router'; export const Route = createFileRoute('/profile/$username')({ component: RouteComponent @@ -6,5 +7,5 @@ export const Route = createFileRoute('/profile/$username')({ function RouteComponent() { const { username } = Route.useParams(); - return
{`Hello, "${username}"!`}
; + return {`Hello, "${username}"!`}; } diff --git a/app/client/pages/work/book/$bookId/overview/contents.tsx b/app/client/pages/work/book/$bookId/overview/contents.tsx index fdb37ac..408f1a5 100644 --- a/app/client/pages/work/book/$bookId/overview/contents.tsx +++ b/app/client/pages/work/book/$bookId/overview/contents.tsx @@ -32,10 +32,14 @@ function RouteComponent() { return ( <> - - {data != null ? ( <> + + (bookQuery, { + variables: { id } + }); + + const { update: bookUpdate } = useToastMutation({ + mutation: bookUpdateMutation, + successMsg: 'Book updated successfully' + }); + + const { update: bookDelete } = useToastMutation({ + mutation: bookDeleteMutation, + successMsg: 'Book deleted successfully', + refetchQueries: [bookListQuery] + }); + + const [title, setTitle] = useState(data?.bookOne.title); + const [description, setDescription] = useState(data?.bookOne.description); + + const [progress, setProgress] = useState( + data?.bookOne.progressStatus + ); + + if (data == null) return ; + + return ( + <> + + + + setTitle(event.currentTarget.value)} + placeholder="title" + maxLength={60} + /> + + + { + const updatedStatus = event.currentTarget.value; + ensureProgressStatus(updatedStatus); + setProgress(updatedStatus); + }} + > + + + + + + +