mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 00:18:12 +00:00
server_events_dispatch: Handle channel_folder/update event.
This commit is contained in:
@@ -2,6 +2,7 @@ import assert from "minimalistic-assert";
|
|||||||
import type * as z from "zod/mini";
|
import type * as z from "zod/mini";
|
||||||
|
|
||||||
import {FoldDict} from "./fold_dict.ts";
|
import {FoldDict} from "./fold_dict.ts";
|
||||||
|
import type {ChannelFolderUpdateEvent} from "./server_event_types.ts";
|
||||||
import type {StateData, channel_folder_schema} from "./state_data.ts";
|
import type {StateData, channel_folder_schema} from "./state_data.ts";
|
||||||
|
|
||||||
export type ChannelFolder = z.infer<typeof channel_folder_schema>;
|
export type ChannelFolder = z.infer<typeof channel_folder_schema>;
|
||||||
@@ -52,3 +53,25 @@ export function get_channel_folder_by_id(folder_id: number): ChannelFolder {
|
|||||||
assert(channel_folder !== undefined);
|
assert(channel_folder !== undefined);
|
||||||
return channel_folder;
|
return channel_folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function update(event: ChannelFolderUpdateEvent): void {
|
||||||
|
const folder_id = event.channel_folder_id;
|
||||||
|
const channel_folder = get_channel_folder_by_id(folder_id);
|
||||||
|
if (event.data.name !== undefined) {
|
||||||
|
channel_folder_name_dict.delete(channel_folder.name);
|
||||||
|
channel_folder.name = event.data.name;
|
||||||
|
channel_folder_name_dict.set(channel_folder.name, channel_folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.data.description !== undefined) {
|
||||||
|
channel_folder.description = event.data.description;
|
||||||
|
assert(event.data.rendered_description !== undefined);
|
||||||
|
channel_folder.rendered_description = event.data.rendered_description;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.data.is_archived !== undefined) {
|
||||||
|
channel_folder.is_archived = event.data.is_archived;
|
||||||
|
channel_folder_name_dict.delete(channel_folder.name);
|
||||||
|
channel_folder_name_dict.set(channel_folder.name, channel_folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,3 +64,17 @@ export const message_details_schema = z.record(
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
export type MessageDetails = z.output<typeof message_details_schema>;
|
export type MessageDetails = z.output<typeof message_details_schema>;
|
||||||
|
|
||||||
|
export const channel_folder_update_event_schema = z.object({
|
||||||
|
id: z.number(),
|
||||||
|
type: z.literal("channel_folder"),
|
||||||
|
op: z.literal("update"),
|
||||||
|
channel_folder_id: z.number(),
|
||||||
|
data: z.object({
|
||||||
|
name: z.optional(z.string()),
|
||||||
|
description: z.optional(z.string()),
|
||||||
|
rendered_description: z.optional(z.string()),
|
||||||
|
is_archived: z.optional(z.boolean()),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
export type ChannelFolderUpdateEvent = z.output<typeof channel_folder_update_event_schema>;
|
||||||
|
|||||||
@@ -123,6 +123,14 @@ export function dispatch_normal_event(event) {
|
|||||||
inbox_ui.complete_rerender();
|
inbox_ui.complete_rerender();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "update":
|
||||||
|
channel_folders.update(event);
|
||||||
|
if (event.data.name !== undefined) {
|
||||||
|
inbox_ui.complete_rerender();
|
||||||
|
stream_list.update_streams_sidebar();
|
||||||
|
stream_ui_updates.update_channel_folder_name(event.channel_folder_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
blueslip.error("Unexpected event type channel_folder/" + event.op);
|
blueslip.error("Unexpected event type channel_folder/" + event.op);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -628,3 +628,21 @@ export function update_channel_folder_dropdown(sub: StreamSubscription): void {
|
|||||||
|
|
||||||
settings_components.set_channel_folder_dropdown_value(sub);
|
settings_components.set_channel_folder_dropdown_value(sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function update_channel_folder_name(folder_id: number): void {
|
||||||
|
if (!overlays.streams_open()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const active_stream_id = stream_settings_components.get_active_data().id;
|
||||||
|
if (!active_stream_id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sub = sub_store.get(active_stream_id)!;
|
||||||
|
if (sub.folder_id !== folder_id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings_components.set_channel_folder_dropdown_value(sub);
|
||||||
|
}
|
||||||
|
|||||||
@@ -515,10 +515,10 @@ run_test("scheduled_messages", ({override}) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
run_test("channel_folders", () => {
|
run_test("channel_folders", ({override}) => {
|
||||||
channel_folders.initialize({channel_folders: []});
|
channel_folders.initialize({channel_folders: []});
|
||||||
|
|
||||||
const event = event_fixtures.channel_folder__add;
|
let event = event_fixtures.channel_folder__add;
|
||||||
{
|
{
|
||||||
dispatch(event);
|
dispatch(event);
|
||||||
|
|
||||||
@@ -528,6 +528,27 @@ run_test("channel_folders", () => {
|
|||||||
assert.equal(folders[0].name, event.channel_folder.name);
|
assert.equal(folders[0].name, event.channel_folder.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event = event_fixtures.channel_folder__update;
|
||||||
|
{
|
||||||
|
const stub = make_stub();
|
||||||
|
override(stream_ui_updates, "update_channel_folder_name", stub.f);
|
||||||
|
override(stream_list, "update_streams_sidebar", stub.f);
|
||||||
|
|
||||||
|
dispatch(event);
|
||||||
|
|
||||||
|
assert.equal(stub.num_calls, 2);
|
||||||
|
const folders = channel_folders.get_channel_folders(true);
|
||||||
|
const args = stub.get_args("folder_id");
|
||||||
|
assert_same(args.folder_id, event.channel_folder_id);
|
||||||
|
|
||||||
|
assert.equal(folders.length, 1);
|
||||||
|
assert.equal(folders[0].id, event.channel_folder_id);
|
||||||
|
assert.equal(folders[0].name, event.data.name);
|
||||||
|
assert.equal(folders[0].description, event.data.description);
|
||||||
|
assert.equal(folders[0].rendered_description, event.data.rendered_description);
|
||||||
|
assert.equal(folders[0].is_archived, event.data.is_archived);
|
||||||
|
}
|
||||||
|
|
||||||
blueslip.expect("error", "Unexpected event type channel_folder/other");
|
blueslip.expect("error", "Unexpected event type channel_folder/other");
|
||||||
server_events_dispatch.dispatch_normal_event({type: "channel_folder", op: "other"});
|
server_events_dispatch.dispatch_normal_event({type: "channel_folder", op: "other"});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -161,6 +161,18 @@ exports.fixtures = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
channel_folder__update: {
|
||||||
|
type: "channel_folder",
|
||||||
|
op: "update",
|
||||||
|
channel_folder_id: 1,
|
||||||
|
data: {
|
||||||
|
name: "New frontend",
|
||||||
|
description: "Channels for new frontend discussions",
|
||||||
|
rendered_description: "<p>Channels for new frontend discussions</p>",
|
||||||
|
is_archived: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
channel_typing_edit_message__start: {
|
channel_typing_edit_message__start: {
|
||||||
type: "typing_edit_message",
|
type: "typing_edit_message",
|
||||||
op: "start",
|
op: "start",
|
||||||
|
|||||||
Reference in New Issue
Block a user