Merge branch 'main' of github.com:bluesky-social/social-app into main
commit
fb1199e21d
|
@ -11,9 +11,18 @@ import {cleanError} from 'lib/strings/errors'
|
|||
import {FeedTuner} from 'lib/api/feed-manip'
|
||||
import {PostsFeedSliceModel} from './posts-slice'
|
||||
import {track} from 'lib/analytics/analytics'
|
||||
import {FeedViewPostsSlice} from 'lib/api/feed-manip'
|
||||
|
||||
const PAGE_SIZE = 30
|
||||
|
||||
type Options = {
|
||||
/**
|
||||
* Formats the feed in a flat array with no threading of replies, just
|
||||
* top-level posts.
|
||||
*/
|
||||
isSimpleFeed?: boolean
|
||||
}
|
||||
|
||||
type QueryParams =
|
||||
| GetTimeline.QueryParams
|
||||
| GetAuthorFeed.QueryParams
|
||||
|
@ -35,6 +44,7 @@ export class PostsFeedModel {
|
|||
pollCursor: string | undefined
|
||||
tuner = new FeedTuner()
|
||||
pageSize = PAGE_SIZE
|
||||
options: Options = {}
|
||||
|
||||
// used to linearize async modifications to state
|
||||
lock = new AwaitLock()
|
||||
|
@ -49,6 +59,7 @@ export class PostsFeedModel {
|
|||
public rootStore: RootStoreModel,
|
||||
public feedType: 'home' | 'author' | 'custom',
|
||||
params: QueryParams,
|
||||
options?: Options,
|
||||
) {
|
||||
makeAutoObservable(
|
||||
this,
|
||||
|
@ -60,6 +71,7 @@ export class PostsFeedModel {
|
|||
{autoBind: true},
|
||||
)
|
||||
this.params = params
|
||||
this.options = options || {}
|
||||
}
|
||||
|
||||
get hasContent() {
|
||||
|
@ -354,7 +366,9 @@ export class PostsFeedModel {
|
|||
this.rootStore.posts.fromFeedItem(item)
|
||||
}
|
||||
|
||||
const slices = this.tuner.tune(res.data.feed, this.feedTuners)
|
||||
const slices = this.options.isSimpleFeed
|
||||
? res.data.feed.map(item => new FeedViewPostsSlice([item]))
|
||||
: this.tuner.tune(res.data.feed, this.feedTuners)
|
||||
|
||||
const toAppend: PostsFeedSliceModel[] = []
|
||||
for (const slice of slices) {
|
||||
|
|
|
@ -176,11 +176,18 @@ export class ProfileUiModel {
|
|||
filter = 'posts_with_media'
|
||||
}
|
||||
|
||||
this.feed = new PostsFeedModel(this.rootStore, 'author', {
|
||||
this.feed = new PostsFeedModel(
|
||||
this.rootStore,
|
||||
'author',
|
||||
{
|
||||
actor: this.params.user,
|
||||
limit: 10,
|
||||
filter,
|
||||
})
|
||||
},
|
||||
{
|
||||
isSimpleFeed: ['posts_with_media'].includes(filter),
|
||||
},
|
||||
)
|
||||
|
||||
if (this.currentView instanceof PostsFeedModel) {
|
||||
this.feed.setup()
|
||||
|
|
|
@ -156,7 +156,7 @@ export const PostThread = observer(function PostThread({
|
|||
}, [navigation])
|
||||
|
||||
const renderItem = React.useCallback(
|
||||
({item}: {item: YieldedItem}) => {
|
||||
({item, index}: {item: YieldedItem; index: number}) => {
|
||||
if (item === PARENT_SPINNER) {
|
||||
return (
|
||||
<View style={styles.parentSpinner}>
|
||||
|
@ -205,11 +205,20 @@ export const PostThread = observer(function PostThread({
|
|||
</View>
|
||||
)
|
||||
} else if (item instanceof PostThreadItemModel) {
|
||||
return <PostThreadItem item={item} onPostReply={onRefresh} />
|
||||
const prev = (
|
||||
index - 1 >= 0 ? posts[index - 1] : undefined
|
||||
) as PostThreadItemModel
|
||||
return (
|
||||
<PostThreadItem
|
||||
item={item}
|
||||
onPostReply={onRefresh}
|
||||
hasPrecedingItem={prev?._showChildReplyLine}
|
||||
/>
|
||||
)
|
||||
}
|
||||
return <></>
|
||||
},
|
||||
[onRefresh, onPressReply, pal],
|
||||
[onRefresh, onPressReply, pal, posts],
|
||||
)
|
||||
|
||||
// loading
|
||||
|
|
|
@ -38,9 +38,11 @@ import {isDesktopWeb} from 'platform/detection'
|
|||
export const PostThreadItem = observer(function PostThreadItem({
|
||||
item,
|
||||
onPostReply,
|
||||
hasPrecedingItem,
|
||||
}: {
|
||||
item: PostThreadItemModel
|
||||
onPostReply: () => void
|
||||
hasPrecedingItem: boolean
|
||||
}) {
|
||||
const pal = usePalette('default')
|
||||
const store = useStores()
|
||||
|
@ -359,8 +361,7 @@ export const PostThreadItem = observer(function PostThreadItem({
|
|||
styles.outer,
|
||||
pal.border,
|
||||
pal.view,
|
||||
item._showParentReplyLine && styles.noTopBorder,
|
||||
!item._showChildReplyLine && {borderBottomWidth: 1},
|
||||
item._showParentReplyLine && hasPrecedingItem && styles.noTopBorder,
|
||||
]}
|
||||
moderation={item.moderation.content}>
|
||||
<PostSandboxWarning />
|
||||
|
@ -483,7 +484,7 @@ export const PostThreadItem = observer(function PostThreadItem({
|
|||
<Link
|
||||
style={[
|
||||
styles.loadMore,
|
||||
{borderBottomColor: pal.colors.border},
|
||||
{borderTopColor: pal.colors.border},
|
||||
pal.view,
|
||||
]}
|
||||
href={itemHref}
|
||||
|
@ -600,7 +601,7 @@ const styles = StyleSheet.create({
|
|||
loadMore: {
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-between',
|
||||
borderBottomWidth: 1,
|
||||
borderTopWidth: 1,
|
||||
paddingLeft: 80,
|
||||
paddingRight: 20,
|
||||
paddingVertical: 12,
|
||||
|
|
Loading…
Reference in New Issue