import React from "react"; import { RadioGroupProps } from "antd/lib/radio"; import { QueryObserverResult, UseQueryOptions } from "react-query"; import { useList } from "@hooks"; import { CrudSorting, BaseRecord, Option, GetListResponse, CrudFilters, SuccessErrorNotification, HttpError, MetaDataQuery, LiveModeProps, } from "../../../interfaces"; export type useRadioGroupProps = RadioGroupProps & { resource: string; optionLabel?: string; optionValue?: string; sort?: CrudSorting; filters?: CrudFilters; queryOptions?: UseQueryOptions, TError>; metaData?: MetaDataQuery; } & SuccessErrorNotification & LiveModeProps; export type UseRadioGroupReturnType = { radioGroupProps: RadioGroupProps; queryResult: QueryObserverResult>; }; /** * `useRadioGroup` hook allows you to manage an Ant Design {@link https://ant.design/components/radio/#components-radio-demo-radiogroup-with-name Radio.Group} component when records in a resource needs to be used as radio options. * * @see {@link https://refine.dev/docs/api-references/hooks/field/useRadioGroup} for more details. * * @typeParam TData - Result data of the query extends {@link https://refine.dev/docs/api-references/interfaceReferences#baserecord `BaseRecord`} * */ export const useRadioGroup = < TData extends BaseRecord = BaseRecord, TError extends HttpError = HttpError, >({ resource, sort, filters, optionLabel = "title", optionValue = "id", successNotification, errorNotification, queryOptions, liveMode, onLiveEvent, liveParams, metaData, }: useRadioGroupProps): UseRadioGroupReturnType => { const [options, setOptions] = React.useState([]); const defaultQueryOnSuccess = (data: GetListResponse) => { setOptions(() => data.data.map((item) => ({ label: item[optionLabel], value: item[optionValue], })), ); }; const queryResult = useList({ resource, config: { sort, filters, }, queryOptions: { ...queryOptions, onSuccess: (data) => { defaultQueryOnSuccess(data); queryOptions?.onSuccess?.(data); }, }, successNotification, errorNotification, liveMode, onLiveEvent, liveParams, metaData, }); return { radioGroupProps: { options, }, queryResult, }; };