Skip to content

Commit

Permalink
feat: hidden pages (#1422)
Browse files Browse the repository at this point in the history
* feat: add `hideFromGuildPage` to the `Group` type

* feat(CampaignForm): add "Show on Guild page" switch

* feat(CampaignForm): add switch description

* feat(CampaignCards): handle hidden pages

* copy improvements

* fix(useEditRoleGroup): don't navigate to page from home on edit

---------

Co-authored-by: valid <valid@zgen.hu>
  • Loading branch information
BrickheadJohnny and dovalid authored Jul 30, 2024
1 parent 8072a91 commit de55582
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@ import {
HStack,
Img,
SkeletonCircle,
Tag,
TagLabel,
TagLeftIcon,
Text,
Tooltip,
VStack,
useColorModeValue,
} from "@chakra-ui/react"
import { ArrowRight, Plus } from "@phosphor-icons/react"
import { ArrowRight, EyeSlash, Plus } from "@phosphor-icons/react"
import useGuild from "components/[guild]/hooks/useGuild"
import useGuildPermission from "components/[guild]/hooks/useGuildPermission"
import Button from "components/common/Button"
Expand Down Expand Up @@ -36,12 +41,22 @@ const CampaignCards = () => {

if (!groups?.length || !!query.group) return null

const renderedGroups = isAdmin
? groups
: groups.filter((group) => !group.hideFromGuildPage)

return (
<>
{groups.map(({ id, imageUrl, name, urlName }) => {
const groupHasRoles = roles.some((role) => role.groupId === id)
{renderedGroups.map(({ id, imageUrl, name, urlName, hideFromGuildPage }) => {
const groupHasRoles = roles?.some((role) => role.groupId === id)
if (!isAdmin && !groupHasRoles) return null

let campaignImage = ""
if (typeof imageUrl === "string" && imageUrl.length > 0)
campaignImage = imageUrl
else if (typeof guildImageUrl === "string" && guildImageUrl.length > 0)
campaignImage = guildImageUrl

return (
<ColorCard
key={id}
Expand All @@ -55,7 +70,7 @@ const CampaignCards = () => {
{isAdmin && <DynamicCampaignCardMenu groupId={id} />}

<HStack spacing={3} minHeight={10} mb={5}>
{imageUrl?.length > 0 || guildImageUrl?.length > 0 ? (
{campaignImage.length > 0 ? (
<Circle
overflow={"hidden"}
borderRadius="full"
Expand All @@ -64,21 +79,31 @@ const CampaignCards = () => {
position="relative"
bgColor={imageBgColor}
>
{imageUrl?.match("guildLogos") ? (
<Img src={imageUrl} alt="Guild logo" boxSize="40%" />
{campaignImage.match("guildLogos") ? (
<Img src={campaignImage} alt="Guild logo" boxSize="40%" />
) : (
<Image
src={imageUrl || guildImageUrl}
alt={name}
fill
sizes="2.5rem"
/>
<Image src={campaignImage} alt={name} fill sizes="2.5rem" />
)}
</Circle>
) : (
<SkeletonCircle size="10" />
)}
<Text fontWeight="bold">{name}</Text>

<VStack alignItems="start">
<Text fontWeight="bold">{name}</Text>
{hideFromGuildPage && (
<Tooltip
label="Members don't see this, they can only access this page by visiting it's link directly"
hasArrow
placement="bottom"
>
<Tag>
<TagLeftIcon as={EyeSlash} />
<TagLabel>Hidden</TagLabel>
</Tag>
</Tooltip>
)}
</VStack>
</HStack>

{groupHasRoles ? (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const CampaignCardMenu = ({ groupId }: Props) => {
<Box position="absolute" top={2} right={2}>
<PlatformCardMenu>
<MenuItem icon={<PencilSimple />} onClick={onOpen}>
Edit page appearance
Customize page
</MenuItem>
<MenuItem
icon={<TrashSimple />}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,27 @@ import { Modal } from "components/common/Modal"
import usePinata from "hooks/usePinata"
import useSubmitWithUpload from "hooks/useSubmitWithUpload"
import { FormProvider, useForm } from "react-hook-form"
import { Group } from "types"
import useEditRoleGroup from "../hooks/useEditRoleGroup"

type Props = {
isOpen: boolean
onClose: () => void
groupId: number
onSuccess: () => void
onSuccess: (res: Group) => void
}

const EditCampaignModal = ({ groupId, onSuccess, ...modalProps }: Props) => {
const group = useRoleGroup(groupId)
const { name, imageUrl, description } = group ?? {}
const { name, imageUrl, description, hideFromGuildPage } = group ?? {}

const methods = useForm<CampaignFormType>({
mode: "all",
defaultValues: {
name,
imageUrl: imageUrl ?? "",
description: description ?? "",
hideFromGuildPage,
},
})
const { handleSubmit } = methods
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@ import useGuild from "components/[guild]/hooks/useGuild"
import useShowErrorToast from "hooks/useShowErrorToast"
import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit"
import useToast from "hooks/useToast"
import { useRouter } from "next/router"
import { Group } from "types"
import fetcher from "utils/fetcher"

const useEditRoleGroup = (groupId: number, onSuccess: () => void) => {
const useEditRoleGroup = (groupId: number, onSuccess: (res: Group) => void) => {
const { id, mutateGuild } = useGuild()
const { urlName } = useGuild()
const { replace } = useRouter()

const toast = useToast()
const showErrorToast = useShowErrorToast()
Expand All @@ -22,7 +19,6 @@ const useEditRoleGroup = (groupId: number, onSuccess: () => void) => {

return useSubmitWithSign<Group>(editRoleGroup, {
onSuccess: (response) => {
replace(`/${urlName}/${response.urlName}`)
toast({
status: "success",
title: "Successfully edited page",
Expand All @@ -36,7 +32,7 @@ const useEditRoleGroup = (groupId: number, onSuccess: () => void) => {
}),
{ revalidate: false }
)
onSuccess()
onSuccess(response)
},
onError: (error) => showErrorToast(error),
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@ import {
Textarea,
} from "@chakra-ui/react"
import FormErrorMessage from "components/common/FormErrorMessage"
import Switch from "components/common/Switch"
import IconSelector from "components/create-guild/IconSelector"
import { GUILD_NAME_REGEX } from "components/create-guild/Name"
import { Uploader } from "hooks/usePinata/usePinata"
import { useFormContext } from "react-hook-form"
import { ChangeEvent } from "react"
import { useController, useFormContext } from "react-hook-form"

export type CampaignFormType = {
imageUrl?: string
name: string
description?: string
hideFromGuildPage?: boolean
}

type Props = {
Expand All @@ -24,10 +27,19 @@ type Props = {

const CampaignForm = ({ iconUploader }: Props) => {
const {
control,
register,
formState: { errors },
} = useFormContext<CampaignFormType>()

const {
field: {
value: hideFromGuildPage,
onChange: hideFromGuildPageOnChange,
...hideFromGuildPageField
},
} = useController({ control, name: "hideFromGuildPage" })

return (
<Stack spacing={6}>
<FormControl isInvalid={!!errors.name}>
Expand Down Expand Up @@ -57,11 +69,19 @@ const CampaignForm = ({ iconUploader }: Props) => {

<FormControl>
<FormLabel>Description</FormLabel>
<Textarea
placeholder="Optional"
{...register("description")}
size="lg"
></Textarea>
<Textarea placeholder="Optional" {...register("description")} size="lg" />
</FormControl>

<FormControl pt="2">
<Switch
{...hideFromGuildPageField}
title="Show on home page"
description="If turned off, the page will only be accessible by visiting it's link directly"
onChange={(e: ChangeEvent<HTMLInputElement>) =>
hideFromGuildPageOnChange(!e.target.checked)
}
isChecked={!hideFromGuildPage}
/>
</FormControl>
</Stack>
)
Expand Down
12 changes: 11 additions & 1 deletion src/components/[guild]/[group]/EditCampaignButton.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
import { IconButton, useDisclosure } from "@chakra-ui/react"
import { GearSix } from "@phosphor-icons/react"
import { useRouter } from "next/router"
import { Group } from "types"
import EditCampaignModal from "../AccessHub/components/CampaignCards/components/EditCampaignModal"
import { useThemeContext } from "../ThemeContext"
import useGuild from "../hooks/useGuild"
import useRoleGroup from "../hooks/useRoleGroup"

const EditCampaignButton = () => {
const group = useRoleGroup()
const { urlName } = useGuild()
const { replace } = useRouter()

const { textColor, buttonColorScheme } = useThemeContext()

const { isOpen, onOpen, onClose } = useDisclosure()

const onSuccess = (response: Group) => {
onClose()
replace(`/${urlName}/${response.urlName}`)
}

return (
<>
<IconButton
Expand All @@ -27,7 +37,7 @@ const EditCampaignButton = () => {
isOpen={isOpen}
onClose={onClose}
groupId={group.id}
onSuccess={onClose}
onSuccess={onSuccess}
/>
</>
)
Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,7 @@ type Group = {
type?: string
position?: number
guildId: number
hideFromGuildPage: boolean
}

type SelectOption<T = string> = {
Expand Down

0 comments on commit de55582

Please sign in to comment.