fix usage of appearNote in frontend components

This commit is contained in:
Hazelnoot 2025-06-18 10:35:38 -04:00
parent c35da729fc
commit b97e505709
4 changed files with 34 additions and 44 deletions

View file

@ -306,7 +306,7 @@ const galleryEl = useTemplateRef('galleryEl');
const isMyRenote = $i && ($i.id === note.value.userId); const isMyRenote = $i && ($i.id === note.value.userId);
const showContent = ref(prefer.s.uncollapseCW); const showContent = ref(prefer.s.uncollapseCW);
const parsed = computed(() => appearNote.value.text ? mfm.parse(appearNote.value.text) : null); const parsed = computed(() => appearNote.value.text ? mfm.parse(appearNote.value.text) : null);
const urls = computed(() => parsed.value ? extractPreviewUrls(props.note, parsed.value) : []); const urls = computed(() => parsed.value ? extractPreviewUrls(appearNote.value, parsed.value) : []);
const selfNoteIds = computed(() => getSelfNoteIds(props.note)); const selfNoteIds = computed(() => getSelfNoteIds(props.note));
const isLong = shouldCollapsed(appearNote.value, urls.value); const isLong = shouldCollapsed(appearNote.value, urls.value);
const collapsed = ref(prefer.s.expandLongNote && appearNote.value.cw == null && isLong ? false : appearNote.value.cw == null && isLong); const collapsed = ref(prefer.s.expandLongNote && appearNote.value.cw == null && isLong ? false : appearNote.value.cw == null && isLong);

View file

