Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inform user that message is still being typed

I am using Laravel 5.6.7, Socket.IO and vue.js. I am not using Pusher and redis. Below is my code to send message to user chatting with me one to one.

var url = "http://localhost:6001/apps/My_appId/events?auth_key=My_Key";

var socketId = Echo.socketId();
var request = {
    "channel": "private-Send-Message-Channel.2",
    "name": "MessengerEvent",
    "data": {
        "msg": message
    },
    "socket_id": socketId
};
axios.post(url, JSON.stringify(request)).then((response) => {
    //Message Sent
});

I am trying to inform user who is chatting with me that I am still typing. Should I use the same above code which emits xhr on each char type? Is it the only way to inform user that the message typing is still in progress?

Update 1

Is there any better way to post xhr as mentioned above for each key press? I meant if user types 200 chars. will I post xhr 200 times?

or

Do we have an event called whisper and listenForWhisper as shown here https://laravel.com/docs/5.6/broadcasting#client-events ? I am using vue.js and laravel 5.6.7 without pusher and without redis

like image 388
Pankaj Avatar asked Mar 24 '18 01:03

Pankaj


People also ask

Can I tell when a WhatsApp contact is typing to someone else?

No. If you are on the screen of one-on-one conversation and see typing, they are typing only to you.

How do I make an email inline comment?

Turn on inline commentsClick the File > Options. In the left pane, click Mail. In the right pane, under Replies and forwards, check the Preface comments with box, and type the text you want to use to identify your comments.

How do you stop someone seeing you typing on WhatsApp?

Tap the Writing Status and select the desired. Choose between Hide for contacts if you want to hide typing status for personal messages or choose Hide for the group if you want to hide your typing status from WhatsApp groups.

What does @name mean in an email?

Play. If you'd like to get someone's attention in an email message or a meeting invite, you can type the @ symbol, followed by their name, in the body of the email message or a meeting invite.


1 Answers

If you look at the broadcasting documentation you will see two code code snippets which you can use in your Vue.js application.

To broadcast client events, you may use Echo's whisper method:

Echo.private('chat')
    .whisper('typing', {
        name: this.user.name
    });

To listen for client events, you may use the listenForWhisper method:

Echo.private('chat')
    .listenForWhisper('typing', (e) => {
        console.log(e.name);
    });

While the user is typing, you can debounce the whisper method above.

If you don't wish to use another library like lodash, you can implement the debounce by simply wrapping whisper in a timeout. The following method would broadcast the whisper every 300ms:

isTyping() {
    let channel = Echo.private('chat');

    setTimeout(function() {
        channel.whisper('typing', {
            name: this.user.name,
            typing: true
        });
    }, 300);
}

The app needs to trigger isTyping() when an onkeydown event occurs in the chat application's input field.

You also need to listen for the whisper once the app is created. The following method will set the typing variable to true for 600ms after the event has been received.

created() {
    let _this = this;

    Echo.private('chat')
        .listenForWhisper('typing', (e) => {
            this.user = e.name;
            this.typing = e.typing;

            // remove is typing indicator after 0.6s
            setTimeout(function() {
                _this.typing = false
            }, 600);
        });
},
like image 117
Dan Nagle Avatar answered Sep 27 '22 21:09

Dan Nagle