fix(general): some fixes and improvements of Play visibility (#14384)

* fix(backend): missing `visibility` param in packing flash

* fix(frontend): use `visibility` value got from API

* enhance(frontend): change preview appearance of private Play

* Update CHANGELOG.md
This commit is contained in:
zyoshoka 2024-08-10 09:34:49 +09:00 committed by GitHub
parent f50941389d
commit 01a815f8a7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 110 additions and 5 deletions

View file

@ -5,12 +5,14 @@
- Enhance: モデレーターはすべてのユーザーのフォロー・フォロワーの一覧を見られるように - Enhance: モデレーターはすべてのユーザーのフォロー・フォロワーの一覧を見られるように
### Client ### Client
- - Enhance: 「自分のPlay」ページにおいてPlayが非公開かどうかが一目でわかるように
- Fix: Play編集時に公開範囲が「パブリック」にリセットされる問題を修正
### Server ### Server
- Fix: WSの`readAllNotifications` メッセージが `body` を持たない場合に動作しない問題 #14374 - Fix: WSの`readAllNotifications` メッセージが `body` を持たない場合に動作しない問題 #14374
- 通知ページや通知カラム(デッキ)を開いている状態において、新たに発生した通知が既読されない問題が修正されます。 - 通知ページや通知カラム(デッキ)を開いている状態において、新たに発生した通知が既読されない問題が修正されます。
- これにより、プッシュ通知が有効な同条件下の環境において、プッシュ通知が常に発生してしまう問題も修正されます。 - これにより、プッシュ通知が有効な同条件下の環境において、プッシュ通知が常に発生してしまう問題も修正されます。
- Fix: Play各種エンドポイントの返り値に`visibility`が含まれていない問題を修正
## 2024.7.0 ## 2024.7.0

View file

@ -49,6 +49,7 @@ export class FlashEntityService {
title: flash.title, title: flash.title,
summary: flash.summary, summary: flash.summary,
script: flash.script, script: flash.script,
visibility: flash.visibility,
likedCount: flash.likedCount, likedCount: flash.likedCount,
isLiked: meId ? await this.flashLikesRepository.exists({ where: { flashId: flash.id, userId: meId } }) : undefined, isLiked: meId ? await this.flashLikesRepository.exists({ where: { flashId: flash.id, userId: meId } }) : undefined,
}); });

View file

@ -44,6 +44,11 @@ export const packedFlashSchema = {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: false,
}, },
visibility: {
type: 'string',
optional: false, nullable: false,
enum: ['private', 'public'],
},
likedCount: { likedCount: {
type: 'number', type: 'number',
optional: false, nullable: true, optional: false, nullable: true,

View file

@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { AISCRIPT_VERSION } from '@syuilo/aiscript';
import type { entities } from 'misskey-js' import type { entities } from 'misskey-js'
export function abuseUserReport() { export function abuseUserReport() {
@ -114,6 +115,40 @@ export function file(isSensitive = false) {
}; };
} }
const script = `/// @ ${AISCRIPT_VERSION}
var name = ""
Ui:render([
Ui:C:textInput({
label: "Your name"
onInput: @(v) { name = v }
})
Ui:C:button({
text: "Hello"
onClick: @() {
Mk:dialog(null, \`Hello, {name}!\`)
}
})
])
`;
export function flash(): entities.Flash {
return {
id: 'someflashid',
createdAt: '2016-12-28T22:49:51.000Z',
updatedAt: '2016-12-28T22:49:51.000Z',
userId: 'someuserid',
user: userLite(),
title: 'Some Play title',
summary: 'Some Play summary',
script,
visibility: 'public',
likedCount: 0,
isLiked: false,
};
}
export function folder(id = 'somefolderid', name = 'Some Folder', parentId: string | null = null): entities.DriveFolder { export function folder(id = 'somefolderid', name = 'Some Folder', parentId: string | null = null): entities.DriveFolder {
return { return {
id, id,

View file

@ -398,6 +398,7 @@ function toStories(component: string): Promise<string> {
glob('src/components/global/Mk*.vue'), glob('src/components/global/Mk*.vue'),
glob('src/components/global/RouterView.vue'), glob('src/components/global/RouterView.vue'),
glob('src/components/Mk[A-E]*.vue'), glob('src/components/Mk[A-E]*.vue'),
glob('src/components/MkFlashPreview.vue'),
glob('src/components/MkGalleryPostPreview.vue'), glob('src/components/MkGalleryPostPreview.vue'),
glob('src/components/MkSignupServerRules.vue'), glob('src/components/MkSignupServerRules.vue'),
glob('src/components/MkUserSetupDialog.vue'), glob('src/components/MkUserSetupDialog.vue'),

View file

@ -0,0 +1,53 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { StoryObj } from '@storybook/vue3';
import MkFlashPreview from './MkFlashPreview.vue';
import { flash } from './../../.storybook/fakes.js';
export const Public = {
render(args) {
return {
components: {
MkFlashPreview,
},
setup() {
return {
args,
};
},
computed: {
props() {
return {
...this.args,
};
},
},
template: '<MkFlashPreview v-bind="props" />',
};
},
args: {
flash: {
...flash(),
visibility: 'public',
},
},
parameters: {
layout: 'fullscreen',
},
decorators: [
() => ({
template: '<div style="display: flex; align-items: center; justify-content: center; height: 100vh"><div style="max-width: 700px; width: 100%; margin: 3rem"><story/></div></div>',
}),
],
} satisfies StoryObj<typeof MkFlashPreview>;
export const Private = {
...Public,
args: {
flash: {
...flash(),
visibility: 'private',
},
},
} satisfies StoryObj<typeof MkFlashPreview>;

View file

@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
--> -->
<template> <template>
<MkA :to="`/play/${flash.id}`" class="vhpxefrk _panel"> <MkA :to="`/play/${flash.id}`" class="vhpxefrk _panel" :class="[{ gray: flash.visibility === 'private' }]">
<article> <article>
<header> <header>
<h1 :title="flash.title">{{ flash.title }}</h1> <h1 :title="flash.title">{{ flash.title }}</h1>
@ -22,11 +22,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import * as Misskey from 'misskey-js';
import { userName } from '@/filters/user.js'; import { userName } from '@/filters/user.js';
const props = defineProps<{ const props = defineProps<{
//flash: Misskey.entities.Flash; flash: Misskey.entities.Flash;
flash: any;
}>(); }>();
</script> </script>
@ -91,6 +91,12 @@ const props = defineProps<{
} }
} }
&:global(.gray) {
--c: var(--bg);
background-image: linear-gradient(45deg, var(--c) 16.67%, transparent 16.67%, transparent 50%, var(--c) 50%, var(--c) 66.67%, transparent 66.67%, transparent 100%);
background-size: 16px 16px;
}
@media (max-width: 700px) { @media (max-width: 700px) {
} }

View file

@ -369,7 +369,6 @@ const props = defineProps<{
}>(); }>();
const flash = ref<Misskey.entities.Flash | null>(null); const flash = ref<Misskey.entities.Flash | null>(null);
const visibility = ref<'private' | 'public'>('public');
if (props.id) { if (props.id) {
flash.value = await misskeyApi('flash/show', { flash.value = await misskeyApi('flash/show', {
@ -380,6 +379,7 @@ if (props.id) {
const title = ref(flash.value?.title ?? 'New Play'); const title = ref(flash.value?.title ?? 'New Play');
const summary = ref(flash.value?.summary ?? ''); const summary = ref(flash.value?.summary ?? '');
const permissions = ref(flash.value?.permissions ?? []); const permissions = ref(flash.value?.permissions ?? []);
const visibility = ref<'private' | 'public'>(flash.value?.visibility ?? 'public');
const script = ref(flash.value?.script ?? PRESET_DEFAULT); const script = ref(flash.value?.script ?? PRESET_DEFAULT);
function selectPreset(ev: MouseEvent) { function selectPreset(ev: MouseEvent) {

View file

@ -4672,6 +4672,8 @@ export type components = {
title: string; title: string;
summary: string; summary: string;
script: string; script: string;
/** @enum {string} */
visibility: 'private' | 'public';
likedCount: number | null; likedCount: number | null;
isLiked?: boolean; isLiked?: boolean;
}; };