diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index e8bf5bf627..12bc3d5749 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -56,8 +56,8 @@ SPDX-License-Identifier: AGPL-3.0-only

-
-
+
+
({{ i18n.ts.private }}) @@ -223,6 +223,17 @@ const currentClip = inject | null>('currentClip', nul const note = ref(deepClone(props.note)); +// used later +const collapsingNoteCondition = defaultStore.state.collapsingNoteCondition; +if (collapsingNoteCondition === 'seeRenderedSize') { + onMounted(() => { + const current = collapsibleArea.value.clientHeight; + const limit = collapseSize * parseFloat(getComputedStyle(collapsibleArea.value).fontSize); + isLong.value = current > limit; + collapsed.value &&= isLong.value; + }) +} + // plugin if (noteViewInterruptors.length > 0) { onMounted(async () => { @@ -262,22 +273,6 @@ const isMyRenote = $i && ($i.id === note.value.userId); const showContent = ref(false); const parsed = computed(() => appearNote.value.text ? mfm.parse(appearNote.value.text) : null); const urls = computed(() => parsed.value ? extractUrlFromMfm(parsed.value).filter((url) => appearNote.value.renote?.url !== url && appearNote.value.renote?.uri !== url) : null); -const collapsibleArea = ref(null); -const collapseSize = computed(() => ({ - small: 9, - medium: 13.5, - large: 18, -})[defaultStore.state.collapsingNoteSize]); -const isLong = computed(() => { - switch (defaultStore.state.collapsingNoteCondition) { - case 'detailedCalculation': return shouldCollapsed(appearNote.value, collapseSize.value, parsed.value, urls.value ?? []); - case 'seeRenderedSize': return collapsibleArea.value == null ? false : collapsibleInner.value.clientHeight > collapseSize.value * parseFloat(getComputedStyle(collapsibleInner.value).fontSize); - // fail safe - case 'legacyCalculation': - default: return shouldCollapsedLegacy(appearNote.value, urls.value ?? []); - } -}); -const collapsed = ref(appearNote.value.cw == null && isLong.value); const isDeleted = ref(false); const muted = ref(checkMute(appearNote.value, $i?.mutedWords)); const hardMuted = ref(props.withHardMute && checkMute(appearNote.value, $i?.hardMutedWords, true)); @@ -292,6 +287,28 @@ const renoteCollapsed = ref( ), ); +// oversized note collapsing +const collapsibleArea = ref(null); +const collapseSize = ({ + small: 9, + medium: 13.5, + large: 18, +})[defaultStore.state.collapsingNoteSize] ?? 13.5; +const isLong = ref(true); +switch (collapsingNoteCondition) { + case 'detailedCalculation': + isLong.value = shouldCollapsed(appearNote.value, collapseSize, parsed.value, urls.value ?? []); + break; + case 'seeRenderedSize': + break; + // fail safe + case 'legacyCalculation': + default: + isLong.value = shouldCollapsedLegacy(appearNote.value, urls.value ?? []); + break; +} +const collapsed = ref(appearNote.value.cw == null && isLong.value); + /* Overload FunctionにLintが対応していないのでコメントアウト function checkMute(noteToCheck: Misskey.entities.Note, mutedWords: Array | undefined | null, checkOnly: true): boolean; function checkMute(noteToCheck: Misskey.entities.Note, mutedWords: Array | undefined | null, checkOnly: false): boolean | 'sensitiveMute'; diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 69104165cc..3f3093747a 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -102,7 +102,7 @@ SPDX-License-Identifier: AGPL-3.0-only - +