mirror of
https://github.com/fleetdm/fleet
synced 2026-05-10 18:51:03 +00:00
* all login methods no longer use redux * removed redux from registration * redirect user from registration * removed redux from sso invite * removed redundant component * refactored user settings page * removed redux from logout * cleaned up unused redux calls * lint fixes * removed test * removed old config interface * fixed registration bug * team permission fix * removed remaining redux references from pages - #4436 * better way to set config
138 lines
3.7 KiB
TypeScript
138 lines
3.7 KiB
TypeScript
import React, { useState, useContext } from "react";
|
||
import { InjectedRouter } from "react-router";
|
||
import { AppContext } from "context/app";
|
||
import { NotificationContext } from "context/notification";
|
||
import { TableContext } from "context/table";
|
||
|
||
import paths from "router/paths";
|
||
import { useDeepEffect } from "utilities/hooks";
|
||
import FlashMessage from "components/FlashMessage";
|
||
import SiteTopNav from "components/top_nav/SiteTopNav";
|
||
import { INotification } from "interfaces/notification";
|
||
import { licenseExpirationWarning } from "fleet/helpers";
|
||
|
||
interface ICoreLayoutProps {
|
||
children: React.ReactNode;
|
||
router: InjectedRouter; // v3
|
||
}
|
||
|
||
const expirationMessage = (
|
||
<>
|
||
Your license for Fleet Premium is about to expire. If you’d like to renew or
|
||
have questions about downgrading,{" "}
|
||
<a
|
||
href="https://fleetdm.com/docs/using-fleet/faq#how-do-i-downgrade-from-fleet-premium-to-fleet-free"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
please head to the Fleet documentation
|
||
</a>
|
||
.
|
||
</>
|
||
);
|
||
|
||
const CoreLayout = ({ children, router }: ICoreLayoutProps) => {
|
||
const { config, currentUser, isPremiumTier } = useContext(AppContext);
|
||
const { notification, hideFlash } = useContext(NotificationContext);
|
||
const { setResetSelectedRows } = useContext(TableContext);
|
||
const [
|
||
showExpirationFlashMessage,
|
||
setShowExpirationFlashMessage,
|
||
] = useState<boolean>(false);
|
||
|
||
// on success of an action, the table will reset its checkboxes.
|
||
// setTimeout is to help with race conditions as table reloads
|
||
// in some instances (i.e. Manage Hosts)
|
||
useDeepEffect(() => {
|
||
if (notification?.alertType === "success") {
|
||
setTimeout(() => {
|
||
setResetSelectedRows(true);
|
||
setTimeout(() => {
|
||
setResetSelectedRows(false);
|
||
}, 300);
|
||
}, 0);
|
||
}
|
||
|
||
setShowExpirationFlashMessage(
|
||
licenseExpirationWarning(config?.license.expiration || "")
|
||
);
|
||
}, [notification]);
|
||
|
||
const onLogoutUser = async () => {
|
||
const { LOGOUT } = paths;
|
||
router.push(LOGOUT);
|
||
};
|
||
|
||
const onNavItemClick = (path: string) => {
|
||
return (evt: React.MouseEvent<HTMLButtonElement>) => {
|
||
evt.preventDefault();
|
||
|
||
if (path.indexOf("http") !== -1) {
|
||
global.window.open(path, "_blank");
|
||
return false;
|
||
}
|
||
|
||
router.push(path);
|
||
return false;
|
||
};
|
||
};
|
||
|
||
const onUndoActionClick = (undoAction?: () => void) => {
|
||
return (evt: React.MouseEvent<HTMLButtonElement>) => {
|
||
evt.preventDefault();
|
||
|
||
if (undoAction) {
|
||
undoAction();
|
||
}
|
||
|
||
hideFlash();
|
||
};
|
||
};
|
||
|
||
const fullWidthFlash = !currentUser;
|
||
const expirationNotification: INotification = {
|
||
alertType: "warning-filled",
|
||
isVisible: true,
|
||
message: expirationMessage,
|
||
};
|
||
|
||
if (!currentUser || !config) {
|
||
return null;
|
||
}
|
||
|
||
const { pathname } = global.window.location;
|
||
|
||
return (
|
||
<div className="app-wrap">
|
||
<nav className="site-nav">
|
||
<SiteTopNav
|
||
config={config}
|
||
onLogoutUser={onLogoutUser}
|
||
onNavItemClick={onNavItemClick}
|
||
pathname={pathname}
|
||
currentUser={currentUser}
|
||
/>
|
||
</nav>
|
||
<div className="core-wrapper">
|
||
{isPremiumTier && showExpirationFlashMessage && (
|
||
<FlashMessage
|
||
fullWidth={fullWidthFlash}
|
||
notification={expirationNotification}
|
||
onRemoveFlash={() =>
|
||
setShowExpirationFlashMessage(!showExpirationFlashMessage)
|
||
}
|
||
/>
|
||
)}
|
||
<FlashMessage
|
||
fullWidth={fullWidthFlash}
|
||
notification={notification}
|
||
onRemoveFlash={hideFlash}
|
||
onUndoActionClick={onUndoActionClick}
|
||
/>
|
||
{children}
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default CoreLayout;
|