diff --git a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts index 9c090f213..54befcecb 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts @@ -33,6 +33,7 @@ export const useFindManyRecords = ({ orderBy, limit, onCompleted, + onError, skip, recordGqlFields, fetchPolicy, @@ -45,6 +46,7 @@ export const useFindManyRecords = ({ totalCount?: number; }, ) => void; + onError?: (error?: Error) => void; skip?: boolean; recordGqlFields?: RecordGqlOperationGqlRecordFields; fetchPolicy?: WatchQueryFetchPolicy; @@ -120,6 +122,7 @@ export const useFindManyRecords = ({ variant: SnackBarVariant.Error, }, ); + onError?.(error); }, }); diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts index 50320fd13..c6a26daad 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts @@ -61,6 +61,9 @@ export const useLoadRecordIndexTable = (objectNameSingular: string) => { setLastRowVisible(false); setIsRecordTableInitialLoading(false); }, + onError: () => { + setIsRecordTableInitialLoading(false); + }, }); return { diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableEmptyState.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableEmptyState.tsx new file mode 100644 index 000000000..48c7d58c5 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableEmptyState.tsx @@ -0,0 +1,59 @@ +import { useNavigate } from 'react-router-dom'; +import { IconPlus, IconSettings } from 'twenty-ui'; + +import { Button } from '@/ui/input/button/components/Button'; +import AnimatedPlaceholder from '@/ui/layout/animated-placeholder/components/AnimatedPlaceholder'; +import { + AnimatedPlaceholderEmptyContainer, + AnimatedPlaceholderEmptySubTitle, + AnimatedPlaceholderEmptyTextContainer, + AnimatedPlaceholderEmptyTitle, +} from '@/ui/layout/animated-placeholder/components/EmptyPlaceholderStyled'; + +type RecordTableEmptyStateProps = { + objectLabel: string; + createRecord: () => void; + isRemote: boolean; +}; + +export const RecordTableEmptyState = ({ + objectLabel, + createRecord, + isRemote, +}: RecordTableEmptyStateProps) => { + const navigate = useNavigate(); + + const [title, subTitle, Icon, onClick, buttonTitle] = isRemote + ? [ + 'No Data Available for Remote Table', + 'If this is unexpected, please verify your settings.', + IconSettings, + () => navigate('/settings/integrations'), + 'Go to Settings', + ] + : [ + `Add your first ${objectLabel}`, + `Use our API or add your first ${objectLabel} manually`, + IconPlus, + createRecord, + `Add a ${objectLabel}`, + ]; + + return ( + + + + {title} + + {subTitle} + + +