File: /homepages/35/d993672390/htdocs/dermiteseborrheique/social/index.php
<?php
define('DS_APP', true);
require_once dirname(__DIR__) . '/includes/init.php';
require_once DS_INCLUDES . 'social.php';
$currentUser = auth_user();
$sort = in_array($_GET['sort']??'',['hot','new','top','active']) ? $_GET['sort'] : 'hot';
$tag = sanitize_string($_GET['tag']??'', 50);
$search = sanitize_string($_GET['q']??'', 100);
$page = max(1,(int)($_GET['page']??1));
$perPage= 20;
$offset = ($page-1)*$perPage;
$categories = db_fetch_all("SELECT * FROM social_categories WHERE is_active=1 ORDER BY sort_order");
$where = ['p.is_deleted=0'];
$params = [];
if ($tag) { $where[] = "JSON_CONTAINS(p.tags,?)"; $params[] = json_encode($tag); }
if ($search) { $where[] = "MATCH(p.title,p.body) AGAINST(? IN BOOLEAN MODE)"; $params[] = $search.'*'; }
$whereSQL = 'WHERE '.implode(' AND ',$where);
$orderSQL = match($sort) {
'new' => 'ORDER BY p.created_at DESC',
'top' => 'ORDER BY p.score DESC, p.created_at DESC',
'active' => 'ORDER BY p.updated_at DESC',
default => 'ORDER BY (p.score+LOG(1+p.views/10)-(TIMESTAMPDIFF(HOUR,p.created_at,NOW())/48)) DESC',
};
$total = db_count("SELECT COUNT(*) FROM social_posts p {$whereSQL}", $params);
$posts = db_fetch_all(
"SELECT p.*, u.forum_username, u.avatar_url, u.forum_avatar, u.name as user_name,
sc.name as cat_name, sc.icon as cat_icon, sc.slug as cat_slug
FROM social_posts p JOIN users u ON p.user_id=u.id
LEFT JOIN social_categories sc ON p.category_id=sc.id
{$whereSQL} {$orderSQL} LIMIT {$perPage} OFFSET {$offset}",
$params
);
$userVotes = [];
if ($currentUser && !empty($posts)) {
$ids = implode(',',array_column($posts,'id'));
$votes = db_fetch_all(
"SELECT target_id,value FROM social_votes WHERE user_id=? AND target_type='post' AND target_id IN ({$ids})",
[$currentUser['id']]
);
foreach ($votes as $v) $userVotes[$v['target_id']] = $v['value'];
}
$popularTags = db_fetch_all("SELECT * FROM social_tags ORDER BY post_count DESC LIMIT 15");
$totalPosts = db_count("SELECT COUNT(*) FROM social_posts WHERE is_deleted=0");
$totalReplies = db_count("SELECT COUNT(*) FROM social_replies WHERE is_deleted=0");
$totalMembers = db_count("SELECT COUNT(*) FROM users WHERE is_active=1");
$totalPages = (int)ceil($total/$perPage);
$pageTitle = $tag ? "#{$tag} — Réseau social" : ($search ? "Recherche : {$search}" : "Réseau social");
$metaDesc = "Rejoignez la communauté dermiteseborrheique.fr — partagez vos expériences, posez vos questions et découvrez ce qui déclenche les crises.";
$activePage = 'social';
// CSS social
$socialCSS = file_get_contents(DS_ROOT . '/assets/css/social.css');
ob_start();
?>
<style><?= $socialCSS ?></style>
<div class="social-layout">
<main class="feed-main">
<?php if (!$tag && !$search && $page === 1): ?>
<div class="cats-grid">
<?php foreach ($categories as $cat): ?>
<a href="<?= url('social/categorie/'.$cat['slug']) ?>" class="cat-card">
<div class="cat-card-icon"><?= $cat['icon'] ?></div>
<div class="cat-card-name"><?= e($cat['name']) ?></div>
<div class="cat-card-count"><?= number_format($cat['post_count']) ?> post<?= $cat['post_count']!==1?'s':'' ?></div>
</a>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="feed-toolbar">
<div class="sort-tabs">
<?php foreach (['hot'=>'🔥 Populaire','new'=>'🆕 Récent','top'=>'🏆 Top','active'=>'💬 Actif'] as $s=>$l): ?>
<a href="?sort=<?= $s ?><?= $tag?'&tag='.urlencode($tag):'' ?>" class="sort-tab <?= $sort===$s?'active':'' ?>"><?= $l ?></a>
<?php endforeach; ?>
</div>
<a href="<?= url($currentUser?'social/new-post.php':'auth/register.php') ?>" class="new-post-btn">
<?= $currentUser?'+ Nouveau post':'Rejoindre pour poster' ?>
</a>
</div>
<?php if ($tag): ?>
<div class="tag-filter-bar">
<span class="tag-filter-label">Tag : <strong>#<?= e($tag) ?></strong></span>
<a href="<?= url('social/') ?>" class="tag-filter-clear">✕ Retirer</a>
</div>
<?php endif; ?>
<?php if (empty($posts)): ?>
<div class="feed-empty">
<div class="feed-empty-icon">💬</div>
<div class="feed-empty-title">Aucun post pour l'instant</div>
<div class="feed-empty-desc"><?= $currentUser?'Soyez le premier à partager !':'Inscrivez-vous pour poster.' ?></div>
<a href="<?= url($currentUser?'social/new-post.php':'auth/register.php') ?>" class="btn-cta">
<?= $currentUser?'+ Créer le premier post':'Créer un compte gratuit' ?>
</a>
</div>
<?php else: ?>
<div class="posts-list">
<?php foreach ($posts as $post):
$tags = $post['tags']?json_decode($post['tags'],true):[];
$userVote = $userVotes[$post['id']]??0;
$username = Social::getForumUsername(['forum_username'=>$post['forum_username'],'id'=>$post['user_id']]);
$excerpt = Social::excerpt($post['body'],180);
$postUrl = Social::postUrl($post);
$scoreColor=$post['score']>0?'var(--emerald)':($post['score']<0?'var(--rose)':'var(--text-dim)');
?>
<article class="post-card" id="post-<?= $post['id'] ?>">
<div class="post-vote-col">
<button class="vote-btn upvote <?= $userVote===1?'active':'' ?>" onclick="vote('post',<?= $post['id'] ?>,1,this)">▲</button>
<span class="post-score" style="color:<?= $scoreColor ?>" id="score-post-<?= $post['id'] ?>"><?= $post['score'] ?></span>
<button class="vote-btn downvote <?= $userVote===-1?'active':'' ?>" onclick="vote('post',<?= $post['id'] ?>,-1,this)">▼</button>
</div>
<div class="post-content">
<div class="post-meta-top">
<?php if ($post['forum_avatar']??$post['avatar_url']): ?>
<img src="<?= e($post['forum_avatar']??$post['avatar_url']) ?>" class="post-avatar" alt="">
<?php else: ?>
<div class="post-avatar-placeholder"><?= mb_strtoupper(mb_substr($username,0,1)) ?></div>
<?php endif; ?>
<a href="<?= Social::profileUrl($username) ?>" class="post-username">u/<?= e($username) ?></a>
<span class="post-time">· <?= Social::timeAgo($post['created_at']) ?></span>
</div>
<?php if ($post['cat_name']): ?>
<a href="<?= url('social/categorie/'.$post['cat_slug']) ?>" class="post-cat-badge">
<?= $post['cat_icon'] ?> <?= e($post['cat_name']) ?>
</a>
<?php endif; ?>
<h2 class="post-title"><a href="<?= e($postUrl) ?>"><?= e($post['title']) ?></a></h2>
<?php if ($post['image_url']): ?>
<a href="<?= e($postUrl) ?>"><img src="<?= e($post['image_url']) ?>" class="post-thumbnail" alt="" loading="lazy"></a>
<?php endif; ?>
<p class="post-excerpt"><?= e($excerpt) ?></p>
<?php if (!empty($tags)): ?>
<div class="post-tags">
<?php foreach ($tags as $t): ?>
<a href="?tag=<?= urlencode($t) ?>" class="post-tag">#<?= e($t) ?></a>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="post-actions">
<a href="<?= e($postUrl) ?>" class="post-action">💬 <?= $post['reply_count'] ?> réponse<?= $post['reply_count']!==1?'s':'' ?></a>
<span class="post-action">👁 <?= number_format($post['views']) ?></span>
<a href="<?= e($postUrl) ?>" class="post-action">Lire →</a>
</div>
</div>
</article>
<?php endforeach; ?>
</div>
<?php if ($totalPages > 1): ?>
<nav class="pagination">
<?php if ($page>1): ?><a href="?sort=<?= $sort ?>&page=<?= $page-1 ?><?= $tag?'&tag='.urlencode($tag):'' ?>" class="page-btn" rel="prev">← Précédent</a><?php endif; ?>
<?php for ($p=max(1,$page-2);$p<=min($totalPages,$page+2);$p++): ?>
<a href="?sort=<?= $sort ?>&page=<?= $p ?><?= $tag?'&tag='.urlencode($tag):'' ?>" class="page-btn <?= $p===$page?'active':'' ?>"><?= $p ?></a>
<?php endfor; ?>
<?php if ($page<$totalPages): ?><a href="?sort=<?= $sort ?>&page=<?= $page+1 ?><?= $tag?'&tag='.urlencode($tag):'' ?>" class="page-btn" rel="next">Suivant →</a><?php endif; ?>
</nav>
<?php endif; ?>
<?php endif; ?>
</main>
<aside class="feed-sidebar">
<div class="sidebar-card">
<form action="" method="GET">
<input type="hidden" name="sort" value="<?= e($sort) ?>">
<div class="search-wrap">
<input type="text" name="q" value="<?= e($search) ?>" placeholder="Rechercher..." class="sidebar-search">
<button type="submit" class="search-btn">🔍</button>
</div>
</form>
</div>
<?php if ($currentUser): ?>
<div class="sidebar-card sidebar-cta">
<div class="sidebar-cta-title">Partagez votre expérience</div>
<a href="<?= url('social/new-post.php') ?>" class="btn-cta" style="display:block;text-align:center;">+ Créer un post</a>
</div>
<?php else: ?>
<div class="sidebar-card sidebar-cta">
<div class="sidebar-cta-title">Rejoignez la communauté</div>
<div class="sidebar-cta-desc">Partagez et aidez d'autres personnes.</div>
<a href="<?= url('auth/register.php') ?>" class="btn-cta" style="display:block;text-align:center;margin-bottom:8px;">Créer un compte</a>
<a href="<?= url('auth/login.php') ?>" class="btn-outline" style="display:block;text-align:center;">Se connecter</a>
</div>
<?php endif; ?>
<div class="sidebar-card">
<div class="sidebar-card-title">📂 Catégories</div>
<?php foreach ($categories as $cat): ?>
<a href="<?= url('social/categorie/'.$cat['slug']) ?>" class="cat-sidebar-item">
<span class="cat-sidebar-icon"><?= $cat['icon'] ?></span>
<span class="cat-sidebar-name"><?= e($cat['name']) ?></span>
<span class="cat-sidebar-count"><?= $cat['post_count'] ?></span>
</a>
<?php endforeach; ?>
</div>
<div class="sidebar-card">
<div class="sidebar-card-title">📊 Communauté</div>
<div class="sidebar-stat"><span>Posts</span><strong><?= number_format($totalPosts) ?></strong></div>
<div class="sidebar-stat"><span>Réponses</span><strong><?= number_format($totalReplies) ?></strong></div>
<div class="sidebar-stat"><span>Membres</span><strong><?= number_format($totalMembers) ?></strong></div>
</div>
<div class="sidebar-card">
<div class="sidebar-card-title">🏷️ Tags populaires</div>
<div class="tags-cloud">
<?php foreach ($popularTags as $t): ?>
<a href="?tag=<?= urlencode($t['slug']) ?>" class="cloud-tag <?= $tag===$t['slug']?'active':'' ?>">
#<?= e($t['label']) ?><span class="cloud-count"><?= $t['post_count'] ?></span>
</a>
<?php endforeach; ?>
</div>
</div>
</aside>
</div>
<script>
const csrf = '<?= csrf_token() ?>';
const isLoggedIn = <?= $currentUser?'true':'false' ?>;
async function vote(type,id,value,btn) {
if(!isLoggedIn){window.location='<?= url('auth/login.php') ?>';return;}
const fd=new FormData();
fd.append('action','vote');fd.append('type',type);fd.append('id',id);fd.append('value',value);fd.append('_csrf',csrf);
const res=await fetch('<?= url('social/api.php') ?>',{method:'POST',body:fd,headers:{'X-Requested-With':'XMLHttpRequest'}});
const data=await res.json();
if(data.success){
const el=document.getElementById(`score-${type}-${id}`);
el.textContent=data.score;
el.style.color=data.score>0?'var(--emerald)':data.score<0?'var(--rose)':'var(--text-dim)';
}
}
</script>
<?php if (!$currentUser): ?>
<?php include __DIR__ . '/partials/footer.php'; ?>
<?php endif; ?>
<?php
$content = ob_get_clean();
if ($currentUser) {
// Layout app avec sidebar
require DS_VIEWS . 'layouts/app.php';
} else {
// Layout standalone
$savedTheme = 'dark'; // visitors always start dark, JS will fix it
echo '<!DOCTYPE html><html lang="fr" data-theme="light"><head>';
echo '<script>(function(){var t=localStorage.getItem("ds_theme")||"light";document.documentElement.setAttribute("data-theme",t);})();</script>';
echo '<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">';
echo '<meta name="description" content="' . e($metaDesc) . '">';
echo '<meta name="robots" content="index, follow">';
echo '<title>' . e($pageTitle) . '</title>';
echo '<link href="https://fonts.googleapis.com/css2?family=Cabinet+Grotesk:wght@400;500;700;800;900&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">';
echo '</head><body>';
include __DIR__ . '/partials/nav.php';
echo $content;
echo '</body></html>';
}