ruffle/web/packages/demo/www/index.js

135 lines
3.9 KiB
JavaScript

import "./index.css";
const { SourceAPI, PublicAPI } = require("ruffle-core");
window.RufflePlayer = PublicAPI.negotiate(
window.RufflePlayer,
"local",
new SourceAPI("local")
);
let ruffle;
let player;
const container = document.getElementById("main");
const overlay = document.getElementById("overlay");
const authorContainer = document.getElementById("author-container");
const author = document.getElementById("author");
const sampleFileInputContainer = document.getElementById(
"sample-swfs-container"
);
const sampleFileInput = document.getElementById("sample-swfs");
const localFileInput = document.getElementById("local-file");
const animOptGroup = document.getElementById("anim-optgroup");
const gamesOptGroup = document.getElementById("games-optgroup");
// Default config used by the player.
const config = {
letterbox: "on",
logLevel: "warn",
};
window.addEventListener("DOMContentLoaded", async () => {
ruffle = window.RufflePlayer.newest();
player = ruffle.createPlayer();
player.id = "player";
container.append(player);
const response = await fetch("swfs.json");
if (!response.ok) {
sampleFileInputContainer.style.display = "none";
return;
}
const data = await response.json();
for (const swfData of data.swfs) {
const option = document.createElement("option");
option.textContent = swfData.title;
option.value = swfData.location;
option.swfData = swfData;
switch (swfData.type) {
case "Animation":
animOptGroup.append(option);
break;
case "Game":
gamesOptGroup.append(option);
break;
}
}
sampleFileInputContainer.style.display = "inline-block";
const initialFile = new URLSearchParams(window.location.search).get("file");
if (initialFile) {
const options = Array.from(sampleFileInput.options);
sampleFileInput.selectedIndex = Math.max(
options.findIndex((swfData) => swfData.value.endsWith(initialFile)),
0
);
} else {
// Load a random file.
sampleFileInput.selectedIndex =
Math.floor(Math.random() * data.swfs.length) + 1;
}
sampleFileSelected();
});
window.addEventListener("load", () => {
overlay.style.display = "block";
});
sampleFileInput.addEventListener("change", sampleFileSelected);
localFileInput.addEventListener("change", (event) => {
loadFile(event.target.files[0]);
});
container.addEventListener("dragenter", () => {
overlay.classList.add("drag");
});
container.addEventListener("dragleave", () => {
overlay.classList.remove("drag");
});
container.addEventListener("dragover", (event) => {
event.stopPropagation();
event.preventDefault();
});
container.addEventListener("drop", (event) => {
event.stopPropagation();
event.preventDefault();
overlay.classList.remove("drag");
loadFile(event.dataTransfer.files[0]);
});
function sampleFileSelected() {
const swfData = sampleFileInput[sampleFileInput.selectedIndex].swfData;
if (swfData) {
authorContainer.style.display = "block";
author.textContent = swfData.author;
author.href = swfData.authorLink;
localFileInput.value = null;
player.load({ url: swfData.location, ...config });
} else {
if (player) {
player.remove();
}
player = ruffle.createPlayer();
player.id = "player";
container.append(player);
authorContainer.style.display = "none";
author.textContent = "";
author.href = "";
}
}
async function loadFile(file) {
if (!file) {
return;
}
sampleFileInput.selectedIndex = 0;
authorContainer.style.display = "none";
author.textContent = "";
author.href = "";
const data = await new Response(file).arrayBuffer();
player.load({ data, ...config });
}