mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-08-04 06:48:43 +00:00
feat(discover): add topic selection
This commit is contained in:
@ -4,6 +4,7 @@ import { Search } from 'lucide-react';
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
|
import { cn } from '@/lib/utils';
|
||||||
|
|
||||||
interface Discover {
|
interface Discover {
|
||||||
title: string;
|
title: string;
|
||||||
@ -12,14 +13,39 @@ interface Discover {
|
|||||||
thumbnail: string;
|
thumbnail: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const topics: { key: string; display: string }[] = [
|
||||||
|
{
|
||||||
|
display: 'Tech & Science',
|
||||||
|
key: 'tech',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
display: 'Finance',
|
||||||
|
key: 'finance',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
display: 'Art & Culture',
|
||||||
|
key: 'art',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
display: 'Sports',
|
||||||
|
key: 'sports',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
display: 'Entertainment',
|
||||||
|
key: 'entertainment',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const Page = () => {
|
const Page = () => {
|
||||||
const [discover, setDiscover] = useState<Discover[] | null>(null);
|
const [discover, setDiscover] = useState<Discover[] | null>(null);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
const [activeTopic, setActiveTopic] = useState<string>(topics[0].key);
|
||||||
|
|
||||||
useEffect(() => {
|
const fetchArticles = async (topic: string) => {
|
||||||
const fetchData = async () => {
|
setLoading(true);
|
||||||
|
console.log(topic);
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`/api/discover`, {
|
const res = await fetch(`/api/discover?topic=${topic}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@ -43,10 +69,39 @@ const Page = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fetchData();
|
useEffect(() => {
|
||||||
}, []);
|
fetchArticles(activeTopic);
|
||||||
|
}, [activeTopic]);
|
||||||
|
|
||||||
return loading ? (
|
return (
|
||||||
|
<>
|
||||||
|
<div>
|
||||||
|
<div className="flex flex-col pt-4">
|
||||||
|
<div className="flex items-center">
|
||||||
|
<Search />
|
||||||
|
<h1 className="text-3xl font-medium p-2">Discover</h1>
|
||||||
|
</div>
|
||||||
|
<hr className="border-t border-[#2B2C2C] my-4 w-full" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-row items-center space-x-2 overflow-x-auto">
|
||||||
|
{topics.map((t, i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className={cn(
|
||||||
|
'border-[0.1px] rounded-full text-sm px-3 py-1 text-nowrap transition duration-200 cursor-pointer',
|
||||||
|
activeTopic === t.key
|
||||||
|
? 'text-cyan-300 bg-cyan-300/30 border-cyan-300/60'
|
||||||
|
: 'border-white/30 text-white/70 hover:text-white hover:border-white/40 hover:bg-white/5',
|
||||||
|
)}
|
||||||
|
onClick={() => setActiveTopic(t.key)}
|
||||||
|
>
|
||||||
|
<span>{t.display}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{loading ? (
|
||||||
<div className="flex flex-row items-center justify-center min-h-screen">
|
<div className="flex flex-row items-center justify-center min-h-screen">
|
||||||
<svg
|
<svg
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
@ -66,17 +121,7 @@ const Page = () => {
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 pt-5 lg:pb-8 w-full justify-items-center lg:justify-items-start">
|
||||||
<div>
|
|
||||||
<div className="flex flex-col pt-4">
|
|
||||||
<div className="flex items-center">
|
|
||||||
<Search />
|
|
||||||
<h1 className="text-3xl font-medium p-2">Discover</h1>
|
|
||||||
</div>
|
|
||||||
<hr className="border-t border-[#2B2C2C] my-4 w-full" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 lg:pb-8 w-full justify-items-center lg:justify-items-start">
|
|
||||||
{discover &&
|
{discover &&
|
||||||
discover?.map((item, i) => (
|
discover?.map((item, i) => (
|
||||||
<Link
|
<Link
|
||||||
@ -105,6 +150,7 @@ const Page = () => {
|
|||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user