feat(plugin): pirogue-providers (Phase 3.3)
Modèle PirogueProvider (id, name, contacts, fleuves, tarif, description) + enum TransportMode (OWNER_PROVIDES, SELF_ARRANGE, PARTNER_PROVIDER) sur Carbet + relation Carbet → PirogueProvider (nullable, ondelete:SetNull) Composants : - PirogueTransportBlock (server, gated par plugin) sur fiche carbet : affiche le mode + provider partenaire avec contacts/tarif/description - Page publique /partenaires-pirogue : liste des partenaires actifs Seed onEnable : - 3 partenaires démo (Pirogues du Maroni, Approuague Aventures, Oyapock Frontière) avec tarifs estimatifs et fleuves desservis réels - Attribution aux 6 carbets démo : · Awara (Maroni), Maripa (Approuague), Paripou (Oyapock) → PARTNER_PROVIDER · Wapa (Comté), Mahury CE → OWNER_PROVIDES · Kourou Couleuvre → SELF_ARRANGE onDisable désactive les partenaires démo et détache les carbets démo.
This commit is contained in:
parent
8c0b849ad7
commit
a174f99eba
9 changed files with 438 additions and 7 deletions
80
src/components/PirogueTransportBlock.tsx
Normal file
80
src/components/PirogueTransportBlock.tsx
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
import { isPluginEnabled } from "@/lib/plugins/server";
|
||||
import {
|
||||
TRANSPORT_MODE_EMOJI,
|
||||
TRANSPORT_MODE_LABEL,
|
||||
type PirogueProvider,
|
||||
} from "@/lib/pirogue-providers";
|
||||
|
||||
/**
|
||||
* Bloc transport pirogue sur la fiche carbet (server component).
|
||||
* Gated par le plugin `pirogue-providers`. Sans le plugin, retourne null.
|
||||
*/
|
||||
export async function PirogueTransportBlock({
|
||||
transportMode,
|
||||
provider,
|
||||
}: {
|
||||
transportMode: string | null;
|
||||
provider: PirogueProvider | null;
|
||||
}) {
|
||||
if (!(await isPluginEnabled("pirogue-providers"))) return null;
|
||||
if (!transportMode) return null;
|
||||
|
||||
const emoji = TRANSPORT_MODE_EMOJI[transportMode] ?? "🛶";
|
||||
const label = TRANSPORT_MODE_LABEL[transportMode] ?? "Transport pirogue";
|
||||
|
||||
return (
|
||||
<section className="mt-8 rounded-2xl border border-[var(--color-karbe-canopy-100)] bg-[var(--color-karbe-canopy-50)]/40 p-6">
|
||||
<header className="flex items-center gap-2">
|
||||
<span aria-hidden className="text-2xl">{emoji}</span>
|
||||
<h2 className="font-serif text-xl font-medium text-[var(--color-karbe-ink)]">
|
||||
Transport pirogue — {label}
|
||||
</h2>
|
||||
</header>
|
||||
|
||||
{transportMode === "PARTNER_PROVIDER" && provider ? (
|
||||
<div className="mt-4 space-y-2 text-sm leading-relaxed text-[var(--color-karbe-ink)]/85">
|
||||
<p>
|
||||
Ce carbet travaille avec un partenaire référencé :{" "}
|
||||
<strong className="text-[var(--color-karbe-canopy-700)]">{provider.name}</strong>
|
||||
</p>
|
||||
{provider.description ? <p>{provider.description}</p> : null}
|
||||
{provider.pricingNote ? (
|
||||
<p className="italic text-[var(--color-karbe-ink)]/70">{provider.pricingNote}</p>
|
||||
) : null}
|
||||
<dl className="mt-3 flex flex-wrap gap-x-6 gap-y-1 text-xs">
|
||||
{provider.contactEmail ? (
|
||||
<div>
|
||||
<dt className="inline font-semibold text-[var(--color-karbe-canopy-700)]">Email · </dt>
|
||||
<dd className="inline">
|
||||
<a
|
||||
href={`mailto:${provider.contactEmail}`}
|
||||
className="underline hover:text-[var(--color-karbe-laterite-700)]"
|
||||
>
|
||||
{provider.contactEmail}
|
||||
</a>
|
||||
</dd>
|
||||
</div>
|
||||
) : null}
|
||||
{provider.contactPhone ? (
|
||||
<div>
|
||||
<dt className="inline font-semibold text-[var(--color-karbe-canopy-700)]">Tél. · </dt>
|
||||
<dd className="inline">{provider.contactPhone}</dd>
|
||||
</div>
|
||||
) : null}
|
||||
</dl>
|
||||
</div>
|
||||
) : transportMode === "OWNER_PROVIDES" ? (
|
||||
<p className="mt-3 text-sm leading-relaxed text-[var(--color-karbe-ink)]/80">
|
||||
Le loueur s'occupe du transport : il vous récupère au point d'embarquement et
|
||||
vous ramène en fin de séjour. Détails de l'heure et du point de rendez-vous transmis
|
||||
par e-mail après réservation.
|
||||
</p>
|
||||
) : (
|
||||
<p className="mt-3 text-sm leading-relaxed text-[var(--color-karbe-ink)]/80">
|
||||
Le transport est à votre charge. Renseignez-vous auprès des piroguiers locaux du dégrad
|
||||
d'embarquement, ou prévenez-nous : on peut vous orienter vers un partenaire.
|
||||
</p>
|
||||
)}
|
||||
</section>
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue