Bluesky app fork with some witchin' additions 馃挮
at feat/tealfm 90 lines 2.2 kB view raw
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}