-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathlocationParamsToHash.ts
More file actions
51 lines (44 loc) · 1.89 KB
/
locationParamsToHash.ts
File metadata and controls
51 lines (44 loc) · 1.89 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
import type { IMetadataContext } from "../../MetadataProvider/MetadataProvider";
import type { ILocationParams, SearchParams } from "../types";
import {
SEGMENT_SEPARATOR,
SELECTION_SEGMENT_INDEX,
SHORT_COMMIT_HASH_LENGTH,
VERSION_SEGMENT_INDEX,
} from "./constants";
import { encodePageNumberAndIndex } from "./encodePageNumberAndIndex";
export const locationParamsToHash = (params: ILocationParams, metadata: IMetadataContext["metadata"]) => {
const fullVersion = params.version;
const version = fullVersion
? 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 ?? (fullVersion === metadata.nightly?.hash ? "nightly" : null)
: metadata.versions[metadata.latest]?.name) ?? "";
const stringifiedParams = [];
stringifiedParams[VERSION_SEGMENT_INDEX] = version;
if (params.selectionStart && params.selectionEnd) {
stringifiedParams[SELECTION_SEGMENT_INDEX] = [
encodePageNumberAndIndex(params.selectionStart.pageNumber, params.selectionStart.index),
encodePageNumberAndIndex(params.selectionEnd.pageNumber, params.selectionEnd.index),
].join("");
}
// we never put search/section to the URL,
// yet we keep them in `locationParams`.
const finalParamsToSerialize: SearchParams = {
v: versionName,
rest: `${SEGMENT_SEPARATOR}${stringifiedParams.join(SEGMENT_SEPARATOR)}`,
};
return serializeSearchParams(finalParamsToSerialize);
};
function serializeSearchParams({ rest, ...searchParams }: SearchParams) {
const search = [];
for (const key of Object.keys(searchParams)) {
const val = searchParams[key as keyof typeof searchParams];
if (val) {
search.push(`${key}=${encodeURIComponent(val)}`);
}
}
return `${rest}${search.length > 0 ? `?${search.join("&")}` : ""}`;
}