Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,3 @@ src/Common/Select/Select.tsx
src/Common/ServerError.ts
src/Common/TippyCustomized.tsx
src/Common/ToastBody.tsx
src/Common/Types.ts
1,260 changes: 599 additions & 661 deletions package-lock.json

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@devtron-labs/devtron-fe-common-lib",
"version": "1.22.8-beta-8",
"version": "1.22.8-beta-14",
"description": "Supporting common component library",
"type": "module",
"main": "dist/index.js",
Expand Down Expand Up @@ -49,7 +49,6 @@
"@types/react": "^18.3.27",
"@types/react-csv": "^1.1.10",
"@types/react-dom": "^18.3.7",
"@types/react-router-dom": "^5.3.3",
"@typescript-eslint/eslint-plugin": "8.3.0",
"@typescript-eslint/parser": "8.3.0",
"@vitejs/plugin-react": "4.5.2",
Expand Down Expand Up @@ -87,7 +86,7 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-ga4": "^1.4.1",
"react-router-dom": "^5.3.0",
"react-router-dom": "^6.30.3",
"react-select": "5.8.0",
"rxjs": "^7.8.1",
"yaml": "^2.4.1"
Expand Down
3 changes: 2 additions & 1 deletion src/Common/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ export interface FetchInTimeParamsType<Data = object> {
}

export interface FetchAPIParamsType<Data = object>
extends Omit<FetchInTimeParamsType<Data>, 'options'>,
extends
Omit<FetchInTimeParamsType<Data>, 'options'>,
Pick<
APIOptions,
'preventAutoLogout' | 'preventLicenseRedirect' | 'shouldParseServerErrorForUnauthorizedUser' | 'isProxyHost'
Expand Down
13 changes: 8 additions & 5 deletions src/Common/API/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

import { MutableRefObject } from 'react'

import { URLS } from '@Common/Constants'
import { getUrlWithSearchParams } from '@Common/Helper'
import { ServerErrors } from '@Common/ServerError'
import { ROUTER_URLS } from '@PagesDevtron2.0/index'

import { RESPONSE_MESSAGES } from './constants'

Expand Down Expand Up @@ -63,11 +63,14 @@ export const getIsRequestAborted = (error) =>

export const handleDashboardLogout = () => {
const continueParam = `${window.location.pathname.replace(window.__BASE_URL__, '')}${window.location.search}`
window.location.href = getUrlWithSearchParams(`${window.location.origin}${window.__BASE_URL__}${URLS.LOGIN_SSO}`, {
continue: continueParam,
})
window.location.href = getUrlWithSearchParams(
`${window.location.origin}${window.__BASE_URL__}${ROUTER_URLS.LOGIN.SSO}`,
{
continue: continueParam,
},
)
}

export const handleRedirectToLicenseActivation = () => {
window.location.href = `${window.location.origin}${window.__BASE_URL__}${URLS.LICENSE_AUTH}`
window.location.href = `${window.location.origin}${window.__BASE_URL__}${ROUTER_URLS.LICENSE_AUTH}`
}
14 changes: 8 additions & 6 deletions src/Common/BreadCrumb/BreadCrumb.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@
*/

import React, { useMemo, useEffect } from 'react'
import { Link, useRouteMatch, useParams } from 'react-router-dom'
import { generatePath, Link, useParams } from 'react-router-dom'
import { useBreadcrumbContext, getBreadCrumbSeparator } from './BreadcrumbStore'
import { ConditionalWrap } from '../Helper'
import { Breadcrumb, Breadcrumbs, UseBreadcrumbOptionalProps, UseBreadcrumbState } from './Types'

export const BreadcrumbContext = React.createContext(null)

export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]): UseBreadcrumbState {
export function useBreadcrumb(pathPattern: string, props?: UseBreadcrumbOptionalProps, deps?: any[]): UseBreadcrumbState {
Comment thread
arunjaindev marked this conversation as resolved.
const sep = props?.sep || '/'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we make params obj?

deps = deps || []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you check if deps need to be memoized?

const { url, path } = useRouteMatch()
const params = useParams()
const url = generatePath(pathPattern, params)
const { state, setState } = useBreadcrumbContext()

useEffect(() => {
Expand All @@ -48,7 +48,7 @@ export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]):
}

const levels: Breadcrumb[] = useMemo(() => {
const paths = path.split('/').filter(Boolean)
const paths = pathPattern.split('/').filter(Boolean)
const urls = url.split('/').filter(Boolean)
return paths.map((path, idx) => {
const crumb: Breadcrumb = { to: urls[idx], name: path }
Expand All @@ -57,7 +57,7 @@ export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]):
}
return crumb
})
}, [path, url])
}, [pathPattern, url])
const { res: breadcrumbs } = useMemo(
() =>
levels.reduce(
Expand Down Expand Up @@ -89,10 +89,12 @@ export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]):

