Skip to content

Commit

Permalink
fix: render codesandbox ci on the client (#73)
Browse files Browse the repository at this point in the history
* fix: render codesandbox ci on the client

* fix minor check
  • Loading branch information
CompuIves authored May 20, 2024
1 parent 4fcfd1e commit 6038c93
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 104 deletions.
163 changes: 97 additions & 66 deletions components/StatusPage.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
import React, { useEffect } from "react";
import styled from "styled-components";
import { useRouter } from "next/router";
import JavascriptTimeAgo from "javascript-time-ago";
'use client';

import React, { useEffect, useState } from 'react';
import styled from 'styled-components';
import { useRouter } from 'next/router';
import JavascriptTimeAgo from 'javascript-time-ago';
// The desired locales.
import en from "javascript-time-ago/locale/en";

import { HEADER_HEIGHT } from "./Header";
import { StatusListItem } from "./StatusListItem";
import { StatusList } from "./StatusList";
import { Details } from "./Details";
import { IPR, IBuild, getPrs, getBuilds, getPr } from "../utils/api";
import { Layout } from "./Layout";
import { SkeletonStatusPage } from "./SkeletonStatusPage";
import { useGlobalState } from "../utils/state";
import { colors } from "../theme/colors";
import en from 'javascript-time-ago/locale/en';

import { HEADER_HEIGHT } from './Header';
import { StatusListItem } from './StatusListItem';
import { StatusList } from './StatusList';
import { Details } from './Details';
import { IPR, IBuild, getPrs, getBuilds, getPr } from '../utils/api';
import { Layout } from './Layout';
import { SkeletonStatusPage } from './SkeletonStatusPage';
import { useGlobalState } from '../utils/state';
import { colors } from '../theme/colors';
import {
LEARN_MORE_DOCUMENT_URL,
INSTALL_GITHUB_URL
} from "../utils/constants";
import { BUILD_LINK, buildLink, PR_LINK, prLink } from "../utils/url";
import { SetupPage } from "./SetupPage";
import { Button } from "./_elements";
INSTALL_GITHUB_URL,
} from '../utils/constants';
import { BUILD_LINK, buildLink, PR_LINK, prLink } from '../utils/url';
import { SetupPage } from './SetupPage';
import { Button } from './_elements';
import { useParams } from 'next/navigation';

// Initialize the desired locales.
JavascriptTimeAgo.locale(en);
JavascriptTimeAgo.addLocale(en);

