diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-03-03 01:03:29 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-03 01:03:29 +0900 |
| commit | 5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e (patch) | |
| tree | 246d32546b846566e3dcbd324cd4054cd9a733b9 /src/server/web | |
| parent | wip: better error handling (diff) | |
| download | sharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.tar.gz sharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.tar.bz2 sharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.zip | |
Bios (#7286)
* wip
* wip
* wip
Diffstat (limited to 'src/server/web')
| -rw-r--r-- | src/server/web/bios.css | 40 | ||||
| -rw-r--r-- | src/server/web/bios.js | 87 | ||||
| -rw-r--r-- | src/server/web/cli.css | 19 | ||||
| -rw-r--r-- | src/server/web/cli.js | 55 | ||||
| -rw-r--r-- | src/server/web/index.ts | 12 | ||||
| -rw-r--r-- | src/server/web/views/bios.pug | 20 | ||||
| -rw-r--r-- | src/server/web/views/cli.pug | 21 |
7 files changed, 254 insertions, 0 deletions
diff --git a/src/server/web/bios.css b/src/server/web/bios.css new file mode 100644 index 0000000000..b0da3ee39b --- /dev/null +++ b/src/server/web/bios.css @@ -0,0 +1,40 @@ +* { + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; +} + +html { + background: #ffb4e1; +} + +main { + background: #dedede; +} +main > .tabs { + padding: 16px; + border-bottom: solid 4px #c3c3c3; +} + +#lsEditor > .adder { + margin: 16px; + padding: 16px; + border: solid 2px #c3c3c3; +} +#lsEditor > .adder > textarea { + display: block; + width: 100%; + min-height: 5em; + box-sizing: border-box; +} +#lsEditor > .record { + padding: 16px; + border-bottom: solid 1px #c3c3c3; +} +#lsEditor > .record > header { + font-weight: bold; +} +#lsEditor > .record > textarea { + display: block; + width: 100%; + min-height: 5em; + box-sizing: border-box; +} diff --git a/src/server/web/bios.js b/src/server/web/bios.js new file mode 100644 index 0000000000..d06dee801a --- /dev/null +++ b/src/server/web/bios.js @@ -0,0 +1,87 @@ +'use strict'; + +window.onload = async () => { + const account = JSON.parse(localStorage.getItem('account')); + const i = account.token; + + const api = (endpoint, data = {}) => { + const promise = new Promise((resolve, reject) => { + // Append a credential + if (i) data.i = i; + + // Send request + fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, { + method: 'POST', + body: JSON.stringify(data), + credentials: 'omit', + cache: 'no-cache' + }).then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }).catch(reject); + }); + + return promise; + }; + + const content = document.getElementById('content'); + + document.getElementById('ls').addEventListener('click', () => { + content.innerHTML = ''; + + const lsEditor = document.createElement('div'); + lsEditor.id = 'lsEditor'; + + const adder = document.createElement('div'); + adder.classList.add('adder'); + const addKeyInput = document.createElement('input'); + const addValueTextarea = document.createElement('textarea'); + const addButton = document.createElement('button'); + addButton.textContent = 'add'; + addButton.addEventListener('click', () => { + localStorage.setItem(addKeyInput.value, addValueTextarea.value); + location.reload(); + }); + + adder.appendChild(addKeyInput); + adder.appendChild(addValueTextarea); + adder.appendChild(addButton); + lsEditor.appendChild(adder); + + for (let i = 0; i < localStorage.length; i++) { + const k = localStorage.key(i); + const record = document.createElement('div'); + record.classList.add('record'); + const header = document.createElement('header'); + header.textContent = k; + const textarea = document.createElement('textarea'); + textarea.textContent = localStorage.getItem(k); + const saveButton = document.createElement('button'); + saveButton.textContent = 'save'; + saveButton.addEventListener('click', () => { + localStorage.setItem(k, textarea.value); + location.reload(); + }); + const removeButton = document.createElement('button'); + removeButton.textContent = 'remove'; + removeButton.addEventListener('click', () => { + localStorage.removeItem(k); + location.reload(); + }); + record.appendChild(header); + record.appendChild(textarea); + record.appendChild(saveButton); + record.appendChild(removeButton); + lsEditor.appendChild(record); + } + + content.appendChild(lsEditor); + }); +}; diff --git a/src/server/web/cli.css b/src/server/web/cli.css new file mode 100644 index 0000000000..07cd27830b --- /dev/null +++ b/src/server/web/cli.css @@ -0,0 +1,19 @@ +* { + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; +} + +html { + background: #ffb4e1; +} + +main { + background: #dedede; +} + +#tl > div { + padding: 16px; + border-bottom: solid 1px #c3c3c3; +} +#tl > div > header { + font-weight: bold; +} diff --git a/src/server/web/cli.js b/src/server/web/cli.js new file mode 100644 index 0000000000..3dff1d4860 --- /dev/null +++ b/src/server/web/cli.js @@ -0,0 +1,55 @@ +'use strict'; + +window.onload = async () => { + const account = JSON.parse(localStorage.getItem('account')); + const i = account.token; + + const api = (endpoint, data = {}) => { + const promise = new Promise((resolve, reject) => { + // Append a credential + if (i) data.i = i; + + // Send request + fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, { + method: 'POST', + body: JSON.stringify(data), + credentials: 'omit', + cache: 'no-cache' + }).then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }).catch(reject); + }); + + return promise; + }; + + document.getElementById('submit').addEventListener('click', () => { + api('notes/create', { + text: document.getElementById('text').value + }).then(() => { + location.reload(); + }); + }); + + api('notes/timeline').then(notes => { + const tl = document.getElementById('tl'); + for (const note of notes) { + const el = document.createElement('div'); + const name = document.createElement('header'); + name.textContent = `${note.user.name} @${note.user.username}`; + const text = document.createElement('div'); + text.textContent = `${note.text}`; + el.appendChild(name); + el.appendChild(text); + tl.appendChild(el); + } + }); +}; diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 8ea7e15751..a1d79100a6 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -376,6 +376,18 @@ router.get('/info', async ctx => { }); }); +router.get('/bios', async ctx => { + await ctx.render('bios', { + version: config.version, + }); +}); + +router.get('/cli', async ctx => { + await ctx.render('cli', { + version: config.version, + }); +}); + const override = (source: string, target: string, depth: number = 0) => [, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/'); diff --git a/src/server/web/views/bios.pug b/src/server/web/views/bios.pug new file mode 100644 index 0000000000..d81a3ee67f --- /dev/null +++ b/src/server/web/views/bios.pug @@ -0,0 +1,20 @@ +doctype html + +html + + head + meta(charset='utf-8') + meta(name='application-name' content='Misskey') + title Misskey BIOS + style + include ../bios.css + script + include ../bios.js + + body + header + h1 Misskey BIOS #{version} + main + div.tabs + button#ls edit local storage + div#content diff --git a/src/server/web/views/cli.pug b/src/server/web/views/cli.pug new file mode 100644 index 0000000000..d2cf7c4335 --- /dev/null +++ b/src/server/web/views/cli.pug @@ -0,0 +1,21 @@ +doctype html + +html + + head + meta(charset='utf-8') + meta(name='application-name' content='Misskey') + title Misskey Cli + style + include ../cli.css + script + include ../cli.js + + body + header + h1 Misskey Cli #{version} + main + div#form + textarea#text + button#submit submit + div#tl |