diff --git a/public/css/style.css b/public/css/style.css
index 3c9f0f08..16b1c4c1 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -1343,10 +1343,6 @@ video {
width: max-content;
}
-.w-\[4as0vw\] {
- width: 4as0vw;
-}
-
.min-w-\[12rem\] {
min-width: 12rem;
}
diff --git a/src/components/FileManager/FileManager.tsx b/src/components/FileManager/FileManager.tsx
new file mode 100644
index 00000000..b33d062a
--- /dev/null
+++ b/src/components/FileManager/FileManager.tsx
@@ -0,0 +1,46 @@
+import React, { ReactElement } from "react";
+import CardLayout from "../../layouts/CardLayout";
+import { FullScreen, useFullScreenHandle } from "react-full-screen";
+import { useAppSelector } from "../../hooks/redux";
+import useRobot from "../../hooks/useRobot";
+import RestartService from "../RestartServiceButton/RestartServiceButton";
+import FullScreenButton from "../FullScreenButton/FullScreenButton";
+import ServiceLogsButton from "../ServiceLogs/ServiceLogs";
+
+export default function CodeEditor(): ReactElement {
+ const handleFullScreen = useFullScreenHandle();
+
+ const { responseRobot } = useRobot();
+
+ const { urls } = useAppSelector((state) => state.robot);
+
+ return (
+
+ );
+}
diff --git a/src/components/RobotHeaderTab/RobotHeaderTab.tsx b/src/components/RobotHeaderTab/RobotHeaderTab.tsx
new file mode 100644
index 00000000..bff88ac0
--- /dev/null
+++ b/src/components/RobotHeaderTab/RobotHeaderTab.tsx
@@ -0,0 +1,56 @@
+import { stringSlugify } from "../../functions/GeneralFunctions";
+import { IrobotTab } from "../../interfaces/robotInterfaces";
+import ContentLoader from "react-content-loader";
+import { Fragment, ReactElement } from "react";
+import useRobot from "../../hooks/useRobot";
+interface RobotHeaderTabProps {
+ tab: IrobotTab;
+}
+
+export default function RobotHeaderTab({
+ tab,
+}: RobotHeaderTabProps): ReactElement {
+ const { activeTab, setActiveTab, isRobotReady } = useRobot();
+ const isActiveTab = tab.name === activeTab;
+
+ const handleClick = () =>
+ !tab?.isLoading && !tab?.isHidden && setActiveTab(tab.name);
+
+ return (
+
+
+ {tab?.isLoading || !isRobotReady ? (
+
+
+
+ ) : (
+
+ {tab?.icon}
+ {tab.name}
+
+ )}
+
+
+
+ );
+}
diff --git a/src/components/RobotHeaderTabs/RobotHeaderTabs.tsx b/src/components/RobotHeaderTabs/RobotHeaderTabs.tsx
index 411238eb..60c79844 100644
--- a/src/components/RobotHeaderTabs/RobotHeaderTabs.tsx
+++ b/src/components/RobotHeaderTabs/RobotHeaderTabs.tsx
@@ -1,32 +1,27 @@
-import { stringSlugify } from "../../functions/GeneralFunctions";
import { MdDashboard, MdMap, MdScreenShare } from "react-icons/md";
+import RobotHeaderTab from "../RobotHeaderTab/RobotHeaderTab";
+import { IrobotTab } from "../../interfaces/robotInterfaces";
import { envApplication } from "../../helpers/envProvider";
import { BsCameraVideoFill } from "react-icons/bs";
import { BiJoystickButton } from "react-icons/bi";
-import ContentLoader from "react-content-loader";
-import { Fragment, ReactElement } from "react";
+import { BiSolidFolder } from "react-icons/bi";
import { AiFillCode } from "react-icons/ai";
import useRobot from "../../hooks/useRobot";
+import { ReactElement } from "react";
export default function RobotHeaderTabs(): ReactElement {
- const {
- responseRobot,
- activeTab,
- isSettedCookie,
- setActiveTab,
- isRobotReady,
- } = useRobot();
+ const { responseRobot, isSettedCookie, isRobotReady } = useRobot();
- const tabs = [
+ const tabs: IrobotTab[] = [
{
name: "Overview",
- icon: ,
+ icon: ,
isLoading: false,
isHidden: false,
},
{
name: "Task Management",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -39,7 +34,7 @@ export default function RobotHeaderTabs(): ReactElement {
},
{
name: "Teleoperation",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -52,7 +47,7 @@ export default function RobotHeaderTabs(): ReactElement {
},
{
name: "Visualization",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -65,7 +60,7 @@ export default function RobotHeaderTabs(): ReactElement {
},
{
name: "Code Editor",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -77,7 +72,7 @@ export default function RobotHeaderTabs(): ReactElement {
},
{
name: "Development Suite",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -93,7 +88,7 @@ export default function RobotHeaderTabs(): ReactElement {
},
{
name: "Remote Desktop",
- icon: ,
+ icon: ,
isLoading:
!responseRobot ||
!(
@@ -103,6 +98,18 @@ export default function RobotHeaderTabs(): ReactElement {
),
isHidden: false,
},
+ {
+ name: "File Manager",
+ icon: ,
+ isLoading:
+ !responseRobot ||
+ !(
+ responseRobot?.ideEnabled &&
+ responseRobot?.ideIngressEndpoint &&
+ isSettedCookie
+ ),
+ isHidden: false,
+ },
];
return (
@@ -111,53 +118,9 @@ export default function RobotHeaderTabs(): ReactElement {
className="flex items-end gap-6 overflow-x-auto px-6 pt-4"
>
{tabs
- ?.filter((tab: any) => tab && tab)
- .map((tab: any, index: number) => {
- return (
-
- !tab?.isLoading && !tab?.isHidden && setActiveTab(tab.name)
- }
- key={index}
- >
-
- {tab?.isLoading || !isRobotReady ? (
-
-
-
- ) : (
-
- {tab?.icon}
- {tab.name}
-
- )}
-
-
-
- );
+ ?.filter((tab: IrobotTab) => tab && tab)
+ .map((tab: IrobotTab, index: number) => {
+ return ;
})}
);
diff --git a/src/contexts/RobotContext.tsx b/src/contexts/RobotContext.tsx
index a856ff57..2bd0293b 100644
--- a/src/contexts/RobotContext.tsx
+++ b/src/contexts/RobotContext.tsx
@@ -1,6 +1,6 @@
-import { envApplication } from "../helpers/envProvider";
import { useEffect, createContext, useState } from "react";
-import { IrobotPages } from "../interfaces/generalInterfaces";
+import { IrobotTab } from "../interfaces/robotInterfaces";
+import { envApplication } from "../helpers/envProvider";
import useFunctions from "../hooks/useFunctions";
import { useParams } from "react-router-dom";
import useMain from "../hooks/useMain";
@@ -23,8 +23,7 @@ export default ({ children }: any) => {
const { pagesState, sidebarState } = useMain();
- const [activeTab, setActiveTab] =
- useState("Overview");
+ const [activeTab, setActiveTab] = useState("Overview");
const [responseRobot, setResponseRobot] = useState(undefined);
const [responseBuildManager, setResponseBuildManager] =
@@ -143,7 +142,6 @@ export default ({ children }: any) => {
})
?.filter((status: any) => status !== "Running")?.length
) {
- return setIsRobotReady(false);
}
return setIsRobotReady(true);
}, [responseRobot, responseBuildManager, responseLaunchManagers]);
@@ -299,20 +297,8 @@ export default ({ children }: any) => {
);
}
- function handleForceUpdate(
- page:
- | "Overview"
- | "Teleoperation"
- | "Task Management"
- | "Visualization"
- | "Loading"
- | "Settings"
- | "Remote Desktop"
- | "Development Suite"
- | "Code Editor",
- ) {
+ function handleForceUpdate(page: IrobotTab["name"]) {
setActiveTab("Loading");
-
setTimeout(() => {
setActiveTab(page);
}, 500);
diff --git a/src/interfaces/generalInterfaces.ts b/src/interfaces/generalInterfaces.ts
deleted file mode 100644
index 3abbfbc0..00000000
--- a/src/interfaces/generalInterfaces.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-export interface IrobotPages {
- activeTab:
- | "Overview"
- | "Teleoperation"
- | "Task Management"
- | "Visualization"
- | "Loading"
- | "Settings"
- | "Remote Desktop"
- | "Development Suite"
- | "Code Editor";
- setActiveTab: React.Dispatch<
- React.SetStateAction<
- | "Overview"
- | "Teleoperation"
- | "Task Management"
- | "Visualization"
- | "Loading"
- | "Settings"
- | "Remote Desktop"
- | "Development Suite"
- | "Code Editor"
- >
- >;
-}
diff --git a/src/interfaces/robotInterfaces.ts b/src/interfaces/robotInterfaces.ts
index 643b0807..1e3c6382 100644
--- a/src/interfaces/robotInterfaces.ts
+++ b/src/interfaces/robotInterfaces.ts
@@ -1,3 +1,5 @@
+import { ReactElement } from "react";
+
export interface IcreateRobotRequest {
organizationId: string;
roboticsCloudName: string;
@@ -229,6 +231,23 @@ export interface ILaunchENV {
value: string;
}
+export type IrobotTab = {
+ name:
+ | "Overview"
+ | "Teleoperation"
+ | "Task Management"
+ | "Visualization"
+ | "Loading"
+ | "Settings"
+ | "Remote Desktop"
+ | "Development Suite"
+ | "Code Editor"
+ | "File Manager";
+ icon: ReactElement;
+ isLoading: boolean;
+ isHidden: boolean;
+};
+
export interface IuseCreateRobot {
robotData: IRobotData;
setRobotData: React.Dispatch>;
diff --git a/src/layouts/DashboardLayout.tsx b/src/layouts/DashboardLayout.tsx
index b2cf5508..468eaf7f 100644
--- a/src/layouts/DashboardLayout.tsx
+++ b/src/layouts/DashboardLayout.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable jsx-a11y/iframe-has-title */
import { ReactElement } from "react";
interface IDashboardLayout {
diff --git a/src/layouts/RobotSubPageLayout.tsx b/src/layouts/RobotSubPageLayout.tsx
index 2944f910..cdaaa21b 100644
--- a/src/layouts/RobotSubPageLayout.tsx
+++ b/src/layouts/RobotSubPageLayout.tsx
@@ -12,6 +12,7 @@ import { envApplication } from "../helpers/envProvider";
import { useAppSelector } from "../hooks/redux";
import useRobot from "../hooks/useRobot";
import { ReactElement } from "react";
+import FileManager from "../components/FileManager/FileManager";
export default function RobotSubPageLayout(): ReactElement {
const { activeTab, setActiveTab, responseRobot, isSettedCookie } = useRobot();
@@ -61,6 +62,8 @@ export default function RobotSubPageLayout(): ReactElement {
);
case "Remote Desktop":
return ;
+ case "File Manager":
+ return ;
case "Settings":
return Settings
;
case "Loading":