Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ public interface IUsersStateContainer
{
ConcurrentDictionary<string, string> UsersByConnectionId { get; }
event Action? OnChange;
void Update(string connectionId, string? name);
void AddOrUpdate(string connectionId, string? name);
void Remove(string connectionId);
}
2 changes: 1 addition & 1 deletion src/Application/Constants/ConstantString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public static class ConstantString
public static string SaveSuccess => Localize("Save successfully");
public static string DeleteSuccess => Localize("Delete successfully");
public static string DeleteFail => Localize("Delete fail");
public static string UpdateSuccess => Localize("Update successfully");
public static string UpdateSuccess => Localize("AddOrUpdate successfully");
public static string CreateSuccess => Localize("Create successfully");
public static string LoginSuccess => Localize("Login successfully");
public static string LogoutSuccess => Localize("Logout successfully");
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
{
System.Buffers.ArrayPool<byte>.Shared.Return(buffer);

// Update the UI with the final progress
// AddOrUpdate the UI with the final progress
StateHasChanged();
}
}
Expand Down
13 changes: 8 additions & 5 deletions src/Blazor.Server.UI/Shared/UserLoginState.razor
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
}
[Inject]
private HubClient Client { get; set; } = default!;
[Inject]
private IUsersStateContainer UsersStateContainer { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
Client.Login += _client_Login;
Expand All @@ -36,20 +38,21 @@
}
}

private void _client_Login(object? sender, string username)
private void _client_Login(object? sender, UserStateChangeEventArgs args)
{
InvokeAsync(() =>
{
Snackbar.Add(string.Format(L["{0} has logged in."],username), MudBlazor.Severity.Info);

Snackbar.Add(string.Format(L["{0} has logged in."], args.UserName), MudBlazor.Severity.Info);
UsersStateContainer.AddOrUpdate(args.ConnectionId, args.UserName);
});
}

private void _client_Logout(object? sender, string username)
private void _client_Logout(object? sender, UserStateChangeEventArgs args)
{
InvokeAsync(() =>
{
Snackbar.Add(string.Format(L["{0} has logged out."],username), MudBlazor.Severity.Normal);
Snackbar.Add(string.Format(L["{0} has logged out."], args.UserName), MudBlazor.Severity.Normal);
UsersStateContainer.Remove(args.ConnectionId);

});
}
Expand Down
8 changes: 4 additions & 4 deletions src/Blazor.Server.UI/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"UseInMemoryDatabase": false,
"DatabaseSettings": {
"DBProvider": "sqlite",
"ConnectionString": "Data Source=BlazorDashboardDb.db"
//"DBProvider": "mssql",
//"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=BlazorDashboardDb;Trusted_Connection=True;MultipleActiveResultSets=true;"
//"DBProvider": "sqlite",
//"ConnectionString": "Data Source=BlazorDashboardDb.db"
"DBProvider": "mssql",
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=BlazorDashboardDb;Trusted_Connection=True;MultipleActiveResultSets=true;"
//"DBProvider": "postgresql",
//"ConnectionString": "Server=127.0.0.1;Database=BlazorDashboardDb;User Id=postgres;Password=postgrespw;Port=32768"
},
Expand Down
2 changes: 1 addition & 1 deletion src/Infrastructure/Extensions/SerilogExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public static void RegisterSerilog(this WebApplicationBuilder builder)
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
.MinimumLevel.Override("MudBlazor", LogEventLevel.Information)
.MinimumLevel.Override("Serilog", LogEventLevel.Error)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Update", LogEventLevel.Error)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.AddOrUpdate", LogEventLevel.Error)
.MinimumLevel.Override("Hangfire.BackgroundJobServer", LogEventLevel.Error)
.MinimumLevel.Override("Hangfire.Server.BackgroundServerProcess", LogEventLevel.Error)
.MinimumLevel.Override("Hangfire.Server.ServerHeartbeatProcess", LogEventLevel.Error)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ public static class SignalRServiceCollectionExtensions
public static void AddSignalRServices(this IServiceCollection services)
{
services.AddSingleton<IUsersStateContainer, UsersStateContainer>()
.AddScoped<CircuitHandler, CircuitHandlerService>()
.AddScoped<HubClient>()
.AddSignalR();
}
Expand Down
36 changes: 24 additions & 12 deletions src/Infrastructure/Hubs/HubClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public HubClient(NavigationManager navigationManager, AccessTokenProvider authPr
})
.Build();
_hubConnection.ServerTimeout = TimeSpan.FromSeconds(30);
_hubConnection.On<string>(SignalR.OnConnect, userId => { Login?.Invoke(this, userId); });
_hubConnection.On<string>(SignalR.OnDisconnect, userId => { Logout?.Invoke(this, userId); });
_hubConnection.On<string,string>(SignalR.OnConnect, (connectionId, userName) => { Login?.Invoke(this, new UserStateChangeEventArgs(connectionId,userName)); });
_hubConnection.On<string, string>(SignalR.OnDisconnect, (connectionId, userName) => { Logout?.Invoke(this, new UserStateChangeEventArgs(connectionId, userName)); });
_hubConnection.On<string>(SignalR.SendNotification,
message => { NotificationReceived?.Invoke(this, message); });
_hubConnection.On<string, string>(SignalR.SendMessage, HandleReceiveMessage);
Expand Down Expand Up @@ -77,22 +77,34 @@ public async Task NotifyAsync(string message)
await _hubConnection.SendAsync(SignalR.SendNotification, message);
}

