HEX
Server: Apache
System: Linux info 3.0 #1337 SMP Tue Jan 01 00:00:00 CEST 2000 all GNU/Linux
User: u115237990 (7145895)
PHP: 8.3.32
Disabled: NONE
Upload Files
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>';
}