import { CalendarDays, Check, MapPin, Plus, UsersRound, X } from 'lucide-react' import { type FormEvent, useEffect, useMemo, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { api, ApiError } from './api' import type { Invitation, ParticipantMeeting, ScheduledInterview, User } from './types' function message(error: unknown) { return error instanceof ApiError || error instanceof Error ? error.message : 'Something went wrong' } function ErrorAlert({ error }: { error: string }) { return (
Request failed {error}
) } function Loading() { return (

Loading…

) } function DateAndPlace({ interview }: { interview: ScheduledInterview | ParticipantMeeting }) { return (
{new Date(interview.startsAt).toLocaleString()} {interview.location}
) } export function UsersPage() { const [users, setUsers] = useState([]) const [error, setError] = useState('') const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) useEffect(() => { void api.users .list() .then(setUsers) .catch((value) => setError(message(value))) .finally(() => setLoading(false)) }, []) async function create(event: FormEvent) { event.preventDefault() setSaving(true) setError('') const form = event.currentTarget const values = new FormData(form) try { const created = await api.users.create({ email: String(values.get('email')), password: String(values.get('password')), displayName: String(values.get('displayName')), }) setUsers((current) => [...current, created]) form.reset() } catch (value) { setError(message(value)) } finally { setSaving(false) } } return ( <>
Team access

Users

Create co-interviewers and manage the people who collaborate on interviews.

{error && }

Interview team

{users.length} workspace users

{loading ? ( ) : (
{users.map((user) => (
{user.displayName.slice(0, 2).toUpperCase()}
{user.displayName} {user.email}
{user.role}
))}
)}

Create co-interviewer

) } export function ScheduleInterviewForm({ jobId, invitation, onCreated, onCancel, }: { jobId: number invitation: Invitation onCreated: (interview: ScheduledInterview) => void onCancel: () => void }) { const [users, setUsers] = useState([]) const [selected, setSelected] = useState([]) const [error, setError] = useState('') const [saving, setSaving] = useState(false) useEffect(() => { void api.users .list() .then(setUsers) .catch((value) => setError(message(value))) }, []) async function submit(event: FormEvent) { event.preventDefault() const values = new FormData(event.currentTarget) setSaving(true) setError('') try { const startsAt = new Date(String(values.get('startsAt'))).toISOString() onCreated( await api.jobs.scheduleInterview(jobId, { invitationId: invitation.id, startsAt, location: String(values.get('location')), interviewerIds: selected, sharedDocument: String(values.get('sharedDocument')), }), ) } catch (value) { setError(message(value)) setSaving(false) } } return (
Passed assessment

Schedule interview with {invitation.participantName}

Co-interviewers {users.map((user) => ( ))}