// @flow import type { Color } from "config/colors"; export type TopicType = (msg: Buffer) => any; export type Topic = { state: string, command: string, defaultValue: Actual, values: Map, type?: TopicType }; export type Topics = Map; export type TopicDependentOption = ( internal: Internal, actual: Actual, state: State ) => T; export type StateDependentOption = ( internals: Map, actuals: Map, state: State ) => T; export interface UIControl { +type: string, +text: string, +topic: string } export interface Enableable { enableCondition?: TopicDependentOption } export type UIToggle = $ReadOnly<{| type: "toggle", text: string, topic: string, icon?: string, enableCondition?: TopicDependentOption, on?: string, off?: string, toggled?: TopicDependentOption |}>; export type UIDropDown = $ReadOnly<{| type: "dropDown", text: string, topic: string, icon?: string, enableCondition?: TopicDependentOption, options: Map, renderValue?: (value: string) => string |}>; export type UISlider = $ReadOnly<{| type: "slider", text: string, topic: string, icon?: string, enableCondition?: TopicDependentOption, min?: number, max?: number, step?: number, delayedApply?: boolean |}>; export type UISection = $ReadOnly<{| type: "section", text: string |}>; export type UILink = $ReadOnly<{| type: "link", text: string, link: string, enableCondition?: StateDependentOption, // TODO: check if both the following options are implemented icon?: string |}>; export type UIText = $ReadOnly<{| type: "text", text: string, topic: string, icon?: string |}>; export type UIProgress = $ReadOnly<{| type: "progress", text: string, topic: string, icon?: string, min?: number, max?: number |}>; export type ControlUI = UIToggle | UIDropDown | UISlider | UISection | UILink | UIText | UIProgress export type Control = { name: string, position: [number, number], icon: string | ( internals: Map, actuals: Map, state: State ) => string, iconColor?: ( internals: Map, actuals: Map, state: State ) => Color, ui: Array }; export type Controls = Map; export type Space = { name: string, color: "red" | "pink" | "purple" | "deepPurple" | "indigo" | "blue" | "lightBlue" | "cyan" | "teal" | "green" | "lightGreen" | "lime" | "yellow" | "amber" | "orange" | "deepOrange" | "brown" | "grey" | "blueGrey", mqtt: string }; export type Config = { space: Space, topics: Topics | Array, controls: Controls, layers: Array };