@rsc-labs/medusa-documents
Version:
Generate documents from Medusa
147 lines (146 loc) • 4.31 kB
JavaScript
;
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;
};