Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 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];
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