-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMetadataProvider.tsx
More file actions
84 lines (71 loc) · 2.15 KB
/
MetadataProvider.tsx
File metadata and controls
84 lines (71 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { type ReactNode, createContext, useContext, useEffect, useMemo, useState } from "react";
const METADATA_HOST = "";
const METADATA_JSON = `${METADATA_HOST}/metadata.json`;
export const LEGACY_READER_HOST = "https://old-graypaper.fluffylabs.dev";
export interface IVersionInfo {
hash: string;
date: string;
name?: string;
legacy?: boolean;
}
export interface IMetadata {
latest: string;
nightly: IVersionInfo;
versions: {
[key: string]: IVersionInfo;
};
}
export interface IMetadataContext {
metadata: IMetadata;
urlGetters: {
pdf: (version: string) => string;
synctex: (version: string) => string;
texDirectory: (version: string) => string;
legacyReaderRedirect: (hash: string) => string;
};
}
interface IMetadataProviderProps {
children: ReactNode;
}
export const MetadataContext = createContext<IMetadataContext | null>(null);
export const useMetadataContext = () => {
const context = useContext(MetadataContext);
if (!context) {
throw new Error("useMetadataContext must be used within a MetadataProvider");
}
return context;
};
export function MetadataProvider({ children }: IMetadataProviderProps) {
const [metadata, setMetadata] = useState<IMetadata>();
useEffect(() => {
const fetchMetadata = async () => {
try {
setMetadata((await (await fetch(METADATA_JSON)).json()) as IMetadata);
} catch (e) {
console.error("Couldn't load metadata.", e);
}
};
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],
);
if (!context) {
return null;
}
return <MetadataContext.Provider value={context}>{children}</MetadataContext.Provider>;
}