using Newtonsoft.Json.Linq; using ReactNative.Bridge; using System; using System.Collections.Generic; using Windows.ApplicationModel.Core; using Windows.ApplicationModel.DataTransfer; using Windows.UI.Core; namespace Cl.Json.RNShare { /// /// A module that allows JS to share data. /// class RNShareModule : NativeModuleBase { private readonly DataTransferManager _dataTransferManager; private readonly Queue _queue; /// /// Instantiates the . /// internal RNShareModule() { _dataTransferManager = DataTransferManager.GetForCurrentView(); _dataTransferManager.DataRequested += DataRequested; _queue = new Queue(); } /// /// The name of the native module. /// public override string Name { get { return "RNShare"; } } /// /// Open Share UI and provide data for sharing. /// /// [ReactMethod] public void open(JObject options, ICallback errorCallback, ICallback successCallback) { if (options != null) { var requestData = new RequestData { Title = options.Value("title"), Text = options.Value("share_text"), Url = options.Value("share_URL"), }; if (requestData.Text == null && requestData.Title == null && requestData.Url == null) { return; } RunOnDispatcher(() => { lock (_queue) { _queue.Enqueue(requestData); } try { DataTransferManager.ShowShareUI(); successCallback.Invoke("OK"); } catch { errorCallback.Invoke("not_available"); } }); } } private void DataRequested(DataTransferManager sender, DataRequestedEventArgs e) { var requestData = default(RequestData); lock (_queue) { requestData = _queue.Dequeue(); } if (requestData.Title != null) { e.Request.Data.Properties.Title = requestData.Title; } if (requestData.Text != null) { e.Request.Data.SetText(requestData.Text); } if (requestData.Url != null) { e.Request.Data.SetUri(new Uri(requestData.Url)); } } private static async void RunOnDispatcher(DispatchedHandler action) { await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, action); } private struct RequestData { public string Title; public string Text; public string Url; } } }