about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateInitialStateOptions.razor
blob: 99facbfffad56c2662810b33ec766d21ec940009 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
@using System.Text.Json
@using ArcaneLibs.Extensions
@using LibMatrix
@using LibMatrix.Helpers
<tr>
    <td style="vertical-align: top;">Initial room state:</td>
    <td>
        @foreach (var (displayName, events) in new Dictionary<string, List<StateEvent>>() {
                          { "Important room state (before final access rules)", roomBuilder.ImportantState },
                          { "Additional room state (after final access rules)", roomBuilder.InitialState },
                      }) {
            <details open>

                @code
                {
                    // private static readonly string[] ImplementedStates = { "m.room.avatar", "m.room.history_visibility", "m.room.guest_access", "m.room.server_acl" };
                }

                @* <summary>@displayName: @events.Count(x => !ImplementedStates.Contains(x.Type)) events</summary> *@
                <summary>@displayName: @events.Count events</summary>
                <LinkButton OnClick="@(() => {
                                         events.Clear();
                                         StateHasChanged();
                                     })">Remove all
                </LinkButton>
                <LinkButton OnClick="@(() => {
                                         events.Insert(0, new() {
                                             Type = "",
                                             StateKey = "",
                                             RawContent = new(),
                                         });
                                         StateHasChanged();
                                     })">Add new event
                </LinkButton>
                <br/>
                @if (events.Count > 1000) {
                    <span style="color: red;">Warning: Too many initial state events! (more than 1000) - Please use the save/load feature in the state panel instead.</span>
                }
                else {
                    int i = 0;
                    @foreach (var initialState in events) {
                        <div id="@(initialState.Type + "/" + initialState.StateKey)">
                            <span>Event @(++i) (@GetRemoveButton(events, initialState))</span>
                            <br/>
                            @* <FancyTextBox Multiline="true" Value="@initialState.ToJson(ignoreNull: true)" *@
                            @*               ValueChanged="@(json => { *@
                            @*                                 if (string.IsNullOrWhiteSpace(json)) *@
                            @*                                     events.Remove(initialState); *@
                            @*                                 else *@
                            @*                                     events.Replace(initialState, JsonSerializer.Deserialize<StateEvent>(json)); *@
                            @*                                 StateHasChanged(); *@
                            @*                             })"></FancyTextBox> *@
                            <FancyTextBoxLazyJson T="StateEvent" Value="@initialState" ValueChanged="@(evt => { events.Replace(initialState, evt); })"></FancyTextBoxLazyJson>
                            <br/>
                        </div>
                    }
                }
            </details>
        }
    </td>
</tr>

@code {

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

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

    [Parameter]
    public AuthenticatedHomeserverGeneric Homeserver { get; set; }

    private RenderFragment GetRemoveButton(List<StateEvent> events, StateEvent initialState) {
        return @<span>
            <LinkButton InlineText="true" OnClick="@(() => {
                                                       events.Remove(initialState);
                                                       PageStateHasChanged();
                                                   })">Remove</LinkButton>
        </span>;
    }

}