diff --git a/client/loader/loader.go b/client/loader/loader.go index 87b8f0e..58bbf1a 100644 --- a/client/loader/loader.go +++ b/client/loader/loader.go @@ -18,13 +18,14 @@ import ( type ClientInit func(storage.UIStorage, connector.UIConnector, fyne.App) (mc.Client, error) type loader struct { - app fyne.App - storage storage.Storage - connector connector.Connector - client mc.Client - window fyne.Window - textGrid *widget.TextGrid - btn *widget.Button + app fyne.App + storage storage.Storage + connector connector.Connector + client mc.Client + window fyne.Window + textGrid *widget.TextGrid + btn *widget.Button + fatalError bool } const ( @@ -38,10 +39,6 @@ var ( ) 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{ app: app, connector: conn, @@ -67,6 +64,8 @@ func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*load } /* +Комментарий временный, удалить после реализации. + # Порядок инициализации - При ошибках Connector: не фатальное состояние, отображать состояние недоступности сети, предлагать повторить попытку. @@ -83,64 +82,86 @@ func NewLoader(s storage.Storage, conn connector.Connector, app fyne.App) (*load 3. Загружаем libUIPluginFile full path в loadClientPlugin; */ func (l *loader) initUIPlugin() (mc.Client, error) { - l.appendText(fmt.Sprintf("checking plugin at path: %s", libUIPluginFile)) - exists, err := l.storage.FileExists(libUIPluginFile) - if err != nil { - l.appendFatalError(err) - return nil, err - } - if !exists { - l.appendText(fmt.Sprintf("plugin not found at %s, fetching available versions", libUIPluginFile)) - v, err := l.connector.CheckVersion() - if err != nil { - l.appendFatalError(err) - return nil, err - } - l.appendText(fmt.Sprintf("received %d versions", len(v))) - latest, ok, err := latestVersion(v) - if err != nil { - l.appendFatalError(err) - return nil, err - } - if !ok { - l.appendFatalError(errors.New("no latest version available from response")) - return nil, err - } - _ = latest - } else { - l.appendText(fmt.Sprintf("plugin found at %s", libUIPluginFile)) - } - // implement this + // l.appendText(fmt.Sprintf("Checking client plugin at %s", libUIPluginFile)) + // exists, err := l.storage.FileExists(libUIPluginFile) + // if err != nil { + // l.appendFatalError(err) + // return nil, err + // } + // if !exists { + // l.appendText("Client plugin not found, checking available versions") + // v, err := l.connector.CheckVersion() + // if err != nil { + // l.appendError(err) + // return nil, err + // } + // l.appendText(fmt.Sprintf("Received %d versions", len(v))) + // latest, ok, err := latestVersion(v) + // if err != nil { + // l.appendError(err) + // return nil, err + // } + // if !ok { + // l.appendError(errors.New("Server did not responded with a suitable client version")) + // return nil, err + // } + // l.appendText(fmt.Sprintf("Downloading version %s", latest.Version)) + // data, err := l.connector.DownloadVersion(latest.URL) + // if err != nil { + // l.appendError(fmt.Errorf("Version %s download error: %w", latest.Version, err)) + // 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 } func (l *loader) startLoading() { + l.fatalError = false + fyne.Do(func() { + l.textGrid.SetText("") + l.btn.Hide() + l.btn.Disable() + }) l.appendText("Loading...") var err error l.client, err = l.initUIPlugin() if err != nil { - l.window.Show() + 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() + }) } } func (l *loader) onButtonAction() { - l.app.Quit() + if l.fatalError { + l.app.Quit() + } else { + go l.startLoading() + } } func (l *loader) Run(ctx context.Context) error { go l.startLoading() l.app.Run() - // l.window.Show() - // l.startLoading() - - // select { - // case <-ctx.Done(): - // return nil - // case <-l.await: - // return nil - // } - // final := make(chan struct{}, 1) // if l.connector != nil { // go l.backgroundLoop(ctx, final) @@ -159,12 +180,12 @@ func (l *loader) appendText(v string) { } 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) { l.appendError(err) - l.btn.Enable() + l.fatalError = true } func (l *loader) backgroundLoop(ctx context.Context, final <-chan struct{}) {