From f9039688f6a81a668ba64cba5ddf9df534df2695 Mon Sep 17 00:00:00 2001 From: shivang Date: Wed, 25 Feb 2026 10:33:59 +0530 Subject: [PATCH 1/4] fix: [AH-2312]: client setup details is giving 500 at account and org level when you select the project level registry scope should be account, org and project --- .../RepositorySetupClientWidget.tsx | 21 +++++++++++++++++-- web/src/ar/hooks/index.ts | 2 +- .../components/Actions/SetupClient.tsx | 4 +++- .../SetupClientContent/SetupClientContent.tsx | 13 ++++++++---- .../useSetupClientModal.tsx | 6 +++++- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx index 50d96c9950..68fbc5837c 100644 --- a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx +++ b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx @@ -27,19 +27,36 @@ import type { RepositoryAbstractFactory } from './RepositoryAbstractFactory' interface RepositorySetupClientWidgetProps extends RepositoySetupClientProps { factory?: RepositoryAbstractFactory type: RepositoryPackageType + /** When true (e.g. from registry list), use registryPath for client-setup-details API. Injected here so types don't need to prop-drill. */ + isSentFromRegistryPage?: boolean + /** Full path from list API (accountId/orgId/projectId/registryName). Injected here when isSentFromRegistryPage is true. */ + registryPath?: string } export default function RepositorySetupClientWidget(props: RepositorySetupClientWidgetProps): JSX.Element { - const { factory = repositoryFactory, type, onClose, repoKey, artifactKey, versionKey } = props + const { + factory = repositoryFactory, + type, + onClose, + repoKey, + artifactKey, + versionKey, + isSentFromRegistryPage, + registryPath + } = props const { getString } = useStrings() const repositoryType = factory?.getRepositoryType(type) if (!repositoryType) { return {getString('stepNotFound')} } - return repositoryType.renderSetupClient({ + const content = repositoryType.renderSetupClient({ onClose, repoKey, artifactKey, versionKey }) + return React.cloneElement(content as React.ReactElement, { + isSentFromRegistryPage, + registryPath + }) } diff --git a/web/src/ar/hooks/index.ts b/web/src/ar/hooks/index.ts index 05e839063a..1eb9e108f5 100644 --- a/web/src/ar/hooks/index.ts +++ b/web/src/ar/hooks/index.ts @@ -21,7 +21,7 @@ export { useDecodedParams } from './useDecodedParams' export { useLocalStorage } from './useLocalStorage' export { useRoutes } from './useRoutes' export { useDeepCompareEffect, useDeepCompareMemo } from './useDeepCompareEffect' -export { useGetSpaceRef } from './useGetSpaceRef' +export { useGetSpaceRef, encodeRef } from './useGetSpaceRef' export { useParentContextObj } from './useParentContextObj' export { useLicenseStore } from './useLicenseStore' export { useFeatureFlags, useFeatureFlag } from './useFeatureFlag' diff --git a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx index e6e4f40448..a2d6cf4e5b 100644 --- a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx +++ b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx @@ -29,7 +29,9 @@ export default function SetupClientMenuItem({ data, onClose }: RepositoryActions const [showSetupClientModal] = useSetupClientModal({ repoKey: data.identifier, packageType: data.packageType as RepositoryPackageType, - onClose + onClose, + isSentFromRegistryPage: true, + registryPath: (data as { path?: string }).path }) return ( <> diff --git a/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx b/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx index 0dbf780f0f..b025bff6d6 100644 --- a/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx +++ b/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx @@ -19,7 +19,7 @@ import { FontVariation } from '@harnessio/design-system' import { Button, ButtonVariation, Layout, Page, Text } from '@harnessio/uicore' import { type PackageType, useGetClientSetupDetailsQuery } from '@harnessio/react-har-service-client' -import { useGetSpaceRef } from '@ar/hooks' +import { useGetSpaceRef, encodeRef } from '@ar/hooks' import { useStrings } from '@ar/frameworks/strings' import type { RepositoryPackageType } from '@ar/common/types' import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon' @@ -34,12 +34,17 @@ interface SetupClientContentProps { artifactKey?: string versionKey?: string packageType: PackageType + /** When true, use registryPath for client-setup-details API ref. Default false. */ + isSentFromRegistryPage?: boolean + /** Full path from list API (accountId/orgId/projectId/registryName). Used when isSentFromRegistryPage is true. */ + registryPath?: string } export default function SetupClientContent(props: SetupClientContentProps): JSX.Element { - const { onClose, packageType, repoKey } = props + const { onClose, packageType, repoKey, isSentFromRegistryPage = false, registryPath } = props const { getString } = useStrings() - const spaceRef = useGetSpaceRef(repoKey) + const spaceRefFromScope = useGetSpaceRef(repoKey) + const registryRef = isSentFromRegistryPage && registryPath ? encodeRef(registryPath) : spaceRefFromScope const { isFetching: loading, @@ -47,7 +52,7 @@ export default function SetupClientContent(props: SetupClientContentProps): JSX. error, refetch } = useGetClientSetupDetailsQuery({ - registry_ref: spaceRef, + registry_ref: registryRef, queryParams: { artifact: props.artifactKey, version: props.versionKey diff --git a/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx b/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx index c20d05eeea..497d50765d 100644 --- a/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx +++ b/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx @@ -27,10 +27,12 @@ import css from './useSetupClientModal.module.scss' export interface useSetupClientModalProps extends Omit { packageType: RepositoryPackageType onClose?: () => void + isSentFromRegistryPage?: boolean + registryPath?: string } export function useSetupClientModal(props: useSetupClientModalProps) { - const { packageType, repoKey, artifactKey, versionKey, onClose } = props + const { packageType, repoKey, artifactKey, versionKey, onClose, isSentFromRegistryPage, registryPath } = props const { useModalHook } = useParentHooks() const [showModal, hideModal] = useModalHook(() => { @@ -58,6 +60,8 @@ export function useSetupClientModal(props: useSetupClientModalProps) { versionKey={versionKey} onClose={handleCloseModal} type={packageType as RepositoryPackageType} + isSentFromRegistryPage={isSentFromRegistryPage} + registryPath={registryPath} /> ) From 7637bdad46932c30b90496ecd3bd2467702f2243 Mon Sep 17 00:00:00 2001 From: shivang Date: Wed, 25 Feb 2026 10:48:57 +0530 Subject: [PATCH 2/4] fix: [AH-2312]: client setup details is giving 500 at account and org level when you select the project level registry scope should be account, org and project --- .../RepositoryStep/RepositorySetupClientWidget.tsx | 7 +++++-- .../repository-details/components/Actions/SetupClient.tsx | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx index 68fbc5837c..dad714cdea 100644 --- a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx +++ b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx @@ -55,8 +55,11 @@ export default function RepositorySetupClientWidget(props: RepositorySetupClient artifactKey, versionKey }) - return React.cloneElement(content as React.ReactElement, { + if (!content || !React.isValidElement(content)) { + return content + } + return React.cloneElement(content, { isSentFromRegistryPage, registryPath - }) + } as React.Attributes & { isSentFromRegistryPage?: boolean; registryPath?: string }) } diff --git a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx index a2d6cf4e5b..bccb49e67c 100644 --- a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx +++ b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx @@ -30,7 +30,7 @@ export default function SetupClientMenuItem({ data, onClose }: RepositoryActions repoKey: data.identifier, packageType: data.packageType as RepositoryPackageType, onClose, - isSentFromRegistryPage: true, + isSentFromRegistryPage: !!(data as { path?: string }).path, registryPath: (data as { path?: string }).path }) return ( From f5f0141ba3878daebd5442362db94a8d62ffd8d5 Mon Sep 17 00:00:00 2001 From: shivang Date: Wed, 25 Feb 2026 13:29:12 +0530 Subject: [PATCH 3/4] fix: [AH-2312]: client setup details is giving 500 at account and org level when you select the project level registry scope should be account, org and project --- .../RepositoryActionsWidget.tsx | 21 ++++++++++++------ .../RepositorySetupClientWidget.tsx | 22 +++++-------------- .../components/Actions/RepositoryActions.tsx | 10 ++++++++- .../components/Actions/SetupClient.tsx | 5 ++--- .../components/Actions/types.ts | 2 ++ .../SetupClientContent/SetupClientContent.tsx | 12 +++++----- .../useSetupClientModal.tsx | 9 ++++---- .../RepositoryListCells.tsx | 4 ++++ .../RepositoryListTreeView.tsx | 8 +++++-- .../UpstreamProxyActions.tsx | 10 ++++++++- 10 files changed, 60 insertions(+), 43 deletions(-) diff --git a/web/src/ar/frameworks/RepositoryStep/RepositoryActionsWidget.tsx b/web/src/ar/frameworks/RepositoryStep/RepositoryActionsWidget.tsx index ef18e95591..78d8d226e5 100644 --- a/web/src/ar/frameworks/RepositoryStep/RepositoryActionsWidget.tsx +++ b/web/src/ar/frameworks/RepositoryStep/RepositoryActionsWidget.tsx @@ -22,23 +22,30 @@ import type { RepositoryPackageType } from '@ar/common/types' import repositoryFactory from './RepositoryFactory' import type { RepositoryAbstractFactory } from './RepositoryAbstractFactory' import type { RepositoryActionsProps } from './Repository' +import { RegistryRefProvider } from './RegistryRefContext' interface RepositoryActionsWidgetProps extends RepositoryActionsProps { factory?: RepositoryAbstractFactory packageType: RepositoryPackageType + /** Pre-computed registry ref from list (path). Provided via context to actions for Setup Client. */ + registryRef?: string } export default function RepositoryActionsWidget(props: RepositoryActionsWidgetProps): JSX.Element { - const { factory = repositoryFactory, packageType, type, data, readonly, pageType } = props + const { factory = repositoryFactory, packageType, type, data, readonly, pageType, registryRef } = props const { getString } = useStrings() const repositoryType = factory?.getRepositoryType(packageType) if (!repositoryType) { return {getString('stepNotFound')} } - return repositoryType.renderActions({ - data, - readonly, - type, - pageType - }) + return ( + + {repositoryType.renderActions({ + data, + readonly, + type, + pageType + })} + + ) } diff --git a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx index dad714cdea..abf3d6ec9b 100644 --- a/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx +++ b/web/src/ar/frameworks/RepositoryStep/RepositorySetupClientWidget.tsx @@ -27,23 +27,12 @@ import type { RepositoryAbstractFactory } from './RepositoryAbstractFactory' interface RepositorySetupClientWidgetProps extends RepositoySetupClientProps { factory?: RepositoryAbstractFactory type: RepositoryPackageType - /** When true (e.g. from registry list), use registryPath for client-setup-details API. Injected here so types don't need to prop-drill. */ - isSentFromRegistryPage?: boolean - /** Full path from list API (accountId/orgId/projectId/registryName). Injected here when isSentFromRegistryPage is true. */ - registryPath?: string + /** Pre-computed registry ref (e.g. from list). When set, used for client-setup-details API. Injected here so types don't prop-drill. */ + registryRef?: string } export default function RepositorySetupClientWidget(props: RepositorySetupClientWidgetProps): JSX.Element { - const { - factory = repositoryFactory, - type, - onClose, - repoKey, - artifactKey, - versionKey, - isSentFromRegistryPage, - registryPath - } = props + const { factory = repositoryFactory, type, onClose, repoKey, artifactKey, versionKey, registryRef } = props const { getString } = useStrings() const repositoryType = factory?.getRepositoryType(type) if (!repositoryType) { @@ -59,7 +48,6 @@ export default function RepositorySetupClientWidget(props: RepositorySetupClient return content } return React.cloneElement(content, { - isSentFromRegistryPage, - registryPath - } as React.Attributes & { isSentFromRegistryPage?: boolean; registryPath?: string }) + registryRef + } as React.Attributes & { registryRef?: string }) } diff --git a/web/src/ar/pages/repository-details/components/Actions/RepositoryActions.tsx b/web/src/ar/pages/repository-details/components/Actions/RepositoryActions.tsx index 56481ce3eb..2032e0eaec 100644 --- a/web/src/ar/pages/repository-details/components/Actions/RepositoryActions.tsx +++ b/web/src/ar/pages/repository-details/components/Actions/RepositoryActions.tsx @@ -19,6 +19,7 @@ import React, { useState } from 'react' import { useAllowSoftDelete } from '@ar/hooks' import { PageType } from '@ar/common/types' import ActionButton from '@ar/components/ActionButton/ActionButton' +import { useRegistryRef } from '@ar/frameworks/RepositoryStep/RegistryRefContext' import SetupClientMenuItem from './SetupClient' import type { RepositoryActionsProps } from './types' @@ -28,6 +29,7 @@ import SoftDeleteRepositoryMenuItem from './SoftDeleteRepository' export default function RepositoryActions({ data, readonly, pageType }: RepositoryActionsProps): JSX.Element { const [open, setOpen] = useState(false) const allowSoftDelete = useAllowSoftDelete() + const registryRef = useRegistryRef() return ( {allowSoftDelete && ( @@ -40,7 +42,13 @@ export default function RepositoryActions({ data, readonly, pageType }: Reposito )} setOpen(false)} /> {pageType === PageType.Table && ( - setOpen(false)} /> + setOpen(false)} + /> )} ) diff --git a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx index bccb49e67c..fd69f9ccac 100644 --- a/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx +++ b/web/src/ar/pages/repository-details/components/Actions/SetupClient.tsx @@ -23,15 +23,14 @@ import { PermissionIdentifier, ResourceType } from '@ar/common/permissionTypes' import { useSetupClientModal } from '@ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal' import type { RepositoryActionsProps } from './types' -export default function SetupClientMenuItem({ data, onClose }: RepositoryActionsProps): JSX.Element { +export default function SetupClientMenuItem({ data, onClose, registryRef }: RepositoryActionsProps): JSX.Element { const { getString } = useStrings() const { RbacMenuItem } = useParentComponents() const [showSetupClientModal] = useSetupClientModal({ repoKey: data.identifier, packageType: data.packageType as RepositoryPackageType, onClose, - isSentFromRegistryPage: !!(data as { path?: string }).path, - registryPath: (data as { path?: string }).path + registryRef }) return ( <> diff --git a/web/src/ar/pages/repository-details/components/Actions/types.ts b/web/src/ar/pages/repository-details/components/Actions/types.ts index 4a130e69b5..58f8f24565 100644 --- a/web/src/ar/pages/repository-details/components/Actions/types.ts +++ b/web/src/ar/pages/repository-details/components/Actions/types.ts @@ -22,4 +22,6 @@ export interface RepositoryActionsProps { readonly: boolean pageType: PageType onClose?: () => void + /** Pre-computed registry ref from list (path + /+). When set, used for client-setup-details API. */ + registryRef?: string } diff --git a/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx b/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx index b025bff6d6..1101bcb33d 100644 --- a/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx +++ b/web/src/ar/pages/repository-details/components/SetupClientContent/SetupClientContent.tsx @@ -19,7 +19,7 @@ import { FontVariation } from '@harnessio/design-system' import { Button, ButtonVariation, Layout, Page, Text } from '@harnessio/uicore' import { type PackageType, useGetClientSetupDetailsQuery } from '@harnessio/react-har-service-client' -import { useGetSpaceRef, encodeRef } from '@ar/hooks' +import { useGetSpaceRef } from '@ar/hooks' import { useStrings } from '@ar/frameworks/strings' import type { RepositoryPackageType } from '@ar/common/types' import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon' @@ -34,17 +34,15 @@ interface SetupClientContentProps { artifactKey?: string versionKey?: string packageType: PackageType - /** When true, use registryPath for client-setup-details API ref. Default false. */ - isSentFromRegistryPage?: boolean - /** Full path from list API (accountId/orgId/projectId/registryName). Used when isSentFromRegistryPage is true. */ - registryPath?: string + /** Pre-computed registry ref (e.g. from list). When set, used for client-setup-details API; otherwise use scope + repoKey. */ + registryRef?: string } export default function SetupClientContent(props: SetupClientContentProps): JSX.Element { - const { onClose, packageType, repoKey, isSentFromRegistryPage = false, registryPath } = props + const { onClose, packageType, repoKey, registryRef: registryRefProp } = props const { getString } = useStrings() const spaceRefFromScope = useGetSpaceRef(repoKey) - const registryRef = isSentFromRegistryPage && registryPath ? encodeRef(registryPath) : spaceRefFromScope + const registryRef = registryRefProp ?? spaceRefFromScope const { isFetching: loading, diff --git a/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx b/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx index 497d50765d..772b123652 100644 --- a/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx +++ b/web/src/ar/pages/repository-details/hooks/useSetupClientModal/useSetupClientModal.tsx @@ -27,12 +27,12 @@ import css from './useSetupClientModal.module.scss' export interface useSetupClientModalProps extends Omit { packageType: RepositoryPackageType onClose?: () => void - isSentFromRegistryPage?: boolean - registryPath?: string + /** Pre-computed registry ref (e.g. from list). When set, used for client-setup-details API. */ + registryRef?: string } export function useSetupClientModal(props: useSetupClientModalProps) { - const { packageType, repoKey, artifactKey, versionKey, onClose, isSentFromRegistryPage, registryPath } = props + const { packageType, repoKey, artifactKey, versionKey, onClose, registryRef } = props const { useModalHook } = useParentHooks() const [showModal, hideModal] = useModalHook(() => { @@ -60,8 +60,7 @@ export function useSetupClientModal(props: useSetupClientModalProps) { versionKey={versionKey} onClose={handleCloseModal} type={packageType as RepositoryPackageType} - isSentFromRegistryPage={isSentFromRegistryPage} - registryPath={registryPath} + registryRef={registryRef} /> ) diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx index a9a280ab6b..b53be75a1b 100644 --- a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx +++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx @@ -21,6 +21,7 @@ import type { RegistryMetadata } from '@harnessio/react-har-service-client' import type { Cell, CellValue, ColumnInstance, Renderer, Row, TableInstance } from 'react-table' import ScopeBadge from '@ar/components/Badge/ScopeBadge' +import { encodeRef } from '@ar/hooks' import { useStrings } from '@ar/frameworks/strings/String' import TableCells from '@ar/components/TableCells/TableCells' import { getEntityScopeType } from '@ar/hooks/useGetPageScope' @@ -102,6 +103,8 @@ export const RepositoryDownloadsCell: CellType = ({ value }) => { } export const RepositoryActionsCell: CellType = ({ row }) => { + const { path } = row.original + const registryRef = path ? encodeRef(path) : undefined return ( { data={row.original} readonly={false} pageType={PageType.Table} + registryRef={registryRef} /> ) } diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx index 4bd7fee3a6..d251a59320 100644 --- a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx +++ b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx @@ -19,7 +19,7 @@ import { compact as lodashCompact } from 'lodash-es' import { Switch } from 'react-router-dom' import { Container } from '@harnessio/uicore' -import { useAppStore, useParentHooks, useRoutes } from '@ar/hooks' +import { useAppStore, useParentHooks, useRoutes, encodeRef } from '@ar/hooks' import { PageType } from '@ar/common/types' import RouteProvider from '@ar/components/RouteProvider/RouteProvider' import RepositoryProvider from '@ar/pages/repository-details/context/RepositoryProvider' @@ -151,7 +151,9 @@ export default function RepositoryListTreeView() { const { metadata } = node const { entityType, repositoryIdentifier, artifactIdentifier, versionIdentifier } = metadata || {} switch (entityType) { - case TreeNodeEntityEnum.REGISTRY: + case TreeNodeEntityEnum.REGISTRY: { + const path = (metadata as { path?: string })?.path + const registryRef = path ? encodeRef(path) : undefined return ( ) + } case TreeNodeEntityEnum.ARTIFACT: return ( {allowSoftDelete && ( @@ -40,7 +42,13 @@ export default function UpstreamProxyActions({ data, readonly, pageType }: Upstr )} setOpen(false)} /> {pageType === PageType.Table && ( - setOpen(false)} /> + setOpen(false)} + /> )} ) From 76ef1b04da3c288e9ac12a27ee23ed0cedf98e4f Mon Sep 17 00:00:00 2001 From: shivang Date: Wed, 25 Feb 2026 13:50:56 +0530 Subject: [PATCH 4/4] fix: [AH-2312]: client setup details is giving 500 at account and org level when you select the project level registry scope should be account, org and project --- .../RepositoryStep/RegistryRefContext.tsx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 web/src/ar/frameworks/RepositoryStep/RegistryRefContext.tsx diff --git a/web/src/ar/frameworks/RepositoryStep/RegistryRefContext.tsx b/web/src/ar/frameworks/RepositoryStep/RegistryRefContext.tsx new file mode 100644 index 0000000000..514e80304e --- /dev/null +++ b/web/src/ar/frameworks/RepositoryStep/RegistryRefContext.tsx @@ -0,0 +1,39 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { createContext, useContext } from 'react' + +/** + * Pre-computed registry ref (e.g. from list path). Set by RepositoryActionsWidget when + * opened from the registry list; consumed by RepositoryActions/UpstreamProxyActions for + * the Setup Client flow. When not set (e.g. on details page), useRegistryRef() returns + * undefined and SetupClientContent falls back to scope-based ref. + */ +const RegistryRefContext = createContext(undefined) + +export function RegistryRefProvider({ + value, + children +}: { + value: string | undefined + children: React.ReactNode +}): React.ReactElement { + return {children} +} + +export function useRegistryRef(): string | undefined { + return useContext(RegistryRefContext) +}