prepare loader ui

This commit is contained in:
Ilia Denisov
2026-03-15 21:14:09 +02:00
parent fbcf4cef99
commit 6179dadb5e
+65 -44
View File
@@ -25,6 +25,7 @@ type loader struct {
window fyne.Window window fyne.Window
textGrid *widget.TextGrid textGrid *widget.TextGrid
btn *widget.Button btn *widget.Button
fatalError bool
} }
const ( const (
@@ -38,10 +39,6 @@ var (
) )
func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*loader, error) { func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*loader, error) {
// cli, err := loadClientPlugin(s, conn, app, "./client.so", pluginInitSymbol)
// if err != nil {
// return nil, err
// }
l := &loader{ l := &loader{
app: app, app: app,
connector: conn, connector: conn,
@@ -67,6 +64,8 @@ func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*load
} }
/* /*
Комментарий временный, удалить после реализации.
# Порядок инициализации # Порядок инициализации
- При ошибках Connector: не фатальное состояние, отображать состояние недоступности сети, предлагать повторить попытку. - При ошибках Connector: не фатальное состояние, отображать состояние недоступности сети, предлагать повторить попытку.
@@ -83,64 +82,86 @@ func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*load
3. Загружаем libUIPluginFile full path в loadClientPlugin; 3. Загружаем libUIPluginFile full path в loadClientPlugin;
*/ */
func (l *loader) initUIPlugin() (mc.Client, error) { func (l *loader) initUIPlugin() (mc.Client, error) {
l.appendText(fmt.Sprintf("checking plugin at path: %s", libUIPluginFile)) // l.appendText(fmt.Sprintf("Checking client plugin at %s", libUIPluginFile))
exists, err := l.storage.FileExists(libUIPluginFile) // exists, err := l.storage.FileExists(libUIPluginFile)
if err != nil { // if err != nil {
l.appendFatalError(err) // l.appendFatalError(err)
return nil, err // return nil, err
} // }
if !exists { // if !exists {
l.appendText(fmt.Sprintf("plugin not found at %s, fetching available versions", libUIPluginFile)) // l.appendText("Client plugin not found, checking available versions")
v, err := l.connector.CheckVersion() // v, err := l.connector.CheckVersion()
if err != nil { // if err != nil {
l.appendFatalError(err) // l.appendError(err)
return nil, err // return nil, err
} // }
l.appendText(fmt.Sprintf("received %d versions", len(v))) // l.appendText(fmt.Sprintf("Received %d versions", len(v)))
latest, ok, err := latestVersion(v) // latest, ok, err := latestVersion(v)
if err != nil { // if err != nil {
l.appendFatalError(err) // l.appendError(err)
return nil, err // return nil, err
} // }
if !ok { // if !ok {
l.appendFatalError(errors.New("no latest version available from response")) // l.appendError(errors.New("Server did not responded with a suitable client version"))
return nil, err // return nil, err
} // }
_ = latest // l.appendText(fmt.Sprintf("Downloading version %s", latest.Version))
} else { // data, err := l.connector.DownloadVersion(latest.URL)
l.appendText(fmt.Sprintf("plugin found at %s", libUIPluginFile)) // if err != nil {
} // l.appendError(fmt.Errorf("Version %s download error: %w", latest.Version, err))
// implement this // return nil, err
// }
// err = l.storage.WriteFile(libUIPluginFile, data)
// if err != nil {
// l.appendFatalError(fmt.Errorf("Write plugin file error: %w", err))
// return nil, err
// }
// }
// l.appendText(fmt.Sprintf("Loading client plugin from %s", libUIPluginFile))
// cli, err := loadClientPlugin(s, conn, app, "./client.so", pluginInitSymbol)
// if err != nil {
// return nil, err
// }
return nil, nil return nil, nil
} }
func (l *loader) startLoading() { func (l *loader) startLoading() {
l.fatalError = false
fyne.Do(func() {
l.textGrid.SetText("")
l.btn.Hide()
l.btn.Disable()
})
l.appendText("Loading...") l.appendText("Loading...")
var err error var err error
l.client, err = l.initUIPlugin() l.client, err = l.initUIPlugin()
if err != nil { if err != nil {
fyne.Do(func() {
if l.fatalError {
l.btn.SetText("Quit")
l.appendText("Please re-install application.")
} else {
l.btn.SetText("Retry")
}
l.btn.Enable()
l.btn.Show()
l.window.Show() l.window.Show()
})
} }
} }
func (l *loader) onButtonAction() { func (l *loader) onButtonAction() {
if l.fatalError {
l.app.Quit() l.app.Quit()
} else {
go l.startLoading()
}
} }
func (l *loader) Run(ctx context.Context) error { func (l *loader) Run(ctx context.Context) error {
go l.startLoading() go l.startLoading()
l.app.Run() l.app.Run()
// l.window.Show()
// l.startLoading()
// select {
// case <-ctx.Done():
// return nil
// case <-l.await:
// return nil
// }
// final := make(chan struct{}, 1) // final := make(chan struct{}, 1)
// if l.connector != nil { // if l.connector != nil {
// go l.backgroundLoop(ctx, final) // go l.backgroundLoop(ctx, final)
@@ -159,12 +180,12 @@ func (l *loader) appendText(v string) {
} }
func (l *loader) appendError(err error) { func (l *loader) appendError(err error) {
l.appendText(fmt.Sprintf("Error: %s", err)) l.appendText(fmt.Sprintf(" %s", err))
} }
func (l *loader) appendFatalError(err error) { func (l *loader) appendFatalError(err error) {
l.appendError(err) l.appendError(err)
l.btn.Enable() l.fatalError = true
} }
func (l *loader) backgroundLoop(ctx context.Context, final <-chan struct{}) { func (l *loader) backgroundLoop(ctx context.Context, final <-chan struct{}) {