appview: support star for sh.tangled.string #825

merged
opened by boltless.me targeting master from sl/uzmtowmlwkvz
Changed files
+49 -31
appview
models
pages
templates
fragments
layouts
strings
timeline
fragments
user
fragments
state
strings
+1 -1
appview/models/string.go
···
Edited *time.Time
}
-
func (s *String) StringAt() syntax.ATURI {
+
func (s *String) AtUri() syntax.ATURI {
return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", s.Did, tangled.StringNSID, s.Rkey))
}
+8 -6
appview/pages/pages.go
···
return p.executePlain("user/fragments/editPins", w, params)
}
-
type RepoStarFragmentParams struct {
+
type StarBtnFragmentParams struct {
IsStarred bool
-
RepoAt syntax.ATURI
-
Stats models.RepoStats
+
SubjectAt syntax.ATURI
+
StarCount int
}
-
func (p *Pages) RepoStarFragment(w io.Writer, params RepoStarFragmentParams) error {
-
return p.executePlain("repo/fragments/repoStar", w, params)
+
func (p *Pages) StarBtnFragment(w io.Writer, params StarBtnFragmentParams) error {
+
return p.executePlain("fragments/starBtn", w, params)
}
type RepoIndexParams struct {
···
ShowRendered bool
RenderToggle bool
RenderedContents template.HTML
-
String models.String
+
String *models.String
Stats models.StringStats
+
IsStarred bool
+
StarCount int
Owner identity.Identity
+4 -4
appview/pages/templates/repo/fragments/repoStar.html appview/pages/templates/fragments/starBtn.html
···
-
{{ define "repo/fragments/repoStar" }}
+
{{ define "fragments/starBtn" }}
<button
id="starBtn"
class="btn disabled:opacity-50 disabled:cursor-not-allowed flex gap-2 items-center group"
{{ if .IsStarred }}
-
hx-delete="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
+
hx-delete="/star?subject={{ .SubjectAt }}&countHint={{ .StarCount }}"
{{ else }}
-
hx-post="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
+
hx-post="/star?subject={{ .SubjectAt }}&countHint={{ .StarCount }}"
{{ end }}
hx-trigger="click"
···
{{ i "star" "w-4 h-4" }}
{{ end }}
<span class="text-sm">
-
{{ .Stats.StarCount }}
+
{{ .StarCount }}
</span>
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
</button>
+4 -1
appview/pages/templates/layouts/repobase.html
···
</div>
<div class="w-full sm:w-fit grid grid-cols-3 gap-2 z-auto">
-
{{ template "repo/fragments/repoStar" .RepoInfo }}
+
{{ template "fragments/starBtn"
+
(dict "SubjectAt" .RepoInfo.RepoAt
+
"IsStarred" .RepoInfo.IsStarred
+
"StarCount" .RepoInfo.Stats.StarCount) }}
<a
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
hx-boost="true"
+8 -4
appview/pages/templates/strings/string.html
···
<span class="select-none">/</span>
<a href="/strings/{{ $ownerId }}/{{ .String.Rkey }}" class="font-bold">{{ .String.Filename }}</a>
</div>
-
{{ if and .LoggedInUser (eq .LoggedInUser.Did .String.Did) }}
-
<div class="flex gap-2 text-base">
+
<div class="flex gap-2 text-base">
+
{{ if and .LoggedInUser (eq .LoggedInUser.Did .String.Did) }}
<a class="btn flex items-center gap-2 no-underline hover:no-underline p-2 group"
hx-boost="true"
href="/strings/{{ .String.Did }}/{{ .String.Rkey }}/edit">
···
<span class="hidden md:inline">delete</span>
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
</button>
-
</div>
-
{{ end }}
+
{{ end }}
+
{{ template "fragments/starBtn"
+
(dict "SubjectAt" .String.AtUri
+
"IsStarred" .IsStarred
+
"StarCount" .StarCount) }}
+
</div>
</div>
<span>
{{ with .String.Description }}
+2 -2
appview/pages/templates/timeline/fragments/timeline.html
···
<span class="text-gray-700 dark:text-gray-400 text-xs">{{ template "repo/fragments/time" $repo.Created }}</span>
</div>
{{ with $repo }}
-
{{ template "user/fragments/repoCard" (list $root . true true (dict "IsStarred" $event.IsStarred "RepoAt" .RepoAt "Stats" (dict "StarCount" $event.StarCount))) }}
+
{{ template "user/fragments/repoCard" (list $root . true true (dict "IsStarred" $event.IsStarred "SubjectAt" .RepoAt "StarCount" $event.StarCount)) }}
{{ end }}
{{ end }}
···
<span class="text-gray-700 dark:text-gray-400 text-xs">{{ template "repo/fragments/time" .Created }}</span>
</div>
{{ with .Repo }}
-
{{ template "user/fragments/repoCard" (list $root . true true (dict "IsStarred" $event.IsStarred "RepoAt" .RepoAt "Stats" (dict "StarCount" $event.StarCount))) }}
+
{{ template "user/fragments/repoCard" (list $root . true true (dict "IsStarred" $event.IsStarred "SubjectAt" .RepoAt "StarCount" $event.StarCount)) }}
{{ end }}
{{ end }}
{{ end }}
+2 -1
appview/pages/templates/user/fragments/repoCard.html
···
{{ define "user/fragments/repoCard" }}
+
{{/* root, repo, fullName [,starButton [,starData]] */}}
{{ $root := index . 0 }}
{{ $repo := index . 1 }}
{{ $fullName := index . 2 }}
···
</div>
{{ if and $starButton $root.LoggedInUser }}
<div class="shrink-0">
-
{{ template "repo/fragments/repoStar" $starData }}
+
{{ template "fragments/starBtn" $starData }}
</div>
{{ end }}
</div>
+6 -10
appview/state/star.go
···
s.notifier.NewStar(r.Context(), star)
-
s.pages.RepoStarFragment(w, pages.RepoStarFragmentParams{
+
s.pages.StarBtnFragment(w, pages.StarBtnFragmentParams{
IsStarred: true,
-
RepoAt: subjectUri,
-
Stats: models.RepoStats{
-
StarCount: starCount,
-
},
+
SubjectAt: subjectUri,
+
StarCount: starCount,
})
return
···
s.notifier.DeleteStar(r.Context(), star)
-
s.pages.RepoStarFragment(w, pages.RepoStarFragmentParams{
+
s.pages.StarBtnFragment(w, pages.StarBtnFragmentParams{
IsStarred: false,
-
RepoAt: subjectUri,
-
Stats: models.RepoStats{
-
StarCount: starCount,
-
},
+
SubjectAt: subjectUri,
+
StarCount: starCount,
})
return
+14 -2
appview/strings/strings.go
···
showRendered = r.URL.Query().Get("code") != "true"
}
+
starCount, err := db.GetStarCount(s.Db, string.AtUri())
+
if err != nil {
+
l.Error("failed to get star count", "err", err)
+
}
+
user := s.OAuth.GetUser(r)
+
isStarred := false
+
if user != nil {
+
isStarred = db.GetStarStatus(s.Db, user.Did, string.AtUri())
+
}
+
s.Pages.SingleString(w, pages.SingleStringParams{
-
LoggedInUser: s.OAuth.GetUser(r),
+
LoggedInUser: user,
RenderToggle: renderToggle,
ShowRendered: showRendered,
-
String: string,
+
String: &string,
Stats: string.Stats(),
+
IsStarred: isStarred,
+
StarCount: starCount,
Owner: id,
})
}