mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import {Pressable, View} from 'react-native'
3import {ScrollView} from 'react-native-gesture-handler'
4import {msg, Trans} from '@lingui/macro'
5import {useLingui} from '@lingui/react'
6
7import {ReportOption} from '#/lib/moderation/useReportOptions'
8import {useMyLabelersQuery} from '#/state/queries/preferences'
9export {useDialogControl as useReportDialogControl} from '#/components/Dialog'
10
11import {AppBskyLabelerDefs} from '@atproto/api'
12
13import {atoms as a} from '#/alf'
14import * as Dialog from '#/components/Dialog'
15import {useDelayedLoading} from '#/components/hooks/useDelayedLoading'
16import {Loader} from '#/components/Loader'
17import {Text} from '#/components/Typography'
18import {SelectLabelerView} from './SelectLabelerView'
19import {SelectReportOptionView} from './SelectReportOptionView'
20import {SubmitView} from './SubmitView'
21import {ReportDialogProps} from './types'
22
23export function ReportDialog(props: ReportDialogProps) {
24 return (
25 <Dialog.Outer control={props.control}>
26 <Dialog.Handle />
27 <ReportDialogInner {...props} />
28 </Dialog.Outer>
29 )
30}
31
32function ReportDialogInner(props: ReportDialogProps) {
33 const {_} = useLingui()
34 const {
35 isLoading: isLabelerLoading,
36 data: labelers,
37 error,
38 } = useMyLabelersQuery({excludeNonConfigurableLabelers: true})
39 const isLoading = useDelayedLoading(500, isLabelerLoading)
40
41 const ref = React.useRef<ScrollView>(null)
42
43 return (
44 <Dialog.ScrollableInner label={_(msg`Report dialog`)} ref={ref}>
45 {isLoading ? (
46 <View style={[a.align_center, {height: 100}]}>
47 <Loader size="xl" />
48 {/* Here to capture focus for a hot sec to prevent flash */}
49 <Pressable accessible={false} />
50 </View>
51 ) : error || !labelers ? (
52 <View>
53 <Text style={[a.text_md]}>
54 <Trans>Something went wrong, please try again.</Trans>
55 </Text>
56 </View>
57 ) : (
58 <ReportDialogLoaded labelers={labelers} {...props} />
59 )}
60 </Dialog.ScrollableInner>
61 )
62}
63
64function ReportDialogLoaded(
65 props: ReportDialogProps & {
66 labelers: AppBskyLabelerDefs.LabelerViewDetailed[]
67 },
68) {
69 const [selectedLabeler, setSelectedLabeler] = React.useState<
70 string | undefined
71 >(props.labelers.length === 1 ? props.labelers[0].creator.did : undefined)
72 const [selectedReportOption, setSelectedReportOption] = React.useState<
73 ReportOption | undefined
74 >()
75
76 if (selectedReportOption && selectedLabeler) {
77 return (
78 <SubmitView
79 {...props}
80 selectedLabeler={selectedLabeler}
81 selectedReportOption={selectedReportOption}
82 goBack={() => setSelectedReportOption(undefined)}
83 onSubmitComplete={() => props.control.close()}
84 />
85 )
86 }
87 if (selectedLabeler) {
88 return (
89 <SelectReportOptionView
90 {...props}
91 goBack={() => setSelectedLabeler(undefined)}
92 onSelectReportOption={setSelectedReportOption}
93 />
94 )
95 }
96 return <SelectLabelerView {...props} onSelectLabeler={setSelectedLabeler} />
97}