From c1a2cb73e4c0c2bd01e73a40ace2443f4416d424 Mon Sep 17 00:00:00 2001 From: berkansasmaz Date: Thu, 2 Dec 2021 15:35:28 +0300 Subject: [PATCH] Implementation of payment design --- .../Pages/Payment/PostCheckout.cshtml.cs | 26 +- .../Pages/Payment/PreCheckout.cshtml.cs | 24 +- src/EventHub.Web/EventHubWebModule.cs | 34 +-- src/EventHub.Web/Pages/Empty.cshtml | 2 +- ..._upgradeOrExtendOrganizationSection.cshtml | 56 +++++ .../Pages/Organizations/Profile.cshtml | 43 +--- .../Pages/Organizations/Profile.js | 29 ++- .../Payment/CustomPostCheckout.cshtml.cs | 77 ++++++ .../Pages/Payment/PostCheckout.cshtml | 23 +- .../Pages/Payment/PreCheckout.cshtml | 115 +++------ src/EventHub.Web/Pages/Pricing.cshtml | 231 ++++++++---------- src/EventHub.Web/wwwroot/assets/success.svg | 1 + 12 files changed, 357 insertions(+), 304 deletions(-) create mode 100644 src/EventHub.Web/Pages/Organizations/Components/_upgradeOrExtendOrganizationSection.cshtml create mode 100644 src/EventHub.Web/Pages/Payment/CustomPostCheckout.cshtml.cs create mode 100644 src/EventHub.Web/wwwroot/assets/success.svg diff --git a/modules/payment/src/Payment.Web/Pages/Payment/PostCheckout.cshtml.cs b/modules/payment/src/Payment.Web/Pages/Payment/PostCheckout.cshtml.cs index 26e5c54..377b247 100644 --- a/modules/payment/src/Payment.Web/Pages/Payment/PostCheckout.cshtml.cs +++ b/modules/payment/src/Payment.Web/Pages/Payment/PostCheckout.cshtml.cs @@ -16,42 +16,42 @@ namespace Payment.Web.Pages.Payment public string GoBackLink { get; set; } - private readonly IPaymentRequestAppService _paymentRequestAppService; - private readonly PaymentWebOptions _paymentWebOptions; - private readonly IPaymentUrlBuilder _paymentUrlBuilder; + protected IPaymentRequestAppService PaymentRequestAppService { get; } + protected PaymentWebOptions PaymentWebOptions { get; } + protected IPaymentUrlBuilder PaymentUrlBuilder { get; } public PostCheckoutPageModel( IPaymentRequestAppService appService, IOptions paymentWebOptions, IPaymentUrlBuilder paymentUrlBuilder) { - _paymentRequestAppService = appService; - _paymentWebOptions = paymentWebOptions.Value; - _paymentUrlBuilder = paymentUrlBuilder; + PaymentRequestAppService = appService; + PaymentWebOptions = paymentWebOptions.Value; + PaymentUrlBuilder = paymentUrlBuilder; } - public async Task OnGetAsync() + public virtual async Task OnGetAsync() { if (Token.IsNullOrWhiteSpace()) { return BadRequest(); } - PaymentRequest = await _paymentRequestAppService.CompleteAsync(Token); + PaymentRequest = await PaymentRequestAppService.CompleteAsync(Token); - GoBackLink = _paymentUrlBuilder.BuildCheckoutUrl(PaymentRequest.Id).AbsoluteUri; + GoBackLink = PaymentUrlBuilder.BuildCheckoutUrl(PaymentRequest.Id).AbsoluteUri; if (PaymentRequest.State == PaymentRequestState.Completed - && !_paymentWebOptions.PaymentSuccessfulCallbackUrl.IsNullOrWhiteSpace()) + && !PaymentWebOptions.PaymentSuccessfulCallbackUrl.IsNullOrWhiteSpace()) { - var callbackUrl = _paymentWebOptions.PaymentSuccessfulCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; + var callbackUrl = PaymentWebOptions.PaymentSuccessfulCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; Response.Redirect(callbackUrl); } if (PaymentRequest.State == PaymentRequestState.Failed - && !_paymentWebOptions.PaymentFailureCallbackUrl.IsNullOrWhiteSpace()) + && !PaymentWebOptions.PaymentFailureCallbackUrl.IsNullOrWhiteSpace()) { - var callbackUrl = _paymentWebOptions.PaymentFailureCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; + var callbackUrl = PaymentWebOptions.PaymentFailureCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; Response.Redirect(callbackUrl); } diff --git a/modules/payment/src/Payment.Web/Pages/Payment/PreCheckout.cshtml.cs b/modules/payment/src/Payment.Web/Pages/Payment/PreCheckout.cshtml.cs index 0902d77..3e8f2f2 100644 --- a/modules/payment/src/Payment.Web/Pages/Payment/PreCheckout.cshtml.cs +++ b/modules/payment/src/Payment.Web/Pages/Payment/PreCheckout.cshtml.cs @@ -14,36 +14,36 @@ namespace Payment.Web.Pages.Payment public PaymentRequestDto PaymentRequest { get; set; } - private readonly IPaymentRequestAppService _paymentRequestAppService; - private readonly IPaymentUrlBuilder _paymentUrlBuilder; + protected IPaymentRequestAppService PaymentRequestAppService { get; } + protected IPaymentUrlBuilder PaymentUrlBuilder { get; } public PreCheckoutPageModel( IPaymentRequestAppService paymentRequestAppService, IPaymentUrlBuilder paymentUrlBuilder) { - _paymentRequestAppService = paymentRequestAppService; - _paymentUrlBuilder = paymentUrlBuilder; + PaymentRequestAppService = paymentRequestAppService; + PaymentUrlBuilder = paymentUrlBuilder; } - public async Task OnGetAsync() + public virtual async Task OnGetAsync() { - PaymentRequest = await _paymentRequestAppService.GetAsync(PaymentRequestId); + PaymentRequest = await PaymentRequestAppService.GetAsync(PaymentRequestId); return Page(); } - public async Task OnPostAsync() + public virtual async Task OnPostAsync() { - PaymentRequest = await _paymentRequestAppService.GetAsync(PaymentRequestId); + PaymentRequest = await PaymentRequestAppService.GetAsync(PaymentRequestId); - var result = await _paymentRequestAppService.StartPaymentAsync(new StartPaymentDto + var result = await PaymentRequestAppService.StartPaymentAsync(new StartPaymentDto { PaymentRequestId = PaymentRequest.Id, - ReturnUrl = _paymentUrlBuilder.BuildReturnUrl(PaymentRequestId).AbsoluteUri, - CancelUrl = _paymentUrlBuilder.BuildCheckoutUrl(PaymentRequestId).AbsoluteUri + ReturnUrl = PaymentUrlBuilder.BuildReturnUrl(PaymentRequestId).AbsoluteUri, + CancelUrl = PaymentUrlBuilder.BuildCheckoutUrl(PaymentRequestId).AbsoluteUri }); Response.Redirect(result.CheckoutLink); } } -} \ No newline at end of file +} diff --git a/src/EventHub.Web/EventHubWebModule.cs b/src/EventHub.Web/EventHubWebModule.cs index 05f9382..2202976 100644 --- a/src/EventHub.Web/EventHubWebModule.cs +++ b/src/EventHub.Web/EventHubWebModule.cs @@ -89,23 +89,7 @@ namespace EventHub.Web ConfigureRazorPageOptions(); ConfigurePremiumPlanInfo(context, configuration); } - - private void ConfigurePremiumPlanInfo(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddOptions() - .Bind(configuration.GetSection(PremiumPlanInfoOptions.OrganizationPlanInfo)) - .ValidateDataAnnotations() - .Validate(config => - { - if (config.IsActive) - { - return config.OnePremiumPeriodAsMonth > config.CanBeExtendedAfterHowManyMonths; - } - - return true; - }, "OnePremiumPeriodAsMonth must be greater than CanBeExtendedAfterHowManyMonths."); - } - + private void ConfigureBundles() { Configure(options => @@ -250,6 +234,22 @@ namespace EventHub.Web .PersistKeysToStackExchangeRedis(redis, "EventHub-Protection-Keys"); } + private void ConfigurePremiumPlanInfo(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddOptions() + .Bind(configuration.GetSection(PremiumPlanInfoOptions.OrganizationPlanInfo)) + .ValidateDataAnnotations() + .Validate(config => + { + if (config.IsActive) + { + return config.OnePremiumPeriodAsMonth > config.CanBeExtendedAfterHowManyMonths; + } + + return true; + }, "OnePremiumPeriodAsMonth must be greater than CanBeExtendedAfterHowManyMonths."); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); diff --git a/src/EventHub.Web/Pages/Empty.cshtml b/src/EventHub.Web/Pages/Empty.cshtml index 5db1274..491dd0e 100644 --- a/src/EventHub.Web/Pages/Empty.cshtml +++ b/src/EventHub.Web/Pages/Empty.cshtml @@ -1,7 +1,7 @@ @page "/test" @using EventHub.Web.Pages @model EventHub.Web.Pages.Empty - + @* TODO(berkansasmaz): Delete this page *@

Create an Event

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ut nulla consequat, tempus sapien in, diff --git a/src/EventHub.Web/Pages/Organizations/Components/_upgradeOrExtendOrganizationSection.cshtml b/src/EventHub.Web/Pages/Organizations/Components/_upgradeOrExtendOrganizationSection.cshtml new file mode 100644 index 0000000..e21c089 --- /dev/null +++ b/src/EventHub.Web/Pages/Organizations/Components/_upgradeOrExtendOrganizationSection.cshtml @@ -0,0 +1,56 @@ +@using EventHub.Web.PaymentRequests +@using Microsoft.Extensions.Options +@model EventHub.Organizations.OrganizationProfileDto +@inject IOptionsSnapshot PremiumPlanInfoOptionsSnapshot + + + + @if (Model.IsPremium && PremiumPlanInfoOptionsSnapshot.Value.IsActive && PremiumPlanInfoOptionsSnapshot.Value.IsExtendable && Model.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(PremiumPlanInfoOptionsSnapshot.Value.OnePremiumPeriodAsMonth - PremiumPlanInfoOptionsSnapshot.Value.CanBeExtendedAfterHowManyMonths))) + { + Premium end date: @Model.PremiumEndDate!.Value.ToShortDateString() + } + + Edit + + + @if (PremiumPlanInfoOptionsSnapshot.Value.IsActive) + { + @if (Model.IsPremium) + { + @if (PremiumPlanInfoOptionsSnapshot.Value.IsExtendable && Model.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(PremiumPlanInfoOptionsSnapshot.Value.OnePremiumPeriodAsMonth - PremiumPlanInfoOptionsSnapshot.Value.CanBeExtendedAfterHowManyMonths))) + { +

+ } + else + { +
+ +
+ } + } + else + { + + } + } + else + { + + + Premium end date: @Model.PremiumEndDate!.Value.ToShortDateString() + + + } + + + diff --git a/src/EventHub.Web/Pages/Organizations/Profile.cshtml b/src/EventHub.Web/Pages/Organizations/Profile.cshtml index f6b13f8..b31a97c 100644 --- a/src/EventHub.Web/Pages/Organizations/Profile.cshtml +++ b/src/EventHub.Web/Pages/Organizations/Profile.cshtml @@ -8,6 +8,7 @@ @using EventHub.Web.PaymentRequests @using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.Options +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.SweetAlert2 @using Volo.Abp.Timing @model EventHub.Web.Pages.Organizations.ProfilePageModel @inject IClock Clock @@ -15,6 +16,7 @@ @inject IOptionsSnapshot PremiumPlanInfoOptionsSnapshot @section scripts { + } @@ -66,44 +68,7 @@ @if (Model.IsOrganizationOwner) { - - Edit - - - @if (PremiumPlanInfoOptionsSnapshot.Value.IsActive) - { - - - @if (Model.Organization.IsPremium) - { - Premium end date: @Model.Organization.PremiumEndDate!.Value.ToShortDateString() - @if (PremiumPlanInfoOptionsSnapshot.Value.IsExtendable && Model.Organization.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(PremiumPlanInfoOptionsSnapshot.Value.OnePremiumPeriodAsMonth - PremiumPlanInfoOptionsSnapshot.Value.CanBeExtendedAfterHowManyMonths))) - { - - } - } - else - { - - } - - - }else if (Model.Organization.IsPremium) - { - - - Premium end date: @Model.Organization.PremiumEndDate!.Value.ToShortDateString() - - - } + } @await Component.InvokeAsync(typeof(JoinAreaViewComponent), new {organizationId = Model.Organization.Id}) @await Component.InvokeAsync(typeof(MembersAreaViewComponent), @@ -212,4 +177,4 @@ - \ No newline at end of file + diff --git a/src/EventHub.Web/Pages/Organizations/Profile.js b/src/EventHub.Web/Pages/Organizations/Profile.js index d289691..010a2e1 100644 --- a/src/EventHub.Web/Pages/Organizations/Profile.js +++ b/src/EventHub.Web/Pages/Organizations/Profile.js @@ -1,13 +1,36 @@ $(function () { $('.events > .nav-item > a[data-toggle="tab"]').on('shown.bs.tab', function (e) { var target = $(e.target).attr("href") - if (target === "#UpcomingEvent"){ + if (target === "#UpcomingEvent") { $("a[href='#PastEvent']").removeClass('selected'); $("a[href='#UpcomingEvent']").addClass('selected'); - }else{ + } else { $("a[href='#UpcomingEvent']").removeClass('selected'); $("a[href='#PastEvent']").addClass('selected'); } }); -}); \ No newline at end of file + + var searchParams = new URLSearchParams(window.location.search); + var paymentRequestId = searchParams.get('paymentRequestId'); + if (paymentRequestId.length === 36) { + payment.paymentRequests.paymentRequest + .get(paymentRequestId) + .then(function (r) { + if (r.extraProperties.Status === "COMPLETED") { + Swal.fire({ + title: 'Thank you for your purchase!', + text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam utnulla consequat.', + imageUrl: '/assets/success.svg', + imageHeight: "70", + imageWidth: "70", + showCloseButton: true, + confirmButtonText: 'Close' + }).then(() => { + window.location.replace(window.location.pathname) + }); + } + }); + } + +}); diff --git a/src/EventHub.Web/Pages/Payment/CustomPostCheckout.cshtml.cs b/src/EventHub.Web/Pages/Payment/CustomPostCheckout.cshtml.cs new file mode 100644 index 0000000..dac8f18 --- /dev/null +++ b/src/EventHub.Web/Pages/Payment/CustomPostCheckout.cshtml.cs @@ -0,0 +1,77 @@ +using System; +using System.Threading.Tasks; +using EventHub.Organizations; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Payment.PaymentRequests; +using Payment.Web; +using Payment.Web.Pages.Payment; +using Payment.Web.PaymentRequest; + +namespace EventHub.Web.Pages.Payment; + +public class CustomPostCheckoutPageModel : PostCheckoutPageModel +{ + public string OrganizationName { get; set; } + + public CustomPostCheckoutPageModel( + IPaymentRequestAppService appService, + IOptions paymentWebOptions, + IPaymentUrlBuilder paymentUrlBuilder) + : base( + appService, + paymentWebOptions, + paymentUrlBuilder) + { + } + + public override async Task OnGetAsync() + { + if (Token.IsNullOrWhiteSpace()) + { + return BadRequest(); + } + + PaymentRequest = await PaymentRequestAppService.CompleteAsync(Token); + + FillOrganizationName(); + PaymentWebOptions.PaymentSuccessfulCallbackUrl = Url.Page("/Organizations/Profile", new { name = OrganizationName }); + + GoBackLink = PaymentUrlBuilder.BuildCheckoutUrl(PaymentRequest.Id).AbsoluteUri; + + if (PaymentRequest.State == PaymentRequestState.Completed + && !PaymentWebOptions.PaymentSuccessfulCallbackUrl.IsNullOrWhiteSpace()) + { + var callbackUrl = PaymentWebOptions.PaymentSuccessfulCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; + Response.Redirect(callbackUrl); + } + + if (PaymentRequest.State == PaymentRequestState.Failed + && !PaymentWebOptions.PaymentFailureCallbackUrl.IsNullOrWhiteSpace()) + { + var callbackUrl = PaymentWebOptions.PaymentFailureCallbackUrl + "?paymentRequestId=" + PaymentRequest.Id; + Response.Redirect(callbackUrl); + } + + return Page(); + } + + private void FillOrganizationName() + { + var isExistExtraProperties = PaymentRequest.ExtraProperties.TryGetValue(nameof(OrganizationPaymentRequestExtraParameterConfiguration), out var ExtraProperties); + if (!isExistExtraProperties) + { + throw new BadHttpRequestException(""); + } + + var organizationPaymentExtraParameterConfiguration = JsonConvert.DeserializeObject(ExtraProperties.ToString()); + if (organizationPaymentExtraParameterConfiguration is null) + { + throw new BadHttpRequestException(""); + } + + OrganizationName = organizationPaymentExtraParameterConfiguration.OrganizationName; + } +} diff --git a/src/EventHub.Web/Pages/Payment/PostCheckout.cshtml b/src/EventHub.Web/Pages/Payment/PostCheckout.cshtml index 64849f0..4d7047b 100644 --- a/src/EventHub.Web/Pages/Payment/PostCheckout.cshtml +++ b/src/EventHub.Web/Pages/Payment/PostCheckout.cshtml @@ -1,32 +1,15 @@ @page -@using EventHub.Organizations @using EventHub.Web -@using Microsoft.AspNetCore.Http @using Microsoft.Extensions.Options -@using Newtonsoft.Json -@using Payment.Web.Pages.Payment @using Payment.PaymentRequests @using Volo.Abp.Users @inherits Payment.Web.Pages.PaymentPageBase -@model Payment.Web.Pages.Payment.PostCheckoutPageModel +@model EventHub.Web.Pages.Payment.CustomPostCheckoutPageModel @inject IOptions UrlOptions @inject ICurrentUser CurrentUser @{ PageLayout.Content.Title = L["PaymentResult"] + L["Enum:PaymentRequestState:" + Model.PaymentRequest.State]; - - var isExistExtraProperties = Model.PaymentRequest.ExtraProperties.TryGetValue(nameof(OrganizationPaymentRequestExtraParameterConfiguration), out var ExtraProperties); - if (!isExistExtraProperties) - { - throw new BadHttpRequestException(""); - } - - var organizationPaymentExtraParameterConfiguration = JsonConvert.DeserializeObject(ExtraProperties.ToString()); - if (organizationPaymentExtraParameterConfiguration is null) - { - throw new BadHttpRequestException(""); - } - var organizationName = organizationPaymentExtraParameterConfiguration.OrganizationName; }
@@ -69,8 +52,8 @@ -
\ No newline at end of file +
diff --git a/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml b/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml index 4a68285..3fb9203 100644 --- a/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml +++ b/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml @@ -31,79 +31,42 @@ } - -
- -
Shopping Cart
- - -
- - - - - - - - - - - - - - -
Product Name & DetailsTotal
-
-
-

@Model.PaymentRequest.ProductName

- - @if (!organizationPaymentRequestExtraParameterConfiguration.IsExtend) - { - Target Plan: @OrganizationPlanType.Premium - End date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString() - } - else - { - Plan: @OrganizationPlanType.Premium - } -   - -
-
-
@Model.PaymentRequest.Price @Model.PaymentRequest.Currency
-
- -
- - - -
- -
@Model.PaymentRequest.Price @Model.PaymentRequest.Currency
-
-
-
-
-
- - - - -
- @if (Model.PaymentRequest.State != PaymentRequestState.Waiting) - { - Current State: @Model.PaymentRequest.State - @L["PaymentRequestIsNotWaiting"] - } - else - { - @L["Checkout"] - Back to pricing - } -
-
-
-
-
-
-
\ No newline at end of file +
+

Shopping Cart

+
+
+
+
+

Product Detail

+

@OrganizationPlanType.Premium Account: @organizationName.ToUpperInvariant()

+ @if (!organizationPaymentRequestExtraParameterConfiguration.IsExtend) + { +

Start Date: @DateTime.Now.ToShortDateString()

+

End Date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString()

+ } + else + { +

Your license will be extended for @planInfo.OnePremiumPeriodAsMonth months.

+ } +
+
+
+
+
+
+

Summary

+
+

Premium Licence @Model.PaymentRequest.Price @Model.PaymentRequest.Currency

+
+

TOTAL @Model.PaymentRequest.Price @Model.PaymentRequest.Currency

+
+
+
+ +
+
+
+
+
+
+
diff --git a/src/EventHub.Web/Pages/Pricing.cshtml b/src/EventHub.Web/Pages/Pricing.cshtml index f96572d..02da933 100644 --- a/src/EventHub.Web/Pages/Pricing.cshtml +++ b/src/EventHub.Web/Pages/Pricing.cshtml @@ -8,129 +8,114 @@ } -
-
- -

- Pricing plans -

-
- Choose the plan best for your organization. -
- -
- -
-
-
Free account
-
-
- $ - 0 -
-
-

1 event per month

-

300 attendees per event

-
+
+

Eventhub Pricing List

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ut nulla consequat, tempus sapien in, + pellentesque nunc. Sed at nunc pellentesque, fermentum mi et, fermentum massa.

+
+
+
+
+

Normal Account

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam utnulla consequat, tempus sapien in.

+
+ $ + 0 +
+
    +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
+
+
-
+ @if (Model.PremiumPlanInfo is not null) + { +
+
+
+

Premium Account

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam utnulla consequat, tempus sapien in.

+
+ $ + @Model.PremiumPlanInfo.Price +
+
    +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit adipiscing elit.
  • +
  • Lorem ipsum adipiscing elit dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem adipiscing elit adipiscing elitipsum dolor sit amet, consectetur adipiscing elit.
  • +
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • +
+ @if (Model.Organization.IsPremium) + { +
+ + + Extend Now +
+ } + else + { +
+ + + Upgrade to @Model.PremiumPlanInfo.PlanType +
+ } +
+
+
+ } +

Frequently Asked Questions

+ +
+
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit. +

+
+
+
+
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit. +

+
+
+
+
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +

+
+
+
+
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit. +

+
+
+
-
- - @if(Model.PremiumPlanInfo is not null) - { -
-
-
- @Model.PremiumPlanInfo.PlanType account - @if (Model.Organization.IsPremium) - { - Current Plan - } -
-
-
- $ - @Model.PremiumPlanInfo.Price -
-
-

unlimited events

-

unlimited attendees

-
-
-
- - @if (Model.Organization.IsPremium) - { -
- - - Extend Now -
- } - else - { -
- - - Upgrade To @Model.PremiumPlanInfo.PlanType -
- } -
-
- } -
- @* -

Frequently Asked Questions

- -
-
- -
Dapibus ac facilisis in?
-

- Lorem ipsum dolor sit amet, ius virtute suscipit te. Ius prima euismod consequat eu. -

- -
Cras justo odio?
-

- Etiam vivendo eu sea, purto ponderum mediocritatem at pro. -

- -
Porta ac consectetur ac?
-

- Iuvaret deleniti vulputate nec ne, id vix lucilius legendos deseruisse. -

- -
Ne ornatus albucius ius?
-

- Lorem ipsum dolor sit amet, mea in pertinax hendrerit gloriatur. -

- -
-
- -
Ne ornatus albucius ius?
-

- Lorem ipsum dolor sit amet, mea in pertinax hendrerit gloriatur. -

- -
Quo insolens intellegam dissentiet at?
-

- Ex fugit legimus fuisset per. Ex quidam option diceret ius. -

- -
Ad his assum delenit blandit?
-

- Ne ornatus albucius ius, nostrum dignissim repudiandae an usu. -

- -
Dapibus ac facilisis in?
-

- Lorem ipsum dolor sit amet, ius virtute suscipit te. Ius prima euismod consequat eu. -

- -
- *@ -
-
\ No newline at end of file + diff --git a/src/EventHub.Web/wwwroot/assets/success.svg b/src/EventHub.Web/wwwroot/assets/success.svg new file mode 100644 index 0000000..987540e --- /dev/null +++ b/src/EventHub.Web/wwwroot/assets/success.svg @@ -0,0 +1 @@ + \ No newline at end of file