R8 the Mastodon API made real in decePub: featured tags, notify, languages, recommendations, notes, suggestions, the direct stream
A profile shows the hashtags an account features as chips opening their feed; under another account's header is what the persona keeps of it for itself alone: for one it follows, a bell (follow with notify), the languages of its posts that reach the home feed (follow with languages[]) and Recommend (endorsements, private here), and for any account a private note saved on blur or with Save. Settings edits the persona's featured hashtags (added by name or from those used lately, 10 at most) and its reading preferences (/clientapi/avatar/private/preferences), which CascadingState keeps per persona and the card applies to sensitive media and content warnings. A hashtag's tab features it on the profile. Explore has Who to follow (/api/v2/suggestions, dismissed for good after asking); Administration has Staff picks. The Direct tab follows the direct stream's conversation events; status notifications show the post. The follows CSV carries notify and languages. Verified: Release build, 0 errors (the 3 warnings were there before). Not run against PrivaPub or in the pasture. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
This commit is contained in:
1 parent
566b0e33ea
commit
d33697e3fc
28 files changed
+1784
-52
No files matched your search
@@ -12,8 +12,10 @@
|
||||
author deletes them through /clientapi. A threadiverse post takes a downvote; the persona's own public post is given who
|
||||
may quote it, and a post quoting it can have its quote revoked; a notification is dismissed from its line, and a
|
||||
warning from the server's staff (moderation_warning) shows what they did and what they wrote. A moderator removes
|
||||
another's post from its menu, with a note and a warning, asked first. Nerd stats are on the time, the author and its
|
||||
server's history, the place or the CDN, the media and the counts. *@
|
||||
another's post from its menu, with a note and a warning, asked first. The persona's reading preferences
|
||||
(CascadingState.Preferences) say whether a content warning starts open and which media wait behind a button: those
|
||||
marked sensitive, all, or none. A `status` notification (an account followed with notify posted) shows the post. Nerd
|
||||
stats are on the time, the author and its server's history, the place or the CDN, the media and the counts. *@
|
||||
@if (!IsFilteredOut)
|
||||
{
|
||||
<article class="flex gap-3 w-full rounded-xl neo-raised @(Highlighted ? "neo-sm" : "neo-2xs") @CssContainer"
|
||||
@@ -40,7 +42,8 @@
|
||||
|
||||
@if (Post.Notification is { } notification)
|
||||
{
|
||||
<p class="inline-flex flex-wrap items-center gap-2 min-w-0 text-xs" data-notification="@notification.Type" data-count="@Post.GroupCount">
|
||||
<p class="inline-flex flex-wrap items-center gap-2 min-w-0 text-xs" data-notification="@notification.Type" data-count="@Post.GroupCount"
|
||||
data-notification-status="@(notification.Type == "status" ? Post.Status?.Id ?? string.Empty : null)">
|
||||
<i aria-hidden="true" class="@NotificationIcon(notification.Type)"></i>
|
||||
@if (Post.GroupAccounts.Count > 1)
|
||||
{
|
||||
@@ -667,7 +670,25 @@
|
||||
|
||||
bool IsBlurred => !showFiltered && Matched.Any(r => r.Filter.FilterAction == FilterAction.Blur);
|
||||
|
||||
protected override void OnInitialized() => IsLoading = false;
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
IsLoading = false;
|
||||
// a content warning starts open when the persona reads them so (reading:expand:spoilers)
|
||||
isSpoilerOpen = CascadingState?.Preferences.ExpandSpoilers == true;
|
||||
}
|
||||
|
||||
/// <summary>Whether a picture, video or sound waits behind a button: a blur filter's always; else as the persona's
|
||||
/// reading preference says, those marked sensitive (default), none or all.</summary>
|
||||
bool HidesMedia(Status status) => IsBlurred || (CascadingState?.ExpandMedia ?? ExpandMedia.Default) switch
|
||||
{
|
||||
ExpandMedia.ShowAll => false,
|
||||
ExpandMedia.HideAll => true,
|
||||
_ => status.Sensitive
|
||||
};
|
||||
|
||||
string HiddenMediaText(Status status) => IsBlurred ? Localizer["Filtered media, show"]
|
||||
: status.Sensitive ? Localizer["Sensitive media, show"]
|
||||
: Localizer["Hidden media, show"];
|
||||
|
||||
// A card re-renders when something it shows may have changed: its own actions and toggles (its events), a new copy of
|
||||
// its post (an edit, a grouped notification, a place found), where it is shown, or the persona and connection. Without
|
||||
@@ -677,7 +698,7 @@
|
||||
int handlingEvents;
|
||||
|
||||
object RenderKey() => (Post, Post?.Status, Post?.Notification, Post?.Conversation, Post?.Location, Post?.GroupCount, Post?.GroupAccounts,
|
||||
(FilterIn, Highlighted, Compact, IncludeExpand, CssContainer), (CascadingState?.PersonaId, CascadingState?.IsOnline));
|
||||
(FilterIn, Highlighted, Compact, IncludeExpand, CssContainer), (CascadingState?.PersonaId, CascadingState?.IsOnline, CascadingState?.Preferences));
|
||||
|
||||
protected override bool ShouldRender()
|
||||
{
|
||||
@@ -720,12 +741,12 @@
|
||||
@foreach (var media in status.MediaAttachments)
|
||||
{
|
||||
<NerdTip Heading="@Localizer["Media"]" Rows="MediaRows(media)" Class="block w-full" TapOpens="false">
|
||||
@if ((status.Sensitive || IsBlurred) && !revealedMedia.Contains(media.Id))
|
||||
@if (HidesMedia(status) && !revealedMedia.Contains(media.Id))
|
||||
{
|
||||
@* its blurhash shows behind it: the colours, nothing of what it shows *@
|
||||
<button type="button" class="flex items-center justify-center w-full aspect-video rounded-lg neo-inset neo-2xs text-sm bg-cover"
|
||||
@onclick="() => revealedMedia.Add(media.Id)" data-blurhash="@media.Blurhash">
|
||||
<span class="inline-flex items-center rounded-box bg-base-100/85 px-3 py-1"><i class="ion-md-eye-off mr-2"></i>@(IsBlurred ? Localizer["Filtered media, show"] : Localizer["Sensitive media, show"])</span>
|
||||
@onclick="() => revealedMedia.Add(media.Id)" data-blurhash="@media.Blurhash" data-media-hidden>
|
||||
<span class="inline-flex items-center rounded-box bg-base-100/85 px-3 py-1"><i class="ion-md-eye-off mr-2"></i>@HiddenMediaText(status)</span>
|
||||
</button>
|
||||
}
|
||||
else
|
||||
@@ -1352,6 +1373,7 @@
|
||||
"update" or "quoted_update" => "ion-md-create",
|
||||
"quote" => "ion-md-quote",
|
||||
"moderation_warning" => "ion-md-warning text-warning",
|
||||
"status" => "ion-md-notifications text-primary",
|
||||
_ => "ion-md-notifications"
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user