From 3c72c0be914d867ccd6d0336865aa0fa554b2516 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 9 Jan 2023 14:55:05 +0100 Subject: [PATCH] chore: fix exporting the SecretsContext Signed-off-by: blam --- plugins/scaffolder-react/api-report.md | 11 ++++---- .../src/secrets/SecretsContext.test.tsx | 13 +++------- .../src/secrets/SecretsContext.tsx | 26 ++++++++++++------- plugins/scaffolder-react/src/secrets/index.ts | 1 - plugins/scaffolder/api-report.md | 8 +++--- .../components/TemplatePage/TemplatePage.tsx | 6 ++--- .../RepoUrlPicker/RepoUrlPicker.test.tsx | 10 ++++--- .../TemplateWizardPage/TemplateWizardPage.tsx | 10 ++++--- 8 files changed, 44 insertions(+), 41 deletions(-) diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 1091f68d17..b124ad80f6 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -242,7 +242,9 @@ export interface ScaffolderDryRunResponse { } // @public -export const ScaffolderFieldExtensions: React_2.ComponentType; +export const ScaffolderFieldExtensions: React_2.ComponentType< + React_2.PropsWithChildren<{}> +>; // @public export interface ScaffolderGetIntegrationsListOptions { @@ -318,15 +320,12 @@ export type ScaffolderTaskStatus = // @public export interface ScaffolderUseTemplateSecrets { + // (undocumented) + secrets: Record; // (undocumented) setSecrets: (input: Record) => void; } -// @public -export const SecretsContext: React_2.Context< - SecretsContextContents | undefined ->; - // @public export type SecretsContextContents = { secrets: Record; diff --git a/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx b/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx index 3b84c074d7..593fbd908b 100644 --- a/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx +++ b/plugins/scaffolder-react/src/secrets/SecretsContext.test.tsx @@ -13,12 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext } from 'react'; -import { - useTemplateSecrets, - SecretsContextProvider, - SecretsContext, -} from './SecretsContext'; +import React from 'react'; +import { useTemplateSecrets, SecretsContextProvider } from './SecretsContext'; import { renderHook, act } from '@testing-library/react-hooks'; describe('SecretsContext', () => { @@ -26,7 +22,6 @@ describe('SecretsContext', () => { const { result } = renderHook( () => ({ hook: useTemplateSecrets(), - context: useContext(SecretsContext), }), { wrapper: ({ children }) => ( @@ -34,10 +29,10 @@ describe('SecretsContext', () => { ), }, ); - expect(result.current.context?.secrets.foo).toEqual(undefined); + expect(result.current.hook?.secrets.foo).toEqual(undefined); act(() => result.current.hook.setSecrets({ foo: 'bar' })); - expect(result.current.context?.secrets.foo).toEqual('bar'); + expect(result.current.hook?.secrets.foo).toEqual('bar'); }); }); diff --git a/plugins/scaffolder-react/src/secrets/SecretsContext.tsx b/plugins/scaffolder-react/src/secrets/SecretsContext.tsx index 15548dfbc4..ca5ab1e671 100644 --- a/plugins/scaffolder-react/src/secrets/SecretsContext.tsx +++ b/plugins/scaffolder-react/src/secrets/SecretsContext.tsx @@ -13,16 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { + createVersionedContext, + createVersionedValueMap, +} from '@backstage/version-bridge'; import React, { useState, useCallback, useContext, - createContext, PropsWithChildren, } from 'react'; /** - * The contents of the {@link SecretsContext}. + * The contents of the `SecretsContext` * @public */ export type SecretsContextContents = { @@ -32,11 +35,10 @@ export type SecretsContextContents = { /** * The context to hold the Secrets. - * @public */ -export const SecretsContext = createContext( - undefined, -); +const SecretsContext = createVersionedContext<{ + 1: SecretsContextContents; +}>('secrets-context'); /** * The Context Provider that holds the state for the secrets. @@ -46,7 +48,9 @@ export const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => { const [secrets, setSecrets] = useState>({}); return ( - + {children} ); @@ -58,6 +62,7 @@ export const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => { */ export interface ScaffolderUseTemplateSecrets { setSecrets: (input: Record) => void; + secrets: Record; } /** @@ -66,14 +71,15 @@ export interface ScaffolderUseTemplateSecrets { * @public */ export const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => { - const value = useContext(SecretsContext); + const value = useContext(SecretsContext)?.atVersion(1); + if (!value) { throw new Error( 'useTemplateSecrets must be used within a SecretsContextProvider', ); } - const { setSecrets: updateSecrets } = value; + const { setSecrets: updateSecrets, secrets = {} } = value; const setSecrets = useCallback( (input: Record) => { @@ -82,5 +88,5 @@ export const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => { [updateSecrets], ); - return { setSecrets }; + return { setSecrets, secrets }; }; diff --git a/plugins/scaffolder-react/src/secrets/index.ts b/plugins/scaffolder-react/src/secrets/index.ts index 90aa69158a..ca58455374 100644 --- a/plugins/scaffolder-react/src/secrets/index.ts +++ b/plugins/scaffolder-react/src/secrets/index.ts @@ -15,7 +15,6 @@ */ export { useTemplateSecrets, - SecretsContext, SecretsContextProvider, type ScaffolderUseTemplateSecrets, type SecretsContextContents, diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 574184be15..cf26e41829 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -118,9 +118,9 @@ export type EntityPickerUiOptions = export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { - helperText?: string | undefined; - kinds?: string[] | undefined; showCounts?: boolean | undefined; + kinds?: string[] | undefined; + helperText?: string | undefined; } >; @@ -128,9 +128,9 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< export const EntityTagsPickerFieldSchema: FieldSchema< string[], { - helperText?: string | undefined; - kinds?: string[] | undefined; showCounts?: boolean | undefined; + kinds?: string[] | undefined; + helperText?: string | undefined; } >; diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx index c1814bf7e9..0f484ff404 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx @@ -16,13 +16,13 @@ import { LinearProgress } from '@material-ui/core'; import { IChangeEvent } from '@rjsf/core'; import qs from 'qs'; -import React, { ComponentType, useCallback, useContext, useState } from 'react'; +import React, { ComponentType, useCallback, useState } from 'react'; import { Navigate, useNavigate } from 'react-router-dom'; import useAsync from 'react-use/lib/useAsync'; import { FieldExtensionOptions, - SecretsContext, scaffolderApiRef, + useTemplateSecrets, } from '@backstage/plugin-scaffolder-react'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from './createValidator'; @@ -72,7 +72,7 @@ export const TemplatePage = ({ headerOptions, }: Props) => { const apiHolder = useApiHolder(); - const secretsContext = useContext(SecretsContext); + const secretsContext = useTemplateSecrets(); const errorApi = useApi(errorApiRef); const scaffolderApi = useApi(scaffolderApiRef); const { templateName, namespace } = useRouteRefParams( diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx index 1cf8d91059..1edb4fb940 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.test.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext } from 'react'; +import React from 'react'; import { RepoUrlPicker } from './RepoUrlPicker'; import Form from '@rjsf/core'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; @@ -26,9 +26,9 @@ import { import { SecretsContextProvider, - SecretsContext, scaffolderApiRef, ScaffolderApi, + useTemplateSecrets, } from '@backstage/plugin-scaffolder-react'; import { act, fireEvent } from '@testing-library/react'; @@ -119,8 +119,10 @@ describe('RepoUrlPicker', () => { describe('requestUserCredentials', () => { it('should call the scmAuthApi with the correct params', async () => { const SecretsComponent = () => { - const value = useContext(SecretsContext); - return
{JSON.stringify(value)}
; + const { secrets } = useTemplateSecrets(); + return ( +
{JSON.stringify({ secrets })}
+ ); }; const { getAllByRole, getByTestId } = await renderInTestApp( { const styles = useStyles(); const rootRef = useRouteRef(nextRouteRef); const taskRoute = useRouteRef(scaffolderTaskRouteRef); - const { secrets } = useContext(SecretsContext) ?? {}; + const { secrets } = useTemplateSecrets(); const scaffolderApi = useApi(scaffolderApiRef); const navigate = useNavigate(); const { templateName, namespace } = useRouteRefParams(