buscar productos por nombre en la tienda
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,14 @@ 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,
|
||||||
@@ -15,12 +18,21 @@ export function ProductList() {
|
|||||||
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>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user