buscar productos por nombre en la tienda

This commit is contained in:
2025-09-02 14:49:51 -04:00
parent 997314b3a5
commit 5ed7f20b24
3 changed files with 27 additions and 14 deletions

View File

@@ -4,25 +4,22 @@ import { DataTableSkeleton } from '@repo/shadcn/table/data-table-skeleton';
import { columns } from './product-tables/columns'; import { columns } from './product-tables/columns';
import { useProductQuery } from '../../hooks/use-query-products'; import { useProductQuery } from '../../hooks/use-query-products';
interface SurveysAdminListProps { interface dataListProps {
initialPage: number; initialPage: number;
initialSearch?: string | null; initialSearch?: string | null;
initialLimit: number; initialLimit: number;
initialType?: string | null;
} }
export default function UsersAdminList({ export default function UsersAdminList({
initialPage, initialPage,
initialSearch, initialSearch,
initialLimit, initialLimit,
initialType, }: dataListProps) {
}: SurveysAdminListProps) {
const filters = { const filters = {
page: initialPage, page: initialPage,
limit: initialLimit, limit: initialLimit,
...(initialSearch && { search: initialSearch }), ...(initialSearch && { search: initialSearch }),
...(initialType && { type: initialType }), }
};
const {data, isLoading} = useProductQuery(filters) const {data, isLoading} = useProductQuery(filters)

View File

@@ -3,24 +3,36 @@ import { useRouter } from 'next/navigation';
import { useAllProductInfiniteQuery } from '@/feactures/inventory/hooks/use-query-products'; import { useAllProductInfiniteQuery } from '@/feactures/inventory/hooks/use-query-products';
import { ProductCard } from '@/feactures/inventory/components/products/productCard'; import { ProductCard } from '@/feactures/inventory/components/products/productCard';
import { allProducts } from '@/feactures/inventory/schemas/inventory'; import { allProducts } from '@/feactures/inventory/schemas/inventory';
import { useRef, useEffect } from 'react'; import { useRef, useEffect, useState } from 'react';
import { Input } from '@repo/shadcn/components/ui/input';
import { Button } from '@repo/shadcn/components/ui/button';
export function ProductList() { export function ProductList() {
const router = useRouter(); const router = useRouter();
const lastProductRef = useRef(null); const lastProductRef = useRef(null);
const [search, setSearch] = useState("")
const { const {
data, data,
fetchNextPage, fetchNextPage,
hasNextPage, hasNextPage,
isFetchingNextPage, isFetchingNextPage,
isLoading isLoading
} = useAllProductInfiniteQuery(); } = useAllProductInfiniteQuery(search);
const handle = (id: number) => { // Funcion al hacer click en un producto
const goTo = (id: number) => {
router.push(`/dashboard/productos/${id}`); router.push(`/dashboard/productos/${id}`);
}; };
// funcion para el buscador
const formSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
const formdata = new FormData(e.currentTarget)
setSearch(formdata.get('search') as string)
console.log('submit')
}
const products = data?.pages.flatMap(page => page.data) || []; const products = data?.pages.flatMap(page => page.data) || [];
useEffect(() => { useEffect(() => {
@@ -60,11 +72,15 @@ export function ProductList() {
</section> </section>
) : ( ) : (
<> <>
<form onSubmit={formSubmit} action={''} className='col-span-full text-center py-3 flex gap-3'>
<Input name='search' type='text' placeholder='Buscar...' className='' defaultValue={search}/>
<Button variant={'outline'} className=''>Buscar</Button>
</form>
{products.map((item, index) => { {products.map((item, index) => {
const isLastElement = index === products.length - 1; const isLastElement = index === products.length - 1;
return ( return (
<div ref={isLastElement ? lastProductRef : null} key={item.id}> <div ref={isLastElement ? lastProductRef : null} key={item.id}>
<ProductCard product={item} onClick={() => handle(Number(item.id))} /> <ProductCard product={item} onClick={() => goTo(Number(item.id))} />
</div> </div>
); );
})} })}

View File

@@ -20,11 +20,11 @@ export function useAllProductQuery(params: Params = {}) {
return useSafeQuery(['product',params], () => getAllProducts(params)) return useSafeQuery(['product',params], () => getAllProducts(params))
} }
export function useAllProductInfiniteQuery() { export function useAllProductInfiniteQuery(search: string = '') {
return useSafeInfiniteQuery( return useSafeInfiniteQuery(
['product'], ['product', search],
// pageParam + 1 para evitar duplicación de datos // pageParam + 1 para evitar duplicación de datos
({ pageParam = 0 }) => getAllProducts({ page: pageParam + 1, limit: 10 }), ({ pageParam = 0 }) => getAllProducts({ page: pageParam + 1, limit: 10, search }),
(lastPage, allPages) => { (lastPage, allPages) => {
// Esta lógica determina el 'pageParam' para la siguiente página // Esta lógica determina el 'pageParam' para la siguiente página
const nextPage = allPages.length; const nextPage = allPages.length;