Files
p4wnp1_aloa/web_client/hvueComponentWiFi.go
T

228 lines
6.9 KiB
Go

package main
import (
"github.com/HuckRidgeSW/hvue"
"github.com/gopherjs/gopherjs/js"
pb "github.com/mame82/P4wnP1_go/proto/gopherjs"
)
func InitComponentsWiFi() {
hvue.NewComponent(
"wifi",
hvue.Template(templateWiFi),
hvue.Computed("settings", func(vm *hvue.VM) interface{} {
return vm.Get("$store").Get("state").Get("wifiSettings")
}),
hvue.ComputedWithGetSet("enabled",
func(vm *hvue.VM) interface{} {
return !vm.Get("settings").Get("disabled").Bool()
},
func(vm *hvue.VM, newValue *js.Object) {
vm.Get("settings").Set("disabled", !newValue.Bool())
},
),
hvue.ComputedWithGetSet("enableNexmon",
func(vm *hvue.VM) interface{} {
return !vm.Get("settings").Get("disableNexmon").Bool()
},
func(vm *hvue.VM, newValue *js.Object) {
vm.Get("settings").Set("disableNexmon", !newValue.Bool())
},
),
hvue.Computed("wifiAuthModes", func(vm *hvue.VM) interface{} {
modes := js.Global.Get("Array").New()
for val,_ := range pb.WiFiSettings_APAuthMode_name {
mode := struct {
*js.Object
Label string `js:"label"`
Value int `js:"value"`
}{Object:O()}
mode.Value = val
switch pb.WiFiSettings_APAuthMode(val) {
case pb.WiFiSettings_WPA2_PSK:
mode.Label = "WPA2"
case pb.WiFiSettings_OPEN:
mode.Label = "Open"
default:
mode.Label = "Unknown"
}
modes.Call("push", mode)
}
return modes
}),
hvue.Computed("wifiModes", func(vm *hvue.VM) interface{} {
modes := js.Global.Get("Array").New()
for val,_ := range pb.WiFiSettings_Mode_name {
mode := struct {
*js.Object
Label string `js:"label"`
Value int `js:"value"`
}{Object:O()}
mode.Value = val
switch pb.WiFiSettings_Mode(val) {
case pb.WiFiSettings_AP:
mode.Label = "Access Point (AP)"
case pb.WiFiSettings_STA:
mode.Label = "Station (Client)"
case pb.WiFiSettings_STA_FAILOVER_AP:
mode.Label = "Client with Failover to AP"
default:
mode.Label = "Unknown"
}
modes.Call("push", mode)
}
return modes
}),
hvue.Method("reset",
func(vm *hvue.VM) {
vm.Get("$store").Call("dispatch", VUEX_ACTION_UPDATE_WIFI_SETTINGS_FROM_DEPLOYED)
}),
hvue.Method("deploy",
func(vm *hvue.VM, wifiSettings *jsWiFiSettings) {
vm.Get("$store").Call("dispatch", VUEX_ACTION_DEPLOY_WIFI_SETTINGS, wifiSettings)
}),
)
}
const templateWiFi = `
<q-page>
<q-card inline class="q-ma-sm">
<q-card-title>
WiFi settings
</q-card-title>
<q-card-actions>
<q-btn color="primary" @click="deploy(settings)" label="deploy"></q-btn>
<q-btn color="secondary" @click="reset" label="reset"></q-btn>
</q-card-actions>
<q-list link>
<q-item-separator />
<q-list-header>Generic</q-list-header>
<q-item tag="label">
<q-item-side>
<q-toggle v-model="enabled"></q-toggle>
</q-item-side>
<q-item-main>
<q-item-tile label>Enabled</q-item-tile>
<q-item-tile sublabel>Enable/Disable WiFi</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-side>
<q-toggle v-model="enableNexmon"></q-toggle>
</q-item-side>
<q-item-main>
<q-item-tile label>Nexmon</q-item-tile>
<q-item-tile sublabel>Enable/Disable modified nexmon firmware (needed for WiFi covert channel and KARMA)</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Regulatory domain</q-item-tile>
<q-item-tile sublabel>Regulatory domain according to ISO/IEC 3166-1 alpha2 (example "US")</q-item-tile>
<q-item-tile>
<q-input v-model="settings.reg" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Working Mode</q-item-tile>
<q-item-tile sublabel>Work as Access Point or Client</q-item-tile>
<q-item-tile>
<q-select v-model="settings.mode" :options="wifiModes" color="secondary" inverted></q-select>
</q-item-tile>
</q-item-main>
</q-item>
<template v-if="settings.mode != 0">
<q-item-separator />
<q-list-header>WiFi client settings (station mode)</q-list-header>
<q-item tag="label">
<q-item-main>
<q-item-tile label>SSID</q-item-tile>
<q-item-tile sublabel>Network name to connect</q-item-tile>
<q-item-tile>
<q-input v-model="settings.staSsid" color="primary" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Pre shared key</q-item-tile>
<q-item-tile sublabel>If empty, a network with Open Authentication is assumed (Warning: PLAIN TRANSMISSION)</q-item-tile>
<q-item-tile>
<q-input v-model="settings.staPsk" type="password" color="primary" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
</template>
<template v-if="settings.mode == 2">
<q-item-separator />
<q-item>
<q-item-main>
<q-alert type="warning">
If the SSID provided for station mode couldn't be connected, an attempt is started to failo-over to Access Point mode with settings below
</q-alert>
</q-item-main>
</q-item>
</template>
<template v-if="settings.mode != 1">
<q-item-separator />
<q-list-header>Access Point settings</q-list-header>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Channel</q-item-tile>
<q-item-tile sublabel>Must exist in regulatory domain (example 13)</q-item-tile>
<q-item-tile>
<q-input v-model="settings.channel" type="number" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Authentication Mode</q-item-tile>
<q-item-tile sublabel>Authentication Mode for Access Point (ignored for client mode)</q-item-tile>
<q-item-tile>
<q-select v-model="settings.authMode" :options="wifiAuthModes" color="primary" inverted></q-select>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>SSID</q-item-tile>
<q-item-tile sublabel>Network name (Service Set Identifier)</q-item-tile>
<q-item-tile>
<q-input v-model="settings.apSsid" color="primary" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-side>
<q-toggle v-model="settings.hideSsid"></q-toggle>
</q-item-side>
<q-item-main>
<q-item-tile label>Hide SSID</q-item-tile>
<q-item-tile sublabel>Access Point doesn't send beacons with its SSID</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Pre shared key</q-item-tile>
<q-item-tile sublabel>Warning: PLAIN TRANSMISSION</q-item-tile>
<q-item-tile>
<q-input v-model="settings.apPsk" type="password" color="primary" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
</template>
</q-list>
</q-card>
</q-page>
`