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 diff --git a/packages/task/src/task.ts b/packages/task/src/task.ts index 919326c2ce..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?: () => unknown; - pending?: () => unknown; - complete?: (value: R) => unknown; - error?: (error: unknown) => 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(); @@ -423,18 +426,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._latestArgs) 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._latestArgs) as MaybeReturnType< + S['pending'] >; + case TaskStatus.COMPLETE: + return renderer.complete?.( + this.value!, + this._latestArgs + ) as MaybeReturnType; case TaskStatus.ERROR: - return renderer.error?.(this.error) as MaybeReturnType; + return renderer.error?.( + this.error, + this._latestArgs + ) as MaybeReturnType; default: throw new Error(`Unexpected status: ${this.status}`); }