private async void ScannerOnDisappearing(object sender, EventArgs e)
        {
            const string genericErrorMessage =
                "Sorry, an error occurred when adding the book to your library. Try again later.";
            var scanner = sender as Scanner;
            var result  = scanner?.ScanResult;

            // try disconnecting the event handler
            if (scanner != null)
            {
                scanner.Disappearing -= ScannerOnDisappearing;
            }

            if (string.IsNullOrEmpty(result))
            {
                return;
            }

            try
            {
                // notify the user
                ToastService.Info($"Scanned ISBN: {result}. Adding to your library.");

                // call the service
                await _bookService.AddByIsbn(result);

                ToastService.Success("Book successfully added to your library");

                // refresh the library
                await pageHome.LoadData();

                await pageLibrary.LoadData();
            }
            catch (ApiException ex) when(ex.IsValidationException())
            {
                var error = await ex.GetContentAsAsync <ValidationErrorViewModel>();

                ToastService.Error(error?.Message?.Length > 0 ? error.Message[0] : genericErrorMessage);
            }
            catch (ApiException ex)
            {
                var error = await ex.GetContentAsAsync <ErrorViewModel>();

                ToastService.Error(error?.Message?.Length > 0 ? error.Message : genericErrorMessage);
            }
        }
        protected async void Add(object sender, EventArgs e)
        {
            const string genericErrorMessage =
                "Sorry, an error occurred when adding the book to your library. Try again later.";
            var isbn = txtIsbn.Text;

            if (string.IsNullOrWhiteSpace(isbn))
            {
                ToastService.Error("An isbn is required.");
                return;
            }

            stkBtns.IsVisible   = false;
            prgAdding.IsVisible = true;

            try
            {
                await _bookService.AddByIsbn(isbn);

                // notify user
                ToastService.Success("Book successfully added to your library.");

                // send data back
                Dismiss("");
            }
            catch (ApiException ex) when(ex.IsValidationException())
            {
                var error = await ex.GetContentAsAsync <ValidationErrorViewModel>();

                ToastService.Error(error?.Message?.Length > 0 ? error.Message[0] : genericErrorMessage);
            }
            catch (ApiException ex)
            {
                var error = await ex.GetContentAsAsync <ErrorViewModel>();

                ToastService.Error(!string.IsNullOrWhiteSpace(error?.Message) ? error.Message : genericErrorMessage);
            }
            finally
            {
                stkBtns.IsVisible   = true;
                prgAdding.IsVisible = false;
            }
        }