diff --git a/app/client/components/BookChapterCard.tsx b/app/client/components/BookChapterCard.tsx index 0716ec2..8bcb8f2 100644 --- a/app/client/components/BookChapterCard.tsx +++ b/app/client/components/BookChapterCard.tsx @@ -4,7 +4,8 @@ import { BookChapterDeleteMutation } from '@generated/types'; import { Link } from '@tanstack/react-router'; import { bookFragment } from '../fragments'; import { useToastMutation } from '../hooks/useToastMutation'; -import { bookChapterListQuery } from '../pages/work/book/$bookId/overview'; +import { bookChapterQuery } from '../pages/work/book/$bookId/chapter/$chapterId/view'; +import { bookChapterListQuery } from '../pages/work/book/$bookId/overview/contents'; export function BookChapterCard({ bookId, @@ -20,7 +21,7 @@ export function BookChapterCard({ const { update: chapterDelete } = useToastMutation({ mutation, successMsg: 'Chapter deleted successfully', - refetchQueries: [bookChapterListQuery] + refetchQueries: [bookChapterListQuery, bookChapterQuery] }); return ( diff --git a/app/client/components/BookChapterForm.tsx b/app/client/components/BookChapterForm.tsx index 66f242e..e8890e8 100644 --- a/app/client/components/BookChapterForm.tsx +++ b/app/client/components/BookChapterForm.tsx @@ -82,7 +82,7 @@ export function BookChapterForm({ - + diff --git a/app/client/components/BookOverviewTabs.tsx b/app/client/components/BookOverviewTabs.tsx new file mode 100644 index 0000000..738f5f4 --- /dev/null +++ b/app/client/components/BookOverviewTabs.tsx @@ -0,0 +1,23 @@ +import { Tabs } from '@chakra-ui/react'; +import { Link } from '@tanstack/react-router'; + +export function BookOverviewTabs({ + bookId, + currentTab +}: { + readonly bookId: string; + readonly currentTab: 'contents' | 'reviews'; +}) { + return ( + + + + Contents + + + Reviews + + + + ); +} diff --git a/app/client/components/RatingPanel.tsx b/app/client/components/RatingPanel.tsx new file mode 100644 index 0000000..cbc9e9e --- /dev/null +++ b/app/client/components/RatingPanel.tsx @@ -0,0 +1,48 @@ +import { Button } from '@app/client/components/ui/button'; +import { Icon, Stack } from '@chakra-ui/react'; +import { RatingType } from '@generated/types'; + +export function RatingPanel({ + personalRating, + onRatingSet +}: { + readonly personalRating: RatingType; + readonly onRatingSet: (rating: RatingType) => Promise; +}) { + return ( + + + + + ); +} diff --git a/app/client/components/ReviewCard.tsx b/app/client/components/ReviewCard.tsx new file mode 100644 index 0000000..396394a --- /dev/null +++ b/app/client/components/ReviewCard.tsx @@ -0,0 +1,54 @@ +import { Avatar } from '@app/client/components/ui/avatar'; +import { toFormattedDate } from '@app/client/helpers'; +import { Box, Card, Stack, Text } from '@chakra-ui/react'; +import { Link } from '@tanstack/react-router'; + +export function ReviewCard({ + review +}: { + readonly review: { + readonly id: string; + readonly username: string; + readonly createdAt: string; + readonly text: string; + }; +}) { + return ( + + + + + + + + + + {review.username} + + + + {toFormattedDate({ value: review.createdAt })} + + + {review.text} + {/* */} + + + + + ); +} diff --git a/app/client/components/ReviewInput.tsx b/app/client/components/ReviewInput.tsx new file mode 100644 index 0000000..65ac550 --- /dev/null +++ b/app/client/components/ReviewInput.tsx @@ -0,0 +1,47 @@ +import { Avatar } from '@app/client/components/ui/avatar'; +import { Button, Icon, Stack, Textarea } from '@chakra-ui/react'; +import { useState } from 'react'; + +export function ReviewInput({ + username, + onReviewSubmit +}: { + readonly username: string; + readonly onReviewSubmit: (text: string) => Promise; +}) { + const [text, setText] = useState(''); + return ( + + + +