diff --git a/reminder-dashboard/src/api.ts b/reminder-dashboard/src/api.ts index c66ba6f..fe6fe07 100644 --- a/reminder-dashboard/src/api.ts +++ b/reminder-dashboard/src/api.ts @@ -6,7 +6,7 @@ enum ColorScheme { Light = "light", } -type UserInfo = { +export type UserInfo = { name: string; patreon: boolean; preferences: { diff --git a/reminder-dashboard/src/components/Guild/GuildReminders.tsx b/reminder-dashboard/src/components/Guild/GuildReminders.tsx index a20590e..60c35db 100644 --- a/reminder-dashboard/src/components/Guild/GuildReminders.tsx +++ b/reminder-dashboard/src/components/Guild/GuildReminders.tsx @@ -1,8 +1,8 @@ import { useQuery, useQueryClient } from "react-query"; -import { fetchGuildChannels, fetchGuildReminders } from "../../api"; +import { fetchGuildChannels, fetchGuildInfo, fetchGuildReminders, fetchUserInfo } from "../../api"; import { EditReminder } from "../Reminder/EditReminder"; import { CreateReminder } from "../Reminder/CreateReminder"; -import { useCallback, useState } from "preact/hooks"; +import { useCallback, useMemo, useState } from "preact/hooks"; import { Loader } from "../Loader"; import { useGuild } from "../App/useGuild"; @@ -22,6 +22,11 @@ export const GuildReminders = () => { data: guildReminders, } = useQuery(fetchGuildReminders(guild)); const { data: channels } = useQuery(fetchGuildChannels(guild)); + const channelNames = useMemo(() => { + return new Map(channels.map((ch) => [ch.id, ch.name])); + }, [channels]); + const { isSuccess: guildFetched, data: guildInfo } = useQuery({ ...fetchGuildInfo(guild) }); + const { isSuccess: userFetched, data: userInfo } = useQuery({ ...fetchUserInfo() }); const [collapsed, setCollapsed] = useState(false); const [sort, _setSort] = useState(Sort.Time); @@ -34,9 +39,49 @@ export const GuildReminders = () => { _setSort(sort); }, []); + const sorted = useMemo( + () => + [...guildReminders] + .sort((r1, r2) => { + if (sort === Sort.Time) { + return r1.utc_time > r2.utc_time ? 1 : -1; + } else if (sort === Sort.Name) { + return r1.name > r2.name ? 1 : -1; + } else { + return r1.channel > r2.channel ? 1 : -1; + } + }) + .map((reminder) => { + let breaker = <>; + if (sort === Sort.Channel && channels) { + if (prevReminder === null || prevReminder.channel !== reminder.channel) { + breaker = ( +
#{channelNames[reminder.channel]}
+ ); + } + } + + prevReminder = reminder; + + return ( + <> + {breaker} + + + ); + }), + [guildReminders, sort, channelNames, collapsed], + ); + return ( <> - {!isFetched && } + {!(userFetched && guildFetched && isFetched) && } Create Reminder
@@ -100,44 +145,7 @@ export const GuildReminders = () => {
- {isSuccess && - guildReminders - .sort((r1, r2) => { - if (sort === Sort.Time) { - return r1.utc_time > r2.utc_time ? 1 : -1; - } else if (sort === Sort.Name) { - return r1.name > r2.name ? 1 : -1; - } else { - return r1.channel > r2.channel ? 1 : -1; - } - }) - .map((reminder) => { - let breaker = <>; - if (sort === Sort.Channel && channels) { - if ( - prevReminder === null || - prevReminder.channel !== reminder.channel - ) { - const channel = channels.find( - (ch) => ch.id === reminder.channel, - ); - breaker =
#{channel.name}
; - } - } - - prevReminder = reminder; - - return ( - <> - {breaker} - - - ); - })} + {isSuccess && sorted}
); diff --git a/reminder-dashboard/src/components/Reminder/ButtonRow/EditButtonRow.tsx b/reminder-dashboard/src/components/Reminder/ButtonRow/EditButtonRow.tsx index d1b2cb0..50e75eb 100644 --- a/reminder-dashboard/src/components/Reminder/ButtonRow/EditButtonRow.tsx +++ b/reminder-dashboard/src/components/Reminder/ButtonRow/EditButtonRow.tsx @@ -1,5 +1,5 @@ import { useRef, useState } from "preact/hooks"; -import { useMutation, useQueryClient } from "react-query"; +import { useMutation } from "react-query"; import { patchGuildReminder, patchUserReminder } from "../../../api"; import { ICON_FLASH_TIME } from "../../../consts"; import { DeleteButton } from "./DeleteButton"; diff --git a/reminder-dashboard/src/components/Reminder/EditReminder.tsx b/reminder-dashboard/src/components/Reminder/EditReminder.tsx index f715ca1..9e43003 100644 --- a/reminder-dashboard/src/components/Reminder/EditReminder.tsx +++ b/reminder-dashboard/src/components/Reminder/EditReminder.tsx @@ -1,4 +1,4 @@ -import { Reminder } from "../../api"; +import { Reminder, UserInfo, GuildInfo } from "../../api"; import { useEffect, useState } from "preact/hooks"; import { EditButtonRow } from "./ButtonRow/EditButtonRow"; import { Message } from "./Message"; @@ -10,9 +10,16 @@ import "./styles.scss"; type Props = { reminder: Reminder; globalCollapse: boolean; + userInfo: UserInfo; + guildInfo: GuildInfo; }; -export const EditReminder = ({ reminder: initialReminder, globalCollapse }: Props) => { +export const EditReminder = ({ + reminder: initialReminder, + globalCollapse, + userInfo, + guildInfo, +}: Props) => { const [propReminder, setPropReminder] = useState(initialReminder); const [reminder, setReminder] = useState(initialReminder); const [collapsed, setCollapsed] = useState(false); @@ -39,11 +46,15 @@ export const EditReminder = ({ reminder: initialReminder, globalCollapse }: Prop setCollapsed(!collapsed); }} /> -
- - -
- + {!collapsed && ( + <> +
+ + +
+ + + )} ); diff --git a/reminder-dashboard/src/components/Reminder/Settings.tsx b/reminder-dashboard/src/components/Reminder/Settings.tsx index ac151fa..2ed0263 100644 --- a/reminder-dashboard/src/components/Reminder/Settings.tsx +++ b/reminder-dashboard/src/components/Reminder/Settings.tsx @@ -1,24 +1,21 @@ import { ChannelSelector } from "./ChannelSelector"; import { IntervalSelector } from "./IntervalSelector"; -import { useQuery } from "react-query"; -import { fetchGuildInfo, fetchUserInfo } from "../../api"; import { useReminder } from "./ReminderContext"; import { Attachment } from "./Attachment"; import { TTS } from "./TTS"; import { TimeInput } from "./TimeInput"; import { useGuild } from "../App/useGuild"; +import { GuildInfo, UserInfo } from "../../api"; -export const Settings = () => { +type Props = { + userInfo: UserInfo; + guildInfo: GuildInfo; +}; + +export const Settings = ({ guildInfo, userInfo }: Props) => { const guild = useGuild(); - const { isSuccess: userFetched, data: userInfo } = useQuery({ ...fetchUserInfo() }); - const { isSuccess: guildFetched, data: guildInfo } = useQuery({ ...fetchGuildInfo(guild) }); - const [reminder, setReminder] = useReminder(); - if (!userFetched || !guildFetched) { - return <>; - } - return (
{guild && (