tangled
alpha
login
or
join now
margin.at
/
margin
88
fork
atom
Write on the margins of the internet. Powered by the AT Protocol.
margin.at
extension
web
atproto
comments
88
fork
atom
overview
issues
4
pulls
1
pipelines
fix feed tweaking out
scanash.com
1 month ago
6ad38876
d1a13809
+16
-23
2 changed files
expand all
collapse all
unified
split
backend
internal
api
handler.go
web
src
pages
Feed.jsx
+11
-18
backend/internal/api/handler.go
···
8
"log"
9
"net/http"
10
"net/url"
0
11
"strconv"
12
"strings"
13
"sync"
···
461
}
462
463
func sortFeed(feed []interface{}) {
464
-
for i := 0; i < len(feed); i++ {
465
-
for j := i + 1; j < len(feed); j++ {
466
-
t1 := getCreatedAt(feed[i])
467
-
t2 := getCreatedAt(feed[j])
468
-
if t1.Before(t2) {
469
-
feed[i], feed[j] = feed[j], feed[i]
470
-
}
471
-
}
472
-
}
473
}
474
475
func getCreatedAt(item interface{}) time.Time {
···
488
}
489
490
func sortFeedByPopularity(feed []interface{}) {
491
-
for i := 0; i < len(feed); i++ {
492
-
for j := i + 1; j < len(feed); j++ {
493
-
p1 := getPopularity(feed[i])
494
-
p2 := getPopularity(feed[j])
495
-
if p1 < p2 {
496
-
feed[i], feed[j] = feed[j], feed[i]
497
-
}
498
-
}
499
-
}
500
}
501
502
func getPopularity(item interface{}) int {
···
8
"log"
9
"net/http"
10
"net/url"
11
+
"sort"
12
"strconv"
13
"strings"
14
"sync"
···
462
}
463
464
func sortFeed(feed []interface{}) {
465
+
sort.Slice(feed, func(i, j int) bool {
466
+
t1 := getCreatedAt(feed[i])
467
+
t2 := getCreatedAt(feed[j])
468
+
return t1.After(t2)
469
+
})
0
0
0
0
470
}
471
472
func getCreatedAt(item interface{}) time.Time {
···
485
}
486
487
func sortFeedByPopularity(feed []interface{}) {
488
+
sort.Slice(feed, func(i, j int) bool {
489
+
p1 := getPopularity(feed[i])
490
+
p2 := getPopularity(feed[j])
491
+
return p1 > p2
492
+
})
0
0
0
0
493
}
494
495
func getPopularity(item interface{}) int {
+5
-5
web/src/pages/Feed.jsx
···
46
const { user } = useAuth();
47
48
const fetchFeed = useCallback(
49
-
async (isLoadMore = false) => {
50
try {
0
51
if (isLoadMore) {
52
setLoadingMore(true);
53
} else {
···
74
};
75
const motivation = motivationMap[filter] || "";
76
const limit = 50;
77
-
const offset = isLoadMore ? annotations.length : 0;
78
79
const data = await getAnnotationFeed(
80
limit,
···
104
setLoadingMore(false);
105
}
106
},
107
-
[tagFilter, feedType, filter, user, annotations.length],
108
);
109
110
useEffect(() => {
111
-
fetchFeed(false);
112
}, [fetchFeed]);
113
114
const deduplicatedAnnotations = useMemo(() => {
···
354
}}
355
>
356
<button
357
-
onClick={() => fetchFeed(true)}
358
disabled={loadingMore}
359
className="feed-load-more"
360
>
···
46
const { user } = useAuth();
47
48
const fetchFeed = useCallback(
49
+
async (offset = 0) => {
50
try {
51
+
const isLoadMore = offset > 0;
52
if (isLoadMore) {
53
setLoadingMore(true);
54
} else {
···
75
};
76
const motivation = motivationMap[filter] || "";
77
const limit = 50;
0
78
79
const data = await getAnnotationFeed(
80
limit,
···
104
setLoadingMore(false);
105
}
106
},
107
+
[tagFilter, feedType, filter, user],
108
);
109
110
useEffect(() => {
111
+
fetchFeed(0);
112
}, [fetchFeed]);
113
114
const deduplicatedAnnotations = useMemo(() => {
···
354
}}
355
>
356
<button
357
+
onClick={() => fetchFeed(annotations.length)}
358
disabled={loadingMore}
359
className="feed-load-more"
360
>