bulletboards/ImageBoardServerApp/Shared/Components/Post.razor
2023-06-13 08:51:53 +02:00

235 lines
No EOL
7.8 KiB
Text

@using ImageBoardServerApp.Data.Repository
@using ImageBoardServerApp.Util
@using ImageBoardServerApp.Auth
@using System.ComponentModel.DataAnnotations
@using System.Text.RegularExpressions
@inject AuthenticationStateProvider authStateProvider
@inject NavigationManager navigationManager;
<div class="post">
<div class="threadHeader">
@if (showOpenThread)
{
<span>[</span>
<a class="toggleOpened" onclick="@ToggleOpened">@toggleText</a>
<span>] </span>
}
<span class="title">@post.Title</span>
<span class="name">@post.Username </span>
@if (post.User.Role != "User" && !post.shouldAnon)
{
<span class="@post.User.Role">##@post.User.Role&nbsp;</span>
}
<span>&nbsp;</span>
<span class="date"> @getTimeFromUnix(post.CreatedAt)</span>
<span class="post-id">No.@post.GET</span>
@if (post.IsSticky)
{
<img src="img/static/sys/sticky.png" alt="Stickied"/>
}
@if (post.IsLocked)
{
<img src="img/static/sys/locked.png" alt="Locked"/>
}
</div>
@if (opened)
{
<div class="threadContent">
<div class="threadImage">
@if (@post.Image != null)
{
string isActiveClass = isActive ? "active" : "";
<img @onclick="() => isActive = !isActive" class="@isActiveClass" src="@($"{@post.Image.ImageLocation}?size=258x258")" alt="No Image found"/>
}
else
{
<span>[No Image]</span>
}
</div>
<div class="threadTextContainer">
@if (showOpenThread)
{
@foreach (string s in post.Content.Split("\n").ToList().Take(6))
{
var className = "";
@if (s.StartsWith(">") && !Regex.IsMatch(s, "^>{2,}"))
{
className = "greenText";
}
@foreach (string s2 in s.Split(" "))
{
@if (s2.StartsWith("https://") || s.StartsWith("http://"))
{
<a href="@s2" target="_blank">@s2</a>
}
else
{
<span class="@className">@s2</span>
}
<span class="@className">&nbsp;</span>
}
<br/>
}
@if (post.Content.Split("\n").Length > 6)
{
<br/>
<span class="greenText">[Open Thread to read more...]</span>
}
}
else
{
@foreach (string s in post.Content.Split("\n"))
{
var className = "";
@if (s.StartsWith(">") && !Regex.IsMatch(s, "^>{2,}"))
{
className = "greenText";
}
@foreach (string s2 in s.Split(" "))
{
@if (s2.StartsWith("https://") || s2.StartsWith("http://"))
{
<a href="@s2" target="_blank">@s2</a>
}
else
{
<span class="@className">@s2</span>
}
<span class="@className">&nbsp;</span>
}
<br/>
}
}
</div>
</div>
<div class="threadFooter">
<AuthorizeView Roles="Admin, Mod">
<Authorized>
<span>[</span>
@if (post.IsSticky)
{
<button class="statButton" onclick="@stickyMe">Unsticky</button>
}
else
{
<button class="statButton" onclick="@stickyMe">Sticky</button>
}
@if (post.IsLocked)
{
<button class="statButton" onclick="@lockMe">Unlock</button>
}
else
{
<button class="statButton" onclick="@lockMe">Lock</button>
}
<span>]</span>
</Authorized>
</AuthorizeView>
<span>[</span>
<a class="repButton" href="@reportURL" target="_blank">Report</a>
@if (canDel)
{
<button class="delButton" onclick="@deletePost">Delete</button>
}
@if (showOpenThread)
{
<a class="opButton" href="@threadURL">@openThreadName</a>
}
else
{
<span class="openThread">@post.Comments.Count Comments</span>
}
<span>]</span>
</div>
}
</div>
@code {
private string reportURL { get; set; }
private string threadURL { get; set; }
private string openThreadName { get; set; }
public bool canDel { get; set; } = false;
public bool isActive { get; set; } = false;
private int linecnt = 0;
private async void lockMe()
{
post.IsLocked = !post.IsLocked;
await PostsRepository.updatePostAsync(post);
}
private async void stickyMe()
{
post.IsSticky = !post.IsSticky;
await PostsRepository.updatePostAsync(post);
}
private static DateTime getTimeFromUnix(double javaTimeStamp)
{
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dateTime = dateTime.AddMilliseconds(javaTimeStamp).ToLocalTime();
return dateTime;
}
private async Task deletePost()
{
string boardTag = post.Board;
var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
var user = await cauthStateProvder.GetAuthenticationStateAsync();
var usr = user.User;
UserData foundusr = await UsersRepository.getUserByEmailRawAsync(usr.Identity.Name);
if (foundusr.Role != "User" || post.UserID == foundusr.UserID)
{
await TheManager.deleteThread(post);
navigationManager.NavigateTo($"/{boardTag}");
}
}
private bool opened = true;
private string toggleText = "-";
private string value;
private void ToggleOpened()
{
opened = !opened;
toggleText = opened ? "-" : "+";
}
protected override async Task OnInitializedAsync()
{
value = TheManager.getBumpValue(post) + "v";
reportURL = $"/sys/report/op/{post.Board}/{post.PostID}";
threadURL = $"/{post.Board}/thread/{post.PostID}";
openThreadName = $"({post.Comments.Count}) View Thread";
var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
var user = await cauthStateProvder.GetAuthenticationStateAsync();
UserData foundusr = await UsersRepository.getUserByEmailRawAsync(user.User.Identity.Name);
if (foundusr != null && (foundusr.Role != "User" || post.UserID == foundusr.UserID))
{
canDel = true;
return;
}
canDel = false;
await base.OnInitializedAsync();
}
[Parameter]
[Required]
public PostData post { get; set; }
[Parameter]
[Required]
public bool showOpenThread { get; set; }
}