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
··· 19 *Profile 20 *FollowStats 21 *FollowStatus 22 } 23 24 // TODO: this gathers heterogenous events from different sources and aggregates ··· 26 func MakeTimeline(e Execer, limit int, loggedInUserDid string) ([]TimelineEvent, error) { 27 var events []TimelineEvent 28 29 - repos, err := getTimelineRepos(e, limit) 30 if err != nil { 31 return nil, err 32 } ··· 57 return events, nil 58 } 59 60 - func getTimelineRepos(e Execer, limit int) ([]TimelineEvent, error) { 61 repos, err := GetRepos(e, limit) 62 if err != nil { 63 return nil, err ··· 93 } 94 } 95 96 events = append(events, TimelineEvent{ 97 - Repo: &r, 98 - EventAt: r.Created, 99 - Source: source, 100 }) 101 } 102
··· 19 *Profile 20 *FollowStats 21 *FollowStatus 22 + 23 + // optional: populate only if event is Repo 24 + IsStarred bool 25 + StarCount int64 26 } 27 28 // TODO: this gathers heterogenous events from different sources and aggregates ··· 30 func MakeTimeline(e Execer, limit int, loggedInUserDid string) ([]TimelineEvent, error) { 31 var events []TimelineEvent 32 33 + repos, err := getTimelineRepos(e, limit, loggedInUserDid) 34 if err != nil { 35 return nil, err 36 } ··· 61 return events, nil 62 } 63 64 + func getTimelineRepos(e Execer, limit int, loggedInUserDid string) ([]TimelineEvent, error) { 65 repos, err := GetRepos(e, limit) 66 if err != nil { 67 return nil, err ··· 97 } 98 } 99 100 + var isStarred bool 101 + if loggedInUserDid != "" { 102 + isStarred = GetStarStatus(e, loggedInUserDid, r.RepoAt()) 103 + } 104 + 105 + var starCount int64 106 + if r.RepoStats != nil { 107 + starCount = int64(r.RepoStats.StarCount) 108 + } 109 + 110 events = append(events, TimelineEvent{ 111 + Repo: &r, 112 + EventAt: r.Created, 113 + Source: source, 114 + IsStarred: isStarred, 115 + StarCount: starCount, 116 }) 117 } 118
+52 -4
appview/pages/templates/timeline/fragments/timeline.html
··· 13 {{ with $e }} 14 <div class="flex flex-col divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-sm"> 15 {{ if .Repo }} 16 - {{ template "timeline/fragments/repoEvent" (list $ .Repo .Source) }} 17 {{ else if .Star }} 18 {{ template "timeline/fragments/starEvent" (list $ .Star) }} 19 {{ else if .Follow }} ··· 29 30 {{ define "timeline/fragments/repoEvent" }} 31 {{ $root := index . 0 }} 32 - {{ $repo := index . 1 }} 33 - {{ $source := index . 2 }} 34 {{ $userHandle := resolve $repo.Did }} 35 <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"> 36 {{ template "user/fragments/picHandleLink" $repo.Did }} ··· 51 <span class="text-gray-700 dark:text-gray-400 text-xs">{{ template "repo/fragments/time" $repo.Created }}</span> 52 </div> 53 {{ with $repo }} 54 - {{ template "user/fragments/repoCard" (list $root . true) }} 55 {{ end }} 56 {{ end }} 57
··· 13 {{ with $e }} 14 <div class="flex flex-col divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-sm"> 15 {{ if .Repo }} 16 + {{ template "timeline/fragments/repoEvent" (list $ .) }} 17 {{ else if .Star }} 18 {{ template "timeline/fragments/starEvent" (list $ .Star) }} 19 {{ else if .Follow }} ··· 29 30 {{ define "timeline/fragments/repoEvent" }} 31 {{ $root := index . 0 }} 32 + {{ $event := index . 1 }} 33 + {{ $repo := $event.Repo }} 34 + {{ $source := $event.Source }} 35 {{ $userHandle := resolve $repo.Did }} 36 <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"> 37 {{ template "user/fragments/picHandleLink" $repo.Did }} ··· 52 <span class="text-gray-700 dark:text-gray-400 text-xs">{{ template "repo/fragments/time" $repo.Created }}</span> 53 </div> 54 {{ with $repo }} 55 + <div class="py-4 px-6 gap-1 flex flex-col drop-shadow-sm rounded bg-white dark:bg-gray-800 min-h-32"> 56 + <div class="flex items-center justify-between"> 57 + <div class="font-medium dark:text-white flex items-center"> 58 + {{ if .Source }} 59 + {{ i "git-fork" "w-4 h-4 mr-1.5 shrink-0" }} 60 + {{ else }} 61 + {{ i "book-marked" "w-4 h-4 mr-1.5 shrink-0" }} 62 + {{ end }} 63 + 64 + {{ $repoOwner := resolve .Did }} 65 + <a href="/{{ $repoOwner }}/{{ .Name }}" class="truncate">{{ $repoOwner }}/{{ .Name }}</a> 66 + </div> 67 + 68 + {{ if $root.LoggedInUser }} 69 + {{ template "repo/fragments/repoStar" (dict "IsStarred" $event.IsStarred "RepoAt" .RepoAt "Stats" (dict "StarCount" $event.StarCount)) }} 70 + {{ end }} 71 + </div> 72 + 73 + {{ with .Description }} 74 + <div class="text-gray-600 dark:text-gray-300 text-sm line-clamp-2"> 75 + {{ . | description }} 76 + </div> 77 + {{ end }} 78 + 79 + {{ if .RepoStats }} 80 + <div class="text-gray-400 text-sm font-mono inline-flex gap-4 mt-auto"> 81 + {{ with .RepoStats.Language }} 82 + <div class="flex gap-2 items-center text-sm"> 83 + <div class="size-2 rounded-full" 84 + 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> 85 + <span>{{ . }}</span> 86 + </div> 87 + {{ end }} 88 + {{ with .RepoStats.IssueCount.Open }} 89 + <div class="flex gap-1 items-center text-sm"> 90 + {{ i "circle-dot" "w-3 h-3" }} 91 + <span>{{ . }}</span> 92 + </div> 93 + {{ end }} 94 + {{ with .RepoStats.PullCount.Open }} 95 + <div class="flex gap-1 items-center text-sm"> 96 + {{ i "git-pull-request" "w-3 h-3" }} 97 + <span>{{ . }}</span> 98 + </div> 99 + {{ end }} 100 + </div> 101 + {{ end }} 102 + </div> 103 {{ end }} 104 {{ end }} 105