diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-05-18 05:06:55 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-05-18 05:06:55 +0900 |
| commit | c72a07187a6cebeb343fa52201577478cd2c6a6a (patch) | |
| tree | e6d50b8a986a655f16ecac43e802be4a1cbd9e59 /src/web/app/boot.js | |
| parent | Merge branch 'master' of https://github.com/syuilo/misskey (diff) | |
| download | misskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.tar.gz misskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.tar.bz2 misskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.zip | |
なんかもうめっちゃ変えた
Diffstat (limited to 'src/web/app/boot.js')
| -rw-r--r-- | src/web/app/boot.js | 197 |
1 files changed, 23 insertions, 174 deletions
diff --git a/src/web/app/boot.js b/src/web/app/boot.js index 242df13c77..4df44ed793 100644 --- a/src/web/app/boot.js +++ b/src/web/app/boot.js @@ -1,186 +1,35 @@ /** - * boot loader + * MISSKEY ENTRY POINT */ -"use strict"; +const Url = new URL(location.href); -import * as riot from 'riot'; -import api from './common/scripts/api'; -import signout from './common/scripts/signout'; -import checkForUpdate from './common/scripts/check-for-update'; -import mixin from './common/mixins'; -import generateDefaultUserdata from './common/scripts/generate-default-userdata'; -import CONFIG from './common/scripts/config'; -require('./common/tags'); +let app = Url.host.split('.')[0]; -/** - * MISSKEY ENTRY POINT! - */ - -console.info(`Misskey v${VERSION}`); - -document.domain = CONFIG.host; +// Detect user language +let lang = navigator.language.split('-')[0]; +if (!/^(en|ja)$/.test(lang)) lang = 'en'; -// Set global configuration -riot.mixin({ CONFIG }); - -// ↓ NodeList、HTMLCollection、FileList、DataTransferItemListで forEach を使えるようにする -if (NodeList.prototype.forEach === undefined) { - NodeList.prototype.forEach = Array.prototype.forEach; -} -if (HTMLCollection.prototype.forEach === undefined) { - HTMLCollection.prototype.forEach = Array.prototype.forEach; -} -if (FileList.prototype.forEach === undefined) { - FileList.prototype.forEach = Array.prototype.forEach; -} -if (window.DataTransferItemList && DataTransferItemList.prototype.forEach === undefined) { - DataTransferItemList.prototype.forEach = Array.prototype.forEach; -} +// Detect user agent +const ua = navigator.userAgent.toLowerCase(); +const isMobile = /mobile|iphone|ipad|android/.test(ua); -// iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする -try { - localStorage.setItem('kyoppie', 'yuppie'); -} catch (e) { - Storage.prototype.setItem = () => { }; // noop -} +const head = document.getElementsByTagName('head')[0]; -// クライアントを更新すべきならする -if (localStorage.getItem('should-refresh') == 'true') { - localStorage.removeItem('should-refresh'); - location.reload(true); +if (isMobile) { + const meta = document.createElement('meta'); + meta.setAttribute('name', 'viewport'); + meta.setAttribute('content', 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no'); + head.appendChild(meta); } -// 更新チェック -setTimeout(checkForUpdate, 3000); - -// ユーザーをフェッチしてコールバックする -export default callback => { - // Get cached account data - let cachedMe = JSON.parse(localStorage.getItem('me')); - - if (cachedMe) { - fetched(cachedMe); - - // 後から新鮮なデータをフェッチ - fetchme(cachedMe.token, freshData => { - Object.assign(cachedMe, freshData); - cachedMe.trigger('updated'); - }); - } else { - // Get token from cookie - const i = (document.cookie.match(/i=(!\w+)/) || [null, null])[1]; - - fetchme(i, fetched); - } - - // フェッチが完了したとき - function fetched(me) { - if (me) { - riot.observable(me); - - // この me オブジェクトを更新するメソッド - me.update = data => { - if (data) Object.assign(me, data); - me.trigger('updated'); - }; - - // ローカルストレージにキャッシュ - localStorage.setItem('me', JSON.stringify(me)); - - me.on('updated', () => { - // キャッシュ更新 - localStorage.setItem('me', JSON.stringify(me)); - }); - } - - // ミックスイン初期化 - mixin(me); - - // ローディング画面クリア - const ini = document.getElementById('ini'); - ini.parentNode.removeChild(ini); - - // アプリ基底要素マウント - const app = document.createElement('div'); - app.setAttribute('id', 'app'); - document.body.appendChild(app); - - try { - callback(me); - } catch (e) { - panic(e); - } - } -}; - -// ユーザーをフェッチしてコールバックする -function fetchme(token, cb) { - let me = null; - - // Return when not signed in - if (token == null) { - return done(); - } - - // Fetch user - fetch(`${CONFIG.apiUrl}/i`, { - method: 'POST', - body: JSON.stringify({ - i: token - }) - }).then(res => { // When success - // When failed to authenticate user - if (res.status !== 200) { - return signout(); - } - - res.json().then(i => { - me = i; - me.token = token; - - // initialize it if user data is empty - me.data ? done() : init(); - }); - }, () => { // When failure - // Display error screen - riot.mount(document.body.appendChild( - document.createElement('mk-error'))); - }); - - function done() { - if (cb) cb(me); - } - - // Initialize user data - function init() { - const data = generateDefaultUserdata(); - api(token, 'i/appdata/set', { - data - }).then(() => { - me.data = data; - done(); - }); - } +if (app == 'misskey') { + app = isMobile ? 'mobile' : 'desktop'; } -// BSoD -function panic(e) { - console.error(e); - - // Display blue screen - document.body.innerHTML = - `<div id="error"> - <h1>:( 致命的な問題が発生しました。</h1> - <p>お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。</p> - <hr> - <p>エラーコード: ${e.toString()}</p> - <p>ブラウザ バージョン: ${navigator.userAgent}</p> - <p>クライアント バージョン: ${VERSION}</p> - <hr> - <p>問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。</p> - <p>Thank you for using Misskey.</p> - </div>`; - - // TODO: Report the bug -} +// Load app script +const script = document.createElement('script'); +script.setAttribute('src', `/assets/${app}.${VERSION}.${lang}.js`); +script.setAttribute('async', 'true'); +script.setAttribute('defer', 'true'); +head.appendChild(script); |