1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-05-27 01:24:18 +02:00

refactor(frontend): 空/エラー結果表示をコンポーネント化 (#15963)

* wip

* wip

* wip

* wip

* wip

* Update MkResult.vue

* Add storybook story for MkResult (#15964)

* Update MkResult.vue

---------

Co-authored-by: taichan <40626578+tai-cha@users.noreply.github.com>
This commit is contained in:
syuilo
2025-05-06 14:41:31 +09:00
committed by GitHub
parent d476f7ff50
commit 8959bfa1c0
37 changed files with 140 additions and 265 deletions

View File

@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<Transition :name="prefer.s.animation ? '_transition_zoom' : ''" appear>
<div :class="$style.root">
<img :class="$style.img" :src="serverErrorImageUrl" draggable="false"/>
<img v-if="instance.serverErrorImageUrl" :class="$style.img" :src="instance.serverErrorImageUrl" draggable="false"/>
<p :class="$style.text"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.somethingHappened }}</p>
<MkButton :class="$style.button" @click="() => emit('retry')">{{ i18n.ts.retry }}</MkButton>
</div>
@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import MkButton from '@/components/MkButton.vue';
import { i18n } from '@/i18n.js';
import { prefer } from '@/preferences.js';
import { serverErrorImageUrl } from '@/instance.js';
import { instance } from '@/instance.js';
const emit = defineEmits<{
(ev: 'retry'): void;

View File

@@ -0,0 +1,57 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import MkResult from './MkResult.vue';
import type { StoryObj } from '@storybook/vue3';
export const Default = {
render(args) {
return {
components: {
MkResult,
},
setup() {
return {
args,
};
},
computed: {
props() {
return {
...this.args,
};
},
},
template: '<MkResult v-bind="props" />',
};
},
args: {
type: 'empty',
text: 'Lorem Ipsum',
},
parameters: {
layout: 'centered',
},
} satisfies StoryObj<typeof MkResult>;
export const emptyWithNoText = {
...Default,
args: {
...Default.args,
text: undefined,
},
} satisfies StoryObj<typeof MkResult>;
export const notFound = {
...Default,
args: {
...Default.args,
type: 'notFound',
},
} satisfies StoryObj<typeof MkResult>;
export const errorType = {
...Default,
args: {
...Default.args,
type: 'error',
},
} satisfies StoryObj<typeof MkResult>;

View File

@@ -0,0 +1,44 @@
<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div :class="[$style.root]" class="_gaps">
<img v-if="type === 'empty' && instance.infoImageUrl" :src="instance.infoImageUrl" draggable="false" :class="$style.img"/>
<i v-else-if="type === 'empty'" class="ti ti-info-circle" :class="$style.icon"></i>
<div>{{ props.text ?? (type === 'empty' ? i18n.ts.nothing : type === 'notFound' ? i18n.ts.notFound : null) }}</div>
<slot></slot>
</div>
</template>
<script lang="ts" setup>
import {} from 'vue';
import { instance } from '@/instance.js';
import { i18n } from '@/i18n.js';
const props = defineProps<{
type: 'empty' | 'notFound' | 'error';
text?: string;
}>();
</script>
<style lang="scss" module>
.root {
position: relative;
text-align: center;
padding: 32px;
}
.img {
vertical-align: bottom;
height: 128px;
margin-bottom: 16px;
border-radius: 16px;
}
.icon {
font-size: 24px;
margin: 0 auto;
}
</style>