// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import { Autocomplete } from '~/components/autocomplete/autocomplete'; import { UserResource } from '~/models/user'; import { connect, DispatchProp } from 'react-redux'; import { ServiceRepository } from '~/services/services'; import { FilterBuilder } from '../../services/api/filter-builder'; import { debounce } from 'debounce'; import { ListItemText, Typography } from '@material-ui/core'; import { noop } from 'lodash/fp'; export interface Person { name: string; email: string; uuid: string; } export interface PeopleSelectProps { items: Person[]; label?: string; autofocus?: boolean; onBlur?: (event: React.FocusEvent) => void; onFocus?: (event: React.FocusEvent) => void; onCreate?: (person: Person) => void; onDelete?: (index: number) => void; onSelect?: (person: Person) => void; } export interface PeopleSelectState { value: string; suggestions: UserResource[]; } export const PeopleSelect = connect()( class PeopleSelect extends React.Component { state: PeopleSelectState = { value: '', suggestions: [] }; render() { const { label = 'Invite people' } = this.props; return ( ); } renderChipValue({ name, uuid }: Person) { return name ? name : uuid; } renderSuggestion({ firstName, lastName, email }: UserResource) { return ( {`${firstName} ${lastName} <<${email}>>`} ); } handleDelete = (_: Person, index: number) => { const { onDelete = noop } = this.props; onDelete(index); } handleCreate = () => { const { onCreate } = this.props; if (onCreate) { this.setState({ value: '', suggestions: [] }); onCreate({ email: '', name: '', uuid: this.state.value, }); } } handleSelect = ({ email, firstName, lastName, uuid }: UserResource) => { const { onSelect = noop } = this.props; this.setState({ value: '', suggestions: [] }); onSelect({ email, name: `${firstName} ${lastName}`, uuid, }); } handleChange = (event: React.ChangeEvent) => { this.setState({ value: event.target.value }, this.getSuggestions); } getSuggestions = debounce(() => this.props.dispatch(this.requestSuggestions), 500); requestSuggestions = async (_: void, __: void, { userService }: ServiceRepository) => { const { value } = this.state; const filters = new FilterBuilder() .addILike('email', value) .getFilters(); const { items } = await userService.list({ filters, limit: 5 }); this.setState({ suggestions: items }); } });