From 219c38805973dc073464a5c85ae9923e9a2855c3 Mon Sep 17 00:00:00 2001 From: Evan Date: Sat, 8 Jul 2023 02:11:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E5=9B=BE=E7=89=87=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E5=90=8D=E7=A7=B0=E5=92=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=BE=BD=E7=AB=A0=EF=BC=8C=E6=B6=88=E6=81=AF=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF=E6=9C=AA=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9B=BE=E7=89=87=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 1 + src/components/UserSettingBox/index.vue | 25 +++++-- src/utils/copy.ts | 27 +++++++ .../components/ChatBox/MsgInput/index.vue | 10 ++- .../Home/components/ChatBox/MsgInput/item.vue | 2 - .../ChatBox/PasteImageDialog/index.vue | 71 +++++++++++++++++++ .../ChatBox/PasteImageDialog/styles.scss | 19 +++++ src/views/Home/components/ChatBox/index.vue | 14 +++- .../components/ChatList/ContextMenu/index.vue | 21 ++++-- 9 files changed, 173 insertions(+), 17 deletions(-) create mode 100644 src/views/Home/components/ChatBox/PasteImageDialog/index.vue create mode 100644 src/views/Home/components/ChatBox/PasteImageDialog/styles.scss diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 113f8744..c1e3d820 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -28,5 +28,6 @@ module.exports = { '@typescript-eslint/no-explicit-any': 0, // 允许any类型 'no-param-reassign': 0, // 允许修改函数参数 'prefer-regex-literals': 0, // 允许使用new RegExp + 'no-unused-vars': 2, // 禁止未使用的变量 }, } diff --git a/src/components/UserSettingBox/index.vue b/src/components/UserSettingBox/index.vue index b75f51b1..7bbf5a16 100644 --- a/src/components/UserSettingBox/index.vue +++ b/src/components/UserSettingBox/index.vue @@ -4,6 +4,7 @@ import { useRequest } from 'alova' import { ElMessage } from 'element-plus' import { Select, CloseBold, EditPen } from '@element-plus/icons-vue' import { useUserStore } from '@/stores/user' +import { useCachedStore } from '@/stores/cached' import { SexEnum, IsYetEnum } from '@/enums' import type { BadgeType } from '@/services/types' import apis from '@/services/apis' @@ -30,6 +31,7 @@ const editName = reactive({ }) const userStore = useUserStore() +const cachedStore = useCachedStore() const userInfo = computed(() => userStore.userInfo) const { send: handlerGetBadgeList, data: badgeList } = useRequest(apis.getBadgeList, { @@ -47,12 +49,21 @@ const currentBadge = computed(() => badgeList.value.find((item) => item.obtain === IsYetEnum.YES && item.wearing === IsYetEnum.YES), ) +// 更新缓存里面的用户信息 +const updateCurrentUserCache = (key: 'name' | 'wearingItemId', value: any) => { + const currentUser = userStore.userInfo.uid && cachedStore.userCachedList[userStore.userInfo.uid] + if (currentUser) { + currentUser[key] = value // 更新缓存里面的用户信息 + } +} + // 佩戴卸下徽章 const toggleWarningBadge = async (badge: BadgeType) => { if (!badge?.id) return await apis.setUserBadge(badge.id).send() handlerGetBadgeList() badge.img && (userInfo.value.badge = badge.img) + updateCurrentUserCache('wearingItemId', badge.id) // 更新缓存里面的用户徽章 } // 编辑用户名 @@ -73,13 +84,15 @@ const onSaveUserName = async () => { return } editName.saving = true - await apis.modifyUserName(editName.tempName).send() - userStore.userInfo.name = editName.tempName - editName.saving = false - editName.isEdit = false - editName.tempName = '' + + await apis.modifyUserName(editName.tempName).send() // 更改用户名 + userStore.userInfo.name = editName.tempName // 更新用户信息里面的用户名 + updateCurrentUserCache('name', editName.tempName) // 更新缓存里面的用户信息 + // 重置状态 + onCancelEditName() + // 没有更名机会就不走下去 if (!userInfo.value?.modifyNameChance || userInfo.value.modifyNameChance === 0) return - userInfo.value.modifyNameChance = userInfo.value?.modifyNameChance - 1 + userInfo.value.modifyNameChance = userInfo.value?.modifyNameChance - 1 // 减少更名次数 } // 确认保存用户名 const onCancelEditName = async () => { diff --git a/src/utils/copy.ts b/src/utils/copy.ts index efcdb31b..4008a6df 100644 --- a/src/utils/copy.ts +++ b/src/utils/copy.ts @@ -15,3 +15,30 @@ export const copyToClip = (text: string) => { } }) } + +export const handleCopyImg = (imgUrl: string) => { + const canvas = document.createElement('canvas') + const ctx = canvas.getContext('2d') + const img = new Image() + img.crossOrigin = 'Anonymous' + img.src = imgUrl + img.onload = () => { + if (!ctx) return + canvas.width = img.width + canvas.height = img.height + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height) + ctx.drawImage(img, 0, 0) // 将canvas转为blob + canvas.toBlob(async (blob) => { + if (!blob) return + const data = [new ClipboardItem({ [blob.type]: blob })] // https://w3c.github.io/clipboard-apis/#dom-clipboard-write + try { + await navigator.clipboard.write(data) + // console.log('Copied to clipboard successfully!') + } catch (error) { + // console.error('Unable to write to clipboard.') + } finally { + canvas.remove() + } + }) + } +} diff --git a/src/views/Home/components/ChatBox/MsgInput/index.vue b/src/views/Home/components/ChatBox/MsgInput/index.vue index 4e96db63..dda534ee 100644 --- a/src/views/Home/components/ChatBox/MsgInput/index.vue +++ b/src/views/Home/components/ChatBox/MsgInput/index.vue @@ -1,6 +1,6 @@ diff --git a/src/views/Home/components/ChatBox/MsgInput/item.vue b/src/views/Home/components/ChatBox/MsgInput/item.vue index 0025f5c0..0e6f764f 100644 --- a/src/views/Home/components/ChatBox/MsgInput/item.vue +++ b/src/views/Home/components/ChatBox/MsgInput/item.vue @@ -17,8 +17,6 @@ const props = defineProps({ onSelect: Function, }) -const emit = defineEmits(['select']) - const onClick = () => { props.onSelect?.(props.item) } diff --git a/src/views/Home/components/ChatBox/PasteImageDialog/index.vue b/src/views/Home/components/ChatBox/PasteImageDialog/index.vue new file mode 100644 index 00000000..edfe93ba --- /dev/null +++ b/src/views/Home/components/ChatBox/PasteImageDialog/index.vue @@ -0,0 +1,71 @@ + + + + +