2
2
import { reactive , ref , onMounted } from ' vue' ;
3
3
import { Message , MessageStatus } from ' ./interfaces/message'
4
4
import MessageItem from ' ./Message.vue'
5
- import * as uuid from ' uuid'
6
5
import { getMessagesAPI , createMessageAPI , upscaleMessageAPI } from ' ./api/midjourney'
6
+ import { sendMessage , createWebsocket } from ' ./utils/websocket'
7
7
8
+ const ws = createWebsocket ({
9
+ onMessage(data ) {
10
+ // console.log('message event: ', event)
11
+ console .log (' message event: ' , data )
12
+ },
13
+ onOnLine(data ) {
14
+ console .log (' online data: ' , data )
15
+ },
16
+ onTaskUpdate(data : Message ) {
17
+ console .log (' taskupdate data: ' , data )
18
+ const { id } = data
19
+ findOneAndUpdate (id , data )
20
+ setTimeout (() => {
21
+ scrollToBottom ()
22
+ }, 32 )
23
+ }
24
+ })
8
25
const contentWrap = ref <HTMLDivElement >()
9
26
const data = reactive <{
10
27
messages: Message [],
11
- prompt: string
28
+ prompt: string ,
29
+ pageNum: number ,
30
+ pageSize: number ,
31
+ loading: boolean ,
32
+ loaded: boolean
12
33
}>({
13
34
prompt: ' ' ,
14
- messages: []
35
+ messages: [],
36
+ pageNum: 1 ,
37
+ pageSize: 5 ,
38
+ loading: false ,
39
+ loaded: false
15
40
})
16
41
42
+ const findOneAndUpdate = (id : number , msgData : Partial <Message >) => {
43
+ const index = data .messages .findIndex ((e ) => e .id === id )
44
+ if (index > - 1 ) {
45
+ const target = data .messages [index ]
46
+ Object .keys (msgData ).forEach ((key ) => {
47
+ target [key ] = msgData [key ]
48
+ })
49
+ }
50
+ }
51
+
17
52
const onClickSend = () => {
18
53
sendPrompt ()
19
54
}
@@ -24,10 +59,16 @@ const onKeyDown = (event: Event) => {
24
59
sendPrompt ()
25
60
}
26
61
27
- const getList = () => {
28
- getMessagesAPI ().then ((resData ) => {
29
- data .messages = resData as any ;
62
+ const getList = (params : any ) => {
63
+ if (data .loading || data .loaded ) return
64
+ getMessagesAPI (params ).then ((resData ) => {
65
+ // data.messages = resData as any;
66
+ resData = resData || [] as any
67
+ data .messages = [... resData as any , ... data .messages ];
68
+ data .loaded = ! resData || ! (resData as any ).length
30
69
scrollToBottom ()
70
+ }).finally (() => {
71
+ data .loading = false
31
72
})
32
73
}
33
74
@@ -40,7 +81,8 @@ const sendPrompt = async () => {
40
81
prompt: data .prompt ,
41
82
createTime: Date .now (),
42
83
uri: " " ,
43
- id: msgId
84
+ id: msgId ,
85
+ status: MessageStatus .INIT
44
86
}
45
87
46
88
data .messages .push (msgObj )
@@ -66,7 +108,7 @@ const onUpscale = async (msg: Message) => {
66
108
id: newId ,
67
109
prompt: data .prompt ,
68
110
index ,
69
- status: MessageStatus .START ,
111
+ status: MessageStatus .INIT ,
70
112
}
71
113
data .messages .push (newMsg )
72
114
scrollToBottom ()
@@ -80,9 +122,24 @@ const scrollToBottom = () => {
80
122
})
81
123
}
82
124
125
+ const onContentWrapScroll = (event : Event ) => {
126
+ if (data .loading || data .loaded ) return
127
+ const el = contentWrap .value
128
+ if (el .scrollTop <= 100 ) {
129
+ getList ({ pageNum: ++ data .pageNum , pageSize: data .pageSize })
130
+ }
131
+ }
132
+
83
133
onMounted (() => {
134
+ getList ({ pageNum: 1 , pageSize: data .pageSize })
84
135
scrollToBottom ()
85
- getList ()
136
+ setTimeout (() => {
137
+ contentWrap .value .addEventListener (' scroll' , onContentWrapScroll )
138
+ })
139
+
140
+ return () => {
141
+ contentWrap .value .removeEventListener (' scroll' , onContentWrapScroll )
142
+ }
86
143
})
87
144
88
145
</script >
0 commit comments