Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(client): データセーバーモードの追加 #10478

Merged
merged 30 commits into from
Apr 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
15ff40e
change nsfw settings
kakkokari-gtyih Apr 4, 2023
006b12f
Update CHANGELOG.md
kakkokari-gtyih Apr 4, 2023
eeab8cd
(fix) eliminate warning message when manually hide
kakkokari-gtyih Apr 4, 2023
a48f834
Apply suggestions from code review
kakkokari-gtyih Apr 4, 2023
9bbd070
Merge branch 'misskey-dev:develop' into datasaver
kakkokari-gtyih Apr 4, 2023
06da066
(change) translation key
kakkokari-gtyih Apr 5, 2023
e36bf4d
Merge branch 'datasaver' of https://github.com/kakkokari-gtyih/misske…
kakkokari-gtyih Apr 5, 2023
2c19112
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 6, 2023
f1a27f2
revert nsfw settings (partial)
kakkokari-gtyih Apr 6, 2023
ca96bf5
Merge branch 'datasaver' of https://github.com/kakkokari-gtyih/misske…
kakkokari-gtyih Apr 6, 2023
afa3cba
(add) data saver setting
kakkokari-gtyih Apr 6, 2023
6c9e74e
Integrate MkMediaBlurhash and MkImgWithBlurhash
kakkokari-gtyih Apr 6, 2023
5477737
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 6, 2023
de199e7
Update CHANGELOG.md
kakkokari-gtyih Apr 6, 2023
fa05f57
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 6, 2023
a994f63
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 6, 2023
54de1b8
Merge branch 'misskey-dev:develop' into datasaver
kakkokari-gtyih Apr 6, 2023
5c43c79
Merge branch 'misskey-dev:develop' into datasaver
kakkokari-gtyih Apr 7, 2023
e641f8b
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 8, 2023
bc42ac9
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 9, 2023
fb8700e
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 9, 2023
e3b5f73
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 10, 2023
28869f6
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 11, 2023
1f1467c
:art:
tamaina Apr 12, 2023
967b798
リモートのファイルでsizeが0の場合は表示しない, refを作らない
tamaina Apr 12, 2023
0bf2191
fix
tamaina Apr 12, 2023
6d73795
かっこ
tamaina Apr 12, 2023
6bb8263
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 12, 2023
f628aec
Merge branch 'misskey-dev:develop' into datasaver
kakkokari-gtyih Apr 13, 2023
9602624
Merge branch 'develop' into datasaver
kakkokari-gtyih Apr 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@
- 猫耳のアバター内部部分をぼかしでマスク表示してより猫耳っぽく見えるように
- 「UIのアニメーションを減らす」 (`reduceAnimation`) で猫耳を撫でられなくなります
- Add Minimizing ("folding") of windows
- 「データセーバー」モードを追加
- 非NSFWメディアが隠れている際にも「閲覧注意」が出てしまう問題を修正

### Server
- PostgreSQLのレプリケーション対応
Expand Down
4 changes: 4 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ home: "ホーム"
remoteUserCaution: "リモートユーザーのため、情報が不完全です。"
activity: "アクティビティ"
images: "画像"
image: "画像"
birthday: "誕生日"
yearsOld: "{age}歳"
registeredDate: "登録日"
Expand Down Expand Up @@ -990,6 +991,9 @@ enableChartsForFederatedInstances: "リモートサーバーのチャートを
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
largeNoteReactions: "ノートのリアクションを大きく表示"
noteIdOrUrl: "ノートIDまたはURL"
video: "動画"
videos: "動画"
dataSaver: "データセーバー"
accountMigration: "アカウントの引っ越し"
accountMoved: "このユーザーは新しいアカウントに引っ越しました:"
forceShowAds: "常に広告を表示する"
Expand Down
8 changes: 5 additions & 3 deletions packages/frontend/src/components/MkImgWithBlurhash.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div :class="[$style.root, { [$style.cover]: cover }]" :title="title">
<canvas v-if="!loaded" ref="canvas" :class="$style.canvas" :width="size" :height="size" :title="title"/>
<img v-if="src" :class="$style.img" :src="src" :title="title" :alt="alt" @load="onLoad"/>
<canvas v-if="!loaded || forceBlurhash" ref="canvas" :class="$style.canvas" :width="size" :height="size" :title="title"/>
<img v-if="src && !forceBlurhash" :class="$style.img" :src="src" :title="title" :alt="alt" @load="onLoad"/>
</div>
</template>

Expand All @@ -12,16 +12,18 @@ import { decode } from 'blurhash';
const props = withDefaults(defineProps<{
src?: string | null;
hash?: string;
alt?: string;
alt?: string | null;
title?: string | null;
size?: number;
cover?: boolean;
forceBlurhash?: boolean;
}>(), {
src: null,
alt: '',
title: null,
size: 64,
cover: true,
forceBlurhash: false,
});

