Commit e614971d authored by Phạm Quang Bảo's avatar Phạm Quang Bảo

fix: search param for pagination

parent f2aa38ec
...@@ -321,6 +321,7 @@ export default function DynamicPageClient() { ...@@ -321,6 +321,7 @@ export default function DynamicPageClient() {
if (resolvedCategory?.type === "news") { if (resolvedCategory?.type === "news") {
return ( return (
<NewsPage <NewsPage
key={resolvedCategory.id}
category={resolvedCategory} category={resolvedCategory}
allCategories={allCategories} allCategories={allCategories}
/> />
......
...@@ -32,22 +32,15 @@ export default function AnPham({ category, allCategories }: AnPhamProps) { ...@@ -32,22 +32,15 @@ export default function AnPham({ category, allCategories }: AnPhamProps) {
const pathname = usePathname(); const pathname = usePathname();
const searchParamsString = searchParams.toString(); const searchParamsString = searchParams.toString();
const initialPage = Number(searchParams.get("page") ?? "1"); const pageParam = Number(searchParams.get("page") ?? "1");
const [searchInput, setSearchInput] = useState(""); const initialPage = Number.isFinite(pageParam) && pageParam > 0 ? Math.floor(pageParam) : 1;
const [submitSearch, setSubmitSearch] = useState(""); const initialQuery = searchParams.get("q") ?? "";
const [searchInput, setSearchInput] = useState(initialQuery);
const [submitSearch, setSubmitSearch] = useState(initialQuery);
const [page, setPage] = useState(initialPage); const [page, setPage] = useState(initialPage);
const pageSize = 8; const pageSize = 8;
const keyword = submitSearch.trim(); const keyword = submitSearch.trim();
// Auto-search with debounce
useEffect(() => {
const timer = setTimeout(() => {
setSubmitSearch(searchInput);
setPage(1);
}, 500);
return () => clearTimeout(timer);
}, [searchInput]);
useEffect(() => { useEffect(() => {
const params = new URLSearchParams(searchParamsString); const params = new URLSearchParams(searchParamsString);
if (page > 1) { if (page > 1) {
...@@ -56,6 +49,12 @@ export default function AnPham({ category, allCategories }: AnPhamProps) { ...@@ -56,6 +49,12 @@ export default function AnPham({ category, allCategories }: AnPhamProps) {
params.delete("page"); params.delete("page");
} }
if (keyword) {
params.set("q", keyword);
} else {
params.delete("q");
}
const qs = params.toString(); const qs = params.toString();
const nextUrl = qs ? `${pathname}?${qs}` : pathname; const nextUrl = qs ? `${pathname}?${qs}` : pathname;
const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname; const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname;
...@@ -63,7 +62,7 @@ export default function AnPham({ category, allCategories }: AnPhamProps) { ...@@ -63,7 +62,7 @@ export default function AnPham({ category, allCategories }: AnPhamProps) {
if (nextUrl !== currentUrl) { if (nextUrl !== currentUrl) {
router.replace(nextUrl, { scroll: false }); router.replace(nextUrl, { scroll: false });
} }
}, [page, pathname, router, searchParamsString]); }, [page, keyword, pathname, router, searchParamsString]);
const filters = [ const filters = [
category?.id ? `category.id==${category.id}` : null, category?.id ? `category.id==${category.id}` : null,
......
...@@ -32,22 +32,15 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi ...@@ -32,22 +32,15 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi
const pathname = usePathname(); const pathname = usePathname();
const searchParamsString = searchParams.toString(); const searchParamsString = searchParams.toString();
const initialPage = Number(searchParams.get("page") ?? "1"); const pageParam = Number(searchParams.get("page") ?? "1");
const [searchInput, setSearchInput] = useState(""); const initialPage = Number.isFinite(pageParam) && pageParam > 0 ? Math.floor(pageParam) : 1;
const [submitSearch, setSubmitSearch] = useState(""); const initialQuery = searchParams.get("q") ?? "";
const [searchInput, setSearchInput] = useState(initialQuery);
const [submitSearch, setSubmitSearch] = useState(initialQuery);
const [page, setPage] = useState(initialPage); const [page, setPage] = useState(initialPage);
const pageSize = 8; const pageSize = 8;
const keyword = submitSearch.trim(); const keyword = submitSearch.trim();
// Auto-search with debounce
useEffect(() => {
const timer = setTimeout(() => {
setSubmitSearch(searchInput);
setPage(1);
}, 500);
return () => clearTimeout(timer);
}, [searchInput]);
useEffect(() => { useEffect(() => {
const params = new URLSearchParams(searchParamsString); const params = new URLSearchParams(searchParamsString);
if (page > 1) { if (page > 1) {
...@@ -56,6 +49,12 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi ...@@ -56,6 +49,12 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi
params.delete("page"); params.delete("page");
} }
if (keyword) {
params.set("q", keyword);
} else {
params.delete("q");
}
const qs = params.toString(); const qs = params.toString();
const nextUrl = qs ? `${pathname}?${qs}` : pathname; const nextUrl = qs ? `${pathname}?${qs}` : pathname;
const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname; const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname;
...@@ -63,7 +62,7 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi ...@@ -63,7 +62,7 @@ export default function ThuVienTaiLieu({ category, allCategories }: ThuVienTaiLi
if (nextUrl !== currentUrl) { if (nextUrl !== currentUrl) {
router.replace(nextUrl, { scroll: false }); router.replace(nextUrl, { scroll: false });
} }
}, [page, pathname, router, searchParamsString]); }, [page, keyword, pathname, router, searchParamsString]);
const filters = [ const filters = [
category?.id ? `category.id==${category.id}` : null, category?.id ? `category.id==${category.id}` : null,
......
...@@ -57,22 +57,15 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) { ...@@ -57,22 +57,15 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) {
const pathname = usePathname(); const pathname = usePathname();
const searchParamsString = searchParams.toString(); const searchParamsString = searchParams.toString();
const initialPage = Number(searchParams.get("page") ?? "1"); const pageParam = Number(searchParams.get("page") ?? "1");
const [searchInput, setSearchInput] = useState(""); const initialPage = Number.isFinite(pageParam) && pageParam > 0 ? Math.floor(pageParam) : 1;
const [submitSearch, setSubmitSearch] = useState(""); const initialQuery = searchParams.get("q") ?? "";
const [searchInput, setSearchInput] = useState(initialQuery);
const [submitSearch, setSubmitSearch] = useState(initialQuery);
const [page, setPage] = useState(initialPage); const [page, setPage] = useState(initialPage);
const pageSize = 10; const pageSize = 10;
const keyword = submitSearch.trim(); const keyword = submitSearch.trim();
// Auto-search with debounce
useEffect(() => {
const timer = setTimeout(() => {
setSubmitSearch(searchInput);
setPage(1);
}, 500);
return () => clearTimeout(timer);
}, [searchInput]);
useEffect(() => { useEffect(() => {
const params = new URLSearchParams(searchParamsString); const params = new URLSearchParams(searchParamsString);
if (page > 1) { if (page > 1) {
...@@ -81,6 +74,12 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) { ...@@ -81,6 +74,12 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) {
params.delete("page"); params.delete("page");
} }
if (keyword) {
params.set("q", keyword);
} else {
params.delete("q");
}
const qs = params.toString(); const qs = params.toString();
const nextUrl = qs ? `${pathname}?${qs}` : pathname; const nextUrl = qs ? `${pathname}?${qs}` : pathname;
const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname; const currentUrl = searchParamsString ? `${pathname}?${searchParamsString}` : pathname;
...@@ -88,7 +87,7 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) { ...@@ -88,7 +87,7 @@ export default function NewsPage({ category, allCategories }: NewsPageProps) {
if (nextUrl !== currentUrl) { if (nextUrl !== currentUrl) {
router.replace(nextUrl, { scroll: false }); router.replace(nextUrl, { scroll: false });
} }
}, [page, pathname, router, searchParamsString]); }, [page, keyword, pathname, router, searchParamsString]);
const filters = `category.id==${category.id}${keyword ? `,title@=${keyword}` : ""},is_hidden==false,is_active==true,type==news`; const filters = `category.id==${category.id}${keyword ? `,title@=${keyword}` : ""},is_hidden==false,is_active==true,type==news`;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment