From f01325cfba3a7d393f23a5a6e2280329f825cdfd Mon Sep 17 00:00:00 2001 From: Katalina Okano Date: Sat, 13 Mar 2021 18:52:40 -0500 Subject: [PATCH] feat(web): show recent guilds in masthead --- .../molecules/guild-nav/GuildNav.tsx | 69 ++++++++++++++----- .../organisms/masthead/Authed.tsx | 2 +- .../templates/role-picker/RolePicker.tsx | 10 ++- .../templates/servers/Servers.tsx | 5 +- .../contexts/app-shell/AppShellContext.tsx | 16 +++-- packages/web/src/pages/landing.tsx | 4 +- packages/web/src/pages/picker.tsx | 8 +-- packages/web/src/pages/servers.tsx | 4 +- 8 files changed, 81 insertions(+), 37 deletions(-) diff --git a/packages/design-system/molecules/guild-nav/GuildNav.tsx b/packages/design-system/molecules/guild-nav/GuildNav.tsx index c6b36a4..079812e 100644 --- a/packages/design-system/molecules/guild-nav/GuildNav.tsx +++ b/packages/design-system/molecules/guild-nav/GuildNav.tsx @@ -9,6 +9,7 @@ import { GuildNavItem } from './GuildNav.styled'; type Props = { guilds: GuildSlug[]; + recentGuilds: string[]; }; const tooltipId = 'guildnav'; @@ -27,23 +28,53 @@ const Badges = (props: { guild: GuildSlug }) => { }, [props.guild.permissionLevel]); }; -export const GuildNav = (props: Props) => ( -
- - {sortBy(props.guilds, 'name', (a: string, b: string) => - a.toLowerCase() > b.toLowerCase() ? 1 : -1 - ).map((guild) => ( - - - - - ))} - - -
+const NavList = (props: { guilds: Props['guilds'] }) => ( + <> + {props.guilds.map((guild) => ( + + + + + ))} + ); + +export const GuildNav = (props: Props) => { + const recentGuildSlugs: GuildSlug[] = props.recentGuilds + .reduce<(GuildSlug | undefined)[]>( + (acc, id) => [...acc, props.guilds.find((guild) => guild.id === id)], + [] + ) + .filter((slug) => slug !== undefined); + + console.log({ + recentGuilds: props.recentGuilds, + slugs: props.guilds, + recentSlugs: recentGuildSlugs, + }); + + const sortedSlugs = sortBy(props.guilds, 'name', (a: string, b: string) => + a.toLowerCase() > b.toLowerCase() ? 1 : -1 + ); + + return ( +
+ + {recentGuildSlugs && ( + <> +
Recents
+ +
All Guilds
+ + )} + + +
+
+ ); +}; diff --git a/packages/design-system/organisms/masthead/Authed.tsx b/packages/design-system/organisms/masthead/Authed.tsx index d25500e..857d340 100644 --- a/packages/design-system/organisms/masthead/Authed.tsx +++ b/packages/design-system/organisms/masthead/Authed.tsx @@ -69,7 +69,7 @@ export const Authed = (props: Props) => { {() => ( )} diff --git a/packages/design-system/templates/role-picker/RolePicker.tsx b/packages/design-system/templates/role-picker/RolePicker.tsx index cec5674..ebf3012 100644 --- a/packages/design-system/templates/role-picker/RolePicker.tsx +++ b/packages/design-system/templates/role-picker/RolePicker.tsx @@ -8,9 +8,15 @@ import * as React from 'react'; export type RolePickerTemplateProps = RolePickerProps & Omit; export const RolePickerTemplate = (props: RolePickerTemplateProps) => { - const { user, guilds, activeGuildId, ...pickerProps } = props; + const { user, guilds, activeGuildId, recentGuilds, ...pickerProps } = props; return ( - + ); diff --git a/packages/design-system/templates/servers/Servers.tsx b/packages/design-system/templates/servers/Servers.tsx index 5f8f7e7..98d42d5 100644 --- a/packages/design-system/templates/servers/Servers.tsx +++ b/packages/design-system/templates/servers/Servers.tsx @@ -1,11 +1,8 @@ import { AppShell, AppShellProps } from '@roleypoly/design-system/organisms/app-shell'; import { ServersListing } from '@roleypoly/design-system/organisms/servers-listing/ServersListing'; -import { GuildSlug } from '@roleypoly/types'; import * as React from 'react'; -type ServerTemplateProps = Omit & { - guilds: GuildSlug[]; -}; +type ServerTemplateProps = Omit; export const ServersTemplate = (props: ServerTemplateProps) => ( diff --git a/packages/web/src/contexts/app-shell/AppShellContext.tsx b/packages/web/src/contexts/app-shell/AppShellContext.tsx index 13432af..9a18ed0 100644 --- a/packages/web/src/contexts/app-shell/AppShellContext.tsx +++ b/packages/web/src/contexts/app-shell/AppShellContext.tsx @@ -3,11 +3,17 @@ import * as React from 'react'; import { useRecentGuilds } from '../recent-guilds/RecentGuildsContext'; import { useSessionContext } from '../session/SessionContext'; -type AppShellPropsT = { - user: AppShellProps['user']; - guilds: AppShellProps['guilds']; - recentGuilds: AppShellProps['recentGuilds']; -}; +type AppShellPropsT = + | { + user: Required; + guilds: Required; + recentGuilds: Required; + } + | { + user: undefined; + guilds: undefined; + recentGuilds: []; + }; export const AppShellPropsContext = React.createContext({ user: undefined, diff --git a/packages/web/src/pages/landing.tsx b/packages/web/src/pages/landing.tsx index 4501321..eb8603d 100644 --- a/packages/web/src/pages/landing.tsx +++ b/packages/web/src/pages/landing.tsx @@ -1,16 +1,18 @@ import { Redirect } from '@reach/router'; import { LandingTemplate } from '@roleypoly/design-system/templates/landing'; import * as React from 'react'; +import { useAppShellProps } from '../contexts/app-shell/AppShellContext'; import { useSessionContext } from '../contexts/session/SessionContext'; const Landing = () => { const { isAuthenticated } = useSessionContext(); + const appShellProps = useAppShellProps(); if (isAuthenticated) { return ; } - return ; + return ; }; export default Landing; diff --git a/packages/web/src/pages/picker.tsx b/packages/web/src/pages/picker.tsx index d64b207..680a0e9 100644 --- a/packages/web/src/pages/picker.tsx +++ b/packages/web/src/pages/picker.tsx @@ -3,6 +3,7 @@ import { RolePickerTemplate } from '@roleypoly/design-system/templates/role-pick import { ServerSetupTemplate } from '@roleypoly/design-system/templates/server-setup'; import { PresentableGuild, RoleUpdate, UserGuildPermissions } from '@roleypoly/types'; import * as React from 'react'; +import { useAppShellProps } from '../contexts/app-shell/AppShellContext'; import { useRecentGuilds } from '../contexts/recent-guilds/RecentGuildsContext'; import { useSessionContext } from '../contexts/session/SessionContext'; import { makeRoleTransactions } from '../utils/roleTransactions'; @@ -14,6 +15,7 @@ type PickerProps = { const Picker = (props: PickerProps) => { const { session, authedFetch, isAuthenticated } = useSessionContext(); const { pushRecentGuild } = useRecentGuilds(); + const appShellProps = useAppShellProps(); const [pickerData, setPickerData] = React.useState( null @@ -58,9 +60,8 @@ const Picker = (props: PickerProps) => { return ( ); } @@ -96,8 +97,7 @@ const Picker = (props: PickerProps) => { return ( { const { isAuthenticated, session } = useSessionContext(); + const appShellProps = useAppShellProps(); if (!isAuthenticated || !session) { return ; } - return ; + return ; }; export default ServersPage;