Skip to content

Commit 57bd73b

Browse files
committed
feat: unstable features
1 parent e826535 commit 57bd73b

File tree

32 files changed

+703
-598
lines changed

32 files changed

+703
-598
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import React from 'react';
2+
3+
import {SchemaRendererContext} from '../SchemaRendererContext';
4+
import type {JsonSchema} from '../types';
5+
import {useSchemaRendererField} from '../useSchemaRendererField';
6+
7+
import {getRenderKit} from './utils';
8+
9+
export interface EntityProps {
10+
name: string;
11+
schema: JsonSchema;
12+
}
13+
14+
const EntityComponent: React.FC<EntityProps> = ({name, schema}) => {
15+
const {config, mode} = React.useContext(SchemaRendererContext);
16+
17+
const renderKit = React.useMemo(
18+
() => getRenderKit({config, mode, schema}),
19+
[config, mode, schema],
20+
);
21+
22+
const options = React.useMemo(
23+
() => ({
24+
data: {schema},
25+
defaultValue: schema.default,
26+
subscription: {
27+
error: true,
28+
submitFailed: true,
29+
touched: true,
30+
validating: true,
31+
value: true,
32+
},
33+
}),
34+
[schema],
35+
);
36+
37+
const field = useSchemaRendererField(name, options);
38+
39+
if (!renderKit.View) {
40+
return null;
41+
}
42+
43+
let content = null;
44+
45+
if (renderKit.independent) {
46+
content = (
47+
<renderKit.View
48+
{...field}
49+
schema={schema}
50+
Wrapper={renderKit.Wrapper}
51+
viewProps={renderKit.viewProps}
52+
wrapperProps={renderKit.wrapperProps}
53+
/>
54+
);
55+
} else {
56+
content = <renderKit.View {...field} schema={schema} viewProps={renderKit.viewProps} />;
57+
58+
if (renderKit.Wrapper) {
59+
content = (
60+
<renderKit.Wrapper {...field} schema={schema} wrapperProps={renderKit.wrapperProps}>
61+
{content}
62+
</renderKit.Wrapper>
63+
);
64+
}
65+
}
66+
67+
return <div>{content}</div>;
68+
};
69+
70+
export const Entity = React.memo(EntityComponent);
File renamed without changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type {SchemaRendererMode} from '../constants';
2+
import type {
3+
IndependentView,
4+
JsonSchema,
5+
SchemaRendererConfig,
6+
SimpleView,
7+
Wrapper,
8+
} from '../types';
9+
10+
export type GetRenderKitParams<Schema extends JsonSchema> = {
11+
config: SchemaRendererConfig;
12+
mode: SchemaRendererMode;
13+
schema: Schema;
14+
};
15+
16+
export type GetRenderKitReturn<Schema extends JsonSchema> =
17+
| {
18+
View: SimpleView<Schema> | undefined;
19+
Wrapper: Wrapper<Schema> | undefined;
20+
independent: false | undefined;
21+
viewProps: Record<string, any>;
22+
wrapperProps: Record<string, any>;
23+
}
24+
| {
25+
View: IndependentView<Schema>;
26+
Wrapper: Wrapper<Schema> | undefined;
27+
independent: true;
28+
viewProps: Record<string, any>;
29+
wrapperProps: Record<string, any>;
30+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import get from 'lodash/get';
2+
3+
import {EMPTY_OBJECT} from '../constants';
4+
import type {JsonSchema, View, Wrapper} from '../types';
5+
6+
import type {GetRenderKitParams, GetRenderKitReturn} from './types';
7+
8+
export const getRenderKit = <Schema extends JsonSchema>({
9+
config,
10+
mode,
11+
schema,
12+
}: GetRenderKitParams<Schema>): GetRenderKitReturn<Schema> => {
13+
const viewType: string | undefined = get(schema, 'entityParameters.viewType');
14+
const wrapperType: string | undefined = get(schema, 'entityParameters.wrapperType');
15+
16+
const viewProps = get(schema, 'entityParameters.viewProps', EMPTY_OBJECT);
17+
const wrapperProps = get(schema, 'entityParameters.wrapperProps', EMPTY_OBJECT);
18+
19+
const ViewComponent: View<Schema> | undefined = get(
20+
config,
21+
`${schema.type}.views.${viewType}.${mode}.Component`,
22+
);
23+
const WrapperComponent: Wrapper<Schema> | undefined = get(
24+
config,
25+
`${schema.type}.wrappers.${wrapperType}`,
26+
);
27+
const independent: boolean | undefined = get(
28+
config,
29+
`${schema.type}.views.${viewType}.${mode}.independent`,
30+
);
31+
32+
return {
33+
View: ViewComponent,
34+
viewProps,
35+
Wrapper: WrapperComponent,
36+
wrapperProps,
37+
independent,
38+
};
39+
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import React from 'react';
2+
3+
import {Entity} from '../Entity';
4+
import {SchemaRendererContext, type SchemaRendererContextType} from '../SchemaRendererContext';
5+
import {SchemaRendererServiceField} from '../SchemaRendererServiceField';
6+
import type {SchemaRendererMode} from '../constants';
7+
import type {ErrorMessages, JsonSchema, SchemaRendererConfig} from '../types';
8+
9+
export interface SchemaRendererProps {
10+
config: SchemaRendererConfig;
11+
errorMessages?: ErrorMessages;
12+
mode: SchemaRendererMode;
13+
name: string;
14+
schema: JsonSchema;
15+
}
16+
17+
const SchemaRendererComponent: React.FC<SchemaRendererProps> = ({
18+
config,
19+
errorMessages,
20+
mode,
21+
name,
22+
schema,
23+
}) => {
24+
const serviceFieldName = `DYNAMIC_FORMS_SERVICE_FIELD/${name}`;
25+
26+
const context: SchemaRendererContextType = React.useMemo(
27+
() => ({
28+
config,
29+
mode,
30+
name,
31+
schema,
32+
serviceFieldName,
33+
}),
34+
[config, mode, name, schema, serviceFieldName],
35+
);
36+
37+
return (
38+
<SchemaRendererContext.Provider value={context}>
39+
<SchemaRendererServiceField
40+
config={config}
41+
errorMessages={errorMessages}
42+
name={name}
43+
mainSchema={schema}
44+
serviceFieldName={serviceFieldName}
45+
/>
46+
<Entity name={name} schema={schema} />
47+
</SchemaRendererContext.Provider>
48+
);
49+
};
50+
51+
export const SchemaRenderer = React.memo(SchemaRendererComponent);
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
export * from './SchemaRenderer';
2-
export * from './context';

src/lib/unstable/core/components/SchemaRenderer/context.ts renamed to src/lib/unstable/core/SchemaRendererContext/SchemaRendererContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import type {SchemaRendererContextType} from '../../types';
3+
import type {SchemaRendererContextType} from './types';
44

55
export const SchemaRendererContext = React.createContext<SchemaRendererContextType>(
66
null as unknown as SchemaRendererContextType,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './SchemaRendererContext';
2+
export * from './types';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type {SchemaRendererMode} from '../constants';
2+
import type {JsonSchema, SchemaRendererConfig} from '../types';
3+
4+
export interface SchemaRendererContextType {
5+
config: SchemaRendererConfig;
6+
mode: SchemaRendererMode;
7+
name: string;
8+
schema: JsonSchema;
9+
serviceFieldName: string;
10+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React from 'react';
2+
3+
import {useField, useForm} from 'react-final-form';
4+
5+
import type {ErrorMessages, JsonSchema, SchemaRendererConfig} from '../types';
6+
7+
import {getValidate} from './utils';
8+
9+
export interface SchemaRendererProps {
10+
config: SchemaRendererConfig;
11+
errorMessages?: ErrorMessages;
12+
name: string;
13+
mainSchema: JsonSchema;
14+
serviceFieldName: string;
15+
}
16+
17+
const SchemaRendererServiceFieldComponent: React.FC<SchemaRendererProps> = ({
18+
config,
19+
errorMessages,
20+
name,
21+
mainSchema,
22+
serviceFieldName,
23+
}) => {
24+
const {setValidationCache, setValidationWaiters} = useForm().mutators;
25+
26+
const validate = React.useMemo(
27+
() =>
28+
getValidate({
29+
config,
30+
errorMessages,
31+
name,
32+
mainSchema,
33+
serviceFieldName,
34+
setValidationCache,
35+
setValidationWaiters,
36+
}),
37+
[
38+
config,
39+
errorMessages,
40+
name,
41+
mainSchema,
42+
serviceFieldName,
43+
setValidationCache,
44+
setValidationWaiters,
45+
],
46+
);
47+
48+
useField(serviceFieldName, {data: {schema: mainSchema}, subscription: {}, validate});
49+
50+
return null;
51+
};
52+
53+
export const SchemaRendererServiceField = React.memo(SchemaRendererServiceFieldComponent);

0 commit comments

Comments
 (0)