({
- get: () => defaultStore.reactiveState.tl.value.filter.withBots,
- set: (newValue) => {
- const out = deepMerge({ filter: { withBots: newValue } }, defaultStore.state.tl);
- defaultStore.set('tl', out);
- },
-});
const collapseFiles = computed(defaultStore.makeGetterSetter('collapseFiles'));
const autoloadConversation = computed(defaultStore.makeGetterSetter('autoloadConversation'));
const reduceAnimation = computed(defaultStore.makeGetterSetter('animation', v => !v, v => !v));
@@ -440,6 +432,7 @@ const useNativeUIForVideoAudioPlayer = computed(defaultStore.makeGetterSetter('u
const alwaysConfirmFollow = computed(defaultStore.makeGetterSetter('alwaysConfirmFollow'));
const confirmWhenRevealingSensitiveMedia = computed(defaultStore.makeGetterSetter('confirmWhenRevealingSensitiveMedia'));
const contextMenu = computed(defaultStore.makeGetterSetter('contextMenu'));
+const warnExternalUrl = computed(defaultStore.makeGetterSetter('warnExternalUrl'));
watch(lang, () => {
miLocalStorage.setItem('lang', lang.value as string);
@@ -501,6 +494,7 @@ watch([
alwaysConfirmFollow,
confirmWhenRevealingSensitiveMedia,
contextMenu,
+ warnExternalUrl,
], async () => {
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
});
diff --git a/packages/frontend/src/pages/timeline.vue b/packages/frontend/src/pages/timeline.vue
index 24a99f4c1c..60974da971 100644
--- a/packages/frontend/src/pages/timeline.vue
+++ b/packages/frontend/src/pages/timeline.vue
@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{
type: 'switch',
text: i18n.ts.showRenotes,
ref: withRenotes,
+ }, {
+ type: 'switch',
+ text: i18n.ts.showBots,
+ ref: withBots,
});
if (isBasicTimeline(src.value) && hasWithReplies(src.value)) {
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index a403dc9e34..50b3bf3451 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -130,10 +130,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
{{ i18n.ts.userPagePinTip }}
+
{{ i18n.ts.userPagePinTip }}
@@ -152,14 +149,27 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
+
+
+
+
-
+
+
+
+
{{ i18n.ts.noNotes }}
+
+
+
+
+
+
@@ -199,6 +209,7 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
import { isFollowingVisibleForMe, isFollowersVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
import { useRouter } from '@/router/supplier.js';
import { getStaticImageUrl } from '@/scripts/media-proxy.js';
+import { infoImageUrl } from '@/instance.js';
const MkNote = defineAsyncComponent(() =>
(defaultStore.state.noteDesign === 'misskey') ? import('@/components/MkNote.vue') :
@@ -809,7 +820,7 @@ onUnmounted(() => {
}
.tab {
- margin: calc(var(--margin) / 2) 0;
+ margin-bottom: calc(var(--margin) / 2);
padding: calc(var(--margin) / 2) 0;
background: color-mix(in srgb, var(--bg) 65%, transparent);
backdrop-filter: var(--blur, blur(15px));
@@ -826,4 +837,8 @@ onUnmounted(() => {
margin-left: 4px;
color: var(--success);
}
+
+.pinnedNote:not(:last-child) {
+ border-bottom: solid 0.5px var(--divider);
+}
diff --git a/packages/frontend/src/scripts/warning-external-website.ts b/packages/frontend/src/scripts/warning-external-website.ts
index 5ef003cb01..67158c6438 100644
--- a/packages/frontend/src/scripts/warning-external-website.ts
+++ b/packages/frontend/src/scripts/warning-external-website.ts
@@ -29,8 +29,9 @@ export async function warningExternalWebsite(url: string) {
});
const isTrustedByUser = defaultStore.reactiveState.trustedDomains.value.includes(domain);
+ const isDisabledByUser = !defaultStore.reactiveState.warnExternalUrl.value;
- if (!isTrustedByInstance && !isTrustedByUser) {
+ if (!isTrustedByInstance && !isTrustedByUser && !isDisabledByUser) {
const confirm = await new Promise<{ canceled: boolean }>(resolve => {
const { dispose } = os.popup(MkUrlWarningDialog, {
url,
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 2df5b04a64..b8ef11ccb1 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -171,6 +171,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'account',
default: [] as string[],
},
+ warnExternalUrl: {
+ where: 'account',
+ default: true,
+ },
menu: {
where: 'deviceAccount',