pluto/website/pages/try.html
2018-10-09 11:23:17 +02:00

124 lines
4.3 KiB
HTML

<!doctype html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/lib/codemirror.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/lib/codemirror.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/mode/clojure/clojure.js"></script>
<script src="https://cdn.jsdelivr.net/npm/parinfer@3.12.0/parinfer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/parinfer-codemirror@1.4.2/parinfer-codemirror.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/ipfs/dist/index.min.js"></script>
<script src="https://cdn.rawgit.com/neocotic/qrious/master/dist/qrious.js"></script>
</head>
<body>
<script>
const ipfs = new window.Ipfs();
async function load() {
const buffer = await loadIPFS(ipfs, "QmVkhWzxTM9kmZANcUnzrfrzN5qg3Qh7GqZDQtX1E1JPE4");
return buffer.toString();
}
ipfs.once("ready", async () => {
const content = await load();
codeMirror.setValue(content);
})
function extensionLink(hash) {
return "https://get.status.im/extension/ipfs@" + hash;
}
async function loadIPFS(ipfs, hash) {
return ipfs.files.cat(hash);
}
async function publish() {
const content = codeMirror.getValue();
const filesAdded = await uploadIPFS(ipfs, content);
displayQR(extensionLink(filesAdded[0].hash));
}
function clearErrors() {
const elErrors = document.getElementById("errors");
elErrors.innerHTML = '';
elErrors.className = "";
}
function displayErrors(errors) {
const elErrors = document.getElementById("errors");
if (errors == null) {
elErrors.innerHTML = '<div>No errors</div>';
elErrors.classList.add("ok");
} else {
elErrors.classList.add("errors");
let names = errors.map( (error, i) => {
return [error.type, error.value]
})
var s = '<div>Errors</div><ul>';
names.forEach(function(element) {
s = s.concat("<li>" + element[0]);
if (element[1] != null) {
s = s.concat(":" + JSON.stringify(element[1]));
}
s = s.concat("</li>");
});
s = s.concat("</ul>")
elErrors.innerHTML = s;
}
}
function uploadIPFS(ipfs, s) {
return ipfs.files.add({path: 'extension.edn',
content: ipfs.types.Buffer.from(s, 'utf8')})
}
function clearQR() {
const qel = document.getElementById("qr-wrapper");
qel.innerHTML = '';
}
function displayQR(s) {
const qel = document.getElementById("qr-wrapper");
qel.innerHTML = '<canvas id="qr"></canvas><a href="' + s + '">Universal link</a>';
new QRious({
element: document.getElementById('qr'),
value: s,
size: 250
});
}
</script>
<div id="wrapper">
<main>
<div id="content"></div>
<div id="errors"></div>
</main>
<aside id="panel">
<p>A playground to experiment with extensions and easily publish them on IPFS. <br /> Go ahead, modify the default extension on the left side!</p>
<p>Find more details about building your own extension in this <a href="https://docs.status.im/docs/extensions_tutorial_chat_command.html">tutorial</a></p>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" onclick="publish()">Publish</button>
<div id="qr-wrapper"></div>
</aside>
</div>
<script>
const codeMirror = CodeMirror(document.getElementById("content"));
codeMirror.setValue("Loading content ...");
codeMirror.on("change", function(c, change) {
clearErrors();
clearQR();
const read = pluto.reader.read(codeMirror.getValue());
const readJS = pluto.js.from_clj(read);
displayErrors(readJS.errors);
if (readJS.errors == null) {
const parsed = pluto.js.parse(read);
const parsedJS = pluto.js.from_clj(parsed);
displayErrors(parsedJS.errors);
}
});
parinferCodeMirror.init(codeMirror);
</script>
</body>
</html>