diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index fda8b75..ff857ad 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -253,7 +253,7 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader { _, canShare := page.mp.(mediaprovider.SupportsSharing) if canShare { share := fyne.NewMenuItem("Share...", func() { - a.page.contr.CreateShareURL(a.albumID) + a.page.contr.ShowShareDialog(a.albumID) }) share.Icon = myTheme.ShareIcon menuItems = append(menuItems, share) diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index 5201444..4c69c65 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -329,7 +329,7 @@ func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader { a.menuBtn.OnTapped = func() { if pop == nil { share := fyne.NewMenuItem("Share...", func() { - a.artistPage.contr.CreateShareURL(a.artistID) + a.artistPage.contr.ShowShareDialog(a.artistID) }) share.Icon = myTheme.ShareIcon menu := fyne.NewMenu("", share) diff --git a/ui/controller/controller.go b/ui/controller/controller.go index 303105f..c107449 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -7,6 +7,7 @@ import ( "image" "io" "log" + "net/url" "os" "path/filepath" "time" @@ -144,7 +145,7 @@ func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widget _, canShare := m.App.ServerManager.Server.(mediaprovider.SupportsSharing) if canShare { tracklist.OnShare = func(trackID string) { - go m.CreateShareURL(trackID) + go m.ShowShareDialog(trackID) } } } @@ -186,7 +187,7 @@ func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) { _, canShare := m.App.ServerManager.Server.(mediaprovider.SupportsSharing) if canShare { grid.OnShare = func(albumID string) { - go m.CreateShareURL(albumID) + go m.ShowShareDialog(albumID) } } } @@ -678,16 +679,10 @@ func (c *Controller) SetTrackRatings(trackIDs []string, rating int) { } } -func (c *Controller) CreateShareURL(id string) { +func (c *Controller) ShowShareDialog(id string) { go func() { - r, ok := c.App.ServerManager.Server.(mediaprovider.SupportsSharing) - if !ok { - return - } - - shareUrl, err := r.CreateShareURL(id) + shareUrl, err := c.createShareURL(id) if err != nil { - log.Printf("error creating share URL: %v", err) return } @@ -699,15 +694,11 @@ func (c *Controller) CreateShareURL(id string) { c.MainWindow.Clipboard().SetContent(hyperlink.Text) }), widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), func() { - shareUrl, err := r.CreateShareURL(id) - if err != nil { - log.Printf("error creating share URL: %v", err) - return + if shareUrl, err := c.createShareURL(id); err == nil { + hyperlink.Text = shareUrl.String() + hyperlink.URL = shareUrl + hyperlink.Refresh() } - - hyperlink.Text = shareUrl.String() - hyperlink.URL = shareUrl - hyperlink.Refresh() }), ), c.MainWindow, @@ -716,6 +707,24 @@ func (c *Controller) CreateShareURL(id string) { }() } +func (c *Controller) createShareURL(id string) (*url.URL, error) { + r, ok := c.App.ServerManager.Server.(mediaprovider.SupportsSharing) + if !ok { + return nil, fmt.Errorf("server does not support sharing") + } + + shareUrl, err := r.CreateShareURL(id) + if err != nil { + log.Printf("error creating share URL: %v", err) + c.showError( + "Failed to share content. This commonly occurs when the server does not support sharing," + + "or has the feature disabled.\nPlease check the server's settings and try again.", + ) + return nil, err + } + return shareUrl, nil +} + func (c *Controller) ShowDownloadDialog(tracks []*mediaprovider.Track, downloadName string) { numTracks := len(tracks) var fileName string @@ -816,6 +825,11 @@ func (c *Controller) sendNotification(title, content string) { }) } +func (c *Controller) showError(content string) { + // TODO: display an in-app toast message instead of a dialog. + dialog.ShowError(fmt.Errorf(content), c.MainWindow) +} + func (c *Controller) ShowAlbumInfoDialog(albumID, albumName string, albumCover image.Image) { go func() { albumInfo, err := c.App.ServerManager.Server.GetAlbumInfo(albumID)