diff --git a/packages/twenty-front/src/effect-components/PageChangeEffect.tsx b/packages/twenty-front/src/effect-components/PageChangeEffect.tsx index 4e0f29928..998e7b291 100644 --- a/packages/twenty-front/src/effect-components/PageChangeEffect.tsx +++ b/packages/twenty-front/src/effect-components/PageChangeEffect.tsx @@ -18,8 +18,8 @@ import { IconCheckbox } from '@/ui/display/icon'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { useGetWorkspaceFromInviteHashLazyQuery } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { useIsMatchingLocation } from '../hooks/useIsMatchingLocation'; @@ -83,13 +83,13 @@ export const PageChangeEffect = () => { ) { navigate(AppPath.SignIn); } else if ( - isNonNullable(onboardingStatus) && + isDefined(onboardingStatus) && onboardingStatus === OnboardingStatus.Incomplete && !isMatchingLocation(AppPath.PlanRequired) ) { navigate(AppPath.PlanRequired); } else if ( - isNonNullable(onboardingStatus) && + isDefined(onboardingStatus) && [OnboardingStatus.Unpaid, OnboardingStatus.Canceled].includes( onboardingStatus, ) && @@ -124,7 +124,7 @@ export const PageChangeEffect = () => { inviteHash, }, onCompleted: (data) => { - if (isNullable(data.findWorkspaceFromInviteHash)) { + if (isUndefinedOrNull(data.findWorkspaceFromInviteHash)) { navigateToSignUp(); } }, diff --git a/packages/twenty-front/src/modules/activities/blocks/FileBlock.tsx b/packages/twenty-front/src/modules/activities/blocks/FileBlock.tsx index 12dd9b29c..de679ea55 100644 --- a/packages/twenty-front/src/modules/activities/blocks/FileBlock.tsx +++ b/packages/twenty-front/src/modules/activities/blocks/FileBlock.tsx @@ -12,8 +12,8 @@ import { isNonEmptyString } from '@sniptt/guards'; import { Button } from '@/ui/input/button/components/Button'; import { AppThemeProvider } from '@/ui/theme/components/AppThemeProvider'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { AttachmentIcon } from '../files/components/AttachmentIcon'; import { AttachmentType } from '../files/types/Attachment'; @@ -80,7 +80,7 @@ const FileBlockRenderer = ({ const inputFileRef = useRef(null); const handleUploadAttachment = async (file: File) => { - if (isNullable(file)) { + if (isUndefinedOrNull(file)) { return ''; } const fileUrl = await editor.uploadFile?.(file); @@ -96,8 +96,7 @@ const FileBlockRenderer = ({ inputFileRef?.current?.click?.(); }; const handleFileChange = (e: ChangeEvent) => { - if (isNonNullable(e.target.files)) - handleUploadAttachment?.(e.target.files[0]); + if (isDefined(e.target.files)) handleUploadAttachment?.(e.target.files[0]); }; if (isNonEmptyString(block.props.url)) { diff --git a/packages/twenty-front/src/modules/activities/calendar/utils/sortCalendarEvents.ts b/packages/twenty-front/src/modules/activities/calendar/utils/sortCalendarEvents.ts index 8ae8d1a3d..2619d2887 100644 --- a/packages/twenty-front/src/modules/activities/calendar/utils/sortCalendarEvents.ts +++ b/packages/twenty-front/src/modules/activities/calendar/utils/sortCalendarEvents.ts @@ -1,5 +1,5 @@ import { CalendarEvent } from '@/activities/calendar/types/CalendarEvent'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { sortAsc } from '~/utils/sort'; export const sortCalendarEventsAsc = ( @@ -13,8 +13,8 @@ export const sortCalendarEventsAsc = ( if ( startsAtSort === 0 && - isNonNullable(calendarEventA.endsAt) && - isNonNullable(calendarEventB.endsAt) + isDefined(calendarEventA.endsAt) && + isDefined(calendarEventB.endsAt) ) { return sortAsc( calendarEventA.endsAt.getTime(), diff --git a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx index aec4a248d..16a862c40 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx @@ -25,8 +25,8 @@ import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { isNonTextWritingKey } from '@/ui/utilities/hotkey/utils/isNonTextWritingKey'; import { REACT_APP_SERVER_BASE_URL } from '~/config'; import { FileFolder, useUploadFileMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { blockSpecs } from '../blocks/blockSpecs'; import { getSlashMenu } from '../blocks/slashMenu'; @@ -80,7 +80,7 @@ export const ActivityBodyEditor = ({ const { upsertActivity } = useUpsertActivity(); const persistBodyDebounced = useDebouncedCallback((newBody: string) => { - if (isNonNullable(activity)) { + if (isDefined(activity)) { upsertActivity({ activity, input: { @@ -92,7 +92,7 @@ export const ActivityBodyEditor = ({ const persistTitleAndBodyDebounced = useDebouncedCallback( (newTitle: string, newBody: string) => { - if (isNonNullable(activity)) { + if (isDefined(activity)) { upsertActivity({ activity, input: { @@ -126,7 +126,7 @@ export const ActivityBodyEditor = ({ const [uploadFile] = useUploadFileMutation(); const handleUploadAttachment = async (file: File): Promise => { - if (isNullable(file)) { + if (isUndefinedOrNull(file)) { return ''; } const result = await uploadFile({ @@ -228,7 +228,7 @@ export const ActivityBodyEditor = ({ if (isNonEmptyString(activityBody) && activityBody !== '{}') { return JSON.parse(activityBody); } else if ( - isNonNullable(activity) && + isDefined(activity) && isNonEmptyString(activity.body) && activity?.body !== '{}' ) { @@ -253,7 +253,7 @@ export const ActivityBodyEditor = ({ const handleImagePaste = async (event: ClipboardEvent) => { const clipboardItems = event.clipboardData?.items; - if (isNonNullable(clipboardItems)) { + if (isDefined(clipboardItems)) { for (let i = 0; i < clipboardItems.length; i++) { if (clipboardItems[i].kind === 'file') { const isImage = clipboardItems[i].type.match('^image/'); @@ -268,7 +268,7 @@ export const ActivityBodyEditor = ({ return; } - if (isNonNullable(isImage)) { + if (isDefined(isImage)) { editor?.insertBlocks( [ { @@ -334,7 +334,7 @@ export const ActivityBodyEditor = ({ const currentBlockContent = blockIdentifier?.content; if ( - isNonNullable(currentBlockContent) && + isDefined(currentBlockContent) && isArray(currentBlockContent) && currentBlockContent.length === 0 ) { @@ -346,7 +346,7 @@ export const ActivityBodyEditor = ({ } if ( - isNonNullable(currentBlockContent) && + isDefined(currentBlockContent) && isArray(currentBlockContent) && currentBlockContent[0] && currentBlockContent[0].type === 'text' diff --git a/packages/twenty-front/src/modules/activities/components/ActivityBodyEffect.tsx b/packages/twenty-front/src/modules/activities/components/ActivityBodyEffect.tsx index 8e244b30c..221d08720 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityBodyEffect.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityBodyEffect.tsx @@ -3,7 +3,7 @@ import { useRecoilState } from 'recoil'; import { activityBodyFamilyState } from '@/activities/states/activityBodyFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ActivityBodyEffect = ({ activityId }: { activityId: string }) => { const [activityFromStore] = useRecoilState( @@ -17,7 +17,7 @@ export const ActivityBodyEffect = ({ activityId }: { activityId: string }) => { useEffect(() => { if ( activityBody === '' && - isNonNullable(activityFromStore) && + isDefined(activityFromStore) && activityBody !== activityFromStore.body ) { setActivityBody(activityFromStore.body); diff --git a/packages/twenty-front/src/modules/activities/components/ActivityEditorEffect.tsx b/packages/twenty-front/src/modules/activities/components/ActivityEditorEffect.tsx index 6c4c54065..1f839640e 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityEditorEffect.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityEditorEffect.tsx @@ -11,7 +11,7 @@ import { Activity } from '@/activities/types/Activity'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { RIGHT_DRAWER_CLICK_OUTSIDE_LISTENER_ID } from '@/ui/layout/right-drawer/constants/RightDrawerClickOutsideListener'; import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ActivityEditorEffect = ({ activityId, @@ -58,7 +58,7 @@ export const ActivityEditorEffect = ({ return; } - if (isActivityInCreateMode && isNonNullable(activity)) { + if (isActivityInCreateMode && isDefined(activity)) { if (canCreateActivity) { upsertActivity({ activity, @@ -72,7 +72,7 @@ export const ActivityEditorEffect = ({ } set(isActivityInCreateModeState(), false); - } else if (isNonNullable(activity)) { + } else if (isDefined(activity)) { if ( activity.title !== activityTitle || activity.body !== activityBody diff --git a/packages/twenty-front/src/modules/activities/components/ActivityEditorFields.tsx b/packages/twenty-front/src/modules/activities/components/ActivityEditorFields.tsx index 97d0a64a6..4f99035fa 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityEditorFields.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityEditorFields.tsx @@ -13,7 +13,7 @@ import { import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledPropertyBox = styled(PropertyBox)` padding: 0; @@ -36,7 +36,7 @@ export const ActivityEditorFields = ({ const upsertActivityMutation = async ({ variables, }: RecordUpdateHookParams) => { - if (isNonNullable(activityFromStore)) { + if (isDefined(activityFromStore)) { await upsertActivity({ activity: activityFromStore as Activity, input: variables.updateOneRecordInput, diff --git a/packages/twenty-front/src/modules/activities/components/ActivityTitle.tsx b/packages/twenty-front/src/modules/activities/components/ActivityTitle.tsx index db321d469..7a4a11f27 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityTitle.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityTitle.tsx @@ -22,7 +22,7 @@ import { } from '@/ui/input/components/Checkbox'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledEditableTitleInput = styled.input<{ completed: boolean; @@ -166,7 +166,7 @@ export const ActivityTitle = ({ activityId }: ActivityTitleProps) => { }); }; - const completed = isNonNullable(activity.completedAt); + const completed = isDefined(activity.completedAt); return ( diff --git a/packages/twenty-front/src/modules/activities/components/ActivityTitleEffect.tsx b/packages/twenty-front/src/modules/activities/components/ActivityTitleEffect.tsx index efcdaf4e9..50d3e4dff 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityTitleEffect.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityTitleEffect.tsx @@ -3,7 +3,7 @@ import { useRecoilState } from 'recoil'; import { activityTitleFamilyState } from '@/activities/states/activityTitleFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ActivityTitleEffect = ({ activityId }: { activityId: string }) => { const [activityFromStore] = useRecoilState( @@ -17,7 +17,7 @@ export const ActivityTitleEffect = ({ activityId }: { activityId: string }) => { useEffect(() => { if ( activityTitle === '' && - isNonNullable(activityFromStore) && + isDefined(activityFromStore) && activityTitle !== activityFromStore.title ) { setActivityTitle(activityFromStore.title); diff --git a/packages/twenty-front/src/modules/activities/emails/components/EmailThreads.tsx b/packages/twenty-front/src/modules/activities/emails/components/EmailThreads.tsx index b6eb8a097..9d249b4fb 100644 --- a/packages/twenty-front/src/modules/activities/emails/components/EmailThreads.tsx +++ b/packages/twenty-front/src/modules/activities/emails/components/EmailThreads.tsx @@ -33,7 +33,7 @@ import { TimelineThread, TimelineThreadsWithTotal, } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledContainer = styled.div` display: flex; @@ -141,7 +141,7 @@ export const EmailThreads = ({ } }; - if (isNonNullable(error)) { + if (isDefined(error)) { enqueueSnackBar(error.message || 'Error loading email threads', { variant: 'error', }); diff --git a/packages/twenty-front/src/modules/activities/emails/utils/getDisplayNameFromParticipant.ts b/packages/twenty-front/src/modules/activities/emails/utils/getDisplayNameFromParticipant.ts index a1e50d46b..ca1e63ee2 100644 --- a/packages/twenty-front/src/modules/activities/emails/utils/getDisplayNameFromParticipant.ts +++ b/packages/twenty-front/src/modules/activities/emails/utils/getDisplayNameFromParticipant.ts @@ -1,7 +1,7 @@ import { isNonEmptyString } from '@sniptt/guards'; import { EmailThreadMessageParticipant } from '@/activities/emails/types/EmailThreadMessageParticipant'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const getDisplayNameFromParticipant = ({ participant, @@ -10,14 +10,14 @@ export const getDisplayNameFromParticipant = ({ participant: EmailThreadMessageParticipant; shouldUseFullName?: boolean; }) => { - if (isNonNullable(participant.person)) { + if (isDefined(participant.person)) { return ( `${participant.person?.name?.firstName}` + (shouldUseFullName ? ` ${participant.person?.name?.lastName}` : '') ); } - if (isNonNullable(participant.workspaceMember)) { + if (isDefined(participant.workspaceMember)) { return ( participant.workspaceMember?.name?.firstName + (shouldUseFullName diff --git a/packages/twenty-front/src/modules/activities/files/components/Attachments.tsx b/packages/twenty-front/src/modules/activities/files/components/Attachments.tsx index ffaaf4dde..b09da6f15 100644 --- a/packages/twenty-front/src/modules/activities/files/components/Attachments.tsx +++ b/packages/twenty-front/src/modules/activities/files/components/Attachments.tsx @@ -16,7 +16,7 @@ import { AnimatedPlaceholderEmptyTextContainer, AnimatedPlaceholderEmptyTitle, } from '@/ui/layout/animated-placeholder/components/EmptyPlaceholderStyled'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledAttachmentsContainer = styled.div` display: flex; @@ -47,7 +47,7 @@ export const Attachments = ({ const [isDraggingFile, setIsDraggingFile] = useState(false); const handleFileChange = (e: ChangeEvent) => { - if (isNonNullable(e.target.files)) onUploadFile?.(e.target.files[0]); + if (isDefined(e.target.files)) onUploadFile?.(e.target.files[0]); }; const handleUploadFileClick = () => { diff --git a/packages/twenty-front/src/modules/activities/hooks/useActivityConnectionUtils.ts b/packages/twenty-front/src/modules/activities/hooks/useActivityConnectionUtils.ts index a858368df..55cd0b401 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useActivityConnectionUtils.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useActivityConnectionUtils.ts @@ -8,7 +8,7 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi import { getEmptyPageInfo } from '@/object-record/cache/utils/getEmptyPageInfo'; import { useMapConnectionToRecords } from '@/object-record/hooks/useMapConnectionToRecords'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useActivityConnectionUtils = () => { const mapConnectionToRecords = useMapConnectionToRecords(); @@ -19,7 +19,7 @@ export const useActivityConnectionUtils = () => { comments: ObjectRecordConnection; }, ) => { - if (!isNonNullable(activityWithConnections)) { + if (!isDefined(activityWithConnections)) { throw new Error('Activity with connections is not defined'); } diff --git a/packages/twenty-front/src/modules/activities/hooks/useActivityTargetObjectRecords.ts b/packages/twenty-front/src/modules/activities/hooks/useActivityTargetObjectRecords.ts index 00dacda4f..63e87ba07 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useActivityTargetObjectRecords.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useActivityTargetObjectRecords.ts @@ -7,7 +7,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { Nullable } from '~/types/Nullable'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useActivityTargetObjectRecords = ({ activityId, @@ -31,7 +31,7 @@ export const useActivityTargetObjectRecords = ({ .map>((activityTarget) => { const correspondingObjectMetadataItem = objectMetadataItems.find( (objectMetadataItem) => - isNonNullable(activityTarget[objectMetadataItem.nameSingular]) && + isDefined(activityTarget[objectMetadataItem.nameSingular]) && !objectMetadataItem.isSystem, ); @@ -47,7 +47,7 @@ export const useActivityTargetObjectRecords = ({ targetObjectNameSingular: correspondingObjectMetadataItem.nameSingular, }; }) - .filter(isNonNullable); + .filter(isDefined); return { activityTargetObjectRecords, diff --git a/packages/twenty-front/src/modules/activities/hooks/useAttachRelationInBothDirections.ts b/packages/twenty-front/src/modules/activities/hooks/useAttachRelationInBothDirections.ts index bdc0df87d..2ef89de54 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useAttachRelationInBothDirections.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useAttachRelationInBothDirections.ts @@ -6,7 +6,7 @@ import { triggerAttachRelationOptimisticEffect } from '@/apollo/optimistic-effec import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { getObjectMetadataItemByNameSingular } from '@/object-metadata/utils/getObjectMetadataItemBySingularName'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useAttachRelationInBothDirections = () => { const { objectMetadataItems } = useObjectMetadataItems(); @@ -46,7 +46,7 @@ export const useAttachRelationInBothDirections = () => { (field) => field.name === fieldNameOnSourceRecord, ); - if (!isNonNullable(fieldMetadataItemOnSourceRecord)) { + if (!isDefined(fieldMetadataItemOnSourceRecord)) { throw new Error( `Field ${fieldNameOnSourceRecord} not found on object ${sourceObjectNameSingular}`, ); @@ -57,7 +57,7 @@ export const useAttachRelationInBothDirections = () => { objectMetadataItems, }); - if (!isNonNullable(relationDefinition)) { + if (!isDefined(relationDefinition)) { throw new Error( `Relation metadata not found for field ${fieldNameOnSourceRecord} on object ${sourceObjectNameSingular}`, ); diff --git a/packages/twenty-front/src/modules/activities/hooks/useCreateActivityInCache.ts b/packages/twenty-front/src/modules/activities/hooks/useCreateActivityInCache.ts index 7cd4785e1..1479b0580 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useCreateActivityInCache.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useCreateActivityInCache.ts @@ -14,7 +14,7 @@ import { useCreateOneRecordInCache } from '@/object-record/hooks/useCreateOneRec import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useCreateActivityInCache = () => { const { createManyRecordsInCache: createManyActivityTargetsInCache } = @@ -71,7 +71,7 @@ export const useCreateActivityInCache = () => { return targetObject; }) - .filter(isNonNullable); + .filter(isDefined); const activityTargetsToCreate = makeActivityTargetsToCreateFromTargetableObjects({ diff --git a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawerForSelectedRowIds.ts b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawerForSelectedRowIds.ts index 31300e434..11cd38d54 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawerForSelectedRowIds.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawerForSelectedRowIds.ts @@ -5,7 +5,7 @@ import { ActivityType } from '@/activities/types/Activity'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ActivityTargetableObject } from '../types/ActivityTargetableEntity'; @@ -47,9 +47,9 @@ export const useOpenCreateActivityDrawerForSelectedRowIds = ( targetObjectRecord, }; }) - .filter(isNonNullable); + .filter(isDefined); - if (isNonNullable(relatedEntities)) { + if (isDefined(relatedEntities)) { activityTargetableObjectArray = activityTargetableObjectArray.concat(relatedEntities); } diff --git a/packages/twenty-front/src/modules/activities/hooks/useUpsertActivity.ts b/packages/twenty-front/src/modules/activities/hooks/useUpsertActivity.ts index 776118678..2634eddc1 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useUpsertActivity.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useUpsertActivity.ts @@ -16,7 +16,7 @@ import { objectShowPageTargetableObjectState } from '@/activities/timeline/state import { Activity } from '@/activities/types/Activity'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; // TODO: create a generic way to have records only in cache for create mode and delete them afterwards ? export const useUpsertActivity = () => { @@ -85,7 +85,7 @@ export const useUpsertActivity = () => { makeActivityWithConnection(activityToCreate); if (weAreOnTaskPage) { - if (isNonNullable(activityWithConnection.completedAt)) { + if (isDefined(activityWithConnection.completedAt)) { injectActivitiesQueries({ activitiesFilters: currentCompletedTaskQueryVariables?.filter, activitiesOrderByVariables: @@ -112,10 +112,7 @@ export const useUpsertActivity = () => { } // Call optimistic effects - if ( - weAreOnObjectShowPage && - isNonNullable(objectShowPageTargetableObject) - ) { + if (weAreOnObjectShowPage && isDefined(objectShowPageTargetableObject)) { injectIntoTimelineActivitiesQueries({ timelineTargetableObject: objectShowPageTargetableObject, activityToInject: activityWithConnection, @@ -128,7 +125,7 @@ export const useUpsertActivity = () => { const injectOnlyInIdFilterForNotesQueries = activityWithConnection.type !== 'Note'; - if (isNonNullable(currentCompletedTaskQueryVariables)) { + if (isDefined(currentCompletedTaskQueryVariables)) { injectActivitiesQueries({ activitiesFilters: currentCompletedTaskQueryVariables?.filter, activitiesOrderByVariables: @@ -140,7 +137,7 @@ export const useUpsertActivity = () => { }); } - if (isNonNullable(currentIncompleteTaskQueryVariables)) { + if (isDefined(currentIncompleteTaskQueryVariables)) { injectActivitiesQueries({ activitiesFilters: currentIncompleteTaskQueryVariables?.filter ?? {}, @@ -153,7 +150,7 @@ export const useUpsertActivity = () => { }); } - if (isNonNullable(currentNotesQueryVariables)) { + if (isDefined(currentNotesQueryVariables)) { injectActivitiesQueries({ activitiesFilters: currentNotesQueryVariables?.filter, activitiesOrderByVariables: currentNotesQueryVariables?.orderBy, diff --git a/packages/twenty-front/src/modules/activities/right-drawer/components/ActivityActionBar.tsx b/packages/twenty-front/src/modules/activities/right-drawer/components/ActivityActionBar.tsx index b52de3b41..1069e8f79 100644 --- a/packages/twenty-front/src/modules/activities/right-drawer/components/ActivityActionBar.tsx +++ b/packages/twenty-front/src/modules/activities/right-drawer/components/ActivityActionBar.tsx @@ -28,7 +28,7 @@ import { mapToRecordId } from '@/object-record/utils/mapToObjectId'; import { IconPlus, IconTrash } from '@/ui/display/icon'; import { IconButton } from '@/ui/input/button/components/IconButton'; import { isRightDrawerOpenState } from '@/ui/layout/right-drawer/states/isRightDrawerOpenState'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledButtonContainer = styled.div` display: inline-flex; @@ -111,10 +111,7 @@ export const ActivityActionBar = () => { setIsRightDrawerOpen(false); if (isNonEmptyString(viewableActivityId)) { - if ( - isActivityInCreateMode && - isNonNullable(temporaryActivityForEditor) - ) { + if (isActivityInCreateMode && isDefined(temporaryActivityForEditor)) { deleteActivityFromCache(temporaryActivityForEditor); setTemporaryActivityForEditor(null); } else if (isNonEmptyString(activityIdInDrawer)) { @@ -139,7 +136,7 @@ export const ActivityActionBar = () => { }); } else if ( weAreOnObjectShowPage && - isNonNullable(objectShowPageTargetableObject) + isDefined(objectShowPageTargetableObject) ) { removeFromActivitiesQueries({ activityIdToRemove: viewableActivityId, @@ -149,7 +146,7 @@ export const ActivityActionBar = () => { FIND_MANY_TIMELINE_ACTIVITIES_ORDER_BY, }); - if (isNonNullable(currentCompletedTaskQueryVariables)) { + if (isDefined(currentCompletedTaskQueryVariables)) { removeFromActivitiesQueries({ activityIdToRemove: viewableActivityId, targetableObjects: [objectShowPageTargetableObject], @@ -159,7 +156,7 @@ export const ActivityActionBar = () => { }); } - if (isNonNullable(currentIncompleteTaskQueryVariables)) { + if (isDefined(currentIncompleteTaskQueryVariables)) { removeFromActivitiesQueries({ activityIdToRemove: viewableActivityId, targetableObjects: [objectShowPageTargetableObject], @@ -170,7 +167,7 @@ export const ActivityActionBar = () => { }); } - if (isNonNullable(currentNotesQueryVariables)) { + if (isDefined(currentNotesQueryVariables)) { removeFromActivitiesQueries({ activityIdToRemove: viewableActivityId, targetableObjects: [objectShowPageTargetableObject], @@ -221,10 +218,7 @@ export const ActivityActionBar = () => { const addActivity = () => { setIsRightDrawerOpen(false); - if ( - isNonNullable(record) && - isNonNullable(objectShowPageTargetableObject) - ) { + if (isDefined(record) && isDefined(objectShowPageTargetableObject)) { openCreateActivity({ type: record?.type, customAssignee: record?.assignee, diff --git a/packages/twenty-front/src/modules/activities/timeline/components/TimelineQueryEffect.tsx b/packages/twenty-front/src/modules/activities/timeline/components/TimelineQueryEffect.tsx index 5159d5d36..2b7df9fe3 100644 --- a/packages/twenty-front/src/modules/activities/timeline/components/TimelineQueryEffect.tsx +++ b/packages/twenty-front/src/modules/activities/timeline/components/TimelineQueryEffect.tsx @@ -12,7 +12,7 @@ import { Activity } from '@/activities/types/Activity'; import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity'; import { sortObjectRecordByDateField } from '@/object-record/utils/sortObjectRecordByDateField'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const TimelineQueryEffect = ({ targetableObject, @@ -31,7 +31,7 @@ export const TimelineQueryEffect = ({ targetableObjects: [targetableObject], activitiesFilters: {}, activitiesOrderByVariables: FIND_MANY_TIMELINE_ACTIVITIES_ORDER_BY, - skip: !isNonNullable(targetableObject), + skip: !isDefined(targetableObject), }); const [timelineActivitiesNetworking, setTimelineActivitiesNetworking] = @@ -41,7 +41,7 @@ export const TimelineQueryEffect = ({ useRecoilState(timelineActivitiesForGroupState()); useEffect(() => { - if (!isNonNullable(targetableObject)) { + if (!isDefined(targetableObject)) { return; } diff --git a/packages/twenty-front/src/modules/activities/timeline/hooks/useTimelineActivities.ts b/packages/twenty-front/src/modules/activities/timeline/hooks/useTimelineActivities.ts index 8498ed4da..0af9d4931 100644 --- a/packages/twenty-front/src/modules/activities/timeline/hooks/useTimelineActivities.ts +++ b/packages/twenty-front/src/modules/activities/timeline/hooks/useTimelineActivities.ts @@ -13,7 +13,7 @@ import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getR import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { sortByAscString } from '~/utils/array/sortByAscString'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useTimelineActivities = ({ targetableObject, @@ -27,7 +27,7 @@ export const useTimelineActivities = ({ ); useEffect(() => { - if (isNonNullable(targetableObject)) { + if (isDefined(targetableObject)) { setObjectShowPageTargetableObject(targetableObject); } }, [targetableObject, setObjectShowPageTargetableObject]); @@ -100,7 +100,7 @@ export const useTimelineActivities = ({ const activities = activitiesWithConnection ?.map(makeActivityWithoutConnection as any) .map(({ activity }: any) => activity as any) - .filter(isNonNullable); + .filter(isDefined); return { activities, diff --git a/packages/twenty-front/src/modules/activities/timeline/utils/groupActivitiesByMonth.ts b/packages/twenty-front/src/modules/activities/timeline/utils/groupActivitiesByMonth.ts index a773cd171..44bf5b9e4 100644 --- a/packages/twenty-front/src/modules/activities/timeline/utils/groupActivitiesByMonth.ts +++ b/packages/twenty-front/src/modules/activities/timeline/utils/groupActivitiesByMonth.ts @@ -1,5 +1,5 @@ import { Activity } from '@/activities/types/Activity'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type ActivityForActivityGroup = Pick; @@ -22,7 +22,7 @@ export const groupActivitiesByMonth = ( const matchingGroup = acitivityGroups.find( (x) => x.year === year && x.month === month, ); - if (isNonNullable(matchingGroup)) { + if (isDefined(matchingGroup)) { matchingGroup.items.push(activity); } else { acitivityGroups.push({ diff --git a/packages/twenty-front/src/modules/activities/utils/flattenTargetableObjectsAndTheirRelatedTargetableObjects.ts b/packages/twenty-front/src/modules/activities/utils/flattenTargetableObjectsAndTheirRelatedTargetableObjects.ts index 23427302f..49256f8bb 100644 --- a/packages/twenty-front/src/modules/activities/utils/flattenTargetableObjectsAndTheirRelatedTargetableObjects.ts +++ b/packages/twenty-front/src/modules/activities/utils/flattenTargetableObjectsAndTheirRelatedTargetableObjects.ts @@ -1,4 +1,4 @@ -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ActivityTargetableObject } from '../types/ActivityTargetableEntity'; @@ -11,7 +11,7 @@ export const flattenTargetableObjectsAndTheirRelatedTargetableObjects = ( []) { flattenedTargetableObjects.push(targetableObject); - if (isNonNullable(targetableObject.relatedTargetableObjects)) { + if (isDefined(targetableObject.relatedTargetableObjects)) { for (const relatedEntity of targetableObject.relatedTargetableObjects ?? []) { flattenedTargetableObjects.push(relatedEntity); diff --git a/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts b/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts index 725deb426..4a2014779 100644 --- a/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts +++ b/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts @@ -9,7 +9,7 @@ import { AppPath } from '@/types/AppPath'; import { REACT_APP_SERVER_BASE_URL } from '~/config'; import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation'; import { useUpdateEffect } from '~/hooks/useUpdateEffect'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ApolloFactory } from '../services/apollo.factory'; @@ -58,7 +58,7 @@ export const useApolloFactory = () => { }, [setTokenPair, isDebugMode]); useUpdateEffect(() => { - if (isNonNullable(apolloRef.current)) { + if (isDefined(apolloRef.current)) { apolloRef.current.updateTokenPair(tokenPair); } }, [tokenPair]); diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/sortCachedObjectEdges.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/sortCachedObjectEdges.ts index 536563efd..10d4514af 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/sortCachedObjectEdges.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/sortCachedObjectEdges.ts @@ -4,7 +4,7 @@ import { ReadFieldFunction } from '@apollo/client/cache/core/types/common'; import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge'; import { OrderBy } from '@/object-metadata/types/OrderBy'; import { OrderByField } from '@/object-metadata/types/OrderByField'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { sortAsc, sortDesc, sortNullsFirst, sortNullsLast } from '~/utils/sort'; export const sortCachedObjectEdges = ({ @@ -31,7 +31,7 @@ export const sortCachedObjectEdges = ({ orderByFieldName, recordFromCache, ) ?? null; - const isSubFieldFilter = isNonNullable(fieldValue) && !!orderBySubFieldName; + const isSubFieldFilter = isDefined(fieldValue) && !!orderBySubFieldName; if (!isSubFieldFilter) return fieldValue as string | number | null; diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerAttachRelationOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerAttachRelationOptimisticEffect.ts index 188d43083..ba99ce464 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerAttachRelationOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerAttachRelationOptimisticEffect.ts @@ -2,7 +2,7 @@ import { ApolloCache, StoreObject } from '@apollo/client'; import { isCachedObjectRecordConnection } from '@/apollo/optimistic-effect/utils/isCachedObjectRecordConnection'; import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const triggerAttachRelationOptimisticEffect = ({ @@ -43,7 +43,7 @@ export const triggerAttachRelationOptimisticEffect = ({ __typename: sourceRecordTypeName, }); - if (!isNonNullable(sourceRecordReference)) { + if (!isDefined(sourceRecordReference)) { return targetRecordFieldValue; } diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts index 6ffff14c7..f0e35e6af 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts @@ -6,7 +6,7 @@ import { CachedObjectRecord } from '@/apollo/types/CachedObjectRecord'; import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge'; import { CachedObjectRecordQueryVariables } from '@/apollo/types/CachedObjectRecordQueryVariables'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { parseApolloStoreFieldName } from '~/utils/parseApolloStoreFieldName'; export const triggerDeleteRecordsOptimisticEffect = ({ @@ -68,7 +68,7 @@ export const triggerDeleteRecordsOptimisticEffect = ({ // TODO: same as in update, should we trigger DELETE ? if ( - isNonNullable(rootQueryVariables?.first) && + isDefined(rootQueryVariables?.first) && cachedEdges?.length === rootQueryVariables.first ) { return DELETE; diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts index 92890351c..574383743 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts @@ -9,7 +9,7 @@ import { CachedObjectRecordQueryVariables } from '@/apollo/types/CachedObjectRec import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { getEdgeTypename } from '@/object-record/cache/utils/getEdgeTypename'; import { isRecordMatchingFilter } from '@/object-record/record-filter/utils/isRecordMatchingFilter'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { parseApolloStoreFieldName } from '~/utils/parseApolloStoreFieldName'; // TODO: add extensive unit tests for this function @@ -71,7 +71,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ const rootQueryOrderBy = rootQueryVariables?.orderBy; const rootQueryLimit = rootQueryVariables?.first; - const shouldTryToMatchFilter = isNonNullable(rootQueryFilter); + const shouldTryToMatchFilter = isDefined(rootQueryFilter); if (shouldTryToMatchFilter) { const updatedRecordMatchesThisRootQueryFilter = @@ -101,7 +101,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ if (updatedRecordShouldBeAddedToRootQueryEdges) { const updatedRecordNodeReference = toReference(updatedRecord); - if (isNonNullable(updatedRecordNodeReference)) { + if (isDefined(updatedRecordNodeReference)) { rootQueryNextEdges.push({ __typename: objectEdgeTypeName, node: updatedRecordNodeReference, @@ -115,8 +115,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ } } - const rootQueryNextEdgesShouldBeSorted = - isNonNullable(rootQueryOrderBy); + const rootQueryNextEdgesShouldBeSorted = isDefined(rootQueryOrderBy); if ( rootQueryNextEdgesShouldBeSorted && @@ -129,7 +128,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ }); } - const shouldLimitNextRootQueryEdges = isNonNullable(rootQueryLimit); + const shouldLimitNextRootQueryEdges = isDefined(rootQueryLimit); // TODO: not sure that we should trigger a DELETE here, as it will trigger a network request // Is it the responsibility of this optimistic effect function to delete a root query that will trigger a network request ? diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRelationsOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRelationsOptimisticEffect.ts index a0a7ca2d1..0597a89ed 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRelationsOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRelationsOptimisticEffect.ts @@ -12,7 +12,7 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const triggerUpdateRelationsOptimisticEffect = ({ cache, @@ -36,7 +36,7 @@ export const triggerUpdateRelationsOptimisticEffect = ({ } const fieldDoesNotExist = - isNonNullable(updatedSourceRecord) && + isDefined(updatedSourceRecord) && !(fieldMetadataItemOnSourceRecord.name in updatedSourceRecord); if (fieldDoesNotExist) { @@ -87,7 +87,7 @@ export const triggerUpdateRelationsOptimisticEffect = ({ ? currentFieldValueOnSourceRecord.edges.map( ({ node }) => node as CachedObjectRecord, ) - : [currentFieldValueOnSourceRecord].filter(isNonNullable); + : [currentFieldValueOnSourceRecord].filter(isDefined); const updatedFieldValueOnSourceRecordIsARecordConnection = isObjectRecordConnection( @@ -100,11 +100,10 @@ export const triggerUpdateRelationsOptimisticEffect = ({ ? updatedFieldValueOnSourceRecord.edges.map( ({ node }) => node as CachedObjectRecord, ) - : [updatedFieldValueOnSourceRecord].filter(isNonNullable); + : [updatedFieldValueOnSourceRecord].filter(isDefined); const shouldDetachSourceFromAllTargets = - isNonNullable(currentSourceRecord) && - targetRecordsToDetachFrom.length > 0; + isDefined(currentSourceRecord) && targetRecordsToDetachFrom.length > 0; if (shouldDetachSourceFromAllTargets) { // TODO: see if we can de-hardcode this, put cascade delete in relation metadata item @@ -136,7 +135,7 @@ export const triggerUpdateRelationsOptimisticEffect = ({ } const shouldAttachSourceToAllTargets = - isNonNullable(updatedSourceRecord) && targetRecordsToAttachTo.length > 0; + isDefined(updatedSourceRecord) && targetRecordsToAttachTo.length > 0; if (shouldAttachSourceToAllTargets) { targetRecordsToAttachTo.forEach((targetRecordToAttachTo) => diff --git a/packages/twenty-front/src/modules/apollo/services/apollo.factory.ts b/packages/twenty-front/src/modules/apollo/services/apollo.factory.ts index 1887837dc..53726ae22 100644 --- a/packages/twenty-front/src/modules/apollo/services/apollo.factory.ts +++ b/packages/twenty-front/src/modules/apollo/services/apollo.factory.ts @@ -14,7 +14,7 @@ import { createUploadLink } from 'apollo-upload-client'; import { renewToken } from '@/auth/services/AuthService'; import { AuthTokenPair } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { logDebug } from '~/utils/logDebug'; import { ApolloManager } from '../types/apolloManager.interface'; @@ -78,7 +78,7 @@ export class ApolloFactory implements ApolloManager { }); const errorLink = onError( ({ graphQLErrors, networkError, forward, operation }) => { - if (isNonNullable(graphQLErrors)) { + if (isDefined(graphQLErrors)) { onErrorCb?.(graphQLErrors); for (const graphQLError of graphQLErrors) { @@ -86,7 +86,7 @@ export class ApolloFactory implements ApolloManager { return fromPromise( renewToken(uri, this.tokenPair) .then((tokens) => { - if (isNonNullable(tokens)) { + if (isDefined(tokens)) { onTokenPairChange?.(tokens); } }) @@ -101,7 +101,7 @@ export class ApolloFactory implements ApolloManager { return fromPromise( renewToken(uri, this.tokenPair) .then((tokens) => { - if (isNonNullable(tokens)) { + if (isDefined(tokens)) { onTokenPairChange?.(tokens); } }) @@ -126,7 +126,7 @@ export class ApolloFactory implements ApolloManager { } } - if (isNonNullable(networkError)) { + if (isDefined(networkError)) { if (isDebugMode === true) { logDebug(`[Network error]: ${networkError}`); } @@ -143,7 +143,7 @@ export class ApolloFactory implements ApolloManager { isDebugMode ? logger : null, retryLink, httpLink, - ].filter(isNonNullable), + ].filter(isDefined), ); }; diff --git a/packages/twenty-front/src/modules/apollo/utils/index.ts b/packages/twenty-front/src/modules/apollo/utils/index.ts index 1aa3c60fa..8a6da6a26 100644 --- a/packages/twenty-front/src/modules/apollo/utils/index.ts +++ b/packages/twenty-front/src/modules/apollo/utils/index.ts @@ -1,6 +1,6 @@ import { ApolloLink, gql, Operation } from '@apollo/client'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { logDebug } from '~/utils/logDebug'; import { logError } from '~/utils/logError'; @@ -65,7 +65,7 @@ export const loggerLink = (getSchemaName: (operation: Operation) => string) => getGroup(!hasError)(...titleArgs); - if (isNonNullable(errors)) { + if (isDefined(errors)) { errors.forEach((err: any) => { logDebug( `%c${err.message}`, @@ -83,10 +83,10 @@ export const loggerLink = (getSchemaName: (operation: Operation) => string) => logDebug('QUERY', query); - if (isNonNullable(result.data)) { + if (isDefined(result.data)) { logDebug('RESULT', result.data); } - if (isNonNullable(errors)) { + if (isDefined(errors)) { logDebug('ERRORS', errors); } @@ -96,7 +96,7 @@ export const loggerLink = (getSchemaName: (operation: Operation) => string) => logDebug( `${operationType} ${schemaName}::${queryName} (in ${time} ms)`, ); - if (isNonNullable(errors)) { + if (isDefined(errors)) { logError(errors); } } diff --git a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts index dc0d2458f..d598b6980 100644 --- a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts +++ b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts @@ -26,7 +26,7 @@ import { useSignUpMutation, useVerifyMutation, } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { currentUserState } from '../states/currentUserState'; import { tokenPairState } from '../states/tokenPairState'; @@ -60,7 +60,7 @@ export const useAuth = () => { }, }); - if (isNonNullable(challengeResult.errors)) { + if (isDefined(challengeResult.errors)) { throw challengeResult.errors; } @@ -79,7 +79,7 @@ export const useAuth = () => { variables: { loginToken }, }); - if (isNonNullable(verifyResult.errors)) { + if (isDefined(verifyResult.errors)) { throw verifyResult.errors; } @@ -92,7 +92,7 @@ export const useAuth = () => { const user = verifyResult.data?.verify.user; let workspaceMember = null; setCurrentUser(user); - if (isNonNullable(user.workspaceMember)) { + if (isDefined(user.workspaceMember)) { workspaceMember = { ...user.workspaceMember, colorScheme: user.workspaceMember?.colorScheme as ColorScheme, @@ -184,7 +184,7 @@ export const useAuth = () => { }, }); - if (isNonNullable(signUpResult.errors)) { + if (isDefined(signUpResult.errors)) { throw signUpResult.errors; } diff --git a/packages/twenty-front/src/modules/auth/services/AuthService.ts b/packages/twenty-front/src/modules/auth/services/AuthService.ts index cc56547c1..91ddbe186 100644 --- a/packages/twenty-front/src/modules/auth/services/AuthService.ts +++ b/packages/twenty-front/src/modules/auth/services/AuthService.ts @@ -13,8 +13,8 @@ import { RenewTokenMutation, RenewTokenMutationVariables, } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; const logger = loggerLink(() => 'Twenty-Refresh'); @@ -47,7 +47,7 @@ const renewTokenMutation = async ( fetchPolicy: 'network-only', }); - if (isNonNullable(errors) || isNullable(data)) { + if (isDefined(errors) || isUndefinedOrNull(data)) { throw new Error('Something went wrong during token renewal'); } diff --git a/packages/twenty-front/src/modules/client-config/components/ClientConfigProvider.tsx b/packages/twenty-front/src/modules/client-config/components/ClientConfigProvider.tsx index debb354f1..f7caad94b 100644 --- a/packages/twenty-front/src/modules/client-config/components/ClientConfigProvider.tsx +++ b/packages/twenty-front/src/modules/client-config/components/ClientConfigProvider.tsx @@ -10,7 +10,7 @@ import { sentryConfigState } from '@/client-config/states/sentryConfigState'; import { supportChatState } from '@/client-config/states/supportChatState'; import { telemetryState } from '@/client-config/states/telemetryState'; import { useGetClientConfigQuery } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ClientConfigProvider: React.FC = ({ children, @@ -30,7 +30,7 @@ export const ClientConfigProvider: React.FC = ({ const { data, loading } = useGetClientConfigQuery(); useEffect(() => { - if (isNonNullable(data?.clientConfig)) { + if (isDefined(data?.clientConfig)) { setAuthProviders({ google: data?.clientConfig.authProviders.google, password: data?.clientConfig.authProviders.password, diff --git a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx index e4cef7b5f..0a7a6c554 100644 --- a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx +++ b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx @@ -23,7 +23,7 @@ import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; import { Avatar } from '@/users/components/Avatar'; import { getLogoUrlFromDomainName } from '~/utils'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { useCommandMenu } from '../hooks/useCommandMenu'; import { commandMenuCommandsState } from '../states/commandMenuCommandsState'; @@ -278,7 +278,7 @@ export const CommandMenu = () => { ...otherCommands, ].find((cmd) => cmd.id === itemId); - if (isNonNullable(command)) { + if (isDefined(command)) { const { to, onCommandClick } = command; onItemClick(onCommandClick, to); } diff --git a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenu.ts b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenu.ts index cf422e523..74307cc1f 100644 --- a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenu.ts +++ b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenu.ts @@ -7,7 +7,7 @@ import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchS import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { COMMAND_MENU_COMMANDS } from '../constants/CommandMenuCommands'; import { commandMenuCommandsState } from '../states/commandMenuCommandsState'; @@ -77,7 +77,7 @@ export const useCommandMenu = () => { (onClick?: () => void, to?: string) => { toggleCommandMenu(); - if (isNonNullable(onClick)) { + if (isDefined(onClick)) { onClick(); return; } diff --git a/packages/twenty-front/src/modules/error-handler/components/SentryInitiEffect.tsx b/packages/twenty-front/src/modules/error-handler/components/SentryInitiEffect.tsx index 639f6c781..874b5ac4b 100644 --- a/packages/twenty-front/src/modules/error-handler/components/SentryInitiEffect.tsx +++ b/packages/twenty-front/src/modules/error-handler/components/SentryInitiEffect.tsx @@ -8,7 +8,7 @@ import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMembe import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { sentryConfigState } from '@/client-config/states/sentryConfigState'; import { REACT_APP_SERVER_BASE_URL } from '~/config'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const SentryInitEffect = () => { const sentryConfig = useRecoilValue(sentryConfigState()); @@ -40,7 +40,7 @@ export const SentryInitEffect = () => { setIsSentryInitialized(true); } - if (isNonNullable(currentUser)) { + if (isDefined(currentUser)) { Sentry.setUser({ email: currentUser?.email, id: currentUser?.id, diff --git a/packages/twenty-front/src/modules/favorites/hooks/useFavorites.ts b/packages/twenty-front/src/modules/favorites/hooks/useFavorites.ts index 19c71c113..cf5f646aa 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/useFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/hooks/useFavorites.ts @@ -11,7 +11,7 @@ import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useFavorites = () => { const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState()); @@ -56,7 +56,7 @@ export const useFavorites = () => { return favorites .map((favorite) => { for (const relationField of favoriteRelationFieldMetadataItems) { - if (isNonNullable(favorite[relationField.name])) { + if (isDefined(favorite[relationField.name])) { const relationObject = favorite[relationField.name]; const relationObjectNameSingular = diff --git a/packages/twenty-front/src/modules/favorites/utils/mapFavorites.ts b/packages/twenty-front/src/modules/favorites/utils/mapFavorites.ts index ae9fae903..c0e5deff1 100644 --- a/packages/twenty-front/src/modules/favorites/utils/mapFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/utils/mapFavorites.ts @@ -1,10 +1,10 @@ import { getLogoUrlFromDomainName } from '~/utils'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const mapFavorites = (favorites: any) => { return favorites .map((favorite: any) => { - const recordInformation = isNonNullable(favorite?.person) + const recordInformation = isDefined(favorite?.person) ? { id: favorite.person.id, labelIdentifier: @@ -15,7 +15,7 @@ export const mapFavorites = (favorites: any) => { avatarType: 'rounded', link: `/object/person/${favorite.person.id}`, } - : isNonNullable(favorite?.company) + : isDefined(favorite?.company) ? { id: favorite.company.id, labelIdentifier: favorite.company.name, @@ -32,6 +32,6 @@ export const mapFavorites = (favorites: any) => { position: favorite?.position, }; }) - .filter(isNonNullable) + .filter(isDefined) .sort((a: any, b: any) => a.position - b.position); }; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useFilterOutUnexistingObjectMetadataItems.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useFilterOutUnexistingObjectMetadataItems.ts index 75ad0aed1..8241aeffb 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useFilterOutUnexistingObjectMetadataItems.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useFilterOutUnexistingObjectMetadataItems.ts @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil'; import { objectMetadataItemsByNameSingularMapSelector } from '@/object-metadata/states/objectMetadataItemsByNameSingularMapSelector'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useFilterOutUnexistingObjectMetadataItems = () => { const objectMetadataItemsByNameSingularMap = useRecoilValue( @@ -12,7 +12,7 @@ export const useFilterOutUnexistingObjectMetadataItems = () => { const filterOutUnexistingObjectMetadataItems = ( objectMetadatItem: ObjectMetadataItem, ) => - isNonNullable( + isDefined( objectMetadataItemsByNameSingularMap.get(objectMetadatItem.nameSingular), ); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts index e0072f675..5bd2c94a3 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts @@ -21,7 +21,7 @@ import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenera import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerateFindOneRecordQuery'; import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation'; import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier'; @@ -64,7 +64,7 @@ export const useObjectMetadataItem = ( objectMetadataItems = mockObjectMetadataItems; } - if (!isNonNullable(objectMetadataItem)) { + if (!isDefined(objectMetadataItem)) { throw new ObjectMetadataItemNotFoundError( objectNameSingular, objectMetadataItems, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItemOnly.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItemOnly.ts index ca269ed1e..aa74d57cc 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItemOnly.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectMetadataItemOnly.ts @@ -5,7 +5,7 @@ import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/Object import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier'; @@ -34,7 +34,7 @@ export const useObjectMetadataItemOnly = ({ objectMetadataItems = mockObjectMetadataItems; } - if (!isNonNullable(objectMetadataItem)) { + if (!isDefined(objectMetadataItem)) { throw new ObjectMetadataItemNotFoundError( objectNameSingular, objectMetadataItems, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts index df0e65af0..5af4b781f 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts @@ -3,7 +3,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useObjectNamePluralFromSingular = ({ objectNameSingular, @@ -28,7 +28,7 @@ export const useObjectNamePluralFromSingular = ({ ) ?? null; } - if (!isNonNullable(objectMetadataItem)) { + if (!isDefined(objectMetadataItem)) { throw new Error( `Object metadata item not found for ${objectNameSingular} object`, ); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts index a63b56305..3e189e224 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts @@ -3,7 +3,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useObjectNameSingularFromPlural = ({ objectNamePlural, @@ -29,7 +29,7 @@ export const useObjectNameSingularFromPlural = ({ ) ?? null; } - if (!isNonNullable(objectMetadataItem)) { + if (!isDefined(objectMetadataItem)) { throw new Error( `Object metadata item not found for ${objectNamePlural} object`, ); diff --git a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts index 2d6665d18..1774d0c1a 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts @@ -1,6 +1,6 @@ import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ObjectMetadataItem } from '../types/ObjectMetadataItem'; @@ -32,7 +32,7 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({ } if (field.type === FieldMetadataType.Relation) { - if (isNonNullable(field.fromRelationMetadata)) { + if (isDefined(field.fromRelationMetadata)) { return acc; } } diff --git a/packages/twenty-front/src/modules/object-metadata/utils/getObjectOrderByField.ts b/packages/twenty-front/src/modules/object-metadata/utils/getObjectOrderByField.ts index 20d41ff3f..89fe7fa2b 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/getObjectOrderByField.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/getObjectOrderByField.ts @@ -3,7 +3,7 @@ import { OrderBy } from '@/object-metadata/types/OrderBy'; import { OrderByField } from '@/object-metadata/types/OrderByField'; import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const getObjectOrderByField = ( objectMetadataItem: ObjectMetadataItem, @@ -12,7 +12,7 @@ export const getObjectOrderByField = ( const labelIdentifierFieldMetadata = getLabelIdentifierFieldMetadataItem(objectMetadataItem); - if (isNonNullable(labelIdentifierFieldMetadata)) { + if (isDefined(labelIdentifierFieldMetadata)) { switch (labelIdentifierFieldMetadata.type) { case FieldMetadataType.FullName: return { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/isLabelIdentifierField.ts b/packages/twenty-front/src/modules/object-metadata/utils/isLabelIdentifierField.ts index 489ea0e26..06bc0c576 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/isLabelIdentifierField.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/isLabelIdentifierField.ts @@ -1,6 +1,6 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const DEFAULT_LABEL_IDENTIFIER_FIELD_NAME = 'name'; @@ -14,6 +14,6 @@ export const isLabelIdentifierField = ({ 'labelIdentifierFieldMetadataId' >; }) => - isNonNullable(objectMetadataItem.labelIdentifierFieldMetadataId) + isDefined(objectMetadataItem.labelIdentifierFieldMetadataId) ? fieldMetadataItem.id === objectMetadataItem.labelIdentifierFieldMetadataId : fieldMetadataItem.name === DEFAULT_LABEL_IDENTIFIER_FIELD_NAME; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts index de9d705e4..65a90c8fa 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts @@ -4,7 +4,7 @@ import { FieldMetadataType, RelationMetadataType, } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const parseFieldRelationType = ( field: FieldMetadataItem | undefined, @@ -30,14 +30,14 @@ export const parseFieldRelationType = ( }; if ( - isNonNullable(field.fromRelationMetadata) && + isDefined(field.fromRelationMetadata) && field.fromRelationMetadata.relationType in config ) { return config[field.fromRelationMetadata.relationType].from; } if ( - isNonNullable(field.toRelationMetadata) && + isDefined(field.toRelationMetadata) && field.toRelationMetadata.relationType in config ) { return config[field.toRelationMetadata.relationType].to; diff --git a/packages/twenty-front/src/modules/object-record/cache/hooks/useGetRecordFromCache.ts b/packages/twenty-front/src/modules/object-record/cache/hooks/useGetRecordFromCache.ts index 9bda1c646..ae30c5897 100644 --- a/packages/twenty-front/src/modules/object-record/cache/hooks/useGetRecordFromCache.ts +++ b/packages/twenty-front/src/modules/object-record/cache/hooks/useGetRecordFromCache.ts @@ -5,7 +5,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const useGetRecordFromCache = ({ @@ -21,7 +21,7 @@ export const useGetRecordFromCache = ({ recordId: string, cache = apolloClient.cache, ) => { - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return null; } diff --git a/packages/twenty-front/src/modules/object-record/cache/hooks/useModifyRecordFromCache.ts b/packages/twenty-front/src/modules/object-record/cache/hooks/useModifyRecordFromCache.ts index 8cbc5fe60..9bb619202 100644 --- a/packages/twenty-front/src/modules/object-record/cache/hooks/useModifyRecordFromCache.ts +++ b/packages/twenty-front/src/modules/object-record/cache/hooks/useModifyRecordFromCache.ts @@ -3,7 +3,7 @@ import { Modifiers } from '@apollo/client/cache'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const useModifyRecordFromCache = ({ @@ -17,7 +17,7 @@ export const useModifyRecordFromCache = ({ recordId: string, fieldModifiers: Modifiers, ) => { - if (isNullable(objectMetadataItem)) return; + if (isUndefinedOrNull(objectMetadataItem)) return; const cachedRecordId = cache.identify({ __typename: capitalize(objectMetadataItem.nameSingular), diff --git a/packages/twenty-front/src/modules/object-record/cache/hooks/useReadFindManyRecordsQueryInCache.ts b/packages/twenty-front/src/modules/object-record/cache/hooks/useReadFindManyRecordsQueryInCache.ts index 56e7e09cd..4b0bc978e 100644 --- a/packages/twenty-front/src/modules/object-record/cache/hooks/useReadFindManyRecordsQueryInCache.ts +++ b/packages/twenty-front/src/modules/object-record/cache/hooks/useReadFindManyRecordsQueryInCache.ts @@ -6,7 +6,7 @@ import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenera import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecordQueryResult } from '@/object-record/types/ObjectRecordQueryResult'; import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useReadFindManyRecordsQueryInCache = ({ objectMetadataItem, @@ -38,7 +38,7 @@ export const useReadFindManyRecordsQueryInCache = ({ const existingRecordConnection = existingRecordsQueryResult?.[objectMetadataItem.namePlural]; - const existingObjectRecords = isNonNullable(existingRecordConnection) + const existingObjectRecords = isDefined(existingRecordConnection) ? getRecordsFromRecordConnection({ recordConnection: existingRecordConnection, }) diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useMapConnectionToRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useMapConnectionToRecords.test.tsx index 4cafb15a6..a975e7cb0 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useMapConnectionToRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useMapConnectionToRecords.test.tsx @@ -13,7 +13,7 @@ import { import { useMapConnectionToRecords } from '@/object-record/hooks/useMapConnectionToRecords'; import { Person } from '@/people/types/Person'; import { getJestHookWrapper } from '~/testing/jest/getJestHookWrapper'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const Wrapper = getJestHookWrapper({ apolloMocks: [], @@ -184,7 +184,7 @@ describe('useMapConnectionToRecords', () => { expect(isNonEmptyArray(peopleResult)).toBe(true); expect(firstPersonResult.id).toBe(firstPersonMock.id); - expect(isNonNullable(firstPersonsCompanyresult)).toBe(true); + expect(isDefined(firstPersonsCompanyresult)).toBe(true); expect(firstPersonsCompanyresult.id).toEqual(firstPersonsCompanyMock.id); }); }); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecordsInCache.ts b/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecordsInCache.ts index fa099e107..779294692 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecordsInCache.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecordsInCache.ts @@ -5,7 +5,7 @@ import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMeta import { useAddRecordInCache } from '@/object-record/cache/hooks/useAddRecordInCache'; import { useGenerateObjectRecordOptimisticResponse } from '@/object-record/cache/hooks/useGenerateObjectRecordOptimisticResponse'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useCreateManyRecordsInCache = ({ objectNameSingular, @@ -35,7 +35,7 @@ export const useCreateManyRecordsInCache = ({ const generatedCachedObjectRecord = generateObjectRecordOptimisticResponse(record); - if (isNonNullable(generatedCachedObjectRecord)) { + if (isDefined(generatedCachedObjectRecord)) { addRecordInCache(generatedCachedObjectRecord); createdRecordsInCache.push(generatedCachedObjectRecord); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useDeleteManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useDeleteManyRecords.ts index 7b2f392cf..b3236cc5d 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useDeleteManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useDeleteManyRecords.ts @@ -4,7 +4,7 @@ import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { getDeleteManyRecordsMutationResponseField } from '@/object-record/hooks/useGenerateDeleteManyRecordMutation'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; type useDeleteOneRecordProps = { @@ -56,7 +56,7 @@ export const useDeleteManyRecords = ({ const cachedRecords = records .map((record) => getRecordFromCache(record.id, cache)) - .filter(isNonNullable); + .filter(isDefined); triggerDeleteRecordsOptimisticEffect({ cache, 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 083e5396e..f3d201bac 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts @@ -14,7 +14,7 @@ import { ObjectRecordEdge } from '@/object-record/types/ObjectRecordEdge'; import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables'; import { filterUniqueRecordEdgesByCursor } from '@/object-record/utils/filterUniqueRecordEdgesByCursor'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { logError } from '~/utils/logError'; import { capitalize } from '~/utils/string/capitalize'; @@ -85,7 +85,7 @@ export const useFindManyRecords = ({ onCompleted?.(data[objectMetadataItem.namePlural], pageInfo); - if (isNonNullable(data?.[objectMetadataItem.namePlural])) { + if (isDefined(data?.[objectMetadataItem.namePlural])) { setLastCursor(pageInfo.endCursor ?? ''); setHasNextPage(pageInfo.hasNextPage ?? false); } @@ -132,7 +132,7 @@ export const useFindManyRecords = ({ const pageInfo = fetchMoreResult?.[objectMetadataItem.namePlural]?.pageInfo; - if (isNonNullable(data?.[objectMetadataItem.namePlural])) { + if (isDefined(data?.[objectMetadataItem.namePlural])) { setLastCursor(pageInfo.endCursor ?? ''); setHasNextPage(pageInfo.hasNextPage ?? false); } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateManyRecordMutation.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateManyRecordMutation.ts index 03d7316e8..c36c99f5c 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateManyRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateManyRecordMutation.ts @@ -5,7 +5,7 @@ import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getCreateManyRecordsMutationResponseField = ( @@ -19,7 +19,7 @@ export const useGenerateCreateManyRecordMutation = ({ }) => { const objectMetadataItems = useRecoilValue(objectMetadataItemsState()); - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateOneRecordMutation.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateOneRecordMutation.ts index 4847e602b..61cef8460 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateOneRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateCreateOneRecordMutation.ts @@ -5,7 +5,7 @@ import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getCreateOneRecordMutationResponseField = ( @@ -19,7 +19,7 @@ export const useGenerateCreateOneRecordMutation = ({ }) => { const objectMetadataItems = useRecoilValue(objectMetadataItemsState()); - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateDeleteManyRecordMutation.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateDeleteManyRecordMutation.ts index e528fea0a..4d7279a1b 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateDeleteManyRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateDeleteManyRecordMutation.ts @@ -2,7 +2,7 @@ import { gql } from '@apollo/client'; import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getDeleteManyRecordsMutationResponseField = ( @@ -14,7 +14,7 @@ export const useGenerateDeleteManyRecordMutation = ({ }: { objectMetadataItem: ObjectMetadataItem; }) => { - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation.ts index 28beba7bb..80719fe39 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation.ts @@ -5,7 +5,7 @@ import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getExecuteQuickActionOnOneRecordMutationGraphQLField = ({ @@ -23,7 +23,7 @@ export const useGenerateExecuteQuickActionOnOneRecordMutation = ({ }) => { const objectMetadataItems = useRecoilValue(objectMetadataItemsState()); - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateUpdateOneRecordMutation.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateUpdateOneRecordMutation.ts index c982ae028..1ba33a915 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateUpdateOneRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateUpdateOneRecordMutation.ts @@ -5,7 +5,7 @@ import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getUpdateOneRecordMutationResponseField = ( @@ -19,7 +19,7 @@ export const useGenerateUpdateOneRecordMutation = ({ }) => { const objectMetadataItems = useRecoilValue(objectMetadataItemsState()); - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/useMapConnectionToRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useMapConnectionToRecords.ts index a73584a61..bde4e4e92 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useMapConnectionToRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useMapConnectionToRecords.ts @@ -8,7 +8,7 @@ import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelati import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; import { FieldMetadataType } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useMapConnectionToRecords = () => { const objectMetadataItems = useRecoilValue(objectMetadataItemsState()); @@ -26,7 +26,7 @@ export const useMapConnectionToRecords = () => { depth: number; }): ObjectRecord[] => { if ( - !isNonNullable(objectRecordConnection) || + !isDefined(objectRecordConnection) || !isNonEmptyArray(objectMetadataItems) ) { return []; @@ -79,7 +79,7 @@ export const useMapConnectionToRecords = () => { if ( !relationFieldMetadataItem || - !isNonNullable(relatedObjectMetadataSingularName) + !isDefined(relatedObjectMetadataSingularName) ) { throw new Error( `Could not find relation object metadata item for object name plural ${relationField.name} in mapConnectionToRecords`, @@ -90,7 +90,7 @@ export const useMapConnectionToRecords = () => { relationField.name ] as ObjectRecordConnection | undefined | null; - if (!isNonNullable(relationConnection)) { + if (!isDefined(relationConnection)) { continue; } diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx index 19b5a9897..d3098859e 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx @@ -1,6 +1,6 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ObjectFilterDropdownDateInput = () => { const { @@ -15,9 +15,9 @@ export const ObjectFilterDropdownDateInput = () => { selectFilter?.({ fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId, - value: isNonNullable(date) ? date.toISOString() : '', + value: isDefined(date) ? date.toISOString() : '', operand: selectedOperandInDropdown, - displayValue: isNonNullable(date) ? date.toLocaleString() : '', + displayValue: isDefined(date) ? date.toLocaleString() : '', definition: filterDefinitionUsedInDropdown, }); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx index f3d1d9c95..43886b392 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx @@ -2,7 +2,7 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { getOperandLabel } from '../utils/getOperandLabel'; import { getOperandsForFilterType } from '../utils/getOperandsForFilterType'; @@ -26,8 +26,8 @@ export const ObjectFilterDropdownOperandSelect = () => { setIsObjectFilterDropdownOperandSelectUnfolded(false); if ( - isNonNullable(filterDefinitionUsedInDropdown) && - isNonNullable(selectedFilter) + isDefined(filterDefinitionUsedInDropdown) && + isDefined(selectedFilter) ) { selectFilter?.({ fieldMetadataId: selectedFilter.fieldMetadataId, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx index 5f09b7531..dfd2f6b41 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx @@ -5,7 +5,7 @@ import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataIt import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { useOptionsForSelect } from '@/object-record/object-filter-dropdown/hooks/useOptionsForSelect'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const EMPTY_FILTER_VALUE = ''; export const MAX_OPTIONS_TO_DISPLAY = 3; @@ -32,7 +32,7 @@ export const ObjectFilterDropdownOptionSelect = () => { >([]); useEffect(() => { - if (isNonNullable(selectOptions)) { + if (isDefined(selectOptions)) { const options = selectOptions.map((option) => { const isSelected = objectFilterDropdownSelectedOptionValues?.includes(option.value) ?? @@ -72,8 +72,8 @@ export const ObjectFilterDropdownOptionSelect = () => { : selectedOptions.map((option) => option.label).join(', '); if ( - isNonNullable(filterDefinitionUsedInDropdown) && - isNonNullable(selectedOperandInDropdown) + isDefined(filterDefinitionUsedInDropdown) && + isDefined(selectedOperandInDropdown) ) { const newFilterValue = selectedOptions.length > 0 diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx index a39105d28..0b41a5c5d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx @@ -2,7 +2,7 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/ import { MultipleRecordSelectDropdown } from '@/object-record/select/components/MultipleRecordSelectDropdown'; import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect'; import { SelectableRecord } from '@/object-record/select/types/SelectableRecord'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const EMPTY_FILTER_VALUE = '[]'; export const MAX_RECORDS_TO_DISPLAY = 3; @@ -68,8 +68,8 @@ export const ObjectFilterDropdownRecordSelect = () => { : selectedRecordNames.join(', '); if ( - isNonNullable(filterDefinitionUsedInDropdown) && - isNonNullable(selectedOperandInDropdown) + isDefined(filterDefinitionUsedInDropdown) && + isDefined(selectedOperandInDropdown) ) { const newFilterValue = newSelectedRecordIds.length > 0 diff --git a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy.ts b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy.ts index e01b5885f..b2c487f6e 100644 --- a/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy.ts +++ b/packages/twenty-front/src/modules/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy.ts @@ -2,7 +2,7 @@ import { OrderBy } from '@/object-metadata/types/OrderBy'; import { OrderByField } from '@/object-metadata/types/OrderByField'; import { Field } from '~/generated/graphql'; import { mapArrayToObject } from '~/utils/array/mapArrayToObject'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { Sort } from '../types/Sort'; @@ -15,7 +15,7 @@ export const turnSortsIntoOrderBy = ( sorts.map((sort) => { const correspondingField = fieldsById[sort.fieldMetadataId]; - if (isNullable(correspondingField)) { + if (isUndefinedOrNull(correspondingField)) { throw new Error( `Could not find field ${sort.fieldMetadataId} in metadata object`, ); diff --git a/packages/twenty-front/src/modules/object-record/record-action-bar/hooks/useRecordActionBar.tsx b/packages/twenty-front/src/modules/object-record/record-action-bar/hooks/useRecordActionBar.tsx index 591b2df40..b0d801c8d 100644 --- a/packages/twenty-front/src/modules/object-record/record-action-bar/hooks/useRecordActionBar.tsx +++ b/packages/twenty-front/src/modules/object-record/record-action-bar/hooks/useRecordActionBar.tsx @@ -19,7 +19,7 @@ import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionB import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState'; import { ContextMenuEntry } from '@/ui/navigation/context-menu/types/ContextMenuEntry'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type useRecordActionBarProps = { objectMetadataItem: ObjectMetadataItem; @@ -63,7 +63,7 @@ export const useRecordActionBar = ({ if (isFavorite) { deleteFavorite(foundFavorite.id); - } else if (isNonNullable(selectedRecord)) { + } else if (isDefined(selectedRecord)) { createFavorite(selectedRecord, objectMetadataItem.nameSingular); } callback?.(); diff --git a/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardColumnsComponentFamilySelector.ts b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardColumnsComponentFamilySelector.ts index 3c10cb0a0..22dd7aa8d 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardColumnsComponentFamilySelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardColumnsComponentFamilySelector.ts @@ -7,7 +7,7 @@ import { recordBoardColumnsComponentFamilyState } from '@/object-record/record-b import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition'; import { guardRecoilDefaultValue } from '@/ui/utilities/recoil-scope/utils/guardRecoilDefaultValue'; import { createComponentFamilySelector } from '@/ui/utilities/state/component-state/utils/createComponentFamilySelector'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const recordBoardColumnsComponentFamilySelector = createComponentFamilySelector< @@ -61,7 +61,7 @@ export const recordBoardColumnsComponentFamilySelector = }), ); }) - .filter(isNonNullable); + .filter(isDefined); const lastColumn = [...columns].sort( (a, b) => b.position - a.position, diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts index 3698421c9..ead147d37 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts @@ -3,7 +3,7 @@ import { useContext } from 'react'; import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { IconPencil } from '@/ui/display/icon'; import { IconComponent } from '@/ui/display/icon/types/IconComponent'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { FieldContext } from '../contexts/FieldContext'; import { isFieldEmail } from '../types/guards/isFieldEmail'; @@ -13,7 +13,7 @@ import { isFieldPhone } from '../types/guards/isFieldPhone'; export const useGetButtonIcon = (): IconComponent | undefined => { const { fieldDefinition } = useContext(FieldContext); - if (isNullable(fieldDefinition)) return undefined; + if (isUndefinedOrNull(fieldDefinition)) return undefined; if ( isFieldLink(fieldDefinition) || diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/SelectFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/SelectFieldInput.tsx index 8907ff577..e0b433eef 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/SelectFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/SelectFieldInput.tsx @@ -9,7 +9,7 @@ import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/Dropdow import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { MenuItemSelectTag } from '@/ui/navigation/menu-item/components/MenuItemSelectTag'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledRelationPickerContainer = styled.div` left: -1px; @@ -53,7 +53,7 @@ export const SelectFieldInput = ({ event.target instanceof HTMLInputElement && event.target.tagName === 'INPUT' ); - if (weAreNotInAnHTMLInput && isNonNullable(onCancel)) { + if (weAreNotInAnHTMLInput && isDefined(onCancel)) { onCancel(); } }, diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/RatingFieldInput.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/RatingFieldInput.stories.tsx index 292bef437..022e5f762 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/RatingFieldInput.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/RatingFieldInput.stories.tsx @@ -4,7 +4,7 @@ import { expect, fn, userEvent, waitFor, within } from '@storybook/test'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { FieldRatingValue } from '../../../../types/FieldMetadata'; import { FieldContextProvider } from '../../../__stories__/FieldContextProvider'; @@ -101,7 +101,7 @@ export const Submit: Story = { const firstStar = input.firstElementChild; await waitFor(() => { - if (isNonNullable(firstStar)) { + if (isDefined(firstStar)) { userEvent.click(firstStar); expect(submitJestFn).toHaveBeenCalledTimes(1); } diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts index 80343923a..c4aa0b308 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts @@ -2,7 +2,7 @@ import { Key } from 'ts-key-enum'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useRegisterInputEvents = ({ inputRef, @@ -30,7 +30,7 @@ export const useRegisterInputEvents = ({ onClickOutside?.(event, inputValue); }, - enabled: isNonNullable(onClickOutside), + enabled: isDefined(onClickOutside), }); useScopedHotkeys( diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts index d4f8877f5..28a82116d 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts @@ -17,9 +17,9 @@ import { isFieldSelect } from '@/object-record/record-field/types/guards/isField import { isFieldSelectValue } from '@/object-record/record-field/types/guards/isFieldSelectValue'; import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; -const isValueEmpty = (value: unknown) => !isNonNullable(value) || value === ''; +const isValueEmpty = (value: unknown) => !isDefined(value) || value === ''; export const isFieldValueEmpty = ({ fieldDefinition, @@ -46,7 +46,7 @@ export const isFieldValueEmpty = ({ } if (isFieldSelect(fieldDefinition)) { - return isFieldSelectValue(fieldValue) && !isNonNullable(fieldValue); + return isFieldSelectValue(fieldValue) && !isDefined(fieldValue); } if (isFieldCurrency(fieldDefinition)) { diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts index 4eed2314b..4d90608ab 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts @@ -22,8 +22,8 @@ import { isMatchingFloatFilter } from '@/object-record/record-filter/utils/isMat import { isMatchingStringFilter } from '@/object-record/record-filter/utils/isMatchingStringFilter'; import { isMatchingUUIDFilter } from '@/object-record/record-filter/utils/isMatchingUUIDFilter'; import { FieldMetadataType } from '~/generated-metadata/graphql'; +import { isDefined } from '~/utils/isDefined'; import { isEmptyObject } from '~/utils/isEmptyObject'; -import { isNonNullable } from '~/utils/isNonNullable'; const isAndFilter = ( filter: ObjectRecordQueryFilter, @@ -102,7 +102,7 @@ export const isRecordMatchingFilter = ({ if (isNotFilter(filter)) { const filterValue = filter.not; - if (!isNonNullable(filterValue)) { + if (!isDefined(filterValue)) { throw new Error('Unexpected value for "not" filter : ' + filterValue); } @@ -117,7 +117,7 @@ export const isRecordMatchingFilter = ({ } return Object.entries(filter).every(([filterKey, filterValue]) => { - if (!isNonNullable(filterValue)) { + if (!isDefined(filterValue)) { throw new Error( 'Unexpected value for filter key "' + filterKey + '" : ' + filterValue, ); @@ -129,7 +129,7 @@ export const isRecordMatchingFilter = ({ (field) => field.name === filterKey, ); - if (!isNonNullable(objectMetadataField)) { + if (!isDefined(objectMetadataField)) { throw new Error( 'Field metadata item "' + filterKey + diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts index 4632f039f..49918c737 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts @@ -13,7 +13,7 @@ import { import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { Field } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { Filter } from '../../object-filter-dropdown/types/Filter'; @@ -40,7 +40,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( ); } - if (!isNonNullable(rawUIFilter.value) || rawUIFilter.value === '') { + if (!isDefined(rawUIFilter.value) || rawUIFilter.value === '') { return undefined; } diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexViewBarEffect.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexViewBarEffect.tsx index 0ef9c3525..51d27b0c3 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexViewBarEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexViewBarEffect.tsx @@ -4,7 +4,7 @@ import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/u import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; import { useViewBar } from '@/views/hooks/useViewBar'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; type RecordIndexViewBarEffectProps = { objectNamePlural: string; @@ -34,7 +34,7 @@ export const RecordIndexViewBarEffect = ({ } = useViewBar({ viewBarId }); useEffect(() => { - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return; } setViewObjectMetadataId?.(objectMetadataItem.id); diff --git a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useExportTableData.ts b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useExportTableData.ts index 80a2b9f60..a80bb7de8 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useExportTableData.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/useExportTableData.ts @@ -6,7 +6,7 @@ import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { useFindManyParams } from '../../hooks/useLoadRecordIndexTable'; @@ -53,7 +53,7 @@ export const generateCsv: GenerateExport = ({ return hasSubFields; }); - if (isNonNullable(fieldsWithSubFields)) { + if (isDefined(fieldsWithSubFields)) { const nestedFieldsWithoutTypename = Object.keys( (fieldsWithSubFields as any)[column.field], ) diff --git a/packages/twenty-front/src/modules/object-record/record-inline-cell/hooks/useInlineCell.ts b/packages/twenty-front/src/modules/object-record/record-inline-cell/hooks/useInlineCell.ts index 0c6d8e782..7ff151b03 100644 --- a/packages/twenty-front/src/modules/object-record/record-inline-cell/hooks/useInlineCell.ts +++ b/packages/twenty-front/src/modules/object-record/record-inline-cell/hooks/useInlineCell.ts @@ -5,7 +5,7 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { isInlineCellInEditModeScopedState } from '../states/isInlineCellInEditModeScopedState'; import { InlineCellHotkeyScope } from '../types/InlineCellHotkeyScope'; @@ -40,7 +40,7 @@ export const useInlineCell = () => { setIsInlineCellInEditMode(true); initFieldInputDraftValue(); - if (isNonNullable(customEditHotkeyScopeForField)) { + if (isDefined(customEditHotkeyScopeForField)) { setHotkeyScopeAndMemorizePreviousScope( customEditHotkeyScopeForField.scope, customEditHotkeyScopeForField.customScopes, diff --git a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx index 30d629fd7..08e60c481 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx @@ -30,8 +30,8 @@ import { FileFolder, useUploadImageMutation, } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; type RecordShowContainerProps = { objectNameSingular: string; @@ -93,7 +93,7 @@ export const RecordShowContainer = ({ if (!avatarUrl) { return; } - if (isNullable(updateOneRecord)) { + if (isUndefinedOrNull(updateOneRecord)) { return; } if (!recordFromStore) { @@ -132,7 +132,7 @@ export const RecordShowContainer = ({ - {!recordLoading && isNonNullable(recordFromStore) && ( + {!recordLoading && isDefined(recordFromStore) && ( <> { - if (!loading && isNonNullable(record)) { + if (!loading && isDefined(record)) { const { activity: activityWithoutConnection } = makeActivityWithoutConnection(record as any); diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx index 70337e666..da9c038b5 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx @@ -15,7 +15,7 @@ import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkey import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { contextMenuIsOpenState } from '@/ui/navigation/context-menu/states/contextMenuIsOpenState'; import { contextMenuPositionState } from '@/ui/navigation/context-menu/states/contextMenuPositionState'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; const StyledContainer = styled.td<{ isSelected: boolean }>` background: ${({ isSelected, theme }) => @@ -46,7 +46,7 @@ export const RecordTableCellContainer = () => { const updateRecord = useContext(RecordUpdateContext); - if (isNullable(columnDefinition)) { + if (isUndefinedOrNull(columnDefinition)) { return null; } diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCell.ts b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCell.ts index e9dc6f6d1..ffec5d251 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCell.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCell.ts @@ -11,7 +11,7 @@ import { useLeaveTableFocus } from '@/object-record/record-table/hooks/internal/ import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { CellHotkeyScopeContext } from '../../contexts/CellHotkeyScopeContext'; import { TableHotkeyScope } from '../../types/TableHotkeyScope'; @@ -57,7 +57,7 @@ export const useOpenRecordTableCell = () => { initFieldInputDraftValue(options?.initialValue); - if (isNonNullable(customCellHotkeyScope)) { + if (isDefined(customCellHotkeyScope)) { setHotkeyScope( customCellHotkeyScope.scope, customCellHotkeyScope.customScopes, diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/MultipleObjectRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/MultipleObjectRecordSelect.tsx index df90df1b8..76b738cd1 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/MultipleObjectRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/MultipleObjectRecordSelect.tsx @@ -19,7 +19,7 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const StyledSelectableItem = styled(SelectableItem)` height: 100%; @@ -153,7 +153,7 @@ export const MultipleObjectRecordSelect = ({ (entity) => entity.record.id === recordId, ); - if (isNonNullable(correspondingRecordForSelect)) { + if (isDefined(correspondingRecordForSelect)) { handleSelectChange( correspondingRecordForSelect, !recordIsSelected, diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelect.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelect.tsx index 4fefd1079..368636fb4 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelect.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelect.tsx @@ -6,7 +6,7 @@ import { } from '@/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch'; import { DropdownMenu } from '@/ui/layout/dropdown/components/DropdownMenu'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type SingleEntitySelectProps = { disableBackgroundBlur?: boolean; @@ -38,7 +38,7 @@ export const SingleEntitySelect = ({ event.target instanceof HTMLInputElement && event.target.tagName === 'INPUT' ); - if (weAreNotInAnHTMLInput && isNonNullable(onCancel)) { + if (weAreNotInAnHTMLInput && isDefined(onCancel)) { onCancel(); } }, diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItems.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItems.tsx index 5de44471a..80ee900ee 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItems.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItems.tsx @@ -13,7 +13,7 @@ import { SelectableList } from '@/ui/layout/selectable-list/components/Selectabl import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItemSelect } from '@/ui/navigation/menu-item/components/MenuItemSelect'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { EntityForSelect } from '../types/EntityForSelect'; import { RelationPickerHotkeyScope } from '../types/RelationPickerHotkeyScope'; @@ -55,7 +55,7 @@ export const SingleEntitySelectMenuItems = ({ const entitiesInDropdown = [selectedEntity, ...entitiesToSelect].filter( (entity): entity is EntityForSelect => - isNonNullable(entity) && isNonEmptyString(entity.name), + isDefined(entity) && isNonEmptyString(entity.name), ); useScopedHotkeys( diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch.tsx index d2b814237..c24c35aee 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch.tsx @@ -6,7 +6,7 @@ import { import { useFilteredSearchEntityQuery } from '@/search/hooks/useFilteredSearchEntityQuery'; import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { useEntitySelectSearch } from '../hooks/useEntitySelectSearch'; @@ -42,7 +42,7 @@ export const SingleEntitySelectMenuItemsWithSearch = ({ relationPickerScopeId, }); - const showCreateButton = isNonNullable(onCreate) && searchFilter !== ''; + const showCreateButton = isDefined(onCreate) && searchFilter !== ''; const entities = useFilteredSearchEntityQuery({ filters: [ diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useLimitPerMetadataItem.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useLimitPerMetadataItem.ts index 29602a6a4..95be7ef2b 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useLimitPerMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useLimitPerMetadataItem.ts @@ -1,6 +1,6 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const useLimitPerMetadataItem = ({ @@ -15,7 +15,7 @@ export const useLimitPerMetadataItem = ({ .map(({ nameSingular }) => { return [`limit${capitalize(nameSingular)}`, limit]; }) - .filter(isNonNullable), + .filter(isDefined), ); return { diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.ts index 6091f2b85..eedf25327 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.ts @@ -5,7 +5,7 @@ import { objectMetadataItemsByNamePluralMapSelector } from '@/object-metadata/st import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier'; import { ObjectRecordForSelect } from '@/object-record/relation-picker/hooks/useMultiObjectSearch'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type MultiObjectRecordQueryResult = { [namePlural: string]: ObjectRecordConnection; @@ -30,7 +30,7 @@ export const useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArr const objectMetadataItem = objectMetadataItemsByNamePluralMap.get(namePlural); - if (!isNonNullable(objectMetadataItem)) return []; + if (!isDefined(objectMetadataItem)) return []; return objectRecordConnection.edges.map(({ node }) => ({ objectMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts index 31855d755..2da828779 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts @@ -13,7 +13,7 @@ import { import { SelectedObjectRecordId } from '@/object-record/relation-picker/hooks/useMultiObjectSearch'; import { useOrderByFieldPerMetadataItem } from '@/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem'; import { useSearchFilterPerMetadataItem } from '@/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery = ({ @@ -71,7 +71,7 @@ export const useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery = ({ }, ]; }) - .filter(isNonNullable), + .filter(isDefined), ); const { orderByFieldPerMetadataItem } = useOrderByFieldPerMetadataItem({ @@ -100,7 +100,7 @@ export const useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery = ({ ...orderByFieldPerMetadataItem, ...limitPerMetadataItem, }, - skip: !isNonNullable(multiSelectQueryForSelectedIds), + skip: !isDefined(multiSelectQueryForSelectedIds), }, ); diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery.ts index 5052bab76..16ce8e1cf 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndToSelectQuery.ts @@ -14,7 +14,7 @@ import { SelectedObjectRecordId } from '@/object-record/relation-picker/hooks/us import { useOrderByFieldPerMetadataItem } from '@/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem'; import { useSearchFilterPerMetadataItem } from '@/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem'; import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const useMultiObjectSearchMatchesSearchFilterAndToSelectQuery = ({ @@ -72,7 +72,7 @@ export const useMultiObjectSearchMatchesSearchFilterAndToSelectQuery = ({ makeAndFilterVariables(searchFilters), ]; }) - .filter(isNonNullable), + .filter(isDefined), ); const { orderByFieldPerMetadataItem } = useOrderByFieldPerMetadataItem({ @@ -99,7 +99,7 @@ export const useMultiObjectSearchMatchesSearchFilterAndToSelectQuery = ({ ...orderByFieldPerMetadataItem, ...limitPerMetadataItem, }, - skip: !isNonNullable(multiSelectQuery), + skip: !isDefined(multiSelectQuery), }); const { diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery.ts index 1d993dc61..a390c13f7 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchSelectedItemsQuery.ts @@ -12,7 +12,7 @@ import { } from '@/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray'; import { SelectedObjectRecordId } from '@/object-record/relation-picker/hooks/useMultiObjectSearch'; import { useOrderByFieldPerMetadataItem } from '@/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const EMPTY_QUERY = gql` @@ -56,7 +56,7 @@ export const useMultiObjectSearchSelectedItemsQuery = ({ }, ]; }) - .filter(isNonNullable), + .filter(isDefined), ); const { orderByFieldPerMetadataItem } = useOrderByFieldPerMetadataItem({ @@ -83,7 +83,7 @@ export const useMultiObjectSearchSelectedItemsQuery = ({ ...orderByFieldPerMetadataItem, ...limitPerMetadataItem, }, - skip: !isNonNullable(multiSelectQueryForSelectedIds), + skip: !isDefined(multiSelectQueryForSelectedIds), }, ); diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem.ts index c04f650cd..42dd28f99 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useOrderByFieldPerMetadataItem.ts @@ -1,6 +1,6 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { capitalize } from '~/utils/string/capitalize'; export const useOrderByFieldPerMetadataItem = ({ @@ -20,7 +20,7 @@ export const useOrderByFieldPerMetadataItem = ({ }, ]; }) - .filter(isNonNullable), + .filter(isDefined), ); return { diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts index b8bca5a4c..6a342b92d 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts @@ -5,7 +5,7 @@ import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/get import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter'; import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables'; import { FieldMetadataType } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useSearchFilterPerMetadataItem = ({ objectMetadataItems, @@ -25,7 +25,7 @@ export const useSearchFilterPerMetadataItem = ({ let searchFilter: ObjectRecordQueryFilter = {}; - if (isNonNullable(labelIdentifierFieldMetadataItem)) { + if (isDefined(labelIdentifierFieldMetadataItem)) { switch (labelIdentifierFieldMetadataItem.type) { case FieldMetadataType.FullName: { if (isNonEmptyString(searchFilterValue)) { @@ -46,7 +46,7 @@ export const useSearchFilterPerMetadataItem = ({ }, ]); - if (isNonNullable(fullNameFilter)) { + if (isDefined(fullNameFilter)) { searchFilter = fullNameFilter; } } @@ -66,7 +66,7 @@ export const useSearchFilterPerMetadataItem = ({ return [objectMetadataItem.nameSingular, searchFilter] as const; }) - .filter(isNonNullable), + .filter(isDefined), ); return { diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/useSpreadsheetRecordImport.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/useSpreadsheetRecordImport.ts index 6a5787f67..ad8da55e8 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/useSpreadsheetRecordImport.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/useSpreadsheetRecordImport.ts @@ -9,7 +9,7 @@ import { useIcons } from '@/ui/display/icon/hooks/useIcons'; import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const firstName = 'Firstname'; const lastName = 'Lastname'; @@ -132,7 +132,7 @@ export const useSpreadsheetRecordImport = (objectNameSingular: string) => { break; case FieldMetadataType.Relation: if ( - isNonNullable(value) && + isDefined(value) && (isNonEmptyString(value) || value !== false) ) { fieldMapping[field.name + 'Id'] = value; @@ -140,7 +140,7 @@ export const useSpreadsheetRecordImport = (objectNameSingular: string) => { break; case FieldMetadataType.FullName: if ( - isNonNullable( + isDefined( record[`${firstName} (${field.name})`] || record[`${lastName} (${field.name})`], ) diff --git a/packages/twenty-front/src/modules/object-record/utils/generateDeleteOneRecordMutation.ts b/packages/twenty-front/src/modules/object-record/utils/generateDeleteOneRecordMutation.ts index 5b332340a..e941e7900 100644 --- a/packages/twenty-front/src/modules/object-record/utils/generateDeleteOneRecordMutation.ts +++ b/packages/twenty-front/src/modules/object-record/utils/generateDeleteOneRecordMutation.ts @@ -2,7 +2,7 @@ import { gql } from '@apollo/client'; import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { capitalize } from '~/utils/string/capitalize'; export const getDeleteOneRecordMutationResponseField = ( @@ -14,7 +14,7 @@ export const generateDeleteOneRecordMutation = ({ }: { objectMetadataItem: ObjectMetadataItem; }) => { - if (isNullable(objectMetadataItem)) { + if (isUndefinedOrNull(objectMetadataItem)) { return EMPTY_MUTATION; } diff --git a/packages/twenty-front/src/modules/object-record/utils/getChildRelationArray.ts b/packages/twenty-front/src/modules/object-record/utils/getChildRelationArray.ts index 74705662c..f7a93507c 100644 --- a/packages/twenty-front/src/modules/object-record/utils/getChildRelationArray.ts +++ b/packages/twenty-front/src/modules/object-record/utils/getChildRelationArray.ts @@ -1,15 +1,12 @@ import { ObjectRecordEdge } from '@/object-record/types/ObjectRecordEdge'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const getChildRelationArray = ({ childRelation, }: { childRelation: any; }) => { - if ( - isNonNullable(childRelation.edges) && - Array.isArray(childRelation.edges) - ) { + if (isDefined(childRelation.edges) && Array.isArray(childRelation.edges)) { return childRelation.edges.map((edge: ObjectRecordEdge) => edge.node); } else { return childRelation; diff --git a/packages/twenty-front/src/modules/object-record/utils/makeAndFilterVariables.ts b/packages/twenty-front/src/modules/object-record/utils/makeAndFilterVariables.ts index 1b97474be..2f5e36d93 100644 --- a/packages/twenty-front/src/modules/object-record/utils/makeAndFilterVariables.ts +++ b/packages/twenty-front/src/modules/object-record/utils/makeAndFilterVariables.ts @@ -1,10 +1,10 @@ import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const makeAndFilterVariables = ( filters: (ObjectRecordQueryFilter | undefined)[], ): ObjectRecordQueryFilter | undefined => { - const definedFilters = filters.filter(isNonNullable); + const definedFilters = filters.filter(isDefined); if (!definedFilters.length) return undefined; diff --git a/packages/twenty-front/src/modules/object-record/utils/makeOrFilterVariables.ts b/packages/twenty-front/src/modules/object-record/utils/makeOrFilterVariables.ts index 2441ffee1..01cceb25c 100644 --- a/packages/twenty-front/src/modules/object-record/utils/makeOrFilterVariables.ts +++ b/packages/twenty-front/src/modules/object-record/utils/makeOrFilterVariables.ts @@ -1,10 +1,10 @@ import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const makeOrFilterVariables = ( filters: (ObjectRecordQueryFilter | undefined)[], ): ObjectRecordQueryFilter | undefined => { - const definedFilters = filters.filter(isNonNullable); + const definedFilters = filters.filter(isDefined); if (!definedFilters.length) return undefined; diff --git a/packages/twenty-front/src/modules/object-record/utils/sanitizeRecordInput.ts b/packages/twenty-front/src/modules/object-record/utils/sanitizeRecordInput.ts index f8e572d97..4dd64c020 100644 --- a/packages/twenty-front/src/modules/object-record/utils/sanitizeRecordInput.ts +++ b/packages/twenty-front/src/modules/object-record/utils/sanitizeRecordInput.ts @@ -5,7 +5,7 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { isFieldRelationValue } from '@/object-record/record-field/types/guards/isFieldRelationValue'; import { sanitizeLink } from '@/object-record/utils/sanitizeLinkRecordInput'; import { FieldMetadataType } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const sanitizeRecordInput = ({ objectMetadataItem, @@ -39,7 +39,7 @@ export const sanitizeRecordInput = ({ return [fieldName, fieldValue]; }) - .filter(isNonNullable), + .filter(isDefined), ); if ( objectMetadataItem.nameSingular !== CoreObjectNameSingular.Company || diff --git a/packages/twenty-front/src/modules/object-record/utils/sortObjectRecordByDateField.ts b/packages/twenty-front/src/modules/object-record/utils/sortObjectRecordByDateField.ts index bd9c1a66e..10b0b3269 100644 --- a/packages/twenty-front/src/modules/object-record/utils/sortObjectRecordByDateField.ts +++ b/packages/twenty-front/src/modules/object-record/utils/sortObjectRecordByDateField.ts @@ -2,7 +2,7 @@ import { DateTime } from 'luxon'; import { OrderBy } from '@/object-metadata/types/OrderBy'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const SORT_BEFORE = -1; const SORT_AFTER = 1; @@ -14,11 +14,11 @@ export const sortObjectRecordByDateField = const aDate = a[dateField]; const bDate = b[dateField]; - if (!isNonNullable(aDate) && !isNonNullable(bDate)) { + if (!isDefined(aDate) && !isDefined(bDate)) { return SORT_EQUAL; } - if (!isNonNullable(aDate)) { + if (!isDefined(aDate)) { if (sortDirection === 'AscNullsFirst') { return SORT_BEFORE; } else if (sortDirection === 'DescNullsFirst') { @@ -32,7 +32,7 @@ export const sortObjectRecordByDateField = throw new Error(`Invalid sortDirection: ${sortDirection}`); } - if (!isNonNullable(bDate)) { + if (!isDefined(bDate)) { if (sortDirection === 'AscNullsFirst') { return SORT_AFTER; } else if (sortDirection === 'DescNullsFirst') { diff --git a/packages/twenty-front/src/modules/search/hooks/useFilteredSearchEntityQuery.ts b/packages/twenty-front/src/modules/search/hooks/useFilteredSearchEntityQuery.ts index cfbd511e4..c6767d1a1 100644 --- a/packages/twenty-front/src/modules/search/hooks/useFilteredSearchEntityQuery.ts +++ b/packages/twenty-front/src/modules/search/hooks/useFilteredSearchEntityQuery.ts @@ -9,7 +9,7 @@ import { EntityForSelect } from '@/object-record/relation-picker/types/EntityFor import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type SearchFilter = { fieldNames: string[]; filter: string | number }; @@ -102,15 +102,11 @@ export const useFilteredSearchEntityQuery = ({ }); return { - selectedEntities: selectedRecords - .map(mappingFunction) - .filter(isNonNullable), + selectedEntities: selectedRecords.map(mappingFunction).filter(isDefined), filteredSelectedEntities: filteredSelectedRecords .map(mappingFunction) - .filter(isNonNullable), - entitiesToSelect: recordsToSelect - .map(mappingFunction) - .filter(isNonNullable), + .filter(isDefined), + entitiesToSelect: recordsToSelect.map(mappingFunction).filter(isDefined), loading: recordsToSelectLoading || filteredSelectedRecordsLoading || diff --git a/packages/twenty-front/src/modules/settings/data-model/utils/getFieldDefaultPreviewValue.ts b/packages/twenty-front/src/modules/settings/data-model/utils/getFieldDefaultPreviewValue.ts index c52cd66c0..2b6c051b5 100644 --- a/packages/twenty-front/src/modules/settings/data-model/utils/getFieldDefaultPreviewValue.ts +++ b/packages/twenty-front/src/modules/settings/data-model/utils/getFieldDefaultPreviewValue.ts @@ -5,7 +5,7 @@ import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifie import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm'; import { SETTINGS_FIELD_METADATA_TYPES } from '@/settings/data-model/constants/SettingsFieldMetadataTypes'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const getFieldDefaultPreviewValue = ({ fieldMetadataItem, @@ -24,7 +24,7 @@ export const getFieldDefaultPreviewValue = ({ // Select field if ( fieldMetadataItem.type === FieldMetadataType.Select && - isNonNullable(selectOptions) + isDefined(selectOptions) ) { return selectOptions.find(({ isDefault }) => isDefault) || selectOptions[0]; } @@ -32,7 +32,7 @@ export const getFieldDefaultPreviewValue = ({ // Relation field if ( fieldMetadataItem.type === FieldMetadataType.Relation && - isNonNullable(relationObjectMetadataItem) + isDefined(relationObjectMetadataItem) ) { const relationLabelIdentifierFieldMetadataItem = getLabelIdentifierFieldMetadataItem(relationObjectMetadataItem); diff --git a/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx b/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx index 47a8f4033..8da64b0f1 100644 --- a/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx +++ b/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx @@ -7,8 +7,8 @@ import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { ImageInput } from '@/ui/input/components/ImageInput'; import { getImageAbsoluteURIOrBase64 } from '@/users/utils/getProfilePictureAbsoluteURI'; import { useUploadProfilePictureMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const ProfilePictureUploader = () => { const [uploadPicture, { loading: isUploading }] = @@ -27,7 +27,7 @@ export const ProfilePictureUploader = () => { }); const handleUpload = async (file: File) => { - if (isNullable(file)) { + if (isUndefinedOrNull(file)) { return; } @@ -74,7 +74,7 @@ export const ProfilePictureUploader = () => { }; const handleAbort = async () => { - if (isNonNullable(uploadController)) { + if (isDefined(uploadController)) { uploadController.abort(); setUploadController(null); } diff --git a/packages/twenty-front/src/modules/settings/workspace/components/NameField.tsx b/packages/twenty-front/src/modules/settings/workspace/components/NameField.tsx index 1b0fb6cdc..62dc73930 100644 --- a/packages/twenty-front/src/modules/settings/workspace/components/NameField.tsx +++ b/packages/twenty-front/src/modules/settings/workspace/components/NameField.tsx @@ -6,8 +6,8 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { TextInput } from '@/ui/input/components/TextInput'; import { useUpdateWorkspaceMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { logError } from '~/utils/logError'; const StyledComboInputContainer = styled.div` @@ -39,7 +39,7 @@ export const NameField = ({ // eslint-disable-next-line react-hooks/exhaustive-deps const debouncedUpdate = useCallback( debounce(async (name: string) => { - if (isNonNullable(onNameUpdate)) { + if (isDefined(onNameUpdate)) { onNameUpdate(displayName); } if (!autoSave || !name) { @@ -54,7 +54,7 @@ export const NameField = ({ }, }); - if (isNonNullable(errors) || isNullable(data?.updateWorkspace)) { + if (isDefined(errors) || isUndefinedOrNull(data?.updateWorkspace)) { throw errors; } } catch (error) { diff --git a/packages/twenty-front/src/modules/settings/workspace/components/WorkspaceLogoUploader.tsx b/packages/twenty-front/src/modules/settings/workspace/components/WorkspaceLogoUploader.tsx index b8ca38179..ba410823a 100644 --- a/packages/twenty-front/src/modules/settings/workspace/components/WorkspaceLogoUploader.tsx +++ b/packages/twenty-front/src/modules/settings/workspace/components/WorkspaceLogoUploader.tsx @@ -7,7 +7,7 @@ import { useUpdateWorkspaceMutation, useUploadWorkspaceLogoMutation, } from '~/generated/graphql'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const WorkspaceLogoUploader = () => { const [uploadLogo] = useUploadWorkspaceLogoMutation(); @@ -17,7 +17,7 @@ export const WorkspaceLogoUploader = () => { ); const onUpload = async (file: File) => { - if (isNullable(file)) { + if (isUndefinedOrNull(file)) { return; } if (!currentWorkspace?.id) { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/Providers.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/Providers.tsx index e1cc3c1fa..1d64ac51f 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/Providers.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/Providers.tsx @@ -1,7 +1,7 @@ import { createContext } from 'react'; import { SpreadsheetOptions } from '@/spreadsheet-import/types'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const RsiContext = createContext({} as any); @@ -14,7 +14,7 @@ export const Providers = ({ children, values, }: ProvidersProps) => { - if (isNullable(values.fields)) { + if (isUndefinedOrNull(values.fields)) { throw new Error('Fields must be provided to spreadsheet-import'); } diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx index e93927fbf..8e5eca9c5 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx @@ -1,7 +1,7 @@ import styled from '@emotion/styled'; import { RawData } from '@/spreadsheet-import/types'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { Column } from '../MatchColumnsStep'; @@ -39,7 +39,7 @@ export const UserTableColumn = ({ entries, }: UserTableColumnProps) => { const { header } = column; - const entry = entries.find(isNonNullable); + const entry = entries.find(isDefined); return ( diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx index 9499b91b3..a3f5452ce 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx @@ -14,7 +14,7 @@ import { useDialogManager } from '@/ui/feedback/dialog-manager/hooks/useDialogMa import { Button } from '@/ui/input/button/components/Button'; import { Toggle } from '@/ui/input/components/Toggle'; import { Modal } from '@/ui/layout/modal/components/Modal'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { generateColumns } from './components/columns'; import { Meta } from './types'; @@ -130,7 +130,7 @@ export const ValidationStep = ({ const tableData = useMemo(() => { if (filterByErrors) { return data.filter((value) => { - if (isNonNullable(value?.__errors)) { + if (isDefined(value?.__errors)) { return Object.values(value.__errors)?.filter( (err) => err.level === 'error', ).length; @@ -147,7 +147,7 @@ export const ValidationStep = ({ const calculatedData = data.reduce( (acc, value) => { const { __index, __errors, ...values } = value; - if (isNonNullable(__errors)) { + if (isDefined(__errors)) { for (const key in __errors) { if (__errors[key].level === 'error') { acc.invalidData.push(values as unknown as Data); @@ -166,7 +166,7 @@ export const ValidationStep = ({ }; const onContinue = () => { const invalidData = data.find((value) => { - if (isNonNullable(value?.__errors)) { + if (isDefined(value?.__errors)) { return !!Object.values(value.__errors)?.filter( (err) => err.level === 'error', ).length; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx index 19ebedbb3..11d83dbee 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx @@ -9,7 +9,7 @@ import { AppTooltip } from '@/ui/display/tooltip/AppTooltip'; import { Checkbox, CheckboxVariant } from '@/ui/input/components/Checkbox'; import { TextInput } from '@/ui/input/components/TextInput'; import { Toggle } from '@/ui/input/components/Toggle'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { Meta } from '../types'; @@ -208,7 +208,7 @@ export const generateColumns = ( ); } - if (isNonNullable(row.__errors?.[columnKey])) { + if (isDefined(row.__errors?.[columnKey])) { return ( <> {component} diff --git a/packages/twenty-front/src/modules/spreadsheet-import/utils/dataMutations.ts b/packages/twenty-front/src/modules/spreadsheet-import/utils/dataMutations.ts index 0fa3936cb..f9cb085d9 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/utils/dataMutations.ts +++ b/packages/twenty-front/src/modules/spreadsheet-import/utils/dataMutations.ts @@ -12,8 +12,8 @@ import { RowHook, TableHook, } from '@/spreadsheet-import/types'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const addErrorsAndRunHooks = ( data: (Data & Partial)[], @@ -30,11 +30,11 @@ export const addErrorsAndRunHooks = ( }; }; - if (isNonNullable(tableHook)) { + if (isDefined(tableHook)) { data = tableHook(data, addHookError); } - if (isNonNullable(rowHook)) { + if (isDefined(rowHook)) { data = data.map((value, index) => rowHook(value, (...props) => addHookError(index, ...props), data), ); @@ -52,7 +52,7 @@ export const addErrorsAndRunHooks = ( values.forEach((value) => { if ( validation.allowEmpty === true && - (isNullable(value) || value === '' || !value) + (isUndefinedOrNull(value) || value === '' || !value) ) { // If allowEmpty is set, we will not validate falsy fields such as undefined or empty string. return; @@ -142,10 +142,10 @@ export const addErrorsAndRunHooks = ( } const newValue = value as Data & Meta; - if (isNonNullable(errors[index])) { + if (isDefined(errors[index])) { return { ...newValue, __errors: errors[index] }; } - if (isNullable(errors[index]) && isNonNullable(value?.__errors)) { + if (isUndefinedOrNull(errors[index]) && isDefined(value?.__errors)) { return { ...newValue, __errors: null }; } return newValue; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/utils/getMatchedColumns.ts b/packages/twenty-front/src/modules/spreadsheet-import/utils/getMatchedColumns.ts index 4dda4a62d..661466154 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/utils/getMatchedColumns.ts +++ b/packages/twenty-front/src/modules/spreadsheet-import/utils/getMatchedColumns.ts @@ -6,7 +6,7 @@ import { MatchColumnsStepProps, } from '@/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep'; import { Field, Fields } from '@/spreadsheet-import/types'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { findMatch } from './findMatch'; import { setColumn } from './setColumn'; @@ -19,7 +19,7 @@ export const getMatchedColumns = ( ) => columns.reduce[]>((arr, column) => { const autoMatch = findMatch(column.header, fields, autoMapDistance); - if (isNonNullable(autoMatch)) { + if (isDefined(autoMatch)) { const field = fields.find((field) => field.key === autoMatch) as Field; const duplicateIndex = arr.findIndex( (column) => 'value' in column && column.value === field.key, diff --git a/packages/twenty-front/src/modules/support/components/SupportChat.tsx b/packages/twenty-front/src/modules/support/components/SupportChat.tsx index a9c609ccb..ab15532b4 100644 --- a/packages/twenty-front/src/modules/support/components/SupportChat.tsx +++ b/packages/twenty-front/src/modules/support/components/SupportChat.tsx @@ -10,7 +10,7 @@ import { IconHelpCircle } from '@/ui/display/icon'; import { Button } from '@/ui/input/button/components/Button'; import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember'; import { User } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledButtonContainer = styled.div` display: flex; @@ -28,7 +28,7 @@ const insertScript = ({ const script = document.createElement('script'); if (isNonEmptyString(src)) script.src = src; if (isNonEmptyString(innerHTML)) script.innerHTML = innerHTML; - if (isNonNullable(onLoad)) script.onload = onLoad; + if (isDefined(onLoad)) script.onload = onLoad; document.body.appendChild(script); }; @@ -74,7 +74,7 @@ export const SupportChat = () => { supportChat?.supportDriver === 'front' && isNonEmptyString(supportChat.supportFrontChatId) && isNonEmptyString(currentUser?.email) && - isNonNullable(currentWorkspaceMember) && + isDefined(currentWorkspaceMember) && !isFrontChatLoaded ) { configureFront( diff --git a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/components/Dialog.tsx b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/components/Dialog.tsx index 6b8547536..905bbe033 100644 --- a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/components/Dialog.tsx +++ b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/components/Dialog.tsx @@ -5,7 +5,7 @@ import { Key } from 'ts-key-enum'; import { Button } from '@/ui/input/button/components/Button'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { DialogHotkeyScope } from '../types/DialogHotkeyScope'; @@ -105,7 +105,7 @@ export const Dialog = ({ event.preventDefault(); - if (isNonNullable(confirmButton)) { + if (isDefined(confirmButton)) { confirmButton?.onClick?.(event); closeSnackbar(); } diff --git a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx index bae0aed2e..8334d1bce 100644 --- a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx +++ b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx @@ -8,7 +8,7 @@ import { ProgressBarControls, } from '@/ui/feedback/progress-bar/components/ProgressBar'; import { RGBA } from '@/ui/theme/constants/Rgba'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { usePausableTimeout } from '../hooks/usePausableTimeout'; @@ -132,7 +132,7 @@ export const SnackBar = ({ ); const icon = useMemo(() => { - if (isNonNullable(iconComponent)) { + if (isDefined(iconComponent)) { return iconComponent; } diff --git a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts index f8c4d59ad..6e58b0887 100644 --- a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts +++ b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef } from 'react'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const usePausableTimeout = (callback: () => void, delay: number) => { // eslint-disable-next-line @nx/workspace-no-state-useref @@ -13,7 +13,7 @@ export const usePausableTimeout = (callback: () => void, delay: number) => { const timeoutId = useRef | null>(null); const tick = () => { - if (isNonNullable(savedCallback.current)) { + if (isDefined(savedCallback.current)) { savedCallback.current(); } }; @@ -33,7 +33,7 @@ export const usePausableTimeout = (callback: () => void, delay: number) => { if (delay !== null) { startTimeout(); return () => { - if (isNonNullable(timeoutId.current)) { + if (isDefined(timeoutId.current)) { clearTimeout(timeoutId.current); } }; @@ -41,7 +41,7 @@ export const usePausableTimeout = (callback: () => void, delay: number) => { }, [delay, startTimeout]); const pauseTimeout = () => { - if (isNonNullable(timeoutId.current)) { + if (isDefined(timeoutId.current)) { clearTimeout(timeoutId.current); } const elapsedTime = Date.now() - startTime.current; diff --git a/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx index fb751159d..5c5da96c3 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx @@ -7,7 +7,7 @@ import { SETTINGS_FIELD_CURRENCY_CODES } from '@/settings/data-model/constants/S import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { CurrencyPickerDropdownButton } from '@/ui/input/components/internal/currency/components/CurrencyPickerDropdownButton'; import { TEXT_INPUT_STYLE } from '@/ui/theme/constants/TextInputStyle'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const StyledInput = styled.input` margin: 0; @@ -118,7 +118,7 @@ export const CurrencyInput = ({ useEffect(() => { const currency = currencies.find(({ value }) => value === currencyCode); - if (isNonNullable(currency)) { + if (isDefined(currency)) { setInternalCurrency(currency); } }, [currencies, currencyCode]); diff --git a/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx index 5e87a3025..3a5b387aa 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx @@ -5,7 +5,7 @@ import { Key } from 'ts-key-enum'; import { FieldDoubleText } from '@/object-record/record-field/types/FieldDoubleText'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { StyledInput } from './TextInput'; @@ -147,7 +147,7 @@ export const DoubleTextInput = ({ secondValue: secondInternalValue, }); }, - enabled: isNonNullable(onClickOutside), + enabled: isDefined(onClickOutside), }); return ( diff --git a/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx index f40c6ffbb..43f9254bb 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx @@ -4,7 +4,7 @@ import styled from '@emotion/styled'; import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { TEXT_INPUT_STYLE } from '@/ui/theme/constants/TextInputStyle'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type TextAreaInputProps = { disabled?: boolean; @@ -56,7 +56,7 @@ export const TextAreaInput = ({ const wrapperRef = useRef(null); useEffect(() => { - if (isNonNullable(wrapperRef.current)) { + if (isDefined(wrapperRef.current)) { wrapperRef.current.setSelectionRange( wrapperRef.current.value.length, wrapperRef.current.value.length, diff --git a/packages/twenty-front/src/modules/ui/input/button/components/ButtonGroup.tsx b/packages/twenty-front/src/modules/ui/input/button/components/ButtonGroup.tsx index fcef963c3..9bac9d6dd 100644 --- a/packages/twenty-front/src/modules/ui/input/button/components/ButtonGroup.tsx +++ b/packages/twenty-front/src/modules/ui/input/button/components/ButtonGroup.tsx @@ -1,7 +1,7 @@ import React, { ReactNode } from 'react'; import styled from '@emotion/styled'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ButtonPosition, ButtonProps } from './Button'; @@ -41,15 +41,15 @@ export const ButtonGroup = ({ const additionalProps: any = { position, variant, accent, size }; - if (isNonNullable(variant)) { + if (isDefined(variant)) { additionalProps.variant = variant; } - if (isNonNullable(accent)) { + if (isDefined(accent)) { additionalProps.variant = variant; } - if (isNonNullable(size)) { + if (isDefined(size)) { additionalProps.size = size; } diff --git a/packages/twenty-front/src/modules/ui/input/button/components/FloatingButtonGroup.tsx b/packages/twenty-front/src/modules/ui/input/button/components/FloatingButtonGroup.tsx index 49330fc04..db9485c17 100644 --- a/packages/twenty-front/src/modules/ui/input/button/components/FloatingButtonGroup.tsx +++ b/packages/twenty-front/src/modules/ui/input/button/components/FloatingButtonGroup.tsx @@ -1,7 +1,7 @@ import React from 'react'; import styled from '@emotion/styled'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { FloatingButtonPosition, FloatingButtonProps } from './FloatingButton'; @@ -42,7 +42,7 @@ export const FloatingButtonGroup = ({ applyBlur: false, }; - if (isNonNullable(size)) { + if (isDefined(size)) { additionalProps.size = size; } diff --git a/packages/twenty-front/src/modules/ui/input/components/ImageInput.tsx b/packages/twenty-front/src/modules/ui/input/components/ImageInput.tsx index 3396f0f74..98415e2f2 100644 --- a/packages/twenty-front/src/modules/ui/input/components/ImageInput.tsx +++ b/packages/twenty-front/src/modules/ui/input/components/ImageInput.tsx @@ -9,7 +9,7 @@ import { IconX, } from '@/ui/display/icon'; import { Button } from '@/ui/input/button/components/Button'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledContainer = styled.div` display: flex; @@ -133,10 +133,7 @@ export const ImageInput = ({ ref={hiddenFileInput} accept="image/jpeg, image/png, image/gif" // to desired specification onChange={(event) => { - if ( - isNonNullable(onUpload) && - isNonNullable(event.target.files) - ) { + if (isDefined(onUpload) && isDefined(event.target.files)) { onUpload(event.target.files[0]); } }} diff --git a/packages/twenty-front/src/modules/ui/input/components/Toggle.tsx b/packages/twenty-front/src/modules/ui/input/components/Toggle.tsx index 9ba2c5efc..a4a636cf9 100644 --- a/packages/twenty-front/src/modules/ui/input/components/Toggle.tsx +++ b/packages/twenty-front/src/modules/ui/input/components/Toggle.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import styled from '@emotion/styled'; import { motion } from 'framer-motion'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type ToggleSize = 'small' | 'medium'; @@ -58,7 +58,7 @@ export const Toggle = ({ const handleChange = () => { setIsOn(!isOn); - if (isNonNullable(onChange)) { + if (isDefined(onChange)) { onChange(!isOn); } }; diff --git a/packages/twenty-front/src/modules/ui/input/components/internal/currency/components/CurrencyPickerDropdownButton.tsx b/packages/twenty-front/src/modules/ui/input/components/internal/currency/components/CurrencyPickerDropdownButton.tsx index 09605d9cc..fdbd84a55 100644 --- a/packages/twenty-front/src/modules/ui/input/components/internal/currency/components/CurrencyPickerDropdownButton.tsx +++ b/packages/twenty-front/src/modules/ui/input/components/internal/currency/components/CurrencyPickerDropdownButton.tsx @@ -6,7 +6,7 @@ import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { IconChevronDown } from '@/ui/display/icon'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { CurrencyPickerHotkeyScope } from '../types/CurrencyPickerHotkeyScope'; @@ -77,7 +77,7 @@ export const CurrencyPickerDropdownButton = ({ useEffect(() => { const currency = currencies.find(({ value }) => value === valueCode); - if (isNonNullable(currency)) { + if (isDefined(currency)) { setSelectedCurrency(currency); } }, [valueCode, currencies]); diff --git a/packages/twenty-front/src/modules/ui/input/components/internal/phone/components/CountryPickerDropdownButton.tsx b/packages/twenty-front/src/modules/ui/input/components/internal/phone/components/CountryPickerDropdownButton.tsx index 598aea14e..089f77693 100644 --- a/packages/twenty-front/src/modules/ui/input/components/internal/phone/components/CountryPickerDropdownButton.tsx +++ b/packages/twenty-front/src/modules/ui/input/components/internal/phone/components/CountryPickerDropdownButton.tsx @@ -9,7 +9,7 @@ import { CountryCallingCode } from 'libphonenumber-js'; import { IconChevronDown, IconWorld } from '@/ui/display/icon'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { CountryPickerHotkeyScope } from '../types/CountryPickerHotkeyScope'; @@ -113,7 +113,7 @@ export const CountryPickerDropdownButton = ({ useEffect(() => { const country = countries.find(({ countryCode }) => countryCode === value); - if (isNonNullable(country)) { + if (isDefined(country)) { setSelectedCountry(country); } }, [countries, value]); diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index a84edfc6a..57c00af8d 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -14,7 +14,7 @@ import { HotkeyEffect } from '@/ui/utilities/hotkey/components/HotkeyEffect'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { useDropdown } from '../hooks/useDropdown'; import { useInternalHotkeyScopeManagement } from '../hooks/useInternalHotkeyScopeManagement'; @@ -60,11 +60,11 @@ export const Dropdown = ({ useDropdown(dropdownId); const offsetMiddlewares = []; - if (isNonNullable(dropdownOffset.x)) { + if (isDefined(dropdownOffset.x)) { offsetMiddlewares.push(offset({ crossAxis: dropdownOffset.x })); } - if (isNonNullable(dropdownOffset.y)) { + if (isDefined(dropdownOffset.y)) { offsetMiddlewares.push(offset({ mainAxis: dropdownOffset.y })); } diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts b/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts index 5beb410c6..0a671a40e 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts @@ -3,7 +3,7 @@ import { useRecoilState } from 'recoil'; import { useDropdownStates } from '@/ui/layout/dropdown/hooks/internal/useDropdownStates'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useDropdown = (dropdownId?: string) => { const { @@ -36,7 +36,7 @@ export const useDropdown = (dropdownId?: string) => { const openDropdown = () => { setIsDropdownOpen(true); - if (isNonNullable(dropdownHotkeyScope)) { + if (isDefined(dropdownHotkeyScope)) { setHotkeyScopeAndMemorizePreviousScope( dropdownHotkeyScope.scope, dropdownHotkeyScope.customScopes, diff --git a/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx b/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx index 69289ef3d..ef092669d 100644 --- a/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx +++ b/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx @@ -10,7 +10,7 @@ import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener'; import { ClickOutsideMode } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { useRightDrawer } from '../hooks/useRightDrawer'; import { isRightDrawerExpandedState } from '../states/isRightDrawerExpandedState'; @@ -84,7 +84,7 @@ export const RightDrawer = () => { : theme.rightDrawerWidth : '0'; - if (!isNonNullable(rightDrawerPage)) { + if (!isDefined(rightDrawerPage)) { return <>; } diff --git a/packages/twenty-front/src/modules/ui/layout/selectable-list/components/SelectableList.tsx b/packages/twenty-front/src/modules/ui/layout/selectable-list/components/SelectableList.tsx index 87a36b159..96badbcee 100644 --- a/packages/twenty-front/src/modules/ui/layout/selectable-list/components/SelectableList.tsx +++ b/packages/twenty-front/src/modules/ui/layout/selectable-list/components/SelectableList.tsx @@ -4,7 +4,7 @@ import { useSelectableListHotKeys } from '@/ui/layout/selectable-list/hooks/inte import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { SelectableListScope } from '@/ui/layout/selectable-list/scopes/SelectableListScope'; import { arrayToChunks } from '~/utils/array/arrayToChunks'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type SelectableListProps = { children: ReactNode; @@ -40,11 +40,11 @@ export const SelectableList = ({ ); } - if (isNonNullable(selectableItemIdMatrix)) { + if (isDefined(selectableItemIdMatrix)) { setSelectableItemIds(selectableItemIdMatrix); } - if (isNonNullable(selectableItemIdArray)) { + if (isDefined(selectableItemIdArray)) { setSelectableItemIds(arrayToChunks(selectableItemIdArray, 1)); } }, [selectableItemIdArray, selectableItemIdMatrix, setSelectableItemIds]); diff --git a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSummaryCard.tsx b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSummaryCard.tsx index d99296f86..93c5575cc 100644 --- a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSummaryCard.tsx +++ b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSummaryCard.tsx @@ -8,7 +8,7 @@ import { beautifyExactDateTime, beautifyPastDateRelativeToNow, } from '~/utils/date-utils'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type ShowPageSummaryCardProps = { avatarPlaceholder: string; @@ -86,7 +86,7 @@ export const ShowPageSummaryCard = ({ const inputFileRef = useRef(null); const onFileChange = (e: ChangeEvent) => { - if (isNonNullable(e.target.files)) onUploadPicture?.(e.target.files[0]); + if (isDefined(e.target.files)) onUploadPicture?.(e.target.files[0]); }; const handleAvatarClick = () => { diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerItem.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerItem.tsx index bbb4302bf..cae7c628d 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerItem.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerItem.tsx @@ -8,7 +8,7 @@ import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { isNavigationDrawerOpenState } from '@/ui/navigation/states/isNavigationDrawerOpenState'; import { MOBILE_VIEWPORT } from '@/ui/theme/constants/MobileViewport'; import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export type NavigationDrawerItemProps = { className?: string; @@ -148,7 +148,7 @@ export const NavigationDrawerItem = ({ setIsNavigationDrawerOpen(false); } - if (isNonNullable(onClick)) { + if (isDefined(onClick)) { onClick(); return; } diff --git a/packages/twenty-front/src/modules/ui/theme/hooks/useSystemColorScheme.ts b/packages/twenty-front/src/modules/ui/theme/hooks/useSystemColorScheme.ts index f8b0c5676..a246b236f 100644 --- a/packages/twenty-front/src/modules/ui/theme/hooks/useSystemColorScheme.ts +++ b/packages/twenty-front/src/modules/ui/theme/hooks/useSystemColorScheme.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState } from 'react'; import { ColorScheme } from '@/workspace-member/types/WorkspaceMember'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const useSystemColorScheme = (): ColorScheme => { const mediaQuery = useMemo( @@ -14,7 +14,7 @@ export const useSystemColorScheme = (): ColorScheme => { ); useEffect(() => { - if (isNullable(window.matchMedia)) { + if (isUndefinedOrNull(window.matchMedia)) { return; } diff --git a/packages/twenty-front/src/modules/ui/utilities/dimensions/components/ComputeNodeDimensions.tsx b/packages/twenty-front/src/modules/ui/utilities/dimensions/components/ComputeNodeDimensions.tsx index e47fc90d9..2d3acb3f0 100644 --- a/packages/twenty-front/src/modules/ui/utilities/dimensions/components/ComputeNodeDimensions.tsx +++ b/packages/twenty-front/src/modules/ui/utilities/dimensions/components/ComputeNodeDimensions.tsx @@ -1,7 +1,7 @@ import { ReactNode, useLayoutEffect, useRef, useState } from 'react'; import styled from '@emotion/styled'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type ComputeNodeDimensionsProps = { children: ( @@ -34,7 +34,7 @@ export const ComputeNodeDimensions = ({ return; } const resizeObserver = new ResizeObserver(() => { - if (isNonNullable(nodeWrapperRef.current)) { + if (isDefined(nodeWrapperRef.current)) { setNodeDimensions({ width: nodeWrapperRef.current.offsetWidth, height: nodeWrapperRef.current.offsetHeight, diff --git a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSequenceScopedHotkeys.ts b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSequenceScopedHotkeys.ts index 144d74813..e2a4ead6b 100644 --- a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSequenceScopedHotkeys.ts +++ b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSequenceScopedHotkeys.ts @@ -2,7 +2,7 @@ import { Options, useHotkeys } from 'react-hotkeys-hook'; import { Keys } from 'react-hotkeys-hook/dist/types'; import { useRecoilState } from 'recoil'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { pendingHotkeyState } from '../states/internal/pendingHotkeysState'; @@ -58,7 +58,7 @@ export const useSequenceHotkeys = ( setPendingHotkey(null); - if (isNonNullable(options.preventDefault)) { + if (isDefined(options.preventDefault)) { keyboardEvent.stopImmediatePropagation(); keyboardEvent.stopPropagation(); keyboardEvent.preventDefault(); diff --git a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSetHotkeyScope.ts b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSetHotkeyScope.ts index 4d6a4f677..aee1f213f 100644 --- a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSetHotkeyScope.ts +++ b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/useSetHotkeyScope.ts @@ -1,6 +1,6 @@ import { useRecoilCallback } from 'recoil'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { DEFAULT_HOTKEYS_SCOPE_CUSTOM_SCOPES } from '../constants/DefaultHotkeysScopeCustomScopes'; import { currentHotkeyScopeState } from '../states/internal/currentHotkeyScopeState'; @@ -30,7 +30,7 @@ export const useSetHotkeyScope = () => .getValue(); if (currentHotkeyScope.scope === hotkeyScopeToSet) { - if (!isNonNullable(customScopes)) { + if (!isDefined(customScopes)) { if ( isCustomScopesEqual( currentHotkeyScope?.customScopes, diff --git a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideArrayOfRef.test.tsx b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideArrayOfRef.test.tsx index 08fade9a1..f236b7884 100644 --- a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideArrayOfRef.test.tsx +++ b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideArrayOfRef.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; import { fireEvent, render, renderHook } from '@testing-library/react'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { ClickOutsideMode, @@ -48,7 +48,7 @@ describe('useListenClickOutside', () => { ); act(() => { - if (isNonNullable(containerRef.current)) { + if (isDefined(containerRef.current)) { fireEvent.mouseDown(containerRef.current); fireEvent.click(containerRef.current); } @@ -97,7 +97,7 @@ describe('useListenClickOutsideByClassName', () => { act(() => { const notClickableElement = container.querySelector('.will-trigger'); - if (isNonNullable(notClickableElement)) { + if (isDefined(notClickableElement)) { fireEvent.mouseDown(notClickableElement); fireEvent.click(notClickableElement); } @@ -124,7 +124,7 @@ describe('useListenClickOutsideByClassName', () => { act(() => { const notClickableElement = container.querySelector('.wont-trigger'); - if (isNonNullable(notClickableElement)) { + if (isDefined(notClickableElement)) { fireEvent.mouseDown(notClickableElement); fireEvent.click(notClickableElement); } diff --git a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideV2.test.tsx b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideV2.test.tsx index 928b9bbef..1afd8d13a 100644 --- a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideV2.test.tsx +++ b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/__tests__/useListenClickOutsideV2.test.tsx @@ -7,7 +7,7 @@ import { ClickOutsideMode, useListenClickOutsideV2, } from '@/ui/utilities/pointer-event/hooks/useListenClickOutsideV2'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const containerRef = React.createRef(); const nullRef = React.createRef(); @@ -77,7 +77,7 @@ describe('useListenClickOutsideV2', () => { ); act(() => { - if (isNonNullable(containerRef.current)) { + if (isDefined(containerRef.current)) { fireEvent.mouseDown(containerRef.current); fireEvent.click(containerRef.current); } @@ -101,7 +101,7 @@ describe('useListenClickOutsideV2', () => { ); act(() => { - if (isNonNullable(containerRef.current)) { + if (isDefined(containerRef.current)) { fireEvent.mouseDown(containerRef.current); fireEvent.click(containerRef.current); } diff --git a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/useClickOutsideListener.ts b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/useClickOutsideListener.ts index 3c41eab55..e1db02e48 100644 --- a/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/useClickOutsideListener.ts +++ b/packages/twenty-front/src/modules/ui/utilities/pointer-event/hooks/useClickOutsideListener.ts @@ -8,7 +8,7 @@ import { } from '@/ui/utilities/pointer-event/hooks/useListenClickOutsideV2'; import { ClickOutsideListenerCallback } from '@/ui/utilities/pointer-event/types/ClickOutsideListenerCallback'; import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const useClickOutsideListener = (componentId: string) => { // TODO: improve typing @@ -67,7 +67,7 @@ export const useClickOutsideListener = (componentId: string) => { (callback) => callback.callbackId === callbackId, ); - if (!isNonNullable(existingCallbackWithSameId)) { + if (!isDefined(existingCallbackWithSameId)) { const existingCallbacksWithNewCallback = existingCallbacks.concat({ callbackId, callbackFunction, diff --git a/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/__tests__/useListenScroll.test.tsx b/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/__tests__/useListenScroll.test.tsx index 1829a0142..ccde6fbca 100644 --- a/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/__tests__/useListenScroll.test.tsx +++ b/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/__tests__/useListenScroll.test.tsx @@ -5,7 +5,7 @@ import { RecoilRoot, useRecoilValue } from 'recoil'; import { useListenScroll } from '@/ui/utilities/scroll/hooks/useListenScroll'; import { isScrollingState } from '@/ui/utilities/scroll/states/isScrollingState'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const containerRef = React.createRef(); @@ -40,7 +40,7 @@ describe('useListenScroll', () => { const container = document.querySelector('#container'); act(() => { - if (isNonNullable(container)) fireEvent.scroll(container); + if (isDefined(container)) fireEvent.scroll(container); }); expect(result.current.isScrolling).toBe(true); diff --git a/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/useScrollWrapperScopedRef.ts b/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/useScrollWrapperScopedRef.ts index ee339b0a6..bbbeecf07 100644 --- a/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/useScrollWrapperScopedRef.ts +++ b/packages/twenty-front/src/modules/ui/utilities/scroll/hooks/useScrollWrapperScopedRef.ts @@ -1,13 +1,13 @@ import { useContext } from 'react'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { ScrollWrapperContext } from '../components/ScrollWrapper'; export const useScrollWrapperScopedRef = () => { const scrollWrapperRef = useContext(ScrollWrapperContext); - if (isNullable(scrollWrapperRef)) + if (isUndefinedOrNull(scrollWrapperRef)) throw new Error( `Using a scroll ref without a ScrollWrapper : verify that you are using a ScrollWrapper if you intended to do so.`, ); diff --git a/packages/twenty-front/src/modules/users/components/UserProvider.tsx b/packages/twenty-front/src/modules/users/components/UserProvider.tsx index 98ecb8704..e87175517 100644 --- a/packages/twenty-front/src/modules/users/components/UserProvider.tsx +++ b/packages/twenty-front/src/modules/users/components/UserProvider.tsx @@ -7,7 +7,7 @@ import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMembe import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser'; import { ColorScheme } from '@/workspace-member/types/WorkspaceMember'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const UserProvider = ({ children }: React.PropsWithChildren) => { const [isLoading, setIsLoading] = useState(true); @@ -25,11 +25,11 @@ export const UserProvider = ({ children }: React.PropsWithChildren) => { if (!queryLoading) { setIsLoading(false); } - if (isNonNullable(queryData?.currentUser)) { + if (isDefined(queryData?.currentUser)) { setCurrentUser(queryData.currentUser); setCurrentWorkspace(queryData.currentUser.defaultWorkspace); } - if (isNonNullable(queryData?.currentUser?.workspaceMember)) { + if (isDefined(queryData?.currentUser?.workspaceMember)) { const workspaceMember = queryData.currentUser.workspaceMember; setCurrentWorkspaceMember({ ...workspaceMember, diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx index 36087d150..0f9ef89b1 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx @@ -8,7 +8,7 @@ import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { EditableFilterChip } from '@/views/components/EditableFilterChip'; import { useViewBar } from '@/views/hooks/useViewBar'; import { ViewFilter } from '@/views/types/ViewFilter'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type EditableFilterDropdownButtonProps = { viewFilterDropdownId: string; @@ -40,7 +40,7 @@ export const EditableFilterDropdownButton = ({ filterDefinition.fieldMetadataId === viewFilter.fieldMetadataId, ); - if (isNonNullable(filterDefinition)) { + if (isDefined(filterDefinition)) { setFilterDefinitionUsedInDropdown(filterDefinition); setSelectedOperandInDropdown(viewFilter.operand); setSelectedFilter(viewFilter); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarEffect.tsx index ee64965b1..b5e8dd3e3 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarEffect.tsx @@ -7,8 +7,8 @@ import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useViewBar } from '@/views/hooks/useViewBar'; import { GraphQLView } from '@/views/types/GraphQLView'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { useViewScopedStates } from '../hooks/internal/useViewScopedStates'; @@ -52,11 +52,11 @@ export const ViewBarEffect = () => { newViews[0] ?? null; - if (isNullable(currentView)) return; + if (isUndefinedOrNull(currentView)) return; setCurrentViewId(currentView.id); - if (isNonNullable(currentView?.viewFields)) { + if (isDefined(currentView?.viewFields)) { loadViewFields(currentView.viewFields, currentView.id); loadViewFilters(currentView.viewFilters, currentView.id); loadViewSorts(currentView.viewSorts, currentView.id); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx index be740eef4..d49628099 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx @@ -5,7 +5,7 @@ import { useRecoilValue } from 'recoil'; import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type ViewBarFilterEffectProps = { filterDropdownId: string; @@ -32,11 +32,11 @@ export const ViewBarFilterEffect = ({ } = useFilterDropdown({ filterDropdownId }); useEffect(() => { - if (isNonNullable(availableFilterDefinitions)) { + if (isDefined(availableFilterDefinitions)) { setAvailableFilterDefinitions(availableFilterDefinitions); } - if (isNonNullable(onFilterSelect)) { + if (isDefined(onFilterSelect)) { setOnFilterSelect(() => onFilterSelect); } }, [ diff --git a/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx index d44c03a3c..eed9b4298 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarSortEffect.tsx @@ -4,7 +4,7 @@ import { useRecoilValue } from 'recoil'; import { useSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useSortDropdown'; import { Sort } from '@/object-record/object-sort-dropdown/types/Sort'; import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type ViewBarSortEffectProps = { sortDropdownId: string; @@ -26,10 +26,10 @@ export const ViewBarSortEffect = ({ }); useEffect(() => { - if (isNonNullable(availableSortDefinitions)) { + if (isDefined(availableSortDefinitions)) { setAvailableSortDefinitions(availableSortDefinitions); } - if (isNonNullable(onSortSelect)) { + if (isDefined(onSortSelect)) { setOnSortSelect(() => onSortSelect); } }, [ diff --git a/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx b/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx index 589837014..32a784192 100644 --- a/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx @@ -20,7 +20,7 @@ import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItemDraggable } from '@/ui/navigation/menu-item/components/MenuItemDraggable'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { groupArrayItemsBy } from '~/utils/array/groupArrayItemsBy'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; type ViewFieldsVisibilityDropdownSectionProps = { fields: Omit, 'size'>[]; @@ -69,7 +69,7 @@ export const ViewFieldsVisibilityDropdownSection = ({ Icon: field.isVisible ? IconMinus : IconPlus, onClick: () => onVisibilityChange(field), }, - ].filter(isNonNullable); + ].filter(isDefined); return iconButtons.length ? iconButtons : undefined; }; @@ -134,7 +134,7 @@ export const ViewFieldsVisibilityDropdownSection = ({ /> )} - {isNonNullable(openToolTipIndex) && + {isDefined(openToolTipIndex) && createPortal( handleViewSelect(view.id)} LeftIcon={IconList} text={view.name} diff --git a/packages/twenty-front/src/modules/views/hooks/internal/useFiltersFromQueryParams.ts b/packages/twenty-front/src/modules/views/hooks/internal/useFiltersFromQueryParams.ts index c2d31a245..2bc335175 100644 --- a/packages/twenty-front/src/modules/views/hooks/internal/useFiltersFromQueryParams.ts +++ b/packages/twenty-front/src/modules/views/hooks/internal/useFiltersFromQueryParams.ts @@ -15,8 +15,8 @@ import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenera import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; const filterQueryParamsSchema = z.object({ filter: z.record( @@ -71,7 +71,7 @@ export const useFiltersFromQueryParams = () => { field: fieldMetadataItem, }); - if (isNullable(filterDefinition)) return null; + if (isUndefinedOrNull(filterDefinition)) return null; const relationObjectMetadataNameSingular = fieldMetadataItem.toRelationMetadata?.fromObjectMetadata @@ -97,7 +97,7 @@ export const useFiltersFromQueryParams = () => { if ( isNonEmptyString(relationObjectMetadataNamePlural) && - isNonNullable(relationObjectMetadataItem) && + isDefined(relationObjectMetadataItem) && Array.isArray(filterValueFromURL) ) { const queryResult = await apolloClient.query< @@ -144,7 +144,7 @@ export const useFiltersFromQueryParams = () => { }, ), ) - ).filter(isNonNullable); + ).filter(isDefined); }, [ apolloClient, diff --git a/packages/twenty-front/src/modules/views/hooks/internal/useViewSorts.ts b/packages/twenty-front/src/modules/views/hooks/internal/useViewSorts.ts index cba3da86b..093e37173 100644 --- a/packages/twenty-front/src/modules/views/hooks/internal/useViewSorts.ts +++ b/packages/twenty-front/src/modules/views/hooks/internal/useViewSorts.ts @@ -8,7 +8,7 @@ import { Sort } from '@/object-record/object-sort-dropdown/types/Sort'; import { savedViewSortsScopedFamilyState } from '@/views/states/savedViewSortsScopedFamilyState'; import { ViewSort } from '@/views/types/ViewSort'; import { getViewScopedStateValuesFromSnapshot } from '@/views/utils/getViewScopedStateValuesFromSnapshot'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { useViewScopedStates } from './useViewScopedStates'; @@ -43,7 +43,7 @@ export const useViewSorts = (viewScopeId: string) => { return; } - if (isNullable(currentViewSorts)) { + if (isUndefinedOrNull(currentViewSorts)) { return; } if (!savedViewSortsByKey) { diff --git a/packages/twenty-front/src/modules/views/hooks/useViewBar.ts b/packages/twenty-front/src/modules/views/hooks/useViewBar.ts index a87bb7c62..ae114e12d 100644 --- a/packages/twenty-front/src/modules/views/hooks/useViewBar.ts +++ b/packages/twenty-front/src/modules/views/hooks/useViewBar.ts @@ -9,8 +9,8 @@ import { ViewField } from '@/views/types/ViewField'; import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewSort } from '@/views/types/ViewSort'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { ViewScopeInternalContext } from '../scopes/scope-internal-context/ViewScopeInternalContext'; import { currentViewFieldsScopedFamilyState } from '../states/currentViewFieldsScopedFamilyState'; @@ -114,11 +114,11 @@ export const useViewBar = (props?: UseViewProps) => { viewId: currentViewId, }); - if (isNullable(availableFieldDefinitions)) { + if (isUndefinedOrNull(availableFieldDefinitions)) { return; } - const queriedViewFields = viewFields.filter(isNonNullable); + const queriedViewFields = viewFields.filter(isDefined); if (isPersistingView) { return; @@ -154,7 +154,7 @@ export const useViewBar = (props?: UseViewProps) => { viewId: currentViewId, }); - if (isNullable(availableFilterDefinitions)) { + if (isUndefinedOrNull(availableFilterDefinitions)) { return; } @@ -173,7 +173,7 @@ export const useViewBar = (props?: UseViewProps) => { definition: availableFilterDefinition, }; }) - .filter(isNonNullable); + .filter(isDefined); if (!isDeeplyEqual(savedViewFilters, queriedViewFilters)) { set(savedViewFiltersState, queriedViewFilters); @@ -220,7 +220,7 @@ export const useViewBar = (props?: UseViewProps) => { definition: availableSortDefinition, }; }) - .filter(isNonNullable); + .filter(isDefined); if (!isDeeplyEqual(savedViewSorts, queriedViewSorts)) { set(savedViewSortsState, queriedViewSorts); @@ -269,11 +269,11 @@ export const useViewBar = (props?: UseViewProps) => { viewScopeId: scopeId, }); - if (isNonNullable(savedViewFilters)) { + if (isDefined(savedViewFilters)) { set(currentViewFiltersState, savedViewFilters); onViewFiltersChange?.(savedViewFilters); } - if (isNonNullable(savedViewSorts)) { + if (isDefined(savedViewSorts)) { set(currentViewSortsState, savedViewSorts); onViewSortsChange?.(savedViewSorts); } diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts index 0caab52de..035799760 100644 --- a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts +++ b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts @@ -2,8 +2,8 @@ import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata' import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { mapArrayToObject } from '~/utils/array/mapArrayToObject'; import { moveArrayItem } from '~/utils/array/moveArrayItem'; -import { isNonNullable } from '~/utils/isNonNullable'; -import { isNullable } from '~/utils/isNullable'; +import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { ViewField } from '../types/ViewField'; @@ -26,7 +26,7 @@ export const mapViewFieldsToColumnDefinitions = ({ const correspondingColumnDefinition = columnDefinitionsByFieldMetadataId[viewField.fieldMetadataId]; - if (isNullable(correspondingColumnDefinition)) return null; + if (isUndefinedOrNull(correspondingColumnDefinition)) return null; const { isLabelIdentifier } = correspondingColumnDefinition; @@ -49,7 +49,7 @@ export const mapViewFieldsToColumnDefinitions = ({ viewFieldId: viewField.id, }; }) - .filter(isNonNullable); + .filter(isDefined); // No label identifier set for this object if (!labelIdentifierFieldMetadataId) return columnDefinitionsFromViewFields; diff --git a/packages/twenty-front/src/pages/auth/ChooseYourPlan.tsx b/packages/twenty-front/src/pages/auth/ChooseYourPlan.tsx index 7e2d02baf..235eefd8d 100644 --- a/packages/twenty-front/src/pages/auth/ChooseYourPlan.tsx +++ b/packages/twenty-front/src/pages/auth/ChooseYourPlan.tsx @@ -18,7 +18,7 @@ import { useCheckoutSessionMutation, useGetProductPricesQuery, } from '~/generated/graphql.tsx'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledChoosePlanContainer = styled.div` display: flex; @@ -76,7 +76,7 @@ export const ChooseYourPlan = () => { (price) => price.recurringInterval === 'month', )?.[0]; if ( - isNonNullable(monthPrice) && + isDefined(monthPrice) && isNumber(monthPrice.unitAmount) && monthPrice.unitAmount > 0 && isNumber(price.unitAmount) && diff --git a/packages/twenty-front/src/pages/auth/CreateWorkspace.tsx b/packages/twenty-front/src/pages/auth/CreateWorkspace.tsx index 1f1e33719..d6991b471 100644 --- a/packages/twenty-front/src/pages/auth/CreateWorkspace.tsx +++ b/packages/twenty-front/src/pages/auth/CreateWorkspace.tsx @@ -21,7 +21,7 @@ import { MainButton } from '@/ui/input/button/components/MainButton'; import { TextInput } from '@/ui/input/components/TextInput'; import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser'; import { useActivateWorkspaceMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledContentContainer = styled.div` width: 100%; @@ -82,7 +82,7 @@ export const CreateWorkspace = () => { include: [FIND_MANY_OBJECT_METADATA_ITEMS], }); - if (isNonNullable(result.errors)) { + if (isDefined(result.errors)) { throw result.errors ?? new Error('Unknown error'); } diff --git a/packages/twenty-front/src/pages/impersonate/ImpersonateEffect.tsx b/packages/twenty-front/src/pages/impersonate/ImpersonateEffect.tsx index d8090655c..d8973a776 100644 --- a/packages/twenty-front/src/pages/impersonate/ImpersonateEffect.tsx +++ b/packages/twenty-front/src/pages/impersonate/ImpersonateEffect.tsx @@ -8,7 +8,7 @@ import { currentUserState } from '@/auth/states/currentUserState'; import { tokenPairState } from '@/auth/states/tokenPairState'; import { AppPath } from '@/types/AppPath'; import { useImpersonateMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const ImpersonateEffect = () => { const navigate = useNavigate(); @@ -30,7 +30,7 @@ export const ImpersonateEffect = () => { variables: { userId }, }); - if (isNonNullable(impersonateResult.errors)) { + if (isDefined(impersonateResult.errors)) { throw impersonateResult.errors; } diff --git a/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx b/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx index 4dc1fd3aa..3edd5d3e9 100644 --- a/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx +++ b/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx @@ -16,7 +16,7 @@ import { ShowPageAddButton } from '@/ui/layout/show-page/components/ShowPageAddB import { ShowPageMoreButton } from '@/ui/layout/show-page/components/ShowPageMoreButton'; import { PageTitle } from '@/ui/utilities/page-title/PageTitle'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const RecordShowPage = () => { const { objectNameSingular, objectRecordId } = useParams<{ @@ -55,12 +55,12 @@ export const RecordShowPage = () => { (favorite) => favorite.recordId === objectRecordId, ); - const isFavorite = isNonNullable(correspondingFavorite); + const isFavorite = isDefined(correspondingFavorite); const handleFavoriteButtonClick = async () => { if (!objectNameSingular || !record) return; - if (isFavorite && isNonNullable(record)) { + if (isFavorite && isDefined(record)) { deleteFavorite(correspondingFavorite.id); } else { createFavorite(record, objectNameSingular); diff --git a/packages/twenty-front/src/pages/settings/SettingsBilling.tsx b/packages/twenty-front/src/pages/settings/SettingsBilling.tsx index ebecdfdab..0940e33d1 100644 --- a/packages/twenty-front/src/pages/settings/SettingsBilling.tsx +++ b/packages/twenty-front/src/pages/settings/SettingsBilling.tsx @@ -18,7 +18,7 @@ import { Button } from '@/ui/input/button/components/Button.tsx'; import { SubMenuTopBarContainer } from '@/ui/layout/page/SubMenuTopBarContainer'; import { Section } from '@/ui/layout/section/components/Section.tsx'; import { useBillingPortalSessionQuery } from '~/generated/graphql.tsx'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledH1Title = styled(H1Title)` margin-bottom: 0; @@ -46,7 +46,7 @@ export const SettingsBilling = () => { onboardingStatus === OnboardingStatus.Canceled; const openBillingPortal = () => { - if (isNonNullable(data)) { + if (isDefined(data)) { window.location.replace(data.billingPortalSession.url); } }; diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx index e1981453f..ceb1b5b6d 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx @@ -28,7 +28,7 @@ import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; import { View } from '@/views/types/View'; import { ViewType } from '@/views/types/ViewType'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { isNullable } from '~/utils/isNullable'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; const StyledSettingsObjectFieldTypeSelect = styled( SettingsDataModelFieldTypeSelect, @@ -96,7 +96,7 @@ export const SettingsObjectNewFieldStep2 = () => { onCompleted: async (data: ObjectRecordConnection) => { const views = data.edges; - if (isNullable(views)) return; + if (isUndefinedOrNull(views)) return; setObjectViews(data.edges.map(({ node }) => node)); }, @@ -112,7 +112,7 @@ export const SettingsObjectNewFieldStep2 = () => { onCompleted: async (data: ObjectRecordConnection) => { const views = data.edges; - if (isNullable(views)) return; + if (isUndefinedOrNull(views)) return; setRelationObjectViews(data.edges.map(({ node }) => node)); }, diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx index 07e96f086..1b8c8cc79 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx @@ -26,7 +26,7 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/SubMenuTopBarContainer' import { Section } from '@/ui/layout/section/components/Section'; import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; import { useGenerateApiKeyTokenMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; const StyledInfo = styled.span` color: ${({ theme }) => theme.font.color.light}; @@ -119,7 +119,7 @@ export const SettingsDevelopersApiKeyDetail = () => { }; useEffect(() => { - if (isNonNullable(apiKeyData)) { + if (isDefined(apiKeyData)) { return () => { setGeneratedApi(apiKeyId, null); }; diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx index 63c595d5c..93a7e1f1d 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx @@ -18,7 +18,7 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/SubMenuTopBarContainer' import { Section } from '@/ui/layout/section/components/Section'; import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; import { useGenerateApiKeyTokenMutation } from '~/generated/graphql'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; export const SettingsDevelopersApiKeysNew = () => { const [generateOneApiKeyToken] = useGenerateApiKeyTokenMutation(); @@ -55,7 +55,7 @@ export const SettingsDevelopersApiKeysNew = () => { expiresAt: expiresAt, }, }); - if (isNonNullable(tokenData.data?.generateApiKeyToken)) { + if (isDefined(tokenData.data?.generateApiKeyToken)) { setGeneratedApi(newApiKey.id, tokenData.data.generateApiKeyToken.token); navigate(`/settings/developers/api-keys/${newApiKey.id}`); } diff --git a/packages/twenty-front/src/pages/tasks/TasksEffect.tsx b/packages/twenty-front/src/pages/tasks/TasksEffect.tsx index 9dc18238b..5c503edcd 100644 --- a/packages/twenty-front/src/pages/tasks/TasksEffect.tsx +++ b/packages/twenty-front/src/pages/tasks/TasksEffect.tsx @@ -4,7 +4,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { isNonNullable } from '~/utils/isNonNullable'; +import { isDefined } from '~/utils/isDefined'; import { tasksFilterDefinitions } from './tasks-filter-definitions'; @@ -27,7 +27,7 @@ export const TasksEffect = ({ filterDropdownId }: TasksEffectProps) => { }, [setAvailableFilterDefinitions]); useEffect(() => { - if (isNonNullable(currentWorkspaceMember)) { + if (isDefined(currentWorkspaceMember)) { setSelectedFilter({ fieldMetadataId: 'assigneeId', value: JSON.stringify(currentWorkspaceMember.id), diff --git a/packages/twenty-front/src/testing/mock-data/index.ts b/packages/twenty-front/src/testing/mock-data/index.ts index 52cfda4fc..0d8eb19d1 100644 --- a/packages/twenty-front/src/testing/mock-data/index.ts +++ b/packages/twenty-front/src/testing/mock-data/index.ts @@ -7,7 +7,7 @@ import { } from '@sniptt/guards'; import { GraphQLVariables } from 'msw'; -import { isNonNullable } from '../../utils/isNonNullable'; +import { isDefined } from '../../utils/isDefined'; type StringFilter = { equals?: string; @@ -30,7 +30,7 @@ const filterData = ( if (!['OR', 'AND', 'NOT'].includes(key)) { const filterElement = where[key] as StringFilter & { is?: object }; - if (isNonNullable(filterElement.is)) { + if (isDefined(filterElement.is)) { const nestedKey = Object.keys(filterElement.is)[0] as string; if ( item[key as keyof typeof item] && @@ -101,11 +101,11 @@ export const filterAndSortData = ( ): Array => { let filteredData = data; - if (isNonNullable(where)) { + if (isDefined(where)) { filteredData = filterData(data, where); } - if (isArray(orderBy) && orderBy.length > 0 && isNonNullable(orderBy[0])) { + if (isArray(orderBy) && orderBy.length > 0 && isDefined(orderBy[0])) { const firstOrderBy = orderBy?.[0]; const key = Object.keys(firstOrderBy)[0]; @@ -139,7 +139,7 @@ export const fetchOneFromData = ( data: Array, id: string, ): DataT | undefined => { - if (!isNonNullable(id)) { + if (!isDefined(id)) { throw new Error( `id is not defined in updateOneFromData, check that you provided where.id if needed.`, ); @@ -153,7 +153,7 @@ export const updateOneFromData = ( id: string | undefined, payload: GraphQLVariables, ): DataT | undefined => { - if (!isNonNullable(id)) { + if (!isDefined(id)) { throw new Error( `id is not defined in updateOneFromData, check that you provided where.id if needed.`, ); diff --git a/packages/twenty-front/src/utils/__tests__/isDefined.test.ts b/packages/twenty-front/src/utils/__tests__/isDefined.test.ts new file mode 100644 index 000000000..d5b0bae7d --- /dev/null +++ b/packages/twenty-front/src/utils/__tests__/isDefined.test.ts @@ -0,0 +1,15 @@ +import { isDefined } from '~/utils/isDefined'; + +describe('isDefined', () => { + it('returns true if value is not undefined nor null', () => { + expect(isDefined('')).toBe(true); + }); + + it('returns false if value is null', () => { + expect(isDefined(null)).toBe(false); + }); + + it('returns false if value is undefined', () => { + expect(isDefined(undefined)).toBe(false); + }); +}); diff --git a/packages/twenty-front/src/utils/__tests__/isNonNullable.test.ts b/packages/twenty-front/src/utils/__tests__/isNonNullable.test.ts deleted file mode 100644 index 9969b33be..000000000 --- a/packages/twenty-front/src/utils/__tests__/isNonNullable.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { isNonNullable } from '~/utils/isNonNullable'; - -describe('isNonNullable', () => { - it('returns true if value is not undefined nor null', () => { - expect(isNonNullable('')).toBe(true); - }); - - it('returns false if value is null', () => { - expect(isNonNullable(null)).toBe(false); - }); - - it('returns false if value is undefined', () => { - expect(isNonNullable(undefined)).toBe(false); - }); -}); diff --git a/packages/twenty-front/src/utils/checkUrlType.ts b/packages/twenty-front/src/utils/checkUrlType.ts index f438a4d6c..13f1499c2 100644 --- a/packages/twenty-front/src/utils/checkUrlType.ts +++ b/packages/twenty-front/src/utils/checkUrlType.ts @@ -1,6 +1,6 @@ import { LinkType } from '@/ui/navigation/link/components/SocialLink'; -import { isNonNullable } from './isNonNullable'; +import { isDefined } from './isDefined'; export const checkUrlType = (url: string) => { if ( @@ -11,9 +11,7 @@ export const checkUrlType = (url: string) => { return LinkType.LinkedIn; } if ( - isNonNullable( - /^((http|https):\/\/)?(?:www\.)?twitter\.com\/(\w+)?/i.exec(url), - ) + isDefined(/^((http|https):\/\/)?(?:www\.)?twitter\.com\/(\w+)?/i.exec(url)) ) { return LinkType.Twitter; } diff --git a/packages/twenty-front/src/utils/getDisplayValueByUrlType.ts b/packages/twenty-front/src/utils/getDisplayValueByUrlType.ts index 88d437a21..75cf16fa1 100644 --- a/packages/twenty-front/src/utils/getDisplayValueByUrlType.ts +++ b/packages/twenty-front/src/utils/getDisplayValueByUrlType.ts @@ -1,6 +1,6 @@ import { LinkType } from '@/ui/navigation/link/components/SocialLink'; -import { isNonNullable } from './isNonNullable'; +import { isDefined } from './isDefined'; type getUrlDisplayValueByUrlTypeProps = { type: LinkType; @@ -15,7 +15,7 @@ export const getDisplayValueByUrlType = ({ const matches = href.match( /(?:https?:\/\/)?(?:www.)?linkedin.com\/(?:in|company|school)\/(.*)/, ); - if (isNonNullable(matches?.[1])) { + if (isDefined(matches?.[1])) { return matches?.[1]; } else { return 'LinkedIn'; @@ -26,7 +26,7 @@ export const getDisplayValueByUrlType = ({ const matches = href.match( /(?:https?:\/\/)?(?:www.)?twitter.com\/([-a-zA-Z0-9@:%_+.~#?&//=]*)/, ); - if (isNonNullable(matches?.[1])) { + if (isDefined(matches?.[1])) { return `@${matches?.[1]}`; } else { return '@twitter'; diff --git a/packages/twenty-front/src/utils/is-domain.ts b/packages/twenty-front/src/utils/is-domain.ts index aaec62034..7db972074 100644 --- a/packages/twenty-front/src/utils/is-domain.ts +++ b/packages/twenty-front/src/utils/is-domain.ts @@ -1,7 +1,7 @@ -import { isNonNullable } from './isNonNullable'; +import { isDefined } from './isDefined'; export const isDomain = (url: string | undefined | null) => - isNonNullable(url) && + isDefined(url) && /^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$/.test( url, ); diff --git a/packages/twenty-front/src/utils/is-url.ts b/packages/twenty-front/src/utils/is-url.ts index 3572451c2..bb6e8f7ee 100644 --- a/packages/twenty-front/src/utils/is-url.ts +++ b/packages/twenty-front/src/utils/is-url.ts @@ -1,7 +1,7 @@ -import { isNonNullable } from './isNonNullable'; +import { isDefined } from './isDefined'; export const isURL = (url: string | undefined | null) => - isNonNullable(url) && + isDefined(url) && url.match( /^(https?:\/\/)?(www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/i, ); diff --git a/packages/twenty-front/src/utils/isNonNullable.ts b/packages/twenty-front/src/utils/isDefined.ts similarity index 57% rename from packages/twenty-front/src/utils/isNonNullable.ts rename to packages/twenty-front/src/utils/isDefined.ts index 6958554d0..4b66f1ce6 100644 --- a/packages/twenty-front/src/utils/isNonNullable.ts +++ b/packages/twenty-front/src/utils/isDefined.ts @@ -1,4 +1,4 @@ import { isNull, isUndefined } from '@sniptt/guards'; -export const isNonNullable = (value: T): value is NonNullable => +export const isDefined = (value: T): value is NonNullable => !isUndefined(value) && !isNull(value); diff --git a/packages/twenty-front/src/utils/isNullable.ts b/packages/twenty-front/src/utils/isUndefinedOrNull.ts similarity index 55% rename from packages/twenty-front/src/utils/isNullable.ts rename to packages/twenty-front/src/utils/isUndefinedOrNull.ts index 8ba06347e..176380e2b 100644 --- a/packages/twenty-front/src/utils/isNullable.ts +++ b/packages/twenty-front/src/utils/isUndefinedOrNull.ts @@ -1,4 +1,4 @@ import { isNull, isUndefined } from '@sniptt/guards'; -export const isNullable = (value: any): value is null | undefined => +export const isUndefinedOrNull = (value: any): value is null | undefined => isUndefined(value) || isNull(value); diff --git a/packages/twenty-front/src/utils/recoil-effects.ts b/packages/twenty-front/src/utils/recoil-effects.ts index c5b096842..d7c0261b9 100644 --- a/packages/twenty-front/src/utils/recoil-effects.ts +++ b/packages/twenty-front/src/utils/recoil-effects.ts @@ -2,7 +2,7 @@ import { AtomEffect } from 'recoil'; import { cookieStorage } from '~/utils/cookie-storage'; -import { isNonNullable } from './isNonNullable'; +import { isDefined } from './isDefined'; export const localStorageEffect = (key: string): AtomEffect => @@ -24,8 +24,8 @@ export const cookieStorageEffect = ({ setSelf, onSet }) => { const savedValue = cookieStorage.getItem(key); if ( - isNonNullable(savedValue) && - isNonNullable(JSON.parse(savedValue)['accessToken']) + isDefined(savedValue) && + isDefined(JSON.parse(savedValue)['accessToken']) ) { setSelf(JSON.parse(savedValue)); }