Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fns_front_2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chenqikuai
fns_front_2
Commits
0f5069c2
Commit
0f5069c2
authored
Aug 27, 2021
by
chenqikuai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
b1a9feea
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
102 additions
and
47 deletions
+102
-47
colors.config.js
colors.config.js
+1
-1
Chat.vue
src/views/Chat/Chat.vue
+3
-2
ChatContent.vue
src/views/Chat/ChatContent.vue
+46
-32
ChatContentMessage.vue
src/views/Chat/ChatContentMessage.vue
+14
-1
ChatContentMessageText.vue
src/views/Chat/ChatContentMessageText.vue
+37
-11
tailwind.config.js
tailwind.config.js
+1
-0
No files found.
colors.config.js
View file @
0f5069c2
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
const
colors
=
{
const
colors
=
{
primary
:
'#1888FA'
,
primary
:
'#1888FA'
,
secondary
:
'#
E8F3F
F'
,
secondary
:
'#
3E4FA
F'
,
'secondary-focus'
:
'#D6E3F0'
,
'secondary-focus'
:
'#D6E3F0'
,
dark
:
'#24374E'
,
dark
:
'#24374E'
,
negative
:
'#db394c'
,
negative
:
'#db394c'
,
...
...
src/views/Chat/Chat.vue
View file @
0f5069c2
<
template
>
<
template
>
<div
class=
"flex flex-col flex-nowrap
h-full
text-base bg-gray-50 h-screen"
>
<div
class=
"flex flex-col flex-nowrap text-base bg-gray-50 h-screen"
>
<!-- 没连上时界面上只有一个返回按钮 -->
<!-- 没连上时界面上只有一个返回按钮 -->
<!-- 👇是返回按钮 -->
<!-- 👇是返回按钮 -->
<!--
<div
<!--
<div
...
@@ -134,7 +134,8 @@ export default defineComponent({
...
@@ -134,7 +134,8 @@ export default defineComponent({
// 收到的非本笔订单的消息不处理
// 收到的非本笔订单的消息不处理
// if (msg.orderid !== orderid) return;
// if (msg.orderid !== orderid) return;
msg
&&
messageStore
.
displayNewMessage
({
msg
&&
messageStore
.
displayNewMessage
({
content
:
msg
.
content
,
content
:
msg
.
content
,
from
:
msg
.
from
,
from
:
msg
.
from
,
uuid
:
msg
.
uuid
,
uuid
:
msg
.
uuid
,
...
...
src/views/Chat/ChatContent.vue
View file @
0f5069c2
<
template
>
<
template
>
<!-- style="flex-basis: 0px" 是为了兼容 iOS 和 macOS 下的 Safari 浏览器,如果没有这个样式,整个聊天列表无法显示 -->
<!-- style="flex-basis: 0px" 是为了兼容 iOS 和 macOS 下的 Safari 浏览器,如果没有这个样式,整个聊天列表无法显示 -->
<q-scroll-area
ref=
"scrollArea"
class=
"flex-grow"
style=
"flex-basis: 0px"
:visible=
"false"
>
<q-scroll-area
<q-pull-to-refresh
ref=
"scrollArea"
class=
"flex-grow"
style=
"flex-basis: 0px"
:visible=
"false"
>
<!--
<q-pull-to-refresh
v-if=
"messages.length"
v-if=
"messages.length"
@
refresh=
"loadMore"
@
refresh=
"loadMore"
:disable=
"noMoreMessages || messages.length === 0"
:disable=
"noMoreMessages || messages.length === 0"
icon=
"history"
icon=
"history"
class=
"h-full w-full absolute"
class=
"h-full w-full absolute"
>
>
-->
<div
class=
"text-center py-2.5 text-xs font-medium text-subtle"
>
<!--
<div
class=
"text-center py-2.5 text-xs font-medium text-subtle"
>
<div
v-if=
"noMoreMessages && messages.length >= 10"
>
没有更多消息
</div>
<div
v-if=
"noMoreMessages && messages.length >= 10"
>
没有更多消息
</div>
<div
v-else-if=
"!noMoreMessages && messages.length >= 10"
>
<div
v-else-if=
"!noMoreMessages && messages.length >= 10"
>
{{
isMobile
?
'下滑加载更多'
:
'按住鼠标向下拖拽以加载更多'
}}
{{
isMobile
?
'下滑加载更多'
:
'按住鼠标向下拖拽以加载更多'
}}
</div>
</div>
</div>
</div>
-->
<ChatContentMessageVue
<ChatContentMessageVue
v-for=
"message in messages"
v-for=
"message in messages"
:key=
"message.uuid"
:key=
"message.uuid"
...
@@ -27,54 +32,63 @@
...
@@ -27,54 +32,63 @@
:hideDatetime=
"message.hideDatetime"
:hideDatetime=
"message.hideDatetime"
:uploadProgress=
"message.uploadProgress"
:uploadProgress=
"message.uploadProgress"
/>
/>
</q-pull-to-refresh
>
<!--
</q-pull-to-refresh>
--
>
</q-scroll-area>
</q-scroll-area>
</
template
>
</
template
>
<
script
lang=
"ts"
>
<
script
lang=
"ts"
>
import
{
defineComponent
,
nextTick
,
watch
}
from
'vue'
import
{
defineComponent
,
nextTick
,
watch
}
from
"vue"
;
import
{
from
}
from
'@/store/appCallerStore'
import
{
from
}
from
"@/store/appCallerStore"
;
import
{
DisplayMessage
,
messageStore
}
from
'@/store/messagesStore'
import
{
DisplayMessage
,
messageStore
}
from
"@/store/messagesStore"
;
import
useScrollTo
from
'@/composables/useScrollTo'
import
useScrollTo
from
"@/composables/useScrollTo"
;
import
ChatContentMessageVue
from
'./ChatContentMessage.vue'
import
ChatContentMessageVue
from
"./ChatContentMessage.vue"
;
import
{
date
,
Platform
}
from
'quasar'
import
{
date
,
Platform
}
from
"quasar"
;
export
default
defineComponent
({
export
default
defineComponent
({
components
:
{
ChatContentMessageVue
},
components
:
{
ChatContentMessageVue
},
setup
()
{
setup
()
{
const
messages
=
messageStore
.
messages
const
messages
=
messageStore
.
messages
;
const
noMoreMessages
=
messageStore
.
noMoreHistoryMessages
const
noMoreMessages
=
messageStore
.
noMoreHistoryMessages
;
const
myid
=
from
const
myid
=
from
;
const
formatDate
=
date
.
formatDate
const
formatDate
=
date
.
formatDate
;
const
isMobile
=
Platform
.
is
.
mobile
const
isMobile
=
Platform
.
is
.
mobile
;
// 监听「下拉加载更多」操作,记录当前的第一条消息 id
// 监听「下拉加载更多」操作,记录当前的第一条消息 id
let
firstMessageSnapshot
:
DisplayMessage
let
firstMessageSnapshot
:
DisplayMessage
;
const
loadMore
=
(
done
?:
()
=>
void
)
=>
{
const
loadMore
=
(
done
?:
()
=>
void
)
=>
{
firstMessageSnapshot
=
messages
[
0
]
firstMessageSnapshot
=
messages
[
0
];
retrieveMessages
().
then
(()
=>
done
&&
done
())
retrieveMessages
().
then
(()
=>
done
&&
done
());
}
};
const
retrieveMessages
=
():
Promise
<
void
>
=>
{
const
retrieveMessages
=
():
Promise
<
void
>
=>
{
return
new
Promise
((
resolve
)
=>
{
return
new
Promise
((
resolve
)
=>
{
messageStore
.
retrieveMessages
().
then
(()
=>
resolve
())
messageStore
.
retrieveMessages
().
then
(()
=>
resolve
());
})
});
}
};
retrieveMessages
()
// retrieveMessages();
// 收到新消息时滚动至底部
// 收到新消息时滚动至底部
const
{
scrollToBottom
,
scrollArea
,
scrollToElement
}
=
useScrollTo
()
const
{
scrollToBottom
,
scrollArea
,
scrollToElement
}
=
useScrollTo
();
watch
(
messages
,
()
=>
{
watch
(
messages
,
()
=>
{
nextTick
(()
=>
{
nextTick
(()
=>
{
if
(
messageStore
.
appendingNewMessage
.
value
)
{
if
(
messageStore
.
appendingNewMessage
.
value
)
{
scrollToBottom
()
scrollToBottom
();
}
else
{
}
else
{
scrollToElement
(
document
.
getElementById
(
firstMessageSnapshot
.
uuid
))
scrollToElement
(
document
.
getElementById
(
firstMessageSnapshot
.
uuid
));
}
}
})
});
})
});
return
{
scrollToBottom
,
scrollArea
,
messages
,
noMoreMessages
,
isMobile
,
myid
,
formatDate
,
loadMore
}
return
{
scrollToBottom
,
scrollArea
,
messages
,
noMoreMessages
,
isMobile
,
myid
,
formatDate
,
loadMore
,
};
},
},
})
})
;
</
script
>
</
script
>
src/views/Chat/ChatContentMessage.vue
View file @
0f5069c2
...
@@ -17,13 +17,25 @@
...
@@ -17,13 +17,25 @@
min-w-chat-msg-avatar
min-w-chat-msg-avatar
w-chat-msg-avatar
w-chat-msg-avatar
h-chat-msg-avatar
h-chat-msg-avatar
rounded-lg
!rounded-md
"
"
>
>
<img
:src=
"default_avatar_url"
/>
<img
:src=
"default_avatar_url"
/>
</q-avatar>
</q-avatar>
<!-- 消息气泡 -->
<!-- 消息气泡 -->
<div
:class=
"[
{ 'flex-row-reverse': fromMyself }]">
<div
class=
"text-right"
style=
"
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #adadad;
"
>
15990184793
</div>
<div
<div
:class=
"[
{ 'flex-row-reverse': fromMyself }]"
:class=
"[
{ 'flex-row-reverse': fromMyself }]"
class="flex items-center max-w-chat-msg-bubble"
class="flex items-center max-w-chat-msg-bubble"
...
@@ -89,6 +101,7 @@
...
@@ -89,6 +101,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<
script
lang=
"ts"
>
<
script
lang=
"ts"
>
...
...
src/views/Chat/ChatContentMessageText.vue
View file @
0f5069c2
<
template
>
<
template
>
<div
<div
:class=
"[
:class=
"[
fromMyself ? 'bg-secondary
' : 'bg-white',
fromMyself ? 'bg-secondary text-white
' : 'bg-white',
fromMyself ? 'rounded-chat-msg-bubble-myself' : 'rounded-chat-msg-bubble-opposite
',
fromMyself ? 'message-box-self' : 'message-box-other
',
]"
]"
class=
"py-3 px-4 max-w-chat-msg-text break-all
"
class=
"py-3 px-4 max-w-chat-msg-text break-all message-box rounded-md
"
>
>
<a
<a
v-if=
"isUrlMessage"
v-if=
"isUrlMessage"
...
@@ -20,20 +20,46 @@
...
@@ -20,20 +20,46 @@
</
template
>
</
template
>
<
script
lang=
"ts"
>
<
script
lang=
"ts"
>
import
{
computed
,
defineComponent
}
from
'vue'
import
{
computed
,
defineComponent
}
from
"vue"
;
import
isUrl
from
'@/utils/is-url'
import
isUrl
from
"@/utils/is-url"
;
import
prependHttp
from
'prepend-http'
import
prependHttp
from
"prepend-http"
;
export
default
defineComponent
({
export
default
defineComponent
({
props
:
{
fromMyself
:
Boolean
,
content
:
Object
},
props
:
{
fromMyself
:
Boolean
,
content
:
Object
},
setup
(
props
)
{
setup
(
props
)
{
const
textMessage
=
computed
(()
=>
props
.
content
?.
content
)
const
textMessage
=
computed
(()
=>
props
.
content
?.
content
);
const
isUrlMessage
=
computed
(()
=>
isUrl
(
textMessage
.
value
))
const
isUrlMessage
=
computed
(()
=>
isUrl
(
textMessage
.
value
));
return
{
isUrlMessage
,
prependHttp
,
textMessage
}
return
{
isUrlMessage
,
prependHttp
,
textMessage
};
},
},
})
})
;
</
script
>
</
script
>
<
style
scoped
></
style
>
<
style
scoped
>
.message-box
{
position
:
relative
;
}
.message-box-self
::after
{
content
:
""
;
position
:
absolute
;
right
:
0
;
top
:
0px
;
transform
:
translate
(
100%
,
15px
);
border-top
:
6px
solid
transparent
;
border-right
:
6px
solid
transparent
;
border-bottom
:
6px
solid
transparent
;
border-left
:
6px
solid
#3e4faf
;
}
.message-box-other
::after
{
content
:
""
;
position
:
absolute
;
left
:
0
;
top
:
0px
;
transform
:
translate
(
-100%
,
15px
);
border-top
:
6px
solid
transparent
;
border-right
:
6px
solid
white
;
border-bottom
:
6px
solid
transparent
;
border-left
:
6px
solid
transparent
;
}
</
style
>
tailwind.config.js
View file @
0f5069c2
...
@@ -78,6 +78,7 @@ module.exports = {
...
@@ -78,6 +78,7 @@ module.exports = {
extend
:
{},
extend
:
{},
padding
:
[
'responsive'
,
'important'
],
padding
:
[
'responsive'
,
'important'
],
backgroundColor
:
[
'responsive'
,
'important'
],
backgroundColor
:
[
'responsive'
,
'important'
],
borderRadius
:
[
'responsive'
,
'important'
],
},
},
plugins
:
[
plugins
:
[
plugin
(
function
({
addVariant
})
{
plugin
(
function
({
addVariant
})
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment