parent
701ccce5ae
commit
e7bcd18cc5
@ -1,35 +0,0 @@
|
|||||||
import { useSession } from 'next-auth/react';
|
|
||||||
import { Spinner } from '@tih/ui';
|
|
||||||
|
|
||||||
import Comment from './comment/Comment';
|
|
||||||
|
|
||||||
import type { ResumeComment } from '~/types/resume-comments';
|
|
||||||
|
|
||||||
type Props = Readonly<{
|
|
||||||
comments: Array<ResumeComment>;
|
|
||||||
isLoading: boolean;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export default function CommentListItems({ comments, isLoading }: Props) {
|
|
||||||
const { data: session } = useSession();
|
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return (
|
|
||||||
<div className="col-span-10 pt-4">
|
|
||||||
<Spinner display="block" size="lg" />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="m-2 flow-root h-[calc(100vh-20rem)] w-full flex-col space-y-3 overflow-y-auto">
|
|
||||||
{comments.map((comment) => (
|
|
||||||
<Comment
|
|
||||||
key={comment.id}
|
|
||||||
comment={comment}
|
|
||||||
userId={session?.user?.id}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
import { useSession } from 'next-auth/react';
|
|
||||||
import { useState } from 'react';
|
|
||||||
import { Tabs } from '@tih/ui';
|
|
||||||
import { Button } from '@tih/ui';
|
|
||||||
|
|
||||||
import { trpc } from '~/utils/trpc';
|
|
||||||
|
|
||||||
import CommentListItems from './CommentListItems';
|
|
||||||
import { COMMENTS_SECTIONS } from './constants';
|
|
||||||
import ResumeSignInButton from '../shared/ResumeSignInButton';
|
|
||||||
|
|
||||||
type CommentsListProps = Readonly<{
|
|
||||||
resumeId: string;
|
|
||||||
setShowCommentsForm: (show: boolean) => void;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
export default function CommentsList({
|
|
||||||
resumeId,
|
|
||||||
setShowCommentsForm,
|
|
||||||
}: CommentsListProps) {
|
|
||||||
const { data: sessionData } = useSession();
|
|
||||||
const [tab, setTab] = useState(COMMENTS_SECTIONS[0].value);
|
|
||||||
|
|
||||||
const commentsQuery = trpc.useQuery(['resumes.reviews.list', { resumeId }]);
|
|
||||||
const renderButton = () => {
|
|
||||||
if (sessionData === null) {
|
|
||||||
return <ResumeSignInButton text="to join discussion" />;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
display="block"
|
|
||||||
label="Add your review"
|
|
||||||
variant="tertiary"
|
|
||||||
onClick={() => setShowCommentsForm(true)}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="space-y-3">
|
|
||||||
{renderButton()}
|
|
||||||
<Tabs
|
|
||||||
label="comments"
|
|
||||||
tabs={COMMENTS_SECTIONS}
|
|
||||||
value={tab}
|
|
||||||
onChange={(value) => setTab(value)}
|
|
||||||
/>
|
|
||||||
<CommentListItems
|
|
||||||
comments={commentsQuery.data?.filter((c) => c.section === tab) ?? []}
|
|
||||||
isLoading={commentsQuery.isFetching}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -0,0 +1,69 @@
|
|||||||
|
import { useSession } from 'next-auth/react';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import { Spinner, Tabs } from '@tih/ui';
|
||||||
|
import { Button } from '@tih/ui';
|
||||||
|
|
||||||
|
import { trpc } from '~/utils/trpc';
|
||||||
|
|
||||||
|
import ResumeCommentListItem from './comment/ResumeCommentListItem';
|
||||||
|
import { RESUME_COMMENTS_SECTIONS } from './resumeCommentConstants';
|
||||||
|
import ResumeSignInButton from '../shared/ResumeSignInButton';
|
||||||
|
|
||||||
|
type ResumeCommentsListProps = Readonly<{
|
||||||
|
resumeId: string;
|
||||||
|
setShowCommentsForm: (show: boolean) => void;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export default function ResumeCommentsList({
|
||||||
|
resumeId,
|
||||||
|
setShowCommentsForm,
|
||||||
|
}: ResumeCommentsListProps) {
|
||||||
|
const { data: sessionData } = useSession();
|
||||||
|
const [tab, setTab] = useState(RESUME_COMMENTS_SECTIONS[0].value);
|
||||||
|
|
||||||
|
const commentsQuery = trpc.useQuery(['resumes.reviews.list', { resumeId }]);
|
||||||
|
const renderButton = () => {
|
||||||
|
if (sessionData === null) {
|
||||||
|
return <ResumeSignInButton text="to join discussion" />;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
display="block"
|
||||||
|
label="Add your review"
|
||||||
|
variant="tertiary"
|
||||||
|
onClick={() => setShowCommentsForm(true)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="space-y-3">
|
||||||
|
{renderButton()}
|
||||||
|
|
||||||
|
<Tabs
|
||||||
|
label="comments"
|
||||||
|
tabs={RESUME_COMMENTS_SECTIONS}
|
||||||
|
value={tab}
|
||||||
|
onChange={(value) => setTab(value)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{commentsQuery.isFetching ? (
|
||||||
|
<div className="col-span-10 pt-4">
|
||||||
|
<Spinner display="block" size="lg" />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className="m-2 flow-root h-[calc(100vh-20rem)] w-full flex-col space-y-3 overflow-y-auto">
|
||||||
|
{(commentsQuery.data?.filter((c) => c.section === tab) ?? []).map(
|
||||||
|
(comment) => (
|
||||||
|
<ResumeCommentListItem
|
||||||
|
key={comment.id}
|
||||||
|
comment={comment}
|
||||||
|
userId={sessionData?.user?.id}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -1,18 +0,0 @@
|
|||||||
import CommentBody from './CommentBody';
|
|
||||||
import CommentCard from './CommentCard';
|
|
||||||
|
|
||||||
import type { ResumeComment } from '~/types/resume-comments';
|
|
||||||
|
|
||||||
type CommentProps = {
|
|
||||||
comment: ResumeComment;
|
|
||||||
userId?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Comment({ comment, userId }: CommentProps) {
|
|
||||||
const isCommentOwner = userId === comment.user.userId;
|
|
||||||
return (
|
|
||||||
<CommentCard>
|
|
||||||
<CommentBody comment={comment} isCommentOwner={isCommentOwner} />
|
|
||||||
</CommentCard>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,10 +1,12 @@
|
|||||||
import type { ReactNode } from 'react';
|
import type { ReactNode } from 'react';
|
||||||
|
|
||||||
type CommentCardProps = {
|
type ResumeCommentCardProps = {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function CommentCard({ children }: CommentCardProps) {
|
export default function ResumeCommentCard({
|
||||||
|
children,
|
||||||
|
}: ResumeCommentCardProps) {
|
||||||
return (
|
return (
|
||||||
<div className="border-primary-300 w-3/4 rounded-md border-2 bg-white p-2 drop-shadow-md">
|
<div className="border-primary-300 w-3/4 rounded-md border-2 bg-white p-2 drop-shadow-md">
|
||||||
{children}
|
{children}
|
@ -0,0 +1,21 @@
|
|||||||
|
import ResumeCommentBody from './ResumeCommentBody';
|
||||||
|
import ResumeCommentCard from './ResumeCommentCard';
|
||||||
|
|
||||||
|
import type { ResumeComment } from '~/types/resume-comments';
|
||||||
|
|
||||||
|
type ResumeCommentListItemProps = {
|
||||||
|
comment: ResumeComment;
|
||||||
|
userId?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function ResumeCommentListItem({
|
||||||
|
comment,
|
||||||
|
userId,
|
||||||
|
}: ResumeCommentListItemProps) {
|
||||||
|
const isCommentOwner = userId === comment.user.userId;
|
||||||
|
return (
|
||||||
|
<ResumeCommentCard>
|
||||||
|
<ResumeCommentBody comment={comment} isCommentOwner={isCommentOwner} />
|
||||||
|
</ResumeCommentCard>
|
||||||
|
);
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import { ResumesSection } from '@prisma/client';
|
import { ResumesSection } from '@prisma/client';
|
||||||
|
|
||||||
export const COMMENTS_SECTIONS = [
|
export const RESUME_COMMENTS_SECTIONS = [
|
||||||
{
|
{
|
||||||
label: 'General',
|
label: 'General',
|
||||||
value: ResumesSection.GENERAL,
|
value: ResumesSection.GENERAL,
|
Loading…
Reference in new issue