Skip to content

Commit 4da7130

Browse files
next.js app changes
1 parent dc78397 commit 4da7130

File tree

5 files changed

+77
-28
lines changed

5 files changed

+77
-28
lines changed

packages/devextreme-cli/src/applications/application.nextjs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const create = async(appName, options) => {
7979
'--src-dir',
8080
'--app',
8181
'--no-turbopack',
82+
'--no-react-compiler',
8283
'--import-alias "@/*"',
8384
];
8485

packages/devextreme-cli/src/templates/nextjs/application/src/components/change-password-form/ChangePasswordForm.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
'use client'
2-
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useRef, useCallback } from 'react';
2+
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useCallback } from 'react';
33
import { useRouter } from 'next/navigation';
44
import Form, {
55
Item,
66
Label,
77
ButtonItem,
88
ButtonOptions,
99
RequiredRule,
10-
CustomRule,
10+
CustomRule,<%=#isTypeScript%>
11+
type FormTypes,<%=/isTypeScript%>
1112
} from 'devextreme-react/form';
1213
import LoadIndicator from 'devextreme-react/load-indicator';
1314
import notify from 'devextreme/ui/notify';
@@ -17,11 +18,22 @@ import { changePassword } from '@/app/actions/auth';
1718
export default function ChangePasswordForm() {
1819
const router = useRouter();
1920
const [loading, setLoading] = useState(false);
20-
const formData = useRef({ password: '' });
21+
const [formData, setFormData] = useState({ password: '' });
22+
23+
const onFieldDataChanged = useCallback((e<%=#isTypeScript%>: FormTypes.FieldDataChangedEvent<%=/isTypeScript%>) => {
24+
const { dataField, value } = e;
25+
26+
if (dataField) {
27+
setFormData(formData => ({
28+
...formData,
29+
[dataField]: value,
30+
}));
31+
}
32+
}, []);
2133

2234
const onSubmit = useCallback(async (e<%=#isTypeScript%>: React.FormEvent<HTMLFormElement><%=/isTypeScript%>) => {
2335
e.preventDefault();
24-
const { password } = formData.current;
36+
const { password } = formData;
2537
setLoading(true);
2638

2739
const result = await changePassword(password);
@@ -32,16 +44,16 @@ export default function ChangePasswordForm() {
3244
} else {
3345
notify(result.message, 'error', 2000);
3446
}
35-
}, [router]);
47+
}, [router, formData]);
3648

3749
const confirmPassword = useCallback(
38-
({ value }<%=#isTypeScript%>: ValidationCallbackData<%=/isTypeScript%>) => value === formData.current.password,
39-
[]
50+
({ value }<%=#isTypeScript%>: ValidationCallbackData<%=/isTypeScript%>) => value === formData.password,
51+
[formData]
4052
);
4153

4254
return (
4355
<form onSubmit={onSubmit}>
44-
<Form formData={formData.current} disabled={loading}>
56+
<Form formData={formData} disabled={loading} onFieldDataChanged={onFieldDataChanged}>
4557
<Item
4658
dataField={'password'}
4759
editorType={'dxTextBox'}

packages/devextreme-cli/src/templates/nextjs/application/src/components/create-account-form/CreateAccountForm.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use client'
2-
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useRef, useCallback } from 'react';
2+
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useCallback } from 'react';
33
import { useRouter } from 'next/navigation';
44
import Link from 'next/link';
55
import Form, {
@@ -9,7 +9,8 @@ import Form, {
99
ButtonOptions,
1010
RequiredRule,
1111
CustomRule,
12-
EmailRule
12+
EmailRule,<%=#isTypeScript%>
13+
type FormTypes,<%=/isTypeScript%>
1314
} from 'devextreme-react/form';
1415
import notify from 'devextreme/ui/notify';
1516
import LoadIndicator from 'devextreme-react/load-indicator';
@@ -20,11 +21,22 @@ import './CreateAccountForm.scss';
2021
export default function CreateAccountForm() {
2122
const router = useRouter();
2223
const [loading, setLoading] = useState(false);
23-
const formData = useRef({ email: '', password: '' });
24+
const [formData, setFormData] = useState({ email: '', password: '' });
25+
26+
const onFieldDataChanged = useCallback((e<%=#isTypeScript%>: FormTypes.FieldDataChangedEvent<%=/isTypeScript%>) => {
27+
const { dataField, value } = e;
28+
29+
if (dataField) {
30+
setFormData(formData => ({
31+
...formData,
32+
[dataField]: value,
33+
}));
34+
}
35+
}, []);
2436

2537
const onSubmit = useCallback(async (e<%=#isTypeScript%>: React.FormEvent<HTMLFormElement><%=/isTypeScript%>) => {
2638
e.preventDefault();
27-
const { email, password } = formData.current;
39+
const { email, password } = formData;
2840
setLoading(true);
2941

3042
const result = await signUp(email, password);
@@ -35,16 +47,16 @@ export default function CreateAccountForm() {
3547
} else {
3648
notify(result.message, 'error', 2000);
3749
}
38-
}, [router]);
50+
}, [router, formData]);
3951

4052
const confirmPassword = useCallback(
41-
({ value }<%=#isTypeScript%>: ValidationCallbackData<%=/isTypeScript%>) => value === formData.current.password,
42-
[]
53+
({ value }<%=#isTypeScript%>: ValidationCallbackData<%=/isTypeScript%>) => value === formData.password,
54+
[formData]
4355
);
4456

4557
return (
4658
<form className={'create-account-form'} onSubmit={onSubmit}>
47-
<Form formData={formData.current} disabled={loading}>
59+
<Form formData={formData} disabled={loading} onFieldDataChanged={onFieldDataChanged}>
4860
<Item
4961
dataField={'email'}
5062
editorType={'dxTextBox'}

packages/devextreme-cli/src/templates/nextjs/application/src/components/login-form/LoginForm.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use client'
2-
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useRef, useCallback } from 'react';
2+
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useCallback } from 'react';
33
import { useRouter } from 'next/navigation';
44
import Link from 'next/link';
55
import Form, {
@@ -8,7 +8,8 @@ import Form, {
88
ButtonItem,
99
ButtonOptions,
1010
RequiredRule,
11-
EmailRule
11+
EmailRule,<%=#isTypeScript%>
12+
type FormTypes,<%=/isTypeScript%>
1213
} from 'devextreme-react/form';
1314
import LoadIndicator from 'devextreme-react/load-indicator';
1415
import Button from 'devextreme-react/button';
@@ -20,11 +21,22 @@ import './LoginForm.scss';
2021
export default function LoginForm() {
2122
const router = useRouter();
2223
const [loading, setLoading] = useState(false);
23-
const formData = useRef({ email: '', password: '' });
24+
const [formData, setFormData] = useState({ email: '', password: '' });
25+
26+
const onFieldDataChanged = useCallback((e<%=#isTypeScript%>: FormTypes.FieldDataChangedEvent<%=/isTypeScript%>) => {
27+
const { dataField, value } = e;
28+
29+
if (dataField) {
30+
setFormData(formData => ({
31+
...formData,
32+
[dataField]: value,
33+
}));
34+
}
35+
}, []);
2436

2537
const onSubmit = useCallback(async (e<%=#isTypeScript%>: React.FormEvent<HTMLFormElement><%=/isTypeScript%>) => {
2638
e.preventDefault();
27-
const { email, password } = formData.current;
39+
const { email, password } = formData;
2840
setLoading(true);
2941

3042
const result = await signIn(email, password);
@@ -34,15 +46,15 @@ export default function LoginForm() {
3446
} else {
3547
router.push('/');
3648
}
37-
}, [router]);
49+
}, [router, formData]);
3850

3951
const onCreateAccountClick = useCallback(() => {
4052
router.push('/auth/create-account');
4153
}, [router]);
4254

4355
return (
4456
<form className={'login-form'} onSubmit={onSubmit}>
45-
<Form formData={formData.current} disabled={loading}>
57+
<Form formData={formData} disabled={loading} onFieldDataChanged={onFieldDataChanged}>
4658
<Item
4759
dataField={'email'}
4860
editorType={'dxTextBox'}

packages/devextreme-cli/src/templates/nextjs/application/src/components/reset-password-form/ResetPasswordForm.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use client'
2-
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useRef, useCallback } from 'react';
2+
import <%=#isTypeScript%>React, <%=/isTypeScript%>{ useState, useCallback } from 'react';
33
import { useRouter } from 'next/navigation';
44
import Link from 'next/link';
55
import Form, {
@@ -8,7 +8,8 @@ import Form, {
88
ButtonItem,
99
ButtonOptions,
1010
RequiredRule,
11-
EmailRule
11+
EmailRule,<%=#isTypeScript%>
12+
type FormTypes,<%=/isTypeScript%>
1213
} from 'devextreme-react/form';
1314
import LoadIndicator from 'devextreme-react/load-indicator';
1415
import notify from 'devextreme/ui/notify';
@@ -20,11 +21,22 @@ const notificationText = 'We\'ve sent a link to reset your password. Check your
2021
export default function ResetPasswordForm() {
2122
const router = useRouter();
2223
const [loading, setLoading] = useState(false);
23-
const formData = useRef({ email: '', password: '' });
24+
const [formData, setFormData] = useState({ email: '', password: '' });
25+
26+
const onFieldDataChanged = useCallback((e<%=#isTypeScript%>: FormTypes.FieldDataChangedEvent<%=/isTypeScript%>) => {
27+
const { dataField, value } = e;
28+
29+
if (dataField) {
30+
setFormData(formData => ({
31+
...formData,
32+
[dataField]: value,
33+
}));
34+
}
35+
}, []);
2436

2537
const onSubmit = useCallback(async (e<%=#isTypeScript%>: React.FormEvent<HTMLFormElement><%=/isTypeScript%>) => {
2638
e.preventDefault();
27-
const { email } = formData.current;
39+
const { email } = formData;
2840
setLoading(true);
2941

3042
const result = await resetPassword(email);
@@ -36,11 +48,11 @@ export default function ResetPasswordForm() {
3648
} else {
3749
notify(result.message, 'error', 2000);
3850
}
39-
}, [router]);
51+
}, [router, formData]);
4052

4153
return (
4254
<form className={'reset-password-form'} onSubmit={onSubmit}>
43-
<Form formData={formData.current} disabled={loading}>
55+
<Form formData={formData} disabled={loading} onFieldDataChanged={onFieldDataChanged}>
4456
<Item
4557
dataField={'email'}
4658
editorType={'dxTextBox'}

0 commit comments

Comments
 (0)