mst-async-store
Advanced tools
Comparing version 1.1.0 to 2.0.0
@@ -0,1 +1,22 @@ | ||
# [2.0.0](https://github.com/mekwall/mst-async-store/compare/v1.1.0...v2.0.0) (2019-02-04) | ||
### Bug Fixes | ||
* clearFailstate must be an action ([3b26d90](https://github.com/mekwall/mst-async-store/commit/3b26d90)) | ||
* ensure empty container can trigger fetch for itself from parent ([5f89b58](https://github.com/mekwall/mst-async-store/commit/5f89b58)) | ||
* expire when failstate is cleared ([c786dca](https://github.com/mekwall/mst-async-store/commit/c786dca)) | ||
### Features | ||
* add store errors, custom batch size and support return maps ([5dca25c](https://github.com/mekwall/mst-async-store/commit/5dca25c)) | ||
* add support for providing a custom AsyncContainer ([3d59f4f](https://github.com/mekwall/mst-async-store/commit/3d59f4f)) | ||
* updateAPI to use options obj for everything ([e0c51b2](https://github.com/mekwall/mst-async-store/commit/e0c51b2)) | ||
### BREAKING CHANGES | ||
* Not backwards compatible with previous API | ||
# [1.1.0](https://github.com/mekwall/mst-async-store/compare/v1.0.0...v1.1.0) (2019-01-08) | ||
@@ -2,0 +23,0 @@ |
@@ -1,2 +0,2 @@ | ||
import { IAnyModelType, Instance } from 'mobx-state-tree'; | ||
import { IAnyModelType, Instance, IModelType, ISimpleType, IMaybe, ModelPropertiesDeclarationToProperties } from 'mobx-state-tree'; | ||
export interface VolatileAsyncContainerState { | ||
@@ -15,8 +15,22 @@ isReady: boolean; | ||
} | ||
export declare function createAsyncContainer<T extends IAnyModelType>(ItemModel: T, options?: AsyncContainerOptions<T>): import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
export declare type AsyncContainerModel<I extends IAnyModelType> = IModelType<ModelPropertiesDeclarationToProperties<{ | ||
id: ISimpleType<string>; | ||
_value: IMaybe<I>; | ||
}>, VolatileAsyncContainerState & { | ||
getFailstate(): undefined | Error; | ||
clearFailstate(): void; | ||
readonly hasExpired: boolean; | ||
setReady(): void; | ||
setPending(): void; | ||
setFailstate(e: Error): void; | ||
setValue(value: Instance<IAnyModelType>): void; | ||
readonly inFailstate: boolean; | ||
readonly shouldFetch: boolean; | ||
readonly value: undefined | Instance<IAnyModelType>; | ||
}>; | ||
export declare function createAsyncContainer<T extends IAnyModelType>(ItemModel: T, options?: AsyncContainerOptions<T>): IModelType<ModelPropertiesDeclarationToProperties<{ | ||
id: ISimpleType<string>; | ||
_value: IMaybe<T>; | ||
}>, VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -27,2 +41,3 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
@@ -35,3 +50,3 @@ setValue: (value: Instance<T>) => void; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>; |
@@ -12,3 +12,3 @@ "use strict"; | ||
.model(name, { | ||
id: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.identifier), | ||
id: mobx_state_tree_1.types.identifier, | ||
_value: mobx_state_tree_1.types.maybe(ItemModel), | ||
@@ -27,5 +27,2 @@ }) | ||
}, | ||
clearFailstate: function () { | ||
self.error = undefined; | ||
}, | ||
get hasExpired() { | ||
@@ -52,2 +49,6 @@ return (self.expiresAt > 0 && mobx_utils_1.now(ttl < 1000 ? ttl : 1000) >= self.expiresAt); | ||
}, | ||
clearFailstate: function () { | ||
self.error = undefined; | ||
self.expiresAt = Date.now() - 1; | ||
}, | ||
}); }) | ||
@@ -94,7 +95,10 @@ .actions(function (self) { return ({ | ||
if (self.shouldFetch) { | ||
if (mobx_state_tree_1.hasParent(self)) { | ||
var parent_1 = mobx_state_tree_1.getParent(self); | ||
if (mobx_state_tree_1.hasParent(self, 2)) { | ||
var parent_1 = mobx_state_tree_1.getParent(self, 2); | ||
if (parent_1.fetchOne) { | ||
parent_1.fetchOne(self.id); | ||
} | ||
else if (parent_1.fetchMany) { | ||
parent_1.fetchMany([self.id]); | ||
} | ||
} | ||
@@ -101,0 +105,0 @@ else if (options.fetch) { |
import { IAnyModelType, Instance, ModelInstanceType } from 'mobx-state-tree'; | ||
import { AsyncContainerModel } from './createAsyncContainer'; | ||
import { _NotCustomized } from 'mobx-state-tree/dist/internal'; | ||
declare type ReturnValueArray<T> = Array<Instance<T>>; | ||
declare type ReturnValueMap<T> = Dict<Instance<T> | Error>; | ||
export declare type AsyncFetchActions<T> = (self: ModelInstanceType<any, any, any, any>) => { | ||
fetchOne?(id: string): Promise<Instance<T> | undefined>; | ||
fetchMany?(ids: string[]): Promise<Array<Instance<T>>>; | ||
fetchAll?(): Promise<Array<Instance<T>>>; | ||
fetchMany?(ids: string[]): Promise<ReturnValueArray<T> | ReturnValueMap<T>>; | ||
fetchAll?(): Promise<ReturnValueArray<T> | ReturnValueMap<T>>; | ||
}; | ||
@@ -11,13 +15,19 @@ export interface VolatileAsyncStoreState { | ||
fetchQueue: string[]; | ||
error?: Error; | ||
} | ||
export declare function createAsyncStore<T extends IAnyModelType>(name: string, ItemModel: T, fetchActions?: AsyncFetchActions<T>, options?: { | ||
ttl: number; | ||
failstateTtl: number; | ||
}): import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
containers: import("mobx-state-tree").IMapType<import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
export interface AsyncStoreOptions<ITEM, CONTAINER> { | ||
name?: string; | ||
itemModel: ITEM; | ||
containerModel?: CONTAINER; | ||
ttl?: number; | ||
failstateTtl?: number; | ||
batch?: number; | ||
fetchActions?: AsyncFetchActions<ITEM>; | ||
} | ||
export declare function createAsyncStore<ITEM extends IAnyModelType, CONTAINER extends AsyncContainerModel<ITEM>>(options: AsyncStoreOptions<ITEM, CONTAINER>): import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
containers: import("mobx-state-tree").IMapType<CONTAINER | import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -28,4 +38,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -36,5 +47,9 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized>>; | ||
}>, VolatileAsyncStoreState & { | ||
readonly errors: Dict<Error>; | ||
} & { | ||
readonly inFailstate: boolean; | ||
} & { | ||
setReady(): void; | ||
@@ -49,8 +64,7 @@ setPending(): void; | ||
} & { | ||
createAsyncContainer(id: string): ModelInstanceType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
createAsyncContainer(id: string): NonNullable<import("mobx-state-tree/dist/internal").ExtractT<CONTAINER>> | NonNullable<import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -61,4 +75,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -69,4 +84,4 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized>>>; | ||
afterCreate(): void; | ||
@@ -78,8 +93,7 @@ } & { | ||
} & { | ||
getOne(id: string): ModelInstanceType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
getOne(id: string): NonNullable<import("mobx-state-tree/dist/internal").ExtractT<CONTAINER>> | NonNullable<import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -90,4 +104,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -98,10 +113,9 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>; | ||
getMany(ids: string[]): (import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized>>>; | ||
getMany(ids: string[]): (Instance<CONTAINER> | (import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -112,4 +126,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -120,9 +135,8 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized> extends import("mobx-state-tree").IType<any, any, infer TT> ? TT : import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized> extends import("mobx-state-tree").IType<any, any, infer TT> ? TT : import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -133,4 +147,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -141,10 +156,9 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>)[]; | ||
getAll(): (import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized>))[]; | ||
getAll(): (Instance<CONTAINER> | (import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -155,4 +169,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -163,9 +178,8 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized> extends import("mobx-state-tree").IType<any, any, infer TT> ? TT : import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>; | ||
_value: import("mobx-state-tree").IMaybe<T>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized> extends import("mobx-state-tree").IType<any, any, infer TT> ? TT : import("mobx-state-tree").IModelType<import("mobx-state-tree").ModelPropertiesDeclarationToProperties<{ | ||
id: import("mobx-state-tree").ISimpleType<string>; | ||
_value: import("mobx-state-tree").IMaybe<ITEM>; | ||
}>, import("./createAsyncContainer").VolatileAsyncContainerState & { | ||
getFailstate: () => Error | undefined; | ||
clearFailstate: () => void; | ||
readonly hasExpired: boolean; | ||
@@ -176,4 +190,5 @@ } & { | ||
setFailstate(e: Error): void; | ||
clearFailstate: () => void; | ||
} & { | ||
setValue: (value: Instance<T>) => void; | ||
setValue: (value: Instance<ITEM>) => void; | ||
} & { | ||
@@ -184,4 +199,5 @@ readonly inFailstate: boolean; | ||
} & { | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<T> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<T> : never>; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>)[]; | ||
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>; | ||
readonly value: import("mobx-state-tree/dist/internal").ExtractT<import("mobx-state-tree").IMaybe<ITEM> extends import("mobx-state-tree").IType<any, any, any> ? import("mobx-state-tree").IMaybe<ITEM> : never>; | ||
}, _NotCustomized, _NotCustomized>))[]; | ||
}, _NotCustomized, _NotCustomized>; | ||
export {}; |
@@ -8,8 +8,9 @@ "use strict"; | ||
var createAsyncContainer_1 = require("./createAsyncContainer"); | ||
function createAsyncStore(name, ItemModel, fetchActions, options) { | ||
if (options === void 0) { options = { | ||
ttl: 0, | ||
failstateTtl: 10000, | ||
}; } | ||
var AsyncContainer = createAsyncContainer_1.createAsyncContainer(ItemModel, options); | ||
function createAsyncStore(options) { | ||
var _a = options.name, name = _a === void 0 ? 'AnonymouseAsyncStore' : _a, itemModel = options.itemModel, containerModel = options.containerModel, _b = options.ttl, ttl = _b === void 0 ? 0 : _b, _c = options.failstateTtl, failstateTtl = _c === void 0 ? 10000 : _c, _d = options.batch, batch = _d === void 0 ? 40 : _d, fetchActions = options.fetchActions; | ||
var AsyncContainer = containerModel || | ||
createAsyncContainer_1.createAsyncContainer(itemModel, { | ||
ttl: ttl, | ||
failstateTtl: failstateTtl, | ||
}); | ||
return mobx_state_tree_1.types | ||
@@ -24,2 +25,15 @@ .model(name, { | ||
}); }) | ||
.views(function (self) { return ({ | ||
get errors() { | ||
return mobx_1.values(self.containers).reduce(function (acc, c) { | ||
var _a; | ||
return tslib_1.__assign({}, acc, (_a = {}, _a[c.id] = c.error, _a)); | ||
}, {}); | ||
}, | ||
}); }) | ||
.views(function (self) { return ({ | ||
get inFailstate() { | ||
return Object.keys(self.errors).length > 0; | ||
}, | ||
}); }) | ||
.actions(function (self) { return ({ | ||
@@ -31,2 +45,3 @@ setReady: function () { | ||
setPending: function () { | ||
self.error = undefined; | ||
self.isPending = true; | ||
@@ -66,12 +81,21 @@ }, | ||
items = _a.sent(); | ||
if (items.length > 0) { | ||
items.forEach(function (item) { | ||
var ct = self.containers.get(item.id) || | ||
AsyncContainer.create({ id: item.id }); | ||
var idx = self.fetchQueue.indexOf(item.id); | ||
self.fetchQueue.splice(idx, 1); | ||
ct.setValue(item); | ||
self.containers.set(item.id, ct); | ||
}); | ||
if (Array.isArray(items)) { | ||
items = items.reduce(function (acc, item) { | ||
var _a; | ||
return (tslib_1.__assign({}, acc, (_a = {}, _a[item.id] = item, _a))); | ||
}, {}); | ||
} | ||
Object.keys(items).forEach(function (id) { | ||
var ct = self.containers.get(id) || AsyncContainer.create({ id: id }); | ||
var itemOrError = items[id]; | ||
var idx = self.fetchQueue.indexOf(id); | ||
self.fetchQueue.splice(idx, 1); | ||
if (itemOrError instanceof Error) { | ||
ct.setFailstate(itemOrError); | ||
} | ||
else { | ||
ct.setValue(itemOrError); | ||
} | ||
self.containers.set(id, ct); | ||
}); | ||
self.setReady(); | ||
@@ -83,3 +107,3 @@ return [2 /*return*/]; | ||
_fetchMany: mobx_state_tree_1.flow(function (ids) { | ||
var cts, items, e_1; | ||
var cts, items_1, e_1; | ||
return tslib_1.__generator(this, function (_a) { | ||
@@ -102,6 +126,20 @@ switch (_a.label) { | ||
case 2: | ||
items = _a.sent(); | ||
items.forEach(function (item) { | ||
var ct = self.containers.get(item.id); | ||
ct.setValue(item); | ||
items_1 = _a.sent(); | ||
if (Array.isArray(items_1)) { | ||
items_1 = items_1.reduce(function (acc, item) { | ||
var _a; | ||
return (tslib_1.__assign({}, acc, (_a = {}, _a[item.id] = item, _a))); | ||
}, {}); | ||
} | ||
Object.keys(items_1).forEach(function (id) { | ||
var ct = self.containers.get(id); | ||
var itemOrError = items_1[id]; | ||
var idx = self.fetchQueue.indexOf(id); | ||
self.fetchQueue.splice(idx, 1); | ||
if (itemOrError instanceof Error) { | ||
ct.setFailstate(itemOrError); | ||
} | ||
else { | ||
ct.setValue(itemOrError); | ||
} | ||
}); | ||
@@ -154,5 +192,10 @@ return [3 /*break*/, 4]; | ||
createAsyncContainer: function (id) { | ||
return AsyncContainer.create({ id: id }); | ||
if (self.containers.has(id)) { | ||
throw Error("Container with id " + id + " already exists"); | ||
} | ||
self.containers.put({ id: id, _value: undefined }); | ||
return self.containers.get(id); | ||
}, | ||
afterCreate: function () { | ||
var client = fetchActions ? fetchActions(self) : {}; | ||
mobx_state_tree_1.addDisposer(self, mobx_1.reaction(function () { return !self.isPending && self.fetchQueue.length > 0; }, function (shouldFetch) { | ||
@@ -167,5 +210,5 @@ if (shouldFetch) { | ||
else { | ||
// Batch 40 items at a time | ||
var idsToFetch = self.spliceFetchQueue(0, 40); | ||
if (idsToFetch.length === 1) { | ||
// Batch fetching | ||
var idsToFetch = self.spliceFetchQueue(0, batch); | ||
if (idsToFetch.length === 1 && client.fetchOne) { | ||
self._fetchOne(idsToFetch[0]); | ||
@@ -172,0 +215,0 @@ } |
@@ -12,3 +12,3 @@ { | ||
], | ||
"version": "1.1.0", | ||
"version": "2.0.0", | ||
"author": "Marcus Ekwall <marcus.ekwall@gmail.com>", | ||
@@ -15,0 +15,0 @@ "license": "ISC", |
@@ -22,6 +22,8 @@ # mst-async-store | ||
// Generate store model | ||
const MyAsyncStore = createAsyncStore( | ||
'MyAsyncStore', // Name of store | ||
MyModel, // Your MST model representing one item | ||
(self) => ( | ||
const MyAsyncStore = createAsyncStore({ | ||
name: 'MyAsyncStore', | ||
itemModel: MyModel, | ||
ttl: 10000, | ||
failstateTtl: 5000 | ||
fetchActions: (self) => ( | ||
{ | ||
@@ -43,7 +45,5 @@ // Logic to fetch one item | ||
}, | ||
}, | ||
// Store options | ||
{ ttl: 10000, failstateTtl: 5000 } | ||
} | ||
) | ||
); | ||
}); | ||
@@ -50,0 +50,0 @@ // Instantiate store |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
336369
641