Changeset f6c414e in Klonkt for src/views


Ignore:
Timestamp:
06/24/2026 04:37:32 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
9cc0f9f
Parents:
434c2e9
Message:

feat(fediverse): star = like via your own fediverse account (server-only input)

The post heart is now a star that lets any visitor like the post from their own
fediverse account: click -> enter just your server (e.g. mastodon.social) -> bounce
to your server's authorize_interaction. No full @handle needed (your server knows
who you are). Count shows incoming fediverse likes. Reuses the remote-interaction
popover; placeholder simplified to the server.

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

Location:
src/views
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/post.ejs

    r434c2e9 rf6c414e  
    3333    <% if (post.status === 'published') { %>
    3434      <div class="post-like-row">
    35         <%- include('../partials/like-button', { post: post, likedByMe: (typeof likedByMe !== 'undefined' && likedByMe), likeCount: (typeof likeCount !== 'undefined' ? likeCount : 0), loggedIn: !!user, loginNext: _base + '/' + post.slug }) %>
     35        <%- include('../partials/like-button', { post: post, noteUri: (typeof ogOrigin !== 'undefined' && ogOrigin ? ogOrigin : '') + (typeof _base !== 'undefined' && _base ? _base : '') + '/' + post.slug, fediLikeCount: (typeof fediverse !== 'undefined' && fediverse ? fediverse.likeCount : 0), fediPh: t('fedi.remote_ph') }) %>
    3636      </div>
    3737    <% } %>
     
    127127          + '<button type="submit" class="btn btn-primary fedi-remote-go" aria-label="ok">&rarr;</button>'
    128128          + '<button type="button" class="fedi-remote-cancel" aria-label="x">&times;</button>';
    129         f.querySelector('input').placeholder = b.getAttribute('data-fedi-ph') || '@name@server.social';
     129        f.querySelector('input').placeholder = b.getAttribute('data-fedi-ph') || 'mastodon.social';
    130130        document.body.appendChild(f);            // floating popover → no layout reflow
    131131        place(f, b); current = f; currentBtn = b;
  • src/views/pages/timeline.ejs

    r434c2e9 rf6c414e  
    111111      var f = document.createElement('form'); f.className='fedi-remote-form'; f.dataset.uri = b.getAttribute('data-fedi-uri')||'';
    112112      f.innerHTML = '<input type="text" autocomplete="off" spellcheck="false"><button type="submit" class="btn btn-primary fedi-remote-go" aria-label="ok">&rarr;</button><button type="button" class="fedi-remote-cancel" aria-label="x">&times;</button>';
    113       f.querySelector('input').placeholder = b.getAttribute('data-fedi-ph') || '@name@server.social';
     113      f.querySelector('input').placeholder = b.getAttribute('data-fedi-ph') || 'mastodon.social';
    114114      document.body.appendChild(f); place(f, b); current=f; currentBtn=b; f.querySelector('input').focus();
    115115      return;
  • src/views/partials/like-button.ejs

    r434c2e9 rf6c414e  
    1 <%# Like/favourite button for a post. Logged in → htmx toggle (POST /posts/:id/like,
    2     swaps outerHTML back with this partial). Not logged in → link to login.
    3     Expects: post (with .id), likedByMe, likeCount, loggedIn, loginNext. %>
    4 <%
    5   var _liked = (typeof likedByMe !== 'undefined' && likedByMe);
    6   var _cnt = (typeof likeCount !== 'undefined' && likeCount != null) ? likeCount : 0;
    7   var _logged = (typeof loggedIn !== 'undefined' && loggedIn);
    8 %>
    9 <% if (_logged) { %>
    10   <button type="button" class="like-btn<%= _liked ? ' is-liked' : '' %>"
    11           hx-post="/posts/<%= post.id %>/like" hx-swap="outerHTML"
    12           aria-pressed="<%= _liked ? 'true' : 'false' %>"
    13           aria-label="<%= _liked ? 'Uit favorieten verwijderen' : 'Toevoegen aan favorieten' %>"
    14           title="<%= _liked ? 'Uit favorieten verwijderen' : 'Toevoegen aan favorieten' %>">
    15     <span class="like-heart" aria-hidden="true"><%= _liked ? '♥' : '♡' %></span>
    16     <span class="like-count"><%= _cnt %></span>
    17   </button>
    18 <% } else { %>
    19   <a class="like-btn" href="/auth/login?next=<%= encodeURIComponent((typeof loginNext !== 'undefined' && loginNext) ? loginNext : '/') %>"
    20      title="<%= t('like.login_title') %>">
    21     <span class="like-heart" aria-hidden="true">♡</span>
    22     <span class="like-count"><%= _cnt %></span>
    23   </a>
    24 <% } %>
     1<%# Fediverse like — a visitor likes this post out loud from their OWN fediverse
     2    account. Click → popover asks only for their server (e.g. mastodon.social) →
     3    bounces to that server's /authorize_interaction, where they favourite it.
     4    Reuses the .fedi-remote-reply-btn popover wired in post.ejs. The count shows
     5    the incoming fediverse likes.
     6    Expects: noteUri (post's public URL), fediLikeCount, fediPh (server hint). %>
     7<button type="button" class="like-btn fedi-remote-reply-btn"
     8        data-fedi-uri="<%= typeof noteUri !== 'undefined' ? noteUri : '' %>"
     9        data-fedi-ph="<%= typeof fediPh !== 'undefined' && fediPh ? fediPh : 'mastodon.social' %>"
     10        aria-label="<%= t('like.fedi_title') %>" title="<%= t('like.fedi_title') %>">
     11  <span class="like-heart" aria-hidden="true">★</span>
     12  <span class="like-count"><%= (typeof fediLikeCount !== 'undefined' && fediLikeCount) ? fediLikeCount : 0 %></span>
     13</button>
Note: See TracChangeset for help on using the changeset viewer.