fix: use correct table view when switching workspaces (#1447)
Closes #1441
This commit is contained in:
@ -1,6 +1,9 @@
|
||||
import { useCallback } from 'react';
|
||||
import { useRecoilCallback } from 'recoil';
|
||||
|
||||
import { savedFiltersScopedState } from '@/ui/filter-n-sort/states/savedFiltersScopedState';
|
||||
import { savedSortsScopedState } from '@/ui/filter-n-sort/states/savedSortsScopedState';
|
||||
import { TableRecoilScopeContext } from '@/ui/table/states/recoil-scope-contexts/TableRecoilScopeContext';
|
||||
import { savedTableColumnsScopedState } from '@/ui/table/states/savedTableColumnsScopedState';
|
||||
import {
|
||||
currentTableViewIdState,
|
||||
type TableView,
|
||||
@ -42,41 +45,44 @@ export const useViews = ({
|
||||
const [updateViewMutation] = useUpdateViewMutation();
|
||||
const [deleteViewMutation] = useDeleteViewMutation();
|
||||
|
||||
const createView = useCallback(
|
||||
async (view: TableView) => {
|
||||
const { data } = await createViewMutation({
|
||||
variables: {
|
||||
data: {
|
||||
...view,
|
||||
objectId,
|
||||
type: ViewType.Table,
|
||||
},
|
||||
const createView = async (view: TableView) => {
|
||||
const { data } = await createViewMutation({
|
||||
variables: {
|
||||
data: {
|
||||
...view,
|
||||
objectId,
|
||||
type: ViewType.Table,
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
if (data?.view) await onViewCreate(data.view.id);
|
||||
},
|
||||
[createViewMutation, objectId, onViewCreate],
|
||||
if (data?.view) await onViewCreate(data.view.id);
|
||||
};
|
||||
|
||||
const updateView = (view: TableView) =>
|
||||
updateViewMutation({
|
||||
variables: {
|
||||
data: { name: view.name },
|
||||
where: { id: view.id },
|
||||
},
|
||||
});
|
||||
|
||||
const deleteView = (viewId: string) =>
|
||||
deleteViewMutation({ variables: { where: { id: viewId } } });
|
||||
|
||||
const handleResetSavedViews = useRecoilCallback(
|
||||
({ reset }) =>
|
||||
() => {
|
||||
tableViews.forEach((view) => {
|
||||
reset(savedTableColumnsScopedState(view.id));
|
||||
reset(savedFiltersScopedState(view.id));
|
||||
reset(savedSortsScopedState(view.id));
|
||||
});
|
||||
},
|
||||
[tableViews],
|
||||
);
|
||||
|
||||
const updateView = useCallback(
|
||||
(view: TableView) =>
|
||||
updateViewMutation({
|
||||
variables: {
|
||||
data: { name: view.name },
|
||||
where: { id: view.id },
|
||||
},
|
||||
}),
|
||||
[updateViewMutation],
|
||||
);
|
||||
|
||||
const deleteView = useCallback(
|
||||
(viewId: string) =>
|
||||
deleteViewMutation({ variables: { where: { id: viewId } } }),
|
||||
[deleteViewMutation],
|
||||
);
|
||||
|
||||
const { refetch } = useGetViewsQuery({
|
||||
const { loading, refetch } = useGetViewsQuery({
|
||||
variables: {
|
||||
where: {
|
||||
objectId: { equals: objectId },
|
||||
@ -90,41 +96,46 @@ export const useViews = ({
|
||||
|
||||
if (!isDeeplyEqual(tableViews, nextViews)) setTableViews(nextViews);
|
||||
|
||||
if (nextViews.length && !currentTableViewId)
|
||||
// If there is no current view selected,
|
||||
// or if the current view cannot be found in the views list (user switched workspaces)
|
||||
if (
|
||||
nextViews.length &&
|
||||
(!currentTableViewId ||
|
||||
!nextViews.some((view) => view.id === currentTableViewId))
|
||||
) {
|
||||
setCurrentTableViewId(nextViews[0].id);
|
||||
handleResetSavedViews();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const handleViewsChange = useCallback(
|
||||
async (nextViews: TableView[]) => {
|
||||
const viewToCreate = nextViews.find(
|
||||
(nextView) => !tableViewsById[nextView.id],
|
||||
);
|
||||
if (viewToCreate) {
|
||||
await createView(viewToCreate);
|
||||
return refetch();
|
||||
}
|
||||
|
||||
const viewToUpdate = nextViews.find(
|
||||
(nextView) =>
|
||||
tableViewsById[nextView.id] &&
|
||||
tableViewsById[nextView.id].name !== nextView.name,
|
||||
);
|
||||
if (viewToUpdate) {
|
||||
await updateView(viewToUpdate);
|
||||
return refetch();
|
||||
}
|
||||
|
||||
const nextViewIds = nextViews.map((nextView) => nextView.id);
|
||||
const viewIdToDelete = Object.keys(tableViewsById).find(
|
||||
(previousViewId) => !nextViewIds.includes(previousViewId),
|
||||
);
|
||||
if (viewIdToDelete) await deleteView(viewIdToDelete);
|
||||
|
||||
const handleViewsChange = async (nextViews: TableView[]) => {
|
||||
const viewToCreate = nextViews.find(
|
||||
(nextView) => !tableViewsById[nextView.id],
|
||||
);
|
||||
if (viewToCreate) {
|
||||
await createView(viewToCreate);
|
||||
return refetch();
|
||||
},
|
||||
[createView, deleteView, refetch, tableViewsById, updateView],
|
||||
);
|
||||
}
|
||||
|
||||
return { handleViewsChange };
|
||||
const viewToUpdate = nextViews.find(
|
||||
(nextView) =>
|
||||
tableViewsById[nextView.id] &&
|
||||
tableViewsById[nextView.id].name !== nextView.name,
|
||||
);
|
||||
if (viewToUpdate) {
|
||||
await updateView(viewToUpdate);
|
||||
return refetch();
|
||||
}
|
||||
|
||||
const nextViewIds = nextViews.map((nextView) => nextView.id);
|
||||
const viewIdToDelete = Object.keys(tableViewsById).find(
|
||||
(previousViewId) => !nextViewIds.includes(previousViewId),
|
||||
);
|
||||
if (viewIdToDelete) await deleteView(viewIdToDelete);
|
||||
|
||||
return refetch();
|
||||
};
|
||||
|
||||
return { handleViewsChange, isFetchingViews: loading };
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user