Skip to content

Commit

Permalink
feat(oneFetchye): make even cleaner api for fetchtye
Browse files Browse the repository at this point in the history
  • Loading branch information
code-forger committed Jan 22, 2024
1 parent 7f768d2 commit f223ecf
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 10 deletions.
15 changes: 5 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -633,13 +633,13 @@ export default BookList;
#### One App SSR
Using `makeOneServerFetchye` from `fetchye-one-app` ensures that the cache will
Using `oneFetchye` from `fetchye-one-app` ensures that the cache will
always be configured correctly.
```jsx
import React from 'react';
import { useFetchye } from 'fetchye';
import { makeOneServerFetchye } from 'fetchye-one-app';
import { oneFetchye } from 'fetchye-one-app';

const BookList = () => {
const { isLoading, data } = useFetchye('http://example.com/api/books/');
Expand All @@ -654,19 +654,14 @@ const BookList = () => {
};

BookList.holocron = {
loadModuleData: async ({ store: { dispatch, getState }, fetchClient }) => {
loadModuleData: async ({ store: { dispatch } }) => {
if (global.BROWSER) {
return;
}
const fetchye = makeOneServerFetchye({
// Redux store
store: { dispatch, getState },
fetchClient,
});

// async/await fetchye has same arguments as useFetchye
// oneFetchye has same arguments as useFetchye
// dispatches events into the server side Redux store
await fetchye('http://example.com/api/books/');
await dispatch(oneFetchye('http://example.com/api/books/'));
},
};

Expand Down
33 changes: 33 additions & 0 deletions packages/fetchye-one-app/__tests__/oneFetchye.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import oneFetchye from '../src/oneFetchye';

const mockOneCacheSymbol = Symbol('oneCache');
jest.mock('../src/OneCache', () => jest.fn(() => mockOneCacheSymbol));
jest.mock('fetchye', () => ({
makeServerFetchye: jest.fn((...makeFetchyeArgs) => jest.fn((...fetcheArgs) => Promise.resolve(
{ makeFetchyeArgs, fetcheArgs }
))),
}));
describe('oneFetchye', () => {
it('should return a one-app-thunk that calls fetchye', async () => {
expect.assertions(1);
const fetchyeParams = [Symbol('fetchyeArgs 1'), Symbol('fetchyeArgs 2')];
const fetchyeThunk = oneFetchye(...fetchyeParams);
const thunkParams = [Symbol('dispatch'), Symbol('getState'), Symbol('fetchClient')];
const response = await fetchyeThunk(
thunkParams[0], thunkParams[1], { fetchClient: thunkParams[2] }
);
expect(response).toStrictEqual({
fetcheArgs: fetchyeParams,
makeFetchyeArgs: [
{
cache: mockOneCacheSymbol,
fetchClient: thunkParams[2],
store: {
dispatch: thunkParams[0],
getState: thunkParams[1],
},
},
],
});
});
});
1 change: 1 addition & 0 deletions packages/fetchye-one-app/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
export { makeOneServerFetchye } from './makeOneServerFetchye';
export OneCache, { oneCacheSelector } from './OneCache';
export OneFetchyeProvider from './OneFetchyeProvider';
export oneFetchye from './oneFetchye';
13 changes: 13 additions & 0 deletions packages/fetchye-one-app/src/oneFetchye.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { makeServerFetchye } from 'fetchye';
import OneCache from './OneCache';

const oneFetchye = (...fetchyeArgs) => async (dispatch, getState, { fetchClient }) => {
const fetchye = makeServerFetchye({
store: { getState, dispatch },
fetchClient,
cache: OneCache(),
});
return fetchye(...fetchyeArgs);
};

export default oneFetchye;

0 comments on commit f223ecf

Please sign in to comment.