react-antd-admin-panel
Version:
Modern TypeScript-first React admin panel builder with Ant Design 6
423 lines (422 loc) • 12.4 kB
JavaScript
import { useState, useRef, useCallback, useEffect, useMemo } from "react";
import { G as Get, P as Post } from "./Post-DGMrLEoA.js";
import { useForm as useForm$1 } from "react-hook-form";
function useGet(options) {
const {
url,
params,
immediate = true,
enabled = true
} = options;
const [data, setData] = useState(void 0);
const [loading, setLoading] = useState(immediate && enabled);
const [error, setError] = useState(void 0);
const getInstanceRef = useRef(null);
const mountedRef = useRef(true);
const optionsRef = useRef(options);
optionsRef.current = options;
const execute = useCallback(async (overrideParams) => {
var _a, _b;
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
}
const currentOptions = optionsRef.current;
const get = new Get().target(currentOptions.url).params({ ...currentOptions.params, ...overrideParams });
if (currentOptions.headers) {
get.headers(currentOptions.headers);
}
getInstanceRef.current = get;
if (mountedRef.current) {
setLoading(true);
setError(void 0);
}
try {
const result = await get.execute();
if (mountedRef.current) {
setData(result);
setLoading(false);
(_a = currentOptions.onSuccess) == null ? void 0 : _a.call(currentOptions, result);
}
return result;
} catch (err) {
const error2 = err instanceof Error ? err : new Error(String(err));
if (error2.name === "CanceledError" || error2.name === "AbortError") {
return void 0;
}
if (mountedRef.current) {
setError(error2);
setLoading(false);
(_b = currentOptions.onError) == null ? void 0 : _b.call(currentOptions, error2);
}
return void 0;
}
}, []);
const abort = useCallback(() => {
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
getInstanceRef.current = null;
}
if (mountedRef.current) {
setLoading(false);
}
}, []);
const reset = useCallback(() => {
abort();
if (mountedRef.current) {
setData(void 0);
setError(void 0);
setLoading(false);
}
}, [abort]);
useEffect(() => {
if (immediate && enabled) {
execute();
}
}, [url, immediate, enabled, execute]);
useEffect(() => {
}, [params]);
useEffect(() => {
mountedRef.current = true;
return () => {
mountedRef.current = false;
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
}
};
}, []);
return {
data,
loading,
error,
execute,
abort,
reset
};
}
function usePost(options) {
const [submitting, setSubmitting] = useState(false);
const [error, setError] = useState(void 0);
const [data, setData] = useState(void 0);
const postInstanceRef = useRef(null);
const mountedRef = useRef(true);
const optionsRef = useRef(options);
optionsRef.current = options;
const execute = useCallback(async (body) => {
var _a, _b;
if (postInstanceRef.current) {
postInstanceRef.current.cancel();
}
const currentOptions = optionsRef.current;
const post = new Post().target(currentOptions.url).method(currentOptions.method || "POST");
if (body !== void 0) {
post.body(body);
}
if (currentOptions.headers) {
post.headers(currentOptions.headers);
}
postInstanceRef.current = post;
if (mountedRef.current) {
setSubmitting(true);
setError(void 0);
}
try {
const result = await post.execute();
if (mountedRef.current) {
setData(result);
setSubmitting(false);
(_a = currentOptions.onSuccess) == null ? void 0 : _a.call(currentOptions, result);
}
return result;
} catch (err) {
const error2 = err instanceof Error ? err : new Error(String(err));
if (error2.name === "CanceledError" || error2.name === "AbortError") {
return void 0;
}
if (mountedRef.current) {
setError(error2);
setSubmitting(false);
(_b = currentOptions.onError) == null ? void 0 : _b.call(currentOptions, error2);
}
return void 0;
}
}, []);
const abort = useCallback(() => {
if (postInstanceRef.current) {
postInstanceRef.current.cancel();
postInstanceRef.current = null;
}
if (mountedRef.current) {
setSubmitting(false);
}
}, []);
const reset = useCallback(() => {
abort();
if (mountedRef.current) {
setData(void 0);
setError(void 0);
setSubmitting(false);
}
}, [abort]);
if (mountedRef.current === false) {
mountedRef.current = true;
}
return {
execute,
submitting,
error,
data,
reset,
abort
};
}
function useList(options) {
const {
pagination: paginationConfig,
initialFilters = {},
rowKey = "id",
enabled = true
} = options;
const [data, setData] = useState([]);
const [loading, setLoading] = useState(enabled);
const [error, setError] = useState(void 0);
const [pagination, setPaginationState] = useState(() => ({
current: 1,
pageSize: 10,
total: 0,
...paginationConfig !== false ? paginationConfig : {}
}));
const [filters, setFiltersState] = useState(initialFilters);
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const getInstanceRef = useRef(null);
const mountedRef = useRef(true);
const optionsRef = useRef(options);
optionsRef.current = options;
const getRowKey = useCallback((record) => {
if (typeof rowKey === "function") {
return rowKey(record);
}
return record[rowKey];
}, [rowKey]);
const selectedRows = useMemo(() => {
if (selectedRowKeys.length === 0) return [];
return data.filter((item) => selectedRowKeys.includes(getRowKey(item)));
}, [data, selectedRowKeys, getRowKey]);
const fetchData = useCallback(async () => {
var _a, _b;
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
}
const currentOptions = optionsRef.current;
const currentGet = typeof currentOptions.get === "string" ? { url: currentOptions.get } : currentOptions.get;
const params = {
...currentGet.params,
...filters
};
if (paginationConfig !== false) {
params.page = pagination.current;
params.pageSize = pagination.pageSize;
}
const get = new Get().target(currentGet.url).params(params);
if (currentGet.headers) {
get.headers(currentGet.headers);
}
getInstanceRef.current = get;
if (mountedRef.current) {
setLoading(true);
setError(void 0);
}
try {
const response = await get.execute();
if (mountedRef.current) {
let resultData;
let total;
if (currentOptions.transform) {
const transformed = currentOptions.transform(response);
resultData = transformed.data;
total = transformed.total;
} else if (Array.isArray(response)) {
resultData = response;
total = response.length;
} else if (response && typeof response === "object") {
resultData = response.data || response.items || response.records || [];
total = response.total ?? response.totalCount ?? response.count ?? resultData.length;
} else {
resultData = [];
total = 0;
}
setData(resultData);
if (paginationConfig !== false && total !== void 0) {
setPaginationState((prev) => ({ ...prev, total }));
}
setLoading(false);
(_a = currentOptions.onSuccess) == null ? void 0 : _a.call(currentOptions, resultData);
}
} catch (err) {
const error2 = err instanceof Error ? err : new Error(String(err));
if (error2.name === "CanceledError" || error2.name === "AbortError") {
return;
}
if (mountedRef.current) {
setError(error2);
setLoading(false);
(_b = currentOptions.onError) == null ? void 0 : _b.call(currentOptions, error2);
}
}
}, [filters, pagination.current, pagination.pageSize, paginationConfig]);
const refresh = useCallback(async () => {
await fetchData();
}, [fetchData]);
const setPagination = useCallback((newPagination) => {
setPaginationState((prev) => ({ ...prev, ...newPagination }));
}, []);
const setFilters = useCallback((newFilters) => {
setFiltersState(newFilters);
setPaginationState((prev) => ({ ...prev, current: 1 }));
}, []);
const clearSelection = useCallback(() => {
setSelectedRowKeys([]);
}, []);
const reset = useCallback(() => {
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
}
setData([]);
setError(void 0);
setLoading(false);
setPaginationState({
current: 1,
pageSize: paginationConfig !== false ? (paginationConfig == null ? void 0 : paginationConfig.pageSize) ?? 10 : 10,
total: 0
});
setFiltersState(initialFilters);
setSelectedRowKeys([]);
}, [initialFilters, paginationConfig]);
useEffect(() => {
if (enabled) {
fetchData();
}
}, [enabled, fetchData]);
useEffect(() => {
mountedRef.current = true;
return () => {
mountedRef.current = false;
if (getInstanceRef.current) {
getInstanceRef.current.cancel();
}
};
}, []);
return {
data,
loading,
error,
refresh,
pagination,
setPagination,
filters,
setFilters,
selectedRowKeys,
setSelectedRowKeys,
selectedRows,
clearSelection,
reset
};
}
function useForm(options) {
const {
initialValues,
mode = "onSubmit"
} = options;
const [submitting, setSubmitting] = useState(false);
const optionsRef = useRef(options);
optionsRef.current = options;
const form = useForm$1({
defaultValues: initialValues,
mode
});
const {
register,
reset: rhfReset,
formState: { errors, isDirty, isValid },
setValue: rhfSetValue,
getValues,
getFieldState,
trigger,
clearErrors,
setError: rhfSetError,
watch
} = form;
const setValue = useCallback((name, value) => {
rhfSetValue(name, value, { shouldValidate: true, shouldDirty: true });
}, [rhfSetValue]);
const setValues = useCallback((values2) => {
Object.entries(values2).forEach(([key, value]) => {
rhfSetValue(key, value, { shouldValidate: true, shouldDirty: true });
});
}, [rhfSetValue]);
const submit = useCallback(async () => {
var _a, _b, _c;
const currentOptions = optionsRef.current;
const isFormValid = await trigger();
if (!isFormValid) {
return;
}
const values2 = getValues();
if (currentOptions.validate) {
const validationErrors = await currentOptions.validate(values2);
if (Object.keys(validationErrors).length > 0) {
Object.entries(validationErrors).forEach(([field, message]) => {
rhfSetError(field, { type: "validate", message });
});
return;
}
}
setSubmitting(true);
try {
if (currentOptions.post) {
const postInstance = new Post().target(currentOptions.post.url).method(currentOptions.post.method || "POST").body(values2);
if (currentOptions.post.headers) {
postInstance.headers(currentOptions.post.headers);
}
const response = await postInstance.execute();
(_b = (_a = currentOptions.post).onSuccess) == null ? void 0 : _b.call(_a, response);
} else if (currentOptions.onSubmit) {
await currentOptions.onSubmit(values2);
}
} catch (error) {
if ((_c = currentOptions.post) == null ? void 0 : _c.onError) {
currentOptions.post.onError(error instanceof Error ? error : new Error(String(error)));
}
throw error;
} finally {
setSubmitting(false);
}
}, [trigger, getValues, rhfSetError]);
const reset = useCallback((values2) => {
rhfReset(values2 ?? initialValues);
}, [rhfReset, initialValues]);
const values = watch();
return {
values,
errors,
setValue,
setValues,
submit,
submitting,
reset,
isDirty,
isValid,
register,
getFieldState,
trigger,
clearErrors,
setError: rhfSetError,
watch
};
}
export {
usePost as a,
useList as b,
useForm as c,
useGet as u
};
//# sourceMappingURL=useForm-nHibry26.js.map