CommunityToolkit / Graph-Controls

Set of Helpers and Controls for Windows development using the Microsoft Graph.
https://docs.microsoft.com/en-us/windows/communitytoolkit/graph/overview
Other
154 stars 39 forks source link

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

Open shweaver-MSFT opened 2 years ago

shweaver-MSFT commented 2 years ago

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>