summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages/settings/privacy.vue
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2024-10-22 17:08:53 +0900
committerGitHub <noreply@github.com>2024-10-22 17:08:53 +0900
commit952fec5665ce0712a78f3ee68f5c46554426dfb4 (patch)
tree425f640754d83b01aaa447996363fe703f45d47a /packages/frontend/src/pages/settings/privacy.vue
parentfix(frontend): /iのレスポンスに含まれないプロパティが消え... (diff)
downloadmisskey-952fec5665ce0712a78f3ee68f5c46554426dfb4.tar.gz
misskey-952fec5665ce0712a78f3ee68f5c46554426dfb4.tar.bz2
misskey-952fec5665ce0712a78f3ee68f5c46554426dfb4.zip
feat: 過去のノートを非公開化/フォロワーのみ表示可能にできる機能 (#14814)
* wip * Update CHANGELOG.md * wip * wip * wip * Update privacy.vue * wip
Diffstat (limited to 'packages/frontend/src/pages/settings/privacy.vue')
-rw-r--r--packages/frontend/src/pages/settings/privacy.vue109
1 files changed, 106 insertions, 3 deletions
diff --git a/packages/frontend/src/pages/settings/privacy.vue b/packages/frontend/src/pages/settings/privacy.vue
index e277dfad71..da3d36b31a 100644
--- a/packages/frontend/src/pages/settings/privacy.vue
+++ b/packages/frontend/src/pages/settings/privacy.vue
@@ -45,17 +45,89 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkSwitch>
<FormSection>
- <template #label>{{ i18n.ts.lockdown }}</template>
+ <template #label>{{ i18n.ts.lockdown }}<span class="_beta">{{ i18n.ts.beta }}</span></template>
<div class="_gaps_m">
<MkSwitch v-model="requireSigninToViewContents" @update:modelValue="save()">
- {{ i18n.ts._accountSettings.requireSigninToViewContents }}<span class="_beta">{{ i18n.ts.beta }}</span>
+ {{ i18n.ts._accountSettings.requireSigninToViewContents }}
<template #caption>
<div>{{ i18n.ts._accountSettings.requireSigninToViewContentsDescription1 }}</div>
<div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._accountSettings.requireSigninToViewContentsDescription2 }}</div>
<div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._accountSettings.requireSigninToViewContentsDescription3 }}</div>
</template>
</MkSwitch>
+
+ <FormSlot>
+ <template #label>{{ i18n.ts._accountSettings.makeNotesFollowersOnlyBefore }}</template>
+
+ <div class="_gaps_s">
+ <MkSelect :modelValue="makeNotesFollowersOnlyBefore_type" @update:modelValue="makeNotesFollowersOnlyBefore = $event === 'relative' ? -604800 : $event === 'absolute' ? Math.floor(Date.now() / 1000) : null">
+ <option :value="null">{{ i18n.ts.none }}</option>
+ <option value="relative">{{ i18n.ts._accountSettings.notesHavePassedSpecifiedPeriod }}</option>
+ <option value="absolute">{{ i18n.ts._accountSettings.notesOlderThanSpecifiedDateAndTime }}</option>
+ </MkSelect>
+
+ <MkSelect v-if="makeNotesFollowersOnlyBefore_type === 'relative'" v-model="makeNotesFollowersOnlyBefore">
+ <option :value="-3600">{{ i18n.ts.oneHour }}</option>
+ <option :value="-86400">{{ i18n.ts.oneDay }}</option>
+ <option :value="-259200">{{ i18n.ts.threeDays }}</option>
+ <option :value="-604800">{{ i18n.ts.oneWeek }}</option>
+ <option :value="-2592000">{{ i18n.ts.oneMonth }}</option>
+ <option :value="-7776000">{{ i18n.ts.threeMonths }}</option>
+ <option :value="-31104000">{{ i18n.ts.oneYear }}</option>
+ </MkSelect>
+
+ <MkInput
+ v-if="makeNotesFollowersOnlyBefore_type === 'absolute'"
+ :modelValue="formatDateTimeString(new Date(makeNotesFollowersOnlyBefore * 1000), 'yyyy-MM-dd')"
+ type="date"
+ :manualSave="true"
+ @update:modelValue="makeNotesFollowersOnlyBefore = Math.floor(new Date($event).getTime() / 1000)"
+ >
+ </MkInput>
+ </div>
+
+ <template #caption>
+ <div>{{ i18n.ts._accountSettings.makeNotesFollowersOnlyBeforeDescription }}</div>
+ <div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._accountSettings.mayNotEffectForFederatedNotes }}</div>
+ </template>
+ </FormSlot>
+
+ <FormSlot>
+ <template #label>{{ i18n.ts._accountSettings.makeNotesHiddenBefore }}</template>
+
+ <div class="_gaps_s">
+ <MkSelect :modelValue="makeNotesHiddenBefore_type" @update:modelValue="makeNotesHiddenBefore = $event === 'relative' ? -604800 : $event === 'absolute' ? Math.floor(Date.now() / 1000) : null">
+ <option :value="null">{{ i18n.ts.none }}</option>
+ <option value="relative">{{ i18n.ts._accountSettings.notesHavePassedSpecifiedPeriod }}</option>
+ <option value="absolute">{{ i18n.ts._accountSettings.notesOlderThanSpecifiedDateAndTime }}</option>
+ </MkSelect>
+
+ <MkSelect v-if="makeNotesHiddenBefore_type === 'relative'" v-model="makeNotesHiddenBefore">
+ <option :value="-3600">{{ i18n.ts.oneHour }}</option>
+ <option :value="-86400">{{ i18n.ts.oneDay }}</option>
+ <option :value="-259200">{{ i18n.ts.threeDays }}</option>
+ <option :value="-604800">{{ i18n.ts.oneWeek }}</option>
+ <option :value="-2592000">{{ i18n.ts.oneMonth }}</option>
+ <option :value="-7776000">{{ i18n.ts.threeMonths }}</option>
+ <option :value="-31104000">{{ i18n.ts.oneYear }}</option>
+ </MkSelect>
+
+ <MkInput
+ v-if="makeNotesHiddenBefore_type === 'absolute'"
+ :modelValue="formatDateTimeString(new Date(makeNotesHiddenBefore * 1000), 'yyyy-MM-dd')"
+ type="date"
+ :manualSave="true"
+ @update:modelValue="makeNotesHiddenBefore = Math.floor(new Date($event).getTime() / 1000)"
+ >
+ </MkInput>
+ </div>
+
+ <template #caption>
+ <div>{{ i18n.ts._accountSettings.makeNotesHiddenBeforeDescription }}</div>
+ <div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._accountSettings.mayNotEffectForFederatedNotes }}</div>
+ </template>
+ </FormSlot>
</div>
</FormSection>
@@ -87,7 +159,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { ref, computed } from 'vue';
+import { ref, computed, watch } from 'vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkSelect from '@/components/MkSelect.vue';
import FormSection from '@/components/form/section.vue';
@@ -97,6 +169,9 @@ import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
import { signinRequired } from '@/account.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
+import FormSlot from '@/components/form/slot.vue';
+import { formatDateTimeString } from '@/scripts/format-time-string.js';
+import MkInput from '@/components/MkInput.vue';
const $i = signinRequired();
@@ -106,6 +181,8 @@ const noCrawle = ref($i.noCrawle);
const preventAiLearning = ref($i.preventAiLearning);
const isExplorable = ref($i.isExplorable);
const requireSigninToViewContents = ref($i.requireSigninToViewContents ?? false);
+const makeNotesFollowersOnlyBefore = ref($i.makeNotesFollowersOnlyBefore ?? null);
+const makeNotesHiddenBefore = ref($i.makeNotesHiddenBefore ?? null);
const hideOnlineStatus = ref($i.hideOnlineStatus);
const publicReactions = ref($i.publicReactions);
const followingVisibility = ref($i.followingVisibility);
@@ -116,6 +193,30 @@ const defaultNoteLocalOnly = computed(defaultStore.makeGetterSetter('defaultNote
const rememberNoteVisibility = computed(defaultStore.makeGetterSetter('rememberNoteVisibility'));
const keepCw = computed(defaultStore.makeGetterSetter('keepCw'));
+const makeNotesFollowersOnlyBefore_type = computed(() => {
+ if (makeNotesFollowersOnlyBefore.value == null) {
+ return null;
+ } else if (makeNotesFollowersOnlyBefore.value >= 0) {
+ return 'absolute';
+ } else {
+ return 'relative';
+ }
+});
+
+const makeNotesHiddenBefore_type = computed(() => {
+ if (makeNotesHiddenBefore.value == null) {
+ return null;
+ } else if (makeNotesHiddenBefore.value >= 0) {
+ return 'absolute';
+ } else {
+ return 'relative';
+ }
+});
+
+watch([makeNotesFollowersOnlyBefore, makeNotesHiddenBefore], () => {
+ save();
+});
+
function save() {
misskeyApi('i/update', {
isLocked: !!isLocked.value,
@@ -124,6 +225,8 @@ function save() {
preventAiLearning: !!preventAiLearning.value,
isExplorable: !!isExplorable.value,
requireSigninToViewContents: !!requireSigninToViewContents.value,
+ makeNotesFollowersOnlyBefore: makeNotesFollowersOnlyBefore.value,
+ makeNotesHiddenBefore: makeNotesHiddenBefore.value,
hideOnlineStatus: !!hideOnlineStatus.value,
publicReactions: !!publicReactions.value,
followingVisibility: followingVisibility.value,