-
Notifications
You must be signed in to change notification settings - Fork 115
Expand file tree
/
Copy pathPluginRenderer.tsx
More file actions
75 lines (67 loc) · 2 KB
/
Copy pathPluginRenderer.tsx
File metadata and controls
75 lines (67 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import type { ActivityComponentType } from "./activity";
import { ActivityProvider } from "./activity";
import { useCoreState } from "./core";
import { usePlugins } from "./plugins";
import { StackProvider } from "./stack";
import type { StackflowReactPlugin } from "./StackflowReactPlugin";
import type { WithRequired } from "./utils";
interface PluginRendererProps {
activityComponentMap: {
[key: string]: ActivityComponentType;
};
plugin: WithRequired<ReturnType<StackflowReactPlugin>, "render">;
}
const PluginRenderer = ({
activityComponentMap,
plugin,
}: PluginRendererProps) => {
const coreState = useCoreState();
const plugins = usePlugins();
return plugin.render({
stack: {
...coreState,
render(overrideStack) {
const stack = {
...coreState,
...overrideStack,
};
return {
activities: stack.activities.map((activity) => ({
...activity,
key: activity.id,
render(overrideActivity) {
const Activity = activityComponentMap[activity.name];
let output: React.ReactNode = (
<Activity params={activity.params} />
);
plugins.forEach((p) => {
output =
p.wrapActivity?.({
activity: {
...activity,
render: () => output,
},
}) ?? output;
});
return (
<StackProvider value={stack}>
<ActivityProvider
key={activity.id}
value={{
...activity,
...overrideActivity,
}}
>
{output}
</ActivityProvider>
</StackProvider>
);
},
})),
};
},
},
});
};
PluginRenderer.displayName = "PluginRenderer";
export default PluginRenderer;