From 596363e9ed76db231dd5d1b1aee48f49f3f9fec4 Mon Sep 17 00:00:00 2001 From: fly_mc Date: Sun, 10 Nov 2024 22:10:06 +0800 Subject: [PATCH] changeDefaultEmoji --- locales/en-US.yml | 2 ++ packages/frontend/src/components/MkNote.vue | 36 +++++++++++-------- .../src/components/MkNoteDetailed.vue | 33 ++++++++--------- packages/frontend/src/pages/settings/pari.vue | 13 +++++++ packages/frontend/src/store.ts | 4 +++ 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 23fe4eff6..0eda8afbe 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -2837,3 +2837,5 @@ _selfXssPrevention: description3: "For more information, please check here: {link}" insertNewNotes: "Insert new notes at current position" insertNewNotesDescription: "Insert new notes at the current position while scrolling timeline." +defaultReactionEmoji: "Default reaction emoji" +defaultReactionEmojiDescription: "Set the emoji used for quick reaction button." diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 7b4a75109..1bf9c2c99 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -500,28 +500,34 @@ function reply(): void { }); } -function like(): void { - pleaseLogin(undefined, pleaseLoginContext.value); - showMovedDialog(); - sound.playMisskeySfx('reaction'); +async function toggleReaction(reaction: string): Promise { if (props.mock) { + if (appearNote.value.myReaction) { + emit('removeReaction', appearNote.value.myReaction); + } else { + emit('reaction', reaction); + } return; } - misskeyApi('notes/reactions/create', { - noteId: appearNote.value.id, - reaction: '❤️', - }); - const el = likeButton.value as HTMLElement | null | undefined; - if (el) { - const rect = el.getBoundingClientRect(); - const x = rect.left + (el.offsetWidth / 2); - const y = rect.top + (el.offsetHeight / 2); - const { dispose } = os.popup(MkRippleEffect, { x, y }, { - end: () => dispose(), + + if (appearNote.value.myReaction) { + await misskeyApi('notes/reactions/delete', { + noteId: appearNote.value.id, + }); + } else { + await misskeyApi('notes/reactions/create', { + noteId: appearNote.value.id, + reaction: reaction, }); } } +async function like() { + if (props.appearNote.myReaction) return; + const emoji = defaultStore.state.defaultReactionEmoji; + await toggleReaction(emoji); +} + function react(): void { pleaseLogin({ openOnRemote: pleaseLoginContext.value }); showMovedDialog(); diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index c377f2bd2..35dfb184d 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -484,28 +484,25 @@ function reply(): void { }); } -function like(): void { - pleaseLogin(undefined, pleaseLoginContext.value); - showMovedDialog(); - sound.playMisskeySfx('reaction'); - if (props.mock) { - return; - } - misskeyApi('notes/reactions/create', { - noteId: appearNote.value.id, - reaction: '❤️', - }); - const el = likeButton.value as HTMLElement | null | undefined; - if (el) { - const rect = el.getBoundingClientRect(); - const x = rect.left + (el.offsetWidth / 2); - const y = rect.top + (el.offsetHeight / 2); - const { dispose } = os.popup(MkRippleEffect, { x, y }, { - end: () => dispose(), +async function toggleReaction(reaction: string): Promise { + if (appearNote.value.myReaction) { + await misskeyApi('notes/reactions/delete', { + noteId: appearNote.value.id, + }); + } else { + await misskeyApi('notes/reactions/create', { + noteId: appearNote.value.id, + reaction: reaction, }); } } +async function like() { + if (props.appearNote.myReaction) return; + const emoji = defaultStore.state.defaultReactionEmoji; + await toggleReaction(emoji); +} + function react(): void { pleaseLogin({ openOnRemote: pleaseLoginContext.value }); showMovedDialog(); diff --git a/packages/frontend/src/pages/settings/pari.vue b/packages/frontend/src/pages/settings/pari.vue index dca8ce80f..e2181228f 100644 --- a/packages/frontend/src/pages/settings/pari.vue +++ b/packages/frontend/src/pages/settings/pari.vue @@ -69,6 +69,10 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.showDetailTimeWhenHover }} {{ i18n.ts.noteClickToOpen }} {{ i18n.ts.enableFallbackReactButton }} + + + + {{ i18n.ts.enableMFMCheatsheet }} {{ i18n.ts.enableUndoClearPostForm }} {{ i18n.ts.collapseNotesRepliedTo }} @@ -106,6 +110,7 @@ import MkInfo from '@/components/MkInfo.vue'; import MkRange from '@/components/MkRange.vue'; import MkButton from '@/components/MkButton.vue'; import FormSection from '@/components/form/section.vue'; +import * as os from '@/os.js'; const defaultFont = getDefaultFontSettings(); console.log(defaultFont); @@ -138,6 +143,14 @@ const collapsedUnexpectedLangs = computed(defaultStore.makeGetterSetter('collaps const emojiAutoSpacing = computed(defaultStore.makeGetterSetter('emojiAutoSpacing')); const insertNewNotes = computed(defaultStore.makeGetterSetter('insertNewNotes')); +const defaultReactionEmoji = computed(defaultStore.makeGetterSetter('defaultReactionEmoji')); + +async function changeDefaultEmoji() { + const { canceled, result: emoji } = await os.pickEmoji(); + if (canceled) return; + defaultReactionEmoji.value = emoji; +} + definePageMetadata(() => ({ title: 'Pari Plus!', icon: 'ti ti-plus', diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 586bb1fa4..8141eb2b6 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -563,6 +563,10 @@ export const defaultStore = markRaw(new Storage('base', { where: 'device', default: false, }, + defaultReactionEmoji: { + where: 'device', + default: '♥', + }, })); // TODO: 他のタブと永続化されたstateを同期