version-bridge: leave it to the caller of useVersionedContext to check availability
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
@@ -115,11 +115,11 @@ describe('ApiProvider', () => {
|
||||
withLogCollector(['error'], () => {
|
||||
expect(() => {
|
||||
render(<MyHookConsumer />);
|
||||
}).toThrow(/^No provider available for api-context context/);
|
||||
}).toThrow(/^API context is not available/);
|
||||
}).error,
|
||||
).toEqual([
|
||||
expect.stringMatching(
|
||||
/^Error: Uncaught \[Error: No provider available for api-context context/,
|
||||
/^Error: Uncaught \[Error: API context is not available/,
|
||||
),
|
||||
expect.stringMatching(
|
||||
/^The above error occurred in the <MyHookConsumer> component/,
|
||||
@@ -130,11 +130,11 @@ describe('ApiProvider', () => {
|
||||
withLogCollector(['error'], () => {
|
||||
expect(() => {
|
||||
render(<MyHocConsumer />);
|
||||
}).toThrow(/^No provider available for api-context context/);
|
||||
}).toThrow(/^API context is not available/);
|
||||
}).error,
|
||||
).toEqual([
|
||||
expect.stringMatching(
|
||||
/^Error: Uncaught \[Error: No provider available for api-context context/,
|
||||
/^Error: Uncaught \[Error: API context is not available/,
|
||||
),
|
||||
expect.stringMatching(
|
||||
/^The above error occurred in the <withApis\(Component\)> component/,
|
||||
|
||||
@@ -20,6 +20,9 @@ import { useVersionedContext } from '@backstage/version-bridge';
|
||||
|
||||
export function useApiHolder(): ApiHolder {
|
||||
const versionedHolder = useVersionedContext<{ 1: ApiHolder }>('api-context');
|
||||
if (!versionedHolder) {
|
||||
throw new Error('API context is not available');
|
||||
}
|
||||
|
||||
const apiHolder = versionedHolder.atVersion(1);
|
||||
if (!apiHolder) {
|
||||
|
||||
@@ -20,6 +20,10 @@ import { AppContext as AppContextV1 } from './types';
|
||||
export const useApp = (): AppContextV1 => {
|
||||
const versionedContext =
|
||||
useVersionedContext<{ 1: AppContextV1 }>('app-context');
|
||||
if (!versionedContext) {
|
||||
throw new Error('App context is not available');
|
||||
}
|
||||
|
||||
const appContext = versionedContext.atVersion(1);
|
||||
if (!appContext) {
|
||||
throw new Error('AppContext v1 not available');
|
||||
|
||||
@@ -50,6 +50,10 @@ export function useRouteRef<Params extends AnyParams>(
|
||||
const sourceLocation = useLocation();
|
||||
const versionedContext =
|
||||
useVersionedContext<{ 1: RouteResolver }>('routing-context');
|
||||
if (!versionedContext) {
|
||||
throw new Error('Routing context is not available');
|
||||
}
|
||||
|
||||
const resolver = versionedContext.atVersion(1);
|
||||
const routeFunc = useMemo(
|
||||
() => resolver && resolver.resolve(routeRef, sourceLocation),
|
||||
|
||||
@@ -36,7 +36,7 @@ export function useVersionedContext<
|
||||
Versions extends {
|
||||
[version in number]: any;
|
||||
},
|
||||
>(key: string): VersionedValue<Versions>;
|
||||
>(key: string): VersionedValue<Versions> | undefined;
|
||||
|
||||
// @public
|
||||
export type VersionedValue<
|
||||
|
||||
@@ -65,13 +65,9 @@ describe('VersionedContext', () => {
|
||||
|
||||
const rendered = renderHook(() => useVersionedContext('test-context-3'));
|
||||
|
||||
expect(() => rendered.result.current).toThrow(
|
||||
'Global test-context-3 is not set',
|
||||
);
|
||||
expect(rendered.result.current).toBeUndefined();
|
||||
context.set({ 1: '3v1' });
|
||||
expect(() => rendered.result.current).toThrow(
|
||||
'Global test-context-3 is not set',
|
||||
);
|
||||
expect(rendered.result.current).toBeUndefined();
|
||||
// should need a rerender before update
|
||||
rendered.rerender();
|
||||
|
||||
@@ -86,9 +82,7 @@ describe('VersionedContext', () => {
|
||||
|
||||
context.reset();
|
||||
rendered.rerender();
|
||||
expect(() => rendered.result.current).toThrow(
|
||||
'Global test-context-3 is not set',
|
||||
);
|
||||
expect(rendered.result.current).toBeUndefined();
|
||||
|
||||
context.set({ 1: '3v1', 2: '3v2' });
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
import { createContext, useContext, Context } from 'react';
|
||||
import { getGlobalSingleton, getOrCreateGlobalSingleton } from './globalObject';
|
||||
import { getOrCreateGlobalSingleton } from './globalObject';
|
||||
import { createVersionedValueMap, VersionedValue } from './VersionedValue';
|
||||
|
||||
/**
|
||||
@@ -55,6 +55,10 @@ export function createVersionedContext<
|
||||
* ```ts
|
||||
* const versionedHolder = useVersionedContext<{ 1: string }>('my-context');
|
||||
*
|
||||
* if (!versionedHolder) {
|
||||
* throw new Error('My context is not available!')
|
||||
* }
|
||||
*
|
||||
* const myValue = versionedHolder.atVersion(1);
|
||||
*
|
||||
* // ...
|
||||
@@ -62,14 +66,8 @@ export function createVersionedContext<
|
||||
*/
|
||||
export function useVersionedContext<
|
||||
Versions extends { [version in number]: any },
|
||||
>(key: string): VersionedValue<Versions> {
|
||||
const versionedValue = useContext(
|
||||
getGlobalSingleton<Context<VersionedValue<Versions>>>(key),
|
||||
);
|
||||
if (!versionedValue) {
|
||||
throw new Error(`No provider available for ${key} context`);
|
||||
}
|
||||
return versionedValue;
|
||||
>(key: string): VersionedValue<Versions> | undefined {
|
||||
return useContext(createVersionedContext<Versions>(key));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user