Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit 0ad5389

Browse files
Merge pull request #56 from thefringeninja/jason
No More Strings for JSON
2 parents 485b2ae + 3049eac commit 0ad5389

File tree

5 files changed

+97
-54
lines changed

5 files changed

+97
-54
lines changed

Diff for: src/components/HyperMediaControls/FormButton.tsx

+1-13
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,6 @@ const mapper = {
1212
uuid: UuidField,
1313
};
1414

15-
const getValue = (value: FormEvent<HTMLInputElement>) => {
16-
if (typeof value === 'object') {
17-
try {
18-
return JSON.parse(value.currentTarget.value);
19-
} catch (e) {
20-
return value.currentTarget.value;
21-
}
22-
}
23-
24-
return value;
25-
};
26-
2715
interface FormButtonProps {
2816
rel: string;
2917
link: HalLink;
@@ -66,7 +54,7 @@ class FormButton extends PureComponent<
6654
...state,
6755
model: {
6856
...model,
69-
[key]: getValue(value),
57+
[key]: value,
7058
},
7159
});
7260
};

Diff for: src/components/HyperMediaControls/TextAreaField.tsx

+71-24
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,79 @@
11
import { TextField } from '@material-ui/core';
2-
import React, { StatelessComponent } from 'react';
2+
import React, { ChangeEvent } from 'react';
33
import {
44
ComposedComponent,
55
ReactSchemaFormInputProps,
66
} from 'react-schema-form';
77

8-
const TextAreaField: StatelessComponent<ReactSchemaFormInputProps> = ({
9-
form,
10-
error,
11-
onChangeValidate,
12-
value,
13-
}) => (
14-
<div className={form.htmlClass}>
15-
<TextField
16-
type={form.type}
17-
label={form.title}
18-
placeholder={form.placeholder}
19-
helperText={error || form.description}
20-
error={!!error}
21-
onChange={onChangeValidate}
22-
value={value}
23-
disabled={form.readonly}
24-
fullWidth
25-
multiline
26-
rows={15}
27-
rowsMax={15}
28-
/>
29-
</div>
30-
);
8+
const getDisplayValue = (value: object | string): string =>
9+
typeof value === 'string' ? value : JSON.stringify(value);
10+
11+
class TextAreaField extends React.PureComponent<
12+
ReactSchemaFormInputProps<HTMLTextAreaElement>
13+
> {
14+
constructor(props: ReactSchemaFormInputProps<HTMLTextAreaElement>) {
15+
super(props);
16+
}
17+
18+
_onChangeValidate = (
19+
e: ChangeEvent<HTMLTextAreaElement>,
20+
v?: any,
21+
): void => {
22+
const { form, onChangeValidate } = this.props;
23+
24+
const tryParseJson = (value: string): string | object => {
25+
try {
26+
return JSON.parse(value);
27+
} catch (e) {
28+
return value;
29+
}
30+
};
31+
32+
onChangeValidate(
33+
{
34+
...e,
35+
currentTarget: {
36+
...e.currentTarget,
37+
// @ts-ignore
38+
value:
39+
form.schema.type === 'object'
40+
? tryParseJson(e.target.value)
41+
: e.target.value,
42+
},
43+
target: {
44+
// @ts-ignore
45+
value:
46+
form.schema.type === 'object'
47+
? tryParseJson(e.target.value)
48+
: e.target.value,
49+
},
50+
},
51+
v,
52+
);
53+
};
54+
55+
render() {
56+
const { form, error, value } = this.props;
57+
58+
return (
59+
<div className={form.htmlClass}>
60+
<TextField
61+
type={form.type}
62+
label={form.title}
63+
placeholder={form.placeholder}
64+
helperText={error || form.description}
65+
error={!!error}
66+
onChange={this._onChangeValidate}
67+
value={getDisplayValue(value)}
68+
disabled={form.readonly}
69+
fullWidth
70+
multiline
71+
rows={15}
72+
rowsMax={15}
73+
/>
74+
</div>
75+
);
76+
}
77+
}
3178

3279
export default ComposedComponent(TextAreaField);

Diff for: src/components/HyperMediaControls/UuidField.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import {
77
} from 'react-schema-form';
88
import uuid from 'uuid';
99

10-
class UuidField extends React.PureComponent<ReactSchemaFormInputProps> {
11-
constructor(props: ReactSchemaFormInputProps) {
10+
class UuidField extends React.PureComponent<
11+
ReactSchemaFormInputProps<HTMLInputElement>
12+
> {
13+
constructor(props: ReactSchemaFormInputProps<HTMLInputElement>) {
1214
super(props);
1315

1416
const { model, form, setDefault } = this.props;

Diff for: src/stream-store/Viewer/HalViewer/StreamMessage.tsx

+2-10
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,10 @@ import { HalResource } from 'types';
1616
import { JsonViewer, StreamHeader, StreamMessageDetails } from './components';
1717
import { HalViewerProps } from './types';
1818

19-
const tryParseJson = (payload: string): object => {
20-
try {
21-
return JSON.parse(payload);
22-
} catch (e) {
23-
return {};
24-
}
25-
};
26-
2719
const message$ = store.hal$.body$.map(({ payload, metadata, ...body }) => ({
2820
...body,
29-
metadata: tryParseJson(metadata),
30-
payload: tryParseJson(payload),
21+
metadata,
22+
payload,
3123
}));
3224

3325
interface StreamMessageState extends HalResource {

Diff for: src/types/react-schema-form.d.ts

+19-5
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
declare module 'react-schema-form' {
22
import { JSONSchema7 } from 'json-schema';
3-
import { ComponentType, FormEventHandler } from 'react';
3+
import {
4+
ChangeEvent,
5+
ComponentType,
6+
FormEvent,
7+
FormEventHandler,
8+
} from 'react';
49

510
interface Form {
611
description: string;
712
htmlClass: string;
813
key: string;
914
placeholder: string;
1015
readonly: boolean;
16+
schema: JSONSchema7;
1117
title: string;
1218
type: string;
1319
}
1420

15-
export interface ReactSchemaFormInputProps {
21+
export interface ReactSchemaFormInputProps<
22+
T extends HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
23+
> {
1624
error: string;
1725
form: Form;
18-
onChangeValidate: FormEventHandler;
26+
onChangeValidate: (e: ChangeEvent<T>, v?: any) => void;
1927
model: { [key: string]: any };
2028
onChange: (key: string, value: string) => void;
2129
setDefault: (
@@ -42,7 +50,13 @@ declare module 'react-schema-form' {
4250

4351
export const SchemaForm: ComponentType<ReactSchemaFormProps>;
4452

45-
export const ComposedComponent: <T>(
53+
export const ComposedComponent: <
54+
T,
55+
TElement extends
56+
| HTMLInputElement
57+
| HTMLTextAreaElement
58+
| HTMLSelectElement
59+
>(
4660
component: ComponentType<T>,
47-
) => ComponentType<ReactSchemaFormInputProps>;
61+
) => ComponentType<ReactSchemaFormInputProps<TElement>>;
4862
}

0 commit comments

Comments
 (0)