Как я могу очистить поле ввода чата после отправки сообщения (из предложения) в веб-чате botframework?

Я работаю над приложением-ботом, используя веб-чат React js и botframework. Дело в том, что я хочу очистить поле ввода текста (откуда отправляются сообщения) после отправки сообщения, которое выбирается из предложения. Список предложений (или компонент автозаполнения) является настраиваемым. И я имею в виду, что если я наберу hr, появится всплывающее окно со списком предложений, и если я нажму на один вариант из предложения, скажем «портал hr», он будет отправлен, но то, что я написал, т.е. hr, останется в поле ввода. и я хочу это прояснить. И обратите внимание, что если я что-то набираю и отправляю, все работает нормально. Проблема только в том, что я что-то набираю и выбираю что-то из предложенного. В остальном все нормально. Как я могу это прояснить. Любая помощь могла бы быть полезна.

пожалуйста, найдите изображение ниже для большего понимания.

вот мой код;

import React from 'react';
import { DirectLine, ConnectionStatus } from 'botframework-directlinejs';
import ReactWebChat from 'botframework-webchat';
import './ChatComponent.css';
var val;
var apiParameters = [];
var currentFocus = -1;
export default class extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            token: '',
            conversationId: '',
            directLine: {},
            view: false,
            feedBack: null,
            value: '',
            popupContent: '',
            storeValue: '',
            suggestions: [],
            suggestionCallback: '',
            suggestionTypedText: "",
            typingChecking: "false",
        };
        this.handleTokenGeneration = this.handleTokenGeneration.bind(this);
        this.handleChange = this.handleChange.bind(this);
        this.handleSaveFeedback = this.handleSaveFeedback.bind(this);
        this.handleSuggestion = this.handleSuggestion.bind(this);
        this.handleClose = this.handleClose.bind(this);
        this.handleSuggestionClick = this.handleSuggestionClick.bind(this);
        this.handleKeyDown = this.handleKeyDown.bind(this);
        this.moveHighlight = this.moveHighlight.bind(this);
        this.getSuggestionHtml = this.getSuggestionHtml.bind(this);
    }
    getSuggestionHtml(suggestion) {
        const lowerCaseSuggestion = suggestion.toLowerCase();
        return {
            __html: lowerCaseSuggestion.includes(this.state.suggestionTypedText) ? lowerCaseSuggestion
                .replace(this.state.suggestionTypedText, `<b>${this.state.suggestionTypedText}</b>`) : lowerCaseSuggestion
        };
    }
    handleTokenGeneration = async () => {
        console.log("11111");
        const response = await fetch(`api/TokenGenerationService/GetToken`);
        const data = await response.json();
        this.setState({
            token: data.categoryObject.token, conversationId:
                data.categoryObject.conversationId
        });
        this.state.directLine = new DirectLine({ token: this.state.token });
        this.setState({ view: true });
        this.setState({ typingChecking: "true" });
        console.log("conversationId");
    };
    async handleSuggestion(val, store) {
        if (val === "") {
            this.setState({
                suggestions: []
            });
        }
        else {
            apiParameters = [];
            var valuess = null;
            const response = await fetch(`api/TokenGenerationService/GetAzureSearch?myparam1=${val}`);
            const data = await response.json();
            var values = ["Hello", "yes", "no", "exit", "Welcome", "Thank You", "Approve", "Apply leave", "Reject", "Absence Balance", "Leave Balance", "Upcoming Holidays", "Apply Comp-Off", "Approve Leave", "Raise Incident Tickets", "Project Allocation Info", "Reporting Manager Change", "Reporting Manager Approval", "Approve Isolve Tickets", "My Manager", "My Account Manager", "Generate Salary Certificate", "Isolve Ticket Status", "Internal Job Posting", "My Designation", "My Joining Date", "RM Approval", "RM Change", "Resource Allocation", "ESettlement Approval", "SO Approval", "Cash advance Approval", "Purchase Request Approval", "Referral status", "HR Ticket", "Platinum Support"];
            valuess = values.filter(s =>
                s.toLocaleLowerCase().startsWith(val.toLowerCase())
            );
            valuess = valuess.concat(data.az_search);
            this.setState({
                suggestions: valuess,
                suggestionCallback: store,
                suggestionTypedText: val.toLowerCase()
            });
            // alert(data.az_search);
            var totCount = data.az_search;
            console.log("kkkkkk" + totCount);
        }
    }
    moveHighlight(event, direction) {
        event.preventDefault();
        const { highlightedIndex, suggestions } = this.state;
        if (!suggestions.length) return;
        let newIndex = (highlightedIndex + direction + suggestions.length) % suggestions.length;
        if (newIndex !== highlightedIndex) {
            this.setState({
                highlightedIndex: newIndex,
            });
        }
    }
    keyDownHandlers = {
        ArrowDown(event) {
            this.moveHighlight(event, 1);
        },
        ArrowUp(event) {
            this.moveHighlight(event, -1);
        },
        Enter(event) {
            const { suggestions } = this.state;
            if (!suggestions.length) {
                // menu is closed so there is no selection to accept -> do nothing
                return
            }
            event.preventDefault()
            this.applySuggestion(suggestions[this.state.highlightedIndex]);
        },
    }
    handleKeyDown(event) {
        // console.log("lokkkkkkkkkkkk")
        if (this.keyDownHandlers[event.key])
            this.keyDownHandlers[event.key].call(this, event)
    }
    async handleSuggestionClick(event) {
        await this.applySuggestion(event.currentTarget.textContent);
    }
    async applySuggestion(newValue) {
        //newValue = null;
        await this.setState({ typingChecking: "false", suggestions: [], highlightedIndex: 0 });
        this.state.suggestionCallback.dispatch({
            type: 'WEB_CHAT/SEND_MESSAGE',
            payload: {
                text: newValue
            }
        });
        await this.setState({ typingChecking: "true" });
    }
    getSuggestionCss(index) {
        var HIGHLIGHTED_CSS = "HIGHLIGHTED_CSS";
        var SUGGESTION_CSS = "SUGGESTION_CSS";
        return index === this.state.highlightedIndex ? HIGHLIGHTED_CSS : SUGGESTION_CSS;
    }
    handleClose(elmnt) {
        var x = document.getElementsByClassName("autocomplete-items");
        for (var i = 0; i < x.length; i++) {
            if (elmnt !== x[i]) {
                x[i].parentNode.removeChild(x[i]);
            }
        }
    }
    async componentDidMount() {
        try {
            await this.handleTokenGeneration();
            const store =
                window.WebChat.createStore(
                    {},
                    ({ getState }) => next => action => {
                        this.state.directLine.connectionStatus$
                            .subscribe(connectionStatus => {
                                if (connectionStatus === ConnectionStatus.ExpiredToken) {
                                    console.log("expired");
                                }
                                if (action.type === 'WEB_CHAT/SET_SEND_BOX') {
                                    const val = action.payload.text;
                                    if (this.state.typingChecking === "true") {
                                        this.setState({
                                            highlightedIndex: -1,
                                        });
                                        console.log(this.state.typingChecking);
                                        this.handleSuggestion(val, store);
                                    }
                                }
                                if (action.type === 'DIRECT_LINE/DISCONNECT_FULFILLED') {
                                    console.log("final" + connectionStatus);
                                    console.log("finalexpired" + ConnectionStatus.ExpiredToken);
                                    console.log("final");
                                    this.handleTokenGeneration();
                                }
                            });
                        return next(action)
                    }
                );
            this.setState({ storeValue: store });
        } catch (error) {
            console.log("error in fetching token");
            console.log(error);
        }
        this.state.directLine.activity$
            .filter(activity => activity.type === 'message')
            .subscribe(function (activity) {
                //console.log("oooooooooooooooooooooo");
            }
                // message => console.log("received message ", message.text)
            );
    }
    handleSaveFeedback(ans) {
        // console.log(this.state.conversationId);
        //  console.log(this.state.feedBack);
        var userID = "C94570";
        var feedbackmsg = this.state.value;
        var feedbacktype = this.state.feedBack;
        var convId = this.state.conversationId;
        fetch('api/Feedback/SaveFeedback',
            {
                method: "POST",
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ Uid: userID, FeedbackMessage: feedbackmsg, Convid: convId, FeedbackType: feedbacktype })
            }).
            then(response => response.text())
            .then(data => {
                console.log(data.getResult);
            });
        this.setState({ value: '' });
    }
    feedback(ans) {
        this.setState({ feedBack: ans });
        if (ans === "Send") {
            this.handleSaveFeedback(ans);
        }
        else if (ans === "Yes") {
            this.setState({ popupContent: "How was your experience?" });
            // console.log(this.state.value)
        }
        else if (ans === "No") {
            this.setState({ popupContent: "What went wrong?" });
            // console.log(this.state.value)
        }
    }
    handleChange = (event) => {
        this.setState({ value: event.target.value });
    }
    styleOptions = {
        bubbleBackground: 'rgba(0, 0, 255, .1)',
        bubbleFromUserBackground: 'rgba(0, 255, 0, .1)',
        botAvatarInitials: 'DIA',
        userAvatarInitials: 'ME'
    }
    render() {
        if (!this.state.view) {
            return
            <div />
        } else {
            const filteredSuggestions = this.state.suggestions.filter(
                suggestion =>
                    suggestion.toLowerCase().indexOf(this.state.suggestionTypedText.toLowerCase())
                    > -1
            );
            //   console.log(this.state.view);
            return (
                <div className="react-container webchat" >
                    <div onKeyDown={this.handleKeyDown.bind(this)}>
                        <div >
                            <ReactWebChat styleOptions={this.styleOptions} directLine={this.state.directLine} webSocket={true} userID='C94570' username='Thomas' store={this.state.storeValue} sendTypingIndicator={true} />
                        </div>
                    </div>
                    <div className="SuggestionParent" id="Suggestion1">
                        {this.state.suggestions.map((suggestion, index) => (
                            <div className={this.getSuggestionCss(index)} key={index} onClick={this.handleSuggestionClick} >
                                {suggestion
                                    .toLowerCase()
                                    .startsWith(this.state.suggestionTypedText) ? (
                                        <div>
                                            <b>{this.state.suggestionTypedText}</b>
                                            {suggestion
                                                .toLowerCase()
                                                .replace(this.state.suggestionTypedText, "")}
                                        </div>
                                    ) : (
                                        <div dangerouslySetInnerHTML={this.getSuggestionHtml(suggestion)} />
                                    )}
                            </div>
                        ))}
                    </div>
                    <footer className="chat-footer" >
                        <div className="foot-footer">
                            Was I helpful ?
         <span className="feedback" onClick={() => this.feedback("Yes")} >Yes</span><span>|</span><span className="feedback" onClick={() => this.feedback("No")}>No</span>
                            {
                                this.state.feedBack === "Yes" || this.state.feedBack === "No" ?
                                    (
                                        <div className="dialog" id="myform">
                                            <div id="textfeedback">
                                                <span id="closeFeedback" onClick={() => this.feedback("Close")}>X</span>
                                                <p>{this.state.popupContent}</p>
                                                <input type="text" id="feedbacktxtbox" required name="textfeedback" placeholder="Pleasure to hear from u!"
                                                    onChange={this.handleChange}
                                                    value={this.state.value} />
                                                <button type="button" id="btnfeedback" onClick={() => this.feedback("Send")}>send</button>
                                            </div>
                                        </div>
                                    ) : null
                            }
                        </div>
                    </footer>
                </div>
            );
        }
    }
}

