2021-04-22 22:14:32 +00:00
|
|
|
import Layout from '../components/layout'
|
2021-09-23 17:42:00 +00:00
|
|
|
import { gql, useMutation } from '@apollo/client'
|
2021-04-22 22:14:32 +00:00
|
|
|
import ApolloClient from '../api/client'
|
|
|
|
import UserHeader from '../components/user-header'
|
2021-07-08 00:15:27 +00:00
|
|
|
import Seo from '../components/seo'
|
2021-09-23 17:42:00 +00:00
|
|
|
import { Button } from 'react-bootstrap'
|
|
|
|
import styles from '../styles/user.module.css'
|
|
|
|
import { useState } from 'react'
|
|
|
|
import { DiscussionForm } from '../components/discussion-form'
|
|
|
|
import { useSession } from 'next-auth/client'
|
|
|
|
import { ITEM_FIELDS } from '../fragments/items'
|
|
|
|
import ItemFull from '../components/item-full'
|
2021-04-22 22:14:32 +00:00
|
|
|
|
2021-04-26 21:55:15 +00:00
|
|
|
export async function getServerSideProps ({ req, params }) {
|
|
|
|
const { error, data: { user } } = await (await ApolloClient(req)).query({
|
2021-04-22 22:14:32 +00:00
|
|
|
query:
|
2021-09-23 17:42:00 +00:00
|
|
|
gql`
|
|
|
|
${ITEM_FIELDS}
|
|
|
|
{
|
2021-04-22 22:14:32 +00:00
|
|
|
user(name: "${params.username}") {
|
|
|
|
id
|
|
|
|
createdAt
|
|
|
|
name
|
|
|
|
nitems
|
|
|
|
ncomments
|
|
|
|
stacked
|
|
|
|
sats
|
2021-09-23 17:42:00 +00:00
|
|
|
bio {
|
|
|
|
...ItemFields
|
|
|
|
}
|
2021-04-22 22:14:32 +00:00
|
|
|
}
|
|
|
|
}`
|
|
|
|
})
|
|
|
|
|
|
|
|
if (!user || error) {
|
|
|
|
return {
|
|
|
|
notFound: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
user
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-23 17:42:00 +00:00
|
|
|
function BioForm () {
|
|
|
|
const [createBio] = useMutation(
|
|
|
|
gql`
|
|
|
|
mutation createBio($title: String!, $text: String) {
|
|
|
|
createBio(title: $title, text: $text) {
|
|
|
|
id
|
|
|
|
}
|
|
|
|
}`, {
|
|
|
|
update (cache, { data: { createBio } }) {
|
|
|
|
cache.modify({
|
|
|
|
id: `User:${createBio.userId}`,
|
|
|
|
fields: {
|
|
|
|
bio () {
|
|
|
|
return createBio
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className={styles.createFormContainer}>
|
|
|
|
<DiscussionForm
|
|
|
|
titleLabel='one line bio' textLabel='full bio' buttonText='create'
|
|
|
|
handleSubmit={async values => {
|
|
|
|
const { error } = await createBio({ variables: values })
|
|
|
|
if (error) {
|
|
|
|
throw new Error({ message: error.toString() })
|
|
|
|
}
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2021-04-22 22:14:32 +00:00
|
|
|
export default function User ({ user }) {
|
2021-09-23 17:42:00 +00:00
|
|
|
const [create, setCreate] = useState(false)
|
|
|
|
const [session] = useSession()
|
|
|
|
|
2021-04-22 22:14:32 +00:00
|
|
|
return (
|
2021-09-23 17:42:00 +00:00
|
|
|
<Layout noSeo containClassName={styles.contain}>
|
2021-07-08 00:15:27 +00:00
|
|
|
<Seo user={user} />
|
2021-04-22 22:14:32 +00:00
|
|
|
<UserHeader user={user} />
|
2021-09-23 17:42:00 +00:00
|
|
|
{user.bio
|
|
|
|
? <ItemFull item={user.bio} minimal />
|
|
|
|
: (
|
|
|
|
<div className={styles.create}>
|
|
|
|
{create
|
|
|
|
? <BioForm />
|
|
|
|
: (
|
|
|
|
session?.user?.name === user.name &&
|
|
|
|
<Button onClick={setCreate} size='md' variant='secondary'>create bio</Button>
|
|
|
|
)}
|
|
|
|
</div>)}
|
2021-04-22 22:14:32 +00:00
|
|
|
</Layout>
|
|
|
|
)
|
2021-04-14 23:56:29 +00:00
|
|
|
}
|