mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-16 19:56:57 +02:00
Refonte du bloc infos pratiques, suspension des promos et publication réseaux
Bloc « Informations pratiques » (fiche adhérent) - Suppression des dégradés hors palette (radial doré de la section, dégradés crème/bleu des deux sous-cartes) au profit du vocabulaire visuel du site : carte blanche bordée, sous-cartes plates sur le fond de champ, variables CSS. - La pastille « Préparer votre visite » devient une puce arrondie identique aux badges du reste du site ; le chip d'ouverture reprend les teintes de statut. - Les glyphes texte ◷ et ↗ sont remplacés par des icônes SVG cohérentes. Suspension des promotions - Nouveau statut `suspended` + colonnes `suspended_by` / `suspended_by_id` / `suspended_at`. - L'adhérent suspend et réactive ses propres promotions depuis Mon espace ; l'association suspend et réactive n'importe laquelle depuis le backoffice. - Une suspension décidée par l'association ne peut pas être levée par l'adhérent : le motif est affiché dans son espace. - Les lectures publiques filtrant déjà sur `live`, une promo suspendue quitte immédiatement l'accueil, l'annuaire et la fiche. Publication Facebook / LinkedIn - `src/lib/social.ts` : publication d'une promo en ligne sur la page Facebook (Graph API, upload multipart car les images sont en data-URI) et sur la page LinkedIn (Posts API + Images API en trois étapes). - Jetons d'accès exclusivement en variables d'environnement ; un réseau non configuré masque son bouton. - Table `social_posts` : chaque tentative est tracée, un échec est rattrapé et affiché sur la carte de la promo sans interrompre le backoffice. - Nouvelle capacité RBAC `publishSocial` (admin + modérateur). Liens sociaux publics - Réglages `association_facebook` / `association_linkedin` éditables dans Paramètres, préremplis avec les pages de l'association. - Section « Plein R sur les réseaux » sur l'accueil et icônes dans le pied de page, masquées si le réglage est vide. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
This commit is contained in:
20 files changed
+2370
-109
No files matched your search
@@ -1,8 +1,11 @@
|
||||
import Link from "next/link";
|
||||
import { getSiteSettings, socialLinks } from "@/lib/site-settings";
|
||||
import { ContactModalButton } from "./ContactModalButton";
|
||||
import { SOCIAL_BRAND, SocialIcon } from "./SocialIcons";
|
||||
|
||||
export function SiteFooter() {
|
||||
export async function SiteFooter() {
|
||||
const year = new Date().getFullYear();
|
||||
const socials = socialLinks(await getSiteSettings());
|
||||
|
||||
return (
|
||||
<footer style={{ background: "#EFE9DA", borderTop: "1px solid #e2d6bd" }}>
|
||||
@@ -17,6 +20,33 @@ export function SiteFooter() {
|
||||
Association des commerçants et entreprises du Bassin de Pompey.
|
||||
Réseau · Rencontre · Réussite.
|
||||
</p>
|
||||
{socials.length > 0 && (
|
||||
<div style={{ display: "flex", gap: 9, marginTop: 16 }}>
|
||||
{socials.map((s) => (
|
||||
<a
|
||||
key={s.network}
|
||||
href={s.href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
aria-label={`Plein R sur ${s.label}`}
|
||||
title={`Plein R sur ${s.label}`}
|
||||
style={{
|
||||
display: "inline-flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
width: 38,
|
||||
height: 38,
|
||||
borderRadius: 11,
|
||||
border: "1px solid #e2d6bd",
|
||||
background: "#fff",
|
||||
color: SOCIAL_BRAND[s.network],
|
||||
}}
|
||||
>
|
||||
<SocialIcon network={s.network} />
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import type { SocialLink } from "@/lib/site-settings";
|
||||
|
||||
const PATHS: Record<SocialLink["network"], string> = {
|
||||
facebook:
|
||||
"M22 12.06C22 6.5 17.52 2 12 2S2 6.5 2 12.06c0 5.02 3.66 9.18 8.44 9.94v-7.03H7.9v-2.91h2.54V9.85c0-2.52 1.5-3.91 3.77-3.91 1.09 0 2.23.2 2.23.2v2.46h-1.26c-1.24 0-1.63.78-1.63 1.57v1.89h2.78l-.44 2.91h-2.34V22c4.78-.76 8.44-4.92 8.44-9.94Z",
|
||||
linkedin:
|
||||
"M6.94 5.5a2.06 2.06 0 1 1-4.12 0 2.06 2.06 0 0 1 4.12 0ZM6.6 9.05H3.15V21H6.6V9.05Zm5.52 0H8.8V21h3.32v-6.27c0-3.1 4-3.35 4-.01V21h3.33v-7.42c0-5.26-5.94-5.07-7.33-2.48V9.05Z",
|
||||
};
|
||||
|
||||
export const SOCIAL_BRAND: Record<SocialLink["network"], string> = {
|
||||
facebook: "#1877F2",
|
||||
linkedin: "#0A66C2",
|
||||
};
|
||||
|
||||
export function SocialIcon({ network, size = 18 }: { network: SocialLink["network"]; size?: number }) {
|
||||
return (
|
||||
<svg aria-hidden="true" viewBox="0 0 24 24" fill="currentColor" width={size} height={size} style={{ display: "block" }}>
|
||||
<path d={PATHS[network]} />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user