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;
}
}
}