appview/{pages,db}: show star/unstar buttons on the timeline #554

merged
opened by anirudh.fi targeting master from push-qrltzqmlrlln
Changed files
+73 -9
appview
db
pages
templates
timeline
fragments
+21 -5
appview/db/timeline.go
···
*Profile
*FollowStats
*FollowStatus
+
+
// optional: populate only if event is Repo
+
IsStarred bool
+
StarCount int64
}
// TODO: this gathers heterogenous events from different sources and aggregates
···
func MakeTimeline(e Execer, limit int, loggedInUserDid string) ([]TimelineEvent, error) {
var events []TimelineEvent
-
repos, err := getTimelineRepos(e, limit)
+
repos, err := getTimelineRepos(e, limit, loggedInUserDid)
if err != nil {
return nil, err
}
···
return events, nil
}
-
func getTimelineRepos(e Execer, limit int) ([]TimelineEvent, error) {
+
func getTimelineRepos(e Execer, limit int, loggedInUserDid string) ([]TimelineEvent, error) {
repos, err := GetRepos(e, limit)
if err != nil {
return nil, err
···
}
}
+
var isStarred bool
+
if loggedInUserDid != "" {
+
isStarred = GetStarStatus(e, loggedInUserDid, r.RepoAt())
+
}
+
+
var starCount int64
+
if r.RepoStats != nil {
+
starCount = int64(r.RepoStats.StarCount)
+
}
+
events = append(events, TimelineEvent{
-
Repo: &r,
-
EventAt: r.Created,
-
Source: source,
+
Repo: &r,
+
EventAt: r.Created,
+
Source: source,
+
IsStarred: isStarred,
+
StarCount: starCount,
})
}
+52 -4
appview/pages/templates/timeline/fragments/timeline.html
···
{{ with $e }}
<div class="flex flex-col divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-sm">
{{ if .Repo }}
-
{{ template "timeline/fragments/repoEvent" (list $ .Repo .Source) }}
+
{{ template "timeline/fragments/repoEvent" (list $ .) }}
{{ else if .Star }}
{{ template "timeline/fragments/starEvent" (list $ .Star) }}
{{ else if .Follow }}
···
{{ define "timeline/fragments/repoEvent" }}
{{ $root := index . 0 }}
-
{{ $repo := index . 1 }}
-
{{ $source := index . 2 }}
+
{{ $event := index . 1 }}
+
{{ $repo := $event.Repo }}
+
{{ $source := $event.Source }}
{{ $userHandle := resolve $repo.Did }}
<div class="pl-6 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex flex-wrap items-center gap-2 text-sm">
{{ template "user/fragments/picHandleLink" $repo.Did }}
···
<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) }}
+
<div class="py-4 px-6 gap-1 flex flex-col drop-shadow-sm rounded bg-white dark:bg-gray-800 min-h-32">
+
<div class="flex items-center justify-between">
+
<div class="font-medium dark:text-white flex items-center">
+
{{ if .Source }}
+
{{ i "git-fork" "w-4 h-4 mr-1.5 shrink-0" }}
+
{{ else }}
+
{{ i "book-marked" "w-4 h-4 mr-1.5 shrink-0" }}
+
{{ end }}
+
+
{{ $repoOwner := resolve .Did }}
+
<a href="/{{ $repoOwner }}/{{ .Name }}" class="truncate">{{ $repoOwner }}/{{ .Name }}</a>
+
</div>
+
+
{{ if $root.LoggedInUser }}
+
{{ template "repo/fragments/repoStar" (dict "IsStarred" $event.IsStarred "RepoAt" .RepoAt "Stats" (dict "StarCount" $event.StarCount)) }}
+
{{ end }}
+
</div>
+
+
{{ with .Description }}
+
<div class="text-gray-600 dark:text-gray-300 text-sm line-clamp-2">
+
{{ . | description }}
+
</div>
+
{{ end }}
+
+
{{ if .RepoStats }}
+
<div class="text-gray-400 text-sm font-mono inline-flex gap-4 mt-auto">
+
{{ with .RepoStats.Language }}
+
<div class="flex gap-2 items-center text-sm">
+
<div class="size-2 rounded-full"
+
style="background: radial-gradient(circle at 35% 35%, color-mix(in srgb, {{ langColor . }} 70%, white), {{ langColor . }} 30%, color-mix(in srgb, {{ langColor . }} 85%, black));"></div>
+
<span>{{ . }}</span>
+
</div>
+
{{ end }}
+
{{ with .RepoStats.IssueCount.Open }}
+
<div class="flex gap-1 items-center text-sm">
+
{{ i "circle-dot" "w-3 h-3" }}
+
<span>{{ . }}</span>
+
</div>
+
{{ end }}
+
{{ with .RepoStats.PullCount.Open }}
+
<div class="flex gap-1 items-center text-sm">
+
{{ i "git-pull-request" "w-3 h-3" }}
+
<span>{{ . }}</span>
+
</div>
+
{{ end }}
+
</div>
+
{{ end }}
+
</div>
{{ end }}
{{ end }}