5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 05:00:31 +08:00
wails/runtime/store.go
2020-08-30 15:46:50 +10:00

118 lines
2.4 KiB
Go

package runtime
// Options defines the optional data that may be used
// when creating a Store
type Options struct {
// The name of the store
Name string
// The runtime to attach the store to
Runtime *Runtime
// Indicates if notifying Go listeners should be notified of updates
// synchronously (on the current thread) or asynchronously using
// goroutines
NotifySynchronously bool
}
type StoreProvider struct {
runtime *Runtime
}
func NewStoreProvider(runtime *Runtime) *StoreProvider {
return &StoreProvider{
runtime: runtime,
}
}
// Store is where we keep named data
type Store struct {
name string
data interface{}
eventPrefix string
callbacks []func(interface{})
runtime *Runtime
notifySynchronously bool
}
// New creates a new store
func (p *StoreProvider) New(name string) *Store {
result := Store{
name: name,
runtime: p.runtime,
}
result.setupListner()
return &result
}
// NewWithOptions creates a new store with the given options
func (p *StoreProvider) NewWithOptions(options Options) *Store {
result := Store{
name: options.Name,
notifySynchronously: options.NotifySynchronously,
}
return &result
}
func (s *Store) setupListner() {
// Setup listener
s.runtime.Events.On("wails:sync:store:updated:"+s.name, func(data ...interface{}) {
// store the data
s.data = data[0]
// Notify listeners
s.notify()
})
}
// notify the listeners of the current data state
func (s *Store) notify() {
// Notify callbacks
for _, callback := range s.callbacks {
if s.notifySynchronously {
callback(s.data)
} else {
go callback(s.data)
}
}
}
// Set will update the data held by the store
// and notify listeners of the change
func (s *Store) Set(data interface{}) {
// Save data
s.data = data
// Emit event
s.runtime.Events.Emit("wails:sync:store:updated:"+s.name, s.data)
// Notify listeners
s.notify()
}
// Subscribe will subscribe to updates to the store by
// providing a callback. Any updates to the store are sent
// to the callback
func (s *Store) Subscribe(callback func(interface{})) {
s.callbacks = append(s.callbacks, callback)
}
// Update takes a function that is passed the current state.
// The result of that function is then set as the new state
// of the store. This will notify listeners of the change
func (s *Store) Update(updater func(interface{}) interface{}) {
newData := updater(s.data)
s.Set(newData)
}