@duongtrungnguyen/next-helper
Version:
Helper library for Next.js 15
122 lines • 4.51 kB
JavaScript
;
"use client";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var use_listing_exports = {};
__export(use_listing_exports, {
useListing: () => useListing
});
module.exports = __toCommonJS(use_listing_exports);
var import_react = require("react");
var import_use_debounce = require("use-debounce");
const useListing = (dataSource = []) => {
const [displayItems, setDisplayItems] = (0, import_react.useState)([]);
(0, import_react.useEffect)(() => {
if (dataSource) {
setDisplayItems(dataSource);
}
}, [dataSource]);
const onSearchChange = (0, import_react.useCallback)(
(0, import_use_debounce.useDebouncedCallback)((query) => {
if (query) {
setDisplayItems(searchFilterByStringQuery(query, dataSource));
} else {
setDisplayItems(dataSource);
}
}, 300),
[dataSource]
);
const onFieldFilterChange = (0, import_react.useCallback)(
(fieldName, query) => {
if (query === "-") {
setDisplayItems(dataSource);
} else {
setDisplayItems(searchFilterByField(query, fieldName, dataSource));
}
},
[dataSource]
);
const swapItems = (0, import_react.useCallback)((selfId, targetId, compareByField) => {
setDisplayItems((prevItems) => {
const newItems = [...prevItems];
const index1 = newItems.findIndex((item) => compareByField(item) === selfId);
const index2 = newItems.findIndex((item) => compareByField(item) === targetId);
if (index1 >= 0 && index2 >= 0) {
[newItems[index1], newItems[index2]] = [newItems[index2], newItems[index1]];
}
return newItems;
});
}, []);
const insertAfter = (0, import_react.useCallback)((selfId, targetId, compareByField) => {
setDisplayItems((prevItems) => {
const newItems = [...prevItems];
const indexSelf = newItems.findIndex((item) => compareByField(item) === selfId);
const indexTarget = newItems.findIndex((item) => compareByField(item) === targetId);
if (indexSelf >= 0 && indexTarget >= 0 && indexSelf !== indexTarget) {
const [itemToMove] = newItems.splice(indexSelf, 1);
newItems.splice(indexTarget + 1, 0, itemToMove);
}
return newItems;
});
}, []);
const groupSort = (0, import_react.useCallback)((groupByField, groupOrder) => {
setDisplayItems((prevItems) => {
const newItems = [...prevItems].sort((a, b) => {
const groupA = groupByField(a);
const groupB = groupByField(b);
const indexA = groupOrder.indexOf(groupA);
const indexB = groupOrder.indexOf(groupB);
const adjustedIndexA = indexA === -1 ? groupOrder.length : indexA;
const adjustedIndexB = indexB === -1 ? groupOrder.length : indexB;
return adjustedIndexA - adjustedIndexB;
});
return newItems;
});
}, []);
const searchFilterByStringQuery = (query, dataSource2) => {
return (prevState) => {
return (dataSource2 || prevState).filter((item) => {
return Object.values(item).some(
(fieldValue) => fieldValue == null ? void 0 : fieldValue.toString().toLowerCase().includes(query.toLowerCase())
);
});
};
};
const searchFilterByField = (query, field, dataSource2) => {
return (prevState) => {
return (dataSource2 || prevState).filter((item) => {
var _a;
return (_a = item[field]) == null ? void 0 : _a.toString().toLowerCase().includes(query.toLowerCase());
});
};
};
return {
displayItems,
setDisplayItems,
onSearchChange,
onFieldFilterChange,
swapItems,
insertAfter,
groupSort
};
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
useListing
});
//# sourceMappingURL=use-listing.js.map