Skip to content

Commit

Permalink
Merge pull request #11 from bluebill1049/feature/support-multiple-tra…
Browse files Browse the repository at this point in the history
…nsform-func

support multiple store sync
  • Loading branch information
bluebill1049 authored Mar 24, 2020
2 parents f02ce0a + 24395be commit bdda8ab
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 20 deletions.
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ createStore(store, options?: {
syncStores?: // sync with external store in your session/local storage
| Record<string, string[]>
| { externalStoreName: string; transform: Function } // name of the external store, and state to sync
| undefined;
| { externalStoreName: string; transform: Function }[];
}})
```

Expand All @@ -67,6 +67,15 @@ createStore({
// syncStores : {
// externalStoreName: ['yourDetail'],
// }
// or you can pass in an array of transform function
// syncStores : [
// {
// externalStoreName: 'externalStoreName',
// transform: ({ externalStoreData, currentStoreData }) => {
// return { ...externalStoreData, ...currentStoreData };
// },
// }
// ]
})
```

Expand Down
23 changes: 16 additions & 7 deletions src/logic/getSyncStoreData.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import getBrowserStoreData from './getBrowserStoreData';
import transformStore from './transformStore';
import { StateMachineOptions } from '../types';

export default function getSyncStoreData(
Expand All @@ -12,17 +13,25 @@ export default function getSyncStoreData(
if (!syncStoreOption) return store;

try {
if (
if (Array.isArray(syncStoreOption)) {
syncStoreOption.forEach(option => {
store = transformStore({
transform: option.transform,
externalStoreName: option.externalStoreName,
storageType,
store,
});
});
} else if (
syncStoreOption.externalStoreName &&
typeof syncStoreOption.transform === 'function' &&
typeof syncStoreOption.externalStoreName === 'string'
) {
return syncStoreOption.transform({
externalStoreData: getBrowserStoreData(
storageType,
syncStoreOption.externalStoreName,
),
currentStoreData: store,
return transformStore({
transform: syncStoreOption.transform,
externalStoreName: syncStoreOption.externalStoreName,
storageType,
store,
});
} else {
Object.entries(syncStoreOption).forEach(([key, values]) => {
Expand Down
18 changes: 18 additions & 0 deletions src/logic/transformStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import getBrowserStoreData from './getBrowserStoreData';
import { TransformFunc } from '../types';

export default ({
transform,
externalStoreName,
storageType,
store,
}: {
transform: TransformFunc;
externalStoreName: string;
storageType: Storage;
store: any;
}) =>
transform({
externalStoreData: getBrowserStoreData(storageType, externalStoreName),
currentStoreData: store,
});
26 changes: 14 additions & 12 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,21 @@ export type Action = (store: any, payload: any) => any;

export type Actions = { [key: string]: Action };

export type TransformFunc = ({
externalStoreData,
currentStoreData,
}: {
externalStoreData: any;
currentStoreData: any;
}) => any;

type TransformOptions = {
externalStoreName: string;
transform: TransformFunc;
};

export type StateMachineOptions = {
name: string;
middleWares?: Function[];
syncStores?:
| Record<string, string[]>
| {
externalStoreName: string;
transform: ({
externalStoreData,
currentStoreData,
}: {
externalStoreData: any;
currentStoreData: any;
}) => any;
};
syncStores?: Record<string, string[]> | TransformOptions | TransformOptions[];
};

0 comments on commit bdda8ab

Please sign in to comment.