memi-board 0.44.0 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { imeSafeSubmitClick, imeSafeSubmitPointerDown } from 'memi-board/runtime'
2
3
  import { computed, ref } from 'vue'
3
4
  import { canWriteCommentByRole, useMemiBoardAuth } from 'memi-board/runtime'
4
5
  import { COMMENT_BODY_MAX_LENGTH, useMemiBoardComments } from 'memi-board/runtime'
@@ -35,6 +36,7 @@ const submitting = ref(false)
35
36
  const error = ref('')
36
37
 
37
38
  async function handleSubmit() {
39
+ if (submitting.value) return
38
40
  error.value = ''
39
41
  if (!body.value.trim()) return
40
42
  if (!user.value) {
@@ -116,6 +118,8 @@ async function handleSubmit() {
116
118
  />
117
119
  <UButton
118
120
  type="submit"
121
+ @pointerdown="imeSafeSubmitPointerDown"
122
+ @click="imeSafeSubmitClick"
119
123
  size="sm"
120
124
  :label="parent ? '답글 작성' : '댓글 작성'"
121
125
  :loading="submitting"
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { imeSafeSubmitClick, imeSafeSubmitPointerDown } from 'memi-board/runtime'
2
3
  import { computed, inject, ref, watch } from 'vue'
3
4
  import { Timestamp } from 'firebase/firestore'
4
5
  import dayjs from 'dayjs'
@@ -80,6 +81,7 @@ function cancelEdit() {
80
81
  }
81
82
 
82
83
  async function saveEdit() {
84
+ if (saving.value) return
83
85
  const body = editBody.value.trim()
84
86
  if (!props.comment.id || !body || body === localBody.value) {
85
87
  if (body === localBody.value) editing.value = false
@@ -201,6 +203,8 @@ async function toggleLike() {
201
203
  />
202
204
  <UButton
203
205
  type="submit"
206
+ @pointerdown="imeSafeSubmitPointerDown"
207
+ @click="imeSafeSubmitClick"
204
208
  label="저장"
205
209
  size="xs"
206
210
  :loading="saving"
@@ -7,6 +7,7 @@
7
7
  * 커스텀은 handlers.image(파일 업로드), YouTube 임베드 + DOM paste/drop.
8
8
  */
9
9
  import { ref, computed, watch } from 'vue'
10
+ import { imeSafeSubmitClick, imeSafeSubmitPointerDown } from 'memi-board/runtime'
10
11
  import Youtube from '@tiptap/extension-youtube'
11
12
  import type { DropdownMenuItem, EditorSuggestionMenuItem } from '@nuxt/ui'
12
13
  import { mapEditorItems } from '@nuxt/ui/utils/editor'
@@ -932,6 +933,7 @@ function friendlyWriteError(e: unknown): string {
932
933
  }
933
934
 
934
935
  async function handleSubmit() {
936
+ if (saving.value) return
935
937
  error.value = ''
936
938
  const imageBoard = isImageEditor.value
937
939
  if (!imageBoard && !title.value.trim()) {
@@ -1346,6 +1348,8 @@ async function handleSubmit() {
1346
1348
  :loading="saving"
1347
1349
  :disabled="isWriteRestricted || imageUploading"
1348
1350
  :label="isEdit ? '수정 완료' : '다음: 미리보기'"
1351
+ @pointerdown="imeSafeSubmitPointerDown"
1352
+ @click="imeSafeSubmitClick"
1349
1353
  />
1350
1354
  <UButton
1351
1355
  type="button"
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { imeSafeSubmitClick, imeSafeSubmitPointerDown } from 'memi-board/runtime'
2
3
  import { computed, ref } from 'vue'
3
4
  import {
4
5
  REPORT_DETAIL_MAX_LENGTH,
@@ -38,6 +39,7 @@ function openModal() {
38
39
  }
39
40
 
40
41
  async function submit() {
42
+ if (pending.value) return
41
43
  error.value = ''
42
44
  try {
43
45
  await submitReport({
@@ -105,6 +107,8 @@ async function submit() {
105
107
  />
106
108
  <UButton
107
109
  type="submit"
110
+ @pointerdown="imeSafeSubmitPointerDown"
111
+ @click="imeSafeSubmitClick"
108
112
  color="warning"
109
113
  label="신고하기"
110
114
  :loading="pending"
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { imeSafeSubmitClick, imeSafeSubmitPointerDown } from 'memi-board/runtime'
2
3
  import { ref, computed } from 'vue'
3
4
  import { useMemiBoardConfig } from 'memi-board/runtime'
4
5
  import { useMemiBoardAuth } from 'memi-board/runtime'
@@ -45,6 +46,7 @@ async function handleApple() {
45
46
  }
46
47
 
47
48
  async function handleEmailSubmit() {
49
+ if (loading.value) return
48
50
  loading.value = true
49
51
  error.value = ''
50
52
  try {
@@ -121,6 +123,8 @@ async function handleEmailSubmit() {
121
123
  />
122
124
  <UButton
123
125
  type="submit"
126
+ @pointerdown="imeSafeSubmitPointerDown"
127
+ @click="imeSafeSubmitClick"
124
128
  block
125
129
  :loading="loading"
126
130
  :label="mode === 'signin' ? '로그인' : '회원가입'"
@@ -0,0 +1,2 @@
1
+ export declare function imeSafeSubmitPointerDown(e: PointerEvent): void;
2
+ export declare function imeSafeSubmitClick(e: MouseEvent): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memi-board",
3
- "version": "0.44.0",
3
+ "version": "0.44.1",
4
4
  "type": "module",
5
5
  "description": "Nuxt 4 + Nuxt UI + VueFire/Firebase 전용 게시판 모듈",
6
6
  "license": "MIT",