refactor(feed): show users mods and blogs in feed
This commit is contained in:
parent
f8e770d952
commit
eb27eabcc6
@ -29,12 +29,91 @@ export const FeedTabBlogs = () => {
|
|||||||
const [isLoadMoreVisible, setIsLoadMoreVisible] = useState(true)
|
const [isLoadMoreVisible, setIsLoadMoreVisible] = useState(true)
|
||||||
const [showing, setShowing] = useState(SHOWING_STEP)
|
const [showing, setShowing] = useState(SHOWING_STEP)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!userPubkey) return
|
||||||
|
|
||||||
|
setIsFetching(true)
|
||||||
|
setIsLoadMoreVisible(true)
|
||||||
|
const filter: NDKFilter = {
|
||||||
|
authors: [...followList, userPubkey],
|
||||||
|
kinds: [NDKKind.Article],
|
||||||
|
limit: 50
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterOptions.nsfw === NSFWFilter.Only_NSFW) {
|
||||||
|
filter['#L'] = ['content-warning']
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterOptions.source === window.location.host) {
|
||||||
|
filter['#r'] = [window.location.host]
|
||||||
|
}
|
||||||
|
|
||||||
|
ndk
|
||||||
|
.fetchEvents(filter, {
|
||||||
|
closeOnEose: true,
|
||||||
|
cacheUsage: NDKSubscriptionCacheUsage.PARALLEL
|
||||||
|
})
|
||||||
|
.then((ndkEventSet) => {
|
||||||
|
const ndkEvents = Array.from(ndkEventSet)
|
||||||
|
setBlogs(ndkEvents.map(extractBlogCardDetails))
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setIsFetching(false)
|
||||||
|
})
|
||||||
|
}, [filterOptions.nsfw, filterOptions.source, followList, ndk, userPubkey])
|
||||||
|
|
||||||
|
const filteredBlogs = useMemo(() => {
|
||||||
|
let _blogs = blogs || []
|
||||||
|
|
||||||
|
// Add nsfw tag to blogs included in nsfwList
|
||||||
|
if (filterOptions.nsfw !== NSFWFilter.Hide_NSFW) {
|
||||||
|
_blogs = _blogs.map((b) => {
|
||||||
|
return !b.nsfw && b.aTag && nsfwList.includes(b.aTag)
|
||||||
|
? { ...b, nsfw: true }
|
||||||
|
: b
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// Filter nsfw (Hide_NSFW option)
|
||||||
|
_blogs = _blogs.filter(
|
||||||
|
(b) => !(b.nsfw && filterOptions.nsfw === NSFWFilter.Hide_NSFW)
|
||||||
|
)
|
||||||
|
|
||||||
|
_blogs = _blogs.filter(
|
||||||
|
(b) =>
|
||||||
|
!muteLists.admin.authors.includes(b.author!) &&
|
||||||
|
!muteLists.admin.replaceableEvents.includes(b.aTag!)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (filterOptions.sort === SortBy.Latest) {
|
||||||
|
_blogs.sort((a, b) =>
|
||||||
|
a.published_at && b.published_at ? b.published_at - a.published_at : 0
|
||||||
|
)
|
||||||
|
} else if (filterOptions.sort === SortBy.Oldest) {
|
||||||
|
_blogs.sort((a, b) =>
|
||||||
|
a.published_at && b.published_at ? a.published_at - b.published_at : 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
showing > 0 && _blogs.splice(showing)
|
||||||
|
return _blogs
|
||||||
|
}, [
|
||||||
|
blogs,
|
||||||
|
filterOptions.nsfw,
|
||||||
|
filterOptions.sort,
|
||||||
|
muteLists.admin.authors,
|
||||||
|
muteLists.admin.replaceableEvents,
|
||||||
|
nsfwList,
|
||||||
|
showing
|
||||||
|
])
|
||||||
|
|
||||||
|
if (!userPubkey) return null
|
||||||
|
|
||||||
const handleLoadMore = () => {
|
const handleLoadMore = () => {
|
||||||
const LOAD_MORE_STEP = SHOWING_STEP * 2
|
const LOAD_MORE_STEP = SHOWING_STEP * 2
|
||||||
setShowing((prev) => prev + SHOWING_STEP)
|
setShowing((prev) => prev + SHOWING_STEP)
|
||||||
const lastBlog = filteredBlogs[filteredBlogs.length - 1]
|
const lastBlog = filteredBlogs[filteredBlogs.length - 1]
|
||||||
const filter: NDKFilter = {
|
const filter: NDKFilter = {
|
||||||
authors: [...followList],
|
authors: [...followList, userPubkey],
|
||||||
kinds: [NDKKind.Article],
|
kinds: [NDKKind.Article],
|
||||||
limit: LOAD_MORE_STEP
|
limit: LOAD_MORE_STEP
|
||||||
}
|
}
|
||||||
@ -84,82 +163,6 @@ export const FeedTabBlogs = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setIsFetching(true)
|
|
||||||
setIsLoadMoreVisible(true)
|
|
||||||
const filter: NDKFilter = {
|
|
||||||
authors: [...followList],
|
|
||||||
kinds: [NDKKind.Article],
|
|
||||||
limit: 50
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filterOptions.nsfw === NSFWFilter.Only_NSFW) {
|
|
||||||
filter['#L'] = ['content-warning']
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filterOptions.source === window.location.host) {
|
|
||||||
filter['#r'] = [window.location.host]
|
|
||||||
}
|
|
||||||
|
|
||||||
ndk
|
|
||||||
.fetchEvents(filter, {
|
|
||||||
closeOnEose: true,
|
|
||||||
cacheUsage: NDKSubscriptionCacheUsage.PARALLEL
|
|
||||||
})
|
|
||||||
.then((ndkEventSet) => {
|
|
||||||
const ndkEvents = Array.from(ndkEventSet)
|
|
||||||
setBlogs(ndkEvents.map(extractBlogCardDetails))
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
setIsFetching(false)
|
|
||||||
})
|
|
||||||
}, [filterOptions.nsfw, filterOptions.source, followList, ndk])
|
|
||||||
|
|
||||||
const filteredBlogs = useMemo(() => {
|
|
||||||
let _blogs = blogs || []
|
|
||||||
|
|
||||||
// Add nsfw tag to blogs included in nsfwList
|
|
||||||
if (filterOptions.nsfw !== NSFWFilter.Hide_NSFW) {
|
|
||||||
_blogs = _blogs.map((b) => {
|
|
||||||
return !b.nsfw && b.aTag && nsfwList.includes(b.aTag)
|
|
||||||
? { ...b, nsfw: true }
|
|
||||||
: b
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// Filter nsfw (Hide_NSFW option)
|
|
||||||
_blogs = _blogs.filter(
|
|
||||||
(b) => !(b.nsfw && filterOptions.nsfw === NSFWFilter.Hide_NSFW)
|
|
||||||
)
|
|
||||||
|
|
||||||
_blogs = _blogs.filter(
|
|
||||||
(b) =>
|
|
||||||
!muteLists.admin.authors.includes(b.author!) &&
|
|
||||||
!muteLists.admin.replaceableEvents.includes(b.aTag!)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (filterOptions.sort === SortBy.Latest) {
|
|
||||||
_blogs.sort((a, b) =>
|
|
||||||
a.published_at && b.published_at ? b.published_at - a.published_at : 0
|
|
||||||
)
|
|
||||||
} else if (filterOptions.sort === SortBy.Oldest) {
|
|
||||||
_blogs.sort((a, b) =>
|
|
||||||
a.published_at && b.published_at ? a.published_at - b.published_at : 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
showing > 0 && _blogs.splice(showing)
|
|
||||||
return _blogs
|
|
||||||
}, [
|
|
||||||
blogs,
|
|
||||||
filterOptions.nsfw,
|
|
||||||
filterOptions.sort,
|
|
||||||
muteLists.admin.authors,
|
|
||||||
muteLists.admin.replaceableEvents,
|
|
||||||
nsfwList,
|
|
||||||
showing
|
|
||||||
])
|
|
||||||
|
|
||||||
if (!userPubkey) return null
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{isFetching && (
|
{isFetching && (
|
||||||
|
@ -39,64 +39,13 @@ export const FeedTabMods = () => {
|
|||||||
const [isLoadMoreVisible, setIsLoadMoreVisible] = useState(true)
|
const [isLoadMoreVisible, setIsLoadMoreVisible] = useState(true)
|
||||||
const [showing, setShowing] = useState(SHOWING_STEP)
|
const [showing, setShowing] = useState(SHOWING_STEP)
|
||||||
|
|
||||||
const handleLoadMore = () => {
|
|
||||||
const LOAD_MORE_STEP = SHOWING_STEP * 2
|
|
||||||
setShowing((prev) => prev + SHOWING_STEP)
|
|
||||||
const lastMod = filteredModList[filteredModList.length - 1]
|
|
||||||
const filter: NDKFilter = {
|
|
||||||
authors: [...followList],
|
|
||||||
kinds: [NDKKind.Classified],
|
|
||||||
limit: LOAD_MORE_STEP
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filterOptions.source === window.location.host) {
|
|
||||||
filter['#r'] = [window.location.host]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filterOptions.sort === SortBy.Latest) {
|
|
||||||
filter.until = lastMod.published_at
|
|
||||||
} else if (filterOptions.sort === SortBy.Oldest) {
|
|
||||||
filter.since = lastMod.published_at
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsFetching(true)
|
|
||||||
ndk
|
|
||||||
.fetchEvents(filter, {
|
|
||||||
closeOnEose: true,
|
|
||||||
cacheUsage: NDKSubscriptionCacheUsage.PARALLEL
|
|
||||||
})
|
|
||||||
.then((ndkEventSet) => {
|
|
||||||
const ndkEvents = Array.from(ndkEventSet)
|
|
||||||
orderEventsChronologically(
|
|
||||||
ndkEvents,
|
|
||||||
filterOptions.sort === SortBy.Latest
|
|
||||||
)
|
|
||||||
setMods((prevMods) => {
|
|
||||||
const newMods = constructModListFromEvents(ndkEvents)
|
|
||||||
const combinedMods = [...prevMods, ...newMods]
|
|
||||||
const uniqueMods = Array.from(
|
|
||||||
new Set(combinedMods.map((mod) => mod.id))
|
|
||||||
)
|
|
||||||
.map((id) => combinedMods.find((mod) => mod.id === id))
|
|
||||||
.filter((mod): mod is ModDetails => mod !== undefined)
|
|
||||||
|
|
||||||
if (newMods.length < LOAD_MORE_STEP) {
|
|
||||||
setIsLoadMoreVisible(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
return uniqueMods
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
setIsFetching(false)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (!userPubkey) return
|
||||||
|
|
||||||
setIsFetching(true)
|
setIsFetching(true)
|
||||||
setIsLoadMoreVisible(true)
|
setIsLoadMoreVisible(true)
|
||||||
const filter: NDKFilter = {
|
const filter: NDKFilter = {
|
||||||
authors: [...followList],
|
authors: [...followList, userPubkey],
|
||||||
kinds: [NDKKind.Classified],
|
kinds: [NDKKind.Classified],
|
||||||
limit: 50
|
limit: 50
|
||||||
}
|
}
|
||||||
@ -117,7 +66,7 @@ export const FeedTabMods = () => {
|
|||||||
.finally(() => {
|
.finally(() => {
|
||||||
setIsFetching(false)
|
setIsFetching(false)
|
||||||
})
|
})
|
||||||
}, [filterOptions.source, followList, ndk])
|
}, [filterOptions.source, followList, ndk, userPubkey])
|
||||||
|
|
||||||
const filteredModList = useMemo(() => {
|
const filteredModList = useMemo(() => {
|
||||||
const nsfwFilter = (mods: ModDetails[]) => {
|
const nsfwFilter = (mods: ModDetails[]) => {
|
||||||
@ -198,6 +147,60 @@ export const FeedTabMods = () => {
|
|||||||
])
|
])
|
||||||
|
|
||||||
if (!userPubkey) return null
|
if (!userPubkey) return null
|
||||||
|
|
||||||
|
const handleLoadMore = () => {
|
||||||
|
const LOAD_MORE_STEP = SHOWING_STEP * 2
|
||||||
|
setShowing((prev) => prev + SHOWING_STEP)
|
||||||
|
const lastMod = filteredModList[filteredModList.length - 1]
|
||||||
|
const filter: NDKFilter = {
|
||||||
|
authors: [...followList, userPubkey],
|
||||||
|
kinds: [NDKKind.Classified],
|
||||||
|
limit: LOAD_MORE_STEP
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterOptions.source === window.location.host) {
|
||||||
|
filter['#r'] = [window.location.host]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterOptions.sort === SortBy.Latest) {
|
||||||
|
filter.until = lastMod.published_at
|
||||||
|
} else if (filterOptions.sort === SortBy.Oldest) {
|
||||||
|
filter.since = lastMod.published_at
|
||||||
|
}
|
||||||
|
|
||||||
|
setIsFetching(true)
|
||||||
|
ndk
|
||||||
|
.fetchEvents(filter, {
|
||||||
|
closeOnEose: true,
|
||||||
|
cacheUsage: NDKSubscriptionCacheUsage.PARALLEL
|
||||||
|
})
|
||||||
|
.then((ndkEventSet) => {
|
||||||
|
const ndkEvents = Array.from(ndkEventSet)
|
||||||
|
orderEventsChronologically(
|
||||||
|
ndkEvents,
|
||||||
|
filterOptions.sort === SortBy.Latest
|
||||||
|
)
|
||||||
|
setMods((prevMods) => {
|
||||||
|
const newMods = constructModListFromEvents(ndkEvents)
|
||||||
|
const combinedMods = [...prevMods, ...newMods]
|
||||||
|
const uniqueMods = Array.from(
|
||||||
|
new Set(combinedMods.map((mod) => mod.id))
|
||||||
|
)
|
||||||
|
.map((id) => combinedMods.find((mod) => mod.id === id))
|
||||||
|
.filter((mod): mod is ModDetails => mod !== undefined)
|
||||||
|
|
||||||
|
if (newMods.length < LOAD_MORE_STEP) {
|
||||||
|
setIsLoadMoreVisible(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
return uniqueMods
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setIsFetching(false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{isFetching && <LoadingSpinner desc='Fetching mod details from relays' />}
|
{isFetching && <LoadingSpinner desc='Fetching mod details from relays' />}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user