Files
sharechess/src/persistance/link.ts
Maciej Caderek 5d59275f48 WIP
2022-04-13 02:31:58 +02:00

105 lines
2.2 KiB
TypeScript

import { cleanPGN, compressPGN, decompressPGN } from "../game/PGNHelpers";
import { importFromLichess } from "../imports/importFromLink";
type LinkData = {
pgn: string;
fen: string;
side: "b" | "w";
ply: number;
};
type LinkConfig = {
pgn?: string;
fen?: string;
side?: "b" | "w";
ply?: number;
};
const defaultLinkData = {
pgn: "",
fen: "",
side: "w",
ply: 0,
};
let linkData: LinkData = { ...defaultLinkData } as LinkData;
const link = {
set(data: LinkConfig) {
if (data.fen) {
linkData = { ...defaultLinkData } as LinkData;
linkData.fen = data.fen;
location.hash = `fen/${linkData.fen.replace(/ /g, "_")}`;
return;
}
if (data.pgn) {
linkData = { ...defaultLinkData } as LinkData;
linkData.pgn = compressPGN(data.pgn);
}
if (data.side) {
linkData.side = data.side;
}
if (data.ply !== undefined) {
linkData.ply = data.ply;
}
location.hash = `pgn/${linkData.side}/${linkData.ply}/${linkData.pgn}`;
},
get() {
return location.href;
},
getFENLink(fen: string) {
return `${location.origin}/#fen/${fen.replace(/ /g, "_")}`;
},
async read() {
const [type, ...rest] = location.hash.split("/");
if (/fen/.test(type)) {
linkData = { ...defaultLinkData } as LinkData;
linkData.fen = decodeURI(rest.join("/")).replace(/_/g, " ");
} else if (/pgn/.test(type)) {
const [side, ply, ...pgn] = rest;
linkData.side = side as "w" | "b";
linkData.ply = Number(ply);
linkData.pgn = pgn.join("/");
linkData.fen = "";
} else if (/lid/.test(type)) {
const [side, ply, ...id] = rest;
linkData.side = side as "w" | "b";
linkData.ply = Number(ply);
const result = await importFromLichess(
new URL(`https://lichess.org/${id[0]}`)
);
if (!result.error) {
linkData.pgn = compressPGN(cleanPGN(result.pgn));
linkData.fen = "";
} else {
linkData.pgn = "";
linkData.fen = "";
}
}
return {
pgn: linkData.pgn ? decompressPGN(linkData.pgn) : "",
fen: linkData.fen,
side: linkData.side,
ply: linkData.ply,
};
},
entries() {
return { ...linkData } as LinkData;
},
};
export default link;