summaryrefslogtreecommitdiff
path: root/packages/client/src/widgets/federation.vue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
commit0e4a111f81cceed275d9bec2695f6e401fb654d8 (patch)
tree40874799472fa07416f17b50a398ac33b7771905 /packages/client/src/widgets/federation.vue
parentupdate deps (diff)
downloadmisskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.gz
misskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.bz2
misskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.zip
refactoring
Resolve #7779
Diffstat (limited to 'packages/client/src/widgets/federation.vue')
-rw-r--r--packages/client/src/widgets/federation.vue145
1 files changed, 145 insertions, 0 deletions
diff --git a/packages/client/src/widgets/federation.vue b/packages/client/src/widgets/federation.vue
new file mode 100644
index 0000000000..85cfb8b845
--- /dev/null
+++ b/packages/client/src/widgets/federation.vue
@@ -0,0 +1,145 @@
+<template>
+<MkContainer :show-header="props.showHeader" :foldable="foldable" :scrollable="scrollable">
+ <template #header><i class="fas fa-globe"></i>{{ $ts._widgets.federation }}</template>
+
+ <div class="wbrkwalb">
+ <MkLoading v-if="fetching"/>
+ <transition-group tag="div" name="chart" class="instances" v-else>
+ <div v-for="(instance, i) in instances" :key="instance.id" class="instance">
+ <img v-if="instance.iconUrl" :src="instance.iconUrl" alt=""/>
+ <div class="body">
+ <a class="a" :href="'https://' + instance.host" target="_blank" :title="instance.host">{{ instance.host }}</a>
+ <p>{{ instance.softwareName || '?' }} {{ instance.softwareVersion }}</p>
+ </div>
+ <MkMiniChart class="chart" :src="charts[i].requests.received"/>
+ </div>
+ </transition-group>
+ </div>
+</MkContainer>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import MkContainer from '@/components/ui/container.vue';
+import define from './define';
+import MkMiniChart from '@/components/mini-chart.vue';
+import * as os from '@/os';
+
+const widget = define({
+ name: 'federation',
+ props: () => ({
+ showHeader: {
+ type: 'boolean',
+ default: true,
+ },
+ })
+});
+
+export default defineComponent({
+ extends: widget,
+ components: {
+ MkContainer, MkMiniChart
+ },
+ props: {
+ foldable: {
+ type: Boolean,
+ required: false,
+ default: false
+ },
+ scrollable: {
+ type: Boolean,
+ required: false,
+ default: false
+ },
+ },
+ data() {
+ return {
+ instances: [],
+ charts: [],
+ fetching: true,
+ };
+ },
+ mounted() {
+ this.fetch();
+ this.clock = setInterval(this.fetch, 1000 * 60);
+ },
+ beforeUnmount() {
+ clearInterval(this.clock);
+ },
+ methods: {
+ async fetch() {
+ const instances = await os.api('federation/instances', {
+ sort: '+lastCommunicatedAt',
+ limit: 5
+ });
+ const charts = await Promise.all(instances.map(i => os.api('charts/instance', { host: i.host, limit: 16, span: 'hour' })));
+ this.instances = instances;
+ this.charts = charts;
+ this.fetching = false;
+ }
+ }
+});
+</script>
+
+<style lang="scss" scoped>
+.wbrkwalb {
+ $bodyTitleHieght: 18px;
+ $bodyInfoHieght: 16px;
+
+ height: (62px + 1px) + (62px + 1px) + (62px + 1px) + (62px + 1px) + 62px;
+ overflow: hidden;
+
+ > .instances {
+ .chart-move {
+ transition: transform 1s ease;
+ }
+
+ > .instance {
+ display: flex;
+ align-items: center;
+ padding: 14px 16px;
+ border-bottom: solid 0.5px var(--divider);
+
+ > img {
+ display: block;
+ width: ($bodyTitleHieght + $bodyInfoHieght);
+ height: ($bodyTitleHieght + $bodyInfoHieght);
+ object-fit: cover;
+ border-radius: 4px;
+ margin-right: 8px;
+ }
+
+ > .body {
+ flex: 1;
+ overflow: hidden;
+ font-size: 0.9em;
+ color: var(--fg);
+ padding-right: 8px;
+
+ > .a {
+ display: block;
+ width: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ line-height: $bodyTitleHieght;
+ }
+
+ > p {
+ margin: 0;
+ font-size: 75%;
+ opacity: 0.7;
+ line-height: $bodyInfoHieght;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+
+ > .chart {
+ height: 30px;
+ }
+ }
+ }
+}
+</style>