import React, { useCallback, useMemo } from 'react' import { Avatar, Button, ButtonVariation, Container, Layout, Page, StringSubstitute, TableV2, Text, useToaster } from '@harnessio/uicore' import { Color, FontVariation } from '@harnessio/design-system' import type { CellProps, Column } from 'react-table' import { Render } from 'react-jsx-match' import { useConfirmAct } from 'hooks/useConfirmAction' import { usePageIndex } from 'hooks/usePageIndex' import { useStrings } from 'framework/strings' import { TypesUser, useAdminDeleteUser, useAdminListUsers, useUpdateUserAdmin } from 'services/code' import { getErrorMessage } from 'utils/Utils' import { ResourceListingPagination } from 'components/ResourceListingPagination/ResourceListingPagination' import { OptionsMenuButton } from 'components/OptionsMenuButton/OptionsMenuButton' import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner' import useAddUserModal from 'components/UserManagementFlows/AddUserModal' import useResetPasswordModal from 'components/UserManagementFlows/ResetPassword' import css from './UsersListing.module.scss' const UsersListing = () => { const { getString } = useStrings() const { showSuccess, showError } = useToaster() const [page, setPage] = usePageIndex() const { data, response, refetch, loading } = useAdminListUsers({ queryParams: { page } }) const { mutate: deleteUser } = useAdminDeleteUser({}) const { openModal } = useAddUserModal({ onClose: refetch }) const { openModal: openResetPasswordModal } = useResetPasswordModal() const onConfirmAct = useConfirmAct() const handleDeleteUser = useCallback( async (userId: string, displayName?: string) => await onConfirmAct({ action: async () => { try { await deleteUser(userId) showSuccess(getString('newUserModal.userDeleted', { name: displayName })) refetch() } catch (error) { showError(getErrorMessage(error)) } }, message: ( }} /> ), intent: 'danger', title: getString('userManagement.deleteUser') }), [deleteUser, getString, onConfirmAct, refetch, showError, showSuccess] ) const columns: Column[] = useMemo( () => [ { Header: getString('displayName'), width: '30%', Cell: ({ row }: CellProps) => { return ( {row.original.display_name} {getString('admin')} ) } }, { Header: getString('userId'), width: '30%', Cell: ({ row }: CellProps) => ( {row.original.uid} ) }, { Header: getString('email'), width: '35%', Cell: ({ row }: CellProps) => { return ( {row.original.email} ) } }, { accessor: 'uid', Header: '', width: '5%', Cell: ({ row }: CellProps) => { const { mutate: updateAdmin } = useUpdateUserAdmin({ user_uid: row.original.uid || '' }) const handleUpdateAdmin = async () => await onConfirmAct({ action: async () => { try { await updateAdmin({ admin: !row.original.admin }) showSuccess(getString('userUpdateSuccess')) refetch() } catch (error) { showError(getErrorMessage(error)) } }, message: ( }} /> ), intent: 'primary', title: getString(row.original.admin ? 'removeAdmin' : 'setAsAdmin') }) return ( handleUpdateAdmin() }, { text: getString('userManagement.resetPassword'), onClick: () => openResetPasswordModal({ userInfo: row.original }) }, { text: getString('editUser'), onClick: () => openModal({ isEditing: true, userInfo: row.original }) }, { text: getString('deleteUser'), onClick: () => handleDeleteUser(row.original.uid as string, row.original.display_name) } ]} /> ) } } ], [getString, handleDeleteUser, onConfirmAct, openModal, openResetPasswordModal, refetch, showError, showSuccess] ) return (