* wip * wip * Ok * Deleted unused code * Fixed lint * Minor fixes * Minor fixes * Minor Fixes * Minor merge fixes * Ok * Fix storybook tests * Removed console.log * Fix login * asd * Fixed storybook * Added await * Fixed await * Added sleep for failing test * Fix sleep * Fix test * Fix tests --------- Co-authored-by: Charles Bochet <charles@twenty.com>
141 lines
5.2 KiB
TypeScript
141 lines
5.2 KiB
TypeScript
import { useLocation } from 'react-router-dom';
|
|
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { GetPeopleQuery } from '~/generated/graphql';
|
|
|
|
import { peopleFilters } from '../../../pages/people/people-filters';
|
|
import { availableFiltersScopedState } from '../../ui/filter-n-sort/states/availableFiltersScopedState';
|
|
import { useContextScopeId } from '../../ui/recoil-scope/hooks/useContextScopeId';
|
|
import { currentPageLocationState } from '../../ui/states/currentPageLocationState';
|
|
import { useResetTableRowSelection } from '../../ui/table/hooks/useResetTableRowSelection';
|
|
import { entityTableDimensionsState } from '../../ui/table/states/entityTableDimensionsState';
|
|
import { isFetchingEntityTableDataState } from '../../ui/table/states/isFetchingEntityTableDataState';
|
|
import { TableContext } from '../../ui/table/states/TableContext';
|
|
import { tableRowIdsState } from '../../ui/table/states/tableRowIdsState';
|
|
import { peopleCityFamilyState } from '../states/peopleCityFamilyState';
|
|
import { peopleCompanyFamilyState } from '../states/peopleCompanyFamilyState';
|
|
import { peopleCreatedAtFamilyState } from '../states/peopleCreatedAtFamilyState';
|
|
import { peopleEmailFamilyState } from '../states/peopleEmailFamilyState';
|
|
import { peopleJobTitleFamilyState } from '../states/peopleJobTitleFamilyState';
|
|
import { peopleLinkedinUrlFamilyState } from '../states/peopleLinkedinUrlFamilyState';
|
|
import { peopleNameCellFamilyState } from '../states/peopleNamesFamilyState';
|
|
import { peoplePhoneFamilyState } from '../states/peoplePhoneFamilyState';
|
|
import { peopleColumns } from '../table/components/peopleColumns';
|
|
|
|
export function useSetPeopleEntityTable() {
|
|
const resetTableRowSelection = useResetTableRowSelection();
|
|
|
|
const tableContextScopeId = useContextScopeId(TableContext);
|
|
|
|
const currentLocation = useLocation().pathname;
|
|
|
|
return useRecoilCallback(
|
|
({ set, snapshot }) =>
|
|
(newPeopleArray: GetPeopleQuery['people']) => {
|
|
for (const person of newPeopleArray) {
|
|
const currentEmail = snapshot
|
|
.getLoadable(peopleEmailFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentEmail !== person.email) {
|
|
set(peopleEmailFamilyState(person.id), person.email ?? null);
|
|
}
|
|
|
|
const currentCity = snapshot
|
|
.getLoadable(peopleCityFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentCity !== person.city) {
|
|
set(peopleCityFamilyState(person.id), person.city ?? null);
|
|
}
|
|
|
|
const currentCompany = snapshot
|
|
.getLoadable(peopleCompanyFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (
|
|
JSON.stringify(currentCompany) !== JSON.stringify(person.company)
|
|
) {
|
|
set(peopleCompanyFamilyState(person.id), person.company);
|
|
}
|
|
|
|
const currentPhone = snapshot
|
|
.getLoadable(peoplePhoneFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentPhone !== person.phone) {
|
|
set(peoplePhoneFamilyState(person.id), person.phone ?? null);
|
|
}
|
|
|
|
const currentCreatedAt = snapshot
|
|
.getLoadable(peopleCreatedAtFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentCreatedAt !== person.createdAt) {
|
|
set(peopleCreatedAtFamilyState(person.id), person.createdAt);
|
|
}
|
|
|
|
const currentJobTitle = snapshot
|
|
.getLoadable(peopleJobTitleFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentJobTitle !== person.jobTitle) {
|
|
set(peopleJobTitleFamilyState(person.id), person.jobTitle ?? null);
|
|
}
|
|
|
|
const currentLinkedinUrl = snapshot
|
|
.getLoadable(peopleLinkedinUrlFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (currentLinkedinUrl !== person.linkedinUrl) {
|
|
set(
|
|
peopleLinkedinUrlFamilyState(person.id),
|
|
person.linkedinUrl ?? null,
|
|
);
|
|
}
|
|
|
|
const currentNameCell = snapshot
|
|
.getLoadable(peopleNameCellFamilyState(person.id))
|
|
.valueOrThrow();
|
|
|
|
if (
|
|
currentNameCell.firstName !== person.firstName ||
|
|
currentNameCell.lastName !== person.lastName ||
|
|
currentNameCell.commentCount !== person._commentThreadCount
|
|
) {
|
|
set(peopleNameCellFamilyState(person.id), {
|
|
firstName: person.firstName ?? null,
|
|
lastName: person.lastName ?? null,
|
|
commentCount: person._commentThreadCount,
|
|
displayName: person.displayName ?? null,
|
|
});
|
|
}
|
|
}
|
|
|
|
const peopleIds = newPeopleArray.map((people) => people.id);
|
|
|
|
set(tableRowIdsState, (currentRowIds) => {
|
|
if (JSON.stringify(currentRowIds) !== JSON.stringify(peopleIds)) {
|
|
return peopleIds;
|
|
}
|
|
|
|
return currentRowIds;
|
|
});
|
|
|
|
resetTableRowSelection();
|
|
|
|
set(entityTableDimensionsState, {
|
|
numberOfColumns: peopleColumns.length,
|
|
numberOfRows: peopleIds.length,
|
|
});
|
|
|
|
set(availableFiltersScopedState(tableContextScopeId), peopleFilters);
|
|
|
|
set(currentPageLocationState, currentLocation);
|
|
|
|
set(isFetchingEntityTableDataState, false);
|
|
},
|
|
[],
|
|
);
|
|
}
|