From de8544a1263461a61d9639e7f73b805b56c0671e Mon Sep 17 00:00:00 2001 From: Sergey Mankovsky Date: Tue, 24 Sep 2024 15:22:43 +0200 Subject: [PATCH] Update room config zulip streams --- www/app/(app)/rooms/page.tsx | 62 ++++++++++++++++++++++++------------ www/app/domainContext.tsx | 1 - www/app/lib/edgeConfig.ts | 1 - 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/www/app/(app)/rooms/page.tsx b/www/app/(app)/rooms/page.tsx index 4ad0c366..0c71d6d6 100644 --- a/www/app/(app)/rooms/page.tsx +++ b/www/app/(app)/rooms/page.tsx @@ -30,18 +30,16 @@ import { IconButton, Checkbox, } from "@chakra-ui/react"; -import { useContext, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Container } from "@chakra-ui/react"; import { FaEllipsisVertical, FaTrash, FaPencil, FaLink } from "react-icons/fa6"; import useApi from "../../lib/useApi"; import useRoomList from "./useRoomList"; -import { DomainContext } from "../../domainContext"; import { Select, Options, OptionBase } from "chakra-react-select"; interface Stream { - id: number; + stream_id: number; name: string; - topics: string[]; } interface SelectOption extends OptionBase { @@ -82,41 +80,63 @@ export default function RoomsList() { const [page, setPage] = useState(1); const { loading, response, refetch } = useRoomList(page); const [streams, setStreams] = useState([]); + const [topics, setTopics] = useState([]); + const [error, setError] = useState(""); const [linkCopied, setLinkCopied] = useState(""); + interface Stream { + stream_id: number; + name: string; + } - const { zulip_streams } = useContext(DomainContext); + interface Topic { + name: string; + } useEffect(() => { const fetchZulipStreams = async () => { + if (!api) return; + try { - const response = await fetch(zulip_streams + "/streams.json"); - if (!response.ok) { - throw new Error("Network response was not ok"); - } - let data = await response.json(); - data = data.sort((a: Stream, b: Stream) => - a.name.localeCompare(b.name), - ); - setStreams(data); - } catch (err) { - console.error("Error fetching streams:", err); + const response = await api.v1ZulipGetStreams(); + setStreams(response); + } catch (error) { + console.error("Error fetching Zulip streams:", error); } }; if (room.zulipAutoPost) { fetchZulipStreams(); } - }, [room.zulipAutoPost]); + }, [room.zulipAutoPost, !api]); + + useEffect(() => { + const fetchZulipTopics = async () => { + if (!api || !room.zulipStream) return; + try { + const selectedStream = streams.find((s) => s.name === room.zulipStream); + if (selectedStream) { + const response = await api.v1ZulipGetTopics({ + streamId: selectedStream.stream_id, + }); + setTopics(response); + } + } catch (error) { + console.error("Error fetching Zulip topics:", error); + } + }; + + fetchZulipTopics(); + }, [room.zulipStream, streams, api]); const streamOptions: Options = streams.map((stream) => { return { label: stream.name, value: stream.name }; }); - const topicOptions = - streams - .find((stream) => stream.name === room.zulipStream) - ?.topics.map((topic) => ({ label: topic, value: topic })) || []; + const topicOptions: Options = topics.map((topic) => ({ + label: topic.name, + value: topic.name, + })); const handleCopyUrl = (roomName: string) => { const roomUrl = `${window.location.origin}/${roomName}`; diff --git a/www/app/domainContext.tsx b/www/app/domainContext.tsx index fb57a066..7e415f1c 100644 --- a/www/app/domainContext.tsx +++ b/www/app/domainContext.tsx @@ -13,7 +13,6 @@ export const DomainContext = createContext({ }, api_url: "", websocket_url: "", - zulip_streams: "", }); export const DomainContextProvider = ({ diff --git a/www/app/lib/edgeConfig.ts b/www/app/lib/edgeConfig.ts index ae25853d..2e31e146 100644 --- a/www/app/lib/edgeConfig.ts +++ b/www/app/lib/edgeConfig.ts @@ -13,7 +13,6 @@ type EdgeConfig = { auth_callback_url: string; websocket_url: string; api_url: string; - zulip_streams: string; }; };