const canvas = $shallowRef<HTMLCanvasElement>();
Expand Down
10 changes: 6 additions & 4 deletions packages/frontend/src/components/MkMediaImage.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<template>
<div v-if="hide" :class="$style.hidden" @click="hide = false">
<ImgWithBlurhash style="filter: brightness(0.5);" :hash="image.blurhash" :title="image.comment" :alt="image.comment"/>
<ImgWithBlurhash style="filter: brightness(0.5);" :hash="image.blurhash" :title="image.comment" :alt="image.comment" :force-blurhash="defaultStore.state.enableDataSaverMode" />
<div :class="$style.hiddenText">
<div :class="$style.hiddenTextWrapper">
<b style="display: block;"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}</b>
<b v-if="image.isSensitive" style="display: block;"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}{{ defaultStore.state.enableDataSaverMode ? ` (${i18n.ts.image}${image.size ? ' ' + bytes(image.size) : ''})` : '' }}</b>
<b v-else style="display: block;"><i class="ti ti-photo"></i> {{ defaultStore.state.enableDataSaverMode && image.size ? bytes(image.size) : i18n.ts.image }}</b>
<span style="display: block;">{{ i18n.ts.clickToShow }}</span>
</div>
</div>
Expand All @@ -28,6 +29,7 @@
import { watch } from 'vue';
import * as misskey from 'misskey-js';
import { getStaticImageUrl } from '@/scripts/media-proxy';
import bytes from '@/filters/bytes';
import ImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
import { defaultStore } from '@/store';
import { i18n } from '@/i18n';
Expand All @@ -38,7 +40,7 @@ const props = defineProps<{
}>();

let hide = $ref(true);
let darkMode = $ref(defaultStore.state.darkMode);
let darkMode: boolean = $ref(defaultStore.state.darkMode);

const url = (props.raw || defaultStore.state.loadRawImages)
? props.image.url
Expand All @@ -48,7 +50,7 @@ const url = (props.raw || defaultStore.state.loadRawImages)

// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
watch(() => props.image, () => {
hide = (defaultStore.state.nsfw === 'force') ? true : props.image.isSensitive && (defaultStore.state.nsfw !== 'ignore');
hide = (defaultStore.state.nsfw === 'force' || defaultStore.state.enableDataSaverMode) ? true : (props.image.isSensitive && defaultStore.state.nsfw !== 'ignore');
}, {
deep: true,
immediate: true,
Expand Down
7 changes: 5 additions & 2 deletions packages/frontend/src/components/MkMediaVideo.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<template>
<div v-if="hide" class="icozogqfvdetwohsdglrbswgrejoxbdj" @click="hide = false">
<!-- 【注意】dataSaverMode が有効になっている際には、hide が false になるまでサムネイルや動画を読み込まないようにすること -->
<div>
<b><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}</b>
<b v-if="video.isSensitive"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}{{ defaultStore.state.enableDataSaverMode ? ` (${i18n.ts.video}${video.size ? ' ' + bytes(video.size) : ''})` : '' }}</b>
<b v-else><i class="ti ti-movie"></i> {{ defaultStore.state.enableDataSaverMode && video.size ? bytes(video.size) : i18n.ts.video }}</b>
<span>{{ i18n.ts.clickToShow }}</span>
</div>
</div>
Expand All @@ -25,6 +27,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import * as misskey from 'misskey-js';
import bytes from '@/filters/bytes';
import VuePlyr from 'vue-plyr';
import { defaultStore } from '@/store';
import 'vue-plyr/dist/vue-plyr.css';
Expand All @@ -34,7 +37,7 @@ const props = defineProps<{
video: misskey.entities.DriveFile;
}>();

const hide = ref((defaultStore.state.nsfw === 'force') ? true : props.video.isSensitive && (defaultStore.state.nsfw !== 'ignore'));
const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.enableDataSaverMode) ? true : (props.video.isSensitive && defaultStore.state.nsfw !== 'ignore'));
</script>

<style lang="scss" scoped>
Expand Down
2 changes: 2 additions & 0 deletions packages/frontend/src/pages/settings/general.vue
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
<MkSwitch v-model="useSystemFont">{{ i18n.ts.useSystemFont }}</MkSwitch>
<MkSwitch v-model="disableDrawer">{{ i18n.ts.disableDrawer }}</MkSwitch>
<MkSwitch v-model="forceShowAds">{{ i18n.ts.forceShowAds }}</MkSwitch>
<MkSwitch v-model="enableDataSaverMode">{{ i18n.ts.dataSaver }}</MkSwitch>
</div>
<div>
<MkRadios v-model="emojiStyle">
Expand Down Expand Up @@ -160,6 +161,7 @@ const disableDrawer = computed(defaultStore.makeGetterSetter('disableDrawer'));
const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages'));
const forceShowAds = computed(defaultStore.makeGetterSetter('forceShowAds'));
const loadRawImages = computed(defaultStore.makeGetterSetter('loadRawImages'));
const enableDataSaverMode = computed(defaultStore.makeGetterSetter('enableDataSaverMode'));
const imageNewTab = computed(defaultStore.makeGetterSetter('imageNewTab'));
const nsfw = computed(defaultStore.makeGetterSetter('nsfw'));
const showFixedPostForm = computed(defaultStore.makeGetterSetter('showFixedPostForm'));
Expand Down
4 changes: 4 additions & 0 deletions packages/frontend/src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: false,
},
enableDataSaverMode: {
where: 'device',
default: false,
},
disableShowingAnimatedImages: {
where: 'device',
default: matchMedia('(prefers-reduced-motion)').matches,
Expand Down