import React, { useEffect, useState } from 'react'; import * as QueryString from 'query-string'; import { useLocation } from 'react-router'; import { UserOutlined } from '@ant-design/icons'; import { Button, message, Modal, Select, Tooltip, Typography } from 'antd'; import styled from 'styled-components/macro'; import { PageRoutes } from '../../../conf/Global'; import { useGetInviteTokenQuery, useListRolesQuery } from '../../../graphql/role.generated'; import { DataHubRole } from '../../../types.generated'; import { mapRoleIcon } from './UserUtils'; import { useCreateInviteTokenMutation } from '../../../graphql/mutations.generated'; import { ANTD_GRAY } from '../../entity/shared/constants'; import analytics, { EventType } from '../../analytics'; const ModalSection = styled.div` display: flex; flex-direction: column; padding-bottom: 12px; `; const ModalSectionFooter = styled(Typography.Paragraph)` &&&& { padding: 0px; margin: 0px; margin-bottom: 4px; } `; const InviteLinkDiv = styled.div` margin-top: -12px; display: flex; flex-direction: row; justify-content: flex-start; gap: 10px; align-items: center; `; const CopyText = styled(Typography.Text)` display: flex; gap: 10px; align-items: center; `; const CopyButton = styled(Button)` background-color: #1890ff; color: white; &:focus:not(:hover) { background-color: #1890ff; color: white; } `; const RefreshButton = styled(Button)` color: ${ANTD_GRAY[7]}; `; const RoleSelect = styled(Select)` min-width: 105px; `; const RoleIcon = styled.span` margin-right: 6px; font-size: 12px; `; type Props = { open: boolean; onClose: () => void; }; export default function ViewInviteTokenModal({ open, onClose }: Props) { const baseUrl = window.location.origin; const location = useLocation(); const params = QueryString.parse(location.search, { arrayFormat: 'comma' }); const paramsQuery = (params?.query as string) || undefined; const [query, setQuery] = useState(undefined); useEffect(() => setQuery(paramsQuery), [paramsQuery]); const [selectedRole, setSelectedRole] = useState(); // Code related to listing role options and selecting a role const noRoleText = 'No Role'; const { data: rolesData } = useListRolesQuery({ fetchPolicy: 'cache-first', variables: { input: { start: 0, count: 10, query, }, }, }); const selectRoleOptions = rolesData?.listRoles?.roles?.map((role) => role as DataHubRole) || []; const rolesMap: Map = new Map(); selectRoleOptions.forEach((role) => { rolesMap.set(role.urn, role); }); const roleSelectOptions = () => selectRoleOptions.map((role) => { return ( {mapRoleIcon(role.name)} {role.name} ); }); // Code related to getting or creating an invite token const { data: getInviteTokenData } = useGetInviteTokenQuery({ skip: !open, variables: { input: { roleUrn: selectedRole?.urn } }, }); const [inviteToken, setInviteToken] = useState(getInviteTokenData?.getInviteToken?.inviteToken || ''); const [createInviteTokenMutation] = useCreateInviteTokenMutation(); useEffect(() => { if (getInviteTokenData?.getInviteToken?.inviteToken) { setInviteToken(getInviteTokenData.getInviteToken.inviteToken); } }, [getInviteTokenData]); const onSelectRole = (roleUrn: string) => { const roleFromMap: DataHubRole = rolesMap.get(roleUrn) as DataHubRole; setSelectedRole(roleFromMap); }; const createInviteToken = (roleUrn?: string) => { createInviteTokenMutation({ variables: { input: { roleUrn, }, }, }) .then(({ data, errors }) => { if (!errors) { analytics.event({ type: EventType.CreateInviteLinkEvent, roleUrn, }); setInviteToken(data?.createInviteToken?.inviteToken || ''); message.success('Generated new invite link'); } }) .catch((e) => { message.destroy(); message.error({ content: `Failed to create Invite Token for role ${selectedRole?.name} : \n ${e.message || ''}`, duration: 3, }); }); }; const inviteLink = `${baseUrl}${PageRoutes.SIGN_UP}?invite_token=${inviteToken}`; return ( Share Invite Link } open={open} onCancel={onClose} > {noRoleText} } value={selectedRole?.urn || undefined} onChange={(e) => onSelectRole(e as string)} > {mapRoleIcon(noRoleText)} {noRoleText} {roleSelectOptions()}
{inviteLink}
{ navigator.clipboard.writeText(inviteLink); message.success('Copied invite link to clipboard'); }} > COPY { createInviteToken(selectedRole?.urn); }} > REFRESH
Copy an invite link to send to your users. When they join, users will be automatically assigned to the selected role.
); }