namespace BlazorFiddleProject
{
using Microsoft.AspNetCore.Components.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<MessageService>();
services.AddScoped<UserMessageService>();
}
public void Configure(IComponentsApplicationBuilder app)
{
app.AddComponent<App>("app");
}
}
public class ChatMessage
{
public List<int> RecipientIds { get; private set; }
public string Message { get; private set; }
public int CreatedBy { get; private set; }
public DateTime Created { get; private set; }
private ChatMessage() { }
public ChatMessage(int createdBy, List<int> recipientIds, string message)
{
CreatedBy = createdBy;
RecipientIds = recipientIds;
Message = message;
Created = DateTime.Now;
}
}
public class MessageService
{
public List<ChatMessage> Messages { get; set; } = new List<ChatMessage>();
public void SendMessage(ChatMessage chatMessage)
{
//Add message to message store
Messages.Add(chatMessage);
}
}
public class UserMessageService // Inject as scoped service
{
MessageService MessageService { get; set; }
public int UserID { get; set; }
DateTime LastCheck = DateTime.MinValue;
public List<ChatMessage> UserMessages { get; set; } = new List<ChatMessage>();
public UserMessageService(MessageService messageService) => MessageService = messageService;
public void SetUserId(int userId)
{
UserID = userId;
}
public void GetUserMessages()
{
if (UserID == 0)
throw new ArgumentNullException(nameof(UserID), "A user ID has not been set for the user message service.");
var messages = MessageService.Messages.Where(m =>
(
m.RecipientIds?.Contains(UserID) == true
|| m.RecipientIds == null
|| m.CreatedBy == UserID
)
&& m.Created > LastCheck)
?.ToList();
if (messages?.Any() == true)
{
LastCheck = messages.Max(m => m.Created);
UserMessages = UserMessages.Concat(messages).OrderBy(m => m.Created).ToList();
}
}
}
}