({
value,
onChange,
enabled,
}: Pick<UseFilterMenuOptions, "value" | "onChange" | "enabled">)
| 12 | export const DEFAULT_USER_FILTER_WIDTH = 175; |
| 13 | |
| 14 | export const useUserFilterMenu = ({ |
| 15 | value, |
| 16 | onChange, |
| 17 | enabled, |
| 18 | }: Pick<UseFilterMenuOptions, "value" | "onChange" | "enabled">) => { |
| 19 | const { user: me } = useAuthenticated(); |
| 20 | |
| 21 | const addMeAsFirstOption = (options: readonly SelectFilterOption[]) => { |
| 22 | const filtered = options.filter((o) => o.value !== me.username); |
| 23 | return [ |
| 24 | { |
| 25 | label: me.username, |
| 26 | value: me.username, |
| 27 | startIcon: ( |
| 28 | <Avatar fallback={me.username} src={me.avatar_url} size="sm" /> |
| 29 | ), |
| 30 | }, |
| 31 | ...filtered, |
| 32 | ]; |
| 33 | }; |
| 34 | |
| 35 | return useFilterMenu({ |
| 36 | onChange, |
| 37 | enabled, |
| 38 | value, |
| 39 | id: "owner", |
| 40 | getSelectedOption: async () => { |
| 41 | if (value === "me") { |
| 42 | return { |
| 43 | label: me.username, |
| 44 | value: me.username, |
| 45 | startIcon: ( |
| 46 | <Avatar fallback={me.username} src={me.avatar_url} size="sm" /> |
| 47 | ), |
| 48 | }; |
| 49 | } |
| 50 | |
| 51 | const usersRes = await API.getUsers({ q: value, limit: 1 }); |
| 52 | const firstUser = usersRes.users.at(0); |
| 53 | if (firstUser && firstUser.username === value) { |
| 54 | return { |
| 55 | label: firstUser.username, |
| 56 | value: firstUser.username, |
| 57 | startIcon: ( |
| 58 | <Avatar |
| 59 | fallback={firstUser.username} |
| 60 | src={firstUser.avatar_url} |
| 61 | size="sm" |
| 62 | /> |
| 63 | ), |
| 64 | }; |
| 65 | } |
| 66 | return null; |
| 67 | }, |
| 68 | getOptions: async (query) => { |
| 69 | const usersRes = await API.getUsers({ q: query, limit: 25 }); |
| 70 | let options = usersRes.users.map<SelectFilterOption>((user) => ({ |
| 71 | label: user.username, |
no test coverage detected