Skip to content

Commit

Permalink
feature(unlock-app): Adding a page to show event attendees (#13201)
Browse files Browse the repository at this point in the history
* adding settings and attendees pages

* adding an Attendees UI for events

* cleanup
  • Loading branch information
julien51 committed Jan 12, 2024
1 parent bd33c7a commit 5add818
Show file tree
Hide file tree
Showing 12 changed files with 293 additions and 101 deletions.
2 changes: 1 addition & 1 deletion unlock-app/src/components/content/KeychainContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const KeychainContent = () => {
<AppLayout
title={
<div className="flex justify-between">
<h1 className="text-4xl font-bold">Member Keychain</h1>
<h1 className="text-3xl font-bold">Member Keychain</h1>
{networkConfig && account && (
<div className="flex gap-3">
{networkConfig.blockScan && networkConfig.blockScan.url && (
Expand Down
112 changes: 112 additions & 0 deletions unlock-app/src/components/content/event/Attendees.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import { Button } from '@unlock-protocol/ui'
import { useState } from 'react'
import BrowserOnly from '~/components/helpers/BrowserOnly'
import { RiCloseLine as CloseIcon } from 'react-icons/ri'
import { AppLayout } from '~/components/interface/layouts/AppLayout'
import { useRouter } from 'next/router'
import { ActionBar } from '~/components/interface/locks/Manage'
import {
ExpirationStatus,
FilterBar,
} from '~/components/interface/locks/Manage/elements/FilterBar'
import { Members } from '~/components/interface/locks/Manage/elements/Members'
import { NotManagerBanner } from '~/components/interface/locks/Settings'
import { AirdropKeysDrawer } from '~/components/interface/members/airdrop/AirdropDrawer'
import { useEventOrganizer } from '~/hooks/useEventOrganizer'
import { Event, PaywallConfigType } from '@unlock-protocol/core'

interface AttendeesProps {
event: Event
checkoutConfig: {
id?: string
config: PaywallConfigType
}
}

export const Attendees = ({ checkoutConfig }: AttendeesProps) => {
const [airdropKeys, setAirdropKeys] = useState(false)
const [loading, setLoading] = useState(false)
const router = useRouter()

const { data: isOrganizer, isLoading: isLoadingLockManager } =
useEventOrganizer({
checkoutConfig,
})

const showNotManagerBanner = !isLoadingLockManager && !isOrganizer

const [filters, setFilters] = useState({
query: '',
filterKey: 'owner',
expiration: ExpirationStatus.ALL,
})
const [page, setPage] = useState(1)

// Placeholders
const lockAddress = checkoutConfig.config.locks
? Object.keys(checkoutConfig.config.locks)[0]
: null
const lockNetwork = lockAddress
? checkoutConfig.config.locks[lockAddress].network
: null

console.log(lockAddress)

if (showNotManagerBanner) {
return <NotManagerBanner />
}

if (!lockAddress || !lockNetwork) {
return null
}

return (
<BrowserOnly>
<AppLayout authRequired={true} showHeader={false}>
<Button variant="borderless" onClick={() => router.back()}>
<CloseIcon size={20} />
</Button>

<AirdropKeysDrawer
isOpen={airdropKeys}
setIsOpen={setAirdropKeys}
lockAddress={lockAddress}
network={lockNetwork}
/>
<div className="min-h-screen bg-ui-secondary-200 pb-60 flex flex-col gap-4">
<div className="flex flex-row-reverse gap-2">
<Button onClick={() => setAirdropKeys(!airdropKeys)}>
Airdrop tickets
</Button>
</div>
<div className="flex flex-col gap-6 lg:col-span-9">
<ActionBar
page={page}
lockAddress={lockAddress}
network={lockNetwork!}
isOpen={airdropKeys}
setIsOpen={setAirdropKeys}
/>
<FilterBar
filters={filters}
setFilters={setFilters}
setLoading={setLoading}
setPage={setPage}
page={page}
/>
<Members
lockAddress={lockAddress}
network={lockNetwork}
filters={filters}
loading={loading}
setPage={setPage}
page={page}
onAirdropKeys={() => setAirdropKeys(!airdropKeys)}
/>
</div>
</div>
</AppLayout>
</BrowserOnly>
)
}
export default Attendees
56 changes: 45 additions & 11 deletions unlock-app/src/components/content/event/EventDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import { useEffect, useState } from 'react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { ReactMarkdown } from 'react-markdown/lib/react-markdown'
import { NextSeo } from 'next-seo'
import { Button, Card, Disclosure, minifyAddress } from '@unlock-protocol/ui'
import {
Button,
Card,
Disclosure,
Icon,
minifyAddress,
} from '@unlock-protocol/ui'
import AddToCalendarButton from './AddToCalendarButton'
import { TweetItButton } from './TweetItButton'
import { CopyUrlButton } from './CopyUrlButton'
Expand All @@ -26,6 +31,7 @@ import { RegistrationCard } from './RegistrationCard'
import { useEvent } from '~/hooks/useEvent'
import { SettingEmail } from '~/components/interface/locks/Settings/elements/SettingEmail'
import { storage } from '~/config/storage'
import { FaUsers } from 'react-icons/fa'

interface EventDetailsProps {
event: Event
Expand Down Expand Up @@ -163,7 +169,35 @@ export const EventDetails = ({
}}
/>

<div className="relative">
<div className="flex flex-col gap-4">
<div className="flex flex-row-reverse gap-2 ">
{isOrganizer && (
<>
{/* Comimg soon
<Button
onClick={() => {
router.push(`/event/${eventProp.slug}/settings`)
}}
>
<div className="flex items-center gap-2">
<Icon icon={TbSettings} size={20} />
<span>Settings</span>
</div>
</Button> */}
<Button
onClick={() => {
router.push(`/event/${eventProp.slug}/attendees`)
}}
>
<div className="flex items-center gap-2">
<Icon icon={FaUsers} size={20} />
<span>Attendees</span>
</div>
</Button>
</>
)}
</div>

<div className="relative">
<div className="w-full h-32 overflow-hidden -z-0 bg-slate-200 md:h-80 md:rounded-3xl">
{coverImage && (
Expand Down Expand Up @@ -209,11 +243,11 @@ export const EventDetails = ({
</div>
</div>

<section className="grid items-start grid-cols-1 md:gap-4 lg:grid-cols-3 mt-14 lg:px-12 lg:mt-28">
<section className="grid items-start grid-cols-1 md:gap-4 lg:grid-cols-3 lg:px-12 lg:mt-16 mt-8">
<div className="flex flex-col col-span-3 gap-4 md:col-span-2">
<h1 className="text-4xl font-bold md:text-7xl">{event.name}</h1>
<h1 className="text-3xl font-bold md:text-7xl">{event.name}</h1>
<section className="mt-4">
<div className="grid grid-cols-1 gap-6 md:p-6 md:grid-cols-2 rounded-2xl">
<div className="grid grid-cols-1 gap-6 md:p-6 md:grid-cols-2 rounded-xl">
{hasDate && (
<EventDetail label="Date" icon={CalendarIcon}>
<div
Expand All @@ -235,8 +269,8 @@ export const EventDetails = ({
)}
{hasLocation && <EventLocation event={event} />}
</div>
<div className="mt-14">
<h2 className="text-2xl font-bold">Event Information</h2>
<div className="mt-10">
<h2 className="text-xl font-bold">Event Information</h2>
{event.description && (
<div className="mt-4 markdown">
{/* eslint-disable-next-line react/no-children-prop */}
Expand All @@ -250,7 +284,7 @@ export const EventDetails = ({
</section>
</div>

<section className="flex flex-col mb-8">
<section className="flex flex-col">
{isOrganizer && (
<div className="grid gap-6 mt-12">
<span className="text-2xl font-bold text-brand-dark">
Expand Down Expand Up @@ -322,7 +356,7 @@ export const EventDetails = ({
</div>
</Disclosure>

<Card className="grid grid-cols-1 gap-2 md:items-center md:grid-cols-3">
{/* <Card className="grid grid-cols-1 gap-2 md:items-center md:grid-cols-3">
<div className="md:col-span-2">
<Card.Label
title="Manage Attendees"
Expand Down Expand Up @@ -355,7 +389,7 @@ export const EventDetails = ({
}
)}
</div>
</Card>
</Card> */}

<Disclosure
label="Verifiers"
Expand Down
14 changes: 14 additions & 0 deletions unlock-app/src/components/content/event/Settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { PaywallConfigType } from '@unlock-protocol/core'

interface SettingsProps {
event: Event
checkoutConfig: {
id?: string
config: PaywallConfigType
}
}

export const Settings = ({ checkoutConfig, event }: SettingsProps) => {
console.log(checkoutConfig, event)
return <p>Coming soon</p>
}
131 changes: 63 additions & 68 deletions unlock-app/src/components/interface/layouts/AppLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -217,84 +217,79 @@ export const AppLayout = ({
<Button onClick={saveTermsAccepted}>I agree</Button>
</div>
</Modal>
<div className="w-full">
<Container>
{showHeader && (
<div className="px-4 mx-auto lg:container">
<HeaderNav
{...MENU}
actions={[
{
content: account ? (
<div className="flex gap-2">
<button
onClick={(event) => {
event.preventDefault()
openConnectModal()
}}
>
<div className="flex items-center gap-2">
<span className="text-brand-ui-primary text-right">
{userEns === account
? email
? email
: addressMinify(userEns)
: userEns}
</span>
<DisconnectIcon
className="text-brand-ui-primary"
size={20}
/>
</div>
</button>
</div>
) : (
<Button
<HeaderNav
{...MENU}
actions={[
{
content: account ? (
<div className="flex gap-2">
<button
onClick={(event) => {
event.preventDefault()
openConnectModal()
}}
>
Connect
</Button>
),
},
]}
/>
</div>
)}
<div className="min-w-full min-h-screen">
<div className="pt-8">
<Container>
<div className="flex flex-col gap-10">
{(title || description) && (
<div className="flex flex-col gap-4">
{title && typeof title === 'string' ? (
<h1 className="text-4xl font-bold">{title}</h1>
) : (
title
)}
{description && (
<div className="w-full text-base text-gray-700">
{description}
<div className="flex items-center gap-2">
<span className="text-brand-ui-primary text-right">
{userEns === account
? email
? email
: addressMinify(userEns)
: userEns}
</span>
<DisconnectIcon
className="text-brand-ui-primary"
size={20}
/>
</div>
)}
</div>
)}
{showLogin ? (
<div className="flex justify-center">
<WalletNotConnected />
</button>
</div>
) : (
<div>{children}</div>
)}
</div>
</Container>
</div>
</div>
<div className="px-4 mx-auto lg:container">
{showFooter && <Footer {...FOOTER} />}
<Button
onClick={(event) => {
event.preventDefault()
openConnectModal()
}}
>
Connect
</Button>
),
},
]}
/>
)}
<div
className={`flex flex-col gap-10 min-h-screen ${
showHeader ? '' : 'mt-8'
}`}
>
{(title || description) && (
<div className="flex flex-col gap-4">
{title && typeof title === 'string' ? (
<h1 className="text-3xl font-bold">{title}</h1>
) : (
title
)}
{description && (
<div className="w-full text-base text-gray-700">
{description}
</div>
)}
</div>
)}
{showLogin ? (
<div className="flex justify-center">
<WalletNotConnected />
</div>
) : (
<div>{children}</div>
)}
</div>
</div>

{showFooter && <Footer {...FOOTER} />}
</Container>
</div>
)
}
Loading

0 comments on commit 5add818

Please sign in to comment.