From 33ec11d6db5d0cd17d78ded56513458784ae9198 Mon Sep 17 00:00:00 2001 From: streaper2 Date: Thu, 23 Apr 2026 13:23:03 +0200 Subject: [PATCH] maj countries + cover annuaire details --- app/annuaire/[id]/page.tsx | 22 +- app/api/businesses/route.ts | 3 + components/dashboard/DashboardProfile.tsx | 84 +++++++- prisma/schema.prisma | 3 + prisma/seed-countries.ts | 240 ++++++++++++++++++++++ types.ts | 3 + 6 files changed, 348 insertions(+), 7 deletions(-) create mode 100644 prisma/seed-countries.ts diff --git a/app/annuaire/[id]/page.tsx b/app/annuaire/[id]/page.tsx index a581942..4eea65c 100644 --- a/app/annuaire/[id]/page.tsx +++ b/app/annuaire/[id]/page.tsx @@ -400,8 +400,22 @@ const BusinessDetailPage = () => { return (
{/* Header Banner */} -
-
+
+ {business.coverUrl ? ( + Couverture + ) : ( +
+
+
+ )}
-
+
{/* Profile Header */}
-
+
{business.name} {business.isFeatured && (
diff --git a/app/api/businesses/route.ts b/app/api/businesses/route.ts index a6ec55c..ffe623f 100644 --- a/app/api/businesses/route.ts +++ b/app/api/businesses/route.ts @@ -66,6 +66,9 @@ export async function POST(request: NextRequest) { city: data.city || "", description: data.description || "", logoUrl: data.logoUrl || "https://picsum.photos/200/200?random=default", + coverUrl: data.coverUrl || null, + coverPosition: data.coverPosition || "50% 50%", + coverZoom: data.coverZoom ? parseFloat(data.coverZoom) : 1.0, videoUrl: data.videoUrl || null, contactEmail: data.contactEmail || "", contactPhone: data.contactPhone || null, diff --git a/components/dashboard/DashboardProfile.tsx b/components/dashboard/DashboardProfile.tsx index e158fea..8ac23df 100644 --- a/components/dashboard/DashboardProfile.tsx +++ b/components/dashboard/DashboardProfile.tsx @@ -29,6 +29,9 @@ const normalizeBusinessData = (b: Business): Business => ({ showSocials: b.showSocials ?? true, slug: b.slug || '', videoUrl: b.videoUrl || '', + coverUrl: b.coverUrl || '', + coverPosition: b.coverPosition || '50% 50%', + coverZoom: b.coverZoom || 1, contactPhone: b.contactPhone || '', websiteUrl: b.websiteUrl || '', socialLinks: { @@ -164,7 +167,7 @@ const DashboardProfile = ({ business, setBusiness }: { business: Business, setBu const isNameOk = formData.name && formData.name !== "Nouvelle Entreprise"; const isDescOk = formData.description && formData.description.length >= 20; - const isLocOk = formData.location && formData.location !== "Ma Ville"; + const isLocOk = (formData.countryId && formData.city) || (formData.location && formData.location !== "Ma Ville"); const isEmailOk = !!formData.contactEmail; const isPhoneOk = !!formData.contactPhone; const isActive = isNameOk && isDescOk && isLocOk && isEmailOk && isPhoneOk; @@ -220,14 +223,89 @@ const DashboardProfile = ({ business, setBusiness }: { business: Business, setBu

Identité Visuelle

-
+
Logo actuel + Logo
-

Glissez votre logo ici ou cliquez pour parcourir

+

Modifier le logo

+ +
+ +
+ {formData.coverUrl ? ( + Couverture + ) : ( +
+ + Aucune bannière personnalisée +
+ )} +
+ +
+
+ +
+
+ + setFormData({...formData, coverZoom: parseFloat(e.target.value)})} + className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-brand-600" + /> +
+
+ + { + const y = (formData.coverPosition || '50% 50%').split(' ')[1] || '50%'; + setFormData({...formData, coverPosition: `${e.target.value}% ${y}`}); + }} + className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-brand-600" + /> +
+
+ + { + const x = (formData.coverPosition || '50% 50%').split(' ')[0] || '50%'; + setFormData({...formData, coverPosition: `${x} ${e.target.value}%`}); + }} + className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-brand-600" + /> +
+
+ + +

Ajustez le zoom et la position pour un rendu optimal sur votre fiche.

+
diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 372061c..d237d8e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -38,6 +38,9 @@ model Business { location String description String logoUrl String + coverUrl String? + coverPosition String? @default("50% 50%") + coverZoom Float? @default(1.0) videoUrl String? contactEmail String contactPhone String? diff --git a/prisma/seed-countries.ts b/prisma/seed-countries.ts new file mode 100644 index 0000000..3153fcd --- /dev/null +++ b/prisma/seed-countries.ts @@ -0,0 +1,240 @@ +import { PrismaClient } from '@prisma/client'; +import { PrismaPg } from '@prisma/adapter-pg'; +import pg from 'pg'; +import dotenv from 'dotenv'; + +dotenv.config({ path: '.env.local' }); +dotenv.config(); + +const connectionString = process.env.DATABASE_URL!; +const pool = new pg.Pool({ connectionString }); +const adapter = new PrismaPg(pool); +const prisma = new PrismaClient({ adapter }); + +const countries = [ + { name: "Afghanistan", code: "AF", flag: "🇦🇫" }, + { name: "Albanie", code: "AL", flag: "🇦🇱" }, + { name: "Algérie", code: "DZ", flag: "🇩🇿" }, + { name: "Andorre", code: "AD", flag: "🇦🇩" }, + { name: "Angola", code: "AO", flag: "🇦🇴" }, + { name: "Antigua-et-Barbuda", code: "AG", flag: "🇦🇬" }, + { name: "Argentine", code: "AR", flag: "🇦🇷" }, + { name: "Arménie", code: "AM", flag: "🇦🇲" }, + { name: "Australie", code: "AU", flag: "🇦🇺" }, + { name: "Autriche", code: "AT", flag: "🇦🇹" }, + { name: "Azerbaïdjan", code: "AZ", flag: "🇦🇿" }, + { name: "Bahamas", code: "BS", flag: "🇧🇸" }, + { name: "Bahreïn", code: "BH", flag: "🇧🇭" }, + { name: "Bangladesh", code: "BD", flag: "🇧🇩" }, + { name: "Barbade", code: "BB", flag: "🇧🇧" }, + { name: "Belgique", code: "BE", flag: "🇧🇪" }, + { name: "Belize", code: "BZ", flag: "🇧🇿" }, + { name: "Bénin", code: "BJ", flag: "🇧🇯" }, + { name: "Bhoutan", code: "BT", flag: "🇧🇹" }, + { name: "Bolivie", code: "BO", flag: "🇧🇴" }, + { name: "Bosnie-Herzégovine", code: "BA", flag: "🇧🇦" }, + { name: "Botswana", code: "BW", flag: "🇧🇼" }, + { name: "Brésil", code: "BR", flag: "🇧🇷" }, + { name: "Brunéi", code: "BN", flag: "🇧🇳" }, + { name: "Bulgarie", code: "BG", flag: "🇧🇬" }, + { name: "Burkina Faso", code: "BF", flag: "🇧🇫" }, + { name: "Burundi", code: "BI", flag: "🇧🇮" }, + { name: "Cabo Verde", code: "CV", flag: "🇨🇻" }, + { name: "Cambodge", code: "KH", flag: "🇰🇭" }, + { name: "Cameroun", code: "CM", flag: "🇨🇲" }, + { name: "Canada", code: "CA", flag: "🇨🇦" }, + { name: "République centrafricaine", code: "CF", flag: "🇨🇫" }, + { name: "Tchad", code: "TD", flag: "🇹🇩" }, + { name: "Chili", code: "CL", flag: "🇨🇱" }, + { name: "Chine", code: "CN", flag: "🇨🇳" }, + { name: "Colombie", code: "CO", flag: "🇨🇴" }, + { name: "Comores", code: "KM", flag: "🇰🇲" }, + { name: "Congo (Brazzaville)", code: "CG", flag: "🇨🇬" }, + { name: "Congo (Kinshasa)", code: "CD", flag: "🇨🇩" }, + { name: "Costa Rica", code: "CR", flag: "🇨🇷" }, + { name: "Côte d'Ivoire", code: "CI", flag: "🇨🇮" }, + { name: "Croatie", code: "HR", flag: "🇭🇷" }, + { name: "Cuba", code: "CU", flag: "🇨🇺" }, + { name: "Chypre", code: "CY", flag: "🇨🇾" }, + { name: "Tchéquie", code: "CZ", flag: "🇨🇿" }, + { name: "Danemark", code: "DK", flag: "🇩🇰" }, + { name: "Djibouti", code: "DJ", flag: "🇩🇯" }, + { name: "Dominique", code: "DM", flag: "🇩🇲" }, + { name: "République dominicaine", code: "DO", flag: "🇩🇴" }, + { name: "Équateur", code: "EC", flag: "🇪🇨" }, + { name: "Égypte", code: "EG", flag: "🇪🇬" }, + { name: "El Salvador", code: "SV", flag: "🇸🇻" }, + { name: "Guinée équatoriale", code: "GQ", flag: "🇬🇶" }, + { name: "Érythrée", code: "ER", flag: "🇪🇷" }, + { name: "Estonie", code: "EE", flag: "🇪🇪" }, + { name: "Eswatini", code: "SZ", flag: "🇸🇿" }, + { name: "Éthiopie", code: "ET", flag: "🇪🇹" }, + { name: "Fidji", code: "FJ", flag: "🇫🇯" }, + { name: "Finlande", code: "FI", flag: "🇫🇮" }, + { name: "France", code: "FR", flag: "🇫🇷" }, + { name: "Gabon", code: "GA", flag: "🇬🇦" }, + { name: "Gambie", code: "GM", flag: "🇬🇲" }, + { name: "Géorgie", code: "GE", flag: "🇬🇪" }, + { name: "Allemagne", code: "DE", flag: "🇩🇪" }, + { name: "Ghana", code: "GH", flag: "🇬🇭" }, + { name: "Grèce", code: "GR", flag: "🇬🇷" }, + { name: "Grenade", code: "GD", flag: "🇬🇩" }, + { name: "Guatemala", code: "GT", flag: "🇬🇹" }, + { name: "Guinée", code: "GN", flag: "🇬🇳" }, + { name: "Guinée-Bissau", code: "GW", flag: "🇬🇼" }, + { name: "Guyana", code: "GY", flag: "🇬🇾" }, + { name: "Haïti", code: "HT", flag: "🇭🇹" }, + { name: "Honduras", code: "HN", flag: "🇭🇳" }, + { name: "Hongrie", code: "HU", flag: "🇭🇺" }, + { name: "Islande", code: "IS", flag: "🇮🇸" }, + { name: "Inde", code: "IN", flag: "🇮🇳" }, + { name: "Indonésie", code: "ID", flag: "🇮🇩" }, + { name: "Iran", code: "IR", flag: "🇮🇷" }, + { name: "Irak", code: "IQ", flag: "🇮🇶" }, + { name: "Irlande", code: "IE", flag: "🇮🇪" }, + { name: "Israël", code: "IL", flag: "🇮🇱" }, + { name: "Italie", code: "IT", flag: "🇮🇹" }, + { name: "Jamaïque", code: "JM", flag: "🇯🇲" }, + { name: "Japon", code: "JP", flag: "🇯🇵" }, + { name: "Jordanie", code: "JO", flag: "🇯🇴" }, + { name: "Kazakhstan", code: "KZ", flag: "🇰🇿" }, + { name: "Kenya", code: "KE", flag: "🇰🇪" }, + { name: "Kiribati", code: "KI", flag: "🇰🇮" }, + { name: "Corée du Nord", code: "KP", flag: "🇰🇵" }, + { name: "Corée du Sud", code: "KR", flag: "🇰🇷" }, + { name: "Koweït", code: "KW", flag: "🇰🇼" }, + { name: "Kirghizistan", code: "KG", flag: "🇰🇬" }, + { name: "Laos", code: "LA", flag: "🇱🇦" }, + { name: "Lettonie", code: "LV", flag: "🇱🇻" }, + { name: "Liban", code: "LB", flag: "🇱🇧" }, + { name: "Lesotho", code: "LS", flag: "🇱🇸" }, + { name: "Libéria", code: "LR", flag: "🇱🇷" }, + { name: "Libye", code: "LY", flag: "🇱🇾" }, + { name: "Liechtenstein", code: "LI", flag: "🇱🇮" }, + { name: "Lituanie", code: "LT", flag: "🇱🇹" }, + { name: "Luxembourg", code: "LU", flag: "🇱🇺" }, + { name: "Madagascar", code: "MG", flag: "🇲🇬" }, + { name: "Malawi", code: "MW", flag: "🇲🇼" }, + { name: "Malaisie", code: "MY", flag: "🇲🇾" }, + { name: "Maldives", code: "MV", flag: "🇲🇻" }, + { name: "Mali", code: "ML", flag: "🇲🇱" }, + { name: "Malte", code: "MT", flag: "🇲🇹" }, + { name: "Îles Marshall", code: "MH", flag: "🇲🇭" }, + { name: "Mauritanie", code: "MR", flag: "🇲🇷" }, + { name: "Maurice", code: "MU", flag: "🇲🇺" }, + { name: "Mexique", code: "MX", flag: "🇲🇽" }, + { name: "Micronésie", code: "FM", flag: "🇫🇲" }, + { name: "Moldavie", code: "MD", flag: "🇲🇩" }, + { name: "Monaco", code: "MC", flag: "🇲🇨" }, + { name: "Mongolie", code: "MN", flag: "🇲🇳" }, + { name: "Monténégro", code: "ME", flag: "🇲🇪" }, + { name: "Maroc", code: "MA", flag: "🇲🇦" }, + { name: "Mozambique", code: "MZ", flag: "🇲🇿" }, + { name: "Myanmar", code: "MM", flag: "🇲🇲" }, + { name: "Namibie", code: "NA", flag: "🇳🇦" }, + { name: "Nauru", code: "NR", flag: "🇳🇷" }, + { name: "Népal", code: "NP", flag: "🇳🇵" }, + { name: "Pays-Bas", code: "NL", flag: "🇳🇱" }, + { name: "Nouvelle-Zélande", code: "NZ", flag: "🇳🇿" }, + { name: "Nicaragua", code: "NI", flag: "🇳🇮" }, + { name: "Niger", code: "NE", flag: "🇳🇪" }, + { name: "Nigéria", code: "NG", flag: "🇳🇬" }, + { name: "Macédoine du Nord", code: "MK", flag: "🇲🇰" }, + { name: "Norvège", code: "NO", flag: "🇳🇴" }, + { name: "Oman", code: "OM", flag: "🇴🇲" }, + { name: "Pakistan", code: "PK", flag: "🇵🇰" }, + { name: "Palaos", code: "PW", flag: "🇵🇼" }, + { name: "Panama", code: "PA", flag: "🇵🇦" }, + { name: "Papouasie-Nouvelle-Guinée", code: "PG", flag: "🇵🇬" }, + { name: "Paraguay", code: "PY", flag: "🇵🇾" }, + { name: "Pérou", code: "PE", flag: "🇵🇪" }, + { name: "Philippines", code: "PH", flag: "🇵🇭" }, + { name: "Pologne", code: "PL", flag: "🇵🇱" }, + { name: "Portugal", code: "PT", flag: "🇵🇹" }, + { name: "Qatar", code: "QA", flag: "🇶🇦" }, + { name: "Roumanie", code: "RO", flag: "🇷🇴" }, + { name: "Russie", code: "RU", flag: "🇷🇺" }, + { name: "Rwanda", code: "RW", flag: "🇷🇼" }, + { name: "Saint-Christophe-et-Niévès", code: "KN", flag: "🇰🇳" }, + { name: "Sainte-Lucie", code: "LC", flag: "🇱🇨" }, + { name: "Saint-Vincent-et-les Grenadines", code: "VC", flag: "🇻🇨" }, + { name: "Samoa", code: "WS", flag: "🇼🇸" }, + { name: "Saint-Marin", code: "SM", flag: "🇸🇲" }, + { name: "Sao Tomé-et-Principe", code: "ST", flag: "🇸🇹" }, + { name: "Arabie Saoudite", code: "SA", flag: "🇸🇦" }, + { name: "Sénégal", code: "SN", flag: "🇸🇳" }, + { name: "Serbie", code: "RS", flag: "🇷🇸" }, + { name: "Seychelles", code: "SC", flag: "🇸🇨" }, + { name: "Sierra Leone", code: "SL", flag: "🇸🇱" }, + { name: "Singapour", code: "SG", flag: "🇸🇬" }, + { name: "Slovaquie", code: "SK", flag: "🇸🇰" }, + { name: "Slovénie", code: "SI", flag: "🇸🇮" }, + { name: "Îles Salomon", code: "SB", flag: "🇸🇧" }, + { name: "Somalie", code: "SO", flag: "🇸🇴" }, + { name: "Afrique du Sud", code: "ZA", flag: "🇿🇦" }, + { name: "Soudan du Sud", code: "SS", flag: "🇸🇸" }, + { name: "Espagne", code: "ES", flag: "🇪🇸" }, + { name: "Sri Lanka", code: "LK", flag: "🇱🇰" }, + { name: "Soudan", code: "SD", flag: "🇸🇩" }, + { name: "Suriname", code: "SR", flag: "🇸🇷" }, + { name: "Suède", code: "SE", flag: "🇸🇪" }, + { name: "Suisse", code: "CH", flag: "🇨🇭" }, + { name: "Syrie", code: "SY", flag: "🇸🇾" }, + { name: "Taïwan", code: "TW", flag: "🇹🇼" }, + { name: "Tadjikistan", code: "TJ", flag: "🇹🇯" }, + { name: "Tanzanie", code: "TZ", flag: "🇹🇿" }, + { name: "Thaïlande", code: "TH", flag: "🇹🇭" }, + { name: "Timor oriental", code: "TL", flag: "🇹🇱" }, + { name: "Togo", code: "TG", flag: "🇹🇬" }, + { name: "Tonga", code: "TO", flag: "🇹🇴" }, + { name: "Trinité-et-Tobago", code: "TT", flag: "🇹🇹" }, + { name: "Tunisie", code: "TN", flag: "🇹🇳" }, + { name: "Turquie", code: "TR", flag: "🇹🇷" }, + { name: "Turkménistan", code: "TM", flag: "🇹🇲" }, + { name: "Tuvalu", code: "TV", flag: "🇹🇻" }, + { name: "Ouganda", code: "UG", flag: "🇺🇬" }, + { name: "Ukraine", code: "UA", flag: "🇺🇦" }, + { name: "Émirats Arabes Unis", code: "AE", flag: "🇦🇪" }, + { name: "Royaume-Uni", code: "GB", flag: "🇬🇧" }, + { name: "États-Unis", code: "US", flag: "🇺🇸" }, + { name: "Uruguay", code: "UY", flag: "🇺🇾" }, + { name: "Ouzbékistan", code: "UZ", flag: "🇺🇿" }, + { name: "Vanuatu", code: "VU", flag: "🇻🇺" }, + { name: "Vatican", code: "VA", flag: "🇻🇦" }, + { name: "Venezuela", code: "VE", flag: "🇻🇪" }, + { name: "Vietnam", code: "VN", flag: "🇻🇳" }, + { name: "Yémen", code: "YE", flag: "🇾🇪" }, + { name: "Zambie", code: "ZM", flag: "🇿🇲" }, + { name: "Zimbabwe", code: "ZW", flag: "🇿🇼" } +]; + +async function main() { + console.log('Seed: Start seeding countries...'); + + for (const country of countries) { + await prisma.country.upsert({ + where: { code: country.code }, + update: { + name: country.name, + flag: country.flag, + }, + create: { + name: country.name, + code: country.code, + flag: country.flag, + }, + }); + } + + console.log(`Seed: Successfully seeded ${countries.length} countries.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + await pool.end(); + }); diff --git a/types.ts b/types.ts index 1711286..13ee132 100644 --- a/types.ts +++ b/types.ts @@ -48,6 +48,9 @@ export interface Business { description: string; logoUrl: string; videoUrl?: string; // YouTube/Vimeo link + coverUrl?: string; + coverPosition?: string; + coverZoom?: number; socialLinks?: SocialLinks; contactEmail: string; contactPhone?: string;