import React from 'react' import {StyleProp, View, ViewStyle} from 'react-native' import {AppBskyFeedPostgate} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import isEqual from 'lodash.isequal' import {useMyListsQuery} from '#/state/queries/my-lists' import { createPostgateRecord, embeddingRules, } from '#/state/queries/postgate/util' import {ThreadgateAllowUISetting} from '#/state/queries/threadgate' import {atoms as a, useTheme} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {Divider} from '#/components/Divider' import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' export type Props = { onSave: () => void isSaving: boolean postgate: AppBskyFeedPostgate.Record onChangePostgate: (v: AppBskyFeedPostgate.Record) => void threadgateAllowUISettings: ThreadgateAllowUISetting[] onChangeThreadgateAllowUISettings: (v: ThreadgateAllowUISetting[]) => void replySettingsDisabled?: boolean } export function PostInteractionSettingsDialog({ control, ...rest }: Props & { control: Dialog.DialogControlProps }) { const {_} = useLingui() return ( ) } export function PostInteractionSettingsDialogInner({ onSave, isSaving, postgate, onChangePostgate, threadgateAllowUISettings, onChangeThreadgateAllowUISettings, replySettingsDisabled, }: Props) { const t = useTheme() const {_} = useLingui() const control = Dialog.useDialogContext() const {data: lists} = useMyListsQuery('curate') const onPressAudience = (setting: ThreadgateAllowUISetting) => { // remove boolean values let newSelected: ThreadgateAllowUISetting[] = threadgateAllowUISettings.filter( v => v.type !== 'nobody' && v.type !== 'everybody', ) // toggle const i = newSelected.findIndex(v => isEqual(v, setting)) if (i === -1) { newSelected.push(setting) } else { newSelected.splice(i, 1) } onChangeThreadgateAllowUISettings(newSelected) } const onChangeEmbeddingRules = React.useCallback( (rules: AppBskyFeedPostgate.Record['quotepostRules']) => { onChangePostgate( createPostgateRecord({ ...postgate, quotepostRules: rules, }), ) }, [postgate, onChangePostgate], ) const noOneCanReply = !!threadgateAllowUISettings.find( v => v.type === 'nobody', ) return ( Post interaction settings Customize who can engage with this post. Quote settings Allow quote posts from: onChangeEmbeddingRules([])} style={{flex: 1}} /> v.$type === embeddingRules.disableRule.$type, ), )} onPress={() => onChangeEmbeddingRules([embeddingRules.disableRule]) } style={{flex: 1}} /> {replySettingsDisabled && ( Reply settings are chosen by the author of the thread )} Reply settings Allow replies from: v.type === 'everybody') } onPress={() => onChangeThreadgateAllowUISettings([{type: 'everybody'}]) } style={{flex: 1}} disabled={replySettingsDisabled} /> onChangeThreadgateAllowUISettings([{type: 'nobody'}]) } style={{flex: 1}} disabled={replySettingsDisabled} /> {!noOneCanReply && ( <> Or combine these options: v.type === 'mention', ) } onPress={() => onPressAudience({type: 'mention'})} disabled={replySettingsDisabled} /> v.type === 'following', ) } onPress={() => onPressAudience({type: 'following'})} disabled={replySettingsDisabled} /> {lists && lists.length > 0 ? lists.map(list => ( v.type === 'list' && v.list === list.uri, ) } onPress={() => onPressAudience({type: 'list', list: list.uri}) } disabled={replySettingsDisabled} /> )) : // No loading states to avoid jumps for the common case (no lists) null} )} ) } function Selectable({ label, isSelected, onPress, style, disabled, }: { label: string isSelected: boolean onPress: () => void style?: StyleProp disabled?: boolean }) { const t = useTheme() return ( ) }