Compare commits
6 Commits
d80539740d
...
a48ca83ffd
| Author | SHA1 | Date |
|---|---|---|
|
|
a48ca83ffd | |
|
|
0d7a4d9ba5 | |
|
|
6bebafe402 | |
|
|
acb9201725 | |
|
|
b93a7048fd | |
|
|
0b0218824a |
|
|
@ -1,52 +1,51 @@
|
||||||
@if (!Value)
|
@using KoogleApp.Model
|
||||||
{
|
@using KoogleApp.Store.Game.ThrowPanel
|
||||||
<MudButton OnClick="ToggleClick" Disabled="Disabled">
|
|
||||||
<MudIcon Class="ma-2" Icon="@Icons.Material.Filled.AddAlert" Color="Color.Dark" Style="font-size: 3rem;" />
|
|
||||||
</MudButton>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudButton OnClick="ToggleClick" Disabled="Disabled">
|
|
||||||
<MudIcon Class="ma-2" Icon="@Icons.Material.Filled.AddAlert" Color="Color.Tertiary"
|
|
||||||
Style="font-size: 3rem;"/>
|
|
||||||
</MudButton>
|
|
||||||
}
|
|
||||||
|
|
||||||
<MudSwitch T="bool" Label="" Size="Size.Medium" Disabled="Disabled"
|
@inherits FluxorComponent
|
||||||
ThumbIcon="@(Value ? Icons.Material.Filled.Done : @Icons.Material.Filled.AddAlert)" ThumbIconColor="@(Value ? Color.Success : Color.Primary)"
|
|
||||||
@bind-Value="Value"/>
|
@inject IDispatcher Dispatcher
|
||||||
|
@inject IState<ThrowPanelState> State
|
||||||
|
|
||||||
|
|
||||||
|
<MudButton OnClick="ToggleClick" Disabled="false">
|
||||||
|
<MudIcon Class="ma-2" Icon="@Icons.Material.Filled.AddAlert"
|
||||||
|
Color="@(State.Value.BellValue ? Color.Warning : Color.Primary)"
|
||||||
|
Style="font-size: 3rem;"/>
|
||||||
|
</MudButton>
|
||||||
|
|
||||||
|
@* <MudSwitch T="bool" Label="" Size="Size.Medium" Disabled="false"
|
||||||
|
@bind-Value="MudSwitchValue"
|
||||||
|
ThumbIcon="@(State.Value.BellValue ? Icons.Material.Filled.Done : @Icons.Material.Filled.AddAlert)"
|
||||||
|
ThumbIconColor="@(State.Value.BellValue ? Color.Success : Color.Primary)" /> *@
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private bool _value;
|
// private bool _mudSwitchValue;
|
||||||
|
|
||||||
[Parameter]
|
// private bool MudSwitchValue
|
||||||
public bool Value
|
// {
|
||||||
|
// get => _mudSwitchValue;
|
||||||
|
// set
|
||||||
|
// {
|
||||||
|
// if (_mudSwitchValue == value)
|
||||||
|
// {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// _mudSwitchValue = value;
|
||||||
|
// Dispatcher.Dispatch(new ToggleBellAction());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// protected override void OnAfterRender(bool firstRender)
|
||||||
|
// {
|
||||||
|
// base.OnAfterRender(firstRender);
|
||||||
|
// _mudSwitchValue = State.Value.BellValue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
private void ToggleClick(MouseEventArgs obj)
|
||||||
{
|
{
|
||||||
get => _value;
|
Dispatcher.Dispatch(new ToggleBellAction());
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_value == value) return;
|
|
||||||
_value = value;
|
|
||||||
InvokeAsync(async () => await ValueChanged.InvokeAsync(value));
|
|
||||||
|
|
||||||
InvokeAsync(async () => await OnStateChanged.InvokeAsync(Value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<bool> ValueChanged { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<bool> OnStateChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public bool Disabled { get; set; } = false;
|
|
||||||
|
|
||||||
private async Task ToggleClick(MouseEventArgs obj)
|
|
||||||
{
|
|
||||||
Value = !Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@
|
||||||
@using KoogleApp.Model.EventMessages
|
@using KoogleApp.Model.EventMessages
|
||||||
@using KoogleApp.Services
|
@using KoogleApp.Services
|
||||||
@using KoogleApp.Store.Game
|
@using KoogleApp.Store.Game
|
||||||
|
@using KoogleApp.Store.Game.ThrowPanel
|
||||||
|
|
||||||
@inherits FluxorComponent
|
@inherits FluxorComponent
|
||||||
|
|
||||||
@inject IMyEventAggregator EventAggregator
|
|
||||||
@inject IState<ThrowPanelState> ThrowPanelState
|
@inject IState<ThrowPanelState> ThrowPanelState
|
||||||
@inject IDispatcher Dispatcher
|
@inject IDispatcher Dispatcher
|
||||||
|
|
||||||
|
|
@ -25,20 +25,19 @@
|
||||||
<MudItem xs="4">
|
<MudItem xs="4">
|
||||||
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0" Style="height: 76px;">
|
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0" Style="height: 76px;">
|
||||||
<MudStack Spacing="0" Wrap="Wrap.Wrap">
|
<MudStack Spacing="0" Wrap="Wrap.Wrap">
|
||||||
<MudChip T="string" Color="Color.Dark" Size="Size.Small">in die Vollen</MudChip>
|
<MudChip T="string" Color="Color.Dark" Size="Size.Small">@(GetThrowModeName(ThrowPanelState.Value.ThrowMode))</MudChip>
|
||||||
<MudChip T="string" Color="Color.Dark" Size="Size.Small">Wurf 1 von 1</MudChip>
|
<MudChip T="string" Color="Color.Dark" Size="Size.Small">Wurf 1 von 1</MudChip>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="4">
|
<MudItem xs="4">
|
||||||
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
||||||
<BellButton
|
<BellButton />
|
||||||
OnStateChanged="OnBellStateChanged" />
|
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
|
||||||
<MudFlexBreak/>
|
<MudFlexBreak/>
|
||||||
@if (ShowNumbers)
|
@if (ThrowPanelState.Value.ThrowMode == ThrowMode.Reposition)
|
||||||
{
|
{
|
||||||
<MudItem xs="4">
|
<MudItem xs="4">
|
||||||
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
||||||
|
|
@ -137,18 +136,6 @@
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
// [Parameter]
|
|
||||||
// public ThrowPanelState? ThrowPanelState { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<ThrowPanelState> OnStateChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public bool ShowNumbers
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public bool CanSelectPlayer
|
public bool CanSelectPlayer
|
||||||
|
|
@ -160,19 +147,24 @@
|
||||||
private void ToggleClick(MouseEventArgs obj)
|
private void ToggleClick(MouseEventArgs obj)
|
||||||
{
|
{
|
||||||
Dispatcher.Dispatch(new ToggleAllPinsAction());
|
Dispatcher.Dispatch(new ToggleAllPinsAction());
|
||||||
// await EventAggregator.PublishAsync(new PinToggleMessage());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OneClick(int number)
|
private async Task OneClick(int number)
|
||||||
{
|
{
|
||||||
Dispatcher.Dispatch(new UpdatePinStateByNumber(number));
|
Dispatcher.Dispatch(new UpdatePinStateByNumberAction(number));
|
||||||
// await EventAggregator.PublishAsync(new NumberPanelMessage(number));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnBellStateChanged(bool obj)
|
private string GetThrowModeName(ThrowMode value)
|
||||||
{
|
{
|
||||||
Dispatcher.Dispatch(new ToggleBellAction());
|
switch (value)
|
||||||
// await OnStateChanged.InvokeAsync(ThrowPanelState);
|
{
|
||||||
|
case ThrowMode.Reposition:
|
||||||
|
return "Abräumen";
|
||||||
|
case ThrowMode.Decrease:
|
||||||
|
return "in die Vollen";
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(value), value, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,52 +4,15 @@
|
||||||
|
|
||||||
|
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<NumberPanel ShowNumbers="ShowNumbers"
|
<NumberPanel/>
|
||||||
CanSelectPlayer="CanSelectPlayers"
|
|
||||||
OnStateChanged="OnThrowPanelStateChanged"
|
|
||||||
/>
|
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<PinPanel @ref="_pinPanel"
|
<PinPanel/>
|
||||||
|
|
||||||
/>
|
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
// [Parameter]
|
|
||||||
// public ThrowPanelState? ThrowPanelState { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<ThrowPanelState> OnStateChanged { get; set; }
|
|
||||||
|
|
||||||
PinPanel _pinPanel;
|
|
||||||
NumberPanel _numberPanel;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public bool ShowNumbers
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public bool CanSelectPlayers
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
|
|
||||||
// public void UpdatePanelState(ThrowPanelState state)
|
|
||||||
// {
|
|
||||||
// _pinPanel.UpdatePanelState(state);
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
private async Task OnThrowPanelStateChanged(ThrowPanelState arg)
|
|
||||||
{
|
|
||||||
await OnStateChanged.InvokeAsync(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
@using KoogleApp.Model.EventMessages
|
@using KoogleApp.Model.EventMessages
|
||||||
@using KoogleApp.Services
|
@using KoogleApp.Services
|
||||||
@using KoogleApp.Store.Game
|
@using KoogleApp.Store.Game
|
||||||
|
@using KoogleApp.Store.Game.ThrowPanel
|
||||||
|
|
||||||
@inherits FluxorComponent
|
@inherits FluxorComponent
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,16 @@
|
||||||
@using KoogleApp.Model
|
@using KoogleApp.Model
|
||||||
@using KoogleApp.Store.Game
|
@using KoogleApp.Store.Game
|
||||||
|
@using KoogleApp.Store.Game.ThrowPanel
|
||||||
|
|
||||||
@inherits FluxorComponent
|
@inherits FluxorComponent
|
||||||
|
|
||||||
@inject IState<ThrowPanelState> ThrowPanelState
|
@inject IState<ThrowPanelState> ThrowPanelState
|
||||||
|
@inject IDispatcher Dispatcher
|
||||||
|
|
||||||
@if (ThrowPanelState.Value.IsStated)
|
@if (ThrowPanelState.Value.IsStated)
|
||||||
{
|
{
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
|
<NumberPinPanel />
|
||||||
<NumberPinPanel @ref="_numberPinPanel"
|
|
||||||
ShowNumbers="true"
|
|
||||||
OnStateChanged="OnNumberPinStateChanged"
|
|
||||||
CanSelectPlayers="true"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<MudItem xs="4">
|
<MudItem xs="4">
|
||||||
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
|
||||||
<MudButton OnClick="SinkLeftClick">
|
<MudButton OnClick="SinkLeftClick">
|
||||||
|
|
@ -48,7 +43,6 @@
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private NumberPinPanel _numberPinPanel;
|
|
||||||
|
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public EventCallback<ThrowEventArgs> OnClick { get; set; }
|
public EventCallback<ThrowEventArgs> OnClick { get; set; }
|
||||||
|
|
@ -60,6 +54,16 @@
|
||||||
// public ThrowPanelState? PanelState { get; set; }
|
// public ThrowPanelState? PanelState { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
protected override void OnAfterRender(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
Dispatcher.Dispatch(new LoadStateFromSessionAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
base.OnAfterRender(firstRender);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task OnNumberPinStateChanged(ThrowPanelState state)
|
private async Task OnNumberPinStateChanged(ThrowPanelState state)
|
||||||
{
|
{
|
||||||
await OnStateChanged.InvokeAsync(state);
|
await OnStateChanged.InvokeAsync(state);
|
||||||
|
|
@ -95,11 +99,5 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void UpdatePanelState(ThrowPanelState state)
|
|
||||||
// {
|
|
||||||
// _numberPinPanel.UpdatePanelState(state);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
@using KoogleApp.Model
|
||||||
|
|
||||||
|
|
||||||
|
<MudDialog Style="height: 400px; width:600px">
|
||||||
|
<TitleContent>
|
||||||
|
<MudText Typo="Typo.h6">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.Favorite" Class="mr-3 mb-n1"/>
|
||||||
|
Save as favorite?
|
||||||
|
</MudText>
|
||||||
|
</TitleContent>
|
||||||
|
<DialogContent>
|
||||||
|
<MudSelect T="Tuple<string, ThrowMode>" Label="Modus" @bind-Value="_valueThrowMode" HelperText="Wähle zwischen Abräumen und in die Vollen"
|
||||||
|
OpenIcon="@Icons.Material.Filled.Mode" AdornmentColor="Color.Primary">
|
||||||
|
@foreach (var item in _items)
|
||||||
|
{
|
||||||
|
<MudSelectItem T="Tuple<string, ThrowMode>" Value="@(item)">@item.Item1</MudSelectItem>
|
||||||
|
}
|
||||||
|
</MudSelect>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Cancel">Abbrechen</MudButton>
|
||||||
|
<MudButton Color="Color.Primary" OnClick="Start">Start</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private List<Tuple<string, ThrowMode>> _items = new List<Tuple<string, ThrowMode>>();
|
||||||
|
|
||||||
|
protected override void OnAfterRender(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
_items.Add(new Tuple<string, ThrowMode>("in die Vollen", ThrowMode.Reposition));
|
||||||
|
_items.Add(new Tuple<string, ThrowMode>("Abräumen", ThrowMode.Decrease));
|
||||||
|
|
||||||
|
_valueThrowMode = _items[0];
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[CascadingParameter]
|
||||||
|
private IMudDialogInstance MudDialog { get; set; }
|
||||||
|
|
||||||
|
private Tuple<string, ThrowMode> _valueThrowMode;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public string Description { get; set; } = "";
|
||||||
|
|
||||||
|
private void Cancel() => MudDialog.Cancel();
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
// if (!string.IsNullOrEmpty(Description))
|
||||||
|
{
|
||||||
|
// Snackbar.Add("Favorite added", Severity.Success);
|
||||||
|
MudDialog.Close(DialogResult.Ok(new StartParams(_valueThrowMode.Item2, 3)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,9 +5,11 @@
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Microsoft.AspNetCore.SignalR.Client
|
@using Microsoft.AspNetCore.SignalR.Client
|
||||||
@using KoogleApp.Components.Controls
|
@using KoogleApp.Components.Controls
|
||||||
|
@using KoogleApp.Components.Dialogs
|
||||||
@using KoogleApp.Model.EventMessages
|
@using KoogleApp.Model.EventMessages
|
||||||
@using KoogleApp.Model.Framework
|
@using KoogleApp.Model.Framework
|
||||||
@using KoogleApp.Store.Game
|
@using KoogleApp.Store.Game
|
||||||
|
@using KoogleApp.Store.Game.ThrowPanel
|
||||||
|
|
||||||
@inherits FluxorComponent
|
@inherits FluxorComponent
|
||||||
|
|
||||||
|
|
@ -21,6 +23,7 @@
|
||||||
@inject IMyEventAggregator EventAggregator
|
@inject IMyEventAggregator EventAggregator
|
||||||
@inject IState<ThrowPanelState> ThrowPanelState
|
@inject IState<ThrowPanelState> ThrowPanelState
|
||||||
@inject IDispatcher Dispatcher
|
@inject IDispatcher Dispatcher
|
||||||
|
@inject IDialogService DialogService
|
||||||
|
|
||||||
@* @inject IGameStatusDataService _dataService; *@
|
@* @inject IGameStatusDataService _dataService; *@
|
||||||
|
|
||||||
|
|
@ -41,10 +44,11 @@
|
||||||
Class="mr-5" OnClick="RedoClick"/>
|
Class="mr-5" OnClick="RedoClick"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
|
||||||
<MudTooltip Text="Start" Color="Color.Primary" Placement="Placement.Bottom" Arrow="true">
|
<MudTooltip Text="@(ThrowPanelState.Value.IsStated ? "Stop" : "Start")"
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Start" Variant="Variant.Filled" Color="Color.Primary"
|
Color="Color.Primary" Placement="Placement.Bottom" Arrow="true">
|
||||||
Disabled="@(ThrowPanelState.Value.IsStated)"
|
<MudIconButton Icon="@(ThrowPanelState.Value.IsStated ? Icons.Material.Filled.Stop : Icons.Material.Filled.Start)"
|
||||||
Class="mr-5" OnClick="StartClick"/>
|
Variant="Variant.Filled" Color="Color.Primary"
|
||||||
|
Class="mr-5" OnClick="StartStopClick"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
|
||||||
</MudToolBar>
|
</MudToolBar>
|
||||||
|
|
@ -249,13 +253,41 @@
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartClick()
|
private async Task StartStopClick()
|
||||||
{
|
{
|
||||||
var action = new StartAction(ThrowPanelState.Value);
|
if (!ThrowPanelState.Value.IsStated)
|
||||||
|
{
|
||||||
|
var parameters = new DialogParameters<StartGameDialog> { { x => x.Description, "" }};
|
||||||
|
// parameters.Add<TimeRecordDto>(x => x.Record, Record);
|
||||||
|
|
||||||
|
var options = new DialogOptions
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var dialog = await DialogService.ShowAsync<StartGameDialog>("Spiel starten", parameters, options);
|
||||||
|
var result = await dialog.Result;
|
||||||
|
var startParams = result.Data as StartParams;
|
||||||
|
if (!result.Canceled)
|
||||||
|
{
|
||||||
|
var action = new StartStopAction(ThrowPanelState.Value, startParams);
|
||||||
Dispatcher.Dispatch(action);
|
Dispatcher.Dispatch(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = await DialogService.ShowMessageBox("Spiel beenden?", "Spiel wirklich abbrechen?", "JA", "NEIN");
|
||||||
|
if (result.Value)
|
||||||
|
{
|
||||||
|
var action = new StartStopAction(ThrowPanelState.Value,null);
|
||||||
|
Dispatcher.Dispatch(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// _throwPanelState = ThrowPanelState.Create();
|
// _throwPanelState = ThrowPanelState.Create();
|
||||||
// await BroadcastThrowPanelState(_throwPanelState);
|
// await BroadcastThrowPanelStateAction(_throwPanelState);
|
||||||
|
|
||||||
// await InvokeAsync(StateHasChanged);
|
// await InvokeAsync(StateHasChanged);
|
||||||
}
|
}
|
||||||
|
|
@ -274,10 +306,10 @@
|
||||||
|
|
||||||
// private async Task OnThrowPanelStateChanged(ThrowPanelState state)
|
// private async Task OnThrowPanelStateChanged(ThrowPanelState state)
|
||||||
// {
|
// {
|
||||||
// await BroadcastThrowPanelState(state);
|
// await BroadcastThrowPanelStateAction(state);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// private async Task BroadcastThrowPanelState(ThrowPanelState state)
|
// private async Task BroadcastThrowPanelStateAction(ThrowPanelState state)
|
||||||
// {
|
// {
|
||||||
// if (hubConnection is not null)
|
// if (hubConnection is not null)
|
||||||
// {
|
// {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
using Fluxor;
|
using Fluxor;
|
||||||
using KoogleApp.Model;
|
using KoogleApp.Model;
|
||||||
using KoogleApp.Services;
|
using KoogleApp.Services;
|
||||||
using KoogleApp.Store.Game;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.AspNetCore.SignalR.Client;
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using KoogleApp.Store.Game.ThrowPanel;
|
||||||
|
|
||||||
namespace KoogleApp.Hub
|
namespace KoogleApp.Hub
|
||||||
{
|
{
|
||||||
|
|
@ -40,7 +40,7 @@ namespace KoogleApp.Hub
|
||||||
|
|
||||||
_hubConnection.On<ThrowPanelState>("ReceiveThrowPanelState", state =>
|
_hubConnection.On<ThrowPanelState>("ReceiveThrowPanelState", state =>
|
||||||
{
|
{
|
||||||
dispatcher.Dispatch(new ReceiveStateFromServer(state));
|
dispatcher.Dispatch(new ReceiveStateFromServerAction(state));
|
||||||
});
|
});
|
||||||
|
|
||||||
// _hubConnection.On<string>("ReceiveTextUpdate", (newText) =>
|
// _hubConnection.On<string>("ReceiveTextUpdate", (newText) =>
|
||||||
|
|
@ -52,7 +52,7 @@ namespace KoogleApp.Hub
|
||||||
await _hubConnection.StartAsync();
|
await _hubConnection.StartAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task HandleStartAction(StartAction action, IDispatcher dispatcher)
|
public async Task HandelBroadcastThrowPanelStateAction(BroadcastThrowPanelStateAction action, IDispatcher dispatcher)
|
||||||
{
|
{
|
||||||
if (_hubConnection?.State != HubConnectionState.Connected)
|
if (_hubConnection?.State != HubConnectionState.Connected)
|
||||||
{
|
{
|
||||||
|
|
@ -69,7 +69,7 @@ namespace KoogleApp.Hub
|
||||||
|
|
||||||
//await Clients.Others.SendAsync("ReceiveThrowPanelState", new ThrowPanelState());
|
//await Clients.Others.SendAsync("ReceiveThrowPanelState", new ThrowPanelState());
|
||||||
|
|
||||||
//await _hubConnection.InvokeAsync("StartAction", action);
|
//await _hubConnection.InvokeAsync("StartStopAction", stopAction);
|
||||||
|
|
||||||
// Der Server wird ActivityAdded an alle Clients senden,
|
// Der Server wird ActivityAdded an alle Clients senden,
|
||||||
// einschließlich diesem. Dann wird ActivityAddedAction dispatched.
|
// einschließlich diesem. Dann wird ActivityAddedAction dispatched.
|
||||||
|
|
@ -198,7 +198,7 @@ namespace KoogleApp.Hub
|
||||||
{
|
{
|
||||||
await Clients.Others.SendAsync("ReceiveThrowPanelState", state);
|
await Clients.Others.SendAsync("ReceiveThrowPanelState", state);
|
||||||
|
|
||||||
//await _hubConnection.InvokeAsync("StartAction", action);
|
//await _hubConnection.InvokeAsync("StartStopAction", action);
|
||||||
|
|
||||||
// Der Server wird ActivityAdded an alle Clients senden,
|
// Der Server wird ActivityAdded an alle Clients senden,
|
||||||
// einschließlich diesem. Dann wird ActivityAddedAction dispatched.
|
// einschließlich diesem. Dann wird ActivityAddedAction dispatched.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace KoogleApp.Model
|
||||||
|
{
|
||||||
|
public record StartParams(ThrowMode ThrowMode, int ThrowsPerRound)
|
||||||
|
{
|
||||||
|
public StartParams() : this(ThrowMode: ThrowMode.Reposition, ThrowsPerRound:3)
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Fluxor;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
|
||||||
|
namespace KoogleApp.Model
|
||||||
|
{
|
||||||
|
public enum ThrowMode
|
||||||
|
{
|
||||||
|
Reposition, // in die Vollen
|
||||||
|
Decrease // Abräumen
|
||||||
|
}
|
||||||
|
|
||||||
|
[FeatureState]
|
||||||
|
public record ThrowPanelState(bool IsStated, bool BellValue,
|
||||||
|
bool Pin1Value, bool Pin2Value, bool Pin3Value, bool Pin4Value, bool Pin5Value, bool Pin6Value, bool Pin7Value, bool Pin8Value, bool Pin9Value,
|
||||||
|
bool Pin1Disabled, bool Pin2Disabled, bool Pin3Disabled, bool Pin4Disabled, bool Pin5Disabled, bool Pin6Disabled, bool Pin7Disabled, bool Pin8Disabled, bool Pin9Disabled,
|
||||||
|
int ThrowsPerRound, int ThrowCounter, ThrowMode ThrowMode)
|
||||||
|
{
|
||||||
|
// Required for creating initial state
|
||||||
|
public ThrowPanelState() : this(BellValue:false, IsStated:false,
|
||||||
|
Pin1Value:false, Pin2Value:false, Pin3Value: false, Pin4Value: false, Pin5Value: false, Pin6Value: false, Pin7Value: false, Pin8Value: false, Pin9Value: false,
|
||||||
|
Pin1Disabled:false, Pin2Disabled:false, Pin3Disabled: false, Pin4Disabled: false, Pin5Disabled: false, Pin6Disabled: false, Pin7Disabled: false, Pin8Disabled: false, Pin9Disabled: false,
|
||||||
|
ThrowsPerRound : 3, ThrowCounter : 0, ThrowMode : ThrowMode.Reposition
|
||||||
|
)
|
||||||
|
{ }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -22,7 +22,7 @@ namespace KoogleApp.Services
|
||||||
private GameStatusSnapshot _currentData;
|
private GameStatusSnapshot _currentData;
|
||||||
private readonly Stack<GameStatusSnapshot> _undoStack;
|
private readonly Stack<GameStatusSnapshot> _undoStack;
|
||||||
private readonly Stack<GameStatusSnapshot> _redoStack;
|
private readonly Stack<GameStatusSnapshot> _redoStack;
|
||||||
private readonly object _lock = new object();
|
private readonly Lock _lock = new Lock();
|
||||||
private readonly string _dataFilePath = "appdata.json";
|
private readonly string _dataFilePath = "appdata.json";
|
||||||
private const int MaxUndoSteps = 50;
|
private const int MaxUndoSteps = 50;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,5 +15,16 @@ namespace KoogleApp.Services
|
||||||
{
|
{
|
||||||
await sessionStorage.SetAsync("selectedPlayer", record);
|
await sessionStorage.SetAsync("selectedPlayer", record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<ThrowPanelState?> GetThrowPanelStateAsync()
|
||||||
|
{
|
||||||
|
var result = await sessionStorage.GetAsync<ThrowPanelState>("throwPanelState");
|
||||||
|
return result.Success ? result.Value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SetThrowPanelStateAsync(ThrowPanelState state)
|
||||||
|
{
|
||||||
|
await sessionStorage.SetAsync("throwPanelState", state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
using KoogleApp.Model;
|
||||||
|
|
||||||
|
namespace KoogleApp.Store.Game.ThrowPanel
|
||||||
|
{
|
||||||
|
public record TogglePinValueAction(bool IsOn, int PinNumber);
|
||||||
|
|
||||||
|
public record StartStopAction(ThrowPanelState State, StartParams? StartParams);
|
||||||
|
|
||||||
|
public record ConnectToHubAction();
|
||||||
|
|
||||||
|
public record ToggleAllPinsAction();
|
||||||
|
|
||||||
|
public record ToggleBellAction();
|
||||||
|
|
||||||
|
public record UpdatePinStateByNumberAction(int Number);
|
||||||
|
|
||||||
|
public record ReceiveStateFromServerAction(ThrowPanelState State);
|
||||||
|
|
||||||
|
public record LoadStateFromSessionAction();
|
||||||
|
|
||||||
|
public record StateLoadedAction(ThrowPanelState? State);
|
||||||
|
|
||||||
|
public record BroadcastThrowPanelStateAction(ThrowPanelState State);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,128 @@
|
||||||
|
using Fluxor;
|
||||||
|
using KoogleApp.Hub;
|
||||||
|
using KoogleApp.Model;
|
||||||
|
using KoogleApp.Services;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace KoogleApp.Store.Game.ThrowPanel
|
||||||
|
{
|
||||||
|
public class ThrowPanelEffects : IDisposable
|
||||||
|
{
|
||||||
|
private readonly ILogger<ThrowPanelEffects> _logger;
|
||||||
|
private readonly HubConnectionService _sharedModelHub;
|
||||||
|
private readonly IState<ThrowPanelState> _state;
|
||||||
|
private readonly SessionStorage _sessionStorage;
|
||||||
|
private readonly string _dataFilePath = "ThrowPanelState.json";
|
||||||
|
|
||||||
|
public ThrowPanelEffects(
|
||||||
|
ILogger<ThrowPanelEffects> logger,
|
||||||
|
HubConnectionService sharedModelHub, IState<ThrowPanelState> state,
|
||||||
|
SessionStorage sessionStorage)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_sharedModelHub = sharedModelHub;
|
||||||
|
_state = state;
|
||||||
|
_sessionStorage = sessionStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
//_sharedModelHub?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
//[EffectMethod(typeof(StartStopAction))]
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleStartAction(StartStopAction stopAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new BroadcastThrowPanelStateAction(_state.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleToggleAllPinsAction(ToggleAllPinsAction stopAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new BroadcastThrowPanelStateAction(_state.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleTogglePinValueAction(TogglePinValueAction stopAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new BroadcastThrowPanelStateAction(_state.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleUpdatePinStateByNumberAction(UpdatePinStateByNumberAction stopAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new BroadcastThrowPanelStateAction(_state.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleToggleBellAction(ToggleBellAction stopAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new BroadcastThrowPanelStateAction(_state.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandleConnectToHubAction(ConnectToHubAction action, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _sharedModelHub.ConnectToHub(dispatcher);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Failed to connect to hub");
|
||||||
|
//dispatcher.Dispatch(new HubConnectionFailedAction(ex.Message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandelLoadStateAction(LoadStateFromSessionAction stateFromSessionAction, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
var state = await _sessionStorage.GetThrowPanelStateAsync();
|
||||||
|
|
||||||
|
if (state == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(_dataFilePath))
|
||||||
|
{
|
||||||
|
var json = await File.ReadAllTextAsync(_dataFilePath);
|
||||||
|
state = JsonSerializer.Deserialize<ThrowPanelState>(json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// TODO error handling
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state != null)
|
||||||
|
{
|
||||||
|
dispatcher.Dispatch(new StateLoadedAction(state));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[EffectMethod]
|
||||||
|
public async Task HandelBroadcastThrowPanelStateAction(BroadcastThrowPanelStateAction action, IDispatcher dispatcher)
|
||||||
|
{
|
||||||
|
await _sessionStorage.SetThrowPanelStateAsync(action.State);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var json = JsonSerializer.Serialize(action.State, new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
WriteIndented = true
|
||||||
|
});
|
||||||
|
await File.WriteAllTextAsync(_dataFilePath, json);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// TODO error handling
|
||||||
|
}
|
||||||
|
|
||||||
|
await _sharedModelHub.HandelBroadcastThrowPanelStateAction(action, dispatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,51 +1,19 @@
|
||||||
using System.Runtime.InteropServices;
|
using Fluxor;
|
||||||
using Fluxor;
|
using KoogleApp.Model;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
|
|
||||||
namespace KoogleApp.Store.Game
|
namespace KoogleApp.Store.Game.ThrowPanel
|
||||||
{
|
{
|
||||||
[FeatureState]
|
|
||||||
public record ThrowPanelState(bool IsStated, bool BellValue,
|
|
||||||
bool Pin1Value, bool Pin2Value, bool Pin3Value, bool Pin4Value, bool Pin5Value, bool Pin6Value, bool Pin7Value, bool Pin8Value, bool Pin9Value,
|
|
||||||
bool Pin1Disabled, bool Pin2Disabled, bool Pin3Disabled, bool Pin4Disabled, bool Pin5Disabled, bool Pin6Disabled, bool Pin7Disabled, bool Pin8Disabled, bool Pin9Disabled
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Required for creating initial state
|
|
||||||
public ThrowPanelState() : this(BellValue:false, IsStated:false,
|
|
||||||
Pin1Value:false, Pin2Value:false, Pin3Value: false, Pin4Value: false, Pin5Value: false, Pin6Value: false, Pin7Value: false, Pin8Value: false, Pin9Value: false,
|
|
||||||
Pin1Disabled:false, Pin2Disabled:false, Pin3Disabled: false, Pin4Disabled: false, Pin5Disabled: false, Pin6Disabled: false, Pin7Disabled: false, Pin8Disabled: false, Pin9Disabled: false
|
|
||||||
)
|
|
||||||
{ }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Actions
|
|
||||||
public record TogglePinValueAction(bool IsOn, int PinNumber);
|
|
||||||
|
|
||||||
public record StartAction(ThrowPanelState State);
|
|
||||||
|
|
||||||
public record ConnectToHubAction();
|
|
||||||
|
|
||||||
public record ToggleAllPinsAction();
|
|
||||||
|
|
||||||
public record ToggleBellAction();
|
|
||||||
|
|
||||||
public record UpdatePinStateByNumber(int Number);
|
|
||||||
|
|
||||||
public record ReceiveStateFromServer(ThrowPanelState State);
|
|
||||||
|
|
||||||
// Reducer
|
// Reducer
|
||||||
public static class ThrowPanelStateReducer
|
public static class ThrowPanelStateReducer
|
||||||
{
|
{
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
public static ThrowPanelState ReceiveStateFromServer(ThrowPanelState state, ReceiveStateFromServer action)
|
public static ThrowPanelState OnReceiveStateFromServer(ThrowPanelState state, ReceiveStateFromServerAction action)
|
||||||
{
|
{
|
||||||
return action.State;
|
return action.State;
|
||||||
}
|
}
|
||||||
|
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
public static ThrowPanelState OnToggleDevice(ThrowPanelState state, TogglePinValueAction action)
|
public static ThrowPanelState OnTogglePinValue(ThrowPanelState state, TogglePinValueAction action)
|
||||||
{
|
{
|
||||||
switch (action.PinNumber)
|
switch (action.PinNumber)
|
||||||
{
|
{
|
||||||
|
|
@ -73,9 +41,23 @@ namespace KoogleApp.Store.Game
|
||||||
}
|
}
|
||||||
|
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
public static ThrowPanelState OnStart(ThrowPanelState state, StartAction action)
|
public static ThrowPanelState OnStartStop(ThrowPanelState state, StartStopAction startStopAction)
|
||||||
{
|
{
|
||||||
return state with { IsStated = true };
|
var newState = new ThrowPanelState();
|
||||||
|
if (state.IsStated)
|
||||||
|
{
|
||||||
|
return newState with { IsStated = false };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startStopAction.StartParams != null)
|
||||||
|
return newState with
|
||||||
|
{
|
||||||
|
IsStated = !state.IsStated,
|
||||||
|
ThrowMode = startStopAction.StartParams.ThrowMode,
|
||||||
|
ThrowsPerRound = startStopAction.StartParams.ThrowsPerRound
|
||||||
|
};
|
||||||
|
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
|
|
@ -102,7 +84,7 @@ namespace KoogleApp.Store.Game
|
||||||
}
|
}
|
||||||
|
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
public static ThrowPanelState OnUpdatePinStateByNumber(ThrowPanelState state, UpdatePinStateByNumber action)
|
public static ThrowPanelState OnUpdatePinStateByNumber(ThrowPanelState state, UpdatePinStateByNumberAction action)
|
||||||
{
|
{
|
||||||
var chgCnt = 0;
|
var chgCnt = 0;
|
||||||
|
|
||||||
|
|
@ -144,9 +126,15 @@ namespace KoogleApp.Store.Game
|
||||||
}
|
}
|
||||||
|
|
||||||
[ReducerMethod]
|
[ReducerMethod]
|
||||||
public static ThrowPanelState OnUpdatePinStateByNumber(ThrowPanelState state, ToggleBellAction action)
|
public static ThrowPanelState OnToggleBell(ThrowPanelState state, ToggleBellAction action)
|
||||||
{
|
{
|
||||||
return state with { BellValue = !state.BellValue };
|
return state with { BellValue = !state.BellValue };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ReducerMethod]
|
||||||
|
public static ThrowPanelState OnStateLoaded(ThrowPanelState state, StateLoadedAction action)
|
||||||
|
{
|
||||||
|
return action.State;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
using Fluxor;
|
|
||||||
using KoogleApp.Hub;
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
using Microsoft.AspNetCore.SignalR.Client;
|
|
||||||
|
|
||||||
namespace KoogleApp.Store.Game
|
|
||||||
{
|
|
||||||
public class ThrowPanelEffects : IDisposable
|
|
||||||
{
|
|
||||||
private readonly ILogger<ThrowPanelEffects> _logger;
|
|
||||||
private readonly HubConnectionService _sharedModelHub;
|
|
||||||
private readonly IState<ThrowPanelState> _state;
|
|
||||||
|
|
||||||
public ThrowPanelEffects(
|
|
||||||
ILogger<ThrowPanelEffects> logger,
|
|
||||||
HubConnectionService sharedModelHub, IState<ThrowPanelState> state)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
_sharedModelHub = sharedModelHub;
|
|
||||||
_state = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
//_sharedModelHub?.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
//[EffectMethod(typeof(StartAction))]
|
|
||||||
[EffectMethod]
|
|
||||||
public async Task HandleStartAction(StartAction action, IDispatcher dispatcher)
|
|
||||||
{
|
|
||||||
await _sharedModelHub.HandleStartAction(new StartAction(_state.Value), dispatcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
[EffectMethod]
|
|
||||||
public async Task HandleConnectToHubAction(ConnectToHubAction action, IDispatcher dispatcher)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await _sharedModelHub.ConnectToHub(dispatcher);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Failed to connect to hub");
|
|
||||||
//dispatcher.Dispatch(new HubConnectionFailedAction(ex.Message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"IsStated": true,
|
||||||
|
"BellValue": false,
|
||||||
|
"Pin1Value": true,
|
||||||
|
"Pin2Value": false,
|
||||||
|
"Pin3Value": true,
|
||||||
|
"Pin4Value": false,
|
||||||
|
"Pin5Value": true,
|
||||||
|
"Pin6Value": true,
|
||||||
|
"Pin7Value": false,
|
||||||
|
"Pin8Value": false,
|
||||||
|
"Pin9Value": false,
|
||||||
|
"Pin1Disabled": false,
|
||||||
|
"Pin2Disabled": false,
|
||||||
|
"Pin3Disabled": false,
|
||||||
|
"Pin4Disabled": false,
|
||||||
|
"Pin5Disabled": false,
|
||||||
|
"Pin6Disabled": false,
|
||||||
|
"Pin7Disabled": false,
|
||||||
|
"Pin8Disabled": false,
|
||||||
|
"Pin9Disabled": false,
|
||||||
|
"ThrowsPerRound": 3,
|
||||||
|
"ThrowCounter": 0,
|
||||||
|
"ThrowMode": 1
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue