diff --git a/reminder-dashboard/src/components/App/Mentions.tsx b/reminder-dashboard/src/components/App/Mentions.tsx new file mode 100644 index 0000000..1c5e972 --- /dev/null +++ b/reminder-dashboard/src/components/App/Mentions.tsx @@ -0,0 +1,42 @@ +import { useEffect, useMemo } from "preact/hooks"; +import { useQuery } from "react-query"; +import { fetchGuildChannels, fetchGuildRoles } from "../../api"; +import Tribute from "tributejs"; +import { useGuild } from "./useGuild"; + +export const Mentions = ({ input }) => { + const guild = useGuild(); + + const { data: roles } = useQuery(fetchGuildRoles(guild)); + const { data: channels } = useQuery(fetchGuildChannels(guild)); + + const tribute = useMemo(() => { + return new Tribute({ + collection: [ + { + trigger: "@", + values: (roles || []).map(({ id, name }) => ({ key: name, value: id })), + allowSpaces: true, + selectTemplate: (item) => `<@&${item.original.value}>`, + menuItemTemplate: (item) => `@${item.original.key}`, + }, + { + trigger: "#", + values: (channels || []).map(({ id, name }) => ({ key: name, value: id })), + allowSpaces: true, + selectTemplate: (item) => `<#${item.original.value}>`, + menuItemTemplate: (item) => `#${item.original.key}`, + }, + ], + }); + }, [roles, channels]); + + useEffect(() => { + tribute.detach(input.current); + if (input.current !== null) { + tribute.attach(input.current); + } + }, [tribute]); + + return <>; +}; diff --git a/reminder-dashboard/src/components/App/useGuild.tsx b/reminder-dashboard/src/components/App/useGuild.tsx index 5be8de0..408dd41 100644 --- a/reminder-dashboard/src/components/App/useGuild.tsx +++ b/reminder-dashboard/src/components/App/useGuild.tsx @@ -1,6 +1,6 @@ import { useParams } from "wouter"; export const useGuild = () => { - const { guild } = useParams() as { guild: string }; - return guild; + const { guild } = useParams() as { guild?: string }; + return guild || null; }; diff --git a/reminder-dashboard/src/components/App/useMentions.tsx b/reminder-dashboard/src/components/App/useMentions.tsx deleted file mode 100644 index 855148d..0000000 --- a/reminder-dashboard/src/components/App/useMentions.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect, useMemo } from "preact/hooks"; -import { useQuery } from "react-query"; -import { fetchGuildRoles } from "../../api"; -import Tribute from "tributejs"; -import { useGuild } from "./useGuild"; - -export const useMentions = (input) => { - const guild = useGuild(); - - const { data: roles } = useQuery(fetchGuildRoles(guild)); - - const tribute = useMemo(() => { - return new Tribute({ - values: (roles || []).map(({ id, name }) => ({ key: name, value: id })), - allowSpaces: true, - selectTemplate: (item) => { - return `<@&${item.original.value}>`; - }, - }); - }, [roles]); - - useEffect(() => { - tribute.detach(input.current); - if (input.current !== null) { - tribute.attach(input.current); - } - }, [tribute]); -}; diff --git a/reminder-dashboard/src/components/Reminder/Content.tsx b/reminder-dashboard/src/components/Reminder/Content.tsx index 3e9d6c9..11bda66 100644 --- a/reminder-dashboard/src/components/Reminder/Content.tsx +++ b/reminder-dashboard/src/components/Reminder/Content.tsx @@ -1,15 +1,16 @@ import { useReminder } from "./ReminderContext"; import { useRef } from "preact/hooks"; -import { useMentions } from "../App/useMentions"; +import { Mentions } from "../App/Mentions"; +import { useGuild } from "../App/useGuild"; export const Content = () => { + const guild = useGuild(); const [reminder, setReminder] = useReminder(); - const input = useRef(null); - useMentions(input); return ( <> + {guild && }