diff --git a/db/main.go b/db/main.go index 33fe73a0..e5117d90 100644 --- a/db/main.go +++ b/db/main.go @@ -99,6 +99,7 @@ func registerMigrations(app *pocketbase.PocketBase) { func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceManager) { app.OnRecordAfterCreateSuccess("users").BindFunc(createUserHandler(client)) + app.OnRecordAfterUpdateSuccess("users").BindFunc(updateUserHandler(client)) app.OnRecordAfterCreateSuccess("trails").BindFunc(createTrailHandler(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 { collection, err := app.FindCollectionByNameOrId("settings") if err != nil { diff --git a/web/src/lib/components/nav_bar.svelte b/web/src/lib/components/nav_bar.svelte index a428587f..137402d2 100644 --- a/web/src/lib/components/nav_bar.svelte +++ b/web/src/lib/components/nav_bar.svelte @@ -20,6 +20,7 @@ } let { user }: Props = $props(); + const navUser = $derived($currentUser ?? user); let navBarItems = [ { text: "Home", value: "/" }, @@ -139,7 +140,7 @@
- {#if user} + {#if navUser} {$_("new-trail")} @@ -148,26 +149,26 @@
avatar

- {user.username} + {navUser.username}

- {user.email} + {navUser.email}

diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts index 05071f75..53363cb3 100644 --- a/web/src/lib/stores/user_store.ts +++ b/web/src/lib/stores/user_store.ts @@ -139,7 +139,17 @@ export async function users_update(user: User | { [K in keyof User]?: User[K] }, } 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) { @@ -180,4 +190,4 @@ export async function users_confirm_reset(reset: { password: string, passwordCon return await r.json(); -} \ No newline at end of file +}