У меня есть приложение для обмена сообщениями, но я не могу его распознать, если текущий пользователь отображает сообщение или это «другой» пользователь. Цель - показать сообщения current_user справа и другие слева. Я не знаю, является ли создание сообщений в ApplicationJob плохой практикой, но я считаю, что это необходимо, поскольку оно также будет использоваться в ReactNative App, имеет ли это значение?
Любая помощь очень ценится.
это мой ActionCable:
class MoveRecordChatroomsChannel < ApplicationCable::Channel
def subscribed
stream_from "chatroom_#{params[:chatroom_id]}"
end
def receive(payload)
# message = Message.create(body: payload["body"], user_id: payload["user_id"], chatroom_id: payload["chatroom_id"])
ActionCable.server.broadcast("chatroom_#{payload["chatroom_id"]}", {body: payload["body"], chatroom_id: payload["chatroom_id"], user_id: payload["user_id"]})
end
def send_message(payload)
# MessageNotificationBroadcastJob.perform_later(payload)
MoveRecordChatroomBroadcastJob.perform_later(payload)
end
end
ApplicationJob:
class MoveRecordChatroomBroadcastJob < ApplicationJob
queue_as :default
def perform(payload)
message = Message.create!(body: payload["body"], user_id: payload["user_id"], chatroom_id: payload["chatroom_id"])
if message.save
ActionCable.server.broadcast("chatroom_#{message["chatroom_id"]}", {message: render_message(message), body: message.body, chatroom_id: message.chatroom_id, user_id: message.user_id})
payload["chatroom_user_ids"].each do |user_id|
# unless @current_user.id == user_id
notification = MessageNotification.create!(user_id: user_id, message_id: message.id, checked: false)
if notification.save
ActionCable.server.broadcast("notifications_for_#{user_id}", {message_notification: render_notification(notification), message: message.body})
end
# end
end
end
end
private
def render_message(message)
renderer = ApplicationController.renderer.new
renderer.render(partial: 'messages/message', locals: { message: message })
end
def render_notification(notification)
renderer = ApplicationController.renderer.new
renderer.render(partial: 'message_notificatons/notification', locals: { notification: notification })
end
end
и канал js:
$( document ).ready(function() {
jQuery('.chatroom').each(function() {
var chatroomId = $(this).data("chatroom-id");
var userId = $(this).data("user-id");
var chatroomName = $(this).data("chatroom-name");
var chatroomUserIds = $(this).data("notify-users");
$('#messages_' + chatroomName).stop().animate({ scrollTop: $('#messages_' + chatroomName).scrollHeight}, 1000);
App['chatroom_' + chatroomId] = App.cable.subscriptions.create({channel: "MoveRecordChatroomsChannel", chatroom_id: chatroomId}, {
received(data) {
console.log(data);
$('#messages_' + chatroomName).removeClass('hidden');
$('#messages_' + chatroomName).append(data["message"]);
$('#messages_' + chatroomName).stop().animate({ scrollTop: $('#messages_' + chatroomName).scrollHeight}, 1000);
},
send_message(message) {
return this.perform('send_message', ({body: message["message"], chatroom_id: message["chatroom_id"], user_id: message["user_id"], chatroom_user_ids: message["chatroom_user_ids"]}));
},
setChatroomId(id) {
$(this).chatroomId = id
}
});
sendNewMessage(chatroomId, userId, chatroomName, chatroomUserIds);
});
});
function sendNewMessage(chatroomId, userId, chatroomName, chatroomUserIds){
var mentionOn = false;
var shiftDown = false
$('#' + chatroomName).keydown(function(event) {
if (event.keyCode == 13) {
if ($(this).parent().children(':nth-child(4)')[0].style.display == 'block') {
return mentionOn = true;
} else {
mentionOn = false
}
if($('#' + chatroomName).is(":focus") && !shiftDown && !mentionOn) {
event.preventDefault()
var arrMentions, dataArr
var usersArr = []
$(this).mentionsInput('getMentions', function(data) {
arrMentions = JSON.stringify(data);
});
dataArr = JSON.parse(arrMentions);
dataArr.forEach(function(user) {
usersArr.push(user.id)
});
console.log(usersArr);
App['chatroom_' + chatroomId].setChatroomId(chatroomId);
App['chatroom_' + chatroomId].send_message({ message: event.target.value, chatroom_id: chatroomId, user_id: userId, chatroom_user_ids: usersArr });
$('#' + chatroomName).val("");
return false;
}
}
});
$(document).keydown(function (e) {
if(e.keyCode == 16) shiftDown = true;
});
$(document).keyup(function (e) {
if(e.keyCode == 16) shiftDown = false;
});
}