Files
sharechess/src/board/loaders/PiecesCache.ts
2022-04-25 17:05:30 +02:00

58 lines
1.4 KiB
TypeScript

import { PieceType, PieceColor } from "../../types";
import {
PiecesStyle,
pieceNames,
PieceName,
} from "../styles-pieces/piecesStyles";
import loadImage from "./loadImage";
let style: PiecesStyle | null = null;
let piecesImages: Map<string, HTMLImageElement> = new Map();
const PiecesCache = {
async load(piecesSetName: PiecesStyle) {
await Promise.all(
pieceNames.map((key) => {
const src = `/pieces/${piecesSetName}/${key}.svg`;
return loadImage(src).then((img) => {
piecesImages.set(key, img);
});
})
);
},
async get(
piecesSetName: PiecesStyle,
pieceName: PieceType,
pieceColor: PieceColor
) {
if (style !== piecesSetName) {
await this.load(piecesSetName);
style = piecesSetName;
}
const piece = `${pieceName}${pieceColor}` as PieceName;
return piecesImages.get(piece) as HTMLImageElement;
},
async getDataURLs() {
return Promise.all(
[...piecesImages.entries()].map(
async ([key, img]: [string, HTMLImageElement]) => {
let blob = await fetch(img.src).then((r) => r.blob());
let dataUrl = await new Promise((resolve) => {
let reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.readAsDataURL(blob);
});
return [key, dataUrl];
}
)
);
},
};
export default PiecesCache;