<footer>
<div class="container container-footer my-4">
<a class="nav-logo" href="{{ path('home') }}">
<img src="{{ logo ?? asset('assets/images/logo.svg') }}" width="150" alt="logo" style="background: white; border-radius: 10px;">
</a>
<div class="row justify-content-between mt-3">
<div class="col-xl-3 col-lg-4 col-md-4 col-sm-6">
<ul class="list-unstyled float-md-left float-lft w-100">
{% if socialLinks['facebook'] is not empty %}
<li class="">
<a href="{{ socialLinks['facebook'] }}" target="_blank">
<span>
<i class="fab fa-facebook-f"></i>
</span>
</a>
</li>
{% endif %}
{% if socialLinks['twitter'] is not empty %}
<li class="">
<a href="{{ socialLinks['twitter'] }}" target="_blank">
<span>
<i class="fab fa-twitter"></i>
</span>
</a>
</li>
{% endif %}
{% if socialLinks['instagram'] is not empty %}
<li class="">
<a href="{{ socialLinks['instagram'] }}" target="_blank">
<span>
<i class="fab fa-instagram"></i>
</span>
</a>
</li>
{% endif %}
{% if socialLinks['linkedin'] is not empty %}
<li class="">
<a href="{{ socialLinks['linkedin'] }}" target="_blank">
<span>
<i class="fab fa-linkedin"></i>
</span>
</a>
</li>
{% endif %}
{% if socialLinks['youtube'] is not empty %}
<li class="">
<a href="{{ socialLinks['youtube'] }}" target="_blank">
<span>
<i class="fab fa-youtube"></i>
</span>
</a>
</li>
{% endif %}
{% if socialLinks['twitch'] is not empty %}
<li class="">
<a href="{{ socialLinks['twitch'] }}" target="_blank">
<span>
<i class="fab fa-twitch"></i>
</span>
</a>
</li>
{% endif %}
</ul>
</div>
</div>
<div class="mt-3 row">
<div class="col-lg-4">
{% if siteConfig.isContactActivated %}
<ul class="list-footer">
<li>
<a href="{{path('contact')}}">{{'footer.contact'|trans }}</a>
</li>
</ul>
{% endif %}
</div>
<div class="col-lg-4">
<ul class="list-footer">
<li class="policy" data-button="policy" data-target="#policyModal">{{ 'footer.policy'|trans }}</li>
<li class="policy" data-button="cookies-policy" data-target="#cookiesPolicyModal">{{ 'footer.cookies-policy'|trans }}</li>
<li class="policy" data-button="terms" data-target="#termsModal">{{ 'footer.terms'|trans }}</li>
{% if siteConfig.activedContribution %}
<li class="policy" data-button="terms" data-target="#FormContribution">
<button class="btn BoutonContribution">
<i class="bi bi-plus-circle-fill"></i>
</button>
</li>
{% endif %}
{% if app.user %}
{% if siteConfig.activedNotification %}
<li class="policy" data-button="notifications" data-target="#notificationModal">
<button class="btn btn-notification fade show">
<i class="bi bi-bell"></i>
<span id="notification-badge" class="position-absolute top-0 start-0 translate-middle badge rounded-pill bg-danger border">
<span id="notification-count">
{% if notifications is not empty %}
{{ notifications|length }}{% else %}0
{% endif %}
</span>
<span class="visually-hidden">unread notifications</span>
</span>
</button>
</li>
{% endif %}
{% endif %}
</ul>
</div>
<div class="col-lg-4">
<ul class="list-footer">
<li class="policy" data-button="terms-of-use" data-target="#termsOfUseModal">{{'footer.terms-of-use'|trans }}</li>
{% if siteConfig.isAnonymizationActive %}
<li class="policy" data-button="anonymization" data-target="#anonymizeModal" role="button" tabindex="0" aria-controls="anonymizeModal">
{{ 'footer.anonymization'|trans }}
</li>
{% endif %}
</ul>
</div>
</div>
<div class="mt-3 d-flex justify-content-between footer-copy-right">
<div>
{{ siteConfig.copyright }}
</div>
<div>
<small>Version :
{{ appVersion }}</small>
</div>
</div>
</div>
</footer>
<!-- Modals -->
<div class="modal fade" id="termsModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">{{ 'terms.modal-heading'|trans }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p class="text-black">{{ mentionLegal.termsOfService|raw }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
</div>
</div>
</div>
</div>
{% if siteConfig.activedContribution %}
<div class="modal fade" id="FormContribution" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="contributionLabel">{{ siteConfig.getTitle ?? 'Contribution' }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p class="text-black">
{{- renderContibutorForm() -}}
</p>
</div>
</div>
</div>
</div>
{% endif %}
{# Policy modal réutilisable #}
{% if app.user %}
{{ include('privacy/modal.html.twig') }}
{% if siteConfig.isAnonymizationActive %}
{{ include('privacy/_anonymize_modal.html.twig') }}
{% endif %}
{% endif %}
{# Script footer conservé mais SANS reload automatique, et uniquement si déclenché depuis le footer #}
<script>
document.addEventListener('DOMContentLoaded', function () {
const saveBtn = document.getElementById('savePrivacyBtn');
const checkbox = document.getElementById('privacyCheckbox');
const acceptForm = document.getElementById('accept-privacy-form');
const refuseForm = document.getElementById('refuse-privacy-form');
if (! saveBtn || ! acceptForm || ! refuseForm)
return;
async function postForm(form) {
const fd = new FormData(form);
const resp = await fetch(form.action, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
body: fd
});
try {
return await resp.json();
} catch {
return {ok: false};
}}
// Flag: si l’orchestrateur a ouvert la modale, il pose window.__ORCH__OPEN = true
saveBtn.addEventListener('click', async () => {
const form = checkbox.checked ? acceptForm : refuseForm;
const res = await postForm(form);
if (res && res.ok) {
if (!window.__ORCH__OPEN) { // Ouverture via footer → on peut recharger
location.reload();
}
// Sinon, l’orchestrateur fermera la modale et enchaînera
} else {
alert('Une erreur est survenue. Merci de réessayer.');
}
});
}
);
</script>
<div class="modal fade" id="cookiesPolicyModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="cookiesPolicyModalLabel">{{ cookiesPolicy.title }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p class="text-black">{{ cookiesPolicy.content|raw }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="termsOfUseModal" tabindex="-1" role="dialog" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-black" id="termsOfUseModalLabel">{{ termsOfUse.title }}</h5>
<button type="button" class="btn-close btn-close-termsOfUse" data-bs-dismiss="modal" aria-label="Close" {% if app.user %} {{ app.user.acceptcgu ? '' : 'disabled' }}{% endif %}>
</button>
</div>
<div class="modal-body">
<div class="row">
<p class="text-black">{{ termsOfUse.content|raw }}</p>
</div>
<div class="row">
{% if app.user %}
<div class="custom-checkbox custom-control">
<input type="checkbox" data-checkboxes="mygroup" class="custom-control-input" id="termsOfUseCheckbox" {{app.user.acceptCgu ? 'checked' : '' }} {% if app.user %} {{ app.user.acceptcgu ? 'disabled' : '' }}{% endif %}>
<label for="termsOfUseCheckbox" class="custom-control-label">
J'accepte les conditions générales d'utilisation
</label>
</div>
{% endif %}
</div>
</div>
<div class="modal-footer">
<button id="btnTermsClose" type="button" class="btn btn-primary btn-close-termsOfUse" data-bs-dismiss="modal"
{% if app.user %}
{{ app.user.acceptcgu ? '' : 'disabled' }}
{% endif %}
>
{{ 'terms.close-modal-btn'|trans }}
</button>
</div>
</div>
</div>
</div>
{% if app.user %}
{% if siteConfig.activedNotification %}
<div class="modal fade" id="notificationModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="notificationModalLabel">{{ 'notification.modal-heading'|trans }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
{% for entry in notifications %}
<a href="{{ path('podcast', { slug: entry.notification.blogPost.slug, notification_id: entry.id }) }}" class="d-block alert alert-success fade show w-100" style="text-decoration: none !important;" data-id="{{ entry.id }}">
<h4 class="alert-heading d-flex justify-content-between align-items-center mb-0">
<span>{{ entry.notification.title }}</span>
<button type="button" class="btn-close"></button>
</h4>
<p class="mb-0">
{{ entry.notification.description }}
</p>
</a>
{% endfor %}
<p class="no-notification my-4 text-center {{ notifications is not empty ? 'd-none' }}">{{ 'notification.no-notification'|trans }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'notification.close-modal-btn'|trans }}</button>
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}