Build / Build (push) Successful in 1m5s
Administration's Pleroma placeholders give way to real sections: Instance (title, descriptions, contact, thumbnail, privacy policy, terms, the weekly activity), Rules, Announcements, Relays, Media limits and the Moderation log, next to Reports, blocked servers (now published or obfuscated), statistics and backups; moderators see Reports and the log. Every save sends the whole settings form built from the latest read, since PrivaPub replaces what it carries. /about shows the server's documents to anyone. The report dialog picks the rules a violation breaks, and reports show them. Announcements show above the feed tabs, dismissed and reacted to, live from the user stream. Login names the server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
87 lines
3.4 KiB
C#
87 lines
3.4 KiB
C#
using decePubClient;
|
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
|
using System.Net.Http.Headers;
|
|
using System.Text.Json;
|
|
using Blazored.LocalStorage;
|
|
using decePubClient.Extensions;
|
|
using decePubClient.Helpers;
|
|
using decePubClient.Models;
|
|
using decePubClient.Services;
|
|
using Toolbelt.Blazor.Extensions.DependencyInjection;
|
|
using Microsoft.AspNetCore.Components.Authorization;
|
|
using Microsoft.AspNetCore.Components.Web;
|
|
using PrivaPub.ClientModels;
|
|
|
|
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
|
builder.RootComponents.Add<App>("#app");
|
|
builder.RootComponents.Add<HeadOutlet>("head::after");
|
|
|
|
builder.Services.AddBlazorDownloadFile();
|
|
builder.Services.AddOptions()
|
|
.AddAuthorizationCore(options =>
|
|
{
|
|
options.AddPolicy(Policies.IsAdmin, ExtensionMethods.IsAdminPolicy());
|
|
options.AddPolicy(Policies.IsUser, ExtensionMethods.IsUserPolicy());
|
|
options.AddPolicy(Policies.IsModerator, ExtensionMethods.IsUserModeratorPolicy());
|
|
})
|
|
.AddTransient<AppStatusService>();
|
|
builder.Services.AddBlazoredLocalStorage(config =>
|
|
{
|
|
config.JsonSerializerOptions.WriteIndented = false;
|
|
config.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
|
|
config.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
|
|
config.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
|
|
config.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
|
config.JsonSerializerOptions.TypeInfoResolver = SUtility.DefaultSerializer.TypeInfoResolver;
|
|
})
|
|
.AddScoped<TokenAuthStateProvider>()
|
|
.AddScoped<AuthenticationStateProvider>(provider => provider.GetRequiredService<TokenAuthStateProvider>())
|
|
.AddScoped<RequestStats>()
|
|
.AddScoped<AuthService>()
|
|
.AddScoped<TimelineService>()
|
|
.AddScoped<FeedMemory>()
|
|
.AddScoped<StatusService>()
|
|
.AddScoped<AccountService>()
|
|
.AddScoped<PortabilityService>()
|
|
.AddScoped<AdminService>()
|
|
.AddScoped<InstanceAdminService>()
|
|
.AddScoped<AboutService>()
|
|
.AddScoped<AnnouncementService>()
|
|
.AddScoped<ArchiveService>()
|
|
.AddScoped<ListService>()
|
|
.AddScoped<FilterService>()
|
|
.AddScoped<DiscoveryService>()
|
|
.AddScoped<StreamingService>()
|
|
.AddScoped<PublicNoticeService>()
|
|
.AddScoped<ConfirmService>()
|
|
.AddScoped<OverlayService>()
|
|
.AddScoped<MediaService>()
|
|
.AddScoped<GroupService>()
|
|
.AddScoped<InstanceService>()
|
|
.AddScoped<ProvenanceService>()
|
|
.AddScoped<ILoggingService, LoggingService>()
|
|
.AddScoped<ToastService>()
|
|
.AddSingleton(typeof(CoalescingStringLocalizer))
|
|
.AddTransient<IHttpService, HttpService>()
|
|
.AddHeadElementHelper(options => options.DisableClientScriptAutoInjection = true)
|
|
.AddLocalization()
|
|
.AddLogging(lb => lb.SetMinimumLevel(LogLevel.Debug));
|
|
|
|
var apiBaseAddress = builder.Configuration["AppConfiguration:ApiBaseAddress"];
|
|
builder.Services.AddHttpClient("default", client =>
|
|
{
|
|
client.BaseAddress = new Uri(string.IsNullOrEmpty(apiBaseAddress) ? builder.HostEnvironment.BaseAddress : apiBaseAddress.TrimEnd('/') + "/");
|
|
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
|
// each request has its own timeout (HttpService.Measure): an upload may take minutes, anything else 100 s
|
|
client.Timeout = Timeout.InfiniteTimeSpan;
|
|
});
|
|
|
|
builder.Services.AddSingleton(serviceProvider =>
|
|
{
|
|
var conf = serviceProvider.GetRequiredService<IConfiguration>();
|
|
return conf.GetSection(nameof(AppConfiguration)).Get<AppConfiguration>();
|
|
});
|
|
|
|
var host = builder.Build();
|
|
await host.SetDefaultCulture();
|
|
await host.RunAsync(); |