whispervis/widgets/upload.go

81 lines
1.7 KiB
Go
Raw Normal View History

2018-09-11 22:52:06 +03:00
package widgets
import (
"fmt"
"github.com/gopherjs/vecty"
"github.com/gopherjs/vecty/elem"
"github.com/gopherjs/vecty/event"
"github.com/gopherjs/vecty/prop"
"github.com/status-im/whispervis/jsapi"
)
// UploadWidget implements widget responsible for uploading JSON file.
type UploadWidget struct {
vecty.Core
handler func([]byte)
}
// NewUploadWidget creates a new upload widget.
func NewUploadWidget(handler func([]byte)) *UploadWidget {
return &UploadWidget{
handler: handler,
}
}
func (u *UploadWidget) Render() vecty.ComponentOrHTML {
return elem.Div(
2018-10-19 22:10:56 +02:00
vecty.Markup(
2018-10-22 21:21:36 +02:00
vecty.Class("file", "is-primary", "is-small"),
2018-10-19 22:10:56 +02:00
),
elem.Label(
2018-09-11 22:52:06 +03:00
vecty.Markup(
2018-10-19 22:10:56 +02:00
vecty.Class("file-label"),
),
elem.Input(
vecty.Markup(
vecty.Class("file-input"),
prop.ID("file"),
prop.Type("file"),
vecty.Property("accept", "application/json"), // TODO(divan): add prop.Accept PR
event.Input(u.onUploadClick),
),
),
elem.Span(
vecty.Markup(
vecty.Class("file-cta"),
),
2018-10-22 21:21:36 +02:00
elem.Span(
vecty.Markup(
vecty.Class("file-icon"),
),
elem.Italic(
vecty.Markup(
vecty.Class("fas", "fa-upload"),
),
),
),
2018-10-19 22:10:56 +02:00
elem.Span(
vecty.Markup(
vecty.Class("file-label"),
),
vecty.Text("Upload..."),
),
2018-09-11 22:52:06 +03:00
),
),
)
}
// onUploadClick implements callback for "Upload" button clicked event.
func (u *UploadWidget) onUploadClick(e *vecty.Event) {
// FIXME: run as a gorotine because GopherJS can't block JS thread in callback
go func() {
file := e.Target.Get("files").Index(0)
fmt.Println("File size:", file.Get("size"))
data := jsapi.NewFileReader().ReadAll(file)
u.handler(data)
}()
}