parent
e0addf3b77
commit
4adc6a5013
@ -1,72 +0,0 @@
|
|||||||
import {
|
|
||||||
ChatBubbleBottomCenterTextIcon,
|
|
||||||
ChevronDownIcon,
|
|
||||||
ChevronUpIcon,
|
|
||||||
EyeIcon,
|
|
||||||
} from '@heroicons/react/24/outline';
|
|
||||||
import { Badge, Button } from '@tih/ui';
|
|
||||||
|
|
||||||
export type QuestionOverviewCardProps = {
|
|
||||||
answerCount: number;
|
|
||||||
content: string;
|
|
||||||
location: string;
|
|
||||||
role: string;
|
|
||||||
similarCount: number;
|
|
||||||
timestamp: string;
|
|
||||||
upvoteCount: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function QuestionOverviewCard({
|
|
||||||
answerCount,
|
|
||||||
content,
|
|
||||||
similarCount,
|
|
||||||
upvoteCount,
|
|
||||||
timestamp,
|
|
||||||
role,
|
|
||||||
location,
|
|
||||||
}: QuestionOverviewCardProps) {
|
|
||||||
return (
|
|
||||||
<article className="flex gap-2 rounded-md border border-slate-300 p-4">
|
|
||||||
<div className="flex flex-col items-center">
|
|
||||||
<Button
|
|
||||||
icon={ChevronUpIcon}
|
|
||||||
isLabelHidden={true}
|
|
||||||
label="Upvote"
|
|
||||||
variant="tertiary"
|
|
||||||
/>
|
|
||||||
<p>{upvoteCount}</p>
|
|
||||||
<Button
|
|
||||||
icon={ChevronDownIcon}
|
|
||||||
isLabelHidden={true}
|
|
||||||
label="Downvote"
|
|
||||||
variant="tertiary"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="flex flex-col gap-2">
|
|
||||||
<div className="flex items-center gap-2 text-slate-500">
|
|
||||||
<Badge label="Technical" variant="primary" />
|
|
||||||
<p className="text-xs">
|
|
||||||
{timestamp} · {location} · {role}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<p className="line-clamp-2 text-ellipsis">{content}</p>
|
|
||||||
<div className="flex gap-2">
|
|
||||||
<Button
|
|
||||||
addonPosition="start"
|
|
||||||
icon={ChatBubbleBottomCenterTextIcon}
|
|
||||||
label={`${answerCount} answers`}
|
|
||||||
size="sm"
|
|
||||||
variant="tertiary"
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
addonPosition="start"
|
|
||||||
icon={EyeIcon}
|
|
||||||
label={`${similarCount} received this`}
|
|
||||||
size="sm"
|
|
||||||
variant="tertiary"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
);
|
|
||||||
}
|
|
@ -0,0 +1,122 @@
|
|||||||
|
import {
|
||||||
|
ChatBubbleBottomCenterTextIcon,
|
||||||
|
ChevronDownIcon,
|
||||||
|
ChevronUpIcon,
|
||||||
|
EyeIcon,
|
||||||
|
} from '@heroicons/react/24/outline';
|
||||||
|
import { Badge, Button } from '@tih/ui';
|
||||||
|
|
||||||
|
type UpvoteProps =
|
||||||
|
| {
|
||||||
|
showVoteButtons: true;
|
||||||
|
upvoteCount: number;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
showVoteButtons?: false;
|
||||||
|
upvoteCount?: never;
|
||||||
|
};
|
||||||
|
|
||||||
|
type StatisticsProps =
|
||||||
|
| {
|
||||||
|
answerCount: number;
|
||||||
|
showUserStatistics: true;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
answerCount?: never;
|
||||||
|
showUserStatistics?: false;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ActionButtonProps =
|
||||||
|
| {
|
||||||
|
actionButtonLabel: string;
|
||||||
|
onActionButtonClick: () => void;
|
||||||
|
showActionButton: true;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
actionButtonLabel?: never;
|
||||||
|
onActionButtonClick?: never;
|
||||||
|
showActionButton?: false;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type QuestionCardProps = ActionButtonProps &
|
||||||
|
StatisticsProps &
|
||||||
|
UpvoteProps & {
|
||||||
|
content: string;
|
||||||
|
location: string;
|
||||||
|
role: string;
|
||||||
|
similarCount: number;
|
||||||
|
timestamp: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function QuestionCard({
|
||||||
|
answerCount,
|
||||||
|
content,
|
||||||
|
similarCount,
|
||||||
|
showVoteButtons,
|
||||||
|
showUserStatistics,
|
||||||
|
showActionButton,
|
||||||
|
actionButtonLabel,
|
||||||
|
onActionButtonClick,
|
||||||
|
upvoteCount,
|
||||||
|
timestamp,
|
||||||
|
role,
|
||||||
|
location,
|
||||||
|
}: QuestionCardProps) {
|
||||||
|
return (
|
||||||
|
<article className="flex gap-2 rounded-md border border-slate-300 p-4">
|
||||||
|
{showVoteButtons && (
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<Button
|
||||||
|
icon={ChevronUpIcon}
|
||||||
|
isLabelHidden={true}
|
||||||
|
label="Upvote"
|
||||||
|
variant="tertiary"
|
||||||
|
/>
|
||||||
|
<p>{upvoteCount}</p>
|
||||||
|
<Button
|
||||||
|
icon={ChevronDownIcon}
|
||||||
|
isLabelHidden={true}
|
||||||
|
label="Downvote"
|
||||||
|
variant="tertiary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<div className="flex items-start justify-between">
|
||||||
|
<div className="flex items-center gap-2 text-slate-500">
|
||||||
|
<Badge label="Technical" variant="primary" />
|
||||||
|
<p className="text-xs">
|
||||||
|
{timestamp} · {location} · {role}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{showActionButton && (
|
||||||
|
<Button
|
||||||
|
label={actionButtonLabel}
|
||||||
|
variant="tertiary"
|
||||||
|
onClick={onActionButtonClick}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<p className="line-clamp-2 text-ellipsis">{content}</p>
|
||||||
|
{showUserStatistics && (
|
||||||
|
<div className="flex gap-2">
|
||||||
|
<Button
|
||||||
|
addonPosition="start"
|
||||||
|
icon={ChatBubbleBottomCenterTextIcon}
|
||||||
|
label={`${answerCount} answers`}
|
||||||
|
size="sm"
|
||||||
|
variant="tertiary"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
addonPosition="start"
|
||||||
|
icon={EyeIcon}
|
||||||
|
label={`${similarCount} received this`}
|
||||||
|
size="sm"
|
||||||
|
variant="tertiary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
import type { QuestionCardProps } from './QuestionCard';
|
||||||
|
import QuestionCard from './QuestionCard';
|
||||||
|
|
||||||
|
export type QuestionOverviewCardProps = Required<
|
||||||
|
Omit<
|
||||||
|
QuestionCardProps & {
|
||||||
|
showActionButton: false;
|
||||||
|
showUserStatistics: true;
|
||||||
|
showVoteButtons: true;
|
||||||
|
},
|
||||||
|
| 'actionButtonLabel'
|
||||||
|
| 'onActionButtonClick'
|
||||||
|
| 'showActionButton'
|
||||||
|
| 'showUserStatistics'
|
||||||
|
| 'showVoteButtons'
|
||||||
|
>
|
||||||
|
>;
|
||||||
|
|
||||||
|
export default function QuestionOverviewCard(props: QuestionOverviewCardProps) {
|
||||||
|
return (
|
||||||
|
<QuestionCard
|
||||||
|
{...props}
|
||||||
|
showActionButton={false}
|
||||||
|
showUserStatistics={true}
|
||||||
|
showVoteButtons={true}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
import type { QuestionCardProps } from './QuestionCard';
|
||||||
|
import QuestionCard from './QuestionCard';
|
||||||
|
|
||||||
|
export type SimilarQuestionCardProps = Required<
|
||||||
|
Omit<
|
||||||
|
QuestionCardProps & {
|
||||||
|
showActionButton: true;
|
||||||
|
showUserStatistics: false;
|
||||||
|
showVoteButtons: false;
|
||||||
|
},
|
||||||
|
| 'actionButtonLabel'
|
||||||
|
| 'answerCount'
|
||||||
|
| 'onActionButtonClick'
|
||||||
|
| 'showActionButton'
|
||||||
|
| 'showUserStatistics'
|
||||||
|
| 'showVoteButtons'
|
||||||
|
| 'upvoteCount'
|
||||||
|
>
|
||||||
|
> & {
|
||||||
|
onSimilarQuestionClick: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function SimilarQuestionCard(props: SimilarQuestionCardProps) {
|
||||||
|
const { onSimilarQuestionClick, ...rest } = props;
|
||||||
|
return (
|
||||||
|
<QuestionCard
|
||||||
|
{...rest}
|
||||||
|
actionButtonLabel="Yes, this is my question"
|
||||||
|
showActionButton={true}
|
||||||
|
onActionButtonClick={onSimilarQuestionClick}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in new issue