FEATURE: Create a link to start a new chat (#25722)
This feature adds the functionality to start a new chat directly from the URL using query params. The format is: /chat/new-message?recipients=buford,jona The initial version of this feature allows for the following: - Open an existing direct message channel with a single user - Create a new direct message channel with a single user (and auto redirect) - Create or open a channel with multiple users (and auto redirect) - Redirects to chat home if the recipients param is missing
This commit is contained in:
parent
d8d756cd2f
commit
a460dbcb37
|
@ -15,6 +15,8 @@ export default function () {
|
|||
this.route("channels");
|
||||
this.route("threads");
|
||||
|
||||
this.route("new-message");
|
||||
|
||||
this.route(
|
||||
"channel.info",
|
||||
{ path: "/c/:channelTitle/:channelId/info" },
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
import Controller from "@ember/controller";
|
||||
|
||||
export default class ChatNewMessageController extends Controller {
|
||||
queryParams = ["recipients"];
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import { inject as service } from "@ember/service";
|
||||
import DiscourseRoute from "discourse/routes/discourse";
|
||||
|
||||
export default class ChatNewMessageRoute extends DiscourseRoute {
|
||||
@service chat;
|
||||
@service router;
|
||||
|
||||
beforeModel(transition) {
|
||||
const recipients = this.paramsFor(this.routeName).recipients?.split(",");
|
||||
|
||||
if (!recipients) {
|
||||
transition.abort();
|
||||
return this.router.transitionTo("chat");
|
||||
}
|
||||
|
||||
this.chat.upsertDmChannel({ usernames: recipients }).then((channel) => {
|
||||
this.router.transitionTo("chat.channel", channel.title, channel.id);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -75,6 +75,7 @@ Chat::Engine.routes.draw do
|
|||
|
||||
# chat_controller routes
|
||||
get "/" => "chat#respond"
|
||||
get "/new-message" => "chat#respond"
|
||||
get "/direct-messages" => "chat#respond"
|
||||
get "/channels" => "chat#respond"
|
||||
get "/threads" => "chat#respond"
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe "Chat New Message from params", type: :system do
|
||||
fab!(:current_user) { Fabricate(:user) }
|
||||
fab!(:user_1) { Fabricate(:user) }
|
||||
fab!(:user_2) { Fabricate(:user) }
|
||||
fab!(:public_channel) { Fabricate(:chat_channel) }
|
||||
fab!(:user_1_channel) { Fabricate(:direct_message_channel, users: [current_user, user_1]) }
|
||||
let(:chat_page) { PageObjects::Pages::Chat.new }
|
||||
|
||||
before do
|
||||
chat_system_bootstrap
|
||||
public_channel.add(current_user)
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
context "with a single user" do
|
||||
it "redirects to existing chat channel" do
|
||||
chat_page.visit_new_message(user_1)
|
||||
|
||||
expect(page).to have_current_path("/chat/c/#{user_1.username}/#{user_1_channel.id}")
|
||||
end
|
||||
|
||||
it "creates a dm channel and redirects if none exists" do
|
||||
chat_page.visit_new_message(user_2)
|
||||
|
||||
expect(page).to have_current_path("/chat/c/#{user_2.username}/#{Chat::Channel.last.id}")
|
||||
end
|
||||
|
||||
it "redirects to chat channel if recipients param is missing" do
|
||||
visit("/chat/new-message")
|
||||
|
||||
# chat service selects public channel from getIdealFirstChannelId
|
||||
expect(page).to have_current_path("/chat/c/#{public_channel.slug}/#{public_channel.id}")
|
||||
end
|
||||
end
|
||||
|
||||
context "with multiple users" do
|
||||
it "creates a dm channel with multiple users" do
|
||||
chat_page.visit_new_message([user_1, user_2])
|
||||
|
||||
expect(page).to have_current_path(
|
||||
"/chat/c/#{user_1.username}-#{user_2.username}/#{Chat::Channel.last.id}",
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -91,6 +91,16 @@ module PageObjects
|
|||
PageObjects::Pages::ChatBrowse.new.has_finished_loading?
|
||||
end
|
||||
|
||||
def visit_new_message(recipients)
|
||||
if recipients.is_a?(Array)
|
||||
recipients = recipients.map(&:username).join(",")
|
||||
elsif recipients.respond_to?(:username)
|
||||
recipients = recipients.username
|
||||
end
|
||||
|
||||
visit("/chat/new-message?recipients=#{recipients}")
|
||||
end
|
||||
|
||||
def has_finished_loading?
|
||||
has_no_css?(".chat-channel--not-loaded-once")
|
||||
has_no_css?(".chat-skeleton")
|
||||
|
|
Loading…
Reference in New Issue