import { type Ref, type ComputedRef, computed, ref, } from 'vue' import { type ComputedColumnInterface } from '../DefaultTableInterfaces' export default function useSort(defaultSort: string, cacheKey?: string) { const sortField: Ref = ref(defaultSort) const sortOrder: Ref = ref(undefined) const computedSortField: ComputedRef = computed(() => `${sortOrder.value === false ? '-' : ''}${sortField.value}`) const sortCacheKey = `${cacheKey}-sort` const cachedData: { field: string, order: boolean } = cacheKey && localStorage.getItem(sortCacheKey) ? JSON.parse(localStorage.getItem(sortCacheKey) as string) : undefined if (cachedData) { sortField.value = cachedData.field sortOrder.value = cachedData.order } const setSort = (column: ComputedColumnInterface) => { if (!column.sort) return if (sortField.value !== column.sort) { sortField.value = column.sort sortOrder.value = undefined } if (typeof sortOrder.value === 'undefined') { sortOrder.value = true } else if (sortOrder.value === true) { sortOrder.value = false } else if (sortOrder.value === false) { sortOrder.value = undefined sortField.value = defaultSort } if (cacheKey) { localStorage.setItem(sortCacheKey, JSON.stringify({ field: sortField.value, order: sortOrder.value })) } } return { sortField, sortOrder, computedSortField, setSort, } }