type WrapperProps = {
selectedPr?: string | string[];
Expand All @@ -44,22 +47,22 @@ const ErrorMessage = styled.p`
const WrapperPRS = styled.div<WrapperProps>`
@media screen and (max-width: 768px) {
display: ${props =>
props.selectedPr || props.selectedBuild ? "none" : "block"};
props.selectedPr || props.selectedBuild ? 'none' : 'block'};
width: 100%;
}
`;

const WrapperBuilds = styled.div<WrapperProps>`
@media screen and (max-width: 768px) {
display: ${props =>
!props.selectedPr || props.selectedBuild ? "none" : "block"};
!props.selectedPr || props.selectedBuild ? 'none' : 'block'};
width: 100%;
}
`;

const WrapperDetails = styled.div<WrapperProps>`
@media screen and (max-width: 768px) {
display: ${props => (!props.selectedBuild ? "none" : "block")};
display: ${props => (!props.selectedBuild ? 'none' : 'block')};
}
width: 100%;
overflow: hidden;
Expand All @@ -86,9 +89,9 @@ const StatusPage = ({
builds,
notFound,
showSetup,
error
error,
}: StatusPageProps) => {
const [statePrs, setPrs] = useGlobalState("prs");
const [statePrs, setPrs] = useGlobalState('prs');
const usedPrs = statePrs || prs;
const { query: params } = useRouter();

Expand All @@ -104,9 +107,9 @@ const StatusPage = ({
return (
<SkeletonStatusPage>
<ErrorMessage>
{typeof error === "string"
{typeof error === 'string'
? error
: "We could not find the repository you were looking for, have you installed the GitHub App?"}
: 'We could not find the repository you were looking for, have you installed the GitHub App?'}
</ErrorMessage>

<Button href={INSTALL_GITHUB_URL}>Install GitHub App</Button>
Expand Down Expand Up @@ -178,7 +181,7 @@ const StatusPage = ({
selected={pr.number === selectedPrNumber}
link={{
href: PR_LINK,
as: prLink(username, repo, pr.number)
as: prLink(username, repo, pr.number),
}}
/>
))}
Expand All @@ -199,7 +202,7 @@ const StatusPage = ({
selected={build.id === selectedBuildId}
link={{
href: BUILD_LINK,
as: buildLink(username, repo, selectedPrNumber, build.id)
as: buildLink(username, repo, selectedPrNumber, build.id),
}}
/>
))}
Expand All @@ -221,46 +224,76 @@ const StatusPage = ({
);
};

export const ClientSideStatusPage = () => {
const [data, setData] = useState(undefined);
const { query: params } = useRouter();

useEffect(() => {
if (!params.username) {
return;
}

fetchData(params).then(data => {
setData(data);
});
}, [params]);

if (!data) {
return;
}

if (data.notFound) {
// @ts-expect-error
return <StatusPage notFound />;
}

if (data.error) {
// @ts-expect-error
return <StatusPage error={data.error} />;
}

return <StatusPage {...data.props} />;
};

function getTitle(username: string, repo: string, buildId?: number) {
let title = `${username}/${repo}`;

if (typeof buildId !== "undefined") {
if (typeof buildId !== 'undefined') {
title += ` #${buildId}`;
}

return title;
}

StatusPage.getInitialProps = async ({
query,
res
}): Promise<
{ title?: string } & (
| StatusPageProps
| { notFound: true; error?: string }
| { showSetup: true }
| { error: true })
> => {
export const getServerSideProps = async ({ query, res }) => {
return fetchData(query, res);
};

export const fetchData = async (query, res = undefined) => {
try {
const { username, repo } = query;

if (!username) {
throw new Error("Please define a username");
if (!username || Array.isArray(username)) {
throw new Error('Please define a username');
}

if (!repo) {
throw new Error("Please define a repo");
if (!repo || Array.isArray(repo)) {
throw new Error('Please define a repo');
}

const { prs } = await getPrs(username, repo);

if (prs.length === 0) {
// No PRs have been registered yet

return { showSetup: true, title: "CodeSandbox CI Installed" };
return { showSetup: true, title: 'CodeSandbox CI Installed' };
}

let prNumber = query.prNumber;
let prNumber =
query.prNumber && !Array.isArray(query.prNumber)
? +query.prNumber
: undefined;

if (!prNumber) {
prNumber = prs[0].number;
}
Expand All @@ -274,16 +307,15 @@ StatusPage.getInitialProps = async ({
} catch (e) {
return {
notFound: true,
error: "We could not find the PR you were looking for"
error: 'We could not find the PR you were looking for',
};
}
prs.unshift(selectedPR);
}
let buildId = query.buildId;
if (!buildId) {
buildId = selectedPR.latestBuildId;
}
buildId = +buildId;
let buildId =
query.buildId && !Array.isArray(query.buildId)
? +query.buildId
: selectedPR.latestBuildId;

const { builds } = await getBuilds(username, repo, prNumber);

Expand All @@ -302,31 +334,30 @@ StatusPage.getInitialProps = async ({
repo,
selectedPR.number,
selectedPR.latestBuild.id
)
),
});
res.end();
return;
}
}

return {
username,
repo,
prs,
builds,
selectedPrNumber: prNumber,
selectedBuildId: buildId,
title: getTitle(username, repo, buildId)
props: {
username,
repo,
prs,
builds,
selectedPrNumber: prNumber,
selectedBuildId: buildId,
title: getTitle(username, repo, buildId),
},
};
} catch (e) {
console.error(e);
if (e.response) {
if (res) {
res.status = e.response.status;
}

if (e.response) {
if (e.response.status === 404) {
return { notFound: true, title: "Not Found" };
return { notFound: true, title: 'Not Found' };
} else {
return { error: true };
}
Expand Down
4 changes: 2 additions & 2 deletions components/TimeAgo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ interface Props {
}

export const TimeAgo = ({ date, ...props }: Props) => (
<span title={new Date(date).toString()}>
<ReactTimeAgo date={date} {...props} />
<span suppressHydrationWarning title={new Date(date).toString()}>
<ReactTimeAgo suppressHydrationWarning date={date} {...props} />
</span>
);
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"amplitude-js": "^5.6.0",
"ansi-to-react": "^5.0.0",
"axios": "^0.28.0",
"javascript-time-ago": "^2.5.10",
"lru-cache": "^5.1.1",
"next": "^14.0.0",
"nprogress": "^0.2.0",
Expand All @@ -27,7 +28,8 @@
"react-time-ago": "^7.2.1",
"react-virtualized-auto-sizer": "^1.0.2",
"react-window": "^1.8.5",
"styled-components": "^6.1.0"
"styled-components": "^6.1.0",
"swr": "^2.2.5"
},
"devDependencies": {
"@types/amplitude-js": "^4.4.5",
Expand Down
9 changes: 7 additions & 2 deletions pages/status/[username]/[repo]/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import { StatusPage } from '../../../../components/StatusPage';
import {
StatusPage,
ClientSideStatusPage,
getServerSideProps,
} from '../../../../components/StatusPage';

export default StatusPage;
// export { getServerSideProps };
export default ClientSideStatusPage;
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import { StatusPage } from '../../../../../../../../components/StatusPage';
import {
StatusPage,
ClientSideStatusPage,
getServerSideProps,
} from '../../../../../../../../components/StatusPage';

export default StatusPage;
// export { getServerSideProps };
export default ClientSideStatusPage;
9 changes: 7 additions & 2 deletions pages/status/[username]/[repo]/pr/[prNumber]/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import { StatusPage } from '../../../../../../components/StatusPage';
import {
StatusPage,
ClientSideStatusPage,
getServerSideProps,
} from '../../../../../../components/StatusPage';

export default StatusPage;
// export { getServerSideProps };
export default ClientSideStatusPage;
2 changes: 1 addition & 1 deletion utils/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ export async function getPrs(
export async function getPr(
username: string,
repo: string,
pr: string
pr: number
): Promise<IPRResponse> {
const key = `${username}/${repo}/${pr}`;
let prPromise = prCache.get(key);
Expand Down
Loading

0 comments on commit 6038c93

Please sign in to comment.