Web client for TLE Community.
app docs add-buildings.md
4.4 kB
Markdown
at main

Add code for Buildings #

To understand the following, you should first understand the React, Reflux data flow model as described in 'concepts'.

A new building window is created by a call to WindowActions.windowAdd passing in the building component (e.g. js/components/window/essentiavein) together with an object containing the options. (for example the ID of the building). This call is currently done in the js-yui/mapPlanet code.

Create a component for the building, e.g. js/components/window/essentiavein note that for simplicity this should be the same as the url for the building as defined in the API documentation (/essentiavein, /planetarycommand etc). Do not Camel case this one filename.

Use an existing building as a template for what to do. You can define some options for the window (width, height, title). The building will use one or more stores, most likely this will be the js/stores/rpc/building.js object, most buildings will have an additional attribute extraViewData which will hold data specific to that building e.g. planet in the case of the PCC. This is handled by the store and will most likely not need changing.

The building code will need StandardTabs (production, repair) which will be in all building types. Then you need to add your own Tabs (e.g. DrainTab for the essentiavein). This is where most of the new development will be done so use existing code as a guide and if possible re-use components (e.g. ship lists, trades etc.) rather than duplicating code.

Create Actions for API calls. #

On loading the building panel you will need to make a call to the API to request the building data via the view method. This may also need to be called again on making some changes (e.g. completing a trade, doing a repair etc.). In either case this should be by triggering the action e.g. requestRPCEssentiaVeinView.

You will also need to add calls for other actions, e.g. drain for the essentia vein. requestRPCEssentiaVeinDrain

Create an actions class for these calls, this should be based on the url for the building, e.g. js/stores/rpc/essentiaVein.js or js/stores/rpc/planetaryCommand

For each API call you need to create three actions, a request to trigger the call to the API, a success to handle the successfull reply and an error to handle any error condition. So, for the essentiaVein Drain command these actions would be

    'requestRPCEssentiaVeinDrain',
    'successRPCEssentiaVeinDrain',
    'failureRPCEssentiaVeinDrain',

Create Data Access Object (DAO) for all API calls #

Each set of calls to the API can be handled by a DAO module. For example js/dao/essentiaVein.js

The DAO module for a new building can be created by inspection of an existing module. All that it does is to listen for any of the request actions to be triggered, make the call to the API and then trigger either a success or a failure action as a result.

Create an Object Store for the building #

Some buildings will just need the 'default' store js/stores/rpc/building since all the data it needs will be contained within there, or within the extraViewData in that store.

On inspection, it looks like all building calls will put their data into the same extraViewData. This may change since some buildings will require stores for different things. e.g. Trade will require stores for the market for supply chains etc. So this is currently in flux.

TODO it may be best to have separate stores for buildings, e.g. stores for trade, stores for lists of ships etc.

Whatever the store, they will listen to actions caused by responses from the API. e.g. successRPCEssentiaVeinDrain action can be captured by creating a method onSuccessRPCEssentiaVeinDrain and taking the server response and updating the store.

When the store is updated, trigger an emit to update the store and this will result in all of the components listening to the store to be updated and re-rendered (thus completing the React loop).

Summary #

The files which are required for a new building are as follows (using the essentia-vein building as an example).

    js/components/window/essentiavein.jsx           - basic window
    js/components/window/essentiavein/drainTab.jsx  - one, or more, tabs
    js/actions/rpc/essentiaVein.jsx                 - API actions
    js/dao/essentiaVein.js                          - process API calls