import {html, LitElement} from "lit"
import {property} from "lit/decorators.js"
import {Bindings} from "./bindings/types/bindings.js"
import {set_initial_modes} from "./utils/set_initial_modes.js"
import {Bindings_Controller} from "./bindings/bindings_controller.js"
import {NubModesEvent} from "../../events/modes.js"
import {NubEffectEvent} from "../../events/effect.js"
import {NubBindingsEvent} from "../../events/bindings.js"
import {BindingsSchema} from "./bindings/types/bindings-schema.js"
import {setup_modes_and_handle_changes} from "./setups/setup_modes_and_handle_changes.js"
import {setup_effects_and_readable_proxy} from "./setups/setup_effects_and_readable_proxy.js"
import {setup_cause_and_effect_translation} from "./setups/setup_cause_and_effect_translation.js"
export class NubContext extends LitElement {
@property({type: String})
["name"]: string = "default"
@property({type: String})
["initial-modes"]: string = "humanoid"
@property({type: String, reflect: true})
modes: string = ""
get effects() {
return this.#effects.readable
}
get schema() {
return this.#bindings_controller.schema
}
set schema(schema: BindingsSchema) {
this.#bindings_controller.schema = schema
}
get bindings() {
return this.#bindings_controller.bindings
}
set bindings(b: Bindings) {
this.#bindings_controller.bindings = b
}
reset_bindings_to_defaults() {
this.#bindings_controller.bindings = this.#bindings_controller.defaults
}
modes_set = setup_modes_and_handle_changes(modes => {
this.modes = modes.array().join(" ")
NubModesEvent
.target(this)
.dispatch({modes})
})
#bindings_controller = new Bindings_Controller({
storage: localStorage,
on_bindings_change: bindings =>
NubBindingsEvent
.target(this)
.dispatch({bindings}),
})
#effects = setup_effects_and_readable_proxy()
#translate = setup_cause_and_effect_translation({
modes: this.modes_set.readable,
effects: this.#effects.writable,
get_current_bindings: () => this.#bindings_controller.bindings,
dispatch_effect: detail =>
NubEffectEvent
.target(this)
.dispatch(detail),
})
firstUpdated() {
set_initial_modes(this.modes_set, this["initial-modes"])
this.#bindings_controller.storage_key = "nub_bindings_" + this["name"]
this.#bindings_controller.load_from_storage()
}
render() {
return html`
`
}
}