UNPKG

@allurereport/web-awesome

Version:

The static files for Allure Awesome Report

75 lines (56 loc) 2.08 kB
import { getParamValue, hasParam, setParams } from "@allurereport/web-commons"; import { computed, effect, signal } from "@preact/signals"; export type SortByDirection = "asc" | "desc"; export type SortByField = "order" | "duration" | "status" | "name"; export type SortBy = `${SortByField},${SortByDirection}`; const DEFAULT_SORT_BY: SortBy = "order,asc"; export const DIRECTIONS: SortByDirection[] = ["asc", "desc"]; export const SORT_BY_STORAGE_KEY = "ALLURE_REPORT_SORT_BY"; export const SORT_BY_FIELDS: SortByField[] = ["order", "duration", "status", "name"]; const SORT_BY_PARAM = "sortBy"; const hasSortByParam = computed(() => hasParam(SORT_BY_PARAM)); const validateSortBy = (sortByValue: string): sortByValue is SortBy => { const parts = sortByValue.split(","); if (parts.length !== 2) { return false; } const [field, direction] = parts; return SORT_BY_FIELDS.includes(field as SortByField) && DIRECTIONS.includes(direction as SortByDirection); }; const getInitialSortBy = (): SortBy => { if (typeof window === "undefined") { return DEFAULT_SORT_BY; } const stored = localStorage.getItem(SORT_BY_STORAGE_KEY); if (stored && validateSortBy(stored.toLowerCase())) { return stored.toLowerCase() as SortBy; } return DEFAULT_SORT_BY; }; const sortBySignal = signal<SortBy>(getInitialSortBy()); export const setSortBy = (sortByValue: SortBy) => { if (hasSortByParam.peek()) { setParams({ key: SORT_BY_PARAM, value: undefined, }); } sortBySignal.value = sortByValue; }; export const sortBy = computed<SortBy>(() => { const urlSortBy = getParamValue(SORT_BY_PARAM) ?? undefined; // SortBy from URL is taking precedence over the storage value if (urlSortBy && validateSortBy(urlSortBy.toLowerCase())) { return urlSortBy.toLowerCase() as SortBy; } if (typeof window === "undefined") { return DEFAULT_SORT_BY; } return sortBySignal.value; }); effect(() => { if (typeof window === "undefined") { return; } localStorage.setItem(SORT_BY_STORAGE_KEY, sortBy.value); });