Initial commit: WaMarket MVP
Marketplace inversée (Next.js 16 App Router + Supabase Cloud) : auth, schéma + RLS, publication de besoins avec upload d'images, feed avec filtres, offres, acceptation via RPC, messagerie temps réel, dashboards, et Dockerfile pour déploiement Coolify.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
import * as z from "zod";
|
||||
|
||||
export const SignupFormSchema = z.object({
|
||||
fullName: z.string().trim().min(2, { message: "2 caractères minimum." }),
|
||||
email: z.string().trim().email({ message: "Adresse email invalide." }),
|
||||
password: z
|
||||
.string()
|
||||
.min(8, { message: "8 caractères minimum." })
|
||||
.regex(/[a-zA-Z]/, { message: "Doit contenir au moins une lettre." })
|
||||
.regex(/[0-9]/, { message: "Doit contenir au moins un chiffre." }),
|
||||
});
|
||||
|
||||
export const LoginFormSchema = z.object({
|
||||
email: z.string().trim().email({ message: "Adresse email invalide." }),
|
||||
password: z.string().min(1, { message: "Mot de passe requis." }),
|
||||
});
|
||||
|
||||
export type FormState =
|
||||
| {
|
||||
errors?: {
|
||||
fullName?: string[];
|
||||
email?: string[];
|
||||
password?: string[];
|
||||
};
|
||||
message?: string;
|
||||
}
|
||||
| undefined;
|
||||
@@ -0,0 +1,34 @@
|
||||
import * as z from "zod";
|
||||
|
||||
export const NeedFormSchema = z.object({
|
||||
title: z
|
||||
.string()
|
||||
.trim()
|
||||
.min(5, { message: "5 caractères minimum." })
|
||||
.max(120, { message: "120 caractères maximum." }),
|
||||
description: z
|
||||
.string()
|
||||
.trim()
|
||||
.min(20, { message: "20 caractères minimum." })
|
||||
.max(2000, { message: "2000 caractères maximum." }),
|
||||
categoryId: z.string().uuid({ message: "Choisis une catégorie." }),
|
||||
city: z.string().trim().min(2, { message: "Ville requise." }),
|
||||
region: z.string().trim().max(120).optional(),
|
||||
budgetMin: z.string().optional(),
|
||||
budgetMax: z.string().optional(),
|
||||
});
|
||||
|
||||
export type NeedFormState =
|
||||
| {
|
||||
errors?: {
|
||||
title?: string[];
|
||||
description?: string[];
|
||||
categoryId?: string[];
|
||||
city?: string[];
|
||||
region?: string[];
|
||||
budgetMin?: string[];
|
||||
budgetMax?: string[];
|
||||
};
|
||||
message?: string;
|
||||
}
|
||||
| undefined;
|
||||
@@ -0,0 +1,26 @@
|
||||
import * as z from "zod";
|
||||
|
||||
export const OfferFormSchema = z.object({
|
||||
title: z
|
||||
.string()
|
||||
.trim()
|
||||
.min(5, { message: "5 caractères minimum." })
|
||||
.max(120, { message: "120 caractères maximum." }),
|
||||
description: z
|
||||
.string()
|
||||
.trim()
|
||||
.min(20, { message: "20 caractères minimum." })
|
||||
.max(2000, { message: "2000 caractères maximum." }),
|
||||
price: z.string().min(1, { message: "Prix requis." }),
|
||||
});
|
||||
|
||||
export type OfferFormState =
|
||||
| {
|
||||
errors?: {
|
||||
title?: string[];
|
||||
description?: string[];
|
||||
price?: string[];
|
||||
};
|
||||
message?: string;
|
||||
}
|
||||
| undefined;
|
||||
Reference in New Issue
Block a user