diff --git a/frontend-react/src/components/common/UserSelector.tsx b/frontend-react/src/components/common/UserSelector.tsx index f051e5dd2..62928cc7b 100644 --- a/frontend-react/src/components/common/UserSelector.tsx +++ b/frontend-react/src/components/common/UserSelector.tsx @@ -1,18 +1,9 @@ import React from "react" import { useQuery } from "@apollo/react-hooks" -import { USERS } from "../../graphql/queries/users" +import { USERS, UsersData } from "../../graphql/queries/users" import Error from "./Error" import Select from "../elements/Select" -interface UsersData { - users: { - discord_id: string - discriminator: string - twitter_name?: string - username: string - }[] -} - interface UserSelectorProps { id?: string setValue?: (value: string) => void @@ -28,7 +19,7 @@ const UserSelector: React.FC = ({ setValue }) => { isSearchable options={ !loading && data - ? data.users.map(user => ({ + ? data.users.map((user) => ({ label: `${user.username}#${user.discriminator}`, value: user.discord_id, })) diff --git a/frontend-react/src/components/elements/Emoji.tsx b/frontend-react/src/components/elements/Emoji.tsx index 93bfef394..ae5814315 100644 --- a/frontend-react/src/components/elements/Emoji.tsx +++ b/frontend-react/src/components/elements/Emoji.tsx @@ -27,7 +27,9 @@ const Emoji: React.FC = (props) => { const weaponName = weaponCodes[value] if (!!weaponName) - return + return ( + + ) const abilityName = abilityCodes[value] if (!!abilityName) return diff --git a/frontend-react/src/components/elements/Input.tsx b/frontend-react/src/components/elements/Input.tsx index 1da36a573..42ff6f930 100644 --- a/frontend-react/src/components/elements/Input.tsx +++ b/frontend-react/src/components/elements/Input.tsx @@ -16,6 +16,7 @@ interface InputProps { required?: boolean disabled?: boolean textLeft?: string + size?: "sm" | "md" | "lg" } const Input: React.FC = ({ @@ -26,6 +27,7 @@ const Input: React.FC = ({ disabled, limit, textLeft, + size, }) => { const { themeColorHex, grayWithShade, darkerBgColor } = useContext( MyThemeContext @@ -47,6 +49,7 @@ const Input: React.FC = ({ _hover={{}} background={darkerBgColor} borderColor="#CCCCCC" + size={size} /> {limit && ( diff --git a/frontend-react/src/components/root/Routes.tsx b/frontend-react/src/components/root/Routes.tsx index 25b0f4408..d83f39625 100644 --- a/frontend-react/src/components/root/Routes.tsx +++ b/frontend-react/src/components/root/Routes.tsx @@ -7,6 +7,7 @@ import AdminPage from "../admin/AdminPage" const HomePage = lazy(() => import("../home/HomePage")) const UserPage = lazy(() => import("../user/UserPage")) +const UserSearchPage = lazy(() => import("../usersearch/UserSearchPage")) const MarkdownHelpPage = lazy(() => import("../markdown/MarkdownHelpPage")) const BuildsPage = lazy(() => import("../builds/BuildsPage")) const CalendarPage = lazy(() => import("../calendar/CalendarPage")) @@ -37,6 +38,7 @@ const Routes: React.FC = () => { + diff --git a/frontend-react/src/components/root/SideNavContent.tsx b/frontend-react/src/components/root/SideNavContent.tsx index 2810937c3..93d7530c3 100644 --- a/frontend-react/src/components/root/SideNavContent.tsx +++ b/frontend-react/src/components/root/SideNavContent.tsx @@ -26,6 +26,7 @@ import { FaDoorOpen, FaListOl, FaPeopleCarry, + FaSearch, } from "react-icons/fa" import Logo from "./Logo" import NavItem from "./NavItem" @@ -144,6 +145,7 @@ export const SideNavContent: React.FC = ({ showLogo = true }) => { + = () => { + const { darkerBgColor } = useContext(MyThemeContext) + const { data, error, loading } = useQuery(USERS) + const [filter, setFilter] = useState("") + const [currentPage, setCurrentPage] = useState(1) + + useEffect(() => { + setCurrentPage(1) + }, [filter]) + + if (error) return + if (loading) return + + const usersFiltered = data!.users.filter((user) => { + const filterLower = filter.toLowerCase() + if (user.discord_id.includes(filterLower)) return true + + if ( + `${user.username}#${user.discriminator}` + .toLowerCase() + .includes(filterLower) + ) + return true + + if ( + user.twitter_name && + user.twitter_name.toLowerCase().includes(filterLower) + ) + return true + + return false + }) + + const usersSliced = usersFiltered.slice( + 20 * (currentPage - 1), + 20 * (currentPage - 1) + 20 + ) + + return ( + <> + + + User Search | sendou.ink + + + setFilter(value)} + /> + + setCurrentPage(page)} + /> + + {usersSliced.map((user) => ( + + + + {" "} + + + {user.username}#{user.discriminator} + + {user.twitter_name && ( + + + {user.twitter_name} + + )} + + + + + ))} + + setCurrentPage(page)} + /> + + ) +} + +export default UserSearchPage diff --git a/frontend-react/src/graphql/queries/users.ts b/frontend-react/src/graphql/queries/users.ts index 17810dbf2..483f26854 100644 --- a/frontend-react/src/graphql/queries/users.ts +++ b/frontend-react/src/graphql/queries/users.ts @@ -1,5 +1,14 @@ import { gql, DocumentNode } from "apollo-boost" +export interface UsersData { + users: { + discord_id: string + discriminator: string + twitter_name?: string + username: string + }[] +} + export const USERS: DocumentNode = gql` { users {