144 lines
4.2 KiB
TypeScript
144 lines
4.2 KiB
TypeScript
import Link from 'next/link';
|
|
import { redirect } from 'next/navigation';
|
|
|
|
import { loadCurrentUserAccount } from '@/app/home/(user)/_lib/server/load-user-account';
|
|
import { createI18nServerInstance } from '@/lib/i18n/i18n.server';
|
|
import { withI18n } from '@/lib/i18n/with-i18n';
|
|
|
|
import { Trans } from '@kit/ui/makerkit/trans';
|
|
import { PageBody } from '@kit/ui/page';
|
|
import { Button } from '@kit/ui/shadcn/button';
|
|
|
|
import pathsConfig from '~/config/paths.config';
|
|
import { getAnalysisElements } from '~/lib/services/analysis-element.service';
|
|
import {
|
|
PAGE_VIEW_ACTION,
|
|
createPageViewLog,
|
|
} from '~/lib/services/audit/pageView.service';
|
|
import { getAnalysisOrders } from '~/lib/services/order.service';
|
|
|
|
import { loadUserAnalysis } from '../../_lib/server/load-user-analysis';
|
|
import Analysis from './_components/analysis';
|
|
|
|
export const generateMetadata = async () => {
|
|
const i18n = await createI18nServerInstance();
|
|
const title = i18n.t('analysis-results:pageTitle');
|
|
|
|
return {
|
|
title,
|
|
};
|
|
};
|
|
|
|
async function AnalysisResultsPage() {
|
|
const account = await loadCurrentUserAccount();
|
|
if (!account) {
|
|
throw new Error('Account not found');
|
|
}
|
|
|
|
const analysisResponses = await loadUserAnalysis();
|
|
const analysisResponseElements = analysisResponses?.flatMap(
|
|
({ elements }) => elements,
|
|
);
|
|
|
|
const analysisOrders = await getAnalysisOrders().catch(() => null);
|
|
|
|
if (!analysisOrders) {
|
|
redirect(pathsConfig.auth.signIn);
|
|
}
|
|
|
|
await createPageViewLog({
|
|
accountId: account.id,
|
|
action: PAGE_VIEW_ACTION.VIEW_ANALYSIS_RESULTS,
|
|
});
|
|
|
|
const analysisElementIds = [
|
|
...new Set(
|
|
analysisOrders
|
|
?.flatMap((order) => order.analysis_element_ids)
|
|
.filter(Boolean) as number[],
|
|
),
|
|
];
|
|
const analysisElements = await getAnalysisElements({
|
|
ids: analysisElementIds,
|
|
});
|
|
const analysisElementsWithResults =
|
|
analysisResponseElements
|
|
?.sort((a, b) => {
|
|
if (!a.response_time || !b.response_time) {
|
|
return 0;
|
|
}
|
|
return (
|
|
new Date(b.response_time).getTime() -
|
|
new Date(a.response_time).getTime()
|
|
);
|
|
})
|
|
.map((results) => ({ results })) ?? [];
|
|
const analysisElementsWithoutResults = analysisElements.filter(
|
|
(element) =>
|
|
!analysisElementsWithResults?.some(
|
|
({ results }) =>
|
|
results.analysis_element_original_id === element.analysis_id_original,
|
|
),
|
|
);
|
|
|
|
const hasNoAnalysisElements =
|
|
analysisElementsWithResults.length === 0 &&
|
|
analysisElementsWithoutResults.length === 0;
|
|
|
|
return (
|
|
<PageBody>
|
|
<div className="mt-8 flex flex-col justify-between gap-4 sm:flex-row sm:items-center sm:gap-0">
|
|
<div>
|
|
<h4>
|
|
<Trans i18nKey="analysis-results:pageTitle" />
|
|
</h4>
|
|
<p className="text-muted-foreground text-sm">
|
|
{analysisResponses && analysisResponses.length > 0 ? (
|
|
<Trans i18nKey="analysis-results:description" />
|
|
) : (
|
|
<Trans i18nKey="analysis-results:descriptionEmpty" />
|
|
)}
|
|
</p>
|
|
</div>
|
|
<Button asChild>
|
|
<Link href={pathsConfig.app.orderAnalysisPackage}>
|
|
<Trans i18nKey="analysis-results:orderNewAnalysis" />
|
|
</Link>
|
|
</Button>
|
|
</div>
|
|
<div className="flex flex-col gap-2">
|
|
{analysisElementsWithResults.map(({ results }) => {
|
|
const analysisElement = analysisElements.find(
|
|
(element) =>
|
|
element.analysis_id_original ===
|
|
results.analysis_element_original_id,
|
|
);
|
|
if (!analysisElement) {
|
|
return null;
|
|
}
|
|
return (
|
|
<Analysis
|
|
key={results.id}
|
|
analysisElement={analysisElement}
|
|
results={results}
|
|
/>
|
|
);
|
|
})}
|
|
{analysisElementsWithoutResults.map((element) => (
|
|
<Analysis
|
|
key={element.analysis_id_original}
|
|
analysisElement={element}
|
|
/>
|
|
))}
|
|
{hasNoAnalysisElements && (
|
|
<div className="text-muted-foreground text-sm">
|
|
<Trans i18nKey="analysis-results:noAnalysisElements" />
|
|
</div>
|
|
)}
|
|
</div>
|
|
</PageBody>
|
|
);
|
|
}
|
|
|
|
export default withI18n(AnalysisResultsPage);
|