about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateStateDisplay.razor
blob: eb373ba983778747437c2fe7e919eb1adef4191f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@using System.Text.Json
@using System.Text.Json.Nodes
@using ArcaneLibs.Blazor.Components.Services
@using ArcaneLibs.Extensions
@using LibMatrix.Helpers
@inject BlazorSaveFileService SaveFileService
<div
    style="position: fixed; top: 56px; right: 0; width: fit-content; max-width: 25%; height: calc(100vh - 56px); overflow: auto; background-color: #2c3054; padding-right: 32px; border-left: 1px solid #ccc;">
    <details open>
        <summary>RoomBuilder state</summary>
        <InputCheckbox @bind-Value="@ShowNullInState"/>
        <span>Show null values</span><br/>
        <LinkButton OnClickAsync="@SaveFile">Save</LinkButton>
        <SimpleFilePicker OnFilePicked="@LoadFile"/>
        <br/>
        <pre>
                @RoomBuilder.ToJson(ignoreNull: !ShowNullInState)
            </pre>
    </details>
</div>

@code {

    [Parameter]
    public required RoomBuilder RoomBuilder { get; set; }

    [Parameter]
    public required EventCallback<RoomBuilder> RoomBuilderChanged { get; set; }

    [Parameter]
    public required Action PageStateHasChanged { get; set; }

    private bool ShowNullInState { get; set; }

    private async Task SaveFile() {
        Console.WriteLine("Saving room builder state to file...");
        await SaveFileService.SaveFileAsync("room-builder.json", RoomBuilder.ToJson(), "application/json");
    }

    private async Task LoadFile(InputFileChangeEventArgs e) {
        if (!RoomBuilderChanged.HasDelegate) throw new InvalidOperationException("RoomBuilderChanged must have a delegate.");
        if (e.FileCount == 0) return;
        Console.WriteLine("Loading room builder state from file...");
        var stream = e.File.OpenReadStream(4 * 1024 * 1024 * 1024L);
        var json = await JsonSerializer.DeserializeAsync<JsonObject>(stream);
        if (json is null) {
            Console.WriteLine("Failed to deserialize JSON from file.");
            return;
        }

        if (json.ContainsKey(nameof(RoomUpgradeBuilder.UpgradeOptions))) {
            Console.WriteLine("Got room upgrade builder state.");
            RoomBuilder = json.Deserialize<RoomUpgradeBuilder>();
        }
        else {
            Console.WriteLine("Got room builder state.");
            RoomBuilder = json.Deserialize<RoomBuilder>();
        }

        await RoomBuilderChanged.InvokeAsync(RoomBuilder);
        PageStateHasChanged();
        Console.WriteLine("Room builder state loaded from file.");
    }

}