use-activate-column-sort.ts1.7 KBView on GitHub
/**
 * useActivateColumnSortAtTop
 *
 * Shared by every column popover (enum, date, number, binary, task, custom
 * field, action). Turning sorting on from a column header means "sort by this
 * now", so the column takes priority 0 and existing sorts shift down one slot.
 *
 * Writes to the canvas viewConfig when `canvasId` is given, otherwise to the
 * global CRMSlice columns.
 */

import { useCallback } from 'react';
import type { ConversationViewConfig } from '@/modules/canvas/types/canvas-types';
import { useCedarStore } from '@/modules/store';
import { withTopPrioritySort } from '../utils/sort-priority';
import type { ColumnSort } from '../store/crmSlice';

export function useActivateColumnSortAtTop(field: string, canvasId?: string) {
  const setColumnSortAtTopPriority = useCedarStore((state) => state.setColumnSortAtTopPriority);
  const updateCanvasViewConfig = useCedarStore((state) => state.updateCanvasViewConfig);
  const saveCanvasViewConfig = useCedarStore((state) => state.saveCanvasViewConfig);

  return useCallback(
    (sort: Omit<ColumnSort, 'priority'>) => {
      if (!canvasId) {
        setColumnSortAtTopPriority(field, sort);
        return;
      }
      const canvas = useCedarStore.getState().canvasesById[canvasId];
      if (!canvas) return;
      const viewConfig = (canvas.viewConfig ?? {}) as ConversationViewConfig;
      updateCanvasViewConfig(canvasId, {
        ...viewConfig,
        filterSortConfiguration: withTopPrioritySort(
          viewConfig.filterSortConfiguration ?? {},
          field,
          sort,
        ),
      });
      void saveCanvasViewConfig(canvasId);
    },
    [canvasId, field, setColumnSortAtTopPriority, updateCanvasViewConfig, saveCanvasViewConfig],
  );
}