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: