From 80b752f72a4ec6d5a81434c7d41414cde94df3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20H=C3=B6ser?= Date: Sat, 30 Mar 2024 13:38:42 +0100 Subject: [PATCH 1/3] Add task args to task callbacks as argument Fixes #4561 --- packages/task/src/task.ts | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/task/src/task.ts b/packages/task/src/task.ts index 919326c2ce..38fd9fe003 100644 --- a/packages/task/src/task.ts +++ b/packages/task/src/task.ts @@ -37,11 +37,11 @@ export const initialState = Symbol(); export type TaskStatus = (typeof TaskStatus)[keyof typeof TaskStatus]; -export type StatusRenderer = { - initial?: () => unknown; - pending?: () => unknown; - complete?: (value: R) => unknown; - error?: (error: unknown) => unknown; +export type StatusRenderer> = { + initial?: (args?: D) => unknown; + pending?: (args?: D) => unknown; + complete?: (value: R, args?: D) => unknown; + error?: (error: unknown, args?: D) => unknown; }; export interface TaskConfig, R> { @@ -423,18 +423,26 @@ export class Task< return this._error; } - render>(renderer: T) { + render>(renderer: S) { switch (this.status) { case TaskStatus.INITIAL: - return renderer.initial?.() as MaybeReturnType; + return renderer.initial?.(this._previousArgs) as MaybeReturnType< + S['initial'] + >; case TaskStatus.PENDING: - return renderer.pending?.() as MaybeReturnType; - case TaskStatus.COMPLETE: - return renderer.complete?.(this.value!) as MaybeReturnType< - T['complete'] + return renderer.pending?.(this._previousArgs) as MaybeReturnType< + S['pending'] >; + case TaskStatus.COMPLETE: + return renderer.complete?.( + this.value!, + this._previousArgs + ) as MaybeReturnType; case TaskStatus.ERROR: - return renderer.error?.(this.error) as MaybeReturnType; + return renderer.error?.( + this.error, + this._previousArgs + ) as MaybeReturnType; default: throw new Error(`Unexpected status: ${this.status}`); } From e4dc900f8873c6a1388e4b9511b464520e4f1c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20H=C3=B6ser?= Date: Sat, 30 Mar 2024 13:39:54 +0100 Subject: [PATCH 2/3] Add changeset --- .changeset/nasty-tomatoes-pretend.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nasty-tomatoes-pretend.md diff --git a/.changeset/nasty-tomatoes-pretend.md b/.changeset/nasty-tomatoes-pretend.md new file mode 100644 index 0000000000..13141a2a17 --- /dev/null +++ b/.changeset/nasty-tomatoes-pretend.md @@ -0,0 +1,5 @@ +--- +'@lit/task': minor +--- + +Add Task args to StatusRenderer callbacks From ecf808030102fe0c3941aaa9dacc117437d11abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20H=C3=B6ser?= Date: Tue, 23 Apr 2024 16:54:02 +0200 Subject: [PATCH 3/3] Resolve comments by @justinfagnani to rename _previousArgs to _latestArgs and adapt generic types. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raphael Höser --- packages/task/src/task.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/task/src/task.ts b/packages/task/src/task.ts index 38fd9fe003..8308978b77 100644 --- a/packages/task/src/task.ts +++ b/packages/task/src/task.ts @@ -37,11 +37,14 @@ export const initialState = Symbol(); export type TaskStatus = (typeof TaskStatus)[keyof typeof TaskStatus]; -export type StatusRenderer> = { - initial?: (args?: D) => unknown; - pending?: (args?: D) => unknown; - complete?: (value: R, args?: D) => unknown; - error?: (error: unknown, args?: D) => unknown; +export type StatusRenderer< + R, + T extends ReadonlyArray = ReadonlyArray, +> = { + initial?: (args?: T) => unknown; + pending?: (args?: T) => unknown; + complete?: (value: R, args?: T) => unknown; + error?: (error: unknown, args?: T) => unknown; }; export interface TaskConfig, R> { @@ -169,7 +172,7 @@ export class Task< T extends ReadonlyArray = ReadonlyArray, R = unknown, > { - private _previousArgs?: T; + private _latestArgs?: T; private _task: TaskFunction; private _argsFn?: ArgsFunction; private _argsEqual: (oldArgs: T, newArgs: T) => boolean; @@ -252,7 +255,7 @@ export class Task< if ('initialValue' in taskConfig) { this._value = taskConfig.initialValue; this.status = TaskStatus.COMPLETE; - this._previousArgs = this._getArgs?.(); + this._latestArgs = this._getArgs?.(); } } @@ -290,8 +293,8 @@ export class Task< */ private async _performTask() { const args = this._getArgs(); - const prev = this._previousArgs; - this._previousArgs = args; + const prev = this._latestArgs; + this._latestArgs = args; if ( args !== prev && args !== undefined && @@ -316,7 +319,7 @@ export class Task< // Remember the args for potential future automatic runs. // TODO (justinfagnani): add test - this._previousArgs = args; + this._latestArgs = args; if (this.status === TaskStatus.PENDING) { this._abortController?.abort(); @@ -426,22 +429,22 @@ export class Task< render>(renderer: S) { switch (this.status) { case TaskStatus.INITIAL: - return renderer.initial?.(this._previousArgs) as MaybeReturnType< + return renderer.initial?.(this._latestArgs) as MaybeReturnType< S['initial'] >; case TaskStatus.PENDING: - return renderer.pending?.(this._previousArgs) as MaybeReturnType< + return renderer.pending?.(this._latestArgs) as MaybeReturnType< S['pending'] >; case TaskStatus.COMPLETE: return renderer.complete?.( this.value!, - this._previousArgs + this._latestArgs ) as MaybeReturnType; case TaskStatus.ERROR: return renderer.error?.( this.error, - this._previousArgs + this._latestArgs ) as MaybeReturnType; default: throw new Error(`Unexpected status: ${this.status}`);