Unverified Commit a916221f authored by Joaquim Rocha's avatar Joaquim Rocha Committed by GitHub
Browse files

Merge pull request #104 from kinvolk/feedback-on-cluster-not-reachable

Add network status alert notification bar
parents b3d66824 2aa655f3
main a11y-reporting action-button-improvements add-cluster-to-notification-area add-clusters-dynamically add-direct-c-o-c add-fullscreen-to-editor add-labs add-max-window-size add-more-log-options add-msi-installer add-namespace-to-events-table add-network-policy-api add-notification-area add-notification-page add-pod-list-deployments add-ports-to-pods add-proper-backlinks add-proxy-endpoint add-router-to-pluginLib add_manual_trigger_docker_action add_more_resources_details2 add_more_resources_details3 allow-listing-per-namespace allow-popups-in-app allow-to-build-without-checking-for-updates app-menus app_updates apply-multiple-resources autoscalers_resource_quota backend-dependencies better-info-for-workloads branding-change build-app-with-plugins bump-chocolatey-0.13.0 center-cluster-chooser centralize_list_calls change-logo chart-0.10.1 choco-bump-0.12.1 close-server-win cluster_chooser codegen config_from_env create-react-5 custom-resource-fixing de-de dep-docs dep-updates2 dependabot/npm_and_yarn/app/electron-13.6.6 dependabot/npm_and_yarn/app/electron-15.5.5 dependabot/npm_and_yarn/app/minimist-1.2.6 dependabot/npm_and_yarn/frontend/async-2.6.4 dependabot/npm_and_yarn/frontend/d3-color-and-recharts-3.1.0 dependabot/npm_and_yarn/frontend/deep-object-diff-1.1.9 dependabot/npm_and_yarn/frontend/follow-redirects-1.14.7 dependabot/npm_and_yarn/frontend/follow-redirects-1.14.8 dependabot/npm_and_yarn/frontend/loader-utils-1.4.2 dependabot/npm_and_yarn/frontend/minimist-1.2.6 dependabot/npm_and_yarn/frontend/nanoid-3.2.0 dependabot/npm_and_yarn/frontend/terser-4.8.1 dependabot/npm_and_yarn/frontend/url-parse-1.5.10 dependabot/npm_and_yarn/plugins/examples/app-menus/terser-5.14.2 dependabot/npm_and_yarn/plugins/examples/change-logo/glob-parent-and-kinvolk/headlamp-plugin-5.1.2 dependabot/npm_and_yarn/plugins/examples/change-logo/terser-5.14.2 dependabot/npm_and_yarn/plugins/examples/cluster-chooser/glob-parent-and-kinvolk/headlamp-plugin-5.1.2 dependabot/npm_and_yarn/plugins/examples/cluster-chooser/terser-5.14.2 dependabot/npm_and_yarn/plugins/examples/dynamic-clusters/glob-parent-and-kinvolk/headlamp-plugin-5.1.2 dependabot/npm_and_yarn/plugins/examples/dynamic-clusters/terser-5.14.2 dependabot/npm_and_yarn/plugins/examples/pod-counter/browserslist-4.19.1 dependabot/npm_and_yarn/plugins/examples/pod-counter/path-parse-1.0.7 dependabot/npm_and_yarn/plugins/examples/pod-counter/ssri-6.0.2 dependabot/npm_and_yarn/plugins/examples/pod-counter/y18n-4.0.3 dependabot/npm_and_yarn/plugins/examples/sidebar/terser-5.14.2 dependabot/npm_and_yarn/plugins/headlamp-plugin/async-3.2.3 dependabot/npm_and_yarn/plugins/headlamp-plugin/minimist-1.2.6 dependabot/npm_and_yarn/plugins/headlamp-plugin/terser-5.14.2 docker_desktop_ext docs-allow-to-build-without-checking-for-updates dont-cache-plugin-requests-on-desktop dont-require-bumping-charts dont-use-a-one-click-installer-on-windows dont-wrap-header-cells e2e-container e2e-login e2e-playwright endpoints errcb-fix event-sorting example-fixes export-charts export-resource-chart-and-lib export_all_k8s_modules fetch-pods-by-labels fix-applying-ingresses fix-applying-non-group-apis fix-cluster-chooser fix-configmap-editor-theme fix-crash-in-label-selector fix-default-page-rows fix-filter-when-items-are-numbers fix-front-start fix-issue-in-page-grid-children-type fix-kubeconfig fix-multiple-detail-view-render fix-navigating-during-delete-op fix-plugin-imports-again fix-plugin-reinitialization fix-quitting-server-again fix-release-note-stuck-issue fix-simple-table fix-some-a11y-issues-on-dark-theme fix-table-filter fix-ui-warnings fix-unexpected-null-in-getOwnedPods fix_manual_trigger_gh_action fr-fr fullscreen_dialog gh_action_automate_pr go-back-through-location-stack golang-17 handle-custom-auth-desktop headlamp-plugin-0.5.1-b headlamp-plugin-0.5.2-b headlamp-plugin-upgrade headlamp-upgrade-audit headless-fix headless-ux helm-charts helm-fixes helm-typo-docs-fix hide-appbar http-bug-fix improve-app-menus improve-pod-matcher improve-pod-status inno-setup jrocha/app-generation jrocha/flatpak jrocha/wip/show-build-version localefix log-viewer-scroll-fix mui-v5-upgrade namespaces-filter new-chart new-chooser-style new-iconify new-k8s-secret new-terminal-fixes new_chart no-cluster-no-auth-required no-objects-in-plugins-redux node-upgrade notification-clear-and-all-read oidc-fix oidc-state-len-fix optimize-use-get persist-rows-per-page persist-url-params plugin-demo plugin-docs plugin-error-handling plugin-fixes plugin-improvements plugin-polishing plugin-source plugin-tests-in-js plugin/allow-cluster-chooser-overriding plugins-in-style plugins-module port-forwarding push-asset rc rc-0.10.0 rc-0.10.1 rc-0.11.0 rc-0.11.1 rc-0.12.0 rc-0.12.1 rc-0.13.0 rc-0.6.0 rc-0.7.0 rc-0.8.0 rc-0.9.0 rc-phony-test rc_0.5.3 redux-extension reflect-views-in-url refresh_token releasec remove-plugin-video rename-server render-logs-using-xterm resource-class-issue resources-json role_bind_info scaling-ui search-involved-object-type-events-table set-default-namespace shorter-resource-age show-build-version show-dialog-if-release-fetch-failed show-external-ips sidebar-icons sidebarroutefilter simple-table-details-from-url simplify-testing terminal-fixes test-cleanup test-stuff typedoc-plugin-upgrade update-examples-052 update-i18n update-release-draft update-signing-email updates upgrade-new-things use-fixed-date-on-tests use-shipped-tsconfig-for-plugins wait-for-plugins width-cosmetic-fixes win_target windows-app windows-testing xterm-windows-mode v0.13.0 v0.12.1 v0.12.0 v0.11.1 v0.11.0 v0.10.1 v0.10.0 v0.9.0 v0.8.0 v0.7.0 v0.6.0 v0.5.3 v0.5.2 v0.5.1 v0.5.0 v0.4.0 v0.3.0 v0.3.0-beta1 v0.3.0-beta headlamp-plugin-0.5.3 headlamp-plugin-0.5.2 headlamp-plugin-0.5.1 headlamp-plugin-0.5.0 headlamp-plugin-0.4.9 headlamp-plugin-0.4.8 headlamp-plugin-0.4.7 headlamp-helm-0.8.0 headlamp-helm-0.7.0 headlamp-helm-0.6.0 headlamp-helm-0.5.0 headlamp-helm-0.4.0 headlamp-helm-0.3.0 headlamp-helm-0.2.0 headlamp-helm-0.1.5 headlamp-helm-0.1.4 headlamp-helm-0.1.3 headlamp-helm-0.1.2 headlamp-helm-0.1.1 headlamp-helm-0.1.0
No related merge requests found
Showing with 128 additions and 7 deletions
+128 -7
......@@ -21,6 +21,7 @@ import { Provider } from 'react-redux';
import { BrowserRouter, HashRouter, Redirect, Route, RouteProps, Switch, useHistory } from 'react-router-dom';
import { ClusterTitle } from './components/cluster/Chooser';
import ActionsNotifier from './components/common/ActionsNotifier';
import AlertNotification from './components/common/AlertNotification';
import Sidebar, { drawerWidth, NavigationTabs, useSidebarItem } from './components/Sidebar';
import { isElectron } from './helpers';
import { getToken, setToken } from './lib/auth';
......@@ -42,8 +43,7 @@ const useStyle = makeStyles(theme => ({
}
},
content: {
flexGrow: 1,
padding: theme.spacing(3),
flexGrow: 1
},
toolbar: theme.mixins.toolbar,
}));
......@@ -227,11 +227,14 @@ function AppContainer(props: AppContainerProps) {
</AppBar>
<Sidebar />
<main className={classes.content}>
<div className={classes.toolbar} />
<Container maxWidth="lg">
<NavigationTabs />
<RouteSwitcher />
</Container>
<AlertNotification/>
<Box p={3}>
<div className={classes.toolbar} />
<Container maxWidth="lg">
<NavigationTabs />
<RouteSwitcher />
</Container>
</Box>
</main>
<ActionsNotifier />
</Box>
......
import { Box, useTheme } from '@material-ui/core';
import React from 'react';
import { useRouteMatch } from 'react-router-dom';
import { testAuth } from '../../lib/k8s/apiProxy';
import { getRoutePath, ROUTES } from '../../lib/router';
import { useTypedSelector } from '../../redux/reducers/reducers';
const NOT_FOUND_ERROR_MESSAGES = ['Error: Api request error: Bad Gateway', 'Offline'];
// in ms
const NETWORK_STATUS_CHECK_TIME = 5000;
export default function AlertNotification(){
const routes = useTypedSelector(state => state.ui.routes);
const [networkStatusCheckTimeFactor, setNetworkStatusCheckTimeFactor] = React.useState(0);
const [error, setError] = React.useState<null | string | boolean>(null);
const [intervalID, setIntervalID] = React.useState<NodeJS.Timeout | null>(null);
function registerSetInterval(): NodeJS.Timeout {
return setInterval(() => {
if (!window.navigator.onLine) {
setError('Offline');
return;
}
setError(null);
testAuth().then(() => {
setError(false);
})
.catch((err) => {
const error = new Error(err);
setError(error.message);
setNetworkStatusCheckTimeFactor(networkStatusCheckTimeFactor =>
networkStatusCheckTimeFactor + 1);
});
}, (networkStatusCheckTimeFactor + 1) * NETWORK_STATUS_CHECK_TIME);
}
React.useEffect(() => {
const id = registerSetInterval();
setIntervalID(id);
return () => clearInterval(id);
},
// eslint-disable-next-line
[]);
React.useEffect(() => {
if (intervalID) {
clearInterval(intervalID);
}
const id = registerSetInterval();
setIntervalID(id);
return () => clearInterval(id);
},
// eslint-disable-next-line
[networkStatusCheckTimeFactor]);
function checkWhetherInNoAuthRequireRoute():boolean {
const noAuthRequiringRoutes =
Object.values(ROUTES)
.concat(Object.values(routes))
.filter((route) => route.noAuthRequired);
for (const route of noAuthRequiringRoutes) {
// eslint-disable-next-line react-hooks/rules-of-hooks
const routeMatch = useRouteMatch({
path: getRoutePath(route),
strict: true
});
if (routeMatch && routeMatch.isExact) {
return true;
}
}
return false;
}
const whetherInNoAuthRoute = checkWhetherInNoAuthRequireRoute();
let isErrorInNoAuthRequiredRoute = false;
if (whetherInNoAuthRoute) {
isErrorInNoAuthRequiredRoute = true;
}
const theme = useTheme();
if (!error) {
return null;
}
if (NOT_FOUND_ERROR_MESSAGES.filter((err) => err === error).length === 0) {
return null;
}
return (
<Box
bgcolor="error.main"
color={theme.palette.common.white}
textAlign="center"
display="flex"
p={1}
justifyContent="center"
position="fixed"
zIndex={1400}
width="100%"
top={'0'}
height={'3.8vh'}
>
<Box marginLeft={isErrorInNoAuthRequiredRoute ? '0%' : '-15%'}>
Something Went Wrong.
</Box>
<Box
bgcolor={theme.palette.common.white}
color="error.main"
ml={1}
px={1}
py={0.1}
style={{cursor: 'pointer'}}
onClick={() => setNetworkStatusCheckTimeFactor(0)}
>
Try Again
</Box>
</Box>
);
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment