parent
e8ba344ecb
commit
c9af85a48b
@ -0,0 +1,39 @@
|
|||||||
|
import type { ComponentProps } from 'react';
|
||||||
|
import { useMemo } from 'react';
|
||||||
|
import { Badge } from '@tih/ui';
|
||||||
|
|
||||||
|
type BadgeProps = ComponentProps<typeof Badge>;
|
||||||
|
|
||||||
|
export type QuestionAggregateBadgeProps = Omit<BadgeProps, 'label'> & {
|
||||||
|
statistics: Record<string, number>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function QuestionAggregateBadge({
|
||||||
|
statistics,
|
||||||
|
...badgeProps
|
||||||
|
}: QuestionAggregateBadgeProps) {
|
||||||
|
const mostCommonStatistic = useMemo(
|
||||||
|
() =>
|
||||||
|
Object.entries(statistics).reduce(
|
||||||
|
(mostCommon, [key, value]) => {
|
||||||
|
if (value > mostCommon.value) {
|
||||||
|
return { key, value };
|
||||||
|
}
|
||||||
|
return mostCommon;
|
||||||
|
},
|
||||||
|
{ key: '', value: 0 },
|
||||||
|
),
|
||||||
|
[statistics],
|
||||||
|
);
|
||||||
|
|
||||||
|
const additionalStatisticCount = Object.keys(statistics).length - 1;
|
||||||
|
|
||||||
|
const label = useMemo(() => {
|
||||||
|
if (additionalStatisticCount === 0) {
|
||||||
|
return mostCommonStatistic.key;
|
||||||
|
}
|
||||||
|
return `${mostCommonStatistic.key} (+${additionalStatisticCount})`;
|
||||||
|
}, [mostCommonStatistic, additionalStatisticCount]);
|
||||||
|
|
||||||
|
return <Badge label={label} {...badgeProps} />;
|
||||||
|
}
|
@ -1,31 +0,0 @@
|
|||||||
import type { QuestionCardProps } from './QuestionCard';
|
|
||||||
import QuestionCard from './QuestionCard';
|
|
||||||
|
|
||||||
export type SimilarQuestionCardProps = 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}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,29 +1,33 @@
|
|||||||
import type { QuestionCardProps } from './QuestionCard';
|
import type { BaseQuestionCardProps } from './BaseQuestionCard';
|
||||||
import QuestionCard from './QuestionCard';
|
import BaseQuestionCard from './BaseQuestionCard';
|
||||||
|
|
||||||
export type QuestionOverviewCardProps = Omit<
|
export type QuestionOverviewCardProps = Omit<
|
||||||
QuestionCardProps & {
|
BaseQuestionCardProps & {
|
||||||
showActionButton: false;
|
showActionButton: false;
|
||||||
showAnswerStatistics: false;
|
showAnswerStatistics: false;
|
||||||
|
showCreateEncounterButton: true;
|
||||||
showDeleteButton: false;
|
showDeleteButton: false;
|
||||||
showReceivedStatistics: true;
|
showReceivedStatistics: false;
|
||||||
showVoteButtons: true;
|
showVoteButtons: true;
|
||||||
},
|
},
|
||||||
| 'actionButtonLabel'
|
| 'actionButtonLabel'
|
||||||
| 'onActionButtonClick'
|
| 'onActionButtonClick'
|
||||||
| 'showActionButton'
|
| 'showActionButton'
|
||||||
| 'showAnswerStatistics'
|
| 'showAnswerStatistics'
|
||||||
|
| 'showCreateEncounterButton'
|
||||||
|
| 'showDeleteButton'
|
||||||
| 'showReceivedStatistics'
|
| 'showReceivedStatistics'
|
||||||
| 'showVoteButtons'
|
| 'showVoteButtons'
|
||||||
>;
|
>;
|
||||||
|
|
||||||
export default function FullQuestionCard(props: QuestionOverviewCardProps) {
|
export default function FullQuestionCard(props: QuestionOverviewCardProps) {
|
||||||
return (
|
return (
|
||||||
<QuestionCard
|
<BaseQuestionCard
|
||||||
{...props}
|
{...props}
|
||||||
showActionButton={false}
|
showActionButton={false}
|
||||||
showAnswerStatistics={false}
|
showAnswerStatistics={false}
|
||||||
showReceivedStatistics={true}
|
showCreateEncounterButton={true}
|
||||||
|
showReceivedStatistics={false}
|
||||||
showVoteButtons={true}
|
showVoteButtons={true}
|
||||||
truncateContent={false}
|
truncateContent={false}
|
||||||
/>
|
/>
|
@ -0,0 +1,44 @@
|
|||||||
|
import type { BaseQuestionCardProps } from './BaseQuestionCard';
|
||||||
|
import BaseQuestionCard from './BaseQuestionCard';
|
||||||
|
|
||||||
|
export type SimilarQuestionCardProps = Omit<
|
||||||
|
BaseQuestionCardProps & {
|
||||||
|
showActionButton: true;
|
||||||
|
showAnswerStatistics: true;
|
||||||
|
showCreateEncounterButton: false;
|
||||||
|
showDeleteButton: false;
|
||||||
|
showHover: true;
|
||||||
|
showReceivedStatistics: false;
|
||||||
|
showVoteButtons: false;
|
||||||
|
},
|
||||||
|
| 'actionButtonLabel'
|
||||||
|
| 'onActionButtonClick'
|
||||||
|
| 'showActionButton'
|
||||||
|
| 'showAnswerStatistics'
|
||||||
|
| 'showCreateEncounterButton'
|
||||||
|
| 'showDeleteButton'
|
||||||
|
| 'showHover'
|
||||||
|
| 'showReceivedStatistics'
|
||||||
|
| 'showVoteButtons'
|
||||||
|
> & {
|
||||||
|
onSimilarQuestionClick: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function SimilarQuestionCard(props: SimilarQuestionCardProps) {
|
||||||
|
const { onSimilarQuestionClick, ...rest } = props;
|
||||||
|
return (
|
||||||
|
<BaseQuestionCard
|
||||||
|
actionButtonLabel="Yes, this is my question"
|
||||||
|
showActionButton={true}
|
||||||
|
showAnswerStatistics={true}
|
||||||
|
showCreateEncounterButton={false}
|
||||||
|
showDeleteButton={false}
|
||||||
|
showHover={true}
|
||||||
|
showReceivedStatistics={true}
|
||||||
|
showVoteButtons={true}
|
||||||
|
onActionButtonClick={onSimilarQuestionClick}
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
{...(rest as any)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in new issue