export const BreadCrumb: React.FC<Breadcrumbs> = ({
breadcrumbs,
path,
Comment thread
arunjaindev marked this conversation as resolved.
sep = '/',
className = 'dc__devtron-breadcrumb__item fs-16 fw-4 lh-1-5 dc__ellipsis-right dc__mxw-155',
}) => {
const { url } = useRouteMatch()
const params = useParams()
const url = generatePath(path, params)
const filteredCrumbs = breadcrumbs.filter((crumb) => !!crumb.name)
return (
<>
Expand Down
1 change: 1 addition & 0 deletions src/Common/BreadCrumb/Types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export interface UseBreadcrumbProps {

export interface Breadcrumbs {
breadcrumbs: Breadcrumb[]
path: string
sep?: string
className?: string
}
Expand Down
104 changes: 4 additions & 100 deletions src/Common/Constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@
*/

import { SelectPickerOptionType } from '@Shared/Components'
import { CostBreakdownItemViewParamsType, CostBreakdownViewType } from '@PagesDevtron2.0/CostVisibility'
import { BackupAndScheduleListViewEnum, BackupLocationsTypes } from '@PagesDevtron2.0/DataProtectionManagement'

import { InfrastructureManagementAppListType } from './Types'

export const FALLBACK_REQUEST_TIMEOUT = 60000
export const Host = window?.__ORCHESTRATOR_ROOT__ ?? '/orchestrator'
Expand Down Expand Up @@ -51,108 +47,17 @@ export const PATTERNS = {
ALPHANUMERIC_WITH_SPECIAL_CHAR_AND_SLASH: /^[A-Za-z0-9._/-]+$/, // allow alphanumeric,(.) ,(-),(_),(/)
EMAIL: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
}

const APPLICATION_MANAGEMENT_ROOT = '/application-management'
const APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP = `${APPLICATION_MANAGEMENT_ROOT}/templates/devtron-app`
const APPLICATION_MANAGEMENT_CONFIGURATIONS = `${APPLICATION_MANAGEMENT_ROOT}/configurations`
const INFRASTRUCTURE_MANAGEMENT_ROOT = '/infrastructure-management'
const SOFTWARE_RELEASE_MANAGEMENT_ROOT = '/software-release-management'
const COST_VISIBILITY_ROOT = '/cost-visibility'
const SECURITY_CENTER_ROOT = '/security-center'
const AUTOMATION_AND_ENABLEMENT_ROOT = '/automation-and-enablement'
const DATA_PROTECTION_ROOT = '/data-protection-management'
const DATA_PROTECTION_BACKUP_AND_SCHEDULE =
`${DATA_PROTECTION_ROOT}/backup-and-schedule/:view(${Object.values(BackupAndScheduleListViewEnum).join('|')})` as const
const GLOBAL_CONFIG_ROOT = '/global-configuration'

/** @deprecated */
export const URLS = {
LOGIN: '/login',
LOGIN_SSO: '/login/sso',
APP_LIST: 'list',
CREATE_JOB: 'create-job',
GETTING_STARTED: 'getting-started',
STACK_MANAGER_ABOUT: '/stack-manager/about',
APP_CI_DETAILS: 'ci-details',
LOGS: 'Logs',
CREATE: '/create',
RELEASES: '/releases',
DEVTRON_CHARTS: 'dc',
APP_DEPLOYMNENT_HISTORY: 'deployments',
APP_DETAILS: 'details',
APP_DETAILS_K8: 'k8s-resources', // for V2
DETAILS: '/details',
CD_DETAILS: 'cd-details',
APP_TRIGGER: 'trigger',
DEPLOYMENT_HISTORY_CONFIGURATIONS: '/configuration',
NETWORK_STATUS_INTERFACE: '/network-status-interface',
COMPARE_CLUSTERS: '/compare-clusters',
DEPLOYMENT_HISTORY_CONFIGURATIONS: 'configuration',
APP_CONFIG: 'edit',
LICENSE_AUTH: '/license-auth',
// APPLICATION MANAGEMENT
APPLICATION_MANAGEMENT: APPLICATION_MANAGEMENT_ROOT,
APPLICATION_MANAGEMENT_OVERVIEW: `${APPLICATION_MANAGEMENT_ROOT}/overview`,
APPLICATION_MANAGEMENT_APP: `${APPLICATION_MANAGEMENT_ROOT}/devtron-app`,
APPLICATION_MANAGEMENT_APP_LIST: `${APPLICATION_MANAGEMENT_ROOT}/devtron-app/list`,
APPLICATION_MANAGEMENT_CREATE_DEVTRON_APP: `${APPLICATION_MANAGEMENT_ROOT}/devtron-app/list/create-app`,
APPLICATION_MANAGEMENT_APPLICATION_GROUP: `${APPLICATION_MANAGEMENT_ROOT}/application-group`,
APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP,
APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP_CREATE: `${APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP}/create`,
// NOTE: using appId since we are re-using AppConfig component
APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP_DETAIL: `${APPLICATION_MANAGEMENT_TEMPLATES_DEVTRON_APP}/detail/:appId`,
APPLICATION_MANAGEMENT_CONFIGURATIONS,
APPLICATION_MANAGEMENT_CONFIGURATIONS_DEPLOYMENT_CHARTS: `${APPLICATION_MANAGEMENT_CONFIGURATIONS}/deployment-charts`,
APPLICATION_MANAGEMENT_CONFIGURATIONS_SCOPED_VARIABLES: `${APPLICATION_MANAGEMENT_CONFIGURATIONS}/scoped-variables`,
APPLICATION_MANAGEMENT_CONFIGURATIONS_BUILD_INFRA: `${APPLICATION_MANAGEMENT_CONFIGURATIONS}/build-infra`,
APPLICATION_MANAGEMENT_CONFIGURATIONS_BUILD_INFRA_PROFILES: `${APPLICATION_MANAGEMENT_CONFIGURATIONS}/build-infra/profiles`,
APPLICATION_MANAGEMENT_CONFIGURATIONS_NOTIFICATIONS: `${APPLICATION_MANAGEMENT_CONFIGURATIONS}/notifications`,
// INFRASTRUCTURE MANAGEMENT
INFRASTRUCTURE_MANAGEMENT: INFRASTRUCTURE_MANAGEMENT_ROOT,
INFRASTRUCTURE_MANAGEMENT_OVERVIEW: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/overview`,
INFRASTRUCTURE_MANAGEMENT_APP_LIST: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/apps/:appType(${Object.values(InfrastructureManagementAppListType).join('|')})`,
INFRASTRUCTURE_MANAGEMENT_APP: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/apps`,
INFRASTRUCTURE_MANAGEMENT_CHART_STORE: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/chart-store`,
INFRASTRUCTURE_MANAGEMENT_CHART_STORE_DISCOVER: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/chart-store/discover`,
INFRASTRUCTURE_MANAGEMENT_RESOURCE_BROWSER: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/resource-browser`,
INFRASTRUCTURE_MANAGEMENT_RESOURCE_WATCHER: `${INFRASTRUCTURE_MANAGEMENT_ROOT}/resource-watcher`,
// SOFTWARE RELEASE MANAGEMENT
SOFTWARE_RELEASE_MANAGEMENT: SOFTWARE_RELEASE_MANAGEMENT_ROOT,
// COST VISIBILITY
COST_VISIBILITY: COST_VISIBILITY_ROOT,
COST_VISIBILITY_OVERVIEW: `${COST_VISIBILITY_ROOT}/overview`,
COST_BREAKDOWN_ROUTE: `${COST_VISIBILITY_ROOT}/breakdown/:breakdownViewType`,
COST_BREAKDOWN_CLUSTERS: `${COST_VISIBILITY_ROOT}/breakdown/${CostBreakdownViewType.CLUSTERS}`,
COST_BREAKDOWN_ENVIRONMENTS: `${COST_VISIBILITY_ROOT}/breakdown/${CostBreakdownViewType.ENVIRONMENTS}`,
COST_BREAKDOWN_PROJECTS: `${COST_VISIBILITY_ROOT}/breakdown/${CostBreakdownViewType.PROJECTS}`,
COST_BREAKDOWN_APPLICATIONS: `${COST_VISIBILITY_ROOT}/breakdown/${CostBreakdownViewType.APPLICATIONS}`,
COST_BREAKDOWN_DETAIL: `:${CostBreakdownItemViewParamsType.ITEM_NAME}/:${CostBreakdownItemViewParamsType.VIEW}/:${CostBreakdownItemViewParamsType.DETAIL}?`,
COST_CONFIGURATIONS: `${COST_VISIBILITY_ROOT}/configurations`,
// SECURITY CENTER
SECURITY_CENTER: SECURITY_CENTER_ROOT,
SECURITY_CENTER_OVERVIEW: `${SECURITY_CENTER_ROOT}/overview`,
SECURITY_CENTER_VULNERABILITIES: `${SECURITY_CENTER_ROOT}/vulnerabilities`,
SECURITY_CENTER_VULNERABILITY_DEPLOYMENTS: `${SECURITY_CENTER_ROOT}/vulnerabilities/deployments`,
SECURITY_CENTER_VULNERABILITY_CVES: `${SECURITY_CENTER_ROOT}/vulnerabilities/cves`,
SECURITY_CENTER_SECURITY_ENABLEMENT: `${SECURITY_CENTER_ROOT}/security-enablement`,
SECURITY_CENTER_POLICIES: `${SECURITY_CENTER_ROOT}/policies`,
// AUTOMATION AND ENABLEMENT
AUTOMATION_AND_ENABLEMENT: AUTOMATION_AND_ENABLEMENT_ROOT,
AUTOMATION_AND_ENABLEMENT_JOB: `${AUTOMATION_AND_ENABLEMENT_ROOT}/job`,
// DATA PROTECTION
DATA_PROTECTION: DATA_PROTECTION_ROOT,
DATA_PROTECTION_OVERVIEW: `${DATA_PROTECTION_ROOT}/overview`,
DATA_PROTECTION_BACKUP_AND_SCHEDULE,
DATA_PROTECTION_BACKUP_AND_SCHEDULE_DETAIL: `${DATA_PROTECTION_BACKUP_AND_SCHEDULE}/detail/:id`,
DATA_PROTECTION_RESTORES: `${DATA_PROTECTION_ROOT}/restores`,
DATA_PROTECTION_RESTORES_DETAIL: `${DATA_PROTECTION_ROOT}/restores/:restoreId`,
DATA_PROTECTION_BACKUP_LOCATIONS: `${DATA_PROTECTION_ROOT}/backup-locations/:type(${Object.values(BackupLocationsTypes).join('|')})`,
BACKUP_LOCATION_DETAILS: `/:locationId`,
// GLOBAL CONFIGURATION
GLOBAL_CONFIG: GLOBAL_CONFIG_ROOT,
GLOBAL_CONFIG_DOCKER: `${GLOBAL_CONFIG_ROOT}/docker`,
GLOBAL_CONFIG_EDIT_CLUSTER: `${GLOBAL_CONFIG_ROOT}/cluster-env/edit/:clusterId`,
GLOBAL_CONFIG_PROJECTS: `${GLOBAL_CONFIG_ROOT}/projects`,
PERMISSION_GROUPS: `${GLOBAL_CONFIG_ROOT}/auth/groups`,
EXTERNAL_APPS: 'ea',
APPLICATION_MANAGEMENT_APP: '/application-management/devtron-app',
GLOBAL_CONFIG_EDIT_CLUSTER: '/global-configuration/cluster-env/edit/:clusterId',
} as const
Comment thread
arunjaindev marked this conversation as resolved.

export const ROUTES = {
Expand All @@ -171,7 +76,6 @@ export const ROUTES = {
INFRA_CONFIG_PROFILE: 'infra-config/profile',
SCAN_RESULT: 'scan-result',
NOTIFIER: 'notification',
APP_LIST: 'app/list',
TELEMETRY_EVENT: 'telemetry/event',
SERVER_INFO_API: 'server',
ATTRIBUTES_USER: 'attributes/user',
Expand Down
6 changes: 4 additions & 2 deletions src/Common/CustomTagSelector/Types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,10 @@ export interface TagLabelValueSelectorType {
noBackDrop?: boolean
}

export interface ResizableTagTextAreaProps
extends Omit<DetailedHTMLProps<TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, 'value'> {
export interface ResizableTagTextAreaProps extends Omit<
DetailedHTMLProps<TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>,
'value'
> {
minHeight?: number
maxHeight?: number
value: string
Expand Down
1 change: 0 additions & 1 deletion src/Common/Dialogs/DialogForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ export class DialogForm extends Component<PropsWithChildren<DialogFormProps>> {
<div className={`modal__header ${this.props.headerClassName || ''}`}>
<h1 className="modal__title">{this.props.title}</h1>
<button type="button" className="dc__transparent" onClick={this.props.close}>
{' '}
<img src={close} alt="close" />
</button>
</div>
Expand Down
10 changes: 6 additions & 4 deletions src/Common/ErrorPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,23 @@
* limitations under the License.
*/

import { useHistory } from 'react-router-dom'
import { useNavigate } from 'react-router-dom'

import { ROUTER_URLS } from '@PagesDevtron2.0/Shared'

import GenericEmptyState from './EmptyState/GenericEmptyState'
import { ERROR_EMPTY_SCREEN, ERROR_STATUS_CODE, ROUTES } from './Constants'
import { ERROR_EMPTY_SCREEN, ERROR_STATUS_CODE } from './Constants'
import { noop, refresh, reportIssue } from './Helper'
import { ErrorPageType } from './Types'

const ErrorPage = ({ code, image, title, subTitle, imageType, redirectURL, reload, on404Redirect }: ErrorPageType) => {
const { push } = useHistory()
const navigate = useNavigate()
const redirectToHome = () => {
if (on404Redirect) {
on404Redirect()
return
}
push(redirectURL || `/${ROUTES.APP_LIST}`)
navigate(redirectURL || ROUTER_URLS.DEVTRON_APP_LIST)
}

const getErrorPageProps = (
Expand Down
35 changes: 18 additions & 17 deletions src/Common/Hooks/useStateFilters/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,25 @@

import { UseUrlFiltersProps, UseUrlFiltersReturnType } from '../useUrlFilters'

export interface UseStateFiltersProps<T>
extends Pick<UseUrlFiltersProps<T, never>, 'initialSortKey' | 'defaultPageSize'> {}
export interface UseStateFiltersProps<T> extends Pick<
UseUrlFiltersProps<T, never>,
'initialSortKey' | 'defaultPageSize'
> {}

export interface UseStateFiltersReturnType<T>
extends Pick<
UseUrlFiltersReturnType<T>,
| 'sortBy'
| 'sortOrder'
| 'handleSorting'
| 'clearFilters'
| 'changePage'
| 'changePageSize'
| 'offset'
| 'pageSize'
| 'searchKey'
| 'handleSearch'
| 'areFiltersApplied'
> {}
export interface UseStateFiltersReturnType<T> extends Pick<
UseUrlFiltersReturnType<T>,
| 'sortBy'
| 'sortOrder'
| 'handleSorting'
| 'clearFilters'
| 'changePage'
| 'changePageSize'
| 'offset'
| 'pageSize'
| 'searchKey'
| 'handleSearch'
| 'areFiltersApplied'
> {}

export interface PaginationType<T> extends Pick<UseUrlFiltersReturnType<T>, 'pageSize'> {
pageNumber: number
Expand Down
12 changes: 4 additions & 8 deletions src/Common/Hooks/useUrlFilters/useUrlFilters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

import { useMemo, useRef } from 'react'
import { useHistory, useLocation } from 'react-router-dom'
import { useLocation, useNavigate } from 'react-router-dom'

import { getUrlWithSearchParams } from '@Common/Helper'

Expand Down Expand Up @@ -52,7 +52,7 @@ const useUrlFilters = <T = string, K = {}>({
defaultPageSize = DEFAULT_BASE_PAGE_SIZE,
}: UseUrlFiltersProps<T, K> = {}): UseUrlFiltersReturnType<T, K> => {
const location = useLocation()
const history = useHistory()
const navigate = useNavigate()

const isAlreadyReadFromLocalStorage = useRef<boolean>(false)

Expand All @@ -68,7 +68,7 @@ const useUrlFilters = <T = string, K = {}>({
const localSearchParams = new URLSearchParams(localSearchString.split('?')[1] ?? '')

// This would remain replace since the initial value is being set from local storage
history.replace({ search: localSearchParams.toString() })
navigate({ search: localSearchParams.toString() }, { replace: true })
return localSearchParams
} catch {
localStorage.removeItem(localStorageKey)
Expand Down Expand Up @@ -128,11 +128,7 @@ const useUrlFilters = <T = string, K = {}>({
const params = { search: updatedSearchString }
const methodForRedirection = options.redirectionMethod ?? redirectionMethod

if (methodForRedirection === 'push') {
history.push(params)
} else {
history.replace(params)
}
navigate(params, { replace: methodForRedirection === 'replace' })
}

/**
Expand Down
Loading