Skip to content

Commit 6c153ce

Browse files
authored
Merge pull request #259 from pticostaricags/development
merge "development" into "main"
2 parents 97116f5 + cf4ec3f commit 6c153ce

File tree

2,097 files changed

+15033
-26
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,097 files changed

+15033
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<h3>Home</h3>
2+
3+
@code {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<Project Sdk="Microsoft.NET.Sdk.Razor">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net9.0</TargetFramework>
5+
<Nullable>enable</Nullable>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Configurations>Debug;Release;Debug_Enable_Paid_Tests</Configurations>
8+
</PropertyGroup>
9+
10+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
11+
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
12+
</PropertyGroup>
13+
14+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
15+
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
16+
</PropertyGroup>
17+
18+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Enable_Paid_Tests|AnyCPU'">
19+
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
20+
</PropertyGroup>
21+
22+
<ItemGroup>
23+
<Compile Remove="wwwroot\**" />
24+
<Content Remove="wwwroot\**" />
25+
<EmbeddedResource Remove="wwwroot\**" />
26+
<None Remove="wwwroot\**" />
27+
</ItemGroup>
28+
29+
30+
<ItemGroup>
31+
<SupportedPlatform Include="browser" />
32+
</ItemGroup>
33+
34+
<ItemGroup>
35+
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="9.0.0" />
36+
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.0" />
37+
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.0" />
38+
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components" Version="4.10.4" />
39+
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components.Emoji" Version="4.6.0" />
40+
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components.Icons" Version="4.10.4" />
41+
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.32.0.97167">
42+
<PrivateAssets>all</PrivateAssets>
43+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
44+
</PackageReference>
45+
<PackageReference Include="System.Text.Json" Version="9.0.0" />
46+
</ItemGroup>
47+
48+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@using Microsoft.AspNetCore.Components.Web
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
@inject NavigationManager navigationManager
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
5+
<head>
6+
<meta charset="utf-8" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8+
<base href="/" />
9+
<link rel="stylesheet" href="@Assets["bootstrap/bootstrap.min.css"]" />
10+
<script src="bootstrap/bootstrap.bundle.min.js"></script>
11+
<link rel="stylesheet" href="@Assets["app.css"]" />
12+
<link rel="stylesheet" href="@Assets["FairPlayBlogs.styles.css"]" />
13+
<link rel="stylesheet" href="@Assets["custom.css"]" />
14+
<link rel="stylesheet" href="@Assets["bootstrap-icons-1.11.3/font/bootstrap-icons.min.css"]" />
15+
<link rel="icon" type="image/png" href="favicon.png" />
16+
17+
<script src="_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.lib.module.js" type="module" async></script>
18+
<link href="@Assets["_content/Microsoft.FluentUI.AspNetCore.Components/css/reboot.css"]" rel="stylesheet" />
19+
20+
<ImportMap />
21+
<HeadOutlet @rendermode="@PageRenderMode" />
22+
</head>
23+
24+
<body>
25+
<Routes @rendermode="@PageRenderMode" />
26+
<script src="_framework/blazor.web.js"></script>
27+
<!-- Set the default theme -->
28+
<script src="_content/Microsoft.FluentUI.AspNetCore.Components/js/loading-theme.js" type="text/javascript"></script>
29+
<loading-theme storage-name="theme"></loading-theme>
30+
</body>
31+
32+
</html>
33+
@code
34+
{
35+
[CascadingParameter]
36+
private HttpContext HttpContext { get; set; } = default!;
37+
private IComponentRenderMode? PageRenderMode { get; set; }
38+
private static IComponentRenderMode ServerNoPrerender = new InteractiveServerRenderMode(prerender: false);
39+
private static IComponentRenderMode ServerWithPrerender = new InteractiveServerRenderMode(prerender: true);
40+
protected override void OnParametersSet()
41+
{
42+
if (!this.HttpContext!.AcceptsInteractiveRouting())
43+
{
44+
this.PageRenderMode = null;
45+
return;
46+
}
47+
if (HttpContext.AcceptsInteractiveRouting())
48+
{
49+
if (navigationManager.Uri.IndexOf("/User/") >= 0 ||
50+
navigationManager.Uri.IndexOf("/Creator/") >= 0)
51+
{
52+
this.PageRenderMode = ServerNoPrerender;
53+
}
54+
else
55+
{
56+
this.PageRenderMode = ServerWithPrerender;
57+
}
58+
}
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
@using FairPlayCombined.Common.CustomAttributes
2+
@using FairPlayCombined.Interfaces
3+
@using FairPlayCombined.Interfaces.Common
4+
@using FairPlayCombined.Models.Common.VisitorTracking
5+
@using Microsoft.Extensions.Localization
6+
@using System.Timers
7+
8+
@implements IAsyncDisposable
9+
10+
@inherits LayoutComponentBase
11+
@inject IStringLocalizer<MainLayout> localizer
12+
@inject NavigationManager navigationManager
13+
@inject IVisitorTrackingService visitorTrackingService
14+
@inject IUserProviderService userProviderService
15+
@inject IStringLocalizer<MainLayout> localizer
16+
17+
<FluentMainLayout NavMenuWidth="400">
18+
<Header>
19+
<div class="header-content" style="display: flex; align-items: center; justify-content: center; flex-wrap: wrap;">
20+
<img src="images/brand-logo.png" alt="@nameof(FairPlayBlogs) Logo" class="logo" style="max-width: 100%; height: auto;" />
21+
<FluentLabel Typo="Typography.H3" Alignment="HorizontalAlignment.Center" style="display: flex; align-items: center; flex-wrap: nowrap;">
22+
@nameof(FairPlayBlogs)
23+
<FluentBadge Circular="true"
24+
Appearance="Microsoft.FluentUI.AspNetCore.Components.Appearance.Neutral"
25+
style="margin-left: 8px; white-space: nowrap;">
26+
Beta
27+
</FluentBadge>
28+
</FluentLabel>
29+
</div>
30+
<div class="search-controls" style="display: flex; align-items: center; margin-top: 16px;">
31+
<FluentTextField @bind-Value="@this.SearchTerm" Placeholder=@SearchText style="flex: 1 1 auto;">
32+
</FluentTextField>
33+
<FluentButton Type="ButtonType.Button" OnClick="OnSearchButtonClicked"
34+
IconEnd="@(new Icons.Regular.Size20.Search())" style="margin-left: 8px;">
35+
</FluentButton>
36+
</div>
37+
</Header>
38+
<Body>
39+
@Body
40+
</Body>
41+
<NavMenuContent>
42+
<NavMenu></NavMenu>
43+
</NavMenuContent>
44+
</FluentMainLayout>
45+
46+
47+
<div id="blazor-error-ui">
48+
An unhandled error has occurred.
49+
<a href="" class="reload">Reload</a>
50+
<a class="dismiss">🗙</a>
51+
</div>
52+
53+
<FluentToastProvider />
54+
<FluentDialogProvider />
55+
<FluentTooltipProvider />
56+
<FluentMessageBarProvider />
57+
<FluentDesignTheme StorageName="theme" />
58+
59+
@code
60+
{
61+
private bool IsBusy { get; set; } = false;
62+
private System.Timers.Timer? VisitsTimer { get; set; }
63+
private readonly CancellationTokenSource cancellationTokenSource = new();
64+
private long? VisitorTrackingId { get; set; }
65+
[Parameter]
66+
[SupplyParameterFromQuery]
67+
public string? SearchTerm { get; set; }
68+
69+
protected override async Task OnInitializedAsync()
70+
{
71+
try
72+
{
73+
IsBusy = true;
74+
await TrackVisit(createNewSession: true);
75+
navigationManager.LocationChanged += NavigationManager_LocationChanged;
76+
}
77+
catch (Exception)
78+
{
79+
//Ignore
80+
}
81+
finally
82+
{
83+
IsBusy = false;
84+
}
85+
}
86+
87+
private async Task TrackVisit(bool createNewSession)
88+
{
89+
//We do not want to track authentication flow pages visits
90+
if (navigationManager.Uri.Contains("/authentication/"))
91+
return;
92+
VisitorTrackingModel visitorTrackingModel = new()
93+
{
94+
VisitedUrl = navigationManager.Uri
95+
};
96+
var currentUserId = userProviderService.GetCurrentUserId();
97+
if (!String.IsNullOrWhiteSpace(currentUserId))
98+
{
99+
visitorTrackingModel.ApplicationUserId = currentUserId;
100+
}
101+
if (createNewSession)
102+
{
103+
visitorTrackingModel.SessionId = Guid.NewGuid();
104+
}
105+
this.VisitorTrackingId = await this.visitorTrackingService
106+
.TrackVisitAsync(visitorTrackingModel, this.cancellationTokenSource.Token);
107+
108+
if (createNewSession)
109+
{
110+
this.VisitsTimer = new System.Timers.Timer(TimeSpan.FromSeconds(60).TotalMilliseconds);
111+
this.VisitsTimer.Elapsed += VisitsTimer_Elapsed;
112+
this.VisitsTimer.Start();
113+
}
114+
}
115+
116+
private async void VisitsTimer_Elapsed(object? sender, ElapsedEventArgs e)
117+
{
118+
try
119+
{
120+
await visitorTrackingService.UpdateVisitTimeElapsedAsync(this.VisitorTrackingId!.Value,
121+
this.cancellationTokenSource.Token);
122+
}
123+
catch (Exception)
124+
{
125+
//Ignore
126+
}
127+
}
128+
129+
private async void NavigationManager_LocationChanged(object? sender,
130+
Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e)
131+
{
132+
try
133+
{
134+
await TrackVisit(createNewSession: false);
135+
}
136+
catch (Exception)
137+
{
138+
//Ignore
139+
}
140+
}
141+
142+
private void OnSearchButtonClicked()
143+
{
144+
if (!String.IsNullOrWhiteSpace(this.SearchTerm))
145+
{
146+
this.navigationManager.NavigateTo($"/?SearchTerm={this.SearchTerm}",
147+
forceLoad: true);
148+
}
149+
else
150+
{
151+
this.navigationManager.NavigateTo($"/", forceLoad: true);
152+
}
153+
}
154+
155+
public async ValueTask DisposeAsync()
156+
{
157+
await this.cancellationTokenSource.CancelAsync();
158+
this.cancellationTokenSource.Dispose();
159+
}
160+
161+
#region Resource Keys
162+
[ResourceKey(defaultValue: "Search")]
163+
public const string SearchTextKey = "SearchText";
164+
public string SearchText => localizer[SearchTextKey];
165+
#endregion
166+
}

0 commit comments

Comments
 (0)