Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions src/components/Layout/AbsLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,17 @@ import { unwrapStringValue } from '@/utils/common/formatters';
import { IDocsEntity } from '@/api/search/types';

interface IAbsLayoutProps {
doc: IDocsEntity;
doc?: IDocsEntity | null;
titleDescription: string;
label: string;
}

export const AbsLayout: FC<IAbsLayoutProps> = ({ children, doc, titleDescription, label }) => {
const { getSearchHref, show: showBackLink } = useBackToSearchResults();

if (!doc) {
return <>{children}</>;
}

const title = unwrapStringValue(doc?.title);
const hasDoc = Boolean(doc);
const title = hasDoc ? unwrapStringValue(doc.title) : '';
const pageTitle = hasDoc ? `${title} - ${BRAND_NAME_FULL} ${label}` : `${BRAND_NAME_FULL} ${label}`;

return (
<Stack direction="column" my={{ base: '6', lg: showBackLink ? '12' : '16' }}>
Expand All @@ -47,21 +45,21 @@ export const AbsLayout: FC<IAbsLayoutProps> = ({ children, doc, titleDescription
)}
<Stack direction={{ base: 'column', lg: 'row' }} spacing={6}>
<Head>
<title>{`${unwrapStringValue(doc.title)} - ${BRAND_NAME_FULL} ${label}`}</title>
<Metatags doc={doc} />
<title>{pageTitle}</title>
{hasDoc ? <Metatags doc={doc} /> : null}
</Head>
<Stack direction="column">
<Box display={{ base: 'none', lg: 'block' }} w="72">
<AbstractSources doc={doc} style="accordion" />
{hasDoc ? <AbstractSources doc={doc} style="accordion" /> : null}
</Box>
<AbstractSideNav doc={doc} />
{hasDoc ? <AbstractSideNav doc={doc} /> : null}
</Stack>
<Stack direction="column" as="section" aria-labelledby="title" spacing={1} width="full">
<Heading as="h2" id="abstract-subview-title" fontSize="2xl" variant="abstract">
<Text as="span" fontSize="xl">
{titleDescription}
</Text>{' '}
<Text as={MathJax} dangerouslySetInnerHTML={{ __html: unwrapStringValue(title) }} />
<Text as={MathJax} dangerouslySetInnerHTML={{ __html: title }} />
</Heading>
<div id="abstract-subview-content">{children}</div>
</Stack>
Expand Down
65 changes: 65 additions & 0 deletions src/components/Layout/__tests__/AbsLayout.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { describe, expect, it, vi } from 'vitest';

vi.mock('next/router', () => ({
useRouter: () => ({
asPath: '/',
basePath: '',
isReady: true,
pathname: '/',
query: {},
push: vi.fn(),
replace: vi.fn(),
prefetch: vi.fn(),
back: vi.fn(),
forward: vi.fn(),
events: {
on: vi.fn(),
off: vi.fn(),
emit: vi.fn(),
},
}),
}));

vi.mock('@/components/AbstractSideNav', () => ({
AbstractSideNav: () => <div data-testid="abstract-side-nav" />,
}));

vi.mock('@/components/AbstractSources', () => ({
AbstractSources: () => <div data-testid="abstract-sources" />,
}));

import { AbsLayout } from '@/components/Layout/AbsLayout';
import { render, screen } from '@/test-utils';

const baseDoc = {
id: 'test-id',
bibcode: '2020TEST....1A',
title: ['Test Document'],
} as const;

describe('AbsLayout', () => {
it('renders stable structure when doc is unavailable', () => {
render(
<AbsLayout doc={null} titleDescription="Testing" label="Example">
<div data-testid="content">Loading content</div>
</AbsLayout>,
{},
);

expect(document.getElementById('abstract-subview-content')).toBeInTheDocument();
expect(screen.getByTestId('content')).toBeInTheDocument();
});

it('renders document specific details when doc is provided', () => {
render(
<AbsLayout doc={{ ...baseDoc }} titleDescription="Testing" label="Example">
<div data-testid="content">Loaded content</div>
</AbsLayout>,
{},
);

expect(screen.getByTestId('abstract-side-nav')).toBeInTheDocument();
expect(screen.getByTestId('abstract-sources')).toBeInTheDocument();
expect(screen.getByTestId('content')).toBeInTheDocument();
});
});
13 changes: 9 additions & 4 deletions src/pages/abs/[id]/similar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,23 @@ const SimilarPage: NextPage = () => {
const doc = path<IDocsEntity>(['docs', 0], abstractResult);
const pageIndex = router.query.p ? parseInt(router.query.p as string) - 1 : 0;

const { getParams, onPageChange } = useGetAbstractParams(doc?.bibcode);
const bibcode = doc?.bibcode ?? '';
const { getParams, onPageChange } = useGetAbstractParams(bibcode);
const shouldFetchSimilar = Boolean(bibcode);
const { data, isSuccess, isLoading, isFetching, isError, error } = useGetSimilar(
{ ...getParams(), start: pageIndex * APP_DEFAULTS.RESULT_PER_PAGE },
{ keepPreviousData: true },
{
keepPreviousData: true,
enabled: shouldFetchSimilar,
},
);
const similarParams = getSimilarParams(doc?.bibcode, 0);
const similarParams = shouldFetchSimilar ? getSimilarParams(bibcode, 0) : null;

return (
<AbsLayout doc={doc} titleDescription="Papers similar to" label="Similar Papers">
{isLoading || isFetching ? <ItemsSkeleton count={10} /> : null}
{isError ? <StandardAlertMessage title={parseAPIError(error)} /> : null}
{isSuccess ? (
{isSuccess && doc && similarParams ? (
<AbstractRefList
doc={doc}
docs={data.docs}
Expand Down
Loading