using System;
using System.Globalization;
using System.Text;
using System.Threading.Tasks;
using Abp.Configuration;
using Abp.Dependency;
using Abp.Extensions;
using Abp.Timing;
using Abp.Timing.Timezone;
namespace Abp.Web.Timing
{
///
/// This class is used to build timing script.
///
public class TimingScriptManager : ITimingScriptManager, ITransientDependency
{
private readonly ISettingManager _settingManager;
public TimingScriptManager(ISettingManager settingManager)
{
_settingManager = settingManager;
}
public async Task GetScriptAsync()
{
var script = new StringBuilder();
script.AppendLine("(function(){");
script.AppendLine(" abp.clock.provider = abp.timing." + Clock.Provider.GetType().Name.ToCamelCase() + " || abp.timing.localClockProvider;");
script.AppendLine(" abp.clock.provider.supportsMultipleTimezone = " + Clock.SupportsMultipleTimezone.ToString().ToLowerInvariant() + ";");
if (Clock.SupportsMultipleTimezone)
{
script.AppendLine(" abp.timing.timeZoneInfo = " + await GetUsersTimezoneScriptsAsync());
}
script.Append("})();");
return script.ToString();
}
private async Task GetUsersTimezoneScriptsAsync()
{
var timezoneId = await _settingManager.GetSettingValueAsync(TimingSettingNames.TimeZone);
var timezone = TimezoneHelper.FindTimeZoneInfo(timezoneId);
return " {" +
" windows: {" +
" timeZoneId: '" + timezoneId + "'," +
" baseUtcOffsetInMilliseconds: '" + timezone.BaseUtcOffset.TotalMilliseconds + "'," +
" currentUtcOffsetInMilliseconds: '" + timezone.GetUtcOffset(Clock.Now).TotalMilliseconds + "'," +
" isDaylightSavingTimeNow: '" + timezone.IsDaylightSavingTime(Clock.Now) + "'" +
" }," +
" iana: {" +
" timeZoneId:'" + TimezoneHelper.WindowsToIana(timezoneId) + "'" +
" }," +
" }";
}
}
}