Changeset View
Changeset View
Standalone View
Standalone View
native/community-creation/community-creation-members.react.js
// @flow | // @flow | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { ActivityIndicator } from 'react-native'; | import { ActivityIndicator } from 'react-native'; | ||||
import { | import { | ||||
changeThreadSettings, | changeThreadSettings, | ||||
changeThreadSettingsActionTypes, | changeThreadSettingsActionTypes, | ||||
} from 'lib/actions/thread-actions.js'; | } from 'lib/actions/thread-actions.js'; | ||||
import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js'; | import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js'; | ||||
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js'; | |||||
import { | import { | ||||
userInfoSelectorForPotentialMembers, | userInfoSelectorForPotentialMembers, | ||||
userSearchIndexForPotentialMembers, | userSearchIndexForPotentialMembers, | ||||
} from 'lib/selectors/user-selectors.js'; | } from 'lib/selectors/user-selectors.js'; | ||||
import { getPotentialMemberItems } from 'lib/shared/search-utils.js'; | import { getPotentialMemberItems } from 'lib/shared/search-utils.js'; | ||||
import type { LoadingStatus } from 'lib/types/loading-types.js'; | import type { LoadingStatus } from 'lib/types/loading-types.js'; | ||||
import { threadTypes } from 'lib/types/thread-types-enum.js'; | import { threadTypes } from 'lib/types/thread-types-enum.js'; | ||||
import type { AccountUserInfo } from 'lib/types/user-types.js'; | import type { AccountUserInfo } from 'lib/types/user-types.js'; | ||||
import { | import { | ||||
useDispatchActionPromise, | useDispatchActionPromise, | ||||
useServerCall, | useServerCall, | ||||
} from 'lib/utils/action-utils.js'; | } from 'lib/utils/action-utils.js'; | ||||
import CommunityCreationContentContainer from './community-creation-content-container.react.js'; | import CommunityCreationContentContainer from './community-creation-content-container.react.js'; | ||||
import CommunityCreationKeyserverLabel from './community-creation-keyserver-label.react.js'; | import CommunityCreationKeyserverLabel from './community-creation-keyserver-label.react.js'; | ||||
import type { CommunityCreationNavigationProp } from './community-creation-navigator.react.js'; | import type { CommunityCreationNavigationProp } from './community-creation-navigator.react.js'; | ||||
import RegistrationContainer from '../account/registration/registration-container.react.js'; | import RegistrationContainer from '../account/registration/registration-container.react.js'; | ||||
import { useNavigateToThread } from '../chat/message-list-types.js'; | |||||
import LinkButton from '../components/link-button.react.js'; | import LinkButton from '../components/link-button.react.js'; | ||||
import { createTagInput } from '../components/tag-input.react.js'; | import { createTagInput } from '../components/tag-input.react.js'; | ||||
import UserList from '../components/user-list.react.js'; | import UserList from '../components/user-list.react.js'; | ||||
import type { NavigationRoute } from '../navigation/route-names.js'; | import type { NavigationRoute } from '../navigation/route-names.js'; | ||||
import { ChatThreadListRouteName } from '../navigation/route-names.js'; | |||||
import { useSelector } from '../redux/redux-utils.js'; | import { useSelector } from '../redux/redux-utils.js'; | ||||
export type CommunityCreationMembersScreenParams = { | export type CommunityCreationMembersScreenParams = { | ||||
+announcement: boolean, | +announcement: boolean, | ||||
+threadID: string, | +threadID: string, | ||||
}; | }; | ||||
const TagInput = createTagInput<AccountUserInfo>(); | const TagInput = createTagInput<AccountUserInfo>(); | ||||
Show All 33 Lines | const [selectedUsers, setSelectedUsers] = React.useState< | ||||
$ReadOnlyArray<AccountUserInfo>, | $ReadOnlyArray<AccountUserInfo>, | ||||
>([]); | >([]); | ||||
const selectedUserIDs = React.useMemo( | const selectedUserIDs = React.useMemo( | ||||
() => selectedUsers.map(userInfo => userInfo.id), | () => selectedUsers.map(userInfo => userInfo.id), | ||||
[selectedUsers], | [selectedUsers], | ||||
); | ); | ||||
const navigateToThread = useNavigateToThread(); | |||||
const threadInfos = useSelector(threadInfoSelector); | |||||
const communityThreadInfo = threadInfos[threadID]; | |||||
const addSelectedUsersToCommunity = React.useCallback(() => { | const addSelectedUsersToCommunity = React.useCallback(() => { | ||||
dispatchActionPromise( | dispatchActionPromise( | ||||
changeThreadSettingsActionTypes, | changeThreadSettingsActionTypes, | ||||
(async () => { | (async () => { | ||||
const result = await callChangeThreadSettings({ | const result = await callChangeThreadSettings({ | ||||
threadID, | threadID, | ||||
changes: { newMemberIDs: selectedUserIDs }, | changes: { newMemberIDs: selectedUserIDs }, | ||||
}); | }); | ||||
navigation.navigate(ChatThreadListRouteName); | navigateToThread({ threadInfo: communityThreadInfo }); | ||||
return result; | return result; | ||||
})(), | })(), | ||||
); | ); | ||||
}, [ | }, [ | ||||
callChangeThreadSettings, | callChangeThreadSettings, | ||||
communityThreadInfo, | |||||
dispatchActionPromise, | dispatchActionPromise, | ||||
navigation, | navigateToThread, | ||||
selectedUserIDs, | selectedUserIDs, | ||||
threadID, | threadID, | ||||
]); | ]); | ||||
const exitCommunityCreationFlow = React.useCallback(() => { | const exitCommunityCreationFlow = React.useCallback(() => { | ||||
navigation.navigate(ChatThreadListRouteName); | navigateToThread({ threadInfo: communityThreadInfo }); | ||||
}, [navigation]); | }, [communityThreadInfo, navigateToThread]); | ||||
const activityIndicatorStyle = React.useMemo( | const activityIndicatorStyle = React.useMemo( | ||||
() => ({ paddingRight: 20 }), | () => ({ paddingRight: 20 }), | ||||
[], | [], | ||||
); | ); | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
setOptions({ | setOptions({ | ||||
▲ Show 20 Lines • Show All 86 Lines • Show Last 20 Lines |