diff --git a/Foxnouns.Backend/Controllers/MembersController.cs b/Foxnouns.Backend/Controllers/MembersController.cs index 968b571..ba9cf28 100644 --- a/Foxnouns.Backend/Controllers/MembersController.cs +++ b/Foxnouns.Backend/Controllers/MembersController.cs @@ -303,8 +303,8 @@ public class MembersController( .SetProperty(u => u.LastActive, clock.GetCurrentInstant()) ); - // Fetch the new sid then pass that to RenderMember - var newSid = await db.Members.Where(m => m.Id == member.Id).Select(m => m.Sid).FirstAsync(); - return Ok(memberRenderer.RenderMember(member, CurrentToken, newSid)); + // Re-fetch member to fetch the new sid + var updatedMember = await db.ResolveMemberAsync(CurrentUser!.Id, memberRef); + return Ok(memberRenderer.RenderMember(updatedMember, CurrentToken)); } } diff --git a/Foxnouns.Backend/Controllers/UsersController.cs b/Foxnouns.Backend/Controllers/UsersController.cs index 2693bef..1d85c77 100644 --- a/Foxnouns.Backend/Controllers/UsersController.cs +++ b/Foxnouns.Backend/Controllers/UsersController.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using Coravel.Mailer.Mail.Helpers; using Coravel.Queuing.Interfaces; using EntityFramework.Exceptions.Common; using Foxnouns.Backend.Database; @@ -117,42 +116,6 @@ public class UsersController( if (req.HasProperty(nameof(req.Avatar))) errors.Add(("avatar", ValidationUtils.ValidateAvatar(req.Avatar))); - if (req.HasProperty(nameof(req.MemberTitle))) - { - if (string.IsNullOrEmpty(req.MemberTitle)) - { - user.MemberTitle = null; - } - else - { - errors.Add(("member_title", ValidationUtils.ValidateDisplayName(req.MemberTitle))); - user.MemberTitle = req.MemberTitle; - } - } - - if (req.HasProperty(nameof(req.MemberListHidden))) - user.ListHidden = req.MemberListHidden == true; - - if (req.HasProperty(nameof(req.Timezone))) - { - if (string.IsNullOrEmpty(req.Timezone)) - { - user.Timezone = null; - } - else - { - if (TimeZoneInfo.TryFindSystemTimeZoneById(req.Timezone, out _)) - user.Timezone = req.Timezone; - else - errors.Add( - ( - "timezone", - ValidationError.GenericValidationError("Invalid timezone", req.Timezone) - ) - ); - } - } - ValidationUtils.Validate(errors); // This is fired off regardless of whether the transaction is committed // (atomic operations are hard when combined with background jobs) @@ -290,9 +253,6 @@ public class UsersController( public Pronoun[]? Pronouns { get; init; } public Field[]? Fields { get; init; } public Snowflake[]? Flags { get; init; } - public string? MemberTitle { get; init; } - public bool? MemberListHidden { get; init; } - public string? Timezone { get; init; } } [HttpGet("@me/settings")] @@ -346,20 +306,13 @@ public class UsersController( .SetProperty(u => u.LastActive, clock.GetCurrentInstant()) ); - // Get the user's new sid - var newSid = await db - .Users.Where(u => u.Id == CurrentUser.Id) - .Select(u => u.Sid) - .FirstAsync(); - var user = await db.ResolveUserAsync(CurrentUser.Id); return Ok( await userRenderer.RenderUserAsync( - CurrentUser, + user, CurrentUser, CurrentToken, - renderMembers: false, - overrideSid: newSid + renderMembers: false ) ); } diff --git a/Foxnouns.Backend/Database/Migrations/20241124201309_AddUserTimezone.cs b/Foxnouns.Backend/Database/Migrations/20241124201309_AddUserTimezone.cs deleted file mode 100644 index e317f65..0000000 --- a/Foxnouns.Backend/Database/Migrations/20241124201309_AddUserTimezone.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Foxnouns.Backend.Database.Migrations -{ - /// - [DbContext(typeof(DatabaseContext))] - [Migration("20241124201309_AddUserTimezone")] - public partial class AddUserTimezone : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "timezone", - table: "users", - type: "text", - nullable: true - ); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn(name: "timezone", table: "users"); - } - } -} diff --git a/Foxnouns.Backend/Database/Migrations/DatabaseContextModelSnapshot.cs b/Foxnouns.Backend/Database/Migrations/DatabaseContextModelSnapshot.cs index d012fe0..e1e05c2 100644 --- a/Foxnouns.Backend/Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/Foxnouns.Backend/Database/Migrations/DatabaseContextModelSnapshot.cs @@ -434,10 +434,6 @@ namespace Foxnouns.Backend.Database.Migrations .HasColumnName("sid") .HasDefaultValueSql("find_free_user_sid()"); - b.Property("Timezone") - .HasColumnType("text") - .HasColumnName("timezone"); - b.Property("Username") .IsRequired() .HasColumnType("text") diff --git a/Foxnouns.Backend/Database/Models/User.cs b/Foxnouns.Backend/Database/Models/User.cs index 367e293..c8c12c5 100644 --- a/Foxnouns.Backend/Database/Models/User.cs +++ b/Foxnouns.Backend/Database/Models/User.cs @@ -15,7 +15,6 @@ public class User : BaseModel public string? Avatar { get; set; } public string[] Links { get; set; } = []; public bool ListHidden { get; set; } - public string? Timezone { get; set; } public List Names { get; set; } = []; public List Pronouns { get; set; } = []; diff --git a/Foxnouns.Backend/Properties/launchSettings.json b/Foxnouns.Backend/Properties/launchSettings.json index b9e2ace..b680651 100644 --- a/Foxnouns.Backend/Properties/launchSettings.json +++ b/Foxnouns.Backend/Properties/launchSettings.json @@ -4,7 +4,6 @@ "Development": { "commandName": "Project", "dotnetRunMessages": true, - "hotReloadEnabled": false, "launchBrowser": false, "externalUrlConfiguration": true, "environmentVariables": { @@ -14,7 +13,6 @@ "Production": { "commandName": "Project", "dotnetRunMessages": true, - "hotReloadEnabled": false, "launchBrowser": false, "externalUrlConfiguration": true, "environmentVariables": { diff --git a/Foxnouns.Backend/Services/MemberRendererService.cs b/Foxnouns.Backend/Services/MemberRendererService.cs index 717f06c..7d7cac0 100644 --- a/Foxnouns.Backend/Services/MemberRendererService.cs +++ b/Foxnouns.Backend/Services/MemberRendererService.cs @@ -24,17 +24,13 @@ public class MemberRendererService(DatabaseContext db, Config config) return members.Select(m => RenderPartialMember(m, renderUnlisted)); } - public MemberResponse RenderMember( - Member member, - Token? token = null, - string? overrideSid = null - ) + public MemberResponse RenderMember(Member member, Token? token = null) { var renderUnlisted = token?.UserId == member.UserId && token.HasScope("user.read_hidden"); return new MemberResponse( member.Id, - overrideSid ?? member.Sid, + member.Sid, member.Name, member.DisplayName ?? member.Name, member.Bio, diff --git a/Foxnouns.Backend/Services/UserRendererService.cs b/Foxnouns.Backend/Services/UserRendererService.cs index 2911dd3..c6f9e5b 100644 --- a/Foxnouns.Backend/Services/UserRendererService.cs +++ b/Foxnouns.Backend/Services/UserRendererService.cs @@ -4,7 +4,6 @@ using Foxnouns.Backend.Utils; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using NodaTime; -using Org.BouncyCastle.Ocsp; namespace Foxnouns.Backend.Services; @@ -20,7 +19,6 @@ public class UserRendererService( Token? token = null, bool renderMembers = true, bool renderAuthMethods = false, - string? overrideSid = null, CancellationToken ct = default ) { @@ -51,16 +49,9 @@ public class UserRendererService( .ToListAsync(ct) : []; - int? utcOffset = null; - if ( - user.Timezone != null - && TimeZoneInfo.TryFindSystemTimeZoneById(user.Timezone, out var tz) - ) - utcOffset = (int)tz.GetUtcOffset(DateTimeOffset.UtcNow).TotalSeconds; - return new UserResponse( user.Id, - overrideSid ?? user.Sid, + user.Sid, user.Username, user.DisplayName, user.Bio, @@ -72,7 +63,6 @@ public class UserRendererService( user.Fields, user.CustomPreferences, flags.Select(f => RenderPrideFlag(f.PrideFlag)), - utcOffset, user.Role, renderMembers ? members.Select(m => memberRenderer.RenderPartialMember(m, tokenHidden)) @@ -80,8 +70,7 @@ public class UserRendererService( renderAuthMethods ? authMethods.Select(RenderAuthMethod) : null, tokenHidden ? user.ListHidden : null, tokenHidden ? user.LastActive : null, - tokenHidden ? user.LastSidReroll : null, - tokenHidden ? user.Timezone ?? "" : null + tokenHidden ? user.LastSidReroll : null ); } @@ -126,7 +115,6 @@ public class UserRendererService( IEnumerable Fields, Dictionary CustomPreferences, IEnumerable Flags, - int? UtcOffset, [property: JsonConverter(typeof(ScreamingSnakeCaseEnumConverter))] UserRole Role, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] IEnumerable? Members, @@ -136,8 +124,7 @@ public class UserRendererService( bool? MemberListHidden, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] Instant? LastActive, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - Instant? LastSidReroll, - [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] string? Timezone + Instant? LastSidReroll ); public record AuthMethodResponse( diff --git a/Foxnouns.Frontend/.env.example b/Foxnouns.Frontend/.env.example index d79c672..d3d5832 100644 --- a/Foxnouns.Frontend/.env.example +++ b/Foxnouns.Frontend/.env.example @@ -1,7 +1,5 @@ # Example .env file--DO NOT EDIT PUBLIC_LANGUAGE=en -PUBLIC_BASE_URL=https://pronouns.cc -PUBLIC_SHORT_URL=https://prns.cc PUBLIC_API_BASE=https://pronouns.cc/api PRIVATE_API_HOST=http://localhost:5003/api PRIVATE_INTERNAL_API_HOST=http://localhost:5000/api diff --git a/Foxnouns.Frontend/package.json b/Foxnouns.Frontend/package.json index 142b442..69d4a1f 100644 --- a/Foxnouns.Frontend/package.json +++ b/Foxnouns.Frontend/package.json @@ -38,11 +38,9 @@ "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee", "dependencies": { "@fontsource/firago": "^5.1.0", - "base64-arraybuffer": "^1.0.2", "bootstrap-icons": "^1.11.3", "luxon": "^3.5.0", "markdown-it": "^14.1.0", - "pretty-bytes": "^6.1.1", "sanitize-html": "^2.13.1", "tslog": "^4.9.3" } diff --git a/Foxnouns.Frontend/pnpm-lock.yaml b/Foxnouns.Frontend/pnpm-lock.yaml index d35d2ed..d9bd974 100644 --- a/Foxnouns.Frontend/pnpm-lock.yaml +++ b/Foxnouns.Frontend/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@fontsource/firago': specifier: ^5.1.0 version: 5.1.0 - base64-arraybuffer: - specifier: ^1.0.2 - version: 1.0.2 bootstrap-icons: specifier: ^1.11.3 version: 1.11.3 @@ -23,9 +20,6 @@ importers: markdown-it: specifier: ^14.1.0 version: 14.1.0 - pretty-bytes: - specifier: ^6.1.1 - version: 6.1.1 sanitize-html: specifier: ^2.13.1 version: 2.13.1 @@ -710,10 +704,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-arraybuffer@1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} - bootstrap-icons@1.11.3: resolution: {integrity: sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==} @@ -1221,10 +1211,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1952,8 +1938,6 @@ snapshots: balanced-match@1.0.2: {} - base64-arraybuffer@1.0.2: {} - bootstrap-icons@1.11.3: {} bootstrap@5.3.3(@popperjs/core@2.11.8): @@ -2448,8 +2432,6 @@ snapshots: prettier@3.3.3: {} - pretty-bytes@6.1.1: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} diff --git a/Foxnouns.Frontend/src/lib/api/models/user.ts b/Foxnouns.Frontend/src/lib/api/models/user.ts index e32873e..715cf46 100644 --- a/Foxnouns.Frontend/src/lib/api/models/user.ts +++ b/Foxnouns.Frontend/src/lib/api/models/user.ts @@ -1,6 +1,5 @@ export type PartialUser = { id: string; - sid: string; username: string; display_name: string | null; avatar_url: string | null; @@ -15,20 +14,17 @@ export type User = PartialUser & { pronouns: Pronoun[]; fields: Field[]; flags: PrideFlag[]; - utc_offset: number | null; role: "USER" | "MODERATOR" | "ADMIN"; }; export type MeUser = UserWithMembers & { - members: PartialMember[]; auth_methods: AuthMethod[]; member_list_hidden: boolean; last_active: string; last_sid_reroll: string; - timezone: string; }; -export type UserWithMembers = User & { members: PartialMember[] | null }; +export type UserWithMembers = User & { members: PartialMember[] }; export type UserWithHiddenFields = User & { auth_methods?: unknown[]; @@ -42,7 +38,6 @@ export type UserSettings = { export type PartialMember = { id: string; - sid: string; name: string; display_name: string; bio: string | null; diff --git a/Foxnouns.Frontend/src/lib/components/Avatar.svelte b/Foxnouns.Frontend/src/lib/components/Avatar.svelte index 99dd8f3..99a5608 100644 --- a/Foxnouns.Frontend/src/lib/components/Avatar.svelte +++ b/Foxnouns.Frontend/src/lib/components/Avatar.svelte @@ -1,23 +1,14 @@ - - diff --git a/Foxnouns.Frontend/src/lib/components/Paginator.svelte b/Foxnouns.Frontend/src/lib/components/Paginator.svelte deleted file mode 100644 index 07cbd8d..0000000 --- a/Foxnouns.Frontend/src/lib/components/Paginator.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -{#if pageCount > 1} -
- - - - - - - - {#each new Array(pageCount) as _, page} - - {page + 1} - - {/each} - - - - - - - -
-{/if} diff --git a/Foxnouns.Frontend/src/lib/components/editor/AvatarEditor.svelte b/Foxnouns.Frontend/src/lib/components/editor/AvatarEditor.svelte deleted file mode 100644 index 05a9a62..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/AvatarEditor.svelte +++ /dev/null @@ -1,80 +0,0 @@ - - -

- -

- - - - - - - - -{#if updated} -

- - {$t("edit-profile.avatar-updated")} -

-{/if} - -{#if avatarTooLarge} -

- - {$t("edit-profile.file-too-large", { - max: prettyBytes(MAX_AVATAR_BYTES), - current: prettyBytes(avatar.length), - })} -

-{/if} diff --git a/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte b/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte deleted file mode 100644 index 8c7e744..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -

- {$t("edit-profile.bio-length-hint", { - length: value.length, - maxLength, - })} -

- -{#if value !== ""} -
-
{$t("edit-profile.preview")}
-
{@html renderMarkdown(value)}
-
-{/if} diff --git a/Foxnouns.Frontend/src/lib/components/editor/FormStatusMarker.svelte b/Foxnouns.Frontend/src/lib/components/editor/FormStatusMarker.svelte deleted file mode 100644 index 43ca9b9..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/FormStatusMarker.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -{#if form?.error} - -{:else if form?.ok} -

- - {$t("edit-profile.saved-changes")} -

-{/if} diff --git a/Foxnouns.Frontend/src/lib/components/editor/NoscriptWarning.svelte b/Foxnouns.Frontend/src/lib/components/editor/NoscriptWarning.svelte deleted file mode 100644 index 4bddf68..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/NoscriptWarning.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/Foxnouns.Frontend/src/lib/components/editor/ShortNoscriptWarning.svelte b/Foxnouns.Frontend/src/lib/components/editor/ShortNoscriptWarning.svelte deleted file mode 100644 index fb474db..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/ShortNoscriptWarning.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/Foxnouns.Frontend/src/lib/components/editor/SidEditor.svelte b/Foxnouns.Frontend/src/lib/components/editor/SidEditor.svelte deleted file mode 100644 index 1547ff2..0000000 --- a/Foxnouns.Frontend/src/lib/components/editor/SidEditor.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - -{$t("edit-profile.sid-current")} {sid} - - - - - -

- - {$t("edit-profile.sid-hint")} -

diff --git a/Foxnouns.Frontend/src/lib/components/profile/user/MemberCard.svelte b/Foxnouns.Frontend/src/lib/components/profile/user/MemberCard.svelte index d77de02..7d1bdc7 100644 --- a/Foxnouns.Frontend/src/lib/components/profile/user/MemberCard.svelte +++ b/Foxnouns.Frontend/src/lib/components/profile/user/MemberCard.svelte @@ -35,15 +35,11 @@
- +

- {member.display_name} + {member.name} {#if pronouns}
diff --git a/Foxnouns.Frontend/src/lib/i18n/locales/en.json b/Foxnouns.Frontend/src/lib/i18n/locales/en.json index 7f1e377..abc4d85 100644 --- a/Foxnouns.Frontend/src/lib/i18n/locales/en.json +++ b/Foxnouns.Frontend/src/lib/i18n/locales/en.json @@ -1,136 +1,91 @@ { - "hello": "Hello, {{name}}!", - "nav": { - "log-in": "Log in or sign up", - "settings": "Settings" - }, - "avatar-tooltip": "Avatar for {{name}}", - "profile": { - "edit-member-profile-notice": "You are currently viewing the public profile of {{memberName}}.", - "edit-user-profile-notice": "You are currently viewing your public profile.", - "edit-profile-link": "Edit profile", - "names-header": "Names", - "pronouns-header": "Pronouns", - "default-members-header": "Members", - "create-member-button": "Create member", - "back-to-user": "Back to {{name}}" - }, - "title": { - "log-in": "Log in", - "welcome": "Welcome", - "settings": "Settings" - }, - "auth": { - "log-in-form-title": "Log in with email", - "log-in-form-email-label": "Email address", - "log-in-form-password-label": "Password", - "register-with-email-button": "Register with email", - "log-in-button": "Log in", - "log-in-3rd-party-header": "Log in with another service", - "log-in-3rd-party-desc": "If you prefer, you can also log in with one of these services:", - "log-in-with-discord": "Log in with Discord", - "log-in-with-google": "Log in with Google", - "log-in-with-tumblr": "Log in with Tumblr", - "log-in-with-the-fediverse": "Log in with the Fediverse", - "remote-fediverse-account-label": "Your Fediverse account", - "register-username-label": "Username", - "register-button": "Register account", - "register-with-mastodon": "Register with a Fediverse account", - "log-in-with-fediverse-error-blurb": "Is your instance returning an error?", - "log-in-with-fediverse-force-refresh-button": "Force a refresh on our end" - }, - "error": { - "bad-request-header": "Something was wrong with your input", - "generic-header": "Something went wrong", - "raw-header": "Raw error", - "authentication-error": "Something went wrong when logging you in.", - "bad-request": "Your input was rejected by the server, please check for any mistakes and try again.", - "forbidden": "You are not allowed to perform that action.", - "internal-server-error": "Server experienced an internal error, please try again later.", - "authentication-required": "You need to log in first.", - "missing-scopes": "The current token is missing a required scope. Did you manually edit your cookies?", - "generic-error": "An unknown error occurred.", - "user-not-found": "User not found, please check your spelling and try again. Remember that usernames are case sensitive.", - "member-not-found": "Member not found, please check your spelling and try again.", - "account-already-linked": "This account is already linked with a pronouns.cc account.", - "last-auth-method": "You cannot remove your last authentication method.", - "validation-max-length-error": "Value is too long, maximum length is {{max}}, current length is {{actual}}.", - "validation-min-length-error": "Value is too long, minimum length is {{min}}, current length is {{actual}}.", - "validation-disallowed-value-1": "The following value is not allowed here", - "validation-disallowed-value-2": "Allowed values are", - "validation-reason": "Reason", - "validation-generic": "The value you entered is not allowed here. Reason", - "extra-info-header": "Extra error information", - "noscript-title": "This page requires JavaScript", - "noscript-info": "This page requires JavaScript to function correctly. Some buttons may not work, or the page may not work at all.", - "noscript-short": "Requires JavaScript" - }, - "settings": { - "general-information-tab": "General information", - "your-profile-tab": "Your profile", - "members-tab": "Members", - "authentication-tab": "Authentication", - "export-tab": "Export your data", - "change-username-button": "Change username", - "username-change-hint": "Changing your username will make any existing links to your or your members' profiles invalid.\nYour username must be unique, be at most 40 characters long, and only contain letters from the basic English alphabet, dashes, underscores, and periods. Your username is used as part of your profile link, you can set a separate display name.", - "username-update-error": "Could not update your username as the new username is invalid:\n{{message}}", - "change-avatar-link": "Change your avatar here", - "new-username": "New username", - "table-role": "Role", - "table-custom-preferences": "Custom preferences", - "table-member-list-hidden": "Member list hidden?", - "table-member-count": "Member count", - "table-created-at": "Account created at", - "table-id": "Your ID", - "table-title": "Account information", - "force-log-out-title": "Log out everywhere", - "force-log-out-button": "Force log out", - "force-log-out-hint": "If you think one of your tokens might have been compromised, you can log out on all devices by clicking this button.", - "log-out-title": "Log out", - "log-out-hint": "Use this button to log out on this device only.", - "log-out-button": "Log out", - "avatar": "Avatar", - "username-update-success": "Successfully changed your username!", - "create-member-title": "Create a new member", - "create-member-name-label": "Member name" - }, - "yes": "Yes", - "no": "No", - "edit-profile": { - "user-header": "Editing your profile", - "general-tab": "General", - "names-pronouns-tab": "Names & pronouns", - "file-too-large": "This file is too large, please resize it (maximum is {{max}}, the file you're trying to upload is {{current}})", - "sid-current": "Current short ID:", - "sid": "Short ID", - "sid-reroll": "Reroll short ID", - "sid-hint": "This ID is used in prns.cc links. You can reroll one short ID every hour (shared between your main profile and all members) by pressing the button above.", - "sid-copy": "Copy short link", - "update-avatar": "Update avatar", - "avatar-updated": "Avatar updated! It might take a moment to be reflected on your profile.", - "member-header-label": "\"Members\" header text", - "member-header-info": "This is the text used for the \"Members\" heading. If you leave it blank, the default text will be used.", - "hide-member-list-label": "Hide member list", - "timezone-label": "Timezone", - "timezone-preview": "This will show up on your profile like this:", - "timezone-info": "This is optional. Your timezone is never shared directly, only the difference between UTC and your current timezone is.", - "hide-member-list-info": "This only hides your member list. Individual members will still be visible to anyone with a direct link to their pages.", - "profile-options-header": "Profile options", - "bio-tab": "Bio", - "saved-changes": "Successfully saved changes!", - "bio-length-hint": "Using {{length}}/{{maxLength}} characters", - "preview": "Preview", - "fields-tab": "Fields", - "flags-links-tab": "Flags & links", - "back-to-settings-tab": "Back to settings", - "member-header": "Editing member {{name}}", - "username": "Username", - "change-username-info": "As changing your username will also change all of your members' links, you can only change it in your account settings.", - "change-username-link": "Go to settings", - "member-name": "Name", - "change-member-name": "Change name", - "display-name": "Display name" - }, - "save-changes": "Save changes", - "change": "Change" + "hello": "Hello, {{name}}!", + "nav": { + "log-in": "Log in or sign up", + "settings": "Settings" + }, + "avatar-tooltip": "Avatar for {{name}}", + "profile": { + "edit-member-profile-notice": "You are currently viewing the public profile of {memberName}.", + "edit-user-profile-notice": "You are currently viewing your public profile.", + "edit-profile-link": "Edit profile", + "names-header": "Names", + "pronouns-header": "Pronouns", + "default-members-header": "Members", + "create-member-button": "Create member" + }, + "title": { + "log-in": "Log in", + "welcome": "Welcome", + "settings": "Settings" + }, + "auth": { + "log-in-form-title": "Log in with email", + "log-in-form-email-label": "Email address", + "log-in-form-password-label": "Password", + "register-with-email-button": "Register with email", + "log-in-button": "Log in", + "log-in-3rd-party-header": "Log in with another service", + "log-in-3rd-party-desc": "If you prefer, you can also log in with one of these services:", + "log-in-with-discord": "Log in with Discord", + "log-in-with-google": "Log in with Google", + "log-in-with-tumblr": "Log in with Tumblr", + "log-in-with-the-fediverse": "Log in with the Fediverse", + "remote-fediverse-account-label": "Your Fediverse account", + "register-username-label": "Username", + "register-button": "Register account", + "register-with-mastodon": "Register with a Fediverse account", + "log-in-with-fediverse-error-blurb": "Is your instance returning an error?", + "log-in-with-fediverse-force-refresh-button": "Force a refresh on our end" + }, + "error": { + "bad-request-header": "Something was wrong with your input", + "generic-header": "Something went wrong", + "raw-header": "Raw error", + "authentication-error": "Something went wrong when logging you in.", + "bad-request": "Your input was rejected by the server, please check for any mistakes and try again.", + "forbidden": "You are not allowed to perform that action.", + "internal-server-error": "Server experienced an internal error, please try again later.", + "authentication-required": "You need to log in first.", + "missing-scopes": "The current token is missing a required scope. Did you manually edit your cookies?", + "generic-error": "An unknown error occurred.", + "user-not-found": "User not found, please check your spelling and try again. Remember that usernames are case sensitive.", + "member-not-found": "Member not found, please check your spelling and try again.", + "account-already-linked": "This account is already linked with a pronouns.cc account.", + "last-auth-method": "You cannot remove your last authentication method.", + "validation-max-length-error": "Value is too long, maximum length is {{max}}, current length is {{actual}}.", + "validation-min-length-error": "Value is too long, minimum length is {{min}}, current length is {{actual}}.", + "validation-disallowed-value-1": "The following value is not allowed here", + "validation-disallowed-value-2": "Allowed values are", + "validation-reason": "Reason", + "validation-generic": "The value you entered is not allowed here. Reason", + "extra-info-header": "Extra error information" + }, + "settings": { + "general-information-tab": "General information", + "your-profile-tab": "Your profile", + "members-tab": "Members", + "authentication-tab": "Authentication", + "export-tab": "Export your data", + "change-username-button": "Change username", + "username-change-hint": "Changing your username will make any existing links to your or your members' profiles invalid.\nYour username must be unique, be at most 40 characters long, and only contain letters from the basic English alphabet, dashes, underscores, and periods. Your username is used as part of your profile link, you can set a separate display name.", + "username-update-error": "Could not update your username as the new username is invalid:\n{{message}}", + "change-avatar-link": "Change your avatar here", + "new-username": "New username", + "table-role": "Role", + "table-custom-preferences": "Custom preferences", + "table-member-list-hidden": "Member list hidden?", + "table-member-count": "Member count", + "table-created-at": "Account created at", + "table-id": "Your ID", + "table-title": "Account information", + "force-log-out-title": "Log out everywhere", + "force-log-out-button": "Force log out", + "force-log-out-hint": "If you think one of your tokens might have been compromised, you can log out on all devices by clicking this button.", + "log-out-title": "Log out", + "log-out-hint": "Use this button to log out on this device only.", + "log-out-button": "Log out" + }, + "yes": "Yes", + "no": "No" } diff --git a/Foxnouns.Frontend/src/routes/+layout.server.ts b/Foxnouns.Frontend/src/routes/+layout.server.ts index 82f3cb2..00c3ef3 100644 --- a/Foxnouns.Frontend/src/routes/+layout.server.ts +++ b/Foxnouns.Frontend/src/routes/+layout.server.ts @@ -6,12 +6,10 @@ import log from "$lib/log"; import type { LayoutServerLoad } from "./$types"; export const load = (async ({ fetch, cookies }) => { - let token: string | null = null; let meUser: MeUser | null = null; if (cookies.get(TOKEN_COOKIE_NAME)) { try { meUser = await apiRequest("GET", "/users/@me", { fetch, cookies }); - token = cookies.get(TOKEN_COOKIE_NAME) || null; } catch (e) { if (e instanceof ApiError && e.code === ErrorCode.AuthenticationRequired) clearToken(cookies); else log.error("Could not fetch /users/@me and token has not expired:", e); @@ -19,5 +17,5 @@ export const load = (async ({ fetch, cookies }) => { } const meta = await apiRequest("GET", "/meta", { fetch, cookies }); - return { meta, meUser, token }; + return { meta, meUser }; }) satisfies LayoutServerLoad; diff --git a/Foxnouns.Frontend/src/routes/@[username]/+page.server.ts b/Foxnouns.Frontend/src/routes/@[username]/+page.server.ts index 99e7359..330bd21 100644 --- a/Foxnouns.Frontend/src/routes/@[username]/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/@[username]/+page.server.ts @@ -1,7 +1,5 @@ import { apiRequest } from "$api"; -import type { PartialMember, UserWithMembers } from "$api/models"; - -const MEMBERS_PER_PAGE = 20; +import type { UserWithMembers } from "$api/models"; export const load = async ({ params, fetch, cookies, url }) => { const user = await apiRequest("GET", `/users/${params.username}`, { @@ -10,20 +8,12 @@ export const load = async ({ params, fetch, cookies, url }) => { }); // Paginate members on the server side - let currentPage = 0; - let pageCount = 0; - let members: PartialMember[] = []; - if (user.members) { - currentPage = Number(url.searchParams.get("page") || "0"); - pageCount = Math.ceil(user.members.length / MEMBERS_PER_PAGE); - members = user.members.slice( - currentPage * MEMBERS_PER_PAGE, - (currentPage + 1) * MEMBERS_PER_PAGE, - ); - if (members.length === 0) { - members = user.members.slice(0, MEMBERS_PER_PAGE); - currentPage = 0; - } + let currentPage = Number(url.searchParams.get("page") || "0"); + const pageCount = Math.ceil(user.members.length / 20); + let members = user.members.slice(currentPage * 20, (currentPage + 1) * 20); + if (members.length === 0) { + members = user.members.slice(0, 20); + currentPage = 0; } return { user, members, currentPage, pageCount }; diff --git a/Foxnouns.Frontend/src/routes/@[username]/+page.svelte b/Foxnouns.Frontend/src/routes/@[username]/+page.svelte index 792df3f..0ed36cc 100644 --- a/Foxnouns.Frontend/src/routes/@[username]/+page.svelte +++ b/Foxnouns.Frontend/src/routes/@[username]/+page.svelte @@ -6,7 +6,7 @@ import ProfileFields from "$components/profile/ProfileFields.svelte"; import { t } from "$lib/i18n"; import { Icon } from "@sveltestrap/sveltestrap"; - import Paginator from "$components/Paginator.svelte"; + import Paginator from "./Paginator.svelte"; import MemberCard from "$components/profile/user/MemberCard.svelte"; type Props = { data: PageData }; @@ -25,7 +25,7 @@ {/if} - + {#if data.members.length > 0} @@ -34,27 +34,27 @@ {data.user.member_title || $t("profile.default-members-header")} {#if isMeUser} - + {$t("profile.create-member-button")} {/if} + -

{#each data.members as member (member.id)} {/each}
- +
+ +
{/if}
diff --git a/Foxnouns.Frontend/src/routes/@[username]/Paginator.svelte b/Foxnouns.Frontend/src/routes/@[username]/Paginator.svelte new file mode 100644 index 0000000..cf5aa54 --- /dev/null +++ b/Foxnouns.Frontend/src/routes/@[username]/Paginator.svelte @@ -0,0 +1,31 @@ + + +{#if pageCount > 1} + + + + + + + + + {currentPage + 1} + + + + + + + + +{/if} diff --git a/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.server.ts b/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.server.ts deleted file mode 100644 index f3f8400..0000000 --- a/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.server.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { apiRequest } from "$api"; -import type { Member } from "$api/models/member"; - -export const load = async ({ params, fetch, cookies }) => { - const member = await apiRequest( - "GET", - `/users/${params.username}/members/${params.memberName}`, - { - fetch, - cookies, - }, - ); - - return { member }; -}; diff --git a/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.svelte b/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.svelte deleted file mode 100644 index a69544a..0000000 --- a/Foxnouns.Frontend/src/routes/@[username]/[memberName]/+page.svelte +++ /dev/null @@ -1,40 +0,0 @@ - - - - {data.member.display_name} • @{data.member.user.username} • pronouns.cc - - - diff --git a/Foxnouns.Frontend/src/routes/settings/+layout.server.ts b/Foxnouns.Frontend/src/routes/settings/+layout.server.ts index fe2eaa3..a1ac93c 100644 --- a/Foxnouns.Frontend/src/routes/settings/+layout.server.ts +++ b/Foxnouns.Frontend/src/routes/settings/+layout.server.ts @@ -4,5 +4,5 @@ export const load = async ({ parent }) => { const data = await parent(); if (!data.meUser) redirect(303, "/auth/log-in"); - return { user: data.meUser!, token: data.token! }; + return { user: data.meUser! }; }; diff --git a/Foxnouns.Frontend/src/routes/settings/+page.svelte b/Foxnouns.Frontend/src/routes/settings/+page.svelte index cfd0b88..062d9e6 100644 --- a/Foxnouns.Frontend/src/routes/settings/+page.svelte +++ b/Foxnouns.Frontend/src/routes/settings/+page.svelte @@ -29,8 +29,7 @@ {#if form?.ok}

- - {$t("settings.username-update-success")} + Successfully changed your username!

{:else if usernameError}

@@ -47,7 +46,7 @@

-
{$t("settings.avatar")}
+
Avatar
{ - const { user } = await parent(); - - let currentPage = Number(url.searchParams.get("page") || "0"); - let pageCount = Math.ceil(user.members.length / MEMBERS_PER_PAGE); - let members = user.members.slice( - currentPage * MEMBERS_PER_PAGE, - (currentPage + 1) * MEMBERS_PER_PAGE, - ); - if (members.length === 0) { - members = user.members.slice(0, MEMBERS_PER_PAGE); - currentPage = 0; - } - - return { members, currentPage, pageCount }; -}; diff --git a/Foxnouns.Frontend/src/routes/settings/members/+page.svelte b/Foxnouns.Frontend/src/routes/settings/members/+page.svelte deleted file mode 100644 index 563cf90..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/+page.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - -

{$t("settings.members-tab")} ({data.user.members.length})

- - - - - {#if canCreateMember} - - - {$t("profile.create-member-button")} - - {/if} - {#each data.members as member (member.id)} - - - {member.display_name} - {#if member.display_name !== member.name}({member.name}){/if} - - {/each} - - - diff --git a/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout.server.ts b/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout.server.ts deleted file mode 100644 index 0cdf2e1..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout.server.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { apiRequest } from "$api"; -import ApiError from "$api/error"; -import type { Member } from "$api/models"; -import log from "$lib/log"; -import { redirect } from "@sveltejs/kit"; - -export const load = async ({ parent, params, fetch, cookies }) => { - const { meUser, token } = await parent(); - if (!meUser) redirect(303, "/"); - - try { - const member = await apiRequest("GET", `/users/@me/members/${params.id}`, { - fetch, - cookies, - }); - return { user: meUser, token: token!, member }; - } catch (e) { - if (e instanceof ApiError) throw e.obj; - log.error("Error trying to fetch member %s:", params.id, e); - throw e; - } -}; diff --git a/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout@.svelte b/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout@.svelte deleted file mode 100644 index a2539ab..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/[id]/+layout@.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - {$t("edit-profile.member-header", { name: data.member.name })} • pronouns.cc - - - diff --git a/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.server.ts b/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.server.ts deleted file mode 100644 index 7665014..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.server.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { apiRequest, fastRequest } from "$api"; -import ApiError, { ErrorCode, type RawApiError } from "$api/error"; -import type { Member } from "$api/models/member"; -import log from "$lib/log.js"; - -export const load = async ({ params, fetch, cookies }) => { - try { - const member = await apiRequest("GET", `/users/@me/members/${params.id}`, { - fetch, - cookies, - }); - return { member }; - } catch (e) { - if (e instanceof ApiError) throw e.obj; - log.error("Error trying to fetch member %s:", params.id, e); - throw e; - } -}; - -export const actions = { - changeName: async ({ params, request, fetch, cookies }) => { - const body = await request.formData(); - const name = body.get("name") as string | null; - if (!name) - return { - error: { - message: "You must pass a name.", - status: 403, - code: ErrorCode.BadRequest, - } as RawApiError, - ok: false, - }; - - try { - await fastRequest("PATCH", `/users/@me/members/${params.id}`, { - body: { name }, - fetch, - cookies, - }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error updating name for member %s:", params.id, e); - throw e; - } - }, - changeDisplayName: async ({ params, request, fetch, cookies }) => { - const body = await request.formData(); - let displayName = body.get("display-name") as string | null; - if (!displayName || displayName === "") displayName = null; - - try { - await fastRequest("PATCH", `/users/@me/members/${params.id}`, { - body: { display_name: displayName }, - fetch, - cookies, - }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error updating name for member %s:", params.id, e); - throw e; - } - }, - bio: async ({ params, request, fetch, cookies }) => { - const body = await request.formData(); - const bio = body.get("bio") as string | null; - - try { - await fastRequest("PATCH", `/users/@me/members/${params.id}`, { - body: { bio }, - fetch, - cookies, - }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error updating bio for member %s:", params.id, e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.svelte b/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.svelte deleted file mode 100644 index 174108e..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/[id]/+page.svelte +++ /dev/null @@ -1,115 +0,0 @@ - - -{#if error} - -{/if} - -{#if form} - -{/if} - -
-
-

{$t("settings.avatar")}

- -
-
-

{$t("edit-profile.member-name")}

-
- - - - -
- -

{$t("edit-profile.display-name")}

-
- - - - -
- -

{$t("edit-profile.sid")}

- -
-
-

{$t("edit-profile.bio-tab")}

-
- - -
-
diff --git a/Foxnouns.Frontend/src/routes/settings/members/new/+page.server.ts b/Foxnouns.Frontend/src/routes/settings/members/new/+page.server.ts deleted file mode 100644 index 3fdf2e0..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/new/+page.server.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { apiRequest } from "$api"; -import ApiError, { ErrorCode, type RawApiError } from "$api/error"; -import type { Member } from "$api/models/member"; -import log from "$lib/log.js"; -import { isRedirect, redirect } from "@sveltejs/kit"; - -export const actions = { - default: async ({ request, fetch, cookies }) => { - const body = await request.formData(); - const name = body.get("name") as string | null; - if (!name) - return { - error: { - message: "No name supplied.", - status: 403, - code: ErrorCode.BadRequest, - } as RawApiError, - }; - - try { - const member = await apiRequest("POST", "/users/@me/members", { - body: { name }, - fetch, - cookies, - }); - redirect(303, `/settings/members/${member.id}`); - } catch (e) { - if (isRedirect(e)) throw e; - if (e instanceof ApiError) return { error: e.obj }; - log.error("Could not create member:", e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/settings/members/new/+page.svelte b/Foxnouns.Frontend/src/routes/settings/members/new/+page.svelte deleted file mode 100644 index da17621..0000000 --- a/Foxnouns.Frontend/src/routes/settings/members/new/+page.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - -

{$t("settings.create-member-title")}

- -{#if form?.error} - -{/if} - -
-
- - -
- -
diff --git a/Foxnouns.Frontend/src/routes/settings/profile/+layout.server.ts b/Foxnouns.Frontend/src/routes/settings/profile/+layout.server.ts deleted file mode 100644 index 9d7ef68..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/+layout.server.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { redirect } from "@sveltejs/kit"; - -export const load = async ({ parent }) => { - const { meUser, token } = await parent(); - if (!meUser) redirect(303, "/"); - return { user: meUser!, token: token! }; -}; diff --git a/Foxnouns.Frontend/src/routes/settings/profile/+layout@.svelte b/Foxnouns.Frontend/src/routes/settings/profile/+layout@.svelte deleted file mode 100644 index 12c16d4..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/+layout@.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - {$t("edit-profile.user-header")} • pronouns.cc - - - diff --git a/Foxnouns.Frontend/src/routes/settings/profile/+page.server.ts b/Foxnouns.Frontend/src/routes/settings/profile/+page.server.ts deleted file mode 100644 index df356c4..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/+page.server.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { fastRequest } from "$api"; -import ApiError from "$api/error"; -import log from "$lib/log.js"; - -export const actions = { - options: async ({ request, fetch, cookies }) => { - const body = await request.formData(); - let memberTitle = body.get("member-title") as string | null; - if (!memberTitle || memberTitle === "") memberTitle = null; - - let timezone = body.get("timezone") as string | null; - if (!timezone || timezone === "") timezone = null; - - let hideMemberList = !!body.get("hide-member-list"); - - try { - await fastRequest("PATCH", "/users/@me", { - body: { timezone, member_title: memberTitle, member_list_hidden: hideMemberList }, - fetch, - cookies, - }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error patching user:", e); - throw e; - } - }, - changeDisplayName: async ({ request, fetch, cookies }) => { - const body = await request.formData(); - let displayName = body.get("display-name") as string | null; - if (!displayName || displayName === "") displayName = null; - - try { - await fastRequest("PATCH", "/users/@me", { - body: { display_name: displayName }, - fetch, - cookies, - }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error patching user:", e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/settings/profile/+page.svelte b/Foxnouns.Frontend/src/routes/settings/profile/+page.svelte deleted file mode 100644 index c603ab6..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/+page.svelte +++ /dev/null @@ -1,196 +0,0 @@ - - -{#if error} - -{/if} - -{#if form} -
- -
-{/if} - -
-
-

{$t("settings.avatar")}

- -
-
-

{$t("edit-profile.username")}

- -

- - {$t("edit-profile.change-username-info")} - {$t("edit-profile.change-username-link")} -

- -

{$t("edit-profile.display-name")}

-
- - - - -
- -

{$t("edit-profile.sid")}

- -
-
- -
-

{$t("edit-profile.profile-options-header")}

-
-
- - -

- - {$t("edit-profile.member-header-info")} -

-
-
- - - - - {#each validTimezones as timezone}{/each} - - - - {#if tz && tz !== "" && validTimezones.includes(tz)} -
- {$t("edit-profile.timezone-preview")} - - {currentTime} (UTC{displayTimezone}) -
- {/if} -

- - {$t("edit-profile.timezone-info")} -

-
-
- - -
-

- - {$t("edit-profile.hide-member-list-info")} -

-
- -
-
-
diff --git a/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.server.ts b/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.server.ts deleted file mode 100644 index bb86f7e..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.server.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { fastRequest } from "$api"; -import ApiError from "$api/error"; -import log from "$lib/log.js"; - -export const actions = { - default: async ({ request, fetch, cookies }) => { - const body = await request.formData(); - const bio = body.get("bio") as string | null; - - try { - await fastRequest("PATCH", "/users/@me", { body: { bio }, fetch, cookies }); - return { error: null, ok: true }; - } catch (e) { - if (e instanceof ApiError) return { error: e.obj, ok: false }; - log.error("Error updating bio:", e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.svelte b/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.svelte deleted file mode 100644 index 19e04fb..0000000 --- a/Foxnouns.Frontend/src/routes/settings/profile/bio/+page.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -

{$t("edit-profile.bio-tab")}

- -
- - diff --git a/package.json b/package.json index 60f2ca5..50681f6 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,7 @@ "concurrently": "^9.0.1" }, "scripts": { - "watch:be": "dotnet watch --no-hot-reload --project Foxnouns.Backend -- --migrate-and-start", - "dev": "concurrently -n .net,node,rate -c magenta,yellow,blue -i 'pnpm watch:be' 'cd Foxnouns.Frontend && pnpm dev' 'cd rate && go run -v .'", + "dev": "concurrently -n .net,node,rate -c magenta,yellow,blue -i 'cd Foxnouns.Backend && dotnet watch --no-hot-reload' 'cd Foxnouns.Frontend && pnpm dev' 'cd rate && go run -v .'", "format": "dotnet csharpier . && cd Foxnouns.Frontend && pnpm format" }, "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" diff --git a/rate/rate_limiter.go b/rate/rate_limiter.go index d223197..28368e2 100644 --- a/rate/rate_limiter.go +++ b/rate/rate_limiter.go @@ -134,12 +134,12 @@ func (l *Limiter) bucketLimiter(user, method, bucket string) *httprate.RateLimit func requestLimitFor(method string) (int, time.Duration) { switch strings.ToUpper(method) { case "PATCH", "POST": - return 3, time.Second + return 1, time.Second case "DELETE": - return 2, 5 * time.Second + return 1, 5 * time.Second case "GET": - return 10, time.Second + return 3, time.Second default: - return 5, time.Second + return 2, time.Second } }