person Thomas Martin    schedule 03.07.2020    source источник
comment
Пух, извини, Томас, не думаю, что я могу здесь помочь, может, попробуй вот это: Chat.post ($ ('input [name = \' content \ ']'). Val ()); $ ('. input'). val () Или просто очистить с помощью jquery?   -  person Tim Cadenbach    schedule 07.07.2020
comment
@TimCadenbach спасибо за ответ, приятель. Собственно проблема в предложении. Я хочу знать, есть ли способ реакции или действия бота, который может это сделать.   -  person Thomas Martin    schedule 07.07.2020
comment
@ThomasMartin - Не могли бы вы исправить свой код? Я вставил в Visual Studio и попытался отформатировать его, и стало ясно, что отсутствуют фигурные скобки и т. Д. Убедитесь, что код работает и правильно отформатирован (чтобы не было нескольких пустых строк в строке и т. Д.)   -  person Kyle Delaney    schedule 08.07.2020
comment
@KyleDelaney привет, Кайл, спасибо за ответ. хорошо, я отформатировал и обновил код. пожалуйста, проверьте   -  person Thomas Martin    schedule 08.07.2020
comment
@ThomasMartin - Ты видишь то, что вижу я? Вы видите, что большая часть кода, который вы опубликовали, не имеет отступов?   -  person Kyle Delaney    schedule 08.07.2020
comment
@KyleDelaney извините за это, но код работает нормально, никаких проблем. Найдите код здесь github.com/microsoft/BotFramework-WebChat/issues/3288 < / а>   -  person Thomas Martin    schedule 08.07.2020
comment
@KyleDelaney, чего я ожидаю достичь, объясняется в вопросе. Мне просто нужно очистить текст после выбора предложения, как показано на изображении. Как я могу это понять, если вы знаете, пожалуйста, помогите   -  person Thomas Martin    schedule 08.07.2020
comment
@ThomasMartin - Вы должны понимать, что мы не знаем того, что знаете вы. Вам может показаться очевидным, что происходит в вашем проекте, потому что вы работали над ним, но остальные из нас этого не делали. В вашем вопросе нет ничего, что объясняло бы, что означает предложение после выбора, потому что мы не знаем, что вы подразумеваете под предложением. Если вы говорите о своем собственном уникальном компоненте автозаполнения, то это чрезвычайно важная деталь, которая должна быть в вашем вопросе. Вы должны быть готовы задавать вопрос так, чтобы на него можно было ответить.   -  person Kyle Delaney    schedule 08.07.2020
comment
@KyleDelaney Мне очень жаль. Вы помогли мне создать компонент автозаполнения, поэтому я подумал, что вы знакомы с кодом и, возможно, знаете проблему, поэтому я сказал это. Не могли бы вы уточнить, что еще вам нужно понять из моего вопроса?   -  person Thomas Martin    schedule 08.07.2020
comment
@KyleDelaney Вопрос обновлен.   -  person Thomas Martin    schedule 09.07.2020
comment
Вопросы, которые вы задаете на Stack Overflow, не должны быть адресованы одному конкретному человеку.   -  person Kyle Delaney    schedule 09.07.2020


Ответы (1)


Поле ввода чата называется полем отправки в веб-чате. Очистка поля отправки - это просто установка поля отправки с пустой строкой. Это делается автоматически, когда вы обычно нажимаете кнопку отправки. Вы можете увидеть в поле отправки отправки сага, что отправка окна отправки означает выполнение двух действий: отправка сообщения и установка окна отправки.

if (sendBoxValue) {
  yield put(sendMessage(sendBoxValue.trim(), method, { channelData }));
  yield put(setSendBox(''));
}

Это означает, что если вы используете действие SUBMIT_SEND_BOX, поле отправки будет очищено автоматически. Конечно, если вы хотите, чтобы это работало с вашим компонентом автозаполнения, вам нужно установить поле отправки с автоматически заполненным текстом, прежде чем отправлять его. Другой вариант - просто использовать действие SET_SEND_BOX с пустой строкой после отправки сообщения.

person Kyle Delaney    schedule 08.07.2020
comment
так могу ли я использовать SUBMIT_SEND_BOX ВМЕСТО SEND_MESSAGE? И что вы имеете в виду, говоря, что вам нужно установить поле отправки с автозаполненным текстом, прежде чем отправлять его. И обратите внимание, что я изменил действие с SET_SEND_BOX на SEND_MESSAGE, потому что мне не удалось отправить сообщение из всплывающего окна с предложением, когда выбор выбирается нажатием клавиши ввода или щелчком мыши. Используя SEND_MESSAGE, он работает нормально. - person Thomas Martin; 09.07.2020
comment
Невозможно сделать то, что вы хотите, всего одним действием. Вы можете использовать SET_SEND_BOX + SUBMIT_SEND_BOX или SEND_MESSAGE + SET_SEND_BOX. - person Kyle Delaney; 09.07.2020
comment
привет, Кайл, я только что очистил его, сделав следующее изменение: PFA, github.com/ thomas023 / Webchat / blob / master / ClearSendBox.txt теперь возникает проблема, заключающаяся в том, что всплывающее окно с предложением не закрывается, когда я набираю что-то и пытаюсь удалить это, нажав клавишу Backspace. Например, если я наберу hr и нажму Backspace, всплывающее окно с предложением h останется там. Как я могу это исправить? - person Thomas Martin; 09.07.2020
comment
Вы говорите, что это поведение, которое вы раньше не наблюдали и которое было введено только вашим новым кодом, который очищает поле отправки? В любом случае, я не думаю, что могу знать, как помочь вам, основываясь на информации, которую вы мне дали. У меня сложилось впечатление, что вы все еще новичок, поэтому я советую пройти несколько курсов по React, JavaScript, пользовательскому интерфейсу и основам программирования. Если вы этого не сделаете, вы будете продолжать ломать голову и сталкиваться с проблемами, которые не сможете решить самостоятельно. После того, как вы попробуете его, вам следует задать новый вопрос со всеми подробностями. - person Kyle Delaney; 09.07.2020
comment
на самом деле проблема заключается в всплывающем окне с предложением (компонент автозаполнения), которое не закрывается, даже когда набранный текст очищается с помощью backspace. Список предложений с последним удаленным словом не закрывается. Вот в чем проблема. - person Thomas Martin; 09.07.2020
comment
Это новое поведение или уже существующее? - person Kyle Delaney; 09.07.2020
comment
это был уже существующий, который я нашел только сейчас. - person Thomas Martin; 09.07.2020
comment
Тогда вам следует задать новый вопрос, как я сказал. Следуйте рекомендациям по переполнению стека, стараясь сначала решить проблему самостоятельно. Объясните, какие решения вы уже пробовали, и предоставьте соответствующий пример кода. stackoverflow.com/help/how-to-ask - person Kyle Delaney; 09.07.2020