Changeset 82079ad in Klonkt


Ignore:
Timestamp:
06/24/2026 12:31:43 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
3d7312a
Parents:
52ea6df
Message:

feat: one identity — user avatar falls back to the site photo everywhere

When a user has no own account avatar, display their site's profile photo across
the account page, top nav (render.js) and comments. No DB copy → stays in sync.

Co-Authored-By: Claude <noreply@…>

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/middleware/render.js

    r52ea6df r82079ad  
    7373    const _fresh = db.prepare('SELECT avatar_url, role, lang FROM users WHERE id = ?').get(_u.id);
    7474    if (_fresh) _u = { ..._u, avatar_url: _fresh.avatar_url, role: _fresh.role, lang: _fresh.lang };
     75    // One identity: no own account avatar → fall back to the user's site photo,
     76    // so the same picture shows everywhere (nav, account, comments).
     77    if (_u && !_u.avatar_url) {
     78      const _sp = db.prepare("SELECT profile_photo FROM sites WHERE owner_id = ? AND profile_photo IS NOT NULL ORDER BY is_primary DESC, created_at ASC LIMIT 1").get(_u.id);
     79      if (_sp && _sp.profile_photo) _u = { ..._u, avatar_url: _sp.profile_photo };
     80    }
    7581  }
    7682  const userOwnsSite = !!(_u && _u.role !== 'god' &&
  • src/routes/account.js

    r52ea6df r82079ad  
    6868  if (account) { delete account.password_hash; delete account.google_sub; } // don't leak to the view
    6969
     70  const editableSite = ownedSite(req.session.user);
    7071  renderPage(req, res, 'pages/account', {
    7172    pageTitle: 'Account',
     
    7576    googleLinked,
    7677    googleAvailable: googleConfigured(),
    77     editableSite: ownedSite(req.session.user),
     78    editableSite,
     79    // Display fallback: when you have no own account avatar, show your site's photo.
     80    siteAvatar: editableSite ? editableSite.profile_photo : null,
    7881    success: req.query.success || null,
    7982    error: req.query.error || null,
     
    98101function ownedSite(user) {
    99102  if (!user) return null;
    100   let site = db.prepare('SELECT id, title, tagline, slug, owner_id FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id);
     103  let site = db.prepare('SELECT id, title, tagline, slug, owner_id, profile_photo FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id);
    101104  if (!site && user.role === 'god') {
    102105    site = getPrimarySite(); // primary/main site as fallback
  • src/routes/posts.js

    r52ea6df r82079ad  
    661661  const commentRows = db.prepare(`
    662662    SELECT c.id, c.parent_comment_id, c.content, c.status, c.created_at,
    663            c.author_id, u.username AS author_username, u.avatar_url AS author_avatar
     663           c.author_id, u.username AS author_username,
     664           COALESCE(u.avatar_url, (SELECT profile_photo FROM sites WHERE owner_id = u.id AND profile_photo IS NOT NULL ORDER BY is_primary DESC, created_at ASC LIMIT 1)) AS author_avatar
    664665    FROM comments c JOIN users u ON u.id = c.author_id
    665666    WHERE c.post_id = ? AND c.status = 'approved'
  • src/views/pages/account.ejs

    r52ea6df r82079ad  
    3131          <label class="ax-avatar-wrap" title="<%= t('acct.avatar_change') %>">
    3232            <span class="ax-profile-avatar">
    33               <% if (account.avatar_url) { %>
    34                 <img src="<%= account.avatar_url %>" alt="">
     33              <% var _av = account.avatar_url || (typeof siteAvatar !== 'undefined' ? siteAvatar : null); %>
     34              <% if (_av) { %>
     35                <img src="<%= _av %>" alt="">
    3536              <% } else { %>
    3637                <span><%= account.username.charAt(0).toUpperCase() %></span>
     
    4546      <% } else { %>
    4647        <span class="ax-profile-avatar ax-profile-avatar-static">
    47           <% if (account.avatar_url) { %>
    48             <img src="<%= account.avatar_url %>" alt="">
     48          <% var _av2 = account.avatar_url || (typeof siteAvatar !== 'undefined' ? siteAvatar : null); %>
     49          <% if (_av2) { %>
     50            <img src="<%= _av2 %>" alt="">
    4951          <% } else { %>
    5052            <span><%= account.username.charAt(0).toUpperCase() %></span>
Note: See TracChangeset for help on using the changeset viewer.