diff --git a/package-lock.json b/package-lock.json index e4a1bf7..d98005c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4680,14 +4680,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4702,20 +4700,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4832,8 +4827,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4845,7 +4839,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4860,7 +4853,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4868,14 +4860,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4894,7 +4884,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -4975,8 +4964,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4988,7 +4976,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5110,7 +5097,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -12258,6 +12244,16 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vuex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.0.tgz", + "integrity": "sha512-mdHeHT/7u4BncpUZMlxNaIdcN/HIt1GsGG5LKByArvYG/v6DvHcOxvDCts+7SRdCoIRGllK8IMZvQtQXLppDYg==" + }, + "vuex-module-decorators": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-0.9.8.tgz", + "integrity": "sha512-yyh9+0mO7NYZxw5BlXWNA/lHioVOUL0muDpJPL9ssAvje2PHQfFSOCSridK4vA3HasjyaGRtTPJKH7+7UCcpwg==" + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", diff --git a/package.json b/package.json index 631709b..03c3aed 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "vue": "^2.6.10", "vue-chartjs": "^3.4.2", "vue-class-component": "^6.0.0", - "vue-property-decorator": "^7.0.0" + "vue-property-decorator": "^7.0.0", + "vuex": "^3.1.0", + "vuex-module-decorators": "^0.9.8" }, "devDependencies": { "@vue/cli-plugin-typescript": "^3.0.3", diff --git a/src/App.vue b/src/App.vue index 5ecda15..310f4e8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -32,10 +32,10 @@ import { Component, Vue } from 'vue-property-decorator' import { Selectable } from './helpers/lists/Selectable' import LocalStorageHandler from './helpers/storage/LocalStorageHandler' -import DiscordVue from './services/discord/Discord.vue' -import MastodonVue from './services/mastodon/Mastodon.vue' -import NextcloudNewsVue from './services/nextcloud/NextcloudNews.vue' -import OpenWeatherMapVue from './services/openweathermap/OpenWeatherMap.vue' +import Discord from './services/discord/Discord.vue' +import Mastodon from './services/mastodon/Mastodon.vue' +import NextcloudNews from './services/nextcloud/NextcloudNews.vue' +import OpenWeatherMap from './services/openweathermap/OpenWeatherMap.vue' import { Auth, Layout, Rect, Service, serviceKey, tileKey } from './types/App' import * as Events from './types/Events' @@ -50,14 +50,7 @@ function saveAuth(auth: Auth) { return res } -@Component({ - components: { - mastodon: MastodonVue, - 'nextcloud-news': NextcloudNewsVue, - openweathermap: OpenWeatherMapVue, - discord: DiscordVue - } -}) +@Component({ components: { Mastodon, NextcloudNews, openweathermap: OpenWeatherMap, Discord } }) export default class App extends Vue { showManager = false diff --git a/src/common.css b/src/common.css new file mode 100644 index 0000000..bd80318 --- /dev/null +++ b/src/common.css @@ -0,0 +1 @@ +/* No CSS *//*# sourceMappingURL=common.css.map */ \ No newline at end of file diff --git a/src/common.css.map b/src/common.css.map new file mode 100644 index 0000000..8af4de5 --- /dev/null +++ b/src/common.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "", + "sources": [ + "common.sass" + ], + "names": [], + "file": "common.css" +} \ No newline at end of file diff --git a/src/components/FromNowMixin.ts b/src/components/FromNowMixin.ts new file mode 100644 index 0000000..9e24393 --- /dev/null +++ b/src/components/FromNowMixin.ts @@ -0,0 +1,37 @@ +import { Component, Vue } from 'vue-property-decorator' +import { TimeModule } from '../store' + +const times = new Map([ + ['second', 1000], + ['minute', 60], + ['hour', 60], + ['day', 24], + ['month', 30.5], + ['year', 12], + ['century', 100] +]) + +@Component +export default class FromNowMixin extends Vue { + + protected static toNumber(date: Date | number | string) { + return Number(new Date(date)) + } + + fromNow(date: Date | number | string) { + const milliseconds = Math.floor(FromNowMixin.toNumber(TimeModule.now) - FromNowMixin.toNumber(date)) + + let cur = 0 + let divider = 1 + let name = 'millisecond' + for (const time of times) { + divider *= time[1] + const next = Math.floor(milliseconds / divider) + if(next <= 0) { + return `${cur} ${name}${cur > 1 ? 's' : ''}` + } + name = time[0] + cur = next + } + } +} \ No newline at end of file diff --git a/src/components/ServiceEmiter.ts b/src/components/ServiceEmiter.ts index 86a66ca..ed78a0e 100644 --- a/src/components/ServiceEmiter.ts +++ b/src/components/ServiceEmiter.ts @@ -1,10 +1,14 @@ import { AxiosPromise } from 'axios' import { Component, Prop, Vue } from 'vue-property-decorator' +import LoadableBlock from './loadable/LoadableBlock.vue' +import LoadableInline from './loadable/LoadableInline.vue' +import SuccessLoadable from './loadable/SuccessLoadableBlock.vue' + import { ServiceData } from '@/types/App' import * as Events from '@/types/Events' -@Component({}) +@Component({ components: { LoadableBlock, LoadableInline, SuccessLoadable } }) export default class ServiceEmiter extends Vue { @Prop(Function) readonly emit!: (name: string, msg: any) => void diff --git a/src/components/input/SettingBoolean.vue b/src/components/input/SettingBoolean.vue index 35e7c44..025d5df 100644 --- a/src/components/input/SettingBoolean.vue +++ b/src/components/input/SettingBoolean.vue @@ -8,10 +8,10 @@ block input diff --git a/src/components/service/BaseService.ts b/src/components/service/BaseService.ts index 1159936..d5e365d 100644 --- a/src/components/service/BaseService.ts +++ b/src/components/service/BaseService.ts @@ -1,18 +1,13 @@ import { Component, Prop, Watch } from 'vue-property-decorator' import { Auth } from '@/types/App' -import SettingBooleanVue from '../input/SettingBoolean.vue' -import SettingIntVue from '../input/SettingInt.vue' -import SettingStringVue from '../input/SettingString.vue' +import SettingBoolean from '../input/SettingBoolean.vue' +import SettingInt from '../input/SettingInt.vue' +import SettingString from '../input/SettingString.vue' import ServiceEmiter from '../ServiceEmiter' +import ServiceHeader from '../ServiceHeader.vue' -@Component({ - components: { - 'setting-string': SettingStringVue, - 'setting-int': SettingIntVue, - 'setting-boolean': SettingBooleanVue - } -}) +@Component({ components: { ServiceHeader, SettingString, SettingInt, SettingBoolean } }) export default class BaseService extends ServiceEmiter { @Prop({ diff --git a/src/components/service/ConnectedService.ts b/src/components/service/ConnectedService.ts index a443371..44bdcf3 100644 --- a/src/components/service/ConnectedService.ts +++ b/src/components/service/ConnectedService.ts @@ -3,16 +3,9 @@ import { Component } from 'vue-property-decorator' import ErrorLoadable from '@/helpers/loadable/ErrorLoadable' import { Auth } from '@/types/App' -import LoadableBlockVue from '../loadable/LoadableBlock.vue' -import LoadableInlineVue from '../loadable/LoadableInline.vue' import BaseService from './BaseService' -@Component({ - components: { - 'loadable-inline': LoadableInlineVue, - 'loadable-block': LoadableBlockVue - } -}) +@Component export default class ConnectedService extends BaseService { get isSetup(): boolean { diff --git a/src/components/time/FromNow.vue b/src/components/time/FromNow.vue deleted file mode 100644 index 4b72526..0000000 --- a/src/components/time/FromNow.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/time/TimedMixin.ts b/src/components/time/TimedMixin.ts deleted file mode 100644 index e770f24..0000000 --- a/src/components/time/TimedMixin.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component, Prop, Vue } from 'vue-property-decorator' - -@Component -export default class TimedMixin extends Vue { - - @Prop([Number, Date]) - readonly now!: number | Date - -} \ No newline at end of file diff --git a/src/components/time/TimerMixin.ts b/src/components/time/TimerMixin.ts deleted file mode 100644 index 63a3000..0000000 --- a/src/components/time/TimerMixin.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, Vue } from 'vue-property-decorator' - -@Component -export default class TimerMixin extends Vue { - - now = Date.now() - - created() { - const self = this - setInterval(() => { - self.now = Date.now() - }, 30 * 1000) - } - -} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 8fc79bd..fa2fc28 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,10 @@ -import Vue from 'vue'; -import App from './App.vue'; +import Vue from 'vue' +import App from './App.vue' +import store from './store' -Vue.config.productionTip = false; +Vue.config.productionTip = false new Vue({ + store, render: h => h(App) }).$mount('#app'); \ No newline at end of file diff --git a/src/services/discord/ChannelTag.vue b/src/services/discord/Channel.vue similarity index 90% rename from src/services/discord/ChannelTag.vue rename to src/services/discord/Channel.vue index d0ec8ff..179cd9b 100644 --- a/src/services/discord/ChannelTag.vue +++ b/src/services/discord/Channel.vue @@ -11,7 +11,7 @@ import { MappedChannel } from './Types' const MAX_LENGTH = 20 @Component -export default class ChannelTag extends ShowMediaMixin { +export default class Channel extends ShowMediaMixin { @Prop(Object) readonly channel!: MappedChannel diff --git a/src/services/discord/Client.vue b/src/services/discord/Client.vue index 585a1a9..ef8975d 100644 --- a/src/services/discord/Client.vue +++ b/src/services/discord/Client.vue @@ -1,52 +1,39 @@