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
@@ -2,7 +2,8 @@
|
||||
|
||||
@* The feed page's tabs, one per kind of feed, scrolling sideways on narrow screens. Groups adds a choice of the
|
||||
persona's communities and circles, Lists a choice of its lists (made and filled on /lists), Tag the hashtag being
|
||||
read, with its week and a button to follow it (its public posts then come home). The stats icon shows how the current feed was
|
||||
read, with its week, a button to follow it (its public posts then come home) and one to feature it on the persona's
|
||||
profile (public: its followers are told). The stats icon shows how the current feed was
|
||||
read; the buttons on the right open the composer and, on narrow screens, the globe. *@
|
||||
<div class="flex flex-col gap-2">
|
||||
<div class="flex items-center gap-2 min-w-0">
|
||||
@@ -99,6 +100,15 @@
|
||||
OnClick="ToggleTagFollow" data-tag-follow>
|
||||
<span>@(tag.Following == true ? Localizer["Stop following #{0}", tag.Name] : Localizer["Follow #{0}", tag.Name])</span>
|
||||
</DButton>
|
||||
@if (tag.Featuring is { } featuring)
|
||||
{
|
||||
<DButton Size="DSize.Xs" Active="featuring" Disabled="@(IsDefaultDisabled || isFollowing)" OnClick="ToggleTagFeature"
|
||||
title="@Localizer["Featured hashtags are public: they show on the persona's profile, and its followers are told."]"
|
||||
aria-pressed="@(featuring ? "true" : "false")" data-tag-feature="@(featuring ? "on" : "off")">
|
||||
<i class="ion-md-ribbon" aria-hidden="true"></i>
|
||||
<span>@(featuring ? Localizer["Featured on profile"] : Localizer["Feature on profile"])</span>
|
||||
</DButton>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@@ -176,6 +186,21 @@
|
||||
Toast.AddResponseSuccess(tag.Following == true ? Localizer["Following #{0}: its public posts come home.", tag.Name] : Localizer["No longer following #{0}.", tag.Name]);
|
||||
}
|
||||
|
||||
async Task ToggleTagFeature()
|
||||
{
|
||||
isFollowing = true;
|
||||
var result = await DiscoveryService.FeatureTag(tag.Name, tag.Featuring != true);
|
||||
isFollowing = false;
|
||||
if (result.IsInvalid)
|
||||
{
|
||||
Toast.AddResponseError(result);
|
||||
return;
|
||||
}
|
||||
|
||||
tag = (Tag)result.Data;
|
||||
Toast.AddResponseSuccess(tag.Featuring == true ? Localizer["#{0} is featured on this persona's profile.", tag.Name] : Localizer["#{0} is no longer featured.", tag.Name]);
|
||||
}
|
||||
|
||||
string TabName(TimelineType type) => type switch
|
||||
{
|
||||
TimelineType.Federation => Localizer["Federated"],
|
||||
|
||||
Reference in new issue
Block a user