summaryrefslogtreecommitdiff
path: root/src/web/app/init.js
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-05-18 05:06:55 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-05-18 05:06:55 +0900
commitc72a07187a6cebeb343fa52201577478cd2c6a6a (patch)
treee6d50b8a986a655f16ecac43e802be4a1cbd9e59 /src/web/app/init.js
parentMerge branch 'master' of https://github.com/syuilo/misskey (diff)
downloadmisskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.tar.gz
misskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.tar.bz2
misskey-c72a07187a6cebeb343fa52201577478cd2c6a6a.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'src/web/app/init.js')
-rw-r--r--src/web/app/init.js186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/web/app/init.js b/src/web/app/init.js
new file mode 100644
index 0000000000..e480b2b774
--- /dev/null
+++ b/src/web/app/init.js
@@ -0,0 +1,186 @@
+/**
+ * App initializer
+ */
+
+"use strict";
+
+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');
+
+/**
+ * APP ENTRY POINT!
+ */
+
+console.info(`Misskey v${VERSION}`);
+
+document.domain = CONFIG.host;
+
+// 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;
+}
+
+// iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
+try {
+ localStorage.setItem('kyoppie', 'yuppie');
+} catch (e) {
+ Storage.prototype.setItem = () => { }; // noop
+}
+
+// クライアントを更新すべきならする
+if (localStorage.getItem('should-refresh') == 'true') {
+ localStorage.removeItem('should-refresh');
+ location.reload(true);
+}
+
+// 更新チェック
+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();
+ });
+ }
+}
+
+// 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
+}