Skip to content

Commit 3526025

Browse files
Merge pull request #1273 from dacadeorg/fix/submission-page-load-issue
fix: submission list page load issue
2 parents 0575852 + cf84e84 commit 3526025

File tree

6 files changed

+99
-73
lines changed

6 files changed

+99
-73
lines changed

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v21.0.0
1+
v20.14.0

__tests__/components/ui/MetaData.test.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ import { getMetadataDescription } from "@/utilities/Metadata";
33
import "@testing-library/jest-dom";
44
import { render, screen } from "@testing-library/react";
55

6-
describe("MetaData", () => {
7-
const description = "Test description";
6+
const description = "Test description";
7+
const expectedMetaTags = getMetadataDescription(description);
88

9-
it("should render metaData", () => {
9+
describe("MetaData", () => {
10+
it("should render metaData tags", () => {
1011
render(<MetaData description={description} />);
11-
const metadata = screen.queryByTestId("meta-id");
12-
expect(metadata).toBeInTheDocument();
12+
const metaTags = screen.getAllByTestId("meta-id");
13+
expect(metaTags).toHaveLength(expectedMetaTags.length);
1314
});
1415

15-
it("should render meta tags", () => {
16+
it("should render the correct content in the meta tags", () => {
1617
render(<MetaData description={description} />);
1718
const mockMetas = getMetadataDescription(description);
1819
mockMetas.forEach((meta, index) => {

src/components/ui/MetaData.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getMetadataDescription } from "@/utilities/Metadata";
2-
import { ReactElement } from "react";
2+
import { ReactElement, useMemo } from "react";
33

44
/**
55
* Meta tags component
@@ -8,13 +8,13 @@ import { ReactElement } from "react";
88
* @export
99
* @returns {ReactElement}
1010
*/
11-
export default function MetaData({ description, testId = "meta-id" }: { description: string; testId?: string }): ReactElement {
12-
const metas = getMetadataDescription(description);
11+
export default function MetaData({ description, testId = "meta-id" }: { description?: string; testId?: string }): ReactElement {
12+
const metas = useMemo(() => getMetadataDescription(description), [description]);
1313
return (
14-
<div data-testid={testId}>
14+
<>
1515
{metas.map((meta, index) => (
16-
<meta key={`meta-${index}`} content={meta.content} name={meta.name} />
16+
<meta data-testid={testId} key={`meta-${index}`} content={meta.content} name={meta.name} />
1717
))}
18-
</div>
18+
</>
1919
);
2020
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import useNavigation from "@/hooks/useNavigation";
2+
import { useDispatch } from "@/hooks/useTypedDispatch";
3+
import { useMultiSelector } from "@/hooks/useTypedSelector";
4+
import { IRootState } from "@/store";
5+
import { showSubmission } from "@/store/feature/communities/challenges/submissions";
6+
import { initChallengeNavigationMenu } from "@/store/feature/communities/navigation.slice";
7+
import { toggleBodyScrolling } from "@/store/feature/ui.slice";
8+
import { Submission as SubmissionType } from "@/types/bounty";
9+
import { localePath } from "@/utilities/Routing";
10+
import { useRouter } from "next/router";
11+
import { useCallback, useEffect, useState } from "react";
12+
13+
14+
15+
const useSubmissionNavigation = () => {
16+
const [showPopup, setShowPopup] = useState<boolean>(false);
17+
const dispatch = useDispatch();
18+
const router = useRouter();
19+
const { submission_id } = router.query;
20+
21+
const navigation = useNavigation();
22+
23+
const { selectedSubmission, submissions } = useMultiSelector<unknown, { selectedSubmission: SubmissionType; submissions: SubmissionType[] }>({
24+
selectedSubmission: (state: IRootState) => state.submissions.current,
25+
submissions: (state: IRootState) => state.submissions.list,
26+
});
27+
28+
const handleCloseSubmission = useCallback(() => {
29+
if (!selectedSubmission) return;
30+
dispatch(showSubmission(""));
31+
setShowPopup(false);
32+
window.history.pushState("", "", localePath(router, router.asPath));
33+
dispatch(toggleBodyScrolling(false));
34+
}, [dispatch, router, selectedSubmission]);
35+
36+
useEffect(() => {
37+
dispatch(initChallengeNavigationMenu(navigation.community));
38+
}, [navigation.community, dispatch]);
39+
40+
const handleShowSubmission = useCallback(
41+
(e: any) => {
42+
const newUrl = e.detail;
43+
const submissionId = newUrl.replace(localePath(router, router.asPath), "").replace(/\//g, "");
44+
const submission = submissions.find((submission) => submission.id === submissionId);
45+
if (!submission) return;
46+
dispatch(showSubmission(submissionId));
47+
setShowPopup(true);
48+
dispatch(toggleBodyScrolling(true));
49+
},
50+
[dispatch, router, submissions]
51+
);
52+
53+
useEffect(() => {
54+
window.addEventListener("onSoftNavigation", handleShowSubmission);
55+
window.addEventListener("popstate", handleCloseSubmission);
56+
return () => {
57+
window.removeEventListener("onSoftNavigation", handleShowSubmission);
58+
window.removeEventListener("popstate", handleCloseSubmission);
59+
};
60+
}, [handleCloseSubmission, handleShowSubmission]);
61+
62+
// Temporary fix for links copied which have submission_id as a query parameter
63+
useEffect(() => {
64+
if (submission_id) router.push(`${router.asPath.split("?")[0]}/${submission_id}`);
65+
}, [router, submission_id]);
66+
67+
68+
return {
69+
showPopup,
70+
handleCloseSubmission,
71+
handleShowSubmission,
72+
selectedSubmission,
73+
submissions,
74+
}
75+
};
76+
77+
export default useSubmissionNavigation;

src/pages/communities/[slug]/challenges/[challenge_id]/submissions/index.tsx

Lines changed: 7 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,19 @@ import Header from "@/components/sections/communities/_partials/Header";
44
import Wrapper from "@/components/sections/courses/Wrapper";
55
import SubmissionList from "@/components/sections/submissions/List";
66
import MetaData from "@/components/ui/MetaData";
7-
import useNavigation from "@/hooks/useNavigation";
8-
import { useDispatch } from "@/hooks/useTypedDispatch";
9-
import { useMultiSelector } from "@/hooks/useTypedSelector";
10-
import { IRootState, wrapper } from "@/store";
11-
import { showSubmission } from "@/store/feature/communities/challenges/submissions";
12-
import { initChallengeNavigationMenu } from "@/store/feature/communities/navigation.slice";
13-
import { toggleBodyScrolling } from "@/store/feature/ui.slice";
7+
import useSubmissionNavigation from "@/hooks/useSubmissionNavigation";
8+
import { wrapper } from "@/store";
149
import { fetchAllSubmission, fetchChallenge } from "@/store/services/communities/challenges";
1510
import { fetchCurrentCommunity } from "@/store/services/community.service";
1611
import { Submission as SubmissionType } from "@/types/bounty";
1712
import { Community } from "@/types/community";
1813
import { Challenge } from "@/types/course";
1914
import { NotFoundError } from "@/utilities/errors/NotFoundError";
20-
import { localePath } from "@/utilities/Routing";
2115
import { GetServerSideProps } from "next";
2216
import { useTranslation } from "next-i18next";
2317
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
2418
import Head from "next/head";
25-
import { useRouter } from "next/router";
26-
import { ReactElement, useCallback, useEffect, useMemo, useState } from "react";
19+
import { ReactElement, useMemo } from "react";
2720

2821
/**
2922
* Submission page
@@ -35,55 +28,10 @@ import { ReactElement, useCallback, useEffect, useMemo, useState } from "react";
3528
*/
3629
export default function Submission(props: { pageProps: { currentCommunity: Community; submissions: SubmissionType[]; challenge: Challenge } }) {
3730
const { challenge } = props.pageProps;
38-
const { selectedSubmission, submissions } = useMultiSelector<unknown, { selectedSubmission: SubmissionType; submissions: SubmissionType[] }>({
39-
selectedSubmission: (state: IRootState) => state.submissions.current,
40-
submissions: (state: IRootState) => state.submissions.list,
41-
});
42-
const [showModal, setShowModal] = useState<boolean>(false);
43-
const dispatch = useDispatch();
44-
const router = useRouter();
45-
const { submission_id } = router.query;
46-
const { t } = useTranslation();
47-
const navigation = useNavigation();
48-
49-
const handleCloseSubmission = useCallback(() => {
50-
if (!selectedSubmission) return;
51-
dispatch(showSubmission(""));
52-
setShowModal(false);
53-
window.history.pushState("", "", localePath(router, router.asPath));
54-
dispatch(toggleBodyScrolling(false));
55-
}, [dispatch, router, selectedSubmission]);
5631

57-
useEffect(() => {
58-
dispatch(initChallengeNavigationMenu(navigation.community));
59-
}, [navigation.community, dispatch]);
60-
61-
const handleShowSubmission = useCallback(
62-
(e: any) => {
63-
const newUrl = e.detail;
64-
const submissionId = newUrl.replace(localePath(router, router.asPath), "").replace(/\//g, "");
65-
const submission = submissions.find((submission) => submission.id === submissionId);
66-
if (!submission) return;
67-
dispatch(showSubmission(submissionId));
68-
setShowModal(true);
69-
dispatch(toggleBodyScrolling(true));
70-
},
71-
[dispatch, router, submissions]
72-
);
32+
const { submissions, selectedSubmission, handleCloseSubmission, showPopup} = useSubmissionNavigation();
7333

74-
useEffect(() => {
75-
window.addEventListener("onSoftNavigation", handleShowSubmission);
76-
window.addEventListener("popstate", handleCloseSubmission);
77-
return () => {
78-
window.removeEventListener("onSoftNavigation", handleShowSubmission);
79-
window.removeEventListener("popstate", handleCloseSubmission);
80-
};
81-
}, [handleCloseSubmission, handleShowSubmission]);
82-
83-
// Temporary fix for links copied which have submission_id as a query parameter
84-
useEffect(() => {
85-
if (submission_id) router.push(`${router.asPath.split("?")[0]}/${submission_id}`);
86-
}, [router, submission_id]);
34+
const { t } = useTranslation();
8735

8836
const headerPaths = useMemo(() => [t("communities.navigation.challenge")], [t]);
8937

@@ -93,14 +41,14 @@ export default function Submission(props: { pageProps: { currentCommunity: Commu
9341
<>
9442
<Head>
9543
<title>{`${t("communities.submission.title")} ${challenge?.name}`}</title>
96-
<MetaData description={challenge?.description as string} />
44+
<MetaData description={challenge?.description} />
9745
</Head>
9846
<Wrapper paths={headerPaths}>
9947
<div className="flex flex-col py-4 space-y-8 text-gray-700">
10048
<Header title={challenge?.name} subtitle={t("communities.submission.title")} isTeamChallenge={challenge?.isTeamChallenge} isHackathon={challenge?.isHackathon} />
10149
<SubmissionList />
10250
</div>
103-
{showModal && <SubmissionPopup show={showModal} onClose={handleCloseSubmission} submissionId={selectedSubmission?.id} />}
51+
{showPopup && <SubmissionPopup show={showPopup} onClose={handleCloseSubmission} submissionId={selectedSubmission?.id} />}
10452
</Wrapper>
10553
</>
10654
);

src/utilities/Metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const getMetadataTitle = (...args: string[]): string => {
3232
* @returns {MetadataDescription[]}
3333
*/
3434

35-
export const getMetadataDescription = (description: string): MetadataDescription[] => {
35+
export const getMetadataDescription = (description?: string): MetadataDescription[] => {
3636
if (!description) return [];
3737
return [
3838
{

0 commit comments

Comments
 (0)