@ -114,6 +114,7 @@ import { prefer } from '@/preferences.js';
import { useNoteCapture } from '@/use/use-note-capture.js'; import { useNoteCapture } from '@/use/use-note-capture.js';
import SkMutedNote from '@/components/SkMutedNote.vue'; import SkMutedNote from '@/components/SkMutedNote.vue';
import { instance, policies } from '@/instance'; import { instance, policies } from '@/instance';
import { getAppearNote } from '@/utility/get-appear-note';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
note: Misskey.entities.Note; note: Misskey.entities.Note;
@ -128,7 +129,9 @@ const props = withDefaults(defineProps<{
onDeleteCallback: undefined, onDeleteCallback: undefined,
}); });
const canRenote = computed(() => ['public', 'home'].includes(props.note.visibility) || props.note.userId === $i?.id); const appearNote = computed(() => getAppearNote(props.note));
const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || appearNote.value.userId === $i?.id);
const el = shallowRef<HTMLElement>(); const el = shallowRef<HTMLElement>();
const translation = ref<Misskey.entities.NotesTranslateResponse | false | null>(null); const translation = ref<Misskey.entities.NotesTranslateResponse | false | null>(null);
@ -144,19 +147,11 @@ const likeButton = shallowRef<HTMLElement>();
const renoteTooltip = computeRenoteTooltip(renoted); const renoteTooltip = computeRenoteTooltip(renoted);
const appearNote = computed(() => isRenote ? props.note.renote as Misskey.entities.Note : props.note);
const defaultLike = computed(() => prefer.s.like ? prefer.s.like : null); const defaultLike = computed(() => prefer.s.like ? prefer.s.like : null);
const replies = ref<Misskey.entities.Note[]>([]); const replies = ref<Misskey.entities.Note[]>([]);
const mergedCW = computed(() => computeMergedCw(appearNote.value)); const mergedCW = computed(() => computeMergedCw(appearNote.value));
const isRenote = (
props.note.renote != null &&
props.note.text == null &&
props.note.fileIds && props.note.fileIds.length === 0 &&
props.note.poll == null
);
const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({ const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup', type: 'lookup',
url: appearNote.value.url ?? appearNote.value.uri ?? `${config.url}/notes/${appearNote.value.id}`, url: appearNote.value.url ?? appearNote.value.uri ?? `${config.url}/notes/${appearNote.value.id}`,
@ -206,8 +201,8 @@ async function reply(viaKeyboard = false): Promise<void> {
pleaseLogin({ openOnRemote: pleaseLoginContext.value }); pleaseLogin({ openOnRemote: pleaseLoginContext.value });
showMovedDialog(); showMovedDialog();
await os.post({ await os.post({
reply: props.note, reply: appearNote.value,
channel: props.note.channel ?? undefined, channel: appearNote.value.channel ?? undefined,
animation: !viaKeyboard, animation: !viaKeyboard,
}); });
focus(); focus();
@ -217,9 +212,9 @@ function react(): void {
pleaseLogin({ openOnRemote: pleaseLoginContext.value }); pleaseLogin({ openOnRemote: pleaseLoginContext.value });
showMovedDialog(); showMovedDialog();
sound.playMisskeySfx('reaction'); sound.playMisskeySfx('reaction');
if (props.note.reactionAcceptance === 'likeOnly') { if (appearNote.value.reactionAcceptance === 'likeOnly') {
misskeyApi('notes/like', { misskeyApi('notes/like', {
noteId: props.note.id, noteId: appearNote.value.id,
override: defaultLike.value, override: defaultLike.value,
}); });
const el = reactButton.value as HTMLElement | null | undefined; const el = reactButton.value as HTMLElement | null | undefined;
@ -233,12 +228,12 @@ function react(): void {
} }
} else { } else {
blur(); blur();
reactionPicker.show(reactButton.value ?? null, props.note, reaction => { reactionPicker.show(reactButton.value ?? null, appearNote.value, reaction => {
misskeyApi('notes/reactions/create', { misskeyApi('notes/reactions/create', {
noteId: props.note.id, noteId: appearNote.value.id,
reaction: reaction, reaction: reaction,
}); });
if (props.note.text && props.note.text.length > 100 && (Date.now() - new Date(props.note.createdAt).getTime() < 1000 * 3)) { if (appearNote.value.text && appearNote.value.text.length > 100 && (Date.now() - new Date(appearNote.value.createdAt).getTime() < 1000 * 3)) {
claimAchievement('reactWithoutRead'); claimAchievement('reactWithoutRead');
} }
}, () => { }, () => {
@ -252,7 +247,7 @@ function like(): void {
showMovedDialog(); showMovedDialog();
sound.playMisskeySfx('reaction'); sound.playMisskeySfx('reaction');
misskeyApi('notes/like', { misskeyApi('notes/like', {
noteId: props.note.id, noteId: appearNote.value.id,
override: defaultLike.value, override: defaultLike.value,
}); });
const el = likeButton.value as HTMLElement | null | undefined; const el = likeButton.value as HTMLElement | null | undefined;
@ -361,7 +356,7 @@ function quote() {
}).then((cancelled) => { }).then((cancelled) => {
if (cancelled) return; if (cancelled) return;
misskeyApi('notes/renotes', { misskeyApi('notes/renotes', {
noteId: props.note.id, noteId: appearNote.value.id,
userId: $i?.id, userId: $i?.id,
limit: 1, limit: 1,
quote: true, quote: true,
@ -383,12 +378,12 @@ function quote() {
} }
function menu(): void { function menu(): void {
const { menu, cleanup } = getNoteMenu({ note: props.note, translating, translation, isDeleted }); const { menu, cleanup } = getNoteMenu({ note: appearNote.value, translating, translation, isDeleted });
os.popupMenu(menu, menuButton.value).then(focus).finally(cleanup); os.popupMenu(menu, menuButton.value).then(focus).finally(cleanup);
} }
async function clip(): Promise<void> { async function clip(): Promise<void> {
os.popupMenu(await getNoteClipMenu({ note: props.note, isDeleted, currentClip: currentClip?.value }), clipButton.value).then(focus); os.popupMenu(await getNoteClipMenu({ note: appearNote.value, isDeleted, currentClip: currentClip?.value }), clipButton.value).then(focus);
} }
async function translate() { async function translate() {
@ -397,7 +392,7 @@ async function translate() {
if (props.detail) { if (props.detail) {
misskeyApi('notes/children', { misskeyApi('notes/children', {
noteId: props.note.id, noteId: appearNote.value.id,
limit: prefer.s.numberOfReplies, limit: prefer.s.numberOfReplies,
showQuotes: false, showQuotes: false,
}).then(res => { }).then(res => {

View file

@ -305,7 +305,7 @@ const galleryEl = useTemplateRef('galleryEl');
const isMyRenote = $i && ($i.id === note.value.userId); const isMyRenote = $i && ($i.id === note.value.userId);
const showContent = ref(prefer.s.uncollapseCW); const showContent = ref(prefer.s.uncollapseCW);
const parsed = computed(() => appearNote.value.text ? mfm.parse(appearNote.value.text) : null); const parsed = computed(() => appearNote.value.text ? mfm.parse(appearNote.value.text) : null);
const urls = computed(() => parsed.value ? extractPreviewUrls(props.note, parsed.value) : []); const urls = computed(() => parsed.value ? extractPreviewUrls(appearNote.value, parsed.value) : []);
const selfNoteIds = computed(() => getSelfNoteIds(props.note)); const selfNoteIds = computed(() => getSelfNoteIds(props.note));
const isLong = shouldCollapsed(appearNote.value, urls.value); const isLong = shouldCollapsed(appearNote.value, urls.value);
const collapsed = ref(prefer.s.expandLongNote && appearNote.value.cw == null && isLong ? false : appearNote.value.cw == null && isLong); const collapsed = ref(prefer.s.expandLongNote && appearNote.value.cw == null && isLong ? false : appearNote.value.cw == null && isLong);

View file

@ -122,6 +122,7 @@ import { prefer } from '@/preferences.js';
import { useNoteCapture } from '@/use/use-note-capture.js'; import { useNoteCapture } from '@/use/use-note-capture.js';
import SkMutedNote from '@/components/SkMutedNote.vue'; import SkMutedNote from '@/components/SkMutedNote.vue';
import { instance, policies } from '@/instance'; import { instance, policies } from '@/instance';
import { getAppearNote } from '@/utility/get-appear-note';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
note: Misskey.entities.Note; note: Misskey.entities.Note;
@ -141,7 +142,9 @@ const props = withDefaults(defineProps<{
onDeleteCallback: undefined, onDeleteCallback: undefined,
}); });
const canRenote = computed(() => ['public', 'home'].includes(props.note.visibility) || props.note.userId === $i?.id); const appearNote = computed(() => getAppearNote(props.note));
const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || appearNote.value.userId === $i?.id);
const hideLine = computed(() => props.detail); const hideLine = computed(() => props.detail);
const el = shallowRef<HTMLElement>(); const el = shallowRef<HTMLElement>();
@ -158,19 +161,11 @@ const likeButton = shallowRef<HTMLElement>();
const renoteTooltip = computeRenoteTooltip(renoted); const renoteTooltip = computeRenoteTooltip(renoted);
let appearNote = computed(() => isRenote ? props.note.renote as Misskey.entities.Note : props.note);
const defaultLike = computed(() => prefer.s.like ? prefer.s.like : null); const defaultLike = computed(() => prefer.s.like ? prefer.s.like : null);
const replies = ref<Misskey.entities.Note[]>([]); const replies = ref<Misskey.entities.Note[]>([]);
const mergedCW = computed(() => computeMergedCw(appearNote.value)); const mergedCW = computed(() => computeMergedCw(appearNote.value));
const isRenote = (
props.note.renote != null &&
props.note.text == null &&
props.note.fileIds && props.note.fileIds.length === 0 &&
props.note.poll == null
);
const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({ const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup', type: 'lookup',
url: appearNote.value.url ?? appearNote.value.uri ?? `${config.url}/notes/${appearNote.value.id}`, url: appearNote.value.url ?? appearNote.value.uri ?? `${config.url}/notes/${appearNote.value.id}`,
@ -220,8 +215,8 @@ async function reply(viaKeyboard = false): Promise<void> {
pleaseLogin({ openOnRemote: pleaseLoginContext.value }); pleaseLogin({ openOnRemote: pleaseLoginContext.value });
showMovedDialog(); showMovedDialog();
await os.post({ await os.post({
reply: props.note, reply: appearNote.value,
channel: props.note.channel ?? undefined, channel: appearNote.value.channel ?? undefined,
animation: !viaKeyboard, animation: !viaKeyboard,
}); });
focus(); focus();
@ -231,9 +226,9 @@ function react(): void {
pleaseLogin({ openOnRemote: pleaseLoginContext.value }); pleaseLogin({ openOnRemote: pleaseLoginContext.value });
showMovedDialog(); showMovedDialog();
sound.playMisskeySfx('reaction'); sound.playMisskeySfx('reaction');
if (props.note.reactionAcceptance === 'likeOnly') { if (appearNote.value.reactionAcceptance === 'likeOnly') {
misskeyApi('notes/like', { misskeyApi('notes/like', {
noteId: props.note.id, noteId: appearNote.value.id,
override: defaultLike.value, override: defaultLike.value,
}); });
const el = reactButton.value as HTMLElement | null | undefined; const el = reactButton.value as HTMLElement | null | undefined;
@ -247,12 +242,12 @@ function react(): void {
} }
} else { } else {
blur(); blur();
reactionPicker.show(reactButton.value ?? null, props.note, reaction => { reactionPicker.show(reactButton.value ?? null, appearNote.value, reaction => {
misskeyApi('notes/reactions/create', { misskeyApi('notes/reactions/create', {
noteId: props.note.id, noteId: appearNote.value.id,
reaction: reaction, reaction: reaction,
}); });
if (props.note.text && props.note.text.length > 100 && (Date.now() - new Date(props.note.createdAt).getTime() < 1000 * 3)) { if (appearNote.value.text && appearNote.value.text.length > 100 && (Date.now() - new Date(appearNote.value.createdAt).getTime() < 1000 * 3)) {
claimAchievement('reactWithoutRead'); claimAchievement('reactWithoutRead');
} }
}, () => { }, () => {
@ -266,7 +261,7 @@ function like(): void {
showMovedDialog(); showMovedDialog();
sound.playMisskeySfx('reaction'); sound.playMisskeySfx('reaction');
misskeyApi('notes/like', { misskeyApi('notes/like', {
noteId: props.note.id, noteId: appearNote.value.id,
override: defaultLike.value, override: defaultLike.value,
}); });
const el = likeButton.value as HTMLElement | null | undefined; const el = likeButton.value as HTMLElement | null | undefined;
@ -375,7 +370,7 @@ function quote() {
}).then((cancelled) => { }).then((cancelled) => {
if (cancelled) return; if (cancelled) return;
misskeyApi('notes/renotes', { misskeyApi('notes/renotes', {
noteId: props.note.id, noteId: appearNote.value.id,
userId: $i?.id, userId: $i?.id,
limit: 1, limit: 1,
quote: true, quote: true,
@ -397,12 +392,12 @@ function quote() {
} }
function menu(): void { function menu(): void {
const { menu, cleanup } = getNoteMenu({ note: props.note, translating, translation, isDeleted }); const { menu, cleanup } = getNoteMenu({ note: appearNote.value, translating, translation, isDeleted });
os.popupMenu(menu, menuButton.value).then(focus).finally(cleanup); os.popupMenu(menu, menuButton.value).then(focus).finally(cleanup);
} }
async function clip(): Promise<void> { async function clip(): Promise<void> {
os.popupMenu(await getNoteClipMenu({ note: props.note, isDeleted, currentClip: currentClip?.value }), clipButton.value).then(focus); os.popupMenu(await getNoteClipMenu({ note: appearNote.value, isDeleted, currentClip: currentClip?.value }), clipButton.value).then(focus);
} }
async function translate() { async function translate() {
@ -411,7 +406,7 @@ async function translate() {
if (props.detail) { if (props.detail) {
misskeyApi('notes/children', { misskeyApi('notes/children', {
noteId: props.note.id, noteId: appearNote.value.id,
limit: prefer.s.numberOfReplies, limit: prefer.s.numberOfReplies,
showQuotes: false, showQuotes: false,
}).then(res => { }).then(res => {