diff --git a/site/src/components/UserAutocomplete/AutocompleteAvatar.tsx b/site/src/components/UserAutocomplete/AutocompleteAvatar.tsx new file mode 100644 index 0000000000..42f26d2df7 --- /dev/null +++ b/site/src/components/UserAutocomplete/AutocompleteAvatar.tsx @@ -0,0 +1,32 @@ +import Avatar from "@material-ui/core/Avatar" +import { makeStyles } from "@material-ui/core/styles" +import { User } from "api/typesGenerated" +import { FC } from "react" +import { firstLetter } from "../../util/firstLetter" + +export const AutocompleteAvatar: FC<{ user: User }> = ({ user }) => { + const styles = useStyles() + + return ( +
+ {user.avatar_url ? ( + {`${user.username}'s + ) : ( + {firstLetter(user.username)} + )} +
+ ) +} + +export const useStyles = makeStyles((theme) => { + return { + avatarContainer: { + margin: "0px 10px", + }, + avatar: { + width: theme.spacing(4.5), + height: theme.spacing(4.5), + borderRadius: "100%", + }, + } +}) diff --git a/site/src/components/UserAutocomplete/UserAutocomplete.tsx b/site/src/components/UserAutocomplete/UserAutocomplete.tsx index dbfd473b40..113eab737a 100644 --- a/site/src/components/UserAutocomplete/UserAutocomplete.tsx +++ b/site/src/components/UserAutocomplete/UserAutocomplete.tsx @@ -1,13 +1,14 @@ import CircularProgress from "@material-ui/core/CircularProgress" -import { makeStyles } from "@material-ui/core/styles" +import { makeStyles, Theme } from "@material-ui/core/styles" import TextField from "@material-ui/core/TextField" import Autocomplete from "@material-ui/lab/Autocomplete" import { useMachine } from "@xstate/react" import { User } from "api/typesGenerated" import { AvatarData } from "components/AvatarData/AvatarData" import debounce from "just-debounce-it" -import { ChangeEvent, useEffect, useState } from "react" +import { ChangeEvent, FC, useEffect, useState } from "react" import { searchUserMachine } from "xServices/users/searchUserXService" +import { AutocompleteAvatar } from "./AutocompleteAvatar" export type UserAutocompleteProps = { value: User | null @@ -15,16 +16,18 @@ export type UserAutocompleteProps = { label?: string inputMargin?: "none" | "dense" | "normal" inputStyles?: string + showAvatar?: boolean } -export const UserAutocomplete: React.FC = ({ +export const UserAutocomplete: FC = ({ value, onChange, label, inputMargin, inputStyles, + showAvatar = false, }) => { - const styles = useStyles() + const styles = useStyles({ showAvatar }) const [isAutocompleteOpen, setIsAutocompleteOpen] = useState(false) const [searchState, sendSearch] = useMachine(searchUserMachine) const { searchResults } = searchState.context @@ -94,6 +97,9 @@ export const UserAutocomplete: React.FC = ({ InputProps={{ ...params.InputProps, onChange: handleFilterChange, + startAdornment: ( + <>{showAvatar && selectedValue && } + ), endAdornment: ( <> {searchState.matches("searching") ? : null} @@ -106,9 +112,14 @@ export const UserAutocomplete: React.FC = ({ /> ) } -export const useStyles = makeStyles((theme) => { + +interface styleProps { + showAvatar: boolean +} + +export const useStyles = makeStyles((theme) => { return { - autocomplete: { + autocomplete: (props) => ({ width: "100%", "& .MuiFormControl-root": { @@ -118,14 +129,14 @@ export const useStyles = makeStyles((theme) => { "& .MuiInputBase-root": { width: "100%", // Match button small height - height: 40, + height: props.showAvatar ? 60 : 40, }, "& input": { fontSize: 16, padding: `${theme.spacing(0, 0.5, 0, 0.5)} !important`, }, - }, + }), avatar: { width: theme.spacing(4.5), diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 1372f3517f..54b5e77b76 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -149,6 +149,7 @@ export const CreateWorkspacePageView: FC props.setOwner(user)} label={t("ownerLabel")} inputMargin="dense" + showAvatar /> )}