search working and showing results but of course not working in terms of the friend requesting

This commit is contained in:
talksik
2022-03-18 13:24:12 -04:00
parent 1ff61bf91d
commit 0a126900b9
6 changed files with 94 additions and 19 deletions
@@ -8,7 +8,8 @@ export default function ProtectedRoute({
}: { }: {
children?: React.ReactNode; children?: React.ReactNode;
}) { }) {
const { isLoading, isError, refetch } = useGetUserDetails(); const { data, isLoading, isError, refetch } = useGetUserDetails();
console.log(data);
if (isLoading) if (isLoading)
return ( return (
+13 -8
View File
@@ -1,9 +1,9 @@
import { $authTokens, $searchQuery } from "./recoil"; import { $authTokens, $searchQuery } from "./recoil";
import axios, { AxiosResponse } from "axios";
import { useMutation, useQuery } from "react-query"; import { useMutation, useQuery } from "react-query";
import SearchResponse from "@nirvana/core/responses/search.response"; import SearchResponse from "@nirvana/core/responses/search.response";
import { User } from "@nirvana/core/models"; import { User } from "@nirvana/core/models";
import axios from "axios";
import { nirvanaApi } from "./nirvanaApi"; import { nirvanaApi } from "./nirvanaApi";
import { queryClient } from "../nirvanaApp"; import { queryClient } from "../nirvanaApp";
import { useRecoilValue } from "recoil"; import { useRecoilValue } from "recoil";
@@ -14,7 +14,7 @@ export const localHost = "http://localhost:5000/api";
const getUserDetails = async ( const getUserDetails = async (
accessToken: string, accessToken: string,
idToken: string idToken: string
): Promise<User> => { ): Promise<AxiosResponse<User, any>> => {
return await axios.get(localHost + `/users?access_token=${accessToken}`, { return await axios.get(localHost + `/users?access_token=${accessToken}`, {
headers: { Authorization: idToken }, headers: { Authorization: idToken },
}); });
@@ -23,10 +23,13 @@ const getUserDetails = async (
const search = async ( const search = async (
idToken: string, idToken: string,
searchQuery: string searchQuery: string
): Promise<SearchResponse> => { ): Promise<AxiosResponse<SearchResponse, any>> => {
return await axios.get(localHost + `/search?query=${searchQuery}`, { return await axios.get<SearchResponse>(
headers: { Authorization: idToken }, localHost + `/search?query=${searchQuery}`,
}); {
headers: { Authorization: idToken },
}
);
}; };
// ====== QUERIES // ====== QUERIES
@@ -50,8 +53,10 @@ export function useSearch() {
const authTokens = useRecoilValue($authTokens); const authTokens = useRecoilValue($authTokens);
const searchQuery = useRecoilValue($searchQuery); const searchQuery = useRecoilValue($searchQuery);
return useQuery(Querytypes.GET_SEARCH_RESULTS, () => return useQuery(
search(authTokens.idToken, searchQuery) Querytypes.GET_SEARCH_RESULTS,
() => search(authTokens.idToken, searchQuery),
{ enabled: searchQuery ? true : false }
); );
} }
@@ -5,9 +5,13 @@ import { useGetUserDetails } from "../../../controller/index";
import { useRecoilState } from "recoil"; import { useRecoilState } from "recoil";
export default function Header() { export default function Header() {
const { data: user } = useGetUserDetails(); const { data: user, isLoading } = useGetUserDetails();
const [searchQuery, setSearchQuery] = useRecoilState($searchQuery); const [searchQuery, setSearchQuery] = useRecoilState($searchQuery);
if (isLoading) {
return <span>getting data</span>;
}
return ( return (
<div className="flex flex-row items-center bg-slate-800 h-20"> <div className="flex flex-row items-center bg-slate-800 h-20">
<Logo type={LogoType.small} className="scale-[0.4]" /> <Logo type={LogoType.small} className="scale-[0.4]" />
@@ -24,7 +28,7 @@ export default function Header() {
<span className="relative mx-5"> <span className="relative mx-5">
<img <img
src={user.picture} src={user.data.picture}
className="rounded-lg h-8 hover:bg-slate-200 hover:cursor-pointer hover:scale-110" className="rounded-lg h-8 hover:bg-slate-200 hover:cursor-pointer hover:scale-110"
alt="cannot find" alt="cannot find"
/> />
+1 -1
View File
@@ -13,7 +13,7 @@ export default function Home() {
const searchQuery = useRecoilValue($searchQuery); const searchQuery = useRecoilValue($searchQuery);
return ( return (
<div className="h-screen w-screen bg-slate-700"> <div className="h-screen w-full bg-slate-700">
{/* header */} {/* header */}
<Header /> <Header />
@@ -1,12 +1,26 @@
import { $searchQuery } from "../../../controller/recoil"; import { $searchQuery } from "../../../controller/recoil";
import { FaPaperPlane } from "react-icons/fa";
import { Tooltip } from "@mui/material";
import { User } from "@nirvana/core/models";
import { useEffect } from "react"; import { useEffect } from "react";
import { useRecoilState } from "recoil";
import { useSearch } from "../../../controller"; import { useSearch } from "../../../controller";
export default function Search() { // todo:
const { data: searchResultsResponse, isLoading, isError } = useSearch(); // remove myself from list
useEffect(() => {}, []); // add friend capability
// unfriend? nahhh not right now
if (!searchResultsResponse?.users) { export default function Search() {
const [searchQuery, setSearchQuery] = useRecoilState($searchQuery);
const { data, isLoading, isError, refetch } = useSearch();
useEffect(() => {
refetch();
}, [searchQuery]);
if (!data?.data?.users) {
return ( return (
<span className="text-white"> <span className="text-white">
no results. please try someone's email or name. no results. please try someone's email or name.
@@ -14,10 +28,55 @@ export default function Search() {
); );
} }
const goBack = () => {
// implicity takes user back
setSearchQuery("");
};
const renderUserRow = (user: User) => {
return (
<span
className="border-t border-t-slate-400 py-5 flex flex-row justify-start
items-center w-full hover:bg-slate-600 cursor-pointer"
>
<span className="relative mx-5">
<img
src={user.picture}
className="rounded-lg h-8 hover:bg-slate-200 hover:cursor-pointer hover:scale-110"
alt=""
/>
<span className="absolute bottom-0 -right-1.5 rounded-full bg-emerald-600 h-3 w-3"></span>
</span>
<span className="flex flex-col items-start">
<span className="text-slate-200 text-lg font-semibold">
{user.name}
</span>
<span className="text-slate-300">{user.email}</span>
</span>
{/* actions */}
<Tooltip title="Request connect">
<button className="hover:bg-slate-300 p-1 flex flex-row items-center justify-center ml-auto">
<FaPaperPlane className="text-emerald-500 text-lg" />
</button>
</Tooltip>
</span>
);
};
return ( return (
<div> <div className="px-5">
{searchResultsResponse.users?.map((user) => { <button
return <span>{user.name}</span>; onClick={goBack}
className="rounded shadow border border-slate-300 text-slate-300 p-1 my-2"
>
Go back
</button>
{data?.data?.users?.map((user) => {
return renderUserRow(user);
})} })}
</div> </div>
); );
@@ -20,6 +20,10 @@ export default function Login({ onReady }: { onReady: Function }) {
window.electronAPI.auth.initiateLogin(); window.electronAPI.auth.initiateLogin();
}; };
const logOut = () => {
window.electronAPI.store.set(STORE_ITEMS.AUTH_TOKENS, null);
};
const setAccessTokensAndContinue = (tokens: { const setAccessTokensAndContinue = (tokens: {
accessToken: string; accessToken: string;
idToken: string; idToken: string;
@@ -87,6 +91,8 @@ export default function Login({ onReady }: { onReady: Function }) {
<span>Continue with Google</span> <span>Continue with Google</span>
</button> </button>
)} )}
<button onClick={logOut}>Log Out</button>
</div> </div>
); );
} }