public event EventHandler<string>? Login;
public event EventHandler<UserStateChangeEventArgs>? Login;
public event EventHandler<string>? JobStarted;
public event EventHandler<string>? JobCompleted;
public event EventHandler<string>? Logout;
public event EventHandler<UserStateChangeEventArgs>? Logout;
public event EventHandler<string>? NotificationReceived;
public event MessageReceivedEventHandler? MessageReceived;

public class MessageReceivedEventArgs : EventArgs

}
public class MessageReceivedEventArgs : EventArgs
{
public MessageReceivedEventArgs(string userName, string message)
{
public MessageReceivedEventArgs(string userId, string message)
{
UserId = userId;
Message = message;
}
UserId = userName;
Message = message;
}

public string UserId { get; set; }
public string Message { get; set; }
public string UserId { get; set; }
public string Message { get; set; }
}

public class UserStateChangeEventArgs : EventArgs
{
public UserStateChangeEventArgs(string connectionId, string userName)
{
ConnectionId = connectionId;
UserName = userName;
}
public string ConnectionId { get; set; }
public string UserName { get; set; }
}
14 changes: 7 additions & 7 deletions src/Infrastructure/Hubs/SignalRHub.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ public interface ISignalRHub
Task Completed(string message);
Task SendMessage(string from, string message);
Task SendPrivateMessage(string from, string to, string message);
Task Disconnect(string userId);
Task Connect(string userId);
Task Disconnect(string connectionId, string userName);
Task Connect(string connectionId, string userName);
Task SendNotification(string message);
}

Expand All @@ -26,19 +26,19 @@ public class SignalRHub : Hub<ISignalRHub>

public override async Task OnConnectedAsync()
{
var id = Context.ConnectionId;
var connectionId = Context.ConnectionId;
var username = Context.User?.Identity?.Name ?? string.Empty;
if (!OnlineUsers.ContainsKey(id)) OnlineUsers.TryAdd(id, username);
if (!OnlineUsers.ContainsKey(connectionId)) OnlineUsers.TryAdd(connectionId, username);

await Clients.All.Connect(username);
await Clients.All.Connect(connectionId,username);
await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception? exception)
{
var id = Context.ConnectionId;
var connectionId = Context.ConnectionId;
//try to remove key from dictionary
if (OnlineUsers.TryRemove(id, out var username)) await Clients.All.Disconnect(username);
if (OnlineUsers.TryRemove(connectionId, out var username)) await Clients.All.Disconnect(connectionId,username);

await base.OnConnectedAsync();
}
Expand Down
33 changes: 0 additions & 33 deletions src/Infrastructure/Services/CircuitHandlerService.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class UsersStateContainer : IUsersStateContainer
public ConcurrentDictionary<string, string> UsersByConnectionId { get; } = new ConcurrentDictionary<string, string>();

public event Action? OnChange;
public void Update(string connectionId, string? name)
public void AddOrUpdate(string connectionId, string? name)
{
UsersByConnectionId.AddOrUpdate(connectionId, name??String.Empty, (key, oldValue) => name??String.Empty);
NotifyStateChanged();
Expand Down