public SearchPage()
        {
            InitializeComponent();

            vm             = new SearchPageViewModel();
            BindingContext = vm;

            searchHandler = new NewsCategorySearchHandler();

            searchHandler.SearchQueryEvent += (obj, input) => {
                if (!string.IsNullOrWhiteSpace(input))
                {
                    try
                    {
                        // filter down the binding context
                        var filteredCategories = new AllNewsCategories()
                                                 .Where(cat => cat.DisplayName.Contains(input.ToUpper())).ToList();

                        vm.NewsCategories.Clear();
                        vm.NewsCategories = new ObservableRangeCollection <NewsCategory>(filteredCategories);
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine($"***** {ex} *****");
                    }
                }
                else
                {
                    vm.NewsCategories = new ObservableRangeCollection <NewsCategory>(new AllNewsCategories());
                }
            };

            Shell.SetSearchHandler(this, searchHandler);
        }
        async Task <List <NewsCategory> > GetUsersNewsCategories()
        {
            try
            {
                var loggedIn = authService.IsLoggedIn();

                if (!loggedIn)
                {
                    return(new List <NewsCategory>());
                }

                var dbResult = await Data.ListAsync <UserInterests>(
                    DefaultPartitions.UserDocuments
                    );

                var allNewsCats   = new AllNewsCategories();
                var userInterests = new List <UserInterests>();

                userInterests.AddRange(dbResult.CurrentPage.Items.Select(i => i.DeserializedValue));

                while (dbResult.HasNextPage)
                {
                    await dbResult.GetNextPageAsync();

                    userInterests.AddRange(dbResult.CurrentPage.Items.Select(i => i.DeserializedValue));
                }

                foreach (var interest in userInterests)
                {
                    var favoriteCategory = allNewsCats.First(c => c.CategoryName == interest.NewsCategoryName);
                    favoriteCategory.IsFavorite = true;

                    // add the tabs
                    var interestInfo = new InterestSubMessage
                    {
                        Category = favoriteCategory.CategoryName,
                        Title    = favoriteCategory.DisplayName
                    };

                    var msg = new AddInterestTabMessage {
                        InterestInfo = interestInfo
                    };

                    MessagingCenter.Send(msg, AddInterestTabMessage.AddTabMessage);
                }

                return(allNewsCats);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);

                return(new List <NewsCategory>());
            }
        }
        async Task <List <NewsCategory> > GetUsersNewsCategories()
        {
            try
            {
                var loggedIn = authService.IsLoggedIn();

                if (!loggedIn)
                {
                    return(new List <NewsCategory>());
                }

                var dbResult = await Data.ListAsync <UserInterest>(
                    DefaultPartitions.UserDocuments);

                var allNewsCats = new AllNewsCategories();

                var userInterests = new List <UserInterest>();

                // Get first page of results
                userInterests.AddRange(dbResult.CurrentPage.Items.Select(i => i.DeserializedValue));

                while (dbResult.HasNextPage)
                {
                    await dbResult.GetNextPageAsync();

                    userInterests.AddRange(dbResult.CurrentPage.Items.Select(i => i.DeserializedValue));
                }

                foreach (var interest in userInterests)
                {
                    allNewsCats.First(c => c.CategoryName == interest.NewsCategoryName)
                    .IsFavorite = true;
                }

                return(allNewsCats);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);

                return(new List <NewsCategory>());
            }
        }
        async Task <List <NewsCategory> > GetSavedUserInterests()
        {
            List <NewsCategory> usersFavoriteNewsCategories = new List <NewsCategory>();

            var userInterests = await GetUserInterestsFromCosmos();

            // Now loop through all the user interests
            // finding the match inside of the AllNewsCategories mark it as a fave
            // then add that fave to the return list
            var allNewsCategories = new AllNewsCategories();

            foreach (var item in userInterests)
            {
                var newsCategory = allNewsCategories.FirstOrDefault(nc => nc.CategoryName == item.NewsCategoryName);

                newsCategory.IsFavorite = true;

                usersFavoriteNewsCategories.Add(newsCategory);
            }

            return(usersFavoriteNewsCategories);
        }
        async Task <List <NewsCategory> > GetSavedUserInterests()
        {
            List <NewsCategory> usersFavoriteNewsCategories = new List <NewsCategory>();

            var userInterests = await GetUserInterestsFromCosmos();

            if (userInterests == null)
            {
                // try signing in again - most likey token expired
                await authService.Login();

                isCosmosInitialized = false;

                userInterests = await GetUserInterestsFromCosmos();

                // just keep on going  - it's a demo
                if (userInterests == null)
                {
                    userInterests = new List <UserInterest>();
                }
            }

            // Now loop through all the user interests
            // finding the match inside of the AllNewsCategories mark it as a fave
            // then add that fave to the return list
            var allNewsCategories = new AllNewsCategories();

            foreach (var item in userInterests)
            {
                var newsCategory = allNewsCategories.FirstOrDefault(nc => nc.CategoryName == item.NewsCategoryName);

                newsCategory.IsFavorite = true;

                usersFavoriteNewsCategories.Add(newsCategory);
            }

            return(usersFavoriteNewsCategories);
        }