fix(feed): allow visiting note directly

Fixes 
This commit is contained in:
en 2025-04-12 21:46:09 +02:00
parent ac4a0f1442
commit 65aa059363
2 changed files with 103 additions and 83 deletions
src
layout
pages/feed

@ -1,11 +1,14 @@
import { Profile } from 'components/ProfileSection'
import { useAppSelector } from 'hooks'
import { Navigate, Outlet } from 'react-router-dom'
import { Navigate, Outlet, useParams } from 'react-router-dom'
import { appRoutes } from 'routes'
export const FeedLayout = () => {
const { note } = useParams()
const userState = useAppSelector((state) => state.user)
if (!userState.user?.pubkey) return <Navigate to={appRoutes.home} />
// Exception for visiting notes directly
if (!userState.user?.pubkey && !note) return <Navigate to={appRoutes.home} />
return (
<div className='InnerBodyMain'>
@ -16,11 +19,11 @@ export const FeedLayout = () => {
<div className='IBMSMSplitMainFullSideFeedWrapper'>
<div className='IBMSMSplitMainFullSideFWSide'>
{userState.auth && userState.user?.pubkey && (
<div className='IBMSMSplitMainSmallSideSecWrapper'>
<div className='IBMSMSplitMainSmallSideSec'>
<Profile pubkey={userState.user.pubkey as string} />
</div>
<div className='IBMSMSplitMainSmallSideSecWrapper'>
<div className='IBMSMSplitMainSmallSideSec'>
<Profile pubkey={userState.user.pubkey as string} />
</div>
</div>
)}
</div>
<div className='IBMSMSplitMainFullSideFWMid'>
@ -28,7 +31,9 @@ export const FeedLayout = () => {
</div>
<div className='IBMSMSplitMainFullSideFWSide'>
<div className='IBMSMSplitMainSmallSideSecWrapper'>
<div className='IBMSMSplitMainSmallSideSecBox'><p>This is a box</p></div>
<div className='IBMSMSplitMainSmallSideSecBox'>
<p>This is a box</p>
</div>
</div>
</div>
</div>

@ -1,6 +1,6 @@
import { NDKUser } from '@nostr-dev-kit/ndk'
import { NDKContextType } from 'contexts/NDKContext'
import { redirect } from 'react-router-dom'
import { LoaderFunctionArgs, redirect } from 'react-router-dom'
import { appRoutes } from 'routes'
import { store } from 'store'
import { MuteLists } from 'types'
@ -22,80 +22,95 @@ export interface FeedPageLoaderResult {
followList: string[]
}
export const feedPageLoader = (ndkContext: NDKContextType) => async () => {
// Empty result
const result: FeedPageLoaderResult = {
muteLists: {
admin: {
authors: [],
replaceableEvents: []
export const feedPageLoader =
(ndkContext: NDKContextType) =>
async ({ params }: LoaderFunctionArgs) => {
const { note } = params
// Empty result
const result: FeedPageLoaderResult = {
muteLists: {
admin: {
authors: [],
replaceableEvents: []
},
user: {
authors: [],
replaceableEvents: []
}
},
user: {
authors: [],
replaceableEvents: []
}
},
nsfwList: [],
repostList: [],
followList: []
nsfwList: [],
repostList: [],
followList: []
}
// Get the current state
const userState = store.getState().user
const loggedInUserPubkey =
(userState?.user?.pubkey as string | undefined) || getFallbackPubkey()
// Exception for visiting notes directly
if (!loggedInUserPubkey && !note) return redirect(appRoutes.home)
const ndkUser = new NDKUser({ pubkey: loggedInUserPubkey })
ndkUser.ndk = ndkContext.ndk
const settled = await Promise.allSettled([
ndkContext.getMuteLists(loggedInUserPubkey),
getReportingSet(CurationSetIdentifiers.NSFW, ndkContext),
getReportingSet(CurationSetIdentifiers.Repost, ndkContext),
ndkUser.followSet()
])
// Check the mutelist event result
const muteListResult = settled[0]
if (muteListResult.status === 'fulfilled' && muteListResult.value) {
result.muteLists = muteListResult.value
} else if (muteListResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch mutelist.',
muteListResult.reason
)
}
// Check the nsfwlist event result
const nsfwListResult = settled[1]
if (nsfwListResult.status === 'fulfilled' && nsfwListResult.value) {
result.nsfwList = nsfwListResult.value
} else if (nsfwListResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch nsfwlist.',
nsfwListResult.reason
)
}
// Check the repostlist event result
const repostListResult = settled[2]
if (repostListResult.status === 'fulfilled' && repostListResult.value) {
result.repostList = repostListResult.value
} else if (repostListResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch repost list.',
repostListResult.reason
)
}
// Check the followSet result
const followSetResult = settled[3]
if (followSetResult.status === 'fulfilled') {
result.followList = Array.from(followSetResult.value)
} else if (followSetResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch follow set.',
followSetResult.reason
)
}
return result
}
// Get the current state
const userState = store.getState().user
const loggedInUserPubkey =
(userState?.user?.pubkey as string | undefined) || getFallbackPubkey()
if (!loggedInUserPubkey) return redirect(appRoutes.home)
const ndkUser = new NDKUser({ pubkey: loggedInUserPubkey })
ndkUser.ndk = ndkContext.ndk
const settled = await Promise.allSettled([
ndkContext.getMuteLists(loggedInUserPubkey),
getReportingSet(CurationSetIdentifiers.NSFW, ndkContext),
getReportingSet(CurationSetIdentifiers.Repost, ndkContext),
ndkUser.followSet()
])
// Check the mutelist event result
const muteListResult = settled[0]
if (muteListResult.status === 'fulfilled' && muteListResult.value) {
result.muteLists = muteListResult.value
} else if (muteListResult.status === 'rejected') {
log(true, LogType.Error, 'Failed to fetch mutelist.', muteListResult.reason)
}
// Check the nsfwlist event result
const nsfwListResult = settled[1]
if (nsfwListResult.status === 'fulfilled' && nsfwListResult.value) {
result.nsfwList = nsfwListResult.value
} else if (nsfwListResult.status === 'rejected') {
log(true, LogType.Error, 'Failed to fetch nsfwlist.', nsfwListResult.reason)
}
// Check the repostlist event result
const repostListResult = settled[2]
if (repostListResult.status === 'fulfilled' && repostListResult.value) {
result.repostList = repostListResult.value
} else if (repostListResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch repost list.',
repostListResult.reason
)
}
// Check the followSet result
const followSetResult = settled[3]
if (followSetResult.status === 'fulfilled') {
result.followList = Array.from(followSetResult.value)
} else if (followSetResult.status === 'rejected') {
log(
true,
LogType.Error,
'Failed to fetch follow set.',
followSetResult.reason
)
}
return result
}