import React, { FunctionComponent, useState } from 'react'; import { Text, View, FlatList, TouchableOpacity, Switch } from 'react-native'; import { ListUsersDocument, useDeleteUserMutation, useListUsersQuery, User, useSendPasswordResetLinkMutation, useUpdateUserMutation} from '../../../generated/graphql'; import { useAuth } from '../../../hooks/auth-context'; import { useTheme } from '../../../hooks/theme-context'; import { DialogueService } from '../../../utils/AlertService'; import { FormattedDateComponent} from '../../FormattedDate/FormattedDate'; import {DividerComponent} from '../../shared/DividerComponent'; import {NblocksButton} from '../../shared/NblocksButton'; import {SafeFullNameComponent} from '../SafeFullNameComponent/SafeFullNameComponent'; import {AddUserModalComponent} from './AddUserModalComponent'; import {EditUserModalComponent} from './EditUserModalComponent'; const UserListComponent:FunctionComponent = () => { const { data, loading, error, refetch } = useListUsersQuery(); const [editUser, setEditUser ] = useState(); const [addUserModalVisible, setAddUserModalVisible ] = useState(false); const [deleteUserMutation,{ data: deleteData, loading: deleteLoading, error: deleteError}] = useDeleteUserMutation({refetchQueries: [{query: ListUsersDocument}]}); const showEditUserModal = (user?: User) => { setEditUser(user); } const didCloseEditUserModal = () => { setEditUser(undefined); } const showAddUserModal = () => { setAddUserModalVisible(true); } const didCloseAddUserModal = () => { setAddUserModalVisible(false); } const ensureDeleteUser = (user: User) => { DialogueService.showConfirmation("Delete user", "Are you sure you want to delete this user?", "Delete", () => deleteUser(user)); } const deleteUser = (user: User) => { deleteUserMutation({variables: {userId: user!.id}}); } const renderUserItem = (user: User) => { return ( showEditUserModal(user)} onDeleteUserClick={(user) => ensureDeleteUser(user)}> ) } return ( refetch({})} data={data?.listUsers} keyExtractor={(item) => item.id} renderItem={({item}) => renderUserItem(item) } ItemSeparatorComponent={() => } > showAddUserModal()}> didCloseEditUserModal()} /> didCloseAddUserModal()} /> ); } const UserItemComponent:FunctionComponent<{user:User, onEditUserClick: (user: User) => void, onDeleteUserClick: (user: User) => void}> = ({user, onEditUserClick, onDeleteUserClick}) => { const {styles} = useTheme(); const {currentUser} = useAuth(); const [expanded, setExpanded] = useState(false); const [sendPasswordResetLinkMutation, { data: sendPasswordResetLinkData, loading: sendPasswordResetLinkLoading, error: sendPasswordResetLinkError }] = useSendPasswordResetLinkMutation(); const [updateUserMutation, { data: updateData, loading: updateLoading, error: updateError }] = useUpdateUserMutation(); const ensureSendPasswordResetLink = () => { DialogueService.showConfirmation("Resend invite", "Are you sure you want to resend an invitation link?", "Invite", () => sendPasswordResetLink()); } const sendPasswordResetLink = () => { sendPasswordResetLinkMutation({variables: {userId: user.id}}); } const updateUser = (enabled: boolean) => { updateUserMutation({variables: {user: {id: user!.id, enabled: enabled}}}); } const toggleExpand=()=>{ //LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); setExpanded(!expanded); } const renderExpanedContent = (user: User) => { return ( Email: {user.username} Added: Active: updateUser(newVal)}> ensureSendPasswordResetLink()}> onEditUserClick(user)}> onDeleteUserClick(user)}> ) } return ( toggleExpand()}> {user.role} {expanded ? "▼" : "◀︎"} { expanded && renderExpanedContent(user) } ) } export {UserListComponent};