diff --git a/.changeset/hip-bees-grow.md b/.changeset/hip-bees-grow.md new file mode 100644 index 000000000..c5f500b93 --- /dev/null +++ b/.changeset/hip-bees-grow.md @@ -0,0 +1,5 @@ +--- +'@farfetched/core': minor +--- + +Add `.reset` _Event_ to _Mutation_ diff --git a/apps/website/docs/api/primitives/mutation.md b/apps/website/docs/api/primitives/mutation.md index 10cc52975..eba412a49 100644 --- a/apps/website/docs/api/primitives/mutation.md +++ b/apps/website/docs/api/primitives/mutation.md @@ -14,6 +14,10 @@ This section describes the [_Event_](https://effector.dev/docs/api/effector/even Unconditionally starts the _Mutation_ with the given parameters. +### `reset` + +Resets the _Mutation_ to the initial state. + ## Stores This section describes the [_Stores_](https://effector.dev/docs/api/effector/store) that can be used to read the _Mutation_ state. diff --git a/packages/core/src/mutation/__tests__/create_headless_mutation.test.ts b/packages/core/src/mutation/__tests__/create_headless_mutation.test.ts index 2d8524705..fd45d5b49 100644 --- a/packages/core/src/mutation/__tests__/create_headless_mutation.test.ts +++ b/packages/core/src/mutation/__tests__/create_headless_mutation.test.ts @@ -22,6 +22,23 @@ describe('createHeadlessMutation', () => { expect(mockFn).toHaveBeenCalledWith(42); }); + test('reset reset $status', async () => { + const mutation = createHeadlessMutation({ + contract: unknownContract, + mapData: ({ result }) => result, + }); + + const scope = fork({ handlers: [[mutation.__.executeFx, () => null]] }); + + await allSettled(mutation.start, { scope, params: 42 }); + + expect(scope.getState(mutation.$status)).toBe('done'); + + await allSettled(mutation.reset, { scope }); + + expect(scope.getState(mutation.$status)).toBe('initial'); + }); + test('finished.success triggers after executeFx.done', async () => { const mutation = createHeadlessMutation({ contract: unknownContract, diff --git a/packages/core/src/mutation/create_headless_mutation.ts b/packages/core/src/mutation/create_headless_mutation.ts index 776d6749c..712763ca9 100644 --- a/packages/core/src/mutation/create_headless_mutation.ts +++ b/packages/core/src/mutation/create_headless_mutation.ts @@ -107,6 +107,7 @@ export function createHeadlessMutation< return { start: operation.start, + reset: operation.reset, started: readonly(operation.started), aborted: readonly(operation.aborted), $status: readonly(operation.$status), diff --git a/packages/core/src/query/create_headless_query.ts b/packages/core/src/query/create_headless_query.ts index cae69df07..95ace2ed3 100644 --- a/packages/core/src/query/create_headless_query.ts +++ b/packages/core/src/query/create_headless_query.ts @@ -102,7 +102,6 @@ export function createHeadlessQuery< }); const refresh = createEvent(); - const reset = createEvent(); // -- Main stores -- const $data = createStore(initialData, { @@ -193,13 +192,8 @@ export function createHeadlessQuery< // -- Reset state -- sample({ - clock: reset, - target: [ - $data.reinit, - $error.reinit, - $stale.reinit, - operation.__.lowLevelAPI.resetStatus, - ], + clock: operation.reset, + target: [$data.reinit, $error.reinit, $stale.reinit], }); // -- Protocols -- @@ -254,9 +248,9 @@ export function createHeadlessQuery< // -- Public API -- return { - reset, refresh, start: operation.start, + reset: operation.reset, started: readonly(operation.started), $data: readonly($data), $error: readonly($error), diff --git a/packages/core/src/query/type.ts b/packages/core/src/query/type.ts index cc1bbe162..99740bcc6 100644 --- a/packages/core/src/query/type.ts +++ b/packages/core/src/query/type.ts @@ -48,8 +48,6 @@ export interface Query * Is data stale? */ $stale: StoreWritable; - /** Event to reset the whole state of the query */ - reset: EventCallable; '@@unitShape': () => { data: Store; error: Store; diff --git a/packages/core/src/remote_operation/create_remote_operation.ts b/packages/core/src/remote_operation/create_remote_operation.ts index 22721cce9..37abb6e95 100644 --- a/packages/core/src/remote_operation/create_remote_operation.ts +++ b/packages/core/src/remote_operation/create_remote_operation.ts @@ -1,5 +1,4 @@ import { - type Event, createEffect, createEvent, createStore, @@ -110,6 +109,7 @@ export function createRemoteOperation< } = createDataSourceHandlers(dataSources); const start = createEvent(); + const reset = createEvent(); const started = createEvent<{ params: Params; meta: ExecutionMeta }>(); @@ -174,8 +174,7 @@ export function createRemoteOperation< serialize, }); - const resetStatus = createEvent(); - sample({ clock: resetStatus, target: $status.reinit }); + sample({ clock: reset, target: $status.reinit }); const $statusHistory = createStore([], { serialize: 'ignore', @@ -440,6 +439,7 @@ export function createRemoteOperation< finished, started, aborted, + reset, $status, $idle, $pending, @@ -462,7 +462,6 @@ export function createRemoteOperation< pushData, startWithMeta, callObjectCreated, - resetStatus, }, }, }; diff --git a/packages/core/src/remote_operation/type.ts b/packages/core/src/remote_operation/type.ts index 0a0408fb4..f40c7bdad 100644 --- a/packages/core/src/remote_operation/type.ts +++ b/packages/core/src/remote_operation/type.ts @@ -47,8 +47,10 @@ export interface RemoteOperation< * + true — query will be executed after any `start` call */ $enabled: Store; - /** Event to trigger query */ + /** Event to trigger operation */ start: EventCallable; + /** Event to reset the whole state of the operation */ + reset: EventCallable; /** Event that trigered after operation started */ started: Event<{ params: Params; meta: ExecutionMeta }>; aborted: Event<{ params: Params; meta: ExecutionMeta }>; @@ -119,7 +121,6 @@ export interface RemoteOperation< pushError: EventCallable; startWithMeta: EventCallable<{ params: Params; meta: ExecutionMeta }>; callObjectCreated: Event; - resetStatus: EventCallable; } & ExtraLowLevelAPI; experimentalAPI?: { attach: (config: {