diff --git a/src/web/app/common/mios.ts b/src/web/app/common/mios.ts index 6cc441cd1d..3701a24c30 100644 --- a/src/web/app/common/mios.ts +++ b/src/web/app/common/mios.ts @@ -27,7 +27,7 @@ export type API = { dialog: (opts: { title: string; text: string; - actions: Array<{ + actions?: Array<{ text: string; id?: string; }>; diff --git a/src/web/app/common/scripts/check-for-update.ts b/src/web/app/common/scripts/check-for-update.ts index fe539407da..3e7eb79d8b 100644 --- a/src/web/app/common/scripts/check-for-update.ts +++ b/src/web/app/common/scripts/check-for-update.ts @@ -1,8 +1,8 @@ import MiOS from '../mios'; import { version } from '../../config'; -export default async function(mios: MiOS) { - const meta = await mios.getMeta(); +export default async function(mios: MiOS, force = false, silent = false) { + const meta = await mios.getMeta(force); if (meta.version != version) { localStorage.setItem('should-refresh', 'true'); @@ -20,6 +20,12 @@ export default async function(mios: MiOS) { console.error(e); } - alert('%i18n:common.update-available%'.replace('{newer}', meta.version).replace('{current}', version)); + if (!silent) { + alert('%i18n:common.update-available%'.replace('{newer}', meta.version).replace('{current}', version)); + } + + return meta.version; + } else { + return null; } } diff --git a/src/web/app/common/views/components/index.ts b/src/web/app/common/views/components/index.ts index ab0f1767d4..5274920228 100644 --- a/src/web/app/common/views/components/index.ts +++ b/src/web/app/common/views/components/index.ts @@ -20,6 +20,7 @@ import messagingRoom from './messaging-room.vue'; import urlPreview from './url-preview.vue'; import twitterSetting from './twitter-setting.vue'; import fileTypeIcon from './file-type-icon.vue'; +import Switch from './switch.vue'; Vue.component('mk-signin', signin); Vue.component('mk-signup', signup); @@ -41,3 +42,4 @@ Vue.component('mk-messaging-room', messagingRoom); Vue.component('mk-url-preview', urlPreview); Vue.component('mk-twitter-setting', twitterSetting); Vue.component('mk-file-type-icon', fileTypeIcon); +Vue.component('mk-switch', Switch); diff --git a/src/web/app/common/views/components/switch.vue b/src/web/app/common/views/components/switch.vue new file mode 100644 index 0000000000..fc12e00540 --- /dev/null +++ b/src/web/app/common/views/components/switch.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/web/app/desktop/views/components/dialog.vue b/src/web/app/desktop/views/components/dialog.vue index 28f22f7b62..e89e8654e6 100644 --- a/src/web/app/desktop/views/components/dialog.vue +++ b/src/web/app/desktop/views/components/dialog.vue @@ -16,21 +16,28 @@ import Vue from 'vue'; import * as anime from 'animejs'; export default Vue.extend({ - props: ['title', 'text', 'buttons', 'modal']/*{ + props: { title: { - type: String + type: String, + required: false }, text: { - type: String + type: String, + required: true }, buttons: { - type: Array + type: Array, + default: () => { + return [{ + text: 'OK' + }]; + } }, modal: { type: Boolean, default: false } - }*/, + }, mounted() { this.$nextTick(() => { (this.$refs.bg as any).style.pointerEvents = 'auto'; diff --git a/src/web/app/desktop/views/components/settings.profile.vue b/src/web/app/desktop/views/components/settings.profile.vue index 218da67e81..b57ac10287 100644 --- a/src/web/app/desktop/views/components/settings.profile.vue +++ b/src/web/app/desktop/views/components/settings.profile.vue @@ -24,7 +24,7 @@

その他

- +
diff --git a/src/web/app/desktop/views/components/settings.vue b/src/web/app/desktop/views/components/settings.vue index b65623e33a..4a9db5f48b 100644 --- a/src/web/app/desktop/views/components/settings.vue +++ b/src/web/app/desktop/views/components/settings.vue @@ -20,10 +20,18 @@

デザイン

-
+
- + +
+ +
+

キャッシュ

+ +
+

%fa:info-circle%クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。

+
@@ -66,6 +74,28 @@
+
+

Misskey Update

+

+ バージョン: {{ version }} + +

+ +
+ +
+

高度な設定

+ + この設定はアカウントに保存されません。 + +
+

%i18n:desktop.tags.mk-settings.license%

@@ -82,7 +112,8 @@ import XMute from './settings.mute.vue'; import XPassword from './settings.password.vue'; import X2fa from './settings.2fa.vue'; import XApi from './settings.api.vue'; -import { docsUrl, license, lang } from '../../../config'; +import { docsUrl, license, lang, version } from '../../../config'; +import checkForUpdate from '../../../common/scripts/check-for-update'; export default Vue.extend({ components: { @@ -96,9 +127,18 @@ export default Vue.extend({ return { page: 'profile', license, - showPostFormOnTopOfTl: false + version, + latestVersion: undefined, + checkingForUpdate: false, + showPostFormOnTopOfTl: false, + debug: localStorage.getItem('debug') == 'true' }; }, + watch: { + debug() { + localStorage.setItem('debug', this.debug ? 'true' : 'false'); + } + }, computed: { licenseUrl(): string { return `${docsUrl}/${lang}/license`; @@ -117,6 +157,31 @@ export default Vue.extend({ name: 'showPostFormOnTopOfTl', value: this.showPostFormOnTopOfTl }); + }, + checkForUpdate() { + this.checkingForUpdate = true; + checkForUpdate((this as any).os, true, true).then(newer => { + this.checkingForUpdate = false; + this.latestVersion = newer; + if (newer == null) { + (this as any).apis.dialog({ + title: '利用可能な更新はありません', + text: 'お使いのMisskeyは最新です。' + }); + } else { + (this as any).apis.dialog({ + title: '新しいバージョンが利用可能です', + text: 'ページを再度読み込みすると更新が適用されます。' + }); + } + }); + }, + clean() { + localStorage.clear(); + (this as any).apis.dialog({ + title: 'キャッシュを削除しました', + text: 'ページを再度読み込みしてください。' + }); } } }); @@ -184,7 +249,7 @@ export default Vue.extend({ border-bottom solid 1px #eee > .web - > div + > .div border-bottom solid 1px #eee padding 0 0 16px 0 margin 0 0 16px 0