forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import React from 'react'
2import {type ModerationUI} from '@atproto/api'
3
4import {
5 type ModerationCauseDescription,
6 useModerationCauseDescription,
7} from '#/lib/moderation/useModerationCauseDescription'
8import {
9 ModerationDetailsDialog,
10 useModerationDetailsDialogControl,
11} from '#/components/moderation/ModerationDetailsDialog'
12
13type Context = {
14 isContentVisible: boolean
15 setIsContentVisible: (show: boolean) => void
16 info: ModerationCauseDescription
17 showInfoDialog: () => void
18 meta: {
19 isNoPwi: boolean
20 allowOverride: boolean
21 }
22}
23
24const Context = React.createContext<Context>({} as Context)
25Context.displayName = 'HiderContext'
26
27export const useHider = () => React.useContext(Context)
28
29export function Outer({
30 modui,
31 isContentVisibleInitialState,
32 allowOverride,
33 children,
34}: React.PropsWithChildren<{
35 isContentVisibleInitialState?: boolean
36 allowOverride?: boolean
37 modui: ModerationUI | undefined
38}>) {
39 const control = useModerationDetailsDialogControl()
40 const blur = modui?.blurs[0]
41 const [isContentVisible, setIsContentVisible] = React.useState(
42 isContentVisibleInitialState || !blur,
43 )
44 const info = useModerationCauseDescription(blur)
45
46 const meta = {
47 isNoPwi: Boolean(
48 modui?.blurs.find(
49 cause =>
50 cause.type === 'label' &&
51 cause.labelDef.identifier === '!no-unauthenticated',
52 ),
53 ),
54 allowOverride: allowOverride ?? !modui?.noOverride,
55 }
56
57 const showInfoDialog = () => {
58 control.open()
59 }
60
61 const onSetContentVisible = (show: boolean) => {
62 if (!meta.allowOverride) return
63 setIsContentVisible(show)
64 }
65
66 const ctx = {
67 isContentVisible,
68 setIsContentVisible: onSetContentVisible,
69 showInfoDialog,
70 info,
71 meta,
72 }
73
74 return (
75 <Context.Provider value={ctx}>
76 {children}
77 <ModerationDetailsDialog control={control} modcause={blur} />
78 </Context.Provider>
79 )
80}
81
82export function Content({children}: {children: React.ReactNode}) {
83 const ctx = useHider()
84 return ctx.isContentVisible ? children : null
85}
86
87export function Mask({children}: {children: React.ReactNode}) {
88 const ctx = useHider()
89 return ctx.isContentVisible ? null : children
90}