mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import {ModerationUI} from '@atproto/api'
3
4import {
5 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)
25
26export const useHider = () => React.useContext(Context)
27
28export function Outer({
29 modui,
30 isContentVisibleInitialState,
31 allowOverride,
32 children,
33}: React.PropsWithChildren<{
34 isContentVisibleInitialState?: boolean
35 allowOverride?: boolean
36 modui: ModerationUI | undefined
37}>) {
38 const control = useModerationDetailsDialogControl()
39 const blur = modui?.blurs[0]
40 const [isContentVisible, setIsContentVisible] = React.useState(
41 isContentVisibleInitialState || !blur,
42 )
43 const info = useModerationCauseDescription(blur)
44
45 const meta = {
46 isNoPwi: Boolean(
47 modui?.blurs.find(
48 cause =>
49 cause.type === 'label' &&
50 cause.labelDef.identifier === '!no-unauthenticated',
51 ),
52 ),
53 allowOverride: allowOverride ?? !modui?.noOverride,
54 }
55
56 const showInfoDialog = () => {
57 control.open()
58 }
59
60 const onSetContentVisible = (show: boolean) => {
61 if (!meta.allowOverride) return
62 setIsContentVisible(show)
63 }
64
65 const ctx = {
66 isContentVisible,
67 setIsContentVisible: onSetContentVisible,
68 showInfoDialog,
69 info,
70 meta,
71 }
72
73 return (
74 <Context.Provider value={ctx}>
75 {children}
76 <ModerationDetailsDialog control={control} modcause={blur} />
77 </Context.Provider>
78 )
79}
80
81export function Content({children}: {children: React.ReactNode}) {
82 const ctx = useHider()
83 return ctx.isContentVisible ? children : null
84}
85
86export function Mask({children}: {children: React.ReactNode}) {
87 const ctx = useHider()
88 return ctx.isContentVisible ? null : children
89}