v3/packages/design-system/organisms/masthead/Authed.tsx
Katalina 99952aa19f
Feat/recent guilds (#89) (#167)
* feat(web): add server-setup page for when bot isn't in the server picked

* chore: move contexts into their own folder

* feat(web): add recent guilds context, and app shell helper context

* feat(web): show recent guilds in masthead

* feat(web): functionally add recents to servers list

* fix(web): correct styling for servers listing recents/all headers

* fix(web): correct some type issues with appShellProps

* fix(web): don't show ServerListing recents when recents is empty
2021-03-13 19:31:36 -05:00

102 lines
3.9 KiB
TypeScript

import { DynamicLogomark } from '@roleypoly/design-system/atoms/branding';
import { Popover } from '@roleypoly/design-system/atoms/popover';
import { GuildNav } from '@roleypoly/design-system/molecules/guild-nav';
import { NavSlug } from '@roleypoly/design-system/molecules/nav-slug';
import { UserAvatarGroup } from '@roleypoly/design-system/molecules/user-avatar-group';
import { UserPopover } from '@roleypoly/design-system/molecules/user-popover';
import { DiscordUser, GuildSlug } from '@roleypoly/types';
import * as React from 'react';
import { GoOrganization } from 'react-icons/go';
import {
GuildPopoverHead,
InteractionBase,
MastheadA,
MastheadAlignment,
MastheadBase,
MastheadLeft,
MastheadRight,
} from './Masthead.styled';
type Props = {
user?: DiscordUser;
activeGuildId: string | null;
guilds: GuildSlug[];
disableGuildPicker?: boolean;
recentGuilds: string[];
};
export const Authed = (props: Props) => {
const [userPopoverState, setUserPopoverState] = React.useState(false);
const [serverPopoverState, setServerPopoverState] = React.useState(false);
return (
<MastheadBase>
<MastheadAlignment>
<MastheadLeft>
<MastheadA to="/servers">
<DynamicLogomark height={35} />
</MastheadA>
<InteractionBase
onClick={() => {
if (!props.disableGuildPicker) {
setServerPopoverState(true);
setUserPopoverState(false);
}
}}
hide={!serverPopoverState}
>
<NavSlug
guild={
props.guilds.find(
(guild) => guild.id === props.activeGuildId
) || null
}
/>
</InteractionBase>
<Popover
headContent={
<GuildPopoverHead>
<GoOrganization />
My Guilds
</GuildPopoverHead>
}
canDefocus
position="bottom left"
active={serverPopoverState}
preferredWidth={560}
onExit={() => setServerPopoverState(false)}
>
{() => (
<GuildNav
guilds={props.guilds}
recentGuilds={props.recentGuilds || []}
/>
)}
</Popover>
</MastheadLeft>
<MastheadRight>
<InteractionBase
onClick={() => {
setUserPopoverState(true);
setServerPopoverState(false);
}}
hide={!userPopoverState}
>
{props.user !== undefined && (
<UserAvatarGroup user={props.user} />
)}
</InteractionBase>
<Popover
headContent={<></>}
canDefocus
position="top right"
active={userPopoverState}
onExit={() => setUserPopoverState(false)}
>
{() => props.user && <UserPopover user={props.user} />}
</Popover>
</MastheadRight>
</MastheadAlignment>
</MastheadBase>
);
};