diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2515fbe34..145af887e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@ changes.
### Added
+- Add maintenance ending banner [Issue 3647](https://github.com/IntersectMBO/govtool/issues/3647)
+
### Fixed
### Changed
@@ -20,7 +22,6 @@ changes.
## [v2.0.22](https://github.com/IntersectMBO/govtool/releases/tag/v2.0.22) 2025-05-15
-
### Added
### Fixed
diff --git a/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx b/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx
new file mode 100644
index 000000000..37d207e72
--- /dev/null
+++ b/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx
@@ -0,0 +1,106 @@
+import { Box, Typography, IconButton } from "@mui/material";
+import { useState } from "react";
+import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
+import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp";
+import { Trans, useTranslation } from "react-i18next";
+
+export const MaintenanceEndingBanner = () => {
+ const [isExpanded, setIsExpanded] = useState(true);
+ const { t } = useTranslation();
+
+ const handleToggle = () => {
+ setIsExpanded((prev) => !prev);
+ };
+
+ return (
+
+ {/* Banner Header */}
+
+
+
+ {t("system.maintenanceEnding.title")}
+
+
+
+
+ {isExpanded ? : }
+
+
+
+
+ {/* Expandable Content */}
+
+
+
+ {t("system.maintenanceEnding.description1")}
+
+
+ ,
+ ]}
+ />
+
+
+ {t("system.maintenanceEnding.description3")}
+
+
+
+
+ );
+};
diff --git a/govtool/frontend/src/components/organisms/TopBanners.tsx b/govtool/frontend/src/components/organisms/TopBanners.tsx
index e27b8138d..f4cd741b8 100644
--- a/govtool/frontend/src/components/organisms/TopBanners.tsx
+++ b/govtool/frontend/src/components/organisms/TopBanners.tsx
@@ -1,11 +1,13 @@
import { Box, Link, Typography } from "@mui/material";
import { Trans, useTranslation } from "react-i18next";
-import { useAppContext } from "@/context";
+import { useAppContext, useCardano } from "@/context";
import { LINKS } from "@/consts/links";
+import { MaintenanceEndingBanner } from "./MaintenanceEndingBanner";
export const TopBanners = () => {
const { isMainnet, networkName, isInBootstrapPhase, isAppInitializing } =
useAppContext();
+ const { isEnabled } = useCardano();
const { t } = useTranslation();
if (isAppInitializing) {
@@ -13,65 +15,83 @@ export const TopBanners = () => {
}
return (
-
- {/* NETWORK BANNER */}
- {!isMainnet && (
-
-
- {`${t("network")}: ${networkName}`}
-
-
- |
-
-
+
+ {/* NETWORK BANNER */}
+ {!isMainnet && (
+
- {t("goToMainnet")}
-
-
- )}
+
+ {`${t("network")}: ${networkName}`}
+
+
+ |
+
+
+ {t("goToMainnet")}
+
+
+ )}
+
- {/* BOOTSTRAPPING BANNER */}
- {isInBootstrapPhase && (
+ {/* GOVTOOL MAINTENANCE ENDING SOON BANNER */}
+ {isEnabled && (
-
-
- ),
- }}
- />
-
+
)}
-
+
+ {/* BOOTSTRAPPING BANNER */}
+
+ {isInBootstrapPhase && (
+
+
+
+ ),
+ }}
+ />
+
+
+ )}
+
+ >
);
};
diff --git a/govtool/frontend/src/components/organisms/TopNav.tsx b/govtool/frontend/src/components/organisms/TopNav.tsx
index 5a85776cf..5eb2654c5 100644
--- a/govtool/frontend/src/components/organisms/TopNav.tsx
+++ b/govtool/frontend/src/components/organisms/TopNav.tsx
@@ -8,8 +8,9 @@ import { useCardano, useFeatureFlag, useModal } from "@context";
import { useScreenDimension, useTranslation } from "@hooks";
import { openInNewTab } from "@utils";
import { DrawerMobile } from "./DrawerMobile";
+import { MaintenanceEndingBanner } from "./MaintenanceEndingBanner";
-const POSITION_TO_BLUR = 50;
+const POSITION_TO_BLUR = 80;
export const TopNav = ({ isConnectButton = true }) => {
const {
@@ -136,51 +137,54 @@ export const TopNav = ({ isConnectButton = true }) => {
);
return (
-
-
+
+
+
- isConnectButton || disconnectWallet()}
+
-
-
- {screenWidth >= 1145 ? renderDesktopNav() : renderMobileNav()}
-
-
+ isConnectButton || disconnectWallet()}
+ >
+
+
+ {screenWidth >= 1145 ? renderDesktopNav() : renderMobileNav()}
+
+
+
);
};
diff --git a/govtool/frontend/src/i18n/locales/en.json b/govtool/frontend/src/i18n/locales/en.json
index d1d56337d..d057b97cb 100644
--- a/govtool/frontend/src/i18n/locales/en.json
+++ b/govtool/frontend/src/i18n/locales/en.json
@@ -738,7 +738,13 @@
"system": {
"description": "The Cardano GovTool is a tool that allows you to participate in the governance of the Cardano network. You can propose, vote on, and delegate your voting power to other users.",
"title": "This tool is connected to {{networkName}}",
- "bootstrappingWarning": "Govtool is in the Bootstrapping phase. Some features are not available. Learn more"
+ "bootstrappingWarning": "Govtool is in the Bootstrapping phase. Some features are not available. Learn more",
+ "maintenanceEnding": {
+ "title": "⚠️ GovTool Maintenance Ending Soon",
+ "description1": "GovTool has not been included in the 2025 Cardano budget.",
+ "description2": "Unless alternative support is secured, <0>maintenance will end in June 2025.0>",
+ "description3": "We remain committed to transparency and will keep you updated."
+ }
},
"tooltips": {
"delegateTodRep": {