File size: 4,842 Bytes
4657c70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<head>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.0/dist/semantic.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.0/dist/semantic.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
</head>

<div class="ui container" style="width: 400px;">
    <div class="ui grid centered">
    <div class="row">
        <div id="searchContainer" style="margin-top: 20px;">
            <div class="ui icon input" id="searchBox">
                <input type="text" id="searchInput" placeholder="Search...">
                <button id="searchButton" class="ui icon button"><i id="searchIcon" class="search icon"></i></button>
            </div>
        </div>
    </div>
    <div class="row" style="padding-top: 0;">
    <div id="resultsContainer" style="text-align: left;width: 350px;">
        <div id="suggestionContainer" class="ui relaxed divided list bordered"></div>
        <div id="answerContainer">
            <div id="answerText"></div>
            <div id="feedbackContainer">
                <i class="thumbs up icon" id="likeButton"></i>
                <i class="thumbs down icon" id="dislikeButton"></i>
                <i class="clone outline icon" id="copyButton" style="float: right;"></i>
            </div>
        </div>
    </div>
    </div>
</div>
</div>
  

<script>
let backendUrl = 'https://jr818-jarvisfastapi.hf.space/api';
let timeout = null;

//自动补全
$('#searchInput').keyup(function() {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
        console.log('Autocomplete...');
        const query = $(this).val();

        $.ajax({
            url: backendUrl + `/suggestion?inputs=${query}`,
            type: 'GET',
            success: function(data) {
                $('#suggestionContainer').empty();

                data.slice(0, 3).forEach(item => {
                    let listItem = $(`
                        <div class="item">
                            <i class="middle bookmark outline icon"></i>
                            <div class="content">
                                <a href="${item.url}" class="header" target="_blank">${item.name}</a>
                            </div>
                        </div>
                    `);
                    $('#suggestionContainer').append(listItem);
                });
                $('#suggestionContainer').show();
            },
            error: function(error) {
                console.error('Error:', error);
            }
        });
    }, 500);
});

function search() {
    console.log('Searching...');
    $('#answerContainer').hide();
    clearTimeout(timeout);
    $('#searchIcon').removeClass('search').addClass('spinner loading');
    const query = $('#searchInput').val();
    $('#answerText').empty();
    // var count = 0;

    // 使用fetch API请求后端
    fetch(backendUrl + `/answer?inputs=${query}`)
        .then(response => {
            // 搜索完成后,恢复搜索图标
            $('#searchIcon').removeClass('spinner loading').addClass('search');
            const reader = response.body.getReader();

            // 读取流数据
            function read() {
                reader.read().then(({ done, value }) => {
                    if (done) {
                        return;
                    }

                    // 将流中的数据转换为文本
                    const text = new TextDecoder().decode(value);
                    // count += text.length;
                    $('#answerText').append(text);
                    $('#answerContainer').show();  
                    read();
                });
            }

            read();
        })
        .catch(error => {
            $('#searchIcon').removeClass('spinner loading').addClass('search');
            console.error('Error:', error);
        });
}

// 绑定搜索按钮点击事件
$('#searchButton').click(search);

// 绑定输入框回车事件
$('#searchInput').keypress(function(e) {
    if (e.which == 13) { // 回车键的键码是13
        search();
    }
});
$('#searchInput').on('input', function() {
    if ($(this).val().length > 0) {
        $('#searchBox').css('width', '200px');
    } else {
        $('#searchBox').css('width', '150px');
        $('#suggestionContainer').hide();
    }
});

$(document).ready(function() {
    $('#likeButton').click(function() {
        console.log('like');
    });

    $('#dislikeButton').click(function() {
        console.log('dislike');
    });

    $('#copyButton').click(function() {
        navigator.clipboard.writeText($('#answerText').text()).then(() => {
        }).catch(err => {
            console.error('copy failed:', err);
        });
    });
});
</script>