UNPKG

@rsc-labs/medusa-documents

Version:
147 lines (146 loc) 4.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useOrderFilters = void 0; const react_1 = require("react"); const time_1 = require("./utils/time"); const formatDateFilter = (filter) => { if (filter === null) { return filter; } const dateFormatted = Object.entries(filter).reduce((acc, [key, value]) => { if (value.includes("|")) { acc[key] = (0, time_1.relativeDateFormatToTimestamp)(value); } else { acc[key] = value; } return acc; }, {}); return dateFormatted; }; const reducer = (state, action) => { var _a; switch (action.type) { case "setFilters": { return { ...state, region: action.payload.region, salesChannel: action.payload.salesChannel, fulfillment: action.payload.fulfillment, payment: action.payload.payment, status: action.payload.status, date: action.payload.date, query: (_a = action === null || action === void 0 ? void 0 : action.payload) === null || _a === void 0 ? void 0 : _a.query, }; } case "setQuery": { return { ...state, offset: 0, query: action.payload, }; } case "setDate": { const newDateFilters = state.date; return { ...state, date: newDateFilters, }; } case "setOffset": { return { ...state, offset: action.payload, }; } case "reset": { return action.payload; } default: { return state; } } }; const useOrderFilters = (defaultFilters = null) => { const initial = (0, react_1.useMemo)(() => parseQueryString(defaultFilters), [defaultFilters]); const [state, dispatch] = (0, react_1.useReducer)(reducer, initial); const paginate = (direction) => { if (direction > 0) { const nextOffset = state.offset + state.limit; dispatch({ type: "setOffset", payload: nextOffset }); } else { const nextOffset = Math.max(state.offset - state.limit, 0); dispatch({ type: "setOffset", payload: nextOffset }); } }; const getQueryObject = () => { const toQuery = { ...state.additionalFilters }; for (const [key, value] of Object.entries(state)) { const newValue = value; if (key === "query") { if (value && typeof value === "string") { toQuery["q"] = value; } } else if (key === "offset" || key === "limit") { toQuery[key] = value; } else if (newValue.open) { if (key === "date") { toQuery[stateFilterMap[key]] = formatDateFilter(newValue.filter); } else { toQuery[stateFilterMap[key]] = newValue.filter; } } } return toQuery; }; const queryObject = (0, react_1.useMemo)(() => getQueryObject(), [state]); return { queryObject, paginate, }; }; exports.useOrderFilters = useOrderFilters; const stateFilterMap = { region: "region_id", salesChannel: "sales_channel_id", status: "status", fulfillment: "fulfillment_status", payment: "payment_status", date: "created_at", }; const parseQueryString = (additionals = null) => { const defaultVal = { status: { open: false, filter: null, }, fulfillment: { open: false, filter: null, }, region: { open: false, filter: null, }, salesChannel: { open: false, filter: null, }, payment: { open: false, filter: null, }, date: { open: false, filter: null, }, offset: 0, limit: 15, additionalFilters: additionals, }; return defaultVal; };