import {html} from "lit"
import {MagicElement, mixinCss} from "@chasemoskal/magical"
import {styles} from "./style.css.js"
import {ButtonsView} from "./views/buttons.js"
import {MetabarView} from "./views/metabar.js"
import {NubBindingsEvent} from "../../events/bindings.js"
import {Bindings} from "../context/bindings/types/bindings.js"
import {GuiEditorPanelView} from "./views/gui-editor-panel.js"
import {TextEditorPanelView} from "./views/text-editor-panel.js"
import {default_mode} from "../context/bindings/default_bindings_schema.js"
import {setupContextGetter} from "../../framework/helpers/setup-context-getter.js"
@mixinCss(styles)
export class NubEditor extends MagicElement {
#getContext = setupContextGetter(this)
realize() {
const {use} = this
const context = this.#getContext()
const [bindingsDraft, setBindingsDraft, getBindingsDraft] =
use.state(() => context.bindings)
const [showSaveButton, setShowSaveButton] =
use.state(false)
const [editingApproach, setEditingApproach] =
use.state<"gui" | "text">("gui")
const availableModes = Object.keys(bindingsDraft.modes)
const [primaryMode = default_mode] = availableModes
const [, setMode, getMode] =
use.state(primaryMode)
use.setup(() =>
NubBindingsEvent
.target(context)
.listen(event => {
setBindingsDraft(event.detail.bindings)
setShowSaveButton(false)
})
)
function changeBindingsDraftAndShowSaveButton(b: Bindings) {
setBindingsDraft(b)
setShowSaveButton(true)
}
return html`
${MetabarView(
editingApproach,
function toggleApproach() {
setEditingApproach(
editingApproach === "gui"
? "text"
: "gui"
)
},
function resetDefault() {
context.reset_bindings_to_defaults()
},
)}
${editingApproach === "text"
? TextEditorPanelView({
bindingsDraft,
setBindingsDraft: changeBindingsDraftAndShowSaveButton,
})
: GuiEditorPanelView({
bindingsDraft,
setBindingsDraft: changeBindingsDraftAndShowSaveButton,
getBindingsDraft,
availableModes,
getMode,
setMode,
listenForCauseEventsOn: context,
})}
${ButtonsView(
showSaveButton,
function onSaveClick() {
context.bindings = getBindingsDraft()
},
)}
`
}
}