diff --git a/src/design-system/organisms/server-setup/ServerSetup.stories.tsx b/src/design-system/organisms/server-setup/ServerSetup.stories.tsx new file mode 100644 index 0000000..0d61e98 --- /dev/null +++ b/src/design-system/organisms/server-setup/ServerSetup.stories.tsx @@ -0,0 +1,25 @@ +import { UserGuildPermissions } from 'roleypoly/common/types'; +import { mastheadSlugs } from 'roleypoly/common/types/storyData'; +import { ServerSetup } from './ServerSetup'; + +export default { + title: 'Organisms/Server Setup', + component: ServerSetup, +}; + +export const asAdmin = () => ( + +); +export const asManager = () => ( + +); +export const asUser = () => ( + +); diff --git a/src/design-system/organisms/server-setup/ServerSetup.styled.ts b/src/design-system/organisms/server-setup/ServerSetup.styled.ts new file mode 100644 index 0000000..fb5c33b --- /dev/null +++ b/src/design-system/organisms/server-setup/ServerSetup.styled.ts @@ -0,0 +1,14 @@ +import styled from 'styled-components'; + +export const FlexLine = styled.div` + display: flex; + align-items: center; + justify-content: center; + padding: 15px; +`; + +export const FlexWrap = styled.div` + display: flex; + flex-direction: column; + flex-wrap: wrap; +`; diff --git a/src/design-system/organisms/server-setup/ServerSetup.tsx b/src/design-system/organisms/server-setup/ServerSetup.tsx new file mode 100644 index 0000000..7aba5c4 --- /dev/null +++ b/src/design-system/organisms/server-setup/ServerSetup.tsx @@ -0,0 +1,124 @@ +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import * as React from 'react'; +import { FaDiscord } from 'react-icons/fa'; +import { GoArrowLeft } from 'react-icons/go'; +import { GuildSlug, UserGuildPermissions } from 'roleypoly/common/types'; +import { evaluatePermission } from 'roleypoly/common/utils/hasPermission'; +import { Avatar, utils } from 'roleypoly/design-system/atoms/avatar'; +import { Button } from 'roleypoly/design-system/atoms/button'; +import { DotOverlay } from 'roleypoly/design-system/atoms/dot-overlay'; +import { Hero } from 'roleypoly/design-system/atoms/hero'; +import { AccentTitle, SmallTitle } from 'roleypoly/design-system/atoms/typography'; +import { FlexLine, FlexWrap } from './ServerSetup.styled'; + +export type ServerSetupProps = { + guildSlug: GuildSlug; +}; + +export const ServerSetup = (props: ServerSetupProps) => ( + <> + + + + + + + {utils.initialsFromName(props.guildSlug.name)} + + + + + Roleypoly isn't in {props.guildSlug.name} + + + + {renderMessage(props.guildSlug)} + + + > +); + +const renderMessage = ({ id, permissionLevel, name }: GuildSlug) => { + if (evaluatePermission(permissionLevel, UserGuildPermissions.Admin)) { + return adminMessage(id); + } else if (evaluatePermission(permissionLevel, UserGuildPermissions.Manager)) { + return managerMessage(id); + } else { + return userMessage(name); + } +}; + +const adminMessage = (id: string) => ( + <> + + + You're an admin of this server, click the button to get started! + + + + + + + }> + Add Roleypoly + + + + + + > +); + +const managerMessage = (id: string) => ( + <> + + + You might have the permissions to add it to the server. + + + + + + + }> + Add Roleypoly + + + + + + > +); + +const userMessage = (name: string) => { + const router = useRouter(); + return ( + <> + + + If you think this is a mistake, please contact staff for {name}. + + + + { + void router.push('/'); + }} + color="muted" + size="small" + icon={} + > + Go back + + + > + ); +}; diff --git a/src/design-system/organisms/server-setup/index.ts b/src/design-system/organisms/server-setup/index.ts new file mode 100644 index 0000000..7236927 --- /dev/null +++ b/src/design-system/organisms/server-setup/index.ts @@ -0,0 +1 @@ +export * from './ServerSetup'; diff --git a/src/design-system/templates/server-setup/ServerSetup.stories.tsx b/src/design-system/templates/server-setup/ServerSetup.stories.tsx new file mode 100644 index 0000000..a0b1050 --- /dev/null +++ b/src/design-system/templates/server-setup/ServerSetup.stories.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { mastheadSlugs, user } from 'roleypoly/common/types/storyData'; +import { ServerSetupTemplate } from './ServerSetup'; + +export default { + title: 'Templates/Server Setup', + component: ServerSetupTemplate, + args: { + guilds: mastheadSlugs, + user: user, + guildSlug: mastheadSlugs[1], + }, +}; + +export const serverSetup = (args) => ; diff --git a/src/design-system/templates/server-setup/ServerSetup.tsx b/src/design-system/templates/server-setup/ServerSetup.tsx new file mode 100644 index 0000000..bba5b77 --- /dev/null +++ b/src/design-system/templates/server-setup/ServerSetup.tsx @@ -0,0 +1,18 @@ +import { AppShell, AppShellProps } from 'roleypoly/design-system/organisms/app-shell'; +import { + ServerSetup, + ServerSetupProps, +} from 'roleypoly/design-system/organisms/server-setup/ServerSetup'; + +type ServerSetupTemplateProps = Omit & ServerSetupProps; + +export const ServerSetupTemplate = ({ + guildSlug, + ...appShellProps +}: ServerSetupTemplateProps) => { + return ( + + + + ); +}; diff --git a/src/design-system/templates/server-setup/index.ts b/src/design-system/templates/server-setup/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/s/[id]/setup.tsx b/src/pages/s/[id]/setup.tsx new file mode 100644 index 0000000..8d84591 --- /dev/null +++ b/src/pages/s/[id]/setup.tsx @@ -0,0 +1,33 @@ +import { NextPageContext } from 'next'; +import { useRouter } from 'next/router'; +import * as React from 'react'; +import { ServerSetupTemplate } from 'roleypoly/design-system/templates/server-setup/ServerSetup'; +import { useAppShellProps } from 'roleypoly/providers/appShellData'; + +const serverSetup = (props: { guildID: string }) => { + const { appShellProps } = useAppShellProps(); + + const guildSlug = appShellProps.guilds?.find((guild) => guild.id === props.guildID); + + if (!guildSlug) { + const router = useRouter(); + void router.push('/machinery/error?error_code=404'); + return null; + } + + return ( + + ); +}; + +serverSetup.getInitialProps = async (context: NextPageContext) => { + return { + guildID: context.query.id, + }; +}; + +export default serverSetup;