Skip to content

[Feature] GraphPresenter should react to global provider state changes #166

Open
@shweaver-MSFT

Description

@shweaver-MSFT

Describe the problem this feature would solve

The GraphPresenter requires an IBaseRequestBuilder implementation to determine what data to fetch from Graph. We don't currently have a good way to define the RequestBuilder property in XAML, so this must be done from code. The problem is that if the provider state changes after the RequestBuilder property is set, the GraphPresenter will fail. The way to fix this is to nullify the RequestBuilder, and then re-set it.

Describe the solution

Update the GraphPresenter to listen for changes in the global provider state, and do whatever is required to keep the control functional after a login change.

The GraphPresenter should not display any content if the global provider is not signed in.

Describe alternatives you've considered

None

Additional context & Screenshots

All of this code is required to support a single instance of the GraphPresenter control:

namespace SampleTest.Samples.GraphPresenter
{
    public sealed partial class MailMessagesSample : Page
    {
        public IBaseRequestBuilder MessagesRequestBuilder { get; set; }

        public MailMessagesSample()
        {
            this.InitializeComponent();
            ProviderManager.Instance.ProviderUpdated += OnProviderUpdated;
            ProviderManager.Instance.ProviderStateChanged += OnProviderStateChanged;
        }

        private void OnProviderUpdated(object sender, IProvider provider)
        {
            if (provider == null)
            {
                ClearRequestBuilders();
            }
        }

        private void OnProviderStateChanged(object sender, ProviderStateChangedEventArgs e)
        {
            if (e.NewState == ProviderState.SignedIn)
            {
                var graphClient = ProviderManager.Instance.GlobalProvider.GetClient();

                MessagesRequestBuilder = graphClient.Me.Messages;
            }
            else
            {
                ClearRequestBuilders();
            }
        }

        private void ClearRequestBuilders()
        {
            MessagesRequestBuilder = null;
        }
    }
}
<controls:GraphPresenter
    IsCollection="True"
    RequestBuilder="{x:Bind MessagesRequestBuilder, Mode=OneWay}"
    ResponseType="graph:Message">
    <controls:GraphPresenter.ContentTemplate>
        <DataTemplate>
            ...
        </DataTemplate>
    </controls:GraphPresenter.ContentTemplate>
</controls:GraphPresenter>

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions