{{ /* Keep in sync with apiClientFn */ }}
{{ const funcName = "use" + upperCaseFirst(item.uniqueName); }}
{{ const responseType = item.response ? `T.${getTypeNameForType(item.response.reference, typeSuffix.apiResponse, { isJSON: true, fileTypeIO: "outputClient" })}` : any; }}

{{ if (item.method === "GET") { }}

((newline))
/**
 * {{= funcName }}
  {{ if (item.tags.length > 0 ) { }}* Tags: {{= item.tags.join(", ") }}{{ } }}
 * Docs: {{= item.docString.replace(/\n/g, "\n  * ") }}
 */
export function {{= funcName }}(
{{ if (item.params) { }}
params: T.{{= getTypeNameForType(item.params.reference, typeSuffix.apiInput, { useDefaults: false }) }},
{{ } }}
{{ if (item.query) { }}
query: T.{{= getTypeNameForType(item.query.reference, typeSuffix.apiInput, { useDefaults: false }) }},
{{ } }}
options: QueryConfig<{{= responseType }}, AppErrorResponse> = {},
): QueryResult<{{= responseType }}, AppErrorResponse> {
  const { {{= item.group }} } = useApi();

  options.enabled = (
    options.enabled === true || (options.enabled !== false
    {{ if (item.query) { }}
      {{ for (const key of Object.keys(item.query?.keys ?? {})) { }}
        {{ if (!item.query.keys[key].isOptional) { }}
          && !!query.{{= key }}
        {{ } }}
      {{ } }}
    {{ } }}
    {{ if (item.params) { }}
      {{ for (const key of Object.keys(item.params?.keys ?? {})) { }}
        {{ if (!item.params.keys[key].isOptional) { }}
          && !!params.{{= key }}
        {{ } }}
      {{ } }}
    {{ } }}
  ));

  return useQuery([
     "{{= item.uniqueName }}",

    {{ if (item.params) { }}
    params,
    {{ } }}
    {{ if (item.query) { }}
    query,
    {{ } }}
    ],
    (
    _,
    {{ if (item.params) { }}
    params: T.{{= getTypeNameForType(item.params.reference, typeSuffix.apiInput, { useDefaults: false }) }},
    {{ } }}
    {{ if (item.query) { }}
    query: T.{{= getTypeNameForType(item.query.reference, typeSuffix.apiInput, { useDefaults: false }) }},
    {{ } }}
    ) => {
      const promise: CancellablePromise<{{= responseType }}> = {{= item.group }}.{{= item.name }}(
        {{= item.params ? "params, " : ""}}
        {{= item.query ? "query, " : "" }}
        { cancelToken: options?.cancelToken?.token },
      );

      if (options?.cancelToken) {
        promise.cancel = () => options?.cancelToken?.cancel();
      }

      return promise;
    },
    options,
  );
}

{{ } else { }}

interface {{= upperCaseFirst(funcName) }}Props {
   {{ if (item.params) { }}
   params: T.{{= getTypeNameForType(item.params.reference, typeSuffix.apiInput, { useDefaults: false }) }};
   {{ } }}
   {{ if (item.query) { }}
    query: T.{{= getTypeNameForType(item.query.reference, typeSuffix.apiInput, { useDefaults: false }) }};
   {{ } }}
   {{ if (item.body) { }}
   body: T.{{= getTypeNameForType(item.body.reference, typeSuffix.apiInput, { useDefaults: false }) }};
   {{ } }}
   {{ if (item.files) { }}
   files: T.{{= getTypeNameForType(item.files.reference, typeSuffix.apiInput, { useDefaults: false, fileTypeIO: "input" }) }};
   {{ } }}
}

((newline))

/**
 * {{= funcName }}
 {{ if (item.tags.length > 0 ) { }}* Tags: {{= item.tags.join(", ") }}{{ } }}
 * Docs: {{= item.docString }}
 */
export function {{= funcName }}(
  options: MutationConfig<{{= responseType }}, AppErrorResponse, {{= upperCaseFirst(funcName) }}Props> = {},
): MutationResultPair<{{= responseType }}, AppErrorResponse, {{= upperCaseFirst(funcName) }}Props, unknown> {
  const { {{= item.group }} } = useApi();

  return useMutation(
    (variables) => {{= item.group }}.{{= item.name }}(
      {{= item.params ? "variables.params, " : ""}}
      {{= item.query ? "variables.query, " : "" }}
      {{= item.body ? "variables.body, " : "" }}
      {{= item.files ? "variables.files, " : "" }}
    ),
    options,
  );
}

{{ } }}

((newline))
