Ajout paramètre message bas de page personnalisable
This commit is contained in:
100
src/components/Footer.tsx
Normal file
100
src/components/Footer.tsx
Normal file
@@ -0,0 +1,100 @@
|
||||
'use client';
|
||||
import { useState, useEffect } from 'react';
|
||||
import { PROJECT_CONFIG } from '@/lib/project.config';
|
||||
import { settingsService } from '@/lib/services';
|
||||
import { parseFooterMessage } from '@/lib/utils';
|
||||
|
||||
interface FooterProps {
|
||||
className?: string;
|
||||
variant?: 'home' | 'public';
|
||||
}
|
||||
|
||||
export default function Footer({ className = '', variant = 'public' }: FooterProps) {
|
||||
const [footerMessage, setFooterMessage] = useState('');
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
const loadFooterMessage = async () => {
|
||||
try {
|
||||
const message = await settingsService.getStringValue(
|
||||
'footer_message',
|
||||
'Développé avec ❤️ pour faciliter la démocratie participative - [Logiciel libre et open source](GITURL) et transparent pour tous'
|
||||
);
|
||||
setFooterMessage(message);
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement du message du bas de page:', error);
|
||||
// Utiliser le message par défaut en cas d'erreur
|
||||
setFooterMessage('Développé avec ❤️ pour faciliter la démocratie participative - [Logiciel libre et open source](GITURL) et transparent pour tous');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
loadFooterMessage();
|
||||
}, []);
|
||||
|
||||
if (loading) {
|
||||
return null; // Ne pas afficher le bas de page pendant le chargement
|
||||
}
|
||||
|
||||
const { text: processedText, links } = parseFooterMessage(footerMessage, PROJECT_CONFIG.repository.url);
|
||||
|
||||
// Pour la page d'accueil, utiliser un style plus simple
|
||||
if (variant === 'home') {
|
||||
return (
|
||||
<div className={`text-center mt-16 pb-8 ${className}`}>
|
||||
<p className="text-slate-600 dark:text-slate-400 text-lg">
|
||||
{processedText}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// Pour les pages publiques, utiliser un style plus discret avec liens
|
||||
const renderFooterText = () => {
|
||||
if (links.length === 0) {
|
||||
return processedText;
|
||||
}
|
||||
|
||||
// Créer un tableau d'éléments avec les liens
|
||||
const elements: React.ReactNode[] = [];
|
||||
let lastIndex = 0;
|
||||
|
||||
links.forEach((link, index) => {
|
||||
// Ajouter le texte avant le lien
|
||||
if (link.start > lastIndex) {
|
||||
elements.push(processedText.slice(lastIndex, link.start));
|
||||
}
|
||||
|
||||
// Ajouter le lien
|
||||
elements.push(
|
||||
<a
|
||||
key={`link-${index}`}
|
||||
href={link.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-gray-500 hover:text-gray-700 underline"
|
||||
>
|
||||
{link.text}
|
||||
</a>
|
||||
);
|
||||
|
||||
lastIndex = link.end;
|
||||
});
|
||||
|
||||
// Ajouter le texte restant
|
||||
if (lastIndex < processedText.length) {
|
||||
elements.push(processedText.slice(lastIndex));
|
||||
}
|
||||
|
||||
return elements;
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={`text-center mt-16 pb-20 ${className}`}>
|
||||
<p className="text-gray-400 text-sm">
|
||||
{renderFooterText()}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user