2026-08-15 17:53:48 +07:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
import { Select, type SelectOption } from "@/components/primitives";
|
2026-09-23 19:45:14 +07:00
|
|
|
import { useGuilds, useTextChannels } from "@/hooks";
|
2026-08-15 17:53:48 +07:00
|
|
|
import type { Guild } from "@/lib/types";
|
|
|
|
|
|
|
|
|
|
export function GuildChannelPicker({
|
|
|
|
|
guildsInitial,
|
|
|
|
|
guildId,
|
|
|
|
|
channelId,
|
|
|
|
|
onChange,
|
|
|
|
|
}: {
|
|
|
|
|
guildsInitial?: Guild[];
|
|
|
|
|
guildId: string | null;
|
|
|
|
|
channelId: string | null;
|
|
|
|
|
onChange: (guildId: string, channelId: string | null) => void;
|
|
|
|
|
}) {
|
|
|
|
|
const { data: guilds } = useGuilds(guildsInitial);
|
|
|
|
|
const textChannels = useTextChannels(guildId ?? "");
|
2026-09-23 19:45:14 +07:00
|
|
|
const channels = textChannels.data;
|
2026-08-15 17:53:48 +07:00
|
|
|
|
|
|
|
|
const [g, setG] = useState(guildId);
|
|
|
|
|
const [c, setC] = useState(channelId);
|
|
|
|
|
|
|
|
|
|
useEffect(() => setG(guildId), [guildId]);
|
|
|
|
|
useEffect(() => setC(channelId), [channelId]);
|
|
|
|
|
|
|
|
|
|
const guildOpts: SelectOption[] = (guilds ?? []).map((x) => ({
|
|
|
|
|
value: x.id,
|
|
|
|
|
label: x.name,
|
|
|
|
|
}));
|
|
|
|
|
const channelOpts: SelectOption[] = (channels ?? []).map((x) => ({
|
|
|
|
|
value: x.id,
|
|
|
|
|
label: x.name,
|
|
|
|
|
hint: x.type,
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
return (
|
2026-08-16 16:36:34 +07:00
|
|
|
<div className="flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center">
|
2026-08-15 17:53:48 +07:00
|
|
|
<Select
|
|
|
|
|
value={g}
|
|
|
|
|
onChange={(v) => {
|
|
|
|
|
setG(v);
|
|
|
|
|
setC(null);
|
|
|
|
|
onChange(v, null);
|
|
|
|
|
}}
|
|
|
|
|
options={guildOpts}
|
|
|
|
|
placeholder="Guild"
|
|
|
|
|
size="sm"
|
2026-08-16 16:36:34 +07:00
|
|
|
className="w-full sm:w-44"
|
2026-08-15 17:53:48 +07:00
|
|
|
/>
|
|
|
|
|
<Select
|
|
|
|
|
value={c}
|
|
|
|
|
onChange={(v) => {
|
|
|
|
|
setC(v);
|
|
|
|
|
if (g) onChange(g, v);
|
|
|
|
|
}}
|
|
|
|
|
options={channelOpts}
|
2026-09-23 19:45:14 +07:00
|
|
|
placeholder="Text channel"
|
2026-08-15 17:53:48 +07:00
|
|
|
size="sm"
|
2026-08-16 16:36:34 +07:00
|
|
|
className="w-full sm:w-52"
|
2026-08-15 17:53:48 +07:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|