package main
import (
"image/color"
"gioui.org/app"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/unit"
"gioui.org/widget"
"gioui.org/widget/material"
"github.com/Queueue0/qpass/internal/models"
"github.com/Queueue0/qpass/internal/validator"
)
func (a *Application) AddView(w *app.Window) (models.Password, error) {
var ops op.Ops
var serviceName widget.Editor
var userName widget.Editor
var password widget.Editor
var addBtn widget.Clickable
var v validator.Validator
var np models.Password
th := material.NewTheme()
for {
switch e := w.Event().(type) {
case app.FrameEvent:
gtx := app.NewContext(&ops, e)
if addBtn.Clicked(gtx) {
sn, un, pw := serviceName.Text(), userName.Text(), password.Text()
// Validate data
v = validator.Validator{}
v.CheckField(validator.NotBlank(sn), "service", "Service Name cannot be blank")
if v.Valid() {
id, err := a.PasswordModel.Insert(*a.ActiveUser, sn, un, pw)
if err != nil {
return models.Password{}, err
}
np = models.Password{
ID: id,
UserID: a.ActiveUser.ID,
ServiceName: sn,
Username: un,
Password: pw,
}
return np, nil
}
}
layout.Flex{
Axis: layout.Vertical,
Spacing: layout.SpaceEnd,
}.Layout(gtx,
layout.Rigid(
func(gtx layout.Context) layout.Dimensions {
if v.Valid() {
return layout.Dimensions{}
}
errTxt, in := v.FieldErrors["service"]
if !in {
return layout.Dimensions{}
}
txt := material.Body1(th, errTxt)
txt.Color = color.NRGBA{R: 244, G: 67, B: 54, A: 255}
margins := layout.UniformInset(unit.Dp(10))
margins.Bottom = 0
return margins.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return txt.Layout(gtx)
},
)
},
),
layout.Rigid(
func(gtx layout.Context) layout.Dimensions {
txt := material.Editor(th, &serviceName, "Service Name")
serviceName.SingleLine = true
serviceName.Submit = true
margins := layout.UniformInset(unit.Dp(10))
padding := layout.UniformInset(inputPadding)
border := widget.Border{
Color: borderColor,
CornerRadius: unit.Dp(1),
Width: unit.Dp(2),
}
return margins.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return border.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return padding.Layout(gtx, txt.Layout)
},
)
},
)
},
),
layout.Rigid(
func(gtx layout.Context) layout.Dimensions {
txt := material.Editor(th, &userName, "Username")
userName.SingleLine = true
userName.Submit = true
margins := layout.UniformInset(unit.Dp(10))
padding := layout.UniformInset(inputPadding)
border := widget.Border{
Color: borderColor,
CornerRadius: unit.Dp(1),
Width: unit.Dp(2),
}
return margins.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return border.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return padding.Layout(gtx, txt.Layout)
},
)
},
)
},
),
layout.Rigid(
func(gtx layout.Context) layout.Dimensions {
txt := material.Editor(th, &password, "Password")
password.SingleLine = true
password.Submit = true
margins := layout.UniformInset(unit.Dp(10))
padding := layout.UniformInset(inputPadding)
border := widget.Border{
Color: borderColor,
CornerRadius: unit.Dp(1),
Width: unit.Dp(2),
}
return margins.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return border.Layout(gtx,
func(gtx layout.Context) layout.Dimensions {
return padding.Layout(gtx, txt.Layout)
},
)
},
)
},
),
layout.Rigid(
func(gtx layout.Context) layout.Dimensions {
margins := layout.UniformInset(unit.Dp(10))
btn := material.Button(th, &addBtn, "+ Add")
return margins.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return btn.Layout(gtx)
})
},
),
)
e.Frame(gtx.Ops)
case app.DestroyEvent:
return np, e.Err
}
}
}