Improved optimistic rendering (#2649)
This commit is contained in:
@ -1,7 +1,4 @@
|
|||||||
import { Note } from '@/activities/types/Note';
|
import { Note } from '@/activities/types/Note';
|
||||||
import { useOptimisticEffect } from '@/apollo/optimistic-effect/hooks/useOptimisticEffect';
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
|
||||||
import { getRecordOptimisticEffectDefinition } from '@/object-record/graphql/optimistic-effect-definition/getRecordOptimisticEffectDefinition';
|
|
||||||
import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords';
|
import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords';
|
||||||
|
|
||||||
import { ActivityTargetableEntity } from '../../types/ActivityTargetableEntity';
|
import { ActivityTargetableEntity } from '../../types/ActivityTargetableEntity';
|
||||||
@ -14,15 +11,6 @@ export const useNotes = (entity: ActivityTargetableEntity) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const { objectMetadataItem: activityObjectMetadataItem } =
|
|
||||||
useObjectMetadataItem({
|
|
||||||
objectNameSingular: 'activity',
|
|
||||||
});
|
|
||||||
|
|
||||||
const { registerOptimisticEffect } = useOptimisticEffect({
|
|
||||||
objectNameSingular: activityObjectMetadataItem?.nameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const filter = {
|
const filter = {
|
||||||
id: {
|
id: {
|
||||||
in: activityTargets?.map((activityTarget) => activityTarget.activityId),
|
in: activityTargets?.map((activityTarget) => activityTarget.activityId),
|
||||||
@ -38,16 +26,6 @@ export const useNotes = (entity: ActivityTargetableEntity) => {
|
|||||||
objectNamePlural: 'activities',
|
objectNamePlural: 'activities',
|
||||||
filter,
|
filter,
|
||||||
orderBy,
|
orderBy,
|
||||||
onCompleted: () => {
|
|
||||||
if (activityObjectMetadataItem) {
|
|
||||||
registerOptimisticEffect({
|
|
||||||
variables: { orderBy, filter },
|
|
||||||
definition: getRecordOptimisticEffectDefinition({
|
|
||||||
objectMetadataItem: activityObjectMetadataItem,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -2,9 +2,6 @@ import { DateTime } from 'luxon';
|
|||||||
|
|
||||||
import { Activity } from '@/activities/types/Activity';
|
import { Activity } from '@/activities/types/Activity';
|
||||||
import { ActivityTargetableEntity } from '@/activities/types/ActivityTargetableEntity';
|
import { ActivityTargetableEntity } from '@/activities/types/ActivityTargetableEntity';
|
||||||
import { useOptimisticEffect } from '@/apollo/optimistic-effect/hooks/useOptimisticEffect';
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
|
||||||
import { getRecordOptimisticEffectDefinition } from '@/object-record/graphql/optimistic-effect-definition/getRecordOptimisticEffectDefinition';
|
|
||||||
import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords';
|
import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords';
|
||||||
import { useFilter } from '@/ui/object/object-filter-dropdown/hooks/useFilter';
|
import { useFilter } from '@/ui/object/object-filter-dropdown/hooks/useFilter';
|
||||||
import { parseDate } from '~/utils/date-utils';
|
import { parseDate } from '~/utils/date-utils';
|
||||||
@ -21,15 +18,6 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const { objectMetadataItem: activityObjectMetadataItem } =
|
|
||||||
useObjectMetadataItem({
|
|
||||||
objectNameSingular: 'activity',
|
|
||||||
});
|
|
||||||
|
|
||||||
const { registerOptimisticEffect } = useOptimisticEffect({
|
|
||||||
objectNameSingular: activityObjectMetadataItem?.nameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { objects: completeTasksData } = useFindManyObjectRecords({
|
const { objects: completeTasksData } = useFindManyObjectRecords({
|
||||||
objectNamePlural: 'activities',
|
objectNamePlural: 'activities',
|
||||||
skip: !entity && !selectedFilter,
|
skip: !entity && !selectedFilter,
|
||||||
@ -43,29 +31,6 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
|
|||||||
orderBy: {
|
orderBy: {
|
||||||
createdAt: 'DescNullsFirst',
|
createdAt: 'DescNullsFirst',
|
||||||
},
|
},
|
||||||
onCompleted: () => {
|
|
||||||
if (activityObjectMetadataItem) {
|
|
||||||
registerOptimisticEffect({
|
|
||||||
variables: {
|
|
||||||
filter: {
|
|
||||||
completedAt: { is: 'NOT_NULL' },
|
|
||||||
id: {
|
|
||||||
in: activityTargets?.map(
|
|
||||||
(activityTarget) => activityTarget.activityId,
|
|
||||||
),
|
|
||||||
},
|
|
||||||
type: { eq: 'Task' },
|
|
||||||
},
|
|
||||||
orderBy: {
|
|
||||||
createdAt: 'DescNullsFirst',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
definition: getRecordOptimisticEffectDefinition({
|
|
||||||
objectMetadataItem: activityObjectMetadataItem,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const { objects: incompleteTaskData } = useFindManyObjectRecords({
|
const { objects: incompleteTaskData } = useFindManyObjectRecords({
|
||||||
@ -81,29 +46,6 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
|
|||||||
orderBy: {
|
orderBy: {
|
||||||
createdAt: 'DescNullsFirst',
|
createdAt: 'DescNullsFirst',
|
||||||
},
|
},
|
||||||
onCompleted: () => {
|
|
||||||
if (activityObjectMetadataItem) {
|
|
||||||
registerOptimisticEffect({
|
|
||||||
variables: {
|
|
||||||
filter: {
|
|
||||||
completedAt: { is: 'NULL' },
|
|
||||||
id: {
|
|
||||||
in: activityTargets?.map(
|
|
||||||
(activityTarget) => activityTarget.activityId,
|
|
||||||
),
|
|
||||||
},
|
|
||||||
type: { eq: 'Task' },
|
|
||||||
},
|
|
||||||
orderBy: {
|
|
||||||
createdAt: 'DescNullsFirst',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
definition: getRecordOptimisticEffectDefinition({
|
|
||||||
objectMetadataItem: activityObjectMetadataItem,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const todayOrPreviousTasks = incompleteTaskData?.filter((task) => {
|
const todayOrPreviousTasks = incompleteTaskData?.filter((task) => {
|
||||||
|
|||||||
@ -36,10 +36,8 @@ export const useCreateOneObjectRecord = <T>({
|
|||||||
});
|
});
|
||||||
|
|
||||||
triggerOptimisticEffects(
|
triggerOptimisticEffects(
|
||||||
`${capitalize(foundObjectMetadataItem.nameSingular)}Edge`,
|
`${capitalize(objectNameSingular)}Edge`,
|
||||||
createdObject.data[
|
createdObject.data[`create${capitalize(objectNameSingular)}`],
|
||||||
`create${capitalize(foundObjectMetadataItem.nameSingular)}`
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
return createdObject.data[`create${capitalize(objectNameSingular)}`] as T;
|
return createdObject.data[`create${capitalize(objectNameSingular)}`] as T;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import { getOperationName } from '@apollo/client/utilities';
|
|
||||||
|
|
||||||
|
import { useOptimisticEvict } from '@/apollo/optimistic-effect/hooks/useOptimisticEvict';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
|
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
|
||||||
import { capitalize } from '~/utils/string/capitalize';
|
import { capitalize } from '~/utils/string/capitalize';
|
||||||
@ -9,10 +9,11 @@ import { capitalize } from '~/utils/string/capitalize';
|
|||||||
export const useDeleteOneObjectRecord = <T>({
|
export const useDeleteOneObjectRecord = <T>({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
}: Pick<ObjectMetadataItemIdentifier, 'objectNameSingular'>) => {
|
}: Pick<ObjectMetadataItemIdentifier, 'objectNameSingular'>) => {
|
||||||
|
const { performOptimisticEvict } = useOptimisticEvict();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
objectMetadataItem: foundObjectMetadataItem,
|
objectMetadataItem: foundObjectMetadataItem,
|
||||||
objectNotFoundInMetadata,
|
objectNotFoundInMetadata,
|
||||||
findManyQuery,
|
|
||||||
deleteOneMutation,
|
deleteOneMutation,
|
||||||
} = useObjectMetadataItem({
|
} = useObjectMetadataItem({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
@ -31,12 +32,18 @@ export const useDeleteOneObjectRecord = <T>({
|
|||||||
variables: {
|
variables: {
|
||||||
idToDelete,
|
idToDelete,
|
||||||
},
|
},
|
||||||
refetchQueries: [getOperationName(findManyQuery) ?? ''],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
performOptimisticEvict(capitalize(objectNameSingular), 'id', idToDelete);
|
||||||
|
|
||||||
return deletedObject.data[`create${capitalize(objectNameSingular)}`] as T;
|
return deletedObject.data[`create${capitalize(objectNameSingular)}`] as T;
|
||||||
},
|
},
|
||||||
[foundObjectMetadataItem, mutate, objectNameSingular, findManyQuery],
|
[
|
||||||
|
performOptimisticEvict,
|
||||||
|
foundObjectMetadataItem,
|
||||||
|
mutate,
|
||||||
|
objectNameSingular,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -4,8 +4,10 @@ import { isNonEmptyArray } from '@apollo/client/utilities';
|
|||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { useOptimisticEffect } from '@/apollo/optimistic-effect/hooks/useOptimisticEffect';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
|
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
|
||||||
|
import { getRecordOptimisticEffectDefinition } from '@/object-record/graphql/optimistic-effect-definition/getRecordOptimisticEffectDefinition';
|
||||||
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
||||||
import { logError } from '~/utils/logError';
|
import { logError } from '~/utils/logError';
|
||||||
import { capitalize } from '~/utils/string/capitalize';
|
import { capitalize } from '~/utils/string/capitalize';
|
||||||
@ -53,6 +55,10 @@ export const useFindManyObjectRecords = <
|
|||||||
objectNamePlural,
|
objectNamePlural,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { registerOptimisticEffect } = useOptimisticEffect({
|
||||||
|
objectNameSingular: objectMetadataItem?.nameSingular,
|
||||||
|
});
|
||||||
|
|
||||||
const { enqueueSnackBar } = useSnackBar();
|
const { enqueueSnackBar } = useSnackBar();
|
||||||
|
|
||||||
const { data, loading, error, fetchMore } = useQuery<
|
const { data, loading, error, fetchMore } = useQuery<
|
||||||
@ -64,6 +70,18 @@ export const useFindManyObjectRecords = <
|
|||||||
orderBy: orderBy ?? {},
|
orderBy: orderBy ?? {},
|
||||||
},
|
},
|
||||||
onCompleted: (data) => {
|
onCompleted: (data) => {
|
||||||
|
if (objectMetadataItem) {
|
||||||
|
registerOptimisticEffect({
|
||||||
|
variables: {
|
||||||
|
filter: filter ?? {},
|
||||||
|
orderBy: orderBy ?? {},
|
||||||
|
},
|
||||||
|
definition: getRecordOptimisticEffectDefinition({
|
||||||
|
objectMetadataItem,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (objectNamePlural) {
|
if (objectNamePlural) {
|
||||||
onCompleted?.(data[objectNamePlural]);
|
onCompleted?.(data[objectNamePlural]);
|
||||||
|
|
||||||
|
|||||||
@ -36,6 +36,12 @@ export const useUpdateOneObjectRecord = <T>({
|
|||||||
...input,
|
...input,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
optimisticResponse: {
|
||||||
|
[`update${capitalize(objectNameSingular)}`]: {
|
||||||
|
id: idToUpdate,
|
||||||
|
...input,
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return updatedObject.data[`update${capitalize(objectNameSingular)}`] as T;
|
return updatedObject.data[`update${capitalize(objectNameSingular)}`] as T;
|
||||||
|
|||||||
Reference in New Issue
Block a user