tokenRefresh, crear y editar productos con img funcionando

This commit is contained in:
2025-08-21 14:57:55 -04:00
parent 6a28e141a9
commit c45307d47d
22 changed files with 301 additions and 193 deletions

View File

@@ -118,15 +118,15 @@ export const getProductById = async (id: number) => {
};
export const createProductAction = async (payload: FormData) => {
const session = await auth()
const userId = session?.user?.id
// const session = await auth()
// const userId = session?.user?.id
if (userId) {
payload.append('userId', String(userId));
}
// if (userId) {
// payload.append('userId', String(userId));
// }
const [error, data] = await safeFetchApi(
productMutate,
test,
'/products',
'POST',
payload,

View File

@@ -18,7 +18,7 @@ import {
} from '@repo/shadcn/select';
import { Input } from '@repo/shadcn/input';
import { useForm } from 'react-hook-form';
import { useCreateUser } from "@/feactures/inventory/hooks/use-mutation";
import { useCreateProduct } from "@/feactures/inventory/hooks/use-mutation";
import { editInventory, EditInventory } from '@/feactures/inventory/schemas/inventory';
import { Textarea } from '@repo/shadcn/textarea';
import { STATUS } from '@/constants/status'
@@ -37,7 +37,7 @@ export function CreateForm({
const {
mutate: saveProduct,
isPending: isSaving,
} = useCreateUser();
} = useCreateProduct();
const [sizeFile, setSizeFile] = useState('0 bytes');
const [previewUrls, setPreviewUrls] = useState<string[]>([]);

View File

@@ -14,7 +14,7 @@ export const columns: ColumnDef<InventoryTable>[] = [
header: 'img',
cell: ({ row }) => {
return (
<img src={`http://localhost:3000/uploads/inventory/${row.original.userId}/${row.original.urlImg}`} alt="" width={64} height={64} className="rounded"/>
<img src={`http://localhost:3000/uploads/inventory/${row.original.userId}/${row.original.id}/${row.original.urlImg}`} alt="" width={64} height={64} className="rounded"/>
)
},
},

View File

@@ -18,7 +18,7 @@ import {
} from '@repo/shadcn/select';
import { Input } from '@repo/shadcn/input';
import { useForm } from 'react-hook-form';
import { useUpdateUser } from "@/feactures/inventory/hooks/use-mutation";
import { useUpdateProduct } from "@/feactures/inventory/hooks/use-mutation";
import { editInventory, EditInventory } from '@/feactures/inventory/schemas/inventory'; // Renombrado EditInventory para claridad
import { Textarea } from '@repo/shadcn/components/ui/textarea';
import {STATUS} from '@/constants/status'
@@ -55,7 +55,7 @@ export function UpdateForm({
mutate: saveAccountingAccounts,
isPending: isSaving,
isError,
} = useUpdateUser();
} = useUpdateProduct();
const [sizeFile, setSizeFile] = useState('0 bytes');
const [previewUrls, setPreviewUrls] = useState<string[]>([]);
@@ -106,10 +106,10 @@ export function UpdateForm({
}
}
// --- IMPORTANTE: Tu hook `useUpdateUser` DEBE ser capaz de aceptar FormData ---
// Si `useUpdateUser` llama a `safeFetchApi`, entonces `safeFetchApi` ya está preparado
// --- IMPORTANTE: Tu hook `useUpdateProduct` DEBE ser capaz de aceptar FormData ---
// Si `useUpdateProduct` llama a `safeFetchApi`, entonces `safeFetchApi` ya está preparado
// para recibir `FormData`.
saveAccountingAccounts(formData as any, { // Forzamos el tipo a 'any' si `useUpdateUser` no espera FormData en su tipo
saveAccountingAccounts(formData as any, { // Forzamos el tipo a 'any' si `useUpdateProduct` no espera FormData en su tipo
onSuccess: () => {
form.reset();
onSuccess?.();

View File

@@ -44,7 +44,7 @@ export function ProductList() {
<CardContent className="p-0 flex-grow">
<img
className="object-cover w-full h-full aspect-square border"
src={`http://localhost:3000/uploads/inventory/${data.userId}/${data.urlImg}`}
src={`http://localhost:3000/uploads/inventory/${data.userId}/${data.id}/${data.urlImg}`}
alt=""
/>
</CardContent>

View File

@@ -0,0 +1,64 @@
import { allProducts, } from "../../schemas/inventory";
import {
Card,
CardContent,
CardFooter,
CardHeader,
CardTitle,
} from '@repo/shadcn/card';
export function ProductList({product}: {product: allProducts}) {
return (
// <PageContainer>
<main className='px-4 lg:px-6 flex flex-col md:flex-row gap-3 lg:gap-4 md:relative'>
<div className='w-full flex justify-between flex-col'>
<img
className="border-2 object-contain w-full f-full min-h-[400px] md:h-[70vh] aspect-square rounded-2xl"
src={`http://localhost:3000/uploads/inventory/${product.userId}/${product.id}/${product.urlImg}`}
alt=""
/>
<section className=''>
<img
className="border-2 object-cover w-[64px] h-[64px] md:w-[96px] md:h-[96px] aspect-square rounded-2xl"
src={`http://localhost:3000/uploads/inventory/${product.userId}/${product.id}/${product.urlImg}`}
alt=""
/>
</section>
</div>
<Card className="flex flex-col md:w-[400px] lg:w-[500px] min-h-[400px] md:h-[85vh] md:overflow-auto md:sticky top-0 right-0">
<CardHeader className='py-2 px-2 md:px-4 lg:px-6'>
<CardTitle className="font-bold text-2xl">
{product.title.charAt(0).toUpperCase() + product.title.slice(1)}
</CardTitle>
<p className='font-semibold'>$ {product.price} </p>
{product.status === 'AGOTADO' ? (
<p className="font-semibold text-lg text-red-900">AGOTADO</p>
) : ('')}
</CardHeader>
<CardContent className="py-0 px-2 md:px-4 lg:px-6 flex-col justify-between flex-grow md:overflow-auto">
<div>
<p className='font-semibold text-lg border-t border-b'> Descripción</p>
<p className='p-1'>{product.description}</p>
{/* <p className='p-1'>{lorem+lorem+lorem+lorem}</p> */}
</div>
<div className='mt-2'>
<p className='font-semibold text-lg border-t border-b'> Dirección</p>
<p className='p-1'>{product.address}</p>
</div>
</CardContent>
<CardFooter className="px-2 md:px-4 lg:px-6">
<div>
<p className='font-semibold text-lg border-t border-b mt-4'>Información del vendedor</p>
<p>{product.fullname}</p>
<p>{product.phone}</p>
<p>{product.email}</p>
</div>
</CardFooter>
</Card>
</main>
);
}

View File

@@ -3,7 +3,7 @@ import { EditInventory } from "../schemas/inventory";
import { updateUserAction, createProductAction, updateUserAction2 } from "../actions/actions";
// Create mutation
export function useCreateUser() {
export function useCreateProduct() {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (data: any) => createProductAction(data),
@@ -13,7 +13,7 @@ export function useCreateUser() {
}
// Update mutation
export function useUpdateUser() {
export function useUpdateProduct() {
const queryClient = useQueryClient();
const mutation = useMutation({
// mutationFn: (data: EditInventory) => updateUserAction(data),

View File

@@ -1,5 +1,6 @@
// import { user } from '@/feactures/auth/schemas/register';
// import { all } from 'axios';
import { url } from 'inspector';
import { z } from 'zod';
export type InventoryTable = z.infer<typeof product>;
@@ -26,7 +27,11 @@ export const product = z.object({
userId: z.number().optional()
})
export const productDetails = product.extend({
export const seeProduct = product.extend({
urlImg: z.string(),
})
export const productDetails = seeProduct.extend({
fullname: z.string(),
phone: z.string().nullable(),
email: z.string().email().nullable()