From f672f46809cd387457af9826f408ca3c4e581326 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 23 Apr 2022 22:31:49 -0500 Subject: [PATCH] WIP Paginated Context API --- app/soapbox/actions/statuses.js | Bin 6928 -> 8069 bytes app/soapbox/api.ts | 4 ++++ app/soapbox/features/status/index.tsx | 26 +++++++++++++++++++++----- app/soapbox/utils/features.ts | 7 +++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/soapbox/actions/statuses.js b/app/soapbox/actions/statuses.js index 3433f47f2237a44d90c7c25b9fae37c3fe11ad08..cbb1c6ed23f28c87e205906bbae2cf3c5d1a7c0b 100644 GIT binary patch delta 796 zcmb7CO-jQ+6h_2ND*h}?m7;wGD@m!TZd_DEMR6rka9IS0WLgL7BxI(jl+cy?!tA|6 zanU2V)eE@r2HwD#PLj4-5N9!D$a~-WeqL|y>999gE<*>Jm|x%reop8uMEya3C8wSi zm6r`210ck_9a2E-k-B1MVY3us7WkB5H~@5y2nQ4pOTt`o#IfzjFWtRwh=Kt#SR5JI ztr(>P3b;Bx)k^Seh{Rhazi~`m%(x#ii+Iy1EF~=o1@SyzGApi6xkRs^1mM~p=dc)a zNSf6!IK|Ax)I*g2bKGh=&Kp7eIj|_GnVU^3lx?qVi|NZ-!lSL&u^JA^W>1W73} z3;@yqE9r6q)Ff28?wx4q+AdWlyw*u?uh|*$#1I9x8M#Q7xC+wKR2B-yKy?YzagfBm&%$+opC= pooPDspIC-?HP^+bS=b)uF@ao#HuZ3WQ0%2c#CvA#C7=D8{RVDx1?B(% delta 62 zcmV-E0Kxx-Kae(%x3S2v6_N}FlUW%XlduvV6>?>Cb#iVXP;zf=X>(;RVQg$DTMCl} U8z_@<8Xo~&li&**vy>b01L2hxRsaA1 diff --git a/app/soapbox/api.ts b/app/soapbox/api.ts index 6c81042bb0..34ed699f84 100644 --- a/app/soapbox/api.ts +++ b/app/soapbox/api.ts @@ -24,6 +24,10 @@ export const getLinks = (response: AxiosResponse): LinkHeader => { return new LinkHeader(response.headers?.link); }; +export const getNextLink = (response: AxiosResponse): string | undefined => { + return getLinks(response).refs.find(link => link.rel === 'next')?.uri; +}; + const getToken = (state: RootState, authType: string) => { return authType === 'app' ? getAppToken(state) : getAccessToken(state); }; diff --git a/app/soapbox/features/status/index.tsx b/app/soapbox/features/status/index.tsx index 2c8e1a75ce..9795bcb8d0 100644 --- a/app/soapbox/features/status/index.tsx +++ b/app/soapbox/features/status/index.tsx @@ -51,7 +51,7 @@ import { hideStatus, revealStatus, } from '../../actions/statuses'; -import { fetchStatusWithContext } from '../../actions/statuses'; +import { fetchStatusWithContext, fetchNext } from '../../actions/statuses'; import MissingIndicator from '../../components/missing_indicator'; import { textForScreenReader, defaultMediaVisibility } from '../../components/status'; import { makeGetStatus } from '../../selectors'; @@ -189,6 +189,7 @@ interface IStatusState { emojiSelectorFocused: boolean, isLoaded: boolean, error?: AxiosError, + next?: string, } class Status extends ImmutablePureComponent { @@ -200,17 +201,18 @@ class Status extends ImmutablePureComponent { emojiSelectorFocused: false, isLoaded: Boolean(this.props.status), error: undefined, + next: undefined, }; node: HTMLDivElement | null = null; status: HTMLDivElement | null = null; _scrolledIntoView: boolean = false; - fetchData = () => { + fetchData = async() => { const { dispatch, params } = this.props; const { statusId } = params; - - return dispatch(fetchStatusWithContext(statusId)); + const { next } = await dispatch(fetchStatusWithContext(statusId)); + this.setState({ next }); } componentDidMount() { @@ -641,6 +643,16 @@ class Status extends ImmutablePureComponent { return this.fetchData(); } + handleLoadMore = () => { + const { next } = this.state; + + if (next) { + this.props.dispatch(fetchNext(next)).then(({ next }) => { + this.setState({ next }); + }).catch(() => {}); + } + } + render() { const { status, ancestorsIds, descendantsIds, intl } = this.props; @@ -754,7 +766,11 @@ class Status extends ImmutablePureComponent {
- + {children}
diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 947dc4d12a..9864e8889c 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -286,6 +286,13 @@ const getInstanceFeatures = (instance: Instance) => { v.software === PLEROMA && gte(v.version, '2.4.50'), ]), + /** + * Supports pagination in threads. + * @see GET /api/v1/statuses/:id/context/ancestors + * @see GET /api/v1/statuses/:id/context/descendants + */ + paginatedContext: v.software === TRUTHSOCIAL, + /** Truth Social account registration API. */ pepe: v.software === TRUTHSOCIAL,