diff --git a/src/context/sort-provider.tsx b/src/context/sort-provider.tsx index bff228b..1e6aa2e 100644 --- a/src/context/sort-provider.tsx +++ b/src/context/sort-provider.tsx @@ -1,10 +1,64 @@ -import { type ReactNode, useState } from "react"; +import { type ReactNode, useEffect, useState } from "react"; -import { SortContext, type SortOrder, type SortType } from "./sort-context"; +import { + SORT_ORDERS, + SORT_TYPES, + SortContext, + type SortOrder, + type SortType, +} from "./sort-context"; + +const getForcedSortType = (): SortType | undefined => { + const forcedSortType = window.ForceSortType; + if (forcedSortType && SORT_TYPES.includes(forcedSortType as SortType)) { + return forcedSortType as SortType; + } + return undefined; +}; + +const getForcedSortOrder = (): SortOrder | undefined => { + const forcedSortOrder = window.ForceSortOrder; + if (forcedSortOrder && SORT_ORDERS.includes(forcedSortOrder as SortOrder)) { + return forcedSortOrder as SortOrder; + } + return undefined; +}; export function SortProvider({ children }: { children: ReactNode }) { - const [sortType, setSortType] = useState("default"); - const [sortOrder, setSortOrder] = useState("desc"); + const [sortType, setSortType] = useState( + () => getForcedSortType() || "default", + ); + const [sortOrder, setSortOrder] = useState( + () => getForcedSortOrder() || "desc", + ); + + useEffect(() => { + const applyForcedSort = () => { + const forcedSortType = getForcedSortType(); + const forcedSortOrder = getForcedSortOrder(); + if (forcedSortType) { + setSortType(forcedSortType); + } + if (forcedSortOrder) { + setSortOrder(forcedSortOrder); + } + }; + + applyForcedSort(); + + let retryCount = 0; + const intervalId = window.setInterval(() => { + retryCount += 1; + if (window.ForceSortType || window.ForceSortOrder || retryCount >= 50) { + applyForcedSort(); + window.clearInterval(intervalId); + } + }, 100); + + return () => { + window.clearInterval(intervalId); + }; + }, []); return (