1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Extract responsibility of "separability"

Co-authored-by: Janne Savolainen <janne.savolainen@live.fi>

Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
Iku-turso 2022-10-20 11:37:12 +03:00 committed by Janne Savolainen
parent f59f771947
commit 18f1e1b6aa
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
9 changed files with 28 additions and 16 deletions

View File

@ -7,11 +7,10 @@ export interface ParentOfChildComposite<Id extends string = string> {
id: Id; id: Id;
} }
export interface ChildOfParentComposite<Id extends string = string> { export interface ChildOfParentComposite<ParentId extends string = string> {
parentId: Id; parentId: ParentId;
} }
export type RootComposite<Id extends string = string> = export type RootComposite<Id extends string = string> =
& { parentId: undefined } & { parentId: undefined }
& ParentOfChildComposite<Id>; & ParentOfChildComposite<Id>;

View File

@ -54,7 +54,7 @@ const registratorForPreferenceItemsInjectable = getInjectable({
</PreferencePageComponent> </PreferencePageComponent>
), ),
childSeparator: HorizontalLine, childSeparator: () => <HorizontalLine />,
}), }),
injectionToken: preferenceItemInjectionToken, injectionToken: preferenceItemInjectionToken,
@ -133,7 +133,7 @@ const registratorForPreferenceItemsInjectable = getInjectable({
<ExtensionPreferenceBlock registration={registration} /> <ExtensionPreferenceBlock registration={registration} />
), ),
childSeparator: HorizontalLine, childSeparator: () => <HorizontalLine />,
}), }),
injectionToken: preferenceItemInjectionToken, injectionToken: preferenceItemInjectionToken,

View File

@ -23,7 +23,7 @@ const applicationPreferencePageInjectable = getInjectable({
id: "application-page", id: "application-page",
parentId: "application-tab", parentId: "application-tab",
Component: ApplicationPage, Component: ApplicationPage,
childSeparator: HorizontalLine, childSeparator: () => <HorizontalLine />,
}), }),
injectionToken: preferenceItemInjectionToken, injectionToken: preferenceItemInjectionToken,

View File

@ -23,7 +23,7 @@ const kubernetesPreferencePageInjectable = getInjectable({
id: "kubernetes-page", id: "kubernetes-page",
parentId: "kubernetes-tab", parentId: "kubernetes-tab",
Component: KubernetesPage, Component: KubernetesPage,
childSeparator: HorizontalLine, childSeparator: () => <HorizontalLine />,
}), }),
injectionToken: preferenceItemInjectionToken, injectionToken: preferenceItemInjectionToken,

View File

@ -9,6 +9,14 @@ import type { Discriminable } from "../../../../common/utils/composable-responsi
import type { Labelable } from "../../../../common/utils/composable-responsibilities/labelable/labelable"; import type { Labelable } from "../../../../common/utils/composable-responsibilities/labelable/labelable";
import type { Showable } from "../../../../common/utils/composable-responsibilities/showable/showable"; import type { Showable } from "../../../../common/utils/composable-responsibilities/showable/showable";
import type { Orderable } from "../../../../common/utils/composable-responsibilities/orderable/orderable"; import type { Orderable } from "../../../../common/utils/composable-responsibilities/orderable/orderable";
import type { GetSeparator } from "../../../../common/utils/add-separator/add-separator";
import type { Composite } from "../../../../common/utils/composite/get-composite/get-composite";
export type ChildrenAreSeparated =
& { childSeparator: GetSeparator<Composite<PreferenceTypes>, React.ReactElement> };
export type ChildrenAreMaybeSeparated =
& Partial<ChildrenAreSeparated>;
export type PreferenceItemComponent<T> = React.ComponentType<{ export type PreferenceItemComponent<T> = React.ComponentType<{
children: React.ReactElement; children: React.ReactElement;
@ -33,8 +41,8 @@ export type PreferenceTabGroup =
& Orderable & Orderable
& { iconName? : string }; & { iconName? : string };
interface RenderableWithSiblings<T extends PreferenceTypes> { interface RenderableWithSiblings<T extends PreferenceTypes>
childSeparator?: () => React.ReactElement; extends ChildrenAreMaybeSeparated {
Component: PreferenceItemComponent<T>; Component: PreferenceItemComponent<T>;
} }

View File

@ -7,12 +7,13 @@ import { HorizontalLine } from "../../../../renderer/components/horizontal-line/
import type { RootComposite } from "../../../../common/utils/composite/interfaces"; import type { RootComposite } from "../../../../common/utils/composite/interfaces";
import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable"; import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable";
import type { Showable } from "../../../../common/utils/composable-responsibilities/showable/showable"; import type { Showable } from "../../../../common/utils/composable-responsibilities/showable/showable";
import type { ChildrenAreSeparated } from "./preference-item-injection-token";
export type PreferenceTabsRoot = export type PreferenceTabsRoot =
& Discriminable<"preference-tabs-root"> & Discriminable<"preference-tabs-root">
& RootComposite & RootComposite
& Showable<true> & ChildrenAreSeparated
& { childSeparator: () => React.ReactElement }; & Showable<true>;
export const preferenceTabsRoot: PreferenceTabsRoot = { export const preferenceTabsRoot: PreferenceTabsRoot = {
kind: "preference-tabs-root" as const, kind: "preference-tabs-root" as const,

View File

@ -82,7 +82,11 @@ const toNavigationHierarchy = (composite: Composite<PreferenceTypes | Preference
case "preference-tabs-root": { case "preference-tabs-root": {
return ( return (
<Map items={composite.children} getSeparator={value.childSeparator}> <Map
// Note: stricter typing for composite children could maybe remove this curiosity.
items={composite.children as Composite<PreferenceTypes>[]}
getSeparator={value.childSeparator}
>
{toNavigationHierarchy} {toNavigationHierarchy}
</Map> </Map>
); );

View File

@ -79,7 +79,7 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
<Component item={value}> <Component item={value}>
<Map <Map
items={composite.children} items={composite.children}
getSeparator={value.childSeparator || DefaultSeparator} getSeparator={value.childSeparator || defaultSeparator}
> >
{toPreferenceItemHierarchy} {toPreferenceItemHierarchy}
</Map> </Map>
@ -112,4 +112,4 @@ export const Preferences = withInjectables<Dependencies>(
}, },
); );
const DefaultSeparator = () => <Gutter size="xl" />; const defaultSeparator = () => <Gutter size="xl" />;

View File

@ -7,10 +7,10 @@ import styles from "./horizontal-line.module.scss";
import { cssNames } from "../../utils"; import { cssNames } from "../../utils";
interface HorizontalLineProps { interface HorizontalLineProps {
size: "sm" | "md" | "xl"; size?: "sm" | "md" | "xl";
} }
export const HorizontalLine = ({ size }: HorizontalLineProps = { size: "xl" }) => { export const HorizontalLine = ({ size = "xl" }: HorizontalLineProps = { size: "xl" }) => {
const classNames = cssNames(styles.HorizontalLine, styles[`size-${size}`]); const classNames = cssNames(styles.HorizontalLine, styles[`size-${size}`]);
return <div className={classNames} />; return <div className={classNames} />;