Signed-off-by: Anirudh Oppiliappan anirudh@tangled.sh
+21
-5
appview/db/timeline.go
+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
+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