Skip to content

Commit

Permalink
future
Browse files Browse the repository at this point in the history
  • Loading branch information
ENvironmentSet committed Feb 4, 2025
1 parent e7f1af2 commit d2c1b6d
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 9 deletions.
4 changes: 2 additions & 2 deletions integrations/react/src/future/StepActions.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
export type StepActions<ActivityParams> = {
pushStep: (
params: ActivityParams,
params: ActivityParams | ((prevParams: ActivityParams) => ActivityParams),
options?: {
targetActivityId?: string;
},
) => void;
replaceStep: (
params: ActivityParams,
params: ActivityParams | ((prevParams: ActivityParams) => ActivityParams),
options?: {
targetActivityId?: string;
},
Expand Down
55 changes: 50 additions & 5 deletions integrations/react/src/future/makeStepActions.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,72 @@
import type { ActivityBaseParams } from "@stackflow/config";
import type { CoreStore } from "@stackflow/core";
import type { Activity, CoreStore } from "@stackflow/core";
import { makeStepId } from "../__internal__/activity";
import type { StepActions } from "./StepActions";

export function makeStepActions(
getCoreActions: () => CoreStore["actions"] | undefined,
findTargetActivity: (activity: Activity[]) => Activity | undefined,
): StepActions<ActivityBaseParams> {
return {
pushStep(stepParams, options) {
const coreActions = getCoreActions();

if (!coreActions) {
throw new Error(
"Cannot perform any action since no implementation is available.",
);
}

const targetActivity = findTargetActivity(
coreActions.getStack().activities,
);

if (!targetActivity) {
throw new Error(
"Cannot push a step. The target activity is not found.",
);
}

const nextParams =
typeof stepParams === "function"
? stepParams(targetActivity.params)
: stepParams;
const stepId = makeStepId();

getCoreActions()?.stepPush({
coreActions.stepPush({
stepId,
stepParams,
stepParams: nextParams,
targetActivityId: options?.targetActivityId,
});
},
replaceStep(stepParams, options) {
const coreActions = getCoreActions();

if (!coreActions) {
throw new Error(
"Cannot perform any action since no implementation is available.",
);
}

const targetActivity = findTargetActivity(
coreActions.getStack().activities,
);

if (!targetActivity) {
throw new Error(
"Cannot push a step. The target activity is not found.",
);
}

const nextParams =
typeof stepParams === "function"
? stepParams(targetActivity.params)
: stepParams;
const stepId = makeStepId();

getCoreActions()?.stepReplace({
coreActions.stepReplace({
stepId,
stepParams,
stepParams: nextParams,
targetActivityId: options?.targetActivityId,
});
},
Expand Down
6 changes: 5 additions & 1 deletion integrations/react/src/future/stackflow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
makeCoreStore,
makeEvent,
} from "@stackflow/core";
import { findLatestActiveActivity } from "__internal__/activity/findLatestActiveActivity";
import React, { useMemo } from "react";
import MainRenderer from "../__internal__/MainRenderer";
import { makeActivityId } from "../__internal__/activity";
Expand Down Expand Up @@ -174,6 +175,9 @@ export function stackflow<
return {
Stack,
actions: makeActions(() => getCoreStore()?.actions),
stepActions: makeStepActions(() => getCoreStore()?.actions),
stepActions: makeStepActions(
() => getCoreStore()?.actions,
findLatestActiveActivity,
),
};
}
9 changes: 8 additions & 1 deletion integrations/react/src/future/useStepFlow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import type {
InferActivityParams,
RegisteredActivityName,
} from "@stackflow/config";
import { ActivityContext } from "__internal__/activity";
import { useContext } from "react";
import { useCoreActions } from "../__internal__/core";
import type { StepActions } from "./StepActions";
import { makeStepActions } from "./makeStepActions";
Expand All @@ -10,5 +12,10 @@ export function useStepFlow<ActivityName extends RegisteredActivityName>(
activityName: ActivityName,
): StepActions<InferActivityParams<ActivityName>> {
const coreActions = useCoreActions();
return makeStepActions(() => coreActions);
const { id } = useContext(ActivityContext);

return makeStepActions(
() => coreActions,
(activities) => activities.find((activity) => activity.id === id),
);
}

0 comments on commit d2c1b6d

Please sign in to comment.