UNPKG

@tencentcloud/chat-uikit-uniapp

Version:

TUIKit 是基于 IM SDK 实现的一套 UI 组件,其包含会话、聊天、群组、个人资料等功能,基于这些精心设计的 UI 组件,您可以快速构建优雅的、可靠的、可扩展的 Chat 应用。

184 lines (166 loc) 4.88 kB
import { ref, computed } from '../../../../adapter-vue'; import { TUIStore, StoreName, IConversationModel } from '@tencentcloud/chat-uikit-engine-lite'; import { TUIGlobal } from '@tencentcloud/universal-api'; import { isPC, isUniFrameWork } from '../../../../utils/env'; import TUIChatConfig from '../../config'; import { TOOLBAR_DISPLAY_CONFIG, ICON_SIZE_CONFIG, MEDIA_CHOOSE_CONFIG, UploadType, SourceType, PlatformType, } from './constants'; import { sendImageMessage, sendVideoMessage, sendFileMessage, handleWebFileSelect, } from './utils'; export function genSourceType(uploadType: UploadType): SourceType { if (uploadType === UploadType.CAMERA) { return SourceType.CAMERA; } return SourceType.ALBUM; } export function useUpload(uploadType: UploadType) { const inputRef = ref(); const currentConversation = ref<IConversationModel>(); const theme = TUIChatConfig.getTheme(); TUIStore.watch(StoreName.CONV, { currentConversation: (conversation: IConversationModel) => { currentConversation.value = conversation; }, }); const sourceType = genSourceType(uploadType); const toolbarConfig = computed(() => { const config = TOOLBAR_DISPLAY_CONFIG[uploadType]; if (isUniFrameWork) { const displayConfig = (config as any)[PlatformType.UNI]; return { icon: displayConfig.icon, title: displayConfig.title, iconWidth: ICON_SIZE_CONFIG.UNI.WIDTH, iconHeight: ICON_SIZE_CONFIG.UNI.HEIGHT, }; } else { const displayConfig = (config as any)[PlatformType.WEB]; return { icon: displayConfig.getIcon ? displayConfig.getIcon(theme) : displayConfig.icon, title: displayConfig.title, iconWidth: ICON_SIZE_CONFIG.WEB.WIDTH, iconHeight: ICON_SIZE_CONFIG.WEB.HEIGHT, }; } }); const handleIconClick = () => { if (isUniFrameWork) { handleUniAppClick(); } else { handleWebClick(); } }; const handleUniAppClick = () => { switch (uploadType) { case UploadType.IMAGE: chooseImageInUniApp(); break; case UploadType.VIDEO: chooseVideoInUniApp(); break; case UploadType.ALBUM: chooseMediaInUniApp(); break; case UploadType.CAMERA: chooseCameraInUniApp(); break; default: break; } }; const handleWebClick = () => { if (inputRef.value?.click) { inputRef.value.click(); } }; const chooseImageInUniApp = () => { TUIGlobal?.chooseImage({ count: MEDIA_CHOOSE_CONFIG.IMAGE.COUNT, sourceType: [sourceType], success: function (res: Record<string, any>) { if (currentConversation.value) { sendImageMessage(currentConversation.value, res); } }, }); }; const chooseVideoInUniApp = () => { TUIGlobal?.chooseVideo({ count: MEDIA_CHOOSE_CONFIG.VIDEO.COUNT, sourceType: [sourceType], compressed: MEDIA_CHOOSE_CONFIG.VIDEO.COMPRESSED, success: function (res: Record<string, any>) { if (currentConversation.value) { sendVideoMessage(currentConversation.value, res); } }, }); }; const chooseMediaInUniApp = () => { TUIGlobal?.chooseImage({ count: MEDIA_CHOOSE_CONFIG.IMAGE.COUNT, sourceType: [SourceType.ALBUM, SourceType.CAMERA], success: function (res: Record<string, any>) { if (currentConversation.value) { sendImageMessage(currentConversation.value, res); } }, }); }; const chooseCameraInUniApp = () => { TUIGlobal?.chooseVideo({ count: MEDIA_CHOOSE_CONFIG.VIDEO.COUNT, sourceType: [SourceType.ALBUM, SourceType.CAMERA], compressed: MEDIA_CHOOSE_CONFIG.VIDEO.COMPRESSED, success: function (res: Record<string, any>) { if (currentConversation.value) { sendVideoMessage(currentConversation.value, res); } }, }); }; const handleWebFileChange = (event: Event) => { switch (uploadType) { case UploadType.IMAGE: handleWebFileSelect(event, (file) => { if (currentConversation.value) { sendImageMessage(currentConversation.value, file); } }); break; case UploadType.VIDEO: handleWebFileSelect(event, (file) => { if (currentConversation.value) { sendVideoMessage(currentConversation.value, file); } }); break; case UploadType.FILE: handleWebFileSelect(event, (file) => { if (currentConversation.value) { sendFileMessage(currentConversation.value, file); } }); break; } }; return { inputRef, currentConversation, toolbarConfig, isPC, isUniFrameWork, handleIconClick, handleWebFileChange, }; }