Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/src/assets/reader.svg" />
<link rel="preload" href="/metadata.json" as="fetch" crossorigin="anonymous" />
<link rel="preload" href="https://gp.fluffylabs.dev/metadata.json" as="fetch" crossorigin="anonymous" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Gray Paper Reader</title>

Expand Down
3 changes: 2 additions & 1 deletion src/components/LocationProvider/LocationProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ export function LocationProvider({ children }: ILocationProviderProps) {

const fullVersion =
selectedVersion.length > 0
? Object.keys(metadata.versions).find((version) => version.startsWith(rawParams[VERSION_SEGMENT_INDEX]))
? Object.keys(metadata.versions).find((version) => version.startsWith(rawParams[VERSION_SEGMENT_INDEX])) ??
(metadata.nightly?.hash.startsWith(rawParams[VERSION_SEGMENT_INDEX]) ? metadata.nightly.hash : null)
: null;

if (!fullVersion) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ export const locationParamsToHash = (params: ILocationParams, metadata: IMetadat
? fullVersion.substring(0, SHORT_COMMIT_HASH_LENGTH)
: metadata.versions[metadata.latest]?.hash.substring(0, SHORT_COMMIT_HASH_LENGTH) ?? "";
const versionName =
(fullVersion ? metadata.versions[fullVersion]?.name : metadata.versions[metadata.latest]?.name) ?? "";
(fullVersion
? metadata.versions[fullVersion]?.name ?? (fullVersion === metadata.nightly?.hash ? "nightly" : null)
: metadata.versions[metadata.latest]?.name) ?? "";

const stringifiedParams = [];

Expand Down
35 changes: 17 additions & 18 deletions src/components/MetadataProvider/MetadataProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { type ReactNode, createContext, useContext, useEffect, useMemo, useState } from "react";

const METADATA_HOST = "";
const METADATA_HOST = "https://gp.fluffylabs.dev";
const METADATA_JSON = `${METADATA_HOST}/metadata.json`;
export const LEGACY_READER_HOST = "https://old-graypaper.fluffylabs.dev";

Expand All @@ -13,6 +13,7 @@ export interface IVersionInfo {

export interface IMetadata {
latest: string;
nightly?: IVersionInfo;
versions: {
[key: string]: IVersionInfo;
};
Expand Down Expand Up @@ -57,23 +58,21 @@ export function MetadataProvider({ children }: IMetadataProviderProps) {
fetchMetadata();
}, []);

const context = useMemo<IMetadataContext | null>(
() =>
metadata
? {
metadata,
urlGetters: {
pdf: (version) => `${METADATA_HOST}/graypaper-${version}.pdf`,
synctex: (version) => `${METADATA_HOST}/graypaper-${version}.synctex.json`,
texDirectory: (version) => `${METADATA_HOST}/tex-${version}`,
legacyReaderRedirect: (hash) => {
return `${LEGACY_READER_HOST}/${hash}`;
},
},
}
: null,
[metadata],
);
const context = useMemo<IMetadataContext | null>(() => {
if (!metadata) return null;

const resolveVersion = (version: string) => (version === metadata.nightly?.hash ? "nightly" : version);

return {
metadata,
urlGetters: {
pdf: (version) => `${METADATA_HOST}/graypaper-${resolveVersion(version)}.pdf`,
synctex: (version) => `${METADATA_HOST}/graypaper-${resolveVersion(version)}.synctex.json`,
texDirectory: (version) => `${METADATA_HOST}/tex-${resolveVersion(version)}`,
legacyReaderRedirect: (hash) => `${LEGACY_READER_HOST}/${hash}`,
},
};
}, [metadata]);

if (!context) {
return null;
Expand Down
50 changes: 25 additions & 25 deletions src/components/Version/Version.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@ export function Version() {
const { metadata } = useContext(MetadataContext) as IMetadataContext;
const { locationParams, setLocationParams } = useContext(LocationContext) as ILocationContext;
const { migrateSelection } = useContext(CodeSyncContext) as ICodeSyncContext;
const versions = Object.values(metadata.versions).filter(({ legacy }) => !legacy);
const currentVersionHash = metadata.versions[locationParams.version].hash;
const currentVersion = metadata.versions[locationParams.version];
const versions = [
...Object.values(metadata.versions).filter(({ legacy }) => !legacy),
...(metadata.nightly ? [metadata.nightly] : []),
];
const currentVersion =
metadata.nightly && locationParams.version === metadata.nightly.hash
? metadata.nightly
: metadata.versions[locationParams.version] ?? metadata.versions[metadata.latest];
const currentVersionHash = currentVersion.hash;
const dropdownContentRef = useRef<HTMLDivElement>(null);
const currentItemRef = useRef<HTMLDivElement>(null);

Expand All @@ -42,15 +48,7 @@ export function Version() {
[setLocationParams, locationParams, migrateSelection],
);

const getCurrentVersionLabel = () => {
const date = new Date(currentVersion.date);
const isLatest = currentVersion.hash === metadata.latest;
let label = isLatest ? "Latest" : "v";
if (currentVersion.name) {
label += `: ${currentVersion.name}`;
}
return `${label} ${shortHash(currentVersion.hash)} (${date.toLocaleDateString()})`;
};
const getCurrentVersionLabel = () => getVersionLabel(currentVersion, metadata.latest, metadata.nightly?.hash);

const handleOpenChange = (open: boolean) => {
if (open) {
Expand Down Expand Up @@ -89,7 +87,7 @@ export function Version() {
key={version.hash}
ref={version.hash === currentVersionHash ? currentItemRef : null}
>
<VersionOption version={version} latest={metadata.latest} />
<VersionOption version={version} latest={metadata.latest} nightly={metadata.nightly?.hash} />
</DropdownMenuRadioItem>
))}
</DropdownMenuRadioGroup>
Expand All @@ -103,20 +101,22 @@ export function Version() {
);
}

type VersionOptionProps = { version: IVersionInfo; latest: string };
function VersionOption({ version, latest }: VersionOptionProps) {
type VersionOptionProps = { version: IVersionInfo; latest: string; nightly?: string };
function VersionOption({ version, latest, nightly }: VersionOptionProps) {
return <span className="w-full">{getVersionLabel(version, latest, nightly)}</span>;
}

function getVersionLabel(version: IVersionInfo, latest: string, nightly?: string) {
const date = new Date(version.date);
let latestText = "Latest";
let versionText = "v";
if (version.name) {
latestText += `: ${version.name}`;
versionText += `: ${version.name}`;
const isNightly = version.hash === nightly;
const isLatest = version.hash === latest;

let label = isNightly ? "Nightly" : isLatest ? "Latest" : "v";
if (version.name && !isNightly) {
label += `: ${version.name}`;
}
return (
<span className="w-full">
{version.hash === latest ? latestText : versionText} {shortHash(version.hash)} ({date.toLocaleDateString()})
</span>
);

return `${label} ${shortHash(version.hash)} (${date.toLocaleDateString()})`;
}

function shortHash(h: string) {
Expand Down