From f569d2beae25b937addee796bcffd68be36171ec Mon Sep 17 00:00:00 2001 From: Lewis Date: Wed, 4 Feb 2026 16:24:56 +0100 Subject: [PATCH] appview/profile: show dummy profile when no tangled profile --- appview/db/profile.go | 4 +--- appview/oauth/handler.go | 4 ++-- appview/pages/pages.go | 1 + .../pages/templates/layouts/profilebase.html | 13 +++++++++++ appview/state/profile.go | 22 +++++++++++++++++++ appview/state/state.go | 2 +- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/appview/db/profile.go b/appview/db/profile.go index 7ffc4cc3..fdc5d993 100644 --- a/appview/db/profile.go +++ b/appview/db/profile.go @@ -360,9 +360,7 @@ func GetProfile(e Execer, did string) (*models.Profile, error) { did, ).Scan(&avatar, &profile.Description, &includeBluesky, &profile.Location, &pronouns) if err == sql.ErrNoRows { - profile := models.Profile{} - profile.Did = did - return &profile, nil + return nil, nil } if err != nil { diff --git a/appview/oauth/handler.go b/appview/oauth/handler.go index 5f23ac65..33d8b04f 100644 --- a/appview/oauth/handler.go +++ b/appview/oauth/handler.go @@ -199,8 +199,8 @@ func (o *OAuth) ensureTangledProfile(sessData *oauth.ClientSessionData) { did := sessData.AccountDID.String() l := o.Logger.With("did", did) - _, err := db.GetProfile(o.Db, did) - if err == nil { + profile, _ := db.GetProfile(o.Db, did) + if profile != nil { l.Debug("profile already exists in DB") return } diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 0b758f31..fa4c0be5 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -523,6 +523,7 @@ func (p *Pages) ForkRepo(w io.Writer, params ForkRepoParams) error { type ProfileCard struct { UserDid string + HasProfile bool FollowStatus models.FollowStatus Punchcard *models.Punchcard Profile *models.Profile diff --git a/appview/pages/templates/layouts/profilebase.html b/appview/pages/templates/layouts/profilebase.html index 7aeb4937..3c577865 100644 --- a/appview/pages/templates/layouts/profilebase.html +++ b/appview/pages/templates/layouts/profilebase.html @@ -18,6 +18,18 @@ {{ end }} {{ define "content" }} + {{ if not .Card.HasProfile }} +
+
+ +
+

{{ resolve .Card.UserDid }}

+

This user hasn't joined Tangled yet.

+

Let them know we're waiting for them!

+
+
+
+ {{ else }} {{ template "profileTabs" . }}
@@ -35,6 +47,7 @@ {{ block "profileContent" . }} {{ end }}
+ {{ end }} {{ end }} {{ define "profileTabs" }} diff --git a/appview/state/profile.go b/appview/state/profile.go index 118306b0..cfdd2713 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -58,6 +58,11 @@ func (s *State) profile(r *http.Request) (*pages.ProfileCard, error) { return nil, fmt.Errorf("failed to get profile: %w", err) } + hasProfile := profile != nil + if !hasProfile { + profile = &models.Profile{Did: did} + } + repoCount, err := db.CountRepos(s.db, orm.FilterEq("did", did)) if err != nil { return nil, fmt.Errorf("failed to get repo count: %w", err) @@ -98,6 +103,7 @@ func (s *State) profile(r *http.Request) (*pages.ProfileCard, error) { return &pages.ProfileCard{ UserDid: did, + HasProfile: hasProfile, Profile: profile, FollowStatus: followStatus, Stats: pages.ProfileStats{ @@ -533,6 +539,9 @@ func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) { if err != nil { log.Printf("getting profile data for %s: %s", user.Active.Did, err) } + if profile == nil { + profile = &models.Profile{Did: user.Active.Did} + } profile.Description = r.FormValue("description") profile.IncludeBluesky = r.FormValue("includeBluesky") == "on" @@ -576,6 +585,9 @@ func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) { if err != nil { log.Printf("getting profile data for %s: %s", user.Active.Did, err) } + if profile == nil { + profile = &models.Profile{Did: user.Active.Did} + } i := 0 var pinnedRepos [6]syntax.ATURI @@ -676,6 +688,9 @@ func (s *State) EditBioFragment(w http.ResponseWriter, r *http.Request) { if err != nil { log.Printf("getting profile data for %s: %s", user.Active.Did, err) } + if profile == nil { + profile = &models.Profile{Did: user.Active.Did} + } s.pages.EditBioFragment(w, pages.EditBioParams{ LoggedInUser: user, @@ -690,6 +705,9 @@ func (s *State) EditPinsFragment(w http.ResponseWriter, r *http.Request) { if err != nil { log.Printf("getting profile data for %s: %s", user.Active.Did, err) } + if profile == nil { + profile = &models.Profile{Did: user.Active.Did} + } repos, err := db.GetRepos(s.db, 0, orm.FilterEq("did", user.Active.Did)) if err != nil { @@ -816,6 +834,8 @@ func (s *State) UploadProfileAvatar(w http.ResponseWriter, r *http.Request) { profile, err := db.GetProfile(s.db, user.Did) if err != nil { l.Warn("getting profile data from DB", "err", err) + } + if profile == nil { profile = &models.Profile{Did: user.Did} } profile.Avatar = uploadBlobResp.Blob.Ref.String() @@ -892,6 +912,8 @@ func (s *State) RemoveProfileAvatar(w http.ResponseWriter, r *http.Request) { profile, err := db.GetProfile(s.db, user.Did) if err != nil { l.Warn("getting profile data from DB", "err", err) + } + if profile == nil { profile = &models.Profile{Did: user.Did} } profile.Avatar = "" diff --git a/appview/state/state.go b/appview/state/state.go index 4da48f08..1baa3985 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -126,7 +126,7 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { wrapper, false, - // in-memory filter is inapplicalble to appview so + // in-memory filter is inapplicable to appview so // we'll never log dids anyway. false, ) -- 2.51.2