Skip to content

Commit 4b1b433

Browse files
authored
Merge pull request #47 from dhilt/issue-44-adapter-reset-reload-collision
Adapter.reset context persistence
2 parents c564ea0 + ddfe19d commit 4b1b433

File tree

7 files changed

+64
-49
lines changed

7 files changed

+64
-49
lines changed

package-lock.json

Lines changed: 21 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vscroll",
3-
"version": "1.5.3",
3+
"version": "1.5.4",
44
"description": "Virtual scroll engine",
55
"main": "dist/bundles/vscroll.umd.js",
66
"module": "dist/bundles/vscroll.esm5.js",
@@ -65,4 +65,4 @@
6565
"javascript",
6666
"typescript"
6767
]
68-
}
68+
}

src/classes/adapter.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ import {
3232
} from '../interfaces/index';
3333

3434
type MethodResolver = (...args: unknown[]) => Promise<AdapterMethodResult>;
35+
type InitializationParams<Item> = {
36+
buffer: Buffer<Item>,
37+
state: State,
38+
viewport: Viewport,
39+
logger: Logger,
40+
adapterRun$?: Reactive<ProcessSubject>,
41+
getWorkflow?: WorkflowGetter<Item>
42+
}
3543

3644
const ADAPTER_PROPS_STUB = getDefaultAdapterProps();
3745

@@ -63,6 +71,7 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
6371
private source: { [key: string]: Reactive<unknown> } = {}; // for Reactive props
6472
private box: { [key: string]: unknown } = {}; // for Scalars over Reactive props
6573
private demand: { [key: string]: unknown } = {}; // for Scalars on demand
74+
private disposed: boolean;
6675

6776
// eslint-disable-next-line @typescript-eslint/no-unused-vars
6877
setFirstOrLastVisible = (_: { first?: boolean, last?: boolean, workflow?: ScrollerWorkflow }) => { };
@@ -264,7 +273,7 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
264273
}
265274

266275
initialize(
267-
buffer: Buffer<Item>, state: State, viewport: Viewport, logger: Logger, adapterRun$?: Reactive<ProcessSubject>
276+
{ buffer, state, viewport, logger, adapterRun$, getWorkflow }: InitializationParams<Item>
268277
): void {
269278
// buffer
270279
Object.defineProperty(this.demand, AdapterPropName.itemsCount, {
@@ -344,6 +353,11 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
344353
});
345354
}
346355

356+
// workflow getter
357+
if (getWorkflow) {
358+
this.getWorkflow = getWorkflow;
359+
}
360+
347361
// init
348362
this.init = true;
349363
}
@@ -358,6 +372,7 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
358372
Object.getOwnPropertyNames(this).forEach(prop => {
359373
delete (this as Record<string, unknown>)[prop];
360374
});
375+
this.disposed = true;
361376
}
362377

363378
resetContext(): void {
@@ -511,8 +526,15 @@ export class Adapter<Item = unknown> implements IAdapter<Item> {
511526
resolve(false);
512527
});
513528
}).then(immediate => {
529+
if (this.disposed) {
530+
return {
531+
immediate,
532+
success: false,
533+
details: 'Adapter was disposed'
534+
};
535+
}
514536
const success = reloadId === this.reloadId;
515-
this.logger.log(() => !success ? `relax promise cancelled due to ${reloadId} != ${this.reloadId}` : void 0);
537+
this.logger?.log?.(() => !success ? `relax promise cancelled due to ${reloadId} != ${this.reloadId}` : void 0);
516538
return {
517539
immediate,
518540
success,

src/processes/adapter/reload.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export default class Reload extends BaseAdapterProcessFactory(AdapterProcess.rel
1414

1515
const payload: ProcessPayload = {};
1616
if (state.cycle.busy.get()) {
17-
state.scroll.stop();
1817
payload.finalize = true;
1918
state.cycle.interrupter = Reload.process;
2019
}

src/scroller.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ export class Scroller<Data = unknown> {
7979
init(adapterRun$?: Reactive<ProcessSubject>): void {
8080
this.viewport.reset(this.buffer.startIndex);
8181
this.logger.stat('initialization');
82-
this.adapter.initialize(this.buffer, this.state, this.viewport, this.logger, adapterRun$);
82+
this.adapter.initialize({
83+
buffer: this.buffer,
84+
state: this.state,
85+
viewport: this.viewport,
86+
logger: this.logger, adapterRun$,
87+
getWorkflow: () => this.workflow
88+
});
8389
}
8490

8591
dispose(forever?: boolean): void {

src/version.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export default {
22
name: 'vscroll',
3-
version: '1.5.3'
3+
version: '1.5.4'
44
};

src/workflow.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,21 +152,27 @@ export class Workflow<ItemData = unknown> {
152152
const { workflow, logger } = this.scroller;
153153
// we are going to create a new reference for the scroller.workflow object
154154
// calling the old version of the scroller.workflow by any outstanding async processes will be skipped
155-
workflow.call = (p: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars
155+
workflow.call = (_: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars
156156
logger.log('[skip wf call]');
157157
workflow.call.interrupted = true;
158158
this.scroller.workflow = this.getUpdater();
159159
this.interruptionCount++;
160160
logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);
161161
}
162162
if (datasource) { // Scroller re-initialization case
163-
this.scroller.adapter.relax(() => {
163+
const reInit = () => {
164164
this.scroller.logger.log('new Scroller instantiation');
165165
const scroller = new Scroller<ItemData>({ datasource, scroller: this.scroller });
166166
this.scroller.dispose();
167167
this.scroller = scroller;
168168
this.scroller.init();
169-
});
169+
};
170+
if (this.scroller.state.cycle.busy.get()) {
171+
// todo: think about immediate re-initialization even is there are pending processes
172+
this.scroller.adapter.relax(reInit.bind(this));
173+
} else {
174+
reInit();
175+
}
170176
}
171177
}
172178

0 commit comments

Comments
 (0)