server_events_dispatch: Handle channel_folder/update event.

This commit is contained in:
Sahil Batra
2025-07-28 13:11:14 +05:30
committed by Tim Abbott
parent b67f31bae0
commit 3483c1dbcb
6 changed files with 98 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ import assert from "minimalistic-assert";
import type * as z from "zod/mini";
import {FoldDict} from "./fold_dict.ts";
import type {ChannelFolderUpdateEvent} from "./server_event_types.ts";
import type {StateData, channel_folder_schema} from "./state_data.ts";
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);
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);
}
}

View File

@@ -64,3 +64,17 @@ export const message_details_schema = z.record(
),
);
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>;

View File

@@ -123,6 +123,14 @@ export function dispatch_normal_event(event) {
inbox_ui.complete_rerender();
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:
blueslip.error("Unexpected event type channel_folder/" + event.op);
break;

View File

@@ -628,3 +628,21 @@ export function update_channel_folder_dropdown(sub: StreamSubscription): void {
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);
}

View File

@@ -515,10 +515,10 @@ run_test("scheduled_messages", ({override}) => {
}
});
run_test("channel_folders", () => {
run_test("channel_folders", ({override}) => {
channel_folders.initialize({channel_folders: []});
const event = event_fixtures.channel_folder__add;
let event = event_fixtures.channel_folder__add;
{
dispatch(event);
@@ -528,6 +528,27 @@ run_test("channel_folders", () => {
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");
server_events_dispatch.dispatch_normal_event({type: "channel_folder", op: "other"});
});

View File

@@ -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: {
type: "typing_edit_message",
op: "start",