import React, {useLayoutEffect, useRef, useState} from 'react' import type {ListRenderItemInfo, TextInput as RNTextInput} from 'react-native' import {View} from 'react-native' import {AppBskyActorDefs} from '@atproto/api' import {BottomSheetFlatListMethods} from '@discord/bottom-sheet' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {isWeb} from '#/platform/detection' import {useActorAutocompleteQuery} from 'state/queries/actor-autocomplete' import {useProfileFollowsQuery} from 'state/queries/profile-follows' import {useSession} from 'state/session' import {WizardAction, WizardState} from '#/screens/StarterPack/Wizard/State' import {WizardProfileCard} from '#/screens/StarterPack/Wizard/StepProfiles/WizardProfileCard' import {atoms as a, native, useTheme, web} from '#/alf' import * as Dialog from '#/components/Dialog' import {TextInput} from '#/components/dms/dialogs/TextInput' import {useInteractionState} from '#/components/hooks/useInteractionState' import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2' import {Text} from '#/components/Typography' function keyExtractor(item: AppBskyActorDefs.ProfileViewBasic) { return item.did } export function WizardAddProfilesDialog({ control, state, dispatch, }: { control: Dialog.DialogControlProps state: WizardState dispatch: (action: WizardAction) => void }) { const [searchText, setSearchText] = useState('') const {currentAccount} = useSession() const {data: results} = useActorAutocompleteQuery(searchText, true, 12) const {data: followsPages, fetchNextPage} = useProfileFollowsQuery( currentAccount?.did, ) const follows = followsPages?.pages.flatMap(page => page.follows) || [] const listRef = useRef(null) const inputRef = useRef(null) useLayoutEffect(() => { if (isWeb) { setImmediate(() => { inputRef?.current?.focus() }) } }, []) const renderItem = ({ item, }: ListRenderItemInfo) => { return ( ) } return ( 0 ? results : follows} renderItem={renderItem} keyExtractor={keyExtractor} ListHeaderComponent={ } stickyHeaderIndices={[0]} style={[ web([a.py_0, {height: '100vh', maxHeight: 600}, a.px_0]), native({ height: '100%', paddingHorizontal: 0, marginTop: 0, paddingTop: 0, borderTopLeftRadius: 40, borderTopRightRadius: 40, }), ]} webInnerStyle={[a.py_0, {maxWidth: 500, minWidth: 200}]} keyboardDismissMode="on-drag" onEndReached={() => fetchNextPage()} onEndReachedThreshold={2} removeClippedSubviews={true} /> ) } function ListHeader({ searchText, setSearchText, inputRef, }: { searchText: string setSearchText: (text: string) => void inputRef: React.Ref }) { const t = useTheme() const {_} = useLingui() const { state: hovered, onIn: onMouseEnter, onOut: onMouseLeave, } = useInteractionState() const {state: focused, onIn: onFocus, onOut: onBlur} = useInteractionState() const interacted = hovered || focused return ( Select profiles to add ) }