about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor
blob: 6e8fe2f9382c46afca5e5e5f3c37e229325b3247 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
@page "/Rooms/{RoomId}/State/View"
@using LibMatrix.Extensions
@using LibMatrix.Responses
@using ArcaneLibs.Extensions
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
<h3>Room state viewer - Viewing @RoomId</h3>
<hr/>

<p>@status</p>

<input type="checkbox" id="showAll" @bind="ShowMembershipEvents"/> Show member events

<table class="table table-striped table-hover" style="width: fit-Content;">
    <thead>
    <tr>
        <th scope="col">Type</th>
        <th scope="col">Content</th>
    </tr>
    </thead>
    <tbody>
    @foreach (var stateEvent in FilteredEvents.Where(x => x.StateKey == "").OrderBy(x => x.OriginServerTs)) {
        <tr>
            <td>@stateEvent.Type</td>
            <td style="max-width: fit-Content;">
                <pre>@stateEvent.RawContent.ToJson()</pre>
            </td>
        </tr>
    }
    </tbody>
</table>

@foreach (var group in FilteredEvents.GroupBy(x => x.StateKey).OrderBy(x => x.Key).Where(x => x.Key != "")) {
    <details>
        <summary>@group.Key</summary>
        <table class="table table-striped table-hover" style="width: fit-Content;">
            <thead>
            <tr>
                <th scope="col">Type</th>
                <th scope="col">Content</th>
            </tr>
            </thead>
            <tbody>
            @foreach (var stateEvent in group.OrderBy(x => x.OriginServerTs)) {
                <tr>
                    <td>@stateEvent.Type</td>
                    <td style="max-width: fit-Content;">
                        <pre>@stateEvent.RawContent.ToJson()</pre>
                    </td>
                </tr>
            }
            </tbody>
        </table>
    </details>
}

<LogView></LogView>

@code {
    //get room list
    // - sync withroom list filter
    // Type = support.feline.msc3784
    //support.feline.policy.lists.msc.v1

    [Parameter]
    public string? RoomId { get; set; }

    public List<StateEventResponse> FilteredEvents { get; set; } = new();
    public List<StateEventResponse> Events { get; set; } = new();
    public string status = "";

    protected override async Task OnInitializedAsync() {
        await base.OnInitializedAsync();
        var hs = await MRUStorage.GetCurrentSessionOrNavigate();
        if (hs is null) return;
        await LoadStatesAsync();
        Console.WriteLine("Policy list editor initialized!");
    }

    private DateTime _lastUpdate = DateTime.Now;

    private async Task LoadStatesAsync() {
        var StateLoaded = 0;
        var hs = await MRUStorage.GetCurrentSessionOrNavigate();
        if (hs is null) return;
        var response = (hs.GetRoom(RoomId)).GetFullStateAsync();
        await foreach (var _ev in response) {
            Events.Add(_ev);
            if (string.IsNullOrEmpty(_ev.StateKey)) {
                FilteredEvents.Add(_ev);
            }
            StateLoaded++;

            if (!((DateTime.Now - _lastUpdate).TotalMilliseconds > 100)) continue;
            _lastUpdate = DateTime.Now;
            status = $"Loaded {StateLoaded} state events";
            StateHasChanged();
            await Task.Delay(0);
        }

        StateHasChanged();
    }

    private async Task RebuildFilteredData() {
        status = "Rebuilding filtered data...";
        StateHasChanged();
        await Task.Delay(1);
        var _FilteredEvents = Events;
        if (!ShowMembershipEvents)
            _FilteredEvents = _FilteredEvents.Where(x => x.Type != "m.room.member").ToList();

        status = "Done, rerendering!";
        StateHasChanged();
        await Task.Delay(1);
        FilteredEvents = _FilteredEvents;
        StateHasChanged();
    }

    public bool ShowMembershipEvents {
        get => _showMembershipEvents;
        set {
            _showMembershipEvents = value;
            RebuildFilteredData();
        }
    }

    private bool _showMembershipEvents;
}