Skip to content

Commit 142d9c1

Browse files
authored
fix: introduce useDisplayOverrideCode (#447)
This hook is used to avoid displaying the code message if the guesser component is rendered multiple times.
1 parent 30d8f22 commit 142d9c1

File tree

7 files changed

+61
-37
lines changed

7 files changed

+61
-37
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 3.0.2
4+
5+
* Introduce `useDisplayOverrideCode` hook to avoid displaying the code message if the guesser component is rendered multiple times
6+
37
## 3.0.1
48

59
* Make sure columns can be sorted when there is an order filter in `ListGuesser`

src/AdminGuesser.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ import IntrospectionContext from './IntrospectionContext';
1919
import ResourceGuesser from './ResourceGuesser';
2020
import SchemaAnalyzerContext from './SchemaAnalyzerContext';
2121
import { Error as DefaultError, Layout, LoginPage, lightTheme } from './layout';
22-
import type { ApiPlatformAdminDataProvider, SchemaAnalyzer } from './types';
2322
import getRoutesAndResourcesFromNodes, {
2423
isSingleChildFunction,
2524
} from './getRoutesAndResourcesFromNodes';
25+
import useDisplayOverrideCode from './useDisplayOverrideCode';
26+
import type { ApiPlatformAdminDataProvider, SchemaAnalyzer } from './types';
2627

2728
export interface AdminGuesserProps extends AdminProps {
2829
dataProvider: ApiPlatformAdminDataProvider;
@@ -42,17 +43,15 @@ interface AdminResourcesGuesserProps extends Omit<AdminProps, 'loading'> {
4243
resources: Resource[];
4344
}
4445

45-
const displayOverrideCode = (resources: Resource[]) => {
46-
if (process.env.NODE_ENV === 'production') return;
47-
46+
const getOverrideCode = (resources: Resource[]) => {
4847
let code =
4948
'If you want to override at least one resource, paste this content in the <AdminGuesser> component of your app:\n\n';
5049

5150
resources.forEach((r) => {
5251
code += `<ResourceGuesser name={"${r.name}"} />\n`;
5352
});
54-
// eslint-disable-next-line no-console
55-
console.info(code);
53+
54+
return code;
5655
};
5756

5857
/**
@@ -71,6 +70,8 @@ export const AdminResourcesGuesser = ({
7170
loading,
7271
...rest
7372
}: AdminResourcesGuesserProps) => {
73+
const displayOverrideCode = useDisplayOverrideCode();
74+
7475
if (loading) {
7576
return <LoadingPage />;
7677
}
@@ -92,7 +93,7 @@ export const AdminResourcesGuesser = ({
9293
<ResourceGuesser name={r.name} key={r.name} />
9394
)),
9495
];
95-
displayOverrideCode(guessResources);
96+
displayOverrideCode(getOverrideCode(guessResources));
9697
}
9798

9899
return (

src/CreateGuesser.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@ import type { Field, Resource } from '@api-platform/api-doc-parser';
1414

1515
import InputGuesser from './InputGuesser';
1616
import Introspecter from './Introspecter';
17+
import useDisplayOverrideCode from './useDisplayOverrideCode';
1718
import type {
1819
CreateGuesserProps,
1920
IntrospectedCreateGuesserProps,
2021
} from './types';
2122

22-
const displayOverrideCode = (schema: Resource, fields: Field[]) => {
23-
if (process.env.NODE_ENV === 'production') return;
24-
23+
const getOverrideCode = (schema: Resource, fields: Field[]) => {
2524
let code =
2625
'If you want to override at least one input, paste this content in the <CreateGuesser> component of your resource:\n\n';
2726

@@ -36,8 +35,8 @@ const displayOverrideCode = (schema: Resource, fields: Field[]) => {
3635
code += `\n`;
3736
code += `And don't forget update your <ResourceGuesser> component:\n`;
3837
code += `<ResourceGuesser name={"${schema.name}"} create={${schema.title}Create} />`;
39-
// eslint-disable-next-line no-console
40-
console.info(code);
38+
39+
return code;
4140
};
4241

4342
export const IntrospectedCreateGuesser = ({
@@ -62,12 +61,14 @@ export const IntrospectedCreateGuesser = ({
6261
const notify = useNotify();
6362
const redirect = useRedirect();
6463

64+
const displayOverrideCode = useDisplayOverrideCode();
65+
6566
let inputChildren = React.Children.toArray(children);
6667
if (inputChildren.length === 0) {
6768
inputChildren = writableFields.map((field) => (
6869
<InputGuesser key={field.name} source={field.name} />
6970
));
70-
displayOverrideCode(schema, writableFields);
71+
displayOverrideCode(getOverrideCode(schema, writableFields));
7172
}
7273

7374
const hasFileField = inputChildren.some(

src/EditGuesser.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ import type { Field, Resource } from '@api-platform/api-doc-parser';
1616
import InputGuesser from './InputGuesser';
1717
import Introspecter from './Introspecter';
1818
import useMercureSubscription from './useMercureSubscription';
19+
import useDisplayOverrideCode from './useDisplayOverrideCode';
1920
import type { EditGuesserProps, IntrospectedEditGuesserProps } from './types';
2021

21-
const displayOverrideCode = (schema: Resource, fields: Field[]) => {
22-
if (process.env.NODE_ENV === 'production') return;
23-
22+
const getOverrideCode = (schema: Resource, fields: Field[]) => {
2423
let code =
2524
'If you want to override at least one input, paste this content in the <EditGuesser> component of your resource:\n\n';
2625

@@ -35,8 +34,8 @@ const displayOverrideCode = (schema: Resource, fields: Field[]) => {
3534
code += `\n`;
3635
code += `And don't forget update your <ResourceGuesser> component:\n`;
3736
code += `<ResourceGuesser name={"${schema.name}"} edit={${schema.title}Edit} />`;
38-
// eslint-disable-next-line no-console
39-
console.info(code);
37+
38+
return code;
4039
};
4140

4241
export const IntrospectedEditGuesser = ({
@@ -66,12 +65,14 @@ export const IntrospectedEditGuesser = ({
6665
const notify = useNotify();
6766
const redirect = useRedirect();
6867

68+
const displayOverrideCode = useDisplayOverrideCode();
69+
6970
let inputChildren = React.Children.toArray(children);
7071
if (inputChildren.length === 0) {
7172
inputChildren = writableFields.map((field) => (
7273
<InputGuesser key={field.name} source={field.name} />
7374
));
74-
displayOverrideCode(schema, writableFields);
75+
displayOverrideCode(getOverrideCode(schema, writableFields));
7576
}
7677

7778
const hasFileField = inputChildren.some(

src/ListGuesser.tsx

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ import FieldGuesser from './FieldGuesser';
1616
import FilterGuesser from './FilterGuesser';
1717
import Introspecter from './Introspecter';
1818
import useMercureSubscription from './useMercureSubscription';
19+
import useDisplayOverrideCode from './useDisplayOverrideCode';
1920
import type {
2021
ApiPlatformAdminRecord,
2122
IntrospectedListGuesserProps,
2223
ListGuesserProps,
2324
} from './types';
2425

25-
const displayOverrideCode = (schema: Resource, fields: Field[]) => {
26-
if (process.env.NODE_ENV === 'production') return;
27-
26+
const getOverrideCode = (schema: Resource, fields: Field[]) => {
2827
let code =
2928
'If you want to override at least one field, paste this content in the <ListGuesser> component of your resource:\n\n';
3029

@@ -39,8 +38,8 @@ const displayOverrideCode = (schema: Resource, fields: Field[]) => {
3938
code += `\n`;
4039
code += `And don't forget update your <ResourceGuesser> component:\n`;
4140
code += `<ResourceGuesser name={"${schema.name}"} list={${schema.title}List} />`;
42-
// eslint-disable-next-line no-console
43-
console.info(code);
41+
42+
return code;
4443
};
4544

4645
export const DatagridBodyWithMercure = (props: DatagridBodyProps) => {
@@ -77,9 +76,7 @@ export const IntrospectedListGuesser = ({
7776
...props
7877
}: IntrospectedListGuesserProps) => {
7978
const { hasShow, hasEdit } = useResourceDefinition(props);
80-
const [orderParameters, setOrderParameters] = useState<
81-
string[] | undefined
82-
>();
79+
const [orderParameters, setOrderParameters] = useState<string[]>([]);
8380

8481
useEffect(() => {
8582
if (schema) {
@@ -89,10 +86,12 @@ export const IntrospectedListGuesser = ({
8986
}
9087
}, [schema, schemaAnalyzer]);
9188

89+
const displayOverrideCode = useDisplayOverrideCode();
90+
9291
let fieldChildren = children;
9392
if (!fieldChildren) {
9493
fieldChildren = readableFields.map((field) => {
95-
const orderField = (orderParameters ?? []).find(
94+
const orderField = orderParameters.find(
9695
(orderParameter) => orderParameter.split('.')[0] === field.name,
9796
);
9897

@@ -106,9 +105,8 @@ export const IntrospectedListGuesser = ({
106105
/>
107106
);
108107
});
109-
if (orderParameters !== undefined) {
110-
displayOverrideCode(schema, readableFields);
111-
}
108+
109+
displayOverrideCode(getOverrideCode(schema, readableFields));
112110
}
113111

114112
return (

src/ShowGuesser.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import PropTypes from 'prop-types';
33
import { Show, SimpleShowLayout, useResourceContext } from 'react-admin';
44
import { useParams } from 'react-router-dom';
55
import type { Field, Resource } from '@api-platform/api-doc-parser';
6+
67
import FieldGuesser from './FieldGuesser';
78
import Introspecter from './Introspecter';
89
import useMercureSubscription from './useMercureSubscription';
10+
import useDisplayOverrideCode from './useDisplayOverrideCode';
911
import type { IntrospectedShowGuesserProps, ShowGuesserProps } from './types';
1012

11-
const displayOverrideCode = (schema: Resource, fields: Field[]) => {
12-
if (process.env.NODE_ENV === 'production') return;
13-
13+
const getOverrideCode = (schema: Resource, fields: Field[]) => {
1414
let code =
1515
'If you want to override at least one field, paste this content in the <ShowGuesser> component of your resource:\n\n';
1616

@@ -25,8 +25,8 @@ const displayOverrideCode = (schema: Resource, fields: Field[]) => {
2525
code += `\n`;
2626
code += `And don't forget update your <ResourceGuesser> component:\n`;
2727
code += `<ResourceGuesser name={"${schema.name}"} show={${schema.title}Show} />`;
28-
// eslint-disable-next-line no-console
29-
console.info(code);
28+
29+
return code;
3030
};
3131

3232
export const IntrospectedShowGuesser = ({
@@ -42,12 +42,14 @@ export const IntrospectedShowGuesser = ({
4242
const id = decodeURIComponent(routeId ?? '');
4343
useMercureSubscription(props.resource, id);
4444

45+
const displayOverrideCode = useDisplayOverrideCode();
46+
4547
let fieldChildren = children;
4648
if (!fieldChildren) {
4749
fieldChildren = readableFields.map((field) => (
4850
<FieldGuesser key={field.name} source={field.name} />
4951
));
50-
displayOverrideCode(schema, readableFields);
52+
displayOverrideCode(getOverrideCode(schema, readableFields));
5153
}
5254

5355
return (

src/useDisplayOverrideCode.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useState } from 'react';
2+
3+
const useDisplayOverrideCode = () => {
4+
const [displayed, setDisplayed] = useState(false);
5+
6+
return (code: string) => {
7+
if (process.env.NODE_ENV === 'production') return;
8+
9+
if (!displayed) {
10+
// eslint-disable-next-line no-console
11+
console.info(code);
12+
setDisplayed(true);
13+
}
14+
};
15+
};
16+
17+
export default useDisplayOverrideCode;

0 commit comments

Comments
 (0)