diff --git a/web/src/ui/roomview/RoomViewHeader.tsx b/web/src/ui/roomview/RoomViewHeader.tsx
index 9bfc272..7c771a1 100644
--- a/web/src/ui/roomview/RoomViewHeader.tsx
+++ b/web/src/ui/roomview/RoomViewHeader.tsx
@@ -39,14 +39,6 @@ const RoomViewHeader = ({ room }: RoomViewHeaderProps) => {
? roomMeta.lazy_load_summary.heroes[0] : room.roomID
const mainScreen = use(MainScreenContext)
const openModal = use(ModalContext)
- const openStateViewer = useCallback(() => {
- openModal({
- dimmed: true,
- boxed: true,
- innerBoxClass: "state-view",
- content: ,
- })
- }, [room, openModal])
const openSettings = useCallback(() => {
openModal({
dimmed: true,
diff --git a/web/src/ui/stateviewer/StateViewer.tsx b/web/src/ui/stateviewer/StateViewer.tsx
new file mode 100644
index 0000000..a819ef6
--- /dev/null
+++ b/web/src/ui/stateviewer/StateViewer.tsx
@@ -0,0 +1,61 @@
+import { RoomStateStore } from "@/api/statestore"
+import { useState } from "react"
+import JSONView from "../util/JSONView"
+
+interface StateViewerProps {
+ room: RoomStateStore
+}
+
+// 1. you go in the state viewer, it shows buttons with each state event type
+// 2. you click a button, it shows the state keys for that type
+// 3. you click a state key, it shows a JSONView of the event
+
+const StateViewer = ({ room }: StateViewerProps) => {
+ // state
+ const [page, setPage] = useState("state-type")
+ const [stateType, setStateType] = useState("")
+ const [stateKey, setStateKey] = useState("")
+ // button actions
+ // 1
+ const stateTypeClick = (evt: React.MouseEvent) => {
+ const type = evt.currentTarget.getAttribute("data-state-type")
+ if (!type) {
+ return
+ }
+ console.log(room.state.get(type))
+ // progress to 2
+ setStateType(type)
+ setPage("state-key")
+ }
+ // 2
+ const stateKeyClick = (evt: React.MouseEvent) => {
+ const key = evt.currentTarget.getAttribute("data-state-key")
+ if (!key) {
+ return
+ }
+ // progress to 3
+ setStateKey(key)
+ setPage("state-event")
+ }
+
+ // render 1, 2 or 3
+ switch (page) {
+ case "state-type":
+ const types: string[] = []
+ for (const [type] of room.state) {
+ types.push(type)
+ }
+ return types.map(type => )
+ case "state-key":
+ const keys: string[] = []
+ for (const [key] of room.state.get(stateType) ?? []) { // ?? [] makes the rest pointless, TODO short circuit lol
+ keys.push(key)
+ }
+ return keys.map(type => )
+ case "state-event":
+ const content = room.getStateEvent(stateType, stateKey)
+ return
+ }
+}
+
+export default StateViewer
\ No newline at end of file