fix issues updating avatar (#870)

This commit is contained in:
slothful-vassal
2026-03-10 18:00:38 +01:00
committed by GitHub
parent c9acf8ad91
commit 4b1dc784c9
3 changed files with 65 additions and 12 deletions

View File

@@ -99,6 +99,7 @@ func registerMigrations(app *pocketbase.PocketBase) {
func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceManager) { func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceManager) {
app.OnRecordAfterCreateSuccess("users").BindFunc(createUserHandler(client)) app.OnRecordAfterCreateSuccess("users").BindFunc(createUserHandler(client))
app.OnRecordAfterUpdateSuccess("users").BindFunc(updateUserHandler(client))
app.OnRecordAfterCreateSuccess("trails").BindFunc(createTrailHandler(client)) app.OnRecordAfterCreateSuccess("trails").BindFunc(createTrailHandler(client))
app.OnRecordAfterUpdateSuccess("trails").BindFunc(updateTrailHandler(client)) app.OnRecordAfterUpdateSuccess("trails").BindFunc(updateTrailHandler(client))
@@ -224,6 +225,47 @@ func createUserHandler(client meilisearch.ServiceManager) func(e *core.RecordEve
} }
} }
func updateUserHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error {
return func(e *core.RecordEvent) error {
actor, err := e.App.FindFirstRecordByData("activitypub_actors", "user", e.Record.Id)
if err != nil {
return e.Next()
}
icon := ""
origin := os.Getenv("ORIGIN")
if origin != "" && e.Record.GetString("avatar") != "" {
icon = fmt.Sprintf("%s/api/v1/files/_pb_users_auth_/%s/%s", origin, e.Record.Id, e.Record.GetString("avatar"))
}
actor.Set("icon", icon)
if err := e.App.Save(actor); err != nil {
return err
}
trails, err := e.App.FindRecordsByFilter("trails", "author={:author}", "", -1, 0, dbx.Params{"author": actor.Id})
if err != nil {
return err
}
if len(trails) > 0 {
if err := util.IndexTrails(e.App, trails, client); err != nil {
return err
}
}
lists, err := e.App.FindRecordsByFilter("lists", "author={:author}", "", -1, 0, dbx.Params{"author": actor.Id})
if err != nil {
return err
}
if len(lists) > 0 {
if err := util.IndexLists(e.App, lists, client); err != nil {
return err
}
}
return e.Next()
}
}
func createDefaultUserSettings(app core.App, userId string) error { func createDefaultUserSettings(app core.App, userId string) error {
collection, err := app.FindCollectionByNameOrId("settings") collection, err := app.FindCollectionByNameOrId("settings")
if err != nil { if err != nil {

View File

@@ -20,6 +20,7 @@
} }
let { user }: Props = $props(); let { user }: Props = $props();
const navUser = $derived($currentUser ?? user);
let navBarItems = [ let navBarItems = [
{ text: "Home", value: "/" }, { text: "Home", value: "/" },
@@ -139,7 +140,7 @@
</div> </div>
<hr class="my-6 border-input-border" /> <hr class="my-6 border-input-border" />
<div class="flex flex-col basis-full"> <div class="flex flex-col basis-full">
{#if user} {#if navUser}
<a class="btn-primary text-center mx-4" href="/trail/edit/new" <a class="btn-primary text-center mx-4" href="/trail/edit/new"
><i class="fa fa-plus mr-2"></i>{$_("new-trail")}</a ><i class="fa fa-plus mr-2"></i>{$_("new-trail")}</a
> >
@@ -148,26 +149,26 @@
<div class="flex gap-4 items-center justify-between m-4"> <div class="flex gap-4 items-center justify-between m-4">
<a <a
class="shrink-0" class="shrink-0"
href="/profile/@{user.username.toLowerCase()}" href="/profile/@{navUser.username.toLowerCase()}"
> >
<img <img
class="rounded-full w-10 aspect-square" class="rounded-full w-10 aspect-square"
src={getFileURL(user, user.avatar) || src={getFileURL(navUser, navUser.avatar) ||
`https://api.dicebear.com/7.x/initials/svg?seed=${user.username.toLowerCase()}&backgroundType=gradientLinear`} `https://api.dicebear.com/7.x/initials/svg?seed=${navUser.username.toLowerCase()}&backgroundType=gradientLinear`}
alt="avatar" alt="avatar"
/> />
</a> </a>
<a <a
href="/profile/@{user.username.toLowerCase()}" href="/profile/@{navUser.username.toLowerCase()}"
style="width: calc(100% - 104px)" style="width: calc(100% - 104px)"
> >
<p class="text-sm overflow-hidden text-ellipsis"> <p class="text-sm overflow-hidden text-ellipsis">
{user.username} {navUser.username}
</p> </p>
<p <p
class="text-sm text-gray-500 overflow-hidden text-ellipsis" class="text-sm text-gray-500 overflow-hidden text-ellipsis"
> >
{user.email} {navUser.email}
</p> </p>
</a> </a>
<button <button
@@ -210,7 +211,7 @@
<a class="font-semibold z-10" href={item.value}>{item.text}</a> <a class="font-semibold z-10" href={item.value}>{item.text}</a>
{/each} {/each}
</menu> </menu>
{#if user} {#if navUser}
<div class="hidden lg:flex gap-6 items-center"> <div class="hidden lg:flex gap-6 items-center">
<button <button
aria-label="Toggle theme" aria-label="Toggle theme"
@@ -257,8 +258,8 @@
> >
<img <img
class="rounded-full w-full h-full" class="rounded-full w-full h-full"
src={getFileURL(user, user.avatar) || src={getFileURL(navUser, navUser.avatar) ||
`https://api.dicebear.com/7.x/initials/svg?seed=${user.username.toLowerCase()}&backgroundType=gradientLinear`} `https://api.dicebear.com/7.x/initials/svg?seed=${navUser.username.toLowerCase()}&backgroundType=gradientLinear`}
alt="avatar" alt="avatar"
/> />
</button> </button>

View File

@@ -139,7 +139,17 @@ export async function users_update(user: User | { [K in keyof User]?: User[K] },
} }
const model: User = await r.json(); const model: User = await r.json();
currentUser.set(model); const existing = get(currentUser);
const merged: User = {
...(existing ?? {}),
...model,
} as User;
if (!(merged as any).actor && (existing as any)?.actor) {
(merged as any).actor = (existing as any).actor;
}
currentUser.set(merged);
} }
export async function users_delete(user: User) { export async function users_delete(user: User) {