File size: 1,835 Bytes
e5af6ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Chatbot / Events/ Scroll
# Infinite scroll for previous messages.
# #chatbot #infinite #scroll
# ---
from h2o_wave import main, app, Q, ui, data

prev_messages = [{'content': f'Message {i}', 'from_user': i % 2 == 0} for i in range(100)]
LOAD_SIZE = 10


@app('/demo')
async def serve(q: Q):
    if not q.client.initialized:
        q.client.current_load_page = len(prev_messages)
        # Use list buffer to allow easy streaming. Must have exactly 2 fields - msg and from_user.
        q.page['example'] = ui.chatbot_card(
            box='1 1 5 5',
            data=data(fields='content from_user', t='list', rows=[
                ['Hello', True],
                ['Hi', False],
                ['Hello', True],
                ['Hi', False],
                ['Hello', True],
                ['Hi', False],
                ['Hello', True],
                ['Hi', False],
            ]),
            events=['scroll_up'],
            name='chatbot'
        )
        q.client.initialized = True

    # A new message arrived.
    if q.args.chatbot:
        # Append user message.
        q.page['example'].data += [q.args.chatbot, True]
        # Append bot response.
        q.page['example'].data += ['I am a fake chatbot. Sorry, I cannot help you.', False]

    # User scrolled up, load chat history.
    if q.events.chatbot and q.events.chatbot.scroll_up:
        if q.client.current_load_page == 0:
            # If we reached the end, signal it to Wave by setting prev_items to empty list.
            q.page['example'].prev_items = []
        else:
            end = q.client.current_load_page - LOAD_SIZE
            q.page['example'].prev_items = prev_messages[end:q.client.current_load_page]
            q.client.current_load_page = end
            await q.sleep(0.5)  # Simulate network latency.

    await q.page.save()