Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Platform] Add variant page #365

Merged
merged 3 commits into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
404 changes: 404 additions & 0 deletions apps/platform/public/data/variant-data-1.json

Large diffs are not rendered by default.

792 changes: 792 additions & 0 deletions apps/platform/public/data/variant-data-2.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions apps/platform/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import DownloadsPage from "./pages/DownloadsPage";
import DrugPage from "./pages/DrugPage";
import TargetPage from "./pages/TargetPage";
import EvidencePage from "./pages/EvidencePage";
import VariantsPage from "./pages/VariantsPage";
import VariantPage from "./pages/VariantPage";
import APIPage from "./pages/APIPage";
import NotFoundPage from "./pages/NotFoundPage";
import ProjectsPage from "./pages/ProjectsPage";
Expand Down Expand Up @@ -53,8 +53,8 @@ function App() {
<Route path="/evidence/:ensgId/:efoId">
<EvidencePage />
</Route>
<Route path="/variants">
<VariantsPage />
<Route path="/variant/:varId">
<VariantPage />
</Route>
<Route path="/api">
<APIPage />
Expand Down
49 changes: 49 additions & 0 deletions apps/platform/src/pages/VariantPage/Header.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { faMapPin } from "@fortawesome/free-solid-svg-icons";
import { Header as HeaderBase, ExternalLink } from "ui";
import { MetadataType } from "./types";

type HeaderProps = {
loading: boolean;
metadata: MetadataType;
}

function Header({ loading, metadata }: HeaderProps) {
const {
variantId,
rsIds,
chromosome,
position,
referenceAllele,
alternateAllele,
} = metadata;
const rsId = rsIds[0];
const gnomadId = `${
chromosome}-${
position}-${
referenceAllele}-${
alternateAllele}`;

return (
<HeaderBase
loading={loading}
title={variantId}
Icon={faMapPin}
externalLinks={
<>
<ExternalLink
title="Ensembl"
url={`https://identifiers.org/ensembl:${rsId}`}
id={rsId}
/>
<ExternalLink
title="gnomAD"
url={`https://gnomad.broadinstitute.org/variant/${gnomadId}?dataset=gnomad_r4`}
id={gnomadId}
/>
</>
}
/>
);
}

export default Header;
46 changes: 46 additions & 0 deletions apps/platform/src/pages/VariantPage/VariantPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@

import { useState, useEffect } from "react";
import { useLocation, useParams } from "react-router-dom";
import { BasePage } from "ui";
import Header from "./Header";
import NotFoundPage from "../NotFoundPage";
import { MetadataType } from "./types";

// const Profile = lazy(() => import("./Profile"));

function VariantPage() {
const location = useLocation();
const { varId } = useParams() as { varId: string };
const [metadata, setMetadata] =
useState<MetadataType | 'waiting' | undefined>('waiting');

// temp: loading is set by useQuery, set to false for now
const loading = false;

// temp: data will come from gql, fetch local json file for now
useEffect(() => {
fetch('../data/variant-data-2.json')
.then(response => response.json())
.then((allData: MetadataType[]) =>
setMetadata(allData.find(v => v.variantId === varId)));
}, []);

// temp: revisit this (use same as other pages) once using gql to get data
if (!metadata) {
return <NotFoundPage />;
} else if (metadata === 'waiting') {
return <b>Waiting</b>;
}

return (
<BasePage
title={`${varId} profile page`}
description={`Annotation information for ${varId}`}
location={location}
>
<Header loading={loading} metadata={metadata} />
</BasePage>
);
}

export default VariantPage;
2 changes: 2 additions & 0 deletions apps/platform/src/pages/VariantPage/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// export { default } from "./VariantPage";
export {default} from "./VariantPage"
39 changes: 39 additions & 0 deletions apps/platform/src/pages/VariantPage/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
type AlleleFrequencyType = {
populationName: string;
alleleFrequency: number;
};

type VepType = {
mostSevereConsequence: string;
transcriptConsequences: {
aminoAcids: string;
consequenceTerms: string[];
geneId: string;
}[];
};

export type MetadataType = {
variantId: string,
chromosome: string,
position: number;
chromosomeB37?: string,
positionB37?: number;
referenceAllele: string,
alternateAllele: string,
rsIds: string[];
alleleType: string;
alleleFrequencies: AlleleFrequencyType[];
vep: VepType;
inSilicoPredictors: {
cadd?: {
phred: number;
raw: number;
};
revelMax?: number;
spliceaiDsMax?: number;
pangolinLargestDs?: number;
phylop?: number;
siftMax?: number;
polyphenMax?: number;
};
};