mirror of https://github.com/MaxLeiter/Drift
Change post visibility (#83)
* Change post visibility Closes #64 * Fix imports + right align controlspull/76/head^2
parent
5df56fbdae
commit
b9d26e16f7
@ -0,0 +1,111 @@
|
||||
import PasswordModal from "@components/new-post/password-modal"
|
||||
import { Button, ButtonGroup, Loading, useToasts } from "@geist-ui/core"
|
||||
import type { PostVisibility } from "@lib/types"
|
||||
import Cookies from "js-cookie"
|
||||
import { useCallback, useState } from "react"
|
||||
|
||||
type Props = {
|
||||
postId: string
|
||||
visibility: PostVisibility
|
||||
setVisibility: (visibility: PostVisibility) => void
|
||||
}
|
||||
|
||||
const VisibilityControl = ({ postId, visibility, setVisibility }: Props) => {
|
||||
const [isSubmitting, setSubmitting] = useState(false)
|
||||
const [passwordModalVisible, setPasswordModalVisible] = useState(false)
|
||||
const { setToast } = useToasts()
|
||||
|
||||
const sendRequest = useCallback(
|
||||
async (visibility: PostVisibility, password?: string) => {
|
||||
const res = await fetch(`/server-api/posts/${postId}`, {
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${Cookies.get("drift-token")}`
|
||||
},
|
||||
body: JSON.stringify({ visibility, password })
|
||||
})
|
||||
|
||||
if (res.ok) {
|
||||
const json = await res.json()
|
||||
setVisibility(json.visibility)
|
||||
} else {
|
||||
const json = await res.json()
|
||||
setToast({
|
||||
text: json.error.message,
|
||||
type: "error"
|
||||
})
|
||||
setPasswordModalVisible(false)
|
||||
}
|
||||
},
|
||||
[setToast]
|
||||
)
|
||||
|
||||
const onSubmit = useCallback(
|
||||
async (visibility: PostVisibility, password?: string) => {
|
||||
if (visibility === "protected" && !password) {
|
||||
setPasswordModalVisible(true)
|
||||
return
|
||||
}
|
||||
setPasswordModalVisible(false)
|
||||
const timeout = setTimeout(() => setSubmitting(true), 100)
|
||||
|
||||
await sendRequest(visibility, password)
|
||||
clearTimeout(timeout)
|
||||
setSubmitting(false)
|
||||
},
|
||||
[sendRequest]
|
||||
)
|
||||
|
||||
const onClosePasswordModal = () => {
|
||||
setPasswordModalVisible(false)
|
||||
setSubmitting(false)
|
||||
}
|
||||
|
||||
const submitPassword = useCallback(
|
||||
(password) => onSubmit("protected", password),
|
||||
[onSubmit]
|
||||
)
|
||||
|
||||
return (
|
||||
<>
|
||||
{isSubmitting ? (
|
||||
<Loading />
|
||||
) : (
|
||||
<ButtonGroup margin={0}>
|
||||
<Button
|
||||
disabled={visibility === "private"}
|
||||
onClick={() => onSubmit("private")}
|
||||
>
|
||||
Make private
|
||||
</Button>
|
||||
<Button
|
||||
disabled={visibility === "public"}
|
||||
onClick={() => onSubmit("public")}
|
||||
>
|
||||
Make Public
|
||||
</Button>
|
||||
<Button
|
||||
disabled={visibility === "unlisted"}
|
||||
onClick={() => onSubmit("unlisted")}
|
||||
>
|
||||
Unlist
|
||||
</Button>
|
||||
<Button onClick={() => onSubmit("protected")}>
|
||||
{visibility === "protected"
|
||||
? "Change Password"
|
||||
: "Protect with password"}
|
||||
</Button>
|
||||
</ButtonGroup>
|
||||
)}
|
||||
<PasswordModal
|
||||
creating={true}
|
||||
isOpen={passwordModalVisible}
|
||||
onClose={onClosePasswordModal}
|
||||
onSubmit={submitPassword}
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default VisibilityControl
|
||||
Loading…
Reference in New Issue