diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 283b9b4..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/webui/src/components/common/Loader.module.scss b/webui/src/components/common/Loader.module.scss
new file mode 100644
index 0000000..2fb7047
--- /dev/null
+++ b/webui/src/components/common/Loader.module.scss
@@ -0,0 +1,33 @@
+@import "../../globals";
+
+.loader {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+
+ > svg {
+ animation-name: spinny-spin;
+ animation-duration: 2s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+
+ width: 80px;
+ height: 80px;
+
+ stroke-width: 1.5px;
+ }
+
+ > span {
+ margin-top: var(--veles-layout-padding);
+ font-size: 1.5em;
+ }
+}
+
+@keyframes spinny-spin {
+ 0% {transform: rotate(0turn)}
+ 100% {transform: rotate(1turn)}
+}
\ No newline at end of file
diff --git a/webui/src/components/common/Loader.tsx b/webui/src/components/common/Loader.tsx
new file mode 100644
index 0000000..f5b03ef
--- /dev/null
+++ b/webui/src/components/common/Loader.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+import {Loader as LoaderIcon} from "lucide-react";
+
+import styles from "./Loader.module.scss";
+import {Trans} from "react-i18next";
+
+const Loader = () => {
+ return
+
+ Loading...
+
+}
+
+export const LoaderSuspense = (props: React.PropsWithChildren<{}>) => } children={props.children} />
+
+//export const LoaderSuspense = (props: React.PropsWithChildren<{}>) =>
+
+export default Loader;
\ No newline at end of file
diff --git a/webui/src/components/panel/rooms/RoomDetail.tsx b/webui/src/components/panel/rooms/RoomDetail.tsx
index a2d12b4..65c88c1 100644
--- a/webui/src/components/panel/rooms/RoomDetail.tsx
+++ b/webui/src/components/panel/rooms/RoomDetail.tsx
@@ -1,9 +1,10 @@
-import React, {useEffect} from "react";
+import React, {useContext, useEffect} from "react";
import {PreloadedQuery, usePreloadedQuery} from "react-relay/hooks";
import {graphql} from "babel-plugin-relay/macro";
import {RoomDetailQuery, RoomDetailQuery$variables} from "./__generated__/RoomDetailQuery.graphql";
import {DisposeFn} from "relay-runtime";
import {useParams} from "react-router-dom";
+import {RoomsSlideOverTitleContext} from "./Rooms";
import ToggleButton from "../../form_components/ToggleButton";
import styles from "./RoomDetail.module.scss";
@@ -46,20 +47,21 @@ const RoomDetailInner = ({initialQueryRef}: PropsFinal) => {
initialQueryRef
)
+ const titleSetContext = useContext(RoomsSlideOverTitleContext)
+
+ titleSetContext && data.room?.name && titleSetContext(data.room.name);
+
return <>
-
- {data.room?.name}
- {
- reconfigureRoom({
- variables: {
- reconfigureInput: {
- id: data.room?.id!,
- deactivate: !ev.currentTarget.checked
- }
+ {
+ reconfigureRoom({
+ variables: {
+ reconfigureInput: {
+ id: data.room?.id!,
+ deactivate: !ev.currentTarget.checked
}
- })
- }} disabled={reconfiguringRoom || ((data.room || false) && !data.room.active && !data.room.deactivated)} checked={data.room?.active}/>
-
+ }
+ })
+ }} disabled={reconfiguringRoom || ((data.room || false) && !data.room.active && !data.room.deactivated)} checked={data.room?.active}/>
{JSON.stringify(data, null, 2)}
@@ -77,7 +79,7 @@ const RoomDetail = ({initialQueryRef, fetch, dispose}: Props) => {
}
}, [id, dispose, fetch])
- return initialQueryRef ? : <>loading...>
+ return initialQueryRef ? : null
}
export default RoomDetail;
\ No newline at end of file
diff --git a/webui/src/components/panel/rooms/Rooms.tsx b/webui/src/components/panel/rooms/Rooms.tsx
index 1b21726..4dd4d1b 100644
--- a/webui/src/components/panel/rooms/Rooms.tsx
+++ b/webui/src/components/panel/rooms/Rooms.tsx
@@ -1,13 +1,14 @@
-import React from "react";
+import React, {useContext, useState} from "react";
import {useNavigate, useOutlet} from "react-router-dom";
import styles from "./Rooms.module.scss";
-import {Trans} from "react-i18next";
+import {Trans, useTranslation} from "react-i18next";
import RoomsTable from "./RoomsTable";
import {PreloadedQuery, usePreloadedQuery} from "react-relay/hooks";
import {graphql} from "babel-plugin-relay/macro";
import {RoomsQuery} from "./__generated__/RoomsQuery.graphql";
import {X} from "lucide-react";
+import {LoaderSuspense} from "../../common/Loader";
type Props = {
initialQueryRef: PreloadedQuery,
@@ -16,6 +17,7 @@ type Props = {
const Rooms = ({initialQueryRef}: Props) => {
const outlet = useOutlet()
const navigate = useNavigate()
+ const {t} = useTranslation()
const data = usePreloadedQuery(
graphql`
@@ -26,6 +28,10 @@ const Rooms = ({initialQueryRef}: Props) => {
initialQueryRef
)
+ const defaultTitle = t("rooms.details", "Details")
+
+ const [title, setTitle] = useState(defaultTitle)
+
return
@@ -35,15 +41,21 @@ const Rooms = ({initialQueryRef}: Props) => {
-
- Details
-
-
-
- {outlet}
-
+
+
+ {title}
+
+
+
+
+ {outlet}
+
+
+
}
+export const RoomsSlideOverTitleContext = React.createContext>|null>(null)
+
export default Rooms
\ No newline at end of file
diff --git a/webui/src/components/panel/rooms/RoomsTable.tsx b/webui/src/components/panel/rooms/RoomsTable.tsx
index 173aa27..d892f3c 100644
--- a/webui/src/components/panel/rooms/RoomsTable.tsx
+++ b/webui/src/components/panel/rooms/RoomsTable.tsx
@@ -41,7 +41,7 @@ const RoomsTable = ({initialQueryRef}: Props) => {
{
data.rooms?.edges.map((edge) => {
- return {navigate("/rooms/"+edge.node.id)}}>
+ return
{navigate("/rooms/"+edge.node.id)}} key={edge.node.id}>
{edge.node.debug && Debug}
{!edge.node.active && Inactive}
diff --git a/webui/src/index.tsx b/webui/src/index.tsx
index 1a58dfc..2a5e0b1 100644
--- a/webui/src/index.tsx
+++ b/webui/src/index.tsx
@@ -12,17 +12,18 @@ import {
import "./i18n";
import RelayEnvironment from "./RelayEnvironment";
+import {LoaderSuspense} from "./components/common/Loader";
ReactDOM.render(
- Loading...}>
+
-
+
,
diff --git a/webui/src/layouts/PanelLayout.tsx b/webui/src/layouts/PanelLayout.tsx
index 002f4fa..a94b9b2 100644
--- a/webui/src/layouts/PanelLayout.tsx
+++ b/webui/src/layouts/PanelLayout.tsx
@@ -10,6 +10,7 @@ import styles from "./PanelLayout.module.scss";
import {Trans, useTranslation} from "react-i18next";
import {useAppDispatch} from "../app/hooks";
import {logOut} from "../features/auth/authSlice";
+import {LoaderSuspense} from "../components/common/Loader";
const PanelLayout = () => {
const {t} = useTranslation()
@@ -44,9 +45,9 @@ const PanelLayout = () => {
- Fetching data...}>
+
{outlet}
-
+
|