Skip to content

Commit

Permalink
Expose useSpaces function to external consumers
Browse files Browse the repository at this point in the history
  • Loading branch information
jportner committed Aug 19, 2021
1 parent ce4ded6 commit f165b5b
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 18 deletions.
2 changes: 1 addition & 1 deletion x-pack/plugins/spaces/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export type { SpaceAvatarProps } from './space_avatar';

export type { SpaceListProps } from './space_list';

export type { SpacesContextProps } from './spaces_context';
export type { SpacesContextProps, SpacesReactContextValue } from './spaces_context';

export type { LazyComponentFn, SpacesApiUi, SpacesApiUiComponent } from './ui_api';

Expand Down
1 change: 1 addition & 0 deletions x-pack/plugins/spaces/public/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const createApiUiMock = () => {
const mock: SpacesApiUiMock = {
components: createApiUiComponentsMock(),
redirectLegacyUrl: jest.fn(),
useSpaces: jest.fn(),
};

return mock;
Expand Down
18 changes: 9 additions & 9 deletions x-pack/plugins/spaces/public/spaces_context/context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@

import * as React from 'react';

import type { CoreStart } from 'src/core/public';

import type { SpacesManager } from '../spaces_manager';
import type { SpacesData } from '../types';
import type { KibanaServices, SpacesReactContext, SpacesReactContextValue } from './types';
import type { SpacesReactContext, SpacesReactContextValue } from './types';

const { useContext, createElement, createContext } = React;

const context = createContext<Partial<SpacesReactContextValue<KibanaServices>>>({});
const context = createContext<Partial<SpacesReactContextValue<Partial<CoreStart>>>>({});

export const useSpaces = <Extra extends object = {}>(): SpacesReactContextValue<
KibanaServices & Extra
> =>
useContext(
(context as unknown) as React.Context<SpacesReactContextValue<KibanaServices & Extra>>
);
export const useSpaces = <
Services extends Partial<CoreStart>
>(): SpacesReactContextValue<Services> =>
useContext((context as unknown) as React.Context<SpacesReactContextValue<Services>>);

export const createSpacesReactContext = <Services extends KibanaServices>(
export const createSpacesReactContext = <Services extends Partial<CoreStart>>(
services: Services,
spacesManager: SpacesManager,
spacesDataPromise: Promise<SpacesData>
Expand Down
2 changes: 1 addition & 1 deletion x-pack/plugins/spaces/public/spaces_context/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
*/

export { useSpaces } from './context';
export type { SpacesContextProps } from './types';
export type { SpacesContextProps, SpacesReactContextValue } from './types';
export { getSpacesContextProviderWrapper } from './wrapper';
10 changes: 4 additions & 6 deletions x-pack/plugins/spaces/public/spaces_context/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,16 @@ import type { PluginsStart } from '../plugin';
import type { SpacesManager } from '../spaces_manager';
import type { SpacesData } from '../types';

export type KibanaServices = Partial<CoreStart>;

export interface SpacesReactContextValue<Services extends KibanaServices> {
export interface SpacesReactContextValue<Services extends Partial<CoreStart>> {
readonly spacesManager: SpacesManager;
readonly spacesDataPromise: Promise<SpacesData>;
readonly services: Services;
}

export interface SpacesReactContext<T extends KibanaServices> {
value: SpacesReactContextValue<T>;
export interface SpacesReactContext<Services extends Partial<CoreStart>> {
value: SpacesReactContextValue<Services>;
Provider: React.FC;
Consumer: React.Consumer<SpacesReactContextValue<T>>;
Consumer: React.Consumer<SpacesReactContextValue<Services>>;
}

export interface InternalProps {
Expand Down
2 changes: 2 additions & 0 deletions x-pack/plugins/spaces/public/ui_api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import type { StartServicesAccessor } from 'src/core/public';

import type { PluginsStart } from '../plugin';
import { createRedirectLegacyUrl } from '../share_saved_objects_to_space';
import { useSpaces } from '../spaces_context';
import type { SpacesManager } from '../spaces_manager';
import { getComponents } from './components';
import type { LazyComponentFn, SpacesApiUi, SpacesApiUiComponent } from './types';
Expand All @@ -26,5 +27,6 @@ export const getUiApi = ({ spacesManager, getStartServices }: GetUiApiOptions):
return {
components,
redirectLegacyUrl: createRedirectLegacyUrl(getStartServices),
useSpaces,
};
};
8 changes: 7 additions & 1 deletion x-pack/plugins/spaces/public/ui_api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@

import type { ReactElement } from 'react';

import type { CoreStart } from 'src/core/public';

import type { CopyToSpaceFlyoutProps } from '../copy_saved_objects_to_space';
import type {
LegacyUrlConflictProps,
ShareToSpaceFlyoutProps,
} from '../share_saved_objects_to_space';
import type { SpaceAvatarProps } from '../space_avatar';
import type { SpaceListProps } from '../space_list';
import type { SpacesContextProps } from '../spaces_context';
import type { SpacesContextProps, SpacesReactContextValue } from '../spaces_context';

/**
* Function that returns a promise for a lazy-loadable component.
Expand Down Expand Up @@ -50,6 +52,10 @@ export interface SpacesApiUi {
* location_. Default value is 'object'.
*/
redirectLegacyUrl: (path: string, objectNoun?: string) => Promise<void>;
/**
* Helper function to easily access the Spaces React Context provider.
*/
useSpaces<Services extends Partial<CoreStart>>(): SpacesReactContextValue<Services>;
}

/**
Expand Down

0 comments on commit f165b5b

Please sign in to comment.