Skip to content

Commit 9c22538

Browse files
fix(frontend): ファイルタブのセンシティブメディアを開く際に確認ダイアログを出す設定が適用されない問題を修正 (#17019)
* fix(frontend): ファイルタブのセンシティブメディアを開く際に確認ダイアログを出す設定が適用されない問題を修正 * Update Changelog * refactor * Update Changelog
1 parent a1ba403 commit 9c22538

7 files changed

Lines changed: 73 additions & 40 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- Fix: ドライブクリーナーでファイルを削除しても画面に反映されない問題を修正 #16061
1616
- Fix: 非ログイン時にログインを求めるダイアログが表示された後にダイアログのぼかしが解除されず操作不能になることがある問題を修正
1717
- Fix: ドライブのソートが「登録日(昇順)」の場合に正しく動作しない問題を修正
18+
- Fix: ファイルタブのセンシティブメディアを開く際に確認ダイアログを出す設定が適用されない問題を修正
1819

1920
### Server
2021
- Enhance: OAuthのクライアント情報取得(Client Information Discovery)において、IndieWeb Living Standard 11 July 2024で定義されているJSONドキュメント形式に対応しました

packages/frontend/src/components/MkMediaAudio.vue

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ import { hms } from '@/filters/hms.js';
100100
import MkMediaRange from '@/components/MkMediaRange.vue';
101101
import { $i, iAmModerator } from '@/i.js';
102102
import { prefer } from '@/preferences.js';
103+
import { canRevealFile, shouldHideFileByDefault } from '@/utility/sensitive-file.js';
103104
104105
const props = defineProps<{
105106
audio: Misskey.entities.DriveFile;
@@ -154,16 +155,11 @@ function hasFocus() {
154155
const playerEl = useTemplateRef('playerEl');
155156
const audioEl = useTemplateRef('audioEl');
156157
157-
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
158-
const hide = ref((prefer.s.nsfw === 'force' || prefer.s.dataSaver.media) ? true : (props.audio.isSensitive && prefer.s.nsfw !== 'ignore'));
158+
const hide = ref(shouldHideFileByDefault(props.audio));
159159
160160
async function reveal() {
161-
if (props.audio.isSensitive && prefer.s.confirmWhenRevealingSensitiveMedia) {
162-
const { canceled } = await os.confirm({
163-
type: 'question',
164-
text: i18n.ts.sensitiveMediaRevealConfirm,
165-
});
166-
if (canceled) return;
161+
if (!(await canRevealFile(props.audio))) {
162+
return;
167163
}
168164
169165
hide.value = false;

packages/frontend/src/components/MkMediaBanner.vue

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
66
<template>
77
<div :class="$style.root">
88
<MkMediaAudio v-if="media.type.startsWith('audio') && media.type !== 'audio/midi'" :audio="media"/>
9-
<div v-else-if="media.isSensitive && hide" :class="$style.sensitive" @click="reveal">
9+
<div v-else-if="hide" :class="$style.sensitive" @click="reveal">
1010
<span style="font-size: 1.6em;"><i class="ti ti-alert-triangle"></i></span>
1111
<b>{{ i18n.ts.sensitive }}</b>
1212
<span>{{ i18n.ts.clickToShow }}</span>
@@ -27,23 +27,18 @@ SPDX-License-Identifier: AGPL-3.0-only
2727
import { ref } from 'vue';
2828
import * as Misskey from 'misskey-js';
2929
import { i18n } from '@/i18n.js';
30-
import * as os from '@/os.js';
3130
import MkMediaAudio from '@/components/MkMediaAudio.vue';
32-
import { prefer } from '@/preferences.js';
31+
import { shouldHideFileByDefault, canRevealFile } from '@/utility/sensitive-file.js';
3332
3433
const props = defineProps<{
3534
media: Misskey.entities.DriveFile;
3635
}>();
3736
38-
const hide = ref(true);
37+
const hide = ref(shouldHideFileByDefault(props.media));
3938
4039
async function reveal() {
41-
if (props.media.isSensitive && prefer.s.confirmWhenRevealingSensitiveMedia) {
42-
const { canceled } = await os.confirm({
43-
type: 'question',
44-
text: i18n.ts.sensitiveMediaRevealConfirm,
45-
});
46-
if (canceled) return;
40+
if (!(await canRevealFile(props.media))) {
41+
return;
4742
}
4843
4944
hide.value = false;

packages/frontend/src/components/MkMediaImage.vue

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import { i18n } from '@/i18n.js';
7777
import * as os from '@/os.js';
7878
import { $i, iAmModerator } from '@/i.js';
7979
import { prefer } from '@/preferences.js';
80+
import { shouldHideFileByDefault, canRevealFile } from '@/utility/sensitive-file.js';
8081
8182
const props = withDefaults(defineProps<{
8283
image: Misskey.entities.DriveFile;
@@ -106,21 +107,17 @@ async function reveal(ev: MouseEvent) {
106107
107108
if (hide.value) {
108109
ev.stopPropagation();
109-
if (props.image.isSensitive && prefer.s.confirmWhenRevealingSensitiveMedia) {
110-
const { canceled } = await os.confirm({
111-
type: 'question',
112-
text: i18n.ts.sensitiveMediaRevealConfirm,
113-
});
114-
if (canceled) return;
110+
if (!(await canRevealFile(props.image))) {
111+
return;
115112
}
116113
117114
hide.value = false;
118115
}
119116
}
120117
121118
// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
122-
watch(() => props.image, () => {
123-
hide.value = (prefer.s.nsfw === 'force' || prefer.s.dataSaver.media) ? true : (props.image.isSensitive && prefer.s.nsfw !== 'ignore');
119+
watch(() => props.image, (newImage) => {
120+
hide.value = shouldHideFileByDefault(newImage);
124121
}, {
125122
deep: true,
126123
immediate: true,

packages/frontend/src/components/MkMediaVideo.vue

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ import hasAudio from '@/utility/media-has-audio.js';
124124
import MkMediaRange from '@/components/MkMediaRange.vue';
125125
import { $i, iAmModerator } from '@/i.js';
126126
import { prefer } from '@/preferences.js';
127+
import { shouldHideFileByDefault, canRevealFile } from '@/utility/sensitive-file.js';
127128
128129
const props = defineProps<{
129130
video: Misskey.entities.DriveFile;
@@ -176,15 +177,11 @@ function hasFocus() {
176177
}
177178
178179
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
179-
const hide = ref((prefer.s.nsfw === 'force' || prefer.s.dataSaver.media) ? true : (props.video.isSensitive && prefer.s.nsfw !== 'ignore'));
180+
const hide = ref(shouldHideFileByDefault(props.video));
180181
181182
async function reveal() {
182-
if (props.video.isSensitive && prefer.s.confirmWhenRevealingSensitiveMedia) {
183-
const { canceled } = await os.confirm({
184-
type: 'question',
185-
text: i18n.ts.sensitiveMediaRevealConfirm,
186-
});
187-
if (canceled) return;
183+
if (!(await canRevealFile(props.video))) {
184+
return;
188185
}
189186
190187
hide.value = false;

packages/frontend/src/components/MkNoteMediaGrid.vue

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only
66
<template>
77
<template v-for="file in note.files">
88
<div
9-
v-if="(((
10-
(prefer.s.nsfw === 'force' || file.isSensitive) &&
11-
prefer.s.nsfw !== 'ignore'
12-
) || (prefer.s.dataSaver.media && file.type.startsWith('image/'))) &&
13-
!showingFiles.has(file.id)
14-
)"
9+
v-if="isHiding(file)"
1510
:class="[$style.filePreview, { [$style.square]: square }]"
16-
@click="showingFiles.add(file.id)"
11+
@click="reveal(file)"
1712
>
1813
<MkDriveFileThumbnail
1914
:file="file"
@@ -49,6 +44,7 @@ import * as Misskey from 'misskey-js';
4944
import { notePage } from '@/filters/note.js';
5045
import { i18n } from '@/i18n.js';
5146
import { prefer } from '@/preferences.js';
47+
import { shouldHideFileByDefault, canRevealFile } from '@/utility/sensitive-file.js';
5248
import bytes from '@/filters/bytes.js';
5349
5450
import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
@@ -59,6 +55,24 @@ defineProps<{
5955
}>();
6056
6157
const showingFiles = ref<Set<string>>(new Set());
58+
59+
function isHiding(file: Misskey.entities.DriveFile) {
60+
if (shouldHideFileByDefault(file) && !showingFiles.value.has(file.id)) {
61+
if (!file.isSensitive && !file.type.startsWith('image/')) {
62+
return false;
63+
}
64+
return true;
65+
}
66+
return false;
67+
}
68+
69+
async function reveal(file: Misskey.entities.DriveFile) {
70+
if (!(await canRevealFile(file))) {
71+
return;
72+
}
73+
74+
showingFiles.value.add(file.id);
75+
}
6276
</script>
6377

6478
<style lang="scss" module>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* SPDX-FileCopyrightText: syuilo and misskey-project
3+
* SPDX-License-Identifier: AGPL-3.0-only
4+
*/
5+
6+
import * as Misskey from 'misskey-js';
7+
import * as os from '@/os.js';
8+
import { prefer } from '@/preferences.js';
9+
import { i18n } from '@/i18n.js';
10+
11+
export function shouldHideFileByDefault(file: Misskey.entities.DriveFile): boolean {
12+
if (prefer.s.nsfw === 'force' || prefer.s.dataSaver.media) {
13+
return true;
14+
}
15+
16+
if (file.isSensitive && prefer.s.nsfw !== 'ignore') {
17+
return true;
18+
}
19+
20+
return false;
21+
}
22+
23+
export async function canRevealFile(file: Misskey.entities.DriveFile): Promise<boolean> {
24+
if (file.isSensitive && prefer.s.confirmWhenRevealingSensitiveMedia) {
25+
const { canceled } = await os.confirm({
26+
type: 'question',
27+
text: i18n.ts.sensitiveMediaRevealConfirm,
28+
});
29+
if (canceled) return false;
30+
}
31+
32+
return true;
33+
}

0 commit comments

Comments
 (0)