0.4.1 • Published 8 months ago

react-native-queries v0.4.1

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

react-native-queries

npm npm GitHub GitHub Workflow Status (with event)

Simple and efficient library that empowers you to effortlessly handle HTTP requests in your React/React Native applications. It leverages the power of the widely-used react-query and axios libraries, providing a robust set of hooks that streamline the process of fetching and managing data in your application.

Installation

NPM

npm install react-native-queries

Yarn

yarn add react-native-queries

Table of Contents

Quick Start

import React, { useEffect } from 'react';
import {
  QueriesProvider,
  useQueryClient,
  useQueryConfig,
  useGet,
  useInfiniteGet,
  usePost,
  usePut,
  usePatch,
  useDelete,
  parseConfigURL,
} from 'react-native-queries';

/**
 * Fake Post
 */
const useFakePost = (id, options) => {
  const [fakePostConfig] = useQueryConfig('jsonplaceholder', 'fakePost');
  return useGet(
    {
      key: ['FAKE_POST', id],
      ...parseConfigURL(fakePostConfig, { id }),
    },
    options
  );
};

/**
 * Fake Posts
 */
const useFakePosts = (options) => {
  const [fakePostsConfig] = useQueryConfig('jsonplaceholder', 'fakePosts');
  return useGet(
    {
      key: ['FAKE_POSTS'],
      ...fakePostsConfig,
    },
    options
  );
};

/**
 * Filtered Fake Posts
 */
const useFilteredFakePosts = (userId, options) => {
  const [filteredFakePostsConfig] = useQueryConfig(
    'jsonplaceholder',
    'filteredFakePosts'
  );
  return useGet(
    {
      key: ['FILTERED_FAKE_POSTS', userId],
      ...parseConfigURL(filteredFakePostsConfig, { userId }),
    },
    options
  );
};

/**
 * Fake Posts Pages
 */
const useFakePostsPages = (options) => {
  const [fakePostsPagesConfig] = useQueryConfig(
    'jsonplaceholder',
    'fakePostsPages'
  );
  return useInfiniteGet(
    {
      key: ['FAKE_POSTS_PAGES'],
      pageParam: 1,
      pageSize: 10,
      ...fakePostsPagesConfig,
    },
    options
  );
};

/**
 * Create Fake Post
 */
const useCreateFakePost = (options) => {
  const [createFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'createFakePost'
  );
  return usePost(createFakePostConfig, options);
};

/**
 * Update Fake Post
 */
const useUpdateFakePost = (id, options) => {
  const [updateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'updateFakePost'
  );
  return usePut(parseConfigURL(updateFakePostConfig, { id }), options);
};

/**
 * Patch Fake Post
 */
const usePatchFakePost = (id, options) => {
  const [patchFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'patchFakePost'
  );
  return usePatch(parseConfigURL(patchFakePostConfig, { id }), options);
};

/**
 * Delete Fake Post
 */
const useDeleteFakePost = (options) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete(deleteFakePostConfig, options);
};

const Content = () => {
  const queryClient = useQueryClient();

  useFakePost(1, {
    onSuccess: (data) => {
      console.log('fakePostData: ', data);
    },
  });

  useFakePosts({
    onSuccess: (data) => {
      console.log('fakePostsData: ', data);
    },
  });

  const filteredFakePosts = useFilteredFakePosts(1);

  const fakePostsPages = useFakePostsPages({
    onSuccess: (data) => {
      console.log('fakePostsPagesData: ', data);
    },
  });

  useEffect(() => {
    console.log('filteredFakePostsData: ', filteredFakePosts.data);
  }, [filteredFakePosts.data]);

  const createFakePost = useCreateFakePost({
    onSuccess: (data) => {
      console.log('createFakePostData: ', data);
      //refresh FilteredFakePosts and FakePosts queries
      queryClient.invalidateQueries({
        queryKey: ['FILTERED_FAKE_POSTS', 'FAKE_POSTS'],
      });
    },
  });

  const updateFakePost = useUpdateFakePost(1, {
    onSuccess: (data) => {
      console.log('updateFakePostData: ', data);
      //refresh FakePost query
      queryClient.invalidateQueries({ queryKey: ['FAKE_POST'] });
    },
  });

  const patchFakePost = usePatchFakePost(1, {
    onSuccess: (data) => {
      console.log('patchFakePostData: ', data);
    },
  });

  const deleteFakePost = useDeleteFakePost({
    onSuccess: (data) => {
      console.log('deleteFakePostData: ', data);
    },
  });

  useEffect(() => {
    createFakePost.mutate({
      title: 'foo',
      body: 'bar',
      userId: 1,
    });

    updateFakePost.mutate({
      id: 1,
      title: 'foo',
      body: 'bar',
      userId: 1,
    });

    patchFakePost.mutate({ title: 'foo' });

    deleteFakePost.mutate({ id: 1 });
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  useEffect(() => {
    fakePostsPages.isFetchedAfterMount && fakePostsPages.fetchNextPage();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [fakePostsPages.isFetchedAfterMount, fakePostsPages.fetchNextPage]);

  return null;
};

export default function App() {
  return (
    <QueriesProvider
      config={{
        jsonplaceholder: {
          baseURL: 'https://jsonplaceholder.typicode.com',
          fakePosts: 'posts',
          fakePost: 'posts/{{id}}',
          filteredFakePosts: 'posts?userId={{userId}}',
          fakePostsPages: 'posts?_page={{pageParam}}&_limit={{pageSize}}', //pageParam(page number here) and pageSize are mandatory, must be added with same name to be able to update query to next page.
          createFakePost: 'posts',
          updateFakePost: 'posts/{{id}}',
          patchFakePost: 'posts/{{id}}',
          deleteFakePost: 'posts/{{id}}',
        },
      }}
    >
      <Content />
    </QueriesProvider>
  );
}
import React, { useEffect } from 'react';
import {
  QueriesProvider,
  useQueryClient,
  useQueryConfig,
  useGet,
  useInfiniteGet,
  usePost,
  usePut,
  usePatch,
  useDelete,
  parseConfigURL,
} from 'react-native-queries';
import type {
  UseGetOptions,
  UseInfiniteGetOptions,
  UsePostOptions,
  UsePutOptions,
  UsePatchOptions,
  UseDeleteOptions,
} from 'react-native-queries';

/**
 * Fake Post
 */
interface FakePostData {
  body: string;
  id: number;
  title: string;
  userId: number;
}
interface FakePostError {}

const useFakePost = (
  id: number,
  options?: UseGetOptions<FakePostData, FakePostError>
) => {
  const [fakePostConfig] = useQueryConfig('jsonplaceholder', 'fakePost');
  return useGet<FakePostData, FakePostError>(
    {
      key: ['FAKE_POST', id],
      ...parseConfigURL(fakePostConfig, { id }),
    },
    options
  );
};

/**
 * Fake Posts
 */
type FakePostsData = FakePostData[];
interface FakePostsError {}

const useFakePosts = (
  options?: UseGetOptions<FakePostsData, FakePostsError>
) => {
  const [fakePostsConfig] = useQueryConfig('jsonplaceholder', 'fakePosts');
  return useGet<FakePostsData, FakePostsError>(
    {
      key: ['FAKE_POSTS'],
      ...fakePostsConfig,
    },
    options
  );
};

/**
 * Filtered Fake Posts
 */
type FilteredFakePostsData = FakePostData[];
interface FilteredFakePostsError {}

const useFilteredFakePosts = (
  userId: number,
  options?: UseGetOptions<FilteredFakePostsData, FilteredFakePostsError>
) => {
  const [filteredFakePostsConfig] = useQueryConfig(
    'jsonplaceholder',
    'filteredFakePosts'
  );
  return useGet<FilteredFakePostsData, FilteredFakePostsError>(
    {
      key: ['FILTERED_FAKE_POSTS', userId],
      ...parseConfigURL(filteredFakePostsConfig, { userId }),
    },
    options
  );
};

/**
 * Fake Posts Pages
 */
type FakePostsPagesData = FakePostData[];
interface FakePostsPagesError {}

const useFakePostsPages = (
  options?: UseInfiniteGetOptions<FakePostsPagesData, FakePostsPagesError>
) => {
  const [fakePostsPagesConfig] = useQueryConfig(
    'jsonplaceholder',
    'fakePostsPages'
  );
  return useInfiniteGet<FakePostsPagesData, FakePostsPagesError>(
    {
      key: ['FAKE_POSTS_PAGES'],
      pageParam: 1,
      pageSize: 10,
      ...fakePostsPagesConfig,
    },
    options
  );
};

/**
 * Create Fake Post
 */
interface CreateFakePostData extends FakePostData {}
interface CreateFakePostError {}
interface CreateFakePostVariables {
  title: string;
  body: string;
  userId: number;
}

const useCreateFakePost = (
  options?: UsePostOptions<
    CreateFakePostData,
    CreateFakePostError,
    CreateFakePostVariables
  >
) => {
  const [createFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'createFakePost'
  );
  return usePost<
    CreateFakePostData,
    CreateFakePostError,
    CreateFakePostVariables
  >(createFakePostConfig, options);
};

/**
 * Update Fake Post
 */
interface UpdateFakePostData extends FakePostData {}
interface UpdateFakePostError {}
interface UpdateFakePostVariables {
  title: string;
  body: string;
  userId: number;
  id: number;
}

const useUpdateFakePost = (
  id: number,
  options?: UsePutOptions<
    UpdateFakePostData,
    UpdateFakePostError,
    UpdateFakePostVariables
  >
) => {
  const [updateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'updateFakePost'
  );
  return usePut<
    UpdateFakePostData,
    UpdateFakePostError,
    UpdateFakePostVariables
  >(parseConfigURL(updateFakePostConfig, { id }), options);
};

/**
 * Patch Fake Post
 */
interface PatchFakePostData extends FakePostData {}
interface PatchFakePostError {}
interface PatchFakePostVariables {
  title: string;
}

const usePatchFakePost = (
  id: number,
  options?: UsePatchOptions<
    PatchFakePostData,
    PatchFakePostError,
    PatchFakePostVariables
  >
) => {
  const [patchFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'patchFakePost'
  );
  return usePatch<
    PatchFakePostData,
    PatchFakePostError,
    PatchFakePostVariables
  >(parseConfigURL(patchFakePostConfig, { id }), options);
};

/**
 * Delete Fake Post
 */
interface DeleteFakePostData {}
interface DeleteFakePostError {}
interface DeleteFakePostVariables {
  id: number;
}

const useDeleteFakePost = (
  options?: UseDeleteOptions<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >
) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >(deleteFakePostConfig, options);
};

const Content = () => {
  const queryClient = useQueryClient();

  useFakePost(1, {
    onSuccess: (data) => {
      console.log('fakePostData: ', data);
    },
  });

  useFakePosts({
    onSuccess: (data) => {
      console.log('fakePostsData: ', data);
    },
  });

  const filteredFakePosts = useFilteredFakePosts(1);

  const fakePostsPages = useFakePostsPages({
    onSuccess: (data) => {
      console.log('fakePostsPagesData: ', data);
    },
  });

  useEffect(() => {
    console.log('filteredFakePostsData: ', filteredFakePosts.data);
  }, [filteredFakePosts.data]);

  const createFakePost = useCreateFakePost({
    onSuccess: (data) => {
      console.log('createFakePostData: ', data);
      //refresh FilteredFakePosts and FakePosts queries
      queryClient.invalidateQueries({
        queryKey: ['FILTERED_FAKE_POSTS', 'FAKE_POSTS'],
      });
    },
  });

  const updateFakePost = useUpdateFakePost(1, {
    onSuccess: (data) => {
      console.log('updateFakePostData: ', data);
      //refresh FakePost query
      queryClient.invalidateQueries({ queryKey: ['FAKE_POST'] });
    },
  });

  const patchFakePost = usePatchFakePost(1, {
    onSuccess: (data) => {
      console.log('patchFakePostData: ', data);
    },
  });

  const deleteFakePost = useDeleteFakePost({
    onSuccess: (data) => {
      console.log('deleteFakePostData: ', data);
    },
  });

  useEffect(() => {
    createFakePost.mutate({
      title: 'foo',
      body: 'bar',
      userId: 1,
    });

    updateFakePost.mutate({
      id: 1,
      title: 'foo',
      body: 'bar',
      userId: 1,
    });

    patchFakePost.mutate({ title: 'foo' });

    deleteFakePost.mutate({ id: 1 });
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  useEffect(() => {
    fakePostsPages.isFetchedAfterMount && fakePostsPages.fetchNextPage();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [fakePostsPages.isFetchedAfterMount, fakePostsPages.fetchNextPage]);

  return null;
};

export default function App() {
  return (
    <QueriesProvider
      config={{
        jsonplaceholder: {
          baseURL: 'https://jsonplaceholder.typicode.com',
          fakePosts: 'posts',
          fakePost: 'posts/{{id}}',
          filteredFakePosts: 'posts?userId={{userId}}',
          //pageParam(page number here) and pageSize are mandatory to set,to be able to update query to next page.
          fakePostsPages: 'posts?_page={{pageParam}}&_limit={{pageSize}}',
          createFakePost: 'posts',
          updateFakePost: 'posts/{{id}}',
          patchFakePost: 'posts/{{id}}',
          deleteFakePost: 'posts/{{id}}',
        },
      }}
    >
      <Content />
    </QueriesProvider>
  );
}

Explanations

config

Main configuration object that represents the structure of queries, start by adding QueriesProvider to your root app and pass config object with the following structure:

/**
 * Structure
 */
const configStructure = {
  ['baseURLKey']: {
    baseURL: 'baseURLValue',
    requestConfig: AxiosRequestConfig,
    ['URLKey']:
      'URLValue' |
      {
        url: 'URLValue',
        requestConfig: AxiosRequestConfig,
        requestConfigAction: 'MERGE' | 'OVERWRITE',
      },
  },
  // more servers...
};

/**
 * Example:
 */
const config = {
  jsonplaceholder: {
    baseURL: 'https://jsonplaceholder.typicode.com',
    //will be applied to all queries except where requestConfigAction is OVERWRITE
    requestConfig: {
      headers: {
        sharedHeader: '...',
      },
    },
    fakePosts: 'posts',
    fakePost: 'posts/{{id}}',
    filteredFakePosts: { url: 'posts?userId={{userId}}' },
    createFakePost: { url: 'posts' },
    updateFakePost: {
      url: 'posts/{{id}}',
      requestConfigAction: 'OVERWRITE',
      //will overwrite baseURL requestConfig
      requestConfig: {
        headers: {
          specificHeader1: '...',
        },
      },
    },
    patchFakePost: {
      url: 'posts/{{id}}',
      //will be merged with baseURL requestConfig, since requestConfigAction default is MERGE
      //ex: requestConfig: { headers: { specificHeader2: '...' , sharedHeader: '...'} }
      requestConfig: {
        headers: {
          specificHeader2: '...',
        },
      },
    },
    deleteFakePost: 'posts/{{id}}',
  },
  jsonplaceholder2: {
    //...
  },
};

const App = () => {
  return <QueriesProvider config={config}>...</QueriesProvider>;
};
interface Config {
  [baseURLKey: string]: {
    baseURL: string;
    requestConfig: AxiosRequestConfig;
    [URLKey: string]:
      | string
      | {
          url: string;
          requestConfig: AxiosRequestConfig;
          requestConfigAction?: 'MERGE' | 'OVERWRITE';
        };
  };
}

- baseURLKey: Name of the server.

- baseURLValue: Base server URL that will be prepended to every URLValue.

- requestConfig: AxiosRequestConfig to use with every query, except baseURL, url and method.

- URLKey: Name of URL(endpoint).

- URLValue: API URL(endpoint).

- requestConfigAction: The action to take with the base requestConfig, default is MERGE.


useQueryConfig

Hook to get and update query config.

const [queryConfig, setQueryConfig] = useQueryConfig('baseURLKey', 'URLKey');

const { baseURL, url, requestConfig } = queryConfig;

setQueryConfig({
  requestConfig: {
    //...
  },
});

/**
 * Example:
 */
import React, { useEffect } from 'react';
import { QueriesProvider, useQueryConfig } from 'react-native-queries';

const Content = () => {
  //Access shared queries config
  const [jsonplaceholderConfig, setJsonplaceholderConfig] =
    useQueryConfig('jsonplaceholder');

  //Access specific query config
  const [createFakePostConfig, setCreateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'createFakePost'
  );

  // Access multiple queries config
  const [multipleFakePostConfig, setMultipleFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    ['createFakePost', 'patchFakePost']
  );
  // const [createFakePostConfig, patchFakePostConfig] = multipleFakePostConfig;

  useEffect(() => {
    //Set requestConfig to all queries
    setJsonplaceholderConfig({
      requestConfig: {
        headers: {
          sharedHeader: '...',
        },
      },
    });

    /**
     * Set requestConfig to specific query and merge with baseURL requestConfig.
     * note: to set requestConfig to specific query, url value must be an object in config.
     * ex: createFakePost:{url: 'posts'}
     */
    setCreateFakePostConfig({
      requestConfig: {
        headers: {
          specificHeader1: '...',
        },
      },
    });

    //Form 1: Set requestConfig for multiple queries
    setMultipleFakePostConfig({
      requestConfig: {
        headers: {
          specificHeader2: '...',
        },
      },
    });

    /**
     * Form 2: Set requestConfig as individual .
     * note: make sure to follow same order of urls keys: ['createFakePost', 'patchFakePost']
     */
    setMultipleFakePostConfig([
      {
        requestConfig: {
          headers: {
            specificHeader3: '...',
          },
        },
      },
      {
        requestConfig: {
          headers: {
            specificHeader4: '...',
          },
        },
      },
    ]);
  }, [
    setCreateFakePostConfig,
    setJsonplaceholderConfig,
    setMultipleFakePostConfig,
  ]);

  return null;
};

const App = () => {
  return (
    <QueriesProvider config={config}>
      <Content />
    </QueriesProvider>
  );
};

useGet

A wrapper around useQuery hook.

import { useQueryConfig, useGet, parseConfigURL } from 'react-native-queries';

const getConfig = {
  key: '...', //mandatory
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const getOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const getReturns = useGet(getConfig, getOptions);

/**
 * Example:
 */
const useFakePost = (id, options) => {
  const [fakePostConfig] = useQueryConfig('jsonplaceholder', 'fakePost');
  return useGet(
    {
      key: ['FAKE_POST', id],
      ...parseConfigURL(fakePostConfig, { id }),
    },
    options
  );
};

const { data, error, ...rest } = useFakePost(1, {
  onSuccess: (data) => {
    console.log('fakePostData: ', data);
  },
});
import { useQueryConfig, useGet, parseConfigURL } from 'react-native-queries';
import type { UseGetConfig, UseGetOptions } from 'react-native-queries';

interface GetData {}
interface GetError {}

const getConfig: UseGetConfig = {
  key: '...', //mandatory
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const getOptions: UseGetOptions<GetData, GetError> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const getReturns = useGet<GetData, GetError>(getConfig, getOptions);

/**
 * Example:
 */
interface FakePostData {
  body: string;
  id: number;
  title: string;
  userId: number;
}
interface FakePostError {}

const useFakePost = (
  id: number,
  options?: UseGetOptions<FakePostData, FakePostError>
) => {
  const [fakePostConfig] = useQueryConfig('jsonplaceholder', 'fakePost');
  return useGet<FakePostData, FakePostError>(
    {
      key: ['FAKE_POST', id],
      ...parseConfigURL(fakePostConfig, { id }),
    },
    options
  );
};

const { data, error, ...rest } = useFakePost(1, {
  onSuccess: (data) => {
    console.log('fakePostData: ', data);
  },
});

- getOptions: useQuery options, expect queryKey(mapped to key in getConfig) and queryFn.

- getReturns: useQuery returns.


useInfiniteGet

A wrapper around useInfiniteQuery hook.

import { useQueryConfig, useInfiniteGet } from 'react-native-queries';

const infiniteGetConfig = {
  key: '...', // mandatory
  /**
   * pageSize and pageParam are mandatory, they will be mapped to their places in url
   * ex: 'posts?_page={{pageParam}}&_limit={{pageSize}}'
   */
  pageSize: '...',
  pageParam: '...',
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const infiniteGetOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  getNextPageParam: (lastPage, allPages) => {},
  getPreviousPageParam: (firstPage, allPages) => {},
  //...
};

const infiniteGetReturns = useInfiniteGet(
  infiniteGetConfig,
  infiniteGetOptions
);

fakePostsPages.fetchNextPage();
// OR manually specify pageParam
fakePostsPages.fetchNextPage({ pageParam: 2 });

// Note: passing getNextPageParam will override default implementation, which is based on increasing pageParam by 1 on every fetchNextPage call till finish all pages, in that case you need to provide your own implementation

/**
 * Example:
 */
const useFakePostsPages = (options) => {
  const [fakePostsPagesConfig] = useQueryConfig(
    'jsonplaceholder',
    'fakePostsPages'
  );
  return useInfiniteGet(
    {
      key: ['FAKE_POSTS_PAGES'],
      pageParam: 1,
      pageSize: 10,
      ...fakePostsPagesConfig,
    },
    options
  );
};

const { data, error, fetchNextPage, ...rest } = useFakePostsPages({
  onSuccess: (data) => {
    console.log('fakePostsPagesData: ', data);
  },
});

fetchNextPage();
import { useQueryConfig, useInfiniteGet } from 'react-native-queries';
import type {
  UseInfiniteGetConfig,
  UseInfiniteGetOptions,
} from 'react-native-queries';

interface InfiniteGetData {}
interface InfiniteGetError {}

const infiniteGetConfig: UseInfiniteGetConfig = {
  key: '...', // mandatory
  /**
   * pageSize and pageParam are mandatory, they will be mapped to their places in url
   * ex: 'posts?_page={{pageParam}}&_limit={{pageSize}}'
   */
  pageSize: '...',
  pageParam: '...',
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const infiniteGetOptions: UseInfiniteGetOptions<
  InfiniteGetData,
  InfiniteGetError
> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  getNextPageParam: (lastPage, allPages) => {},
  getPreviousPageParam: (firstPage, allPages) => {},
  //...
};

const infiniteGetReturns = useInfiniteGet<InfiniteGetData, InfiniteGetError>(
  infiniteGetConfig,
  infiniteGetOptions
);

fakePostsPages.fetchNextPage();
// OR manually specify pageParam
fakePostsPages.fetchNextPage({ pageParam: 2 });

// Note: passing getNextPageParam will override default implementation, which is based on increasing pageParam by 1 on every fetchNextPage call till finish all pages, in that case you need to provide your own implementation

/**
 * Example:
 */
const useFakePostsPages = (options) => {
  const [fakePostsPagesConfig] = useQueryConfig(
    'jsonplaceholder',
    'fakePostsPages'
  );
  return useInfiniteGet(
    {
      key: ['FAKE_POSTS_PAGES'],
      pageParam: 1,
      pageSize: 10,
      ...fakePostsPagesConfig,
    },
    options
  );
};

const { data, error, fetchNextPage, ...rest } = useFakePostsPages({
  onSuccess: (data) => {
    console.log('fakePostsPagesData: ', data);
  },
});

fetchNextPage();

- infiniteGetOptions: useInfiniteQuery options, expect queryKey(mapped to key in infiniteGetConfig) and queryFn.

- infiniteGetReturns: useInfiniteQuery returns.


usePost

A wrapper around useMutation hook.

import { useQueryConfig, usePost } from 'react-native-queries';

const postConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const postOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const postReturns = usePost(postConfig, postOptions);

/**
 * Example:
 */
const useCreateFakePost = (options) => {
  const [createPostConfig] = useQueryConfig(
    'jsonplaceholder',
    'createFakePost'
  );
  return usePost(createPostConfig, options);
};

const { data, error, mutate, ...rest } = useCreateFakePost({
  onSuccess: (data) => {
    console.log('createFakePostData: ', data);
  },
});

mutate({ title: 'foo', body: 'bar', userId: 1 });
import { useQueryConfig, usePost } from 'react-native-queries';
import type { UsePostConfig, UsePostOptions } from 'react-native-queries';

interface PostData {}
interface PostError {}
interface PostVariables {}

const postConfig: UsePostConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const postOptions: UsePostOptions<PostData, PostError, PostVariables> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const postReturns = usePost<PostData, PostError, PostVariables>(
  postConfig,
  postOptions
);

/**
 * Example:
 */
interface CreateFakePostData {
  body: string;
  id: number;
  title: string;
  userId: number;
}
interface CreateFakePostError {}
interface CreateFakePostVariables {
  title: string;
  body: string;
  userId: number;
}

const useCreateFakePost = (
  options?: UsePostOptions<
    CreateFakePostData,
    CreateFakePostError,
    CreateFakePostVariables
  >
) => {
  const [createFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'createFakePost'
  );
  return usePost<
    CreateFakePostData,
    CreateFakePostError,
    CreateFakePostVariables
  >(createFakePostConfig, options);
};

const { data, error, mutate, ...rest } = useCreateFakePost({
  onSuccess: (data) => {
    console.log('createFakePostData: ', data);
  },
});

mutate({ title: 'foo', body: 'bar', userId: 1 });

- postOptions: useMutation options, expect mutationFn.

- postReturns: useMutation returns.


usePut

A wrapper around useMutation hook.

import { useQueryConfig, usePut, parseConfigURL } from 'react-native-queries';

const putConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const putOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const putReturns = usePut(putConfig, putOptions);

/**
 * Example:
 */
const useUpdateFakePost = (id, options) => {
  const [updateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'updateFakePost'
  );
  return usePut(parseConfigURL(updateFakePostConfig, { id }), options);
};

const { data, error, mutate, ...rest } = useUpdateFakePost(1, {
  onSuccess: (data) => {
    console.log('updateFakePostData: ', data);
  },
});

mutate({ id: 1, title: 'foo', body: 'bar', userId: 1 });
import { useQueryConfig, usePut } from 'react-native-queries';
import type { UsePutConfig, UsePutOptions } from 'react-native-queries';

interface PutData {}
interface PutError {}
interface PutVariables {}

const putConfig: UsePutConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const putOptions: UsePutOptions<PutData, PutError, PutVariables> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const putReturns = usePut<PutData, PutError, PutVariables>(
  putConfig,
  putOptions
);

/**
 * Example:
 */
interface UpdateFakePostData {
  body: string;
  id: number;
  title: string;
  userId: number;
}
interface UpdateFakePostError {}
interface UpdateFakePostVariables {
  title: string;
  body: string;
  userId: number;
  id: number;
}

const useUpdateFakePost = (
  id: number,
  options?: UsePutOptions<
    UpdateFakePostData,
    UpdateFakePostError,
    UpdateFakePostVariables
  >
) => {
  const [updateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'updateFakePost'
  );
  return usePut<
    UpdateFakePostData,
    UpdateFakePostError,
    UpdateFakePostVariables
  >(parseConfigURL(updateFakePostConfig, { id }), options);
};

- putOptions: useMutation options, expect mutationFn.

- putReturns: useMutation returns.


usePatch

A wrapper around useMutation hook.

import { useQueryConfig, usePatch, parseConfigURL } from 'react-native-queries';

const patchConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const patchOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const patchReturns = usePatch(patchConfig, patchOptions);

/**
 * Example:
 */
const usePatchFakePost = (id, options) => {
  const [updateFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'patchFakePost'
  );
  return usePatch(parseConfigURL(updateFakePostConfig, { id }), options);
};

const { data, error, mutate, ...rest } = usePatchFakePost(1, {
  onSuccess: (data) => {
    console.log('patchFakePostData: ', data);
  },
});

mutate({ title: 'foo' });
import { useQueryConfig, usePatch } from 'react-native-queries';
import type { UsePatchConfig, UsePatchOptions } from 'react-native-queries';

interface PatchData {}
interface PatchError {}
interface PatchVariables {}

const patchConfig: UsePatchConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const patchOptions: UsePatchOptions<PatchData, PatchError, PatchVariables> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const patchReturns = usePatch<PatchData, PatchError, PatchVariables>(
  patchConfig,
  patchOptions
);

/**
 * Example:
 */
interface PatchFakePostData {
  body: string;
  id: number;
  title: string;
  userId: number;
}
interface PatchFakePostError {}
interface PatchFakePostVariables {
  title: string;
}

const usePatchFakePost = (
  id: number,
  options?: UsePatchOptions<
    PatchFakePostData,
    PatchFakePostError,
    PatchFakePostVariables
  >
) => {
  const [patchFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'updateFakePost'
  );
  return usePatch<
    PatchFakePostData,
    PatchFakePostError,
    PatchFakePostVariables
  >(parseConfigURL(patchFakePostConfig, { id }), options);
};

const { data, error, mutate, ...rest } = usePatchFakePost(1, {
  onSuccess: (data) => {
    console.log('patchFakePostData: ', data);
  },
});

mutate({ title: 'foo' });

- patchOptions: useMutation options, expect mutationFn.

- patchReturns: useMutation returns.


useDelete

A wrapper around useMutation hook.

import { useQueryConfig, useDelete } from 'react-native-queries';

const deleteConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const deleteOptions = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const deleteReturns = useDelete(deleteConfig, deleteOptions);

/**
 * Example:
 */
//Forme 1: pass id as mutate arg
const useDeleteFakePost = (options) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete(deleteFakePostConfig, options);
};

const { data, error, mutate, ...rest } = useDeleteFakePost({
  onSuccess: (data) => {
    console.log('deleteFakePostData: ', data);
  },
});

// mutate variables are pathParams here.
// ex: 'posts/{{id}}' will sent as 'posts/1'.
mutate({ id: 1 });

//Forme 2: pass id as hook arg
const useDeleteFakePost = (id, options) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete(parseConfigURL(deleteFakePostConfig, { id }), options);
};

const { data, error, mutate, ...rest } = useDeleteFakePost(1, {
  onSuccess: (data) => {
    console.log('deleteFakePostData: ', data);
  },
});

mutate();
import { useQueryConfig, useDelete } from 'react-native-queries';
import type { UseDeleteConfig, UseDeleteOptions } from 'react-native-queries';

interface DeleteData {}
interface DeleteError {}
interface DeleteVariables {}

const deleteConfig: UseDeleteConfig = {
  baseURL: '...',
  url: '...',
  requestConfig: '...',
};

const deleteOptions: UseDeleteOptions<
  DeleteData,
  DeleteError,
  DeleteVariables
> = {
  onSuccess: (data) => {},
  onError: (error) => {},
  //...
};

const deleteReturns = useDelete<DeleteData, DeleteError, DeleteVariables>(
  deleteConfig,
  deleteOptions
);

/**
 * Example:
 */
//Forme 1: pass id as mutate arg
interface DeleteFakePostData {}
interface DeleteFakePostError {}
interface DeleteFakePostVariables {
  id: number;
}

const useDeleteFakePost = (
  options?: UseDeleteOptions<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >
) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >(deleteFakePostConfig, options);
};

const { data, error, mutate, ...rest } = useDeleteFakePost({
  onSuccess: (data) => {
    console.log('deleteFakePostData: ', data);
  },
});

// mutate variables are pathParams here.
// ex: posts/{{id}} will sent as posts/1.
mutate({ id: 1 });

//Forme 2: pass id as hook arg
interface DeleteFakePostData {}
interface DeleteFakePostError {}
interface DeleteFakePostVariables {}

const useDeleteFakePost = (
  id: number,
  options?: UseDeleteOptions<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >
) => {
  const [deleteFakePostConfig] = useQueryConfig(
    'jsonplaceholder',
    'deleteFakePost'
  );
  return useDelete<
    DeleteFakePostData,
    DeleteFakePostError,
    DeleteFakePostVariables
  >(parseConfigURL(deleteFakePostConfig, { id }), options);
};

const { data, error, mutate, ...rest } = useDeleteFakePost(1, {
  onSuccess: (data) => {
    console.log('deleteFakePostData: ', data);
  },
});

mutate();

- deleteOptions: useMutation options, expect mutationFn.

- deleteReturns: useMutation returns.


parseConfigURL

Util to replace placeholder between {{...}} in url.

const parsedConfigURL = parseConfigURL(
  { baseURL: 'https://jsonplaceholder.typicode.com', url: 'posts/{{id}}' },
  { id: 1 }
);

//Output: { baseURL: 'https://jsonplaceholder.typicode.com', url: 'posts/1', }

/**
 * Example:
 */
const [deleteFakePostConfig] = useQueryConfig(
  'jsonplaceholder',
  'deleteFakePost'
);
const parsedDeleteFakePostConfig = parseConfigURL(deleteFakePostConfig, {
  id: 1,
});
0.3.0

8 months ago

0.4.1

8 months ago

0.3.2

8 months ago

0.4.0

8 months ago

0.3.1

8 months ago

0.3.3

8 months ago

0.2.2

10 months ago

0.2.1

10 months ago

0.2.0

10 months ago

0.1.1

10 months ago

0.1.0

10 months ago