Skip to content
Snippets Groups Projects
Commit d889a9f9 authored by Yusuf Akgül's avatar Yusuf Akgül :hatching_chick:
Browse files

search

parent 6718b895
No related branches found
No related tags found
1 merge request!46Search
import { GlobalLayout } from "@/components/global-layout" import { GlobalLayout } from "@/components/global-layout"
import { SearchResults } from "@/components/search/components/search-results"
export default async function SearchPage() { export default async function SearchPage() {
return ( return (
<GlobalLayout <GlobalLayout
mainContent={ mainContent={
<> <>
Search Page <SearchResults />
</> </>
} }
......
...@@ -80,7 +80,7 @@ export async function GET(request: Request) { ...@@ -80,7 +80,7 @@ export async function GET(request: Request) {
}), }),
...(type === "search" && { ...(type === "search" && {
text: { content: {
contains: id, contains: id,
mode: "insensitive", mode: "insensitive",
}, },
......
import Image from "next/image";
import Link from "next/link";
import styles from "./styles/no-results.module.scss";
export const NoResults = ({ query }: { query: string | undefined }) => { export const NoResults = ({ query }: { query: string | undefined }) => {
return ( return (
<div className={styles.container}> <div className="flex flex-col items-center p-6 space-y-3">
<div className={styles.content}> <h1 className="text-tertiary text-center">Couldn&apos;t find anything with &quot;{query}&quot;</h1>
<div className={styles.image}> <p className="text-tertiary text-center">Try searching for something else.</p>
<Image
src={`/no-results.png`}
alt="no results"
width={320}
height={160}
quality={100}
loading="lazy"
/>
</div> </div>
<h1>No results for &quot;{query}&quot;</h1> )
<p> }
Try searching for something else, or check your{" "} \ No newline at end of file
<Link href="/settings">Search settings</Link> to see if they’re
protecting you from potentially sensitive content.
</p>
</div>
</div>
);
};
...@@ -4,25 +4,21 @@ import { Icons } from '@/components/icons' ...@@ -4,25 +4,21 @@ import { Icons } from '@/components/icons'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input' import { Input } from '@/components/ui/input'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { zodResolver } from '@hookform/resolvers/zod'
import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { useState } from 'react' import { useState } from 'react'
import { useForm } from 'react-hook-form'
import { z } from 'zod'
interface DocsSearchProps extends React.HTMLAttributes<HTMLFormElement> { } interface DocsSearchProps extends React.HTMLAttributes<HTMLFormElement> { }
export default function SearchInput({ className, ...props }: DocsSearchProps) { export default function SearchInput({ className, ...props }: DocsSearchProps) {
const [searchQuery, setSearchQuery] = useState("")
const router = useRouter() const router = useRouter()
const pathname = usePathname() const pathname = usePathname()
const searchParams = useSearchParams() const searchParams = useSearchParams()
const search = searchParams?.get("query")?.toLowerCase() || "" const search = searchParams?.get("query")?.trim().toLowerCase() || ""
const [query, setQuery] = useState( const [searchQuery, setSearchQuery] = useState(
pathname?.split("/")[1] === "search" pathname?.split("/")[1] === "search" ?
? decodeURIComponent(search) decodeURIComponent(search)
: "", : "",
) )
...@@ -38,9 +34,10 @@ export default function SearchInput({ className, ...props }: DocsSearchProps) { ...@@ -38,9 +34,10 @@ export default function SearchInput({ className, ...props }: DocsSearchProps) {
const encoededQuery = encodeURIComponent(searchQuery) const encoededQuery = encodeURIComponent(searchQuery)
router.push(`${pathname}?search=${encoededQuery}`) router.push(`${pathname}?search=${encoededQuery}`)
} else { } else {
if (!searchQuery.trim()) return
router.push(`/search?query=${searchQuery}`) router.push(`/search?query=${searchQuery}`)
} }
}; }
return ( return (
<form <form
...@@ -55,8 +52,12 @@ export default function SearchInput({ className, ...props }: DocsSearchProps) { ...@@ -55,8 +52,12 @@ export default function SearchInput({ className, ...props }: DocsSearchProps) {
value={searchQuery} value={searchQuery}
onChange={(event) => setSearchQuery(event.target.value)} onChange={(event) => setSearchQuery(event.target.value)}
/> />
<Button size="lg" className="absolute align-middle h-8 px-2.5 mr-1">
<Icons.arrowRight className="h-3 w-3" /> <Button
type="submit"
size="option"
className="absolute align-middle h-8 px-2.5 mr-1">
<Icons.arrowRight />
</Button> </Button>
</form> </form>
) )
......
import { useSearchParams } from "next/navigation" "use client"
import { InfiniteGweets } from "@/components/gweets/components/infinite-gweets" import { InfiniteGweets } from "@/components/gweets/components/infinite-gweets"
import { useGweets } from "@/components/gweets/hooks/use-gweets" import { useGweets } from "@/components/gweets/hooks/use-gweets"
import LoadingItem from "@/components/loading-item" import LoadingItem from "@/components/loading-item"
import { UserItem } from "@/components/profile/components/user-item" import { UserItem } from "@/components/profile/components/user-item"
import { TryAgain } from "@/components/try-again" import { TryAgain } from "@/components/try-again"
import { Card } from "@/components/ui/card"
import { Separator } from "@/components/ui/separator"
import { useSearchParams } from "next/navigation"
import { useSearchPeople } from "../hooks/use-search-people" import { useSearchPeople } from "../hooks/use-search-people"
import { NoResults } from "./no-results" import { NoResults } from "./no-results"
...@@ -25,34 +28,39 @@ export const SearchResults = () => { ...@@ -25,34 +28,39 @@ export const SearchResults = () => {
if (gweets.isError) return <TryAgain /> if (gweets.isError) return <TryAgain />
return ( return (
<div className=""> <Card className="p-6 h-full w-full">
{gweets?.data?.pages && {gweets?.data?.pages &&
gweets?.data?.pages[0]?.gweets?.length === 0 && gweets?.data?.pages[0]?.gweets?.length === 0 &&
people?.data?.length === 0 ? ( people?.data?.length === 0 ? (
<NoResults query={query} /> <NoResults query={query} />
) : ( ) : (
<div className=""> <>
{people?.isSuccess && people?.data?.length > 0 && ( {people?.isSuccess && people?.data?.length > 0 && (
<div className=""> <>
<h1>People</h1> <h1 className="font-bold pb-3">People</h1>
{people?.data?.map((person) => { {people?.data?.map((person) => {
return <UserItem key={person?.id} user={person} sessionId={undefined} /> return <UserItem key={person?.id} user={person} sessionId={undefined} />
})} })}
<button className="">View All</button> {gweets?.data?.pages[0]?.gweets?.length !== 0 &&
</div> <Separator className="my-6 p-0.5" />
}
</>
)} )}
<div className=""> {gweets?.data?.pages[0]?.gweets?.length !== 0 &&
<InfiniteGweets <>
gweets={gweets?.data} <h1 className="font-bold pb-3">Gweets</h1>
hasNextPage={gweets?.hasNextPage} <InfiniteGweets
fetchNextPage={gweets?.fetchNextPage} gweets={gweets.data}
isSuccess={gweets?.isSuccess} hasNextPage={gweets.hasNextPage}
isFetchingNextPage={gweets?.isFetchingNextPage} fetchNextPage={gweets.fetchNextPage}
/> isSuccess={gweets.isSuccess}
</div> isFetchingNextPage={gweets.isFetchingNextPage}
</div> />
</>
}
</>
)} )}
</div> </Card>
) )
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ export default function Providers({ children }: React.PropsWithChildren) { ...@@ -11,7 +11,7 @@ export default function Providers({ children }: React.PropsWithChildren) {
return ( return (
<QueryClientProvider client={client}> <QueryClientProvider client={client}>
<SessionProvider> <SessionProvider refetchOnWindowFocus={false}>
{children} {children}
</SessionProvider> </SessionProvider>
</QueryClientProvider> </QueryClientProvider>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment