Commit 9df3686e authored by chenqikuai's avatar chenqikuai

update

parent 412ef978
...@@ -1269,6 +1269,11 @@ ...@@ -1269,6 +1269,11 @@
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
"dev": true "dev": true
}, },
"@quasar/extras": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.0.0.tgz",
"integrity": "sha512-cEsCTkpwcCoPAOLtZp6ek0Gjbp9MbhCUrwpvx/GWuvPzjetIehOQcN0SV84cJmoLt//RB8LxHIR/lQXejNuiAw=="
},
"@soda/friendly-errors-webpack-plugin": { "@soda/friendly-errors-webpack-plugin": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz", "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
}, },
"dependencies": { "dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1", "@amap/amap-jsapi-loader": "^1.0.1",
"@quasar/extras": "^1.0.0",
"ali-oss": "^6.16.0", "ali-oss": "^6.16.0",
"autosize": "^5.0.1", "autosize": "^5.0.1",
"axios": "^0.21.1", "axios": "^0.21.1",
......
...@@ -8,15 +8,15 @@ import quasarConfig from './plugins/quasar-config' ...@@ -8,15 +8,15 @@ import quasarConfig from './plugins/quasar-config'
import '@/assets/styles/style.less' import '@/assets/styles/style.less'
import '@/styles/quasar.scss' import '@/styles/quasar.scss'
import 'quasar/dist/quasar.css' import 'quasar/dist/quasar.css'
// import '@quasar/extras/roboto-font/roboto-font.css' import '@quasar/extras/roboto-font/roboto-font.css'
// import '@quasar/extras/material-icons/material-icons.css' import '@quasar/extras/material-icons/material-icons.css'
// import '@quasar/extras/material-icons-outlined/material-icons-outlined.css' // import '@quasar/extras/material-icons-outlined/material-icons-outlined.css'
// import '@quasar/extras/material-icons-round/material-icons-round.css' // import '@quasar/extras/material-icons-round/material-icons-round.css'
// import '@quasar/extras/material-icons-sharp/material-icons-sharp.css' // import '@quasar/extras/material-icons-sharp/material-icons-sharp.css'
// import '@quasar/extras/fontawesome-v5/fontawesome-v5.css' import '@quasar/extras/fontawesome-v5/fontawesome-v5.css'
// import '@quasar/extras/ionicons-v4/ionicons-v4.css' import '@quasar/extras/ionicons-v4/ionicons-v4.css'
// import '@quasar/extras/mdi-v4/mdi-v4.css' // import '@quasar/extras/mdi-v4/mdi-v4.css'
// import '@quasar/extras/eva-icons/eva-icons.css' import '@quasar/extras/eva-icons/eva-icons.css'
createApp(App) createApp(App)
.use(router) .use(router)
......
<template> <template>
<q-img <q-img
@click="viewImage" @click="viewImage"
:src="imgSrc" :src="imgSrc"
:ratio="content.width / content.height" :ratio="content.width / content.height"
class="bg-white w-36 relative rounded-md" class="bg-white !w-36 relative rounded-md"
style="max-height: 150px" style="max-height: 150px"
:no-spinner="fromMyself" :no-spinner="fromMyself"
spinner-size="md" spinner-size="md"
spinner-color="primary" spinner-color="primary"
> >
<!-- 图片上灰色遮罩 --> <!-- 图片上灰色遮罩 -->
<transition name="fade"> <transition name="fade">
<div v-if="showProgress" class="absolute-full flex flex-center"> <div v-if="showProgress" class="absolute-full flex flex-center">
<!-- 上传进度圆圈 --> <!-- 上传进度圆圈 -->
<q-circular-progress <q-circular-progress
:value="uploadProgress.percentage" :value="uploadProgress.percentage"
size="45px" size="45px"
:thickness="1" :thickness="1"
color="white" color="white"
track-color="grey-6" track-color="grey-6"
class="q-ma-md" class="q-ma-md"
/></div /></div
></transition> ></transition>
</q-img> </q-img>
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent } from 'vue' import { computed, defineComponent } from "vue";
import { useQuasar } from 'quasar' import { useQuasar } from "quasar";
import MediaViewerVue from '@/components/MediaViewer.vue' import MediaViewerVue from "@/components/MediaViewer.vue";
let mark = 0;
export default defineComponent({ export default defineComponent({
props: { fromMyself: Boolean, content: Object, state: String, uploadProgress: Object }, props: {
fromMyself: Boolean,
content: Object,
state: String,
uploadProgress: Object,
},
setup(props) { setup(props) {
const imgSrc = computed(() => { const imgSrc = computed(() => {
if (props?.content?.rawMessage) { if (props?.content?.rawMessage) {
return URL.createObjectURL(props?.content?.rawMessage) return URL.createObjectURL(props?.content?.rawMessage);
} else { } else {
return props?.content?.mediaUrl return props?.content?.mediaUrl;
} }
}) });
const showProgress = computed(() => { const showProgress = computed(() => {
if (props.state === 'pending') { if (props.state === "pending") {
return props.uploadProgress != undefined && props.uploadProgress.percentage < 100 return (
} else { props.uploadProgress != undefined &&
return false props.uploadProgress.percentage < 100
} );
}) } else {
return false;
}
});
const quasar = useQuasar() const quasar = useQuasar();
const viewImage = () => { const viewImage = () => {
quasar.dialog({ if (new Date().getTime() - mark >= 200) {
component: MediaViewerVue, quasar.dialog({
componentProps: { component: MediaViewerVue,
type: 'image', componentProps: {
url: imgSrc.value, type: "image",
ratio: props?.content?.width / props?.content?.height, url: imgSrc.value,
}, ratio: props?.content?.width / props?.content?.height,
}) },
} });
mark = new Date().getTime();
}
};
return { imgSrc, showProgress, viewImage } return { imgSrc, showProgress, viewImage };
}, },
}) });
</script> </script>
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
@click="viewVideo" @click="viewVideo"
:src="posterImgSrc" :src="posterImgSrc"
:ratio="content.width / content.height" :ratio="content.width / content.height"
class="bg-white w-36 relative rounded-md" class="bg-white !w-36 relative rounded-md"
style="max-height: 150px; min-height: 100px" style="max-height: 150px; min-height: 100px"
:no-spinner="fromMyself" :no-spinner="fromMyself"
spinner-size="md" spinner-size="md"
......
...@@ -21,11 +21,11 @@ ...@@ -21,11 +21,11 @@
<!-- 没有输入文字,显示 `加号` 按钮 --> <!-- 没有输入文字,显示 `加号` 按钮 -->
<button <button
v-if="false" v-if="!inputText"
@click="showMenu ? (showMenu = false) : (showMenu = true)" @click="showMenu ? (showMenu = false) : (showMenu = true)"
class="w-7 h-7 mx-2.5 text-center select-none focus:outline-none" class="w-7 h-7 mx-2.5 text-center select-none focus:outline-none"
> >
<i class="iconfont text-primary text-xl">&#xe605;</i> <i class="iconfont !text-xl text-black">&#xe605;</i>
</button> </button>
<!-- 有输入文字,显示 `发送` 按钮 --> <!-- 有输入文字,显示 `发送` 按钮 -->
<button <button
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
class="min-h-input-menu flex items-center px-8 text-sm text-subtle" class="min-h-input-menu flex items-center px-8 text-sm text-subtle"
> >
<ChatInputAlbumVue /> <ChatInputAlbumVue />
<ChatInputCameraVue /> <!-- <ChatInputCameraVue /> -->
</div> </div>
</template> </template>
......
...@@ -6,18 +6,19 @@ ...@@ -6,18 +6,19 @@
ref="input" ref="input"
name="file" name="file"
type="file" type="file"
accept=".png, .jpg, .jpeg, .gif, .mov, .mp4, .m4v" accept="video/*,image/*"
@change="receiveImage" @change="receiveImage"
/> />
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, reactive, ref } from 'vue' import { defineComponent, nextTick, reactive, ref } from 'vue'
import iconUrl from '@/assets/input_menu_album.png' import iconUrl from '@/assets/input_menu_album.png'
import ChatInputMenuButtonVue from '@/views/Chat/ChatInputMenuButton.vue' import ChatInputMenuButtonVue from '@/views/Chat/ChatInputMenuButton.vue'
import { messageStore } from '@/store/messagesStore' import { messageStore } from '@/store/messagesStore'
import { ChatMessageTypes } from '@/types/chatMessageTypes' import { ChatMessageTypes } from '@/types/chatMessageTypes'
import compress from '@/utils/compressor' import compress from '@/utils/compressor'
import { Toast } from 'vant'
export default defineComponent({ export default defineComponent({
components: { ChatInputMenuButtonVue }, components: { ChatInputMenuButtonVue },
...@@ -75,6 +76,9 @@ export default defineComponent({ ...@@ -75,6 +76,9 @@ export default defineComponent({
URL.revokeObjectURL(video.src) URL.revokeObjectURL(video.src)
} }
} else { } else {
nextTick(()=>{
Toast.fail("未能识别的文件类型")
})
throw '未能识别的文件类型' throw '未能识别的文件类型'
} }
......
<template> <template>
<textarea <textarea
ref="textarea" ref="textarea"
@keydown.enter.prevent="sendTextMessage" @keydown.enter.prevent="sendTextMessage"
class="enable-touch flex-grow border-none outline-none py-2.5 h-9" class="enable-touch flex-grow border-none outline-none py-2.5 h-9 my-2"
v-model="inputText" v-model="inputText"
style="max-height: 6em" style="
type="text" max-height: 6em;
placeholder="想说点什么呢..." background: #f5f6f9;
:input-class="['text-base']" border-radius: 19px;
/> margin-left: 5px;
"
type="text"
placeholder="想说点什么呢..."
:input-class="['text-base']"
/>
</template> </template>
<script lang="ts"> <script lang="ts">
import { textInputStore } from '@/store/textInputStore' import { textInputStore } from "@/store/textInputStore";
import { MessageContent } from '@/types/chat-message' import { MessageContent } from "@/types/chat-message";
import { ref } from '@vue/reactivity' import { ref } from "@vue/reactivity";
import { defineComponent, onMounted } from '@vue/runtime-core' import { defineComponent, nextTick, onMounted, watch } from "@vue/runtime-core";
import autosize from 'autosize' import autosize from "autosize";
export default defineComponent({ export default defineComponent({
emits: ['send'], emits: ["send"],
setup(props, { emit }) { setup(props, { emit }) {
/** 文本输入框中的实时内容 */
/** 文本输入框中的实时内容 */ const inputText = textInputStore.inputText;
const inputText = textInputStore.inputText
/** 告诉父组件要发送一条文本消息 */ /** 告诉父组件要发送一条文本消息 */
const sendTextMessage = () => { const sendTextMessage = () => {
const textMessageContent: MessageContent = { content: inputText.value } const textMessageContent: MessageContent = { content: inputText.value };
inputText.value && emit('send', { type: 1, content: textMessageContent }) inputText.value && emit("send", { type: 1, content: textMessageContent });
} };
/** 限定 textarea 的最大长度 */ watch(inputText, (newv, oldv) => {
const textarea = ref<HTMLTextAreaElement | null>(null) if (inputText.value.length >= 500) {
onMounted(() => textarea.value && autosize(textarea.value)) inputText.value = oldv;
}
if (inputText.value === "") {
nextTick(() => {
textarea.value && autosize(textarea.value);
});
}
});
return { inputText, sendTextMessage, textarea } /** 限定 textarea 的最大长度 */
}, const textarea = ref<HTMLTextAreaElement | null>(null);
}) onMounted(() => textarea.value && autosize(textarea.value));
return { inputText, sendTextMessage, textarea };
},
});
</script> </script>
...@@ -79,6 +79,9 @@ module.exports = { ...@@ -79,6 +79,9 @@ module.exports = {
padding: ['responsive', 'important'], padding: ['responsive', 'important'],
backgroundColor: ['responsive', 'important'], backgroundColor: ['responsive', 'important'],
borderRadius: ['responsive', 'important'], borderRadius: ['responsive', 'important'],
fontSize: ['responsive', "important"],
width: ['responsive', "important"],
height: ['responsive', "important"],
}, },
plugins: [ plugins: [
plugin(function ({ addVariant }) { plugin(function ({ addVariant }) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment