diff options
Diffstat (limited to 'packages/frontend/src/components/MkPostForm.vue')
| -rw-r--r-- | packages/frontend/src/components/MkPostForm.vue | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 6f057ed5eb..059de8011c 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -46,14 +46,14 @@ SPDX-License-Identifier: AGPL-3.0-only <template v-if="posted"></template> <template v-else-if="posting"><MkEllipsis/></template> <template v-else>{{ submitText }}</template> - <i style="margin-left: 6px;" :class="posted ? 'ti ti-check' : reply ? 'ti ti-arrow-back-up' : renote ? 'ti ti-quote' : 'ti ti-send'"></i> + <i style="margin-left: 6px;" :class="posted ? 'ti ti-check' : reply ? 'ti ti-arrow-back-up' : renoteTargetNote ? 'ti ti-quote' : 'ti ti-send'"></i> </div> </button> </div> </header> <MkNoteSimple v-if="reply" :class="$style.targetNote" :hideFiles="true" :note="reply"/> - <MkNoteSimple v-if="renote" :class="$style.targetNote" :hideFiles="true" :note="renote"/> - <div v-if="quoteId" :class="$style.withQuote"><i class="ti ti-quote"></i> {{ i18n.ts.quoteAttached }}<button @click="quoteId = null"><i class="ti ti-x"></i></button></div> + <MkNoteSimple v-if="renoteTargetNote" :class="$style.targetNote" :hideFiles="true" :note="renoteTargetNote"/> + <div v-if="quoteId" :class="$style.withQuote"><i class="ti ti-quote"></i> {{ i18n.ts.quoteAttached }}<button @click="quoteId = null; renoteTargetNote = null;"><i class="ti ti-x"></i></button></div> <div v-if="visibility === 'specified'" :class="$style.toSpecified"> <span style="margin-right: 8px;">{{ i18n.ts.recipient }}</span> <div :class="$style.visibleUsers"> @@ -106,13 +106,14 @@ SPDX-License-Identifier: AGPL-3.0-only </template> <script lang="ts" setup> -import { inject, watch, nextTick, onMounted, defineAsyncComponent, provide, shallowRef, ref, computed, toRaw } from 'vue'; +import { inject, watch, nextTick, onMounted, defineAsyncComponent, provide, shallowRef, ref, computed, toRaw, type ShallowRef } from 'vue'; import * as mfm from '@transfem-org/sfm-js'; import * as Misskey from 'misskey-js'; import insertTextAtCursor from 'insert-text-at-cursor'; -import { toASCII } from 'punycode/'; +import { toASCII } from 'punycode.js'; import { host, url } from '@@/js/config.js'; import type { MenuItem } from '@/types/menu.js'; +import type { PostFormProps } from '@/types/post-form.js'; import MkNoteSimple from '@/components/MkNoteSimple.vue'; import MkNotePreview from '@/components/MkNotePreview.vue'; import XPostFormAttaches from '@/components/MkPostFormAttaches.vue'; @@ -136,7 +137,6 @@ import { miLocalStorage } from '@/local-storage.js'; import { claimAchievement } from '@/scripts/achievements.js'; import { emojiPicker } from '@/scripts/emoji-picker.js'; import { mfmFunctionPicker } from '@/scripts/mfm-function-picker.js'; -import type { PostFormProps } from '@/types/post-form.js'; import MkScheduleEditor from '@/components/MkScheduleEditor.vue'; const $i = signinRequired(); @@ -202,12 +202,13 @@ const justEndedComposition = ref(false); const scheduleNote = ref<{ scheduledAt: number | null; } | null>(null); +const renoteTargetNote: ShallowRef<PostFormProps['renote'] | null> = shallowRef(props.renote); const draftKey = computed((): string => { let key = props.channel ? `channel:${props.channel.id}` : ''; - if (props.renote) { - key += `renote:${props.renote.id}`; + if (renoteTargetNote.value) { + key += `renote:${renoteTargetNote.value.id}`; } else if (props.reply) { key += `reply:${props.reply.id}`; } else { @@ -218,7 +219,7 @@ const draftKey = computed((): string => { }); const placeholder = computed((): string => { - if (props.renote) { + if (renoteTargetNote.value) { return i18n.ts._postForm.quotePlaceholder; } else if (props.reply) { return i18n.ts._postForm.replyPlaceholder; @@ -238,7 +239,7 @@ const placeholder = computed((): string => { }); const submitText = computed((): string => { - return props.renote + return renoteTargetNote.value ? i18n.ts.quote : props.reply ? i18n.ts.reply @@ -262,11 +263,12 @@ const canPost = computed((): boolean => { 1 <= textLength.value || 1 <= files.value.length || poll.value != null || - props.renote != null || + renoteTargetNote.value != null || quoteId.value != null ) && (textLength.value <= maxTextLength.value) && (cwLength.value <= maxCwLength.value) && + (files.value.length <= 16) && (!poll.value || poll.value.choices.length >= 2); }); @@ -647,7 +649,7 @@ async function onPaste(ev: ClipboardEvent) { const paste = ev.clipboardData.getData('text'); - if (!props.renote && !quoteId.value && paste.startsWith(url + '/notes/')) { + if (!renoteTargetNote.value && !quoteId.value && paste.startsWith(url + '/notes/')) { ev.preventDefault(); os.confirm({ @@ -863,7 +865,7 @@ async function post(ev?: MouseEvent) { text: text.value === '' ? null : text.value, fileIds: files.value.length > 0 ? files.value.map(f => f.id) : undefined, replyId: props.reply ? props.reply.id : undefined, - renoteId: props.renote ? props.renote.id : quoteId.value ? quoteId.value : undefined, + renoteId: renoteTargetNote.value ? renoteTargetNote.value.id : quoteId.value ? quoteId.value : undefined, channelId: props.channel ? props.channel.id : undefined, poll: poll.value, cw: useCw.value ? cw.value ?? '' : null, @@ -953,7 +955,7 @@ async function post(ev?: MouseEvent) { claimAchievement('brainDiver'); } - if (props.renote && (props.renote.userId === $i.id) && text.length > 0) { + if (renoteTargetNote.value && (renoteTargetNote.value.userId === $i.id) && text.length > 0) { claimAchievement('selfQuote'); } @@ -1163,7 +1165,7 @@ onMounted(() => { users.forEach(u => pushVisibleUser(u)); }); } - quoteId.value = init.renote ? init.renote.id : null; + quoteId.value = renoteTargetNote.value ? renoteTargetNote.value.id : null; reactionAcceptance.value = init.reactionAcceptance; if (init.isSchedule) { scheduleNote.value = { |