Split back fetch more loader for record table and emails (#3693)

* Split back fetch more loader

* Rename loader

---------

Co-authored-by: Thomas Trompette <thomast@twenty.com>
This commit is contained in:
Thomas Trompette
2024-01-30 14:50:33 +01:00
committed by GitHub
parent 73f6876641
commit 84b6bea2b9
4 changed files with 38 additions and 13 deletions

View File

@ -3,7 +3,7 @@ import styled from '@emotion/styled';
import { grayScale } from '@/ui/theme/constants/colors'; import { grayScale } from '@/ui/theme/constants/colors';
type FetchMoreLoaderProps = { type EmailThreadFetchMoreLoaderProps = {
loading: boolean; loading: boolean;
onLastRowVisible: (...args: any[]) => any; onLastRowVisible: (...args: any[]) => any;
}; };
@ -18,10 +18,10 @@ const StyledText = styled.div`
padding-left: ${({ theme }) => theme.spacing(2)}; padding-left: ${({ theme }) => theme.spacing(2)};
`; `;
export const FetchMoreLoader = ({ export const EmailThreadFetchMoreLoader = ({
loading, loading,
onLastRowVisible, onLastRowVisible,
}: FetchMoreLoaderProps) => { }: EmailThreadFetchMoreLoaderProps) => {
const { ref: tbodyRef } = useInView({ const { ref: tbodyRef } = useInView({
onChange: onLastRowVisible, onChange: onLastRowVisible,
}); });

View File

@ -3,6 +3,7 @@ import { useQuery } from '@apollo/client';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { EmailThreadFetchMoreLoader } from '@/activities/emails/components/EmailThreadFetchMoreLoader';
import { EmailThreadPreview } from '@/activities/emails/components/EmailThreadPreview'; import { EmailThreadPreview } from '@/activities/emails/components/EmailThreadPreview';
import { TIMELINE_THREADS_DEFAULT_PAGE_SIZE } from '@/activities/emails/constants/messaging.constants'; import { TIMELINE_THREADS_DEFAULT_PAGE_SIZE } from '@/activities/emails/constants/messaging.constants';
import { useEmailThread } from '@/activities/emails/hooks/useEmailThread'; import { useEmailThread } from '@/activities/emails/hooks/useEmailThread';
@ -21,7 +22,6 @@ import {
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Card } from '@/ui/layout/card/components/Card'; import { Card } from '@/ui/layout/card/components/Card';
import { Section } from '@/ui/layout/section/components/Section'; import { Section } from '@/ui/layout/section/components/Section';
import { FetchMoreLoader } from '@/ui/utilities/loading-state/components/FetchMoreLoader';
import { import {
GetTimelineThreadsFromPersonIdQueryVariables, GetTimelineThreadsFromPersonIdQueryVariables,
TimelineThread, TimelineThread,
@ -146,7 +146,7 @@ export const EmailThreads = ({
))} ))}
</Card> </Card>
)} )}
<FetchMoreLoader <EmailThreadFetchMoreLoader
loading={isFetchingMoreEmails} loading={isFetchingMoreEmails}
onLastRowVisible={fetchMoreRecords} onLastRowVisible={fetchMoreRecords}
/> />

View File

@ -2,13 +2,13 @@ import React, { useCallback } from 'react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EmailThreadFetchMoreLoader } from '@/activities/emails/components/EmailThreadFetchMoreLoader';
import { EmailThreadHeader } from '@/activities/emails/components/EmailThreadHeader'; import { EmailThreadHeader } from '@/activities/emails/components/EmailThreadHeader';
import { EmailThreadMessage } from '@/activities/emails/components/EmailThreadMessage'; import { EmailThreadMessage } from '@/activities/emails/components/EmailThreadMessage';
import { viewableEmailThreadState } from '@/activities/emails/state/viewableEmailThreadState'; import { viewableEmailThreadState } from '@/activities/emails/state/viewableEmailThreadState';
import { EmailThreadMessage as EmailThreadMessageType } from '@/activities/emails/types/EmailThreadMessage'; import { EmailThreadMessage as EmailThreadMessageType } from '@/activities/emails/types/EmailThreadMessage';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { FetchMoreLoader } from '@/ui/utilities/loading-state/components/FetchMoreLoader';
const StyledContainer = styled.div` const StyledContainer = styled.div`
box-sizing: border-box; box-sizing: border-box;
@ -67,7 +67,10 @@ export const RightDrawerEmailThread = () => {
sentAt={message.receivedAt} sentAt={message.receivedAt}
/> />
))} ))}
<FetchMoreLoader loading={loading} onLastRowVisible={fetchMoreMessages} /> <EmailThreadFetchMoreLoader
loading={loading}
onLastRowVisible={fetchMoreMessages}
/>
</StyledContainer> </StyledContainer>
); );
}; };

View File

@ -1,21 +1,33 @@
import { useInView } from 'react-intersection-observer';
import styled from '@emotion/styled';
import { useRecoilCallback, useRecoilValue } from 'recoil'; import { useRecoilCallback, useRecoilValue } from 'recoil';
import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable'; import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable';
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { isFetchingMoreRecordsFamilyState } from '@/object-record/states/isFetchingMoreRecordsFamilyState'; import { isFetchingMoreRecordsFamilyState } from '@/object-record/states/isFetchingMoreRecordsFamilyState';
import { FetchMoreLoader } from '@/ui/utilities/loading-state/components/FetchMoreLoader'; import { grayScale } from '@/ui/theme/constants/colors';
type RecordTableBodyFetchMoreLoaderProps = { type RecordTableBodyFetchMoreLoaderProps = {
objectNameSingular: string; objectNameSingular: string;
}; };
const StyledText = styled.div`
align-items: center;
box-shadow: none;
color: ${grayScale.gray40};
display: flex;
height: 32px;
margin-left: ${({ theme }) => theme.spacing(8)};
padding-left: ${({ theme }) => theme.spacing(2)};
`;
export const RecordTableBodyFetchMoreLoader = ({ export const RecordTableBodyFetchMoreLoader = ({
objectNameSingular, objectNameSingular,
}: RecordTableBodyFetchMoreLoaderProps) => { }: RecordTableBodyFetchMoreLoaderProps) => {
const { queryStateIdentifier } = useLoadRecordIndexTable(objectNameSingular); const { queryStateIdentifier } = useLoadRecordIndexTable(objectNameSingular);
const { setRecordTableLastRowVisible } = useRecordTable(); const { setRecordTableLastRowVisible } = useRecordTable();
const isFetchingMoreObjects = useRecoilValue( const isFetchingMoreRecords = useRecoilValue(
isFetchingMoreRecordsFamilyState(queryStateIdentifier), isFetchingMoreRecordsFamilyState(queryStateIdentifier),
); );
@ -26,10 +38,20 @@ export const RecordTableBodyFetchMoreLoader = ({
[setRecordTableLastRowVisible], [setRecordTableLastRowVisible],
); );
const { ref: tbodyRef } = useInView({
onChange: onLastRowVisible,
});
return ( return (
<FetchMoreLoader <tbody ref={tbodyRef}>
loading={isFetchingMoreObjects} {isFetchingMoreRecords && (
onLastRowVisible={onLastRowVisible} <tr>
/> <td colSpan={7}>
<StyledText>Loading more...</StyledText>
</td>
<td colSpan={7} />
</tr>
)}
</tbody>
); );
}; };