Skip to content

Commit 91b6d25

Browse files
committed
Fix scenario web code
1 parent 9be43e9 commit 91b6d25

3 files changed

Lines changed: 71 additions & 69 deletions

File tree

exp_scenario/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as lib from "@clusterio/lib";
2-
import * as Messages from "./messages";
2+
// import * as Messages from "./messages";
33

44
lib.definePermission({
55
name: "exp_scenario.config.view",
@@ -24,11 +24,13 @@ export const plugin: lib.PluginDeclaration = {
2424
controllerEntrypoint: "./dist/node/controller",
2525
instanceEntrypoint: "./dist/node/instance",
2626

27+
/*
2728
messages: [
2829
],
2930
3031
webEntrypoint: "./web",
3132
routes: [
3233
"/exp_scenario",
3334
],
35+
*/
3436
};

exp_scenario/web/index.tsx

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +0,0 @@
1-
import React, {
2-
useContext, useEffect, useState,
3-
useCallback, useSyncExternalStore,
4-
} from "react";
5-
6-
// import {
7-
//
8-
// } from "antd";
9-
10-
import {
11-
BaseWebPlugin, PageLayout, PageHeader, Control, ControlContext, notifyErrorHandler,
12-
} from "@clusterio/web_ui";
13-
14-
import {
15-
PluginExampleEvent, PluginExampleRequest,
16-
ExampleSubscribableUpdate, ExampleSubscribableValue,
17-
} from "../messages";
18-
19-
import * as lib from "@clusterio/lib";
20-
21-
function MyTemplatePage() {
22-
const control = useContext(ControlContext);
23-
const plugin = control.plugins.get("exp_scenario") as WebPlugin;
24-
const [subscribableData, synced] = plugin.useSubscribableData();
25-
26-
return <PageLayout nav={[{ name: "exp_scenario" }]}>
27-
<PageHeader title="exp_scenario" />
28-
Synced: {String(synced)} Data: {JSON.stringify([...subscribableData.values()])}
29-
</PageLayout>;
30-
}
31-
32-
export class WebPlugin extends BaseWebPlugin {
33-
subscribableData = new lib.EventSubscriber(ExampleSubscribableUpdate, this.control);
34-
35-
async init() {
36-
this.pages = [
37-
{
38-
path: "/exp_scenario",
39-
sidebarName: "exp_scenario",
40-
// This permission is client side only, so it must match the permission string of a resource request to be secure
41-
// An undefined value means that the page will always be visible
42-
permission: "exp_scenario.example.permission.subscribe",
43-
content: <MyTemplatePage/>,
44-
},
45-
];
46-
47-
this.control.handle(PluginExampleEvent, this.handlePluginExampleEvent.bind(this));
48-
this.control.handle(PluginExampleRequest, this.handlePluginExampleRequest.bind(this));
49-
}
50-
51-
useSubscribableData() {
52-
const control = useContext(ControlContext);
53-
const subscribe = useCallback((callback: () => void) => this.subscribableData.subscribe(callback), [control]);
54-
return useSyncExternalStore(subscribe, () => this.subscribableData.getSnapshot());
55-
}
56-
57-
async handlePluginExampleEvent(event: PluginExampleEvent) {
58-
this.logger.info(JSON.stringify(event));
59-
}
60-
61-
async handlePluginExampleRequest(request: PluginExampleRequest) {
62-
this.logger.info(JSON.stringify(request));
63-
return {
64-
myResponseString: request.myString,
65-
myResponseNumbers: request.myNumberArray,
66-
};
67-
}
68-
}

exp_scenario/web/~index.tsx

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import React, {
2+
useContext, useEffect, useState,
3+
useCallback, useSyncExternalStore,
4+
} from "react";
5+
6+
// import {
7+
//
8+
// } from "antd";
9+
10+
import {
11+
BaseWebPlugin, PageLayout, PageHeader, Control, ControlContext, notifyErrorHandler,
12+
} from "@clusterio/web_ui";
13+
14+
import {
15+
PluginExampleEvent, PluginExampleRequest,
16+
ExampleSubscribableUpdate, ExampleSubscribableValue,
17+
} from "../messages";
18+
19+
import * as lib from "@clusterio/lib";
20+
21+
function MyTemplatePage() {
22+
const control = useContext(ControlContext);
23+
const plugin = control.plugins.get("exp_scenario") as WebPlugin;
24+
const [subscribableData, synced] = plugin.useSubscribableData();
25+
26+
return <PageLayout nav={[{ name: "exp_scenario" }]}>
27+
<PageHeader title="exp_scenario" />
28+
Synced: {String(synced)} Data: {JSON.stringify([...subscribableData.values()])}
29+
</PageLayout>;
30+
}
31+
32+
export class WebPlugin extends BaseWebPlugin {
33+
subscribableData = new lib.EventSubscriber(ExampleSubscribableUpdate, this.control);
34+
35+
async init() {
36+
this.pages = [
37+
{
38+
path: "/exp_scenario",
39+
sidebarName: "exp_scenario",
40+
// This permission is client side only, so it must match the permission string of a resource request to be secure
41+
// An undefined value means that the page will always be visible
42+
permission: "exp_scenario.example.permission.subscribe",
43+
content: <MyTemplatePage/>,
44+
},
45+
];
46+
47+
this.control.handle(PluginExampleEvent, this.handlePluginExampleEvent.bind(this));
48+
this.control.handle(PluginExampleRequest, this.handlePluginExampleRequest.bind(this));
49+
}
50+
51+
useSubscribableData() {
52+
const control = useContext(ControlContext);
53+
const subscribe = useCallback((callback: () => void) => this.subscribableData.subscribe(callback), [control]);
54+
return useSyncExternalStore(subscribe, () => this.subscribableData.getSnapshot());
55+
}
56+
57+
async handlePluginExampleEvent(event: PluginExampleEvent) {
58+
this.logger.info(JSON.stringify(event));
59+
}
60+
61+
async handlePluginExampleRequest(request: PluginExampleRequest) {
62+
this.logger.info(JSON.stringify(request));
63+
return {
64+
myResponseString: request.myString,
65+
myResponseNumbers: request.myNumberArray,
66+
};
67+
}
68+
}

0 commit comments

Comments
 (0)