|
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