mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-07-01 18:52:20 +08:00
* refactor: update umi version 3.x to version 4.x
* refactor: update react-router-dom version to 6.x
* refactor(react-router-dom): change Layout Component `props.children` to `<Outlet />`
* refactor(react-router-dom): change <Route /> props and <RouteSwitch /> correct
* refactor(react-router-dom): replace `<Redirect />` to `<Navigate replace />`
* refactor(react-router-dom): replace `useHistory` to `useNavigate`
* refactor(react-router-dom): replace `useRouteMatch` to `useParams`
* refactor(react-router-dom & dumi): fix <RouteSwitch /> & umi document bug
* refactor(react-router-dom): `useRoutes` Optimize `<RouteSwitch />` code
* refactor(react-router-dom): update `Route` types and docs
* refactor(react-router-dom): optimize RouteSwitch code
* refactor(react-router-dom): `useLocation` no generics type
* refactor(react-router-dom): add `less v3.9.0` to `resolutions` to solve the error of `gulp-less`
* refactor(react-router-dom): fix `<RouteSwitch />` `props.routes` as an array is not handled
* chore: upgrade `dumi` and refactor docs
* fix: completed code review, add `targets` to solve browser compatibility & removed `chainWebpack`
* refactor(dumi): upgraded dumi under `packages/core/client`
* refactor(dumi): delete `packages/core/dumi-theme-nocobase`
* refactor(dumi): degrade `react` & replace `dumi-theme-antd` to `dumi-theme-nocobase`
* refactor(dumi): solve conflicts between multiple dumi applications
* fix: login page error in react 17
* refactor(dumi): remove less resolutions
* refactor(dumi): umi add `msfu: true` config
* fix: merge bug
* fix: self code review
* fix: code reivew and test bug
* refactor: upgrade react to 18
* refactor: degrade react types to 17
* chore: fix ci error
* fix: support routerBase & fix workflow page params
* fix(doc): menu externel link
* fix: build error
* fix: delete
* fix: vitest error
* fix: react-router new code replace
* fix: vitest markdown error
* fix: title is none when refresh
* fix: merge error
* fix: sidebar width is wrong
* fix: useProps error
* fix: side-menu-width
* fix: menu selectId is wrong & useProps is string
* fix: menu selected first default & side menu hide when change
* fix: test error & v0.10 change log
* fix: new compnent doc modify
* fix: set umi `fastRefresh=false`
* refactor: application v2
* fix: improve code
* fix: bug
* fix: page = 0 error
* fix: workflow navigate error
* feat: plugin manager
* fix: afterAdd
* feat: update docs
* feat: update docs
* fix: page tab change not work
* fix: login redirect query param doesn't work
* fix: bug and doc
* feat: update docs
* fix: ci error
* fix: merge main
* feat: update docs
* feat: update docs
* feat: update docs
* chore(versions): 😊 publish v0.10.0-alpha.1
* fix: translations
* chore: backend node test max old space size
* docs: add useSearchParams
---------
Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: ChengLei Shao <chareice@live.com>
160 lines
4.2 KiB
TypeScript
160 lines
4.2 KiB
TypeScript
import { ISchema, useForm } from '@formily/react';
|
|
import { uid } from '@formily/shared';
|
|
import { message } from 'antd';
|
|
import React from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { Navigate, useNavigate } from 'react-router-dom';
|
|
import { SchemaComponent, useAPIClient, useCurrentDocumentTitle, useSystemSettings } from '..';
|
|
import VerificationCode from './VerificationCode';
|
|
|
|
const signupPageSchema: ISchema = {
|
|
type: 'object',
|
|
name: uid(),
|
|
'x-component': 'FormV2',
|
|
properties: {
|
|
email: {
|
|
type: 'string',
|
|
required: true,
|
|
'x-component': 'Input',
|
|
'x-validator': 'email',
|
|
'x-decorator': 'FormItem',
|
|
'x-component-props': { placeholder: '{{t("Email")}}', style: {} },
|
|
},
|
|
phone: {
|
|
type: 'string',
|
|
required: true,
|
|
'x-component': 'Input',
|
|
'x-validator': 'phone',
|
|
'x-decorator': 'FormItem',
|
|
'x-component-props': { placeholder: '{{t("Phone")}}', style: {} },
|
|
'x-visible': '{{smsAuthEnabled}}',
|
|
},
|
|
code: {
|
|
type: 'string',
|
|
required: true,
|
|
'x-component': 'VerificationCode',
|
|
'x-component-props': {
|
|
actionType: 'users:signup',
|
|
targetFieldName: 'phone',
|
|
},
|
|
'x-decorator': 'FormItem',
|
|
'x-visible': '{{smsAuthEnabled}}',
|
|
},
|
|
password: {
|
|
type: 'string',
|
|
required: true,
|
|
'x-component': 'Password',
|
|
'x-decorator': 'FormItem',
|
|
'x-component-props': { placeholder: '{{t("Password")}}', checkStrength: true, style: {} },
|
|
'x-reactions': [
|
|
{
|
|
dependencies: ['.confirm_password'],
|
|
fulfill: {
|
|
state: {
|
|
selfErrors: '{{$deps[0] && $self.value && $self.value !== $deps[0] ? t("Password mismatch") : ""}}',
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
confirm_password: {
|
|
type: 'string',
|
|
required: true,
|
|
'x-component': 'Password',
|
|
'x-decorator': 'FormItem',
|
|
'x-component-props': { placeholder: '{{t("Confirm password")}}', style: {} },
|
|
'x-reactions': [
|
|
{
|
|
dependencies: ['.password'],
|
|
fulfill: {
|
|
state: {
|
|
selfErrors: '{{$deps[0] && $self.value && $self.value !== $deps[0] ? t("Password mismatch") : ""}}',
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
actions: {
|
|
type: 'void',
|
|
'x-component': 'div',
|
|
properties: {
|
|
submit: {
|
|
title: '{{t("Sign up")}}',
|
|
type: 'void',
|
|
'x-component': 'Action',
|
|
'x-component-props': {
|
|
block: true,
|
|
type: 'primary',
|
|
htmlType: 'submit',
|
|
useAction: '{{ useSignup }}',
|
|
style: { width: '100%' },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
link: {
|
|
type: 'void',
|
|
'x-component': 'div',
|
|
properties: {
|
|
link: {
|
|
type: 'void',
|
|
'x-component': 'Link',
|
|
'x-component-props': { to: '/signin' },
|
|
'x-content': '{{t("Log in with an existing account")}}',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
export interface UseSignupProps {
|
|
message?: {
|
|
success?: string;
|
|
};
|
|
}
|
|
|
|
export const useSignup = (props?: UseSignupProps) => {
|
|
const navigate = useNavigate();
|
|
const form = useForm();
|
|
const api = useAPIClient();
|
|
const { t } = useTranslation();
|
|
return {
|
|
async run() {
|
|
await form.submit();
|
|
await api.resource('users').signup({
|
|
values: form.values,
|
|
});
|
|
message.success(props?.message?.success || t('Sign up successfully, and automatically jump to the sign in page'));
|
|
setTimeout(() => {
|
|
navigate('/signin');
|
|
}, 2000);
|
|
},
|
|
};
|
|
};
|
|
|
|
export interface SignupPageProps {
|
|
schema?: ISchema;
|
|
components?: any;
|
|
scope?: any;
|
|
}
|
|
|
|
export const SignupPage = (props: SignupPageProps) => {
|
|
useCurrentDocumentTitle('Signup');
|
|
const ctx = useSystemSettings();
|
|
const { allowSignUp, smsAuthEnabled } = ctx?.data?.data || {};
|
|
if (!allowSignUp) {
|
|
return <Navigate replace to={'/signin'} />;
|
|
}
|
|
const { schema, components, scope } = props;
|
|
return (
|
|
<SchemaComponent
|
|
schema={schema || signupPageSchema}
|
|
components={{
|
|
VerificationCode,
|
|
...components,
|
|
}}
|
|
scope={{ useSignup, smsAuthEnabled, ...scope }}
|
|
/>
|
|
);
|
|
};
|