From be0c61a0280c7bc2cf2b3920f9c5305dd4621fea Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Tue, 25 Feb 2025 23:07:37 +0000 Subject: [PATCH] added recovery ui --- packages/app/src/components/Login/index.jsx | 896 +++++++++--------- .../src/pages/auth/forms/recovery/index.jsx | 149 +++ .../src/pages/auth/forms/register/index.jsx | 325 +++---- .../src/pages/auth/forms/selector/index.jsx | 103 +- packages/app/src/pages/auth/index.jsx | 122 +-- .../app/src/pages/password-recovery/index.jsx | 11 - .../src/pages/password-recovery/index.less | 3 - 7 files changed, 880 insertions(+), 729 deletions(-) create mode 100644 packages/app/src/pages/auth/forms/recovery/index.jsx delete mode 100644 packages/app/src/pages/password-recovery/index.jsx delete mode 100644 packages/app/src/pages/password-recovery/index.less diff --git a/packages/app/src/components/Login/index.jsx b/packages/app/src/components/Login/index.jsx index ea5950ae..0c954fa4 100755 --- a/packages/app/src/components/Login/index.jsx +++ b/packages/app/src/components/Login/index.jsx @@ -9,452 +9,480 @@ import config from "@config" import "./index.less" const stepsOnError = { - username: "This username or email is not exist", - password: "Password is incorrect", + username: "This username or email is not exist", + password: "Password is incorrect", } const stepsValidations = { - username: async (state) => { - const check = await AuthModel.usernameValidation(state.username).catch((err) => { - return { - exists: false - } - }) + username: async (state) => { + const check = await AuthModel.usernameValidation(state.username).catch( + (err) => { + return { + exists: false, + } + }, + ) - return check.exists - }, + return check.exists + }, } const phasesToSteps = { - 0: "username", - 1: "password", + 0: "username", + 1: "password", } class Login extends React.Component { - static pageStatement = { - bottomBarAllowed: false - } - - state = { - loading: false, - loginInputs: {}, - error: null, - phase: 0, - - mfa_required: null, - activation: null, - forbidden: false, - } - - formRef = React.createRef() - - handleFinish = async () => { - this.setState({ - mfa_required: false, - }) - - const payload = { - username: this.state.loginInputs.username, - password: this.state.loginInputs.password, - mfa_code: this.state.loginInputs.mfa_code, - } - - this.clearError() - this.toggleLoading(true) - - await AuthModel.login(payload, this.onDone).catch((error) => { - if (error.response.data) { - if (error.response.data.violation) { - return this.setState({ - forbidden: error.response.data.violation - }) - } - - if (error.response.data.activation_required) { - return this.setState({ - activation: { - required: true, - user_id: error.response.data.user_id, - }, - }) - } - } - - console.error(error, error.response) - - this.toggleLoading(false) - this.onError(error.response.data.error) - - return false - }) - } - - onDone = async ({ mfa_required } = {}) => { - if (mfa_required) { - this.setState({ - loading: false, - mfa_required: mfa_required, - }) - - return false - } - - if (typeof this.props.close === "function") { - await this.props.close({ - unlock: true - }) - } - - if (typeof this.props.onDone === "function") { - await this.props.onDone() - } - - return true - } - - onClickActivateAccount = async () => { - const activationObj = this.state.activation - - if (!activationObj) { - return null - } - - try { - await AuthModel.activateAccount( - this.state.activation.user_id, - this.state.activation.code - ) - - this.handleFinish() - } catch (error) { - this.setState({ - activation: { - ...this.state.activation, - error: error - } - }) - - console.error(error) - } - } - - onClickResendActivationCode = async () => { - const activationObj = this.state.activation - - if (!activationObj) { - return null - } - - const rensendObj = await AuthModel.resendActivationCode(activationObj.user_id) - .catch((error) => { - app.message.info(`Please try again later...`) - return null - }) - - if (rensendObj) { - this.setState({ - activation: { - ...this.state.activation, - resended: rensendObj.date, - }, - }) - } - } - - onClickForgotPassword = () => { - if (this.props.locked) { - this.props.unlock() - } - - if (typeof this.props.close === "function") { - this.props.close() - } - - app.location.push("/apr") - } - - toggleLoading = (to) => { - if (typeof to === "undefined") { - to = !this.state.loading - } - - this.setState({ - loading: to - }) - } - - clearError = () => { - this.setState({ - error: null - }) - } - - onError = (error) => { - this.setState({ - error: error - }) - } - - onUpdateInput = (input, value) => { - if (input === "username") { - value = value.toLowerCase() - value = value.trim() - } - - // remove error from ref - this.formRef.current.setFields([ - { - name: input, - errors: [] - } - ]) - - this.setState({ - loginInputs: { - ...this.state.loginInputs, - [input]: value - } - }) - } - - nextStep = async () => { - const phase = phasesToSteps[this.state.phase] - - if (typeof stepsValidations[phase] === "function") { - this.toggleLoading(true) - - const result = await stepsValidations[phase](this.state.loginInputs) - - this.toggleLoading(false) - - if (!result) { - this.formRef.current.setFields([ - { - name: phase, - errors: [stepsOnError[phase]] - }, - ]) - - return false - } - } - - const to = this.state.phase + 1 - - if (!phasesToSteps[to]) { - return this.handleFinish() - } - - this.setState({ - phase: to - }) - } - - prevStep = () => { - const to = this.state.phase - 1 - - if (!phasesToSteps[to]) { - console.warn("No step found for phase", to) - - return - } - - this.setState({ - phase: to, - mfa_required: null, - }) - } - - canNext = () => { - if (this.state.loading) { - return false - } - - const { phase } = this.state - - const step = phasesToSteps[phase] - - return !!this.state.loginInputs[step] - } - - render() { - if (this.state.forbidden) { - return
-
-

Access denied

-

Your account has been disabled due a violation to our terms of service

- -

Here is a detailed description of the violation

- -
- {this.state.forbidden.reason} -
- -

If you think this is an error, or you want to apeel this decision please contact our support

-
-
- } - - if (this.state.activation) { - return
-
-

Activate your Account

-

We have sent you an email with a code that you need to enter below in order to activate your account.

- - this.setState({ - activation: { - ...this.state.activation, - code: code, - } - })} - /> - -
- { - this.state.activation.resended && - } - - Didn't receive the email? - -
- - { - this.state.activation.error &&
- {this.state.activation.error.response.data.error} -
- } - - - Activate - -
-
- } - - return
-
-
-

- Sign in -

-

- To continue to {config.app.siteName} -

-
- - - - Username or Email - this.onUpdateInput("username", e.target.value)} - onPressEnter={this.nextStep} - disabled={this.state.phase !== 0} - autoFocus - /> - - - - Password - this.onUpdateInput("password", e.target.value)} - onPressEnter={this.nextStep} - /> - - - - Verification Code - - { - this.state.mfa_required && <> -

We send a verification code to [{this.state.mfa_required.sended_to}]

- -

- Didn't receive the code? Resend -

- - } - - str.toUpperCase()} - onChange={(code) => this.onUpdateInput("mfa_code", code)} - onPressEnter={this.nextStep} - /> -
-
- -
- { - this.state.phase > 0 && - Back - - } - - Continue - -
- - { - this.state.error &&
- {this.state.error} -
- } - -
- Forgot your password? -
-
-
- } + static pageStatement = { + bottomBarAllowed: false, + } + + state = { + loading: false, + loginInputs: {}, + error: null, + phase: 0, + + mfa_required: null, + activation: null, + forbidden: false, + } + + formRef = React.createRef() + + handleFinish = async () => { + this.setState({ + mfa_required: false, + }) + + const payload = { + username: this.state.loginInputs.username, + password: this.state.loginInputs.password, + mfa_code: this.state.loginInputs.mfa_code, + } + + this.clearError() + this.toggleLoading(true) + + await AuthModel.login(payload, this.onDone).catch((error) => { + if (error.response.data) { + if (error.response.data.violation) { + return this.setState({ + forbidden: error.response.data.violation, + }) + } + + if (error.response.data.activation_required) { + return this.setState({ + activation: { + required: true, + user_id: error.response.data.user_id, + }, + }) + } + } + + console.error(error, error.response) + + this.toggleLoading(false) + this.onError(error.response.data.error) + + return false + }) + } + + onDone = async ({ mfa_required } = {}) => { + if (mfa_required) { + this.setState({ + loading: false, + mfa_required: mfa_required, + }) + + return false + } + + if (typeof this.props.close === "function") { + await this.props.close({ + unlock: true, + }) + } + + if (typeof this.props.onDone === "function") { + await this.props.onDone() + } + + return true + } + + onClickActivateAccount = async () => { + const activationObj = this.state.activation + + if (!activationObj) { + return null + } + + try { + await AuthModel.activateAccount( + this.state.activation.user_id, + this.state.activation.code, + ) + + this.handleFinish() + } catch (error) { + this.setState({ + activation: { + ...this.state.activation, + error: error, + }, + }) + + console.error(error) + } + } + + onClickResendActivationCode = async () => { + const activationObj = this.state.activation + + if (!activationObj) { + return null + } + + const rensendObj = await AuthModel.resendActivationCode( + activationObj.user_id, + ).catch((error) => { + app.message.info(`Please try again later...`) + return null + }) + + if (rensendObj) { + this.setState({ + activation: { + ...this.state.activation, + resended: rensendObj.date, + }, + }) + } + } + + onClickForgotPassword = () => { + if (this.props.locked) { + this.props.unlock() + } + + if (typeof this.props.close === "function") { + this.props.close() + } + + app.location.push("/auth?key=recover") + } + + toggleLoading = (to) => { + if (typeof to === "undefined") { + to = !this.state.loading + } + + this.setState({ + loading: to, + }) + } + + clearError = () => { + this.setState({ + error: null, + }) + } + + onError = (error) => { + this.setState({ + error: error, + }) + } + + onUpdateInput = (input, value) => { + if (input === "username") { + value = value.toLowerCase() + value = value.trim() + } + + // remove error from ref + this.formRef.current.setFields([ + { + name: input, + errors: [], + }, + ]) + + this.setState({ + loginInputs: { + ...this.state.loginInputs, + [input]: value, + }, + }) + } + + nextStep = async () => { + const phase = phasesToSteps[this.state.phase] + + if (typeof stepsValidations[phase] === "function") { + this.toggleLoading(true) + + const result = await stepsValidations[phase](this.state.loginInputs) + + this.toggleLoading(false) + + if (!result) { + this.formRef.current.setFields([ + { + name: phase, + errors: [stepsOnError[phase]], + }, + ]) + + return false + } + } + + const to = this.state.phase + 1 + + if (!phasesToSteps[to]) { + return this.handleFinish() + } + + this.setState({ + phase: to, + }) + } + + prevStep = () => { + const to = this.state.phase - 1 + + if (!phasesToSteps[to]) { + console.warn("No step found for phase", to) + + return + } + + this.setState({ + phase: to, + mfa_required: null, + }) + } + + canNext = () => { + if (this.state.loading) { + return false + } + + const { phase } = this.state + + const step = phasesToSteps[phase] + + return !!this.state.loginInputs[step] + } + + render() { + if (this.state.forbidden) { + return ( +
+
+

Access denied

+

+ Your account has been disabled due a violation to + our terms of service +

+ +

Here is a detailed description of the violation

+ +
+ {this.state.forbidden.reason} +
+ +

+ If you think this is an error, or you want to apeel + this decision please contact our support +

+
+
+ ) + } + + if (this.state.activation) { + return ( +
+
+

Activate your Account

+

+ We have sent you an email with a code that you need + to enter below in order to activate your account. +

+ + + this.setState({ + activation: { + ...this.state.activation, + code: code, + }, + }) + } + /> + +
+ {this.state.activation.resended && ( + + )} + + Didn't receive the email? + +
+ + {this.state.activation.error && ( +
+ { + this.state.activation.error.response.data + .error + } +
+ )} + + + Activate + +
+
+ ) + } + + return ( +
+
+
+

Sign in

+

To continue to {config.app.siteName}

+
+ + + + + Username or Email + + + this.onUpdateInput( + "username", + e.target.value, + ) + } + onPressEnter={this.nextStep} + disabled={this.state.phase !== 0} + autoFocus + /> + + + + + Password + + + this.onUpdateInput( + "password", + e.target.value, + ) + } + onPressEnter={this.nextStep} + /> + + + + + Verification Code + + + {this.state.mfa_required && ( + <> +

+ We send a verification code to [ + {this.state.mfa_required.sended_to}] +

+ +

+ Didn't receive the code?{" "} + + Resend + +

+ + )} + + str.toUpperCase()} + onChange={(code) => + this.onUpdateInput("mfa_code", code) + } + onPressEnter={this.nextStep} + /> +
+
+ +
+ {this.state.phase > 0 && ( + + Back + + )} + + Continue + +
+ + {this.state.error && ( +
{this.state.error}
+ )} + +
+ Forgot your password? +
+
+
+ ) + } } const ForwardedLogin = (props) => { - return + return } -export default ForwardedLogin \ No newline at end of file +export default ForwardedLogin diff --git a/packages/app/src/pages/auth/forms/recovery/index.jsx b/packages/app/src/pages/auth/forms/recovery/index.jsx new file mode 100644 index 00000000..aaa6b4fb --- /dev/null +++ b/packages/app/src/pages/auth/forms/recovery/index.jsx @@ -0,0 +1,149 @@ +import React from "react" +import { Input } from "antd" + +import FormWithSteps from "@components/FormWithSteps" +import AuthModel from "@models/auth" + +const Steps = [ + { + id: "email_input", + render: ({ updateState, values }) => { + function onChangeInput(e) { + updateState("account", e.target.value) + } + + return ( + <> +

+ First enter your account or email address to find your + associated account. +

+ + + + ) + }, + validate: (values) => { + return values.account && values.account.length > 3 + }, + onNext: async ({ values, updateState, setError }) => { + try { + const recoverSession = await AuthModel.recoverPassword( + values.account, + ) + + updateState("recoverSession", recoverSession) + } catch (error) { + console.error(error.response.data) + setError(error.response.data.error) + + return { + cancel: true, + } + } + }, + }, + { + id: "new_password", + render: ({ updateState, values }) => { + return ( + <> +

Enter a new password for your account.

+ + + updateState("new_password", e.target.value) + } + autoFocus + /> + + ) + }, + validate: (values) => { + if (!values.new_password) { + return false + } + + return values.new_password.length >= 8 + }, + }, + { + id: "otp_input", + render: ({ updateState, values }) => { + return ( + <> +

+ We've sent you a code to your email [ + {values.recoverSession.email}] +

+

Expires in {values.recoverSession.expires_in} minutes

+ + updateState("otp", value)} + value={values.otp} + autoFocus + /> + + ) + }, + validate: (values) => { + if (!values.otp) { + return false + } + + return values.otp.length === values.recoverSession.code_length + }, + }, +] + +const OnFinish = async ({ values, setError }) => { + try { + const result = await AuthModel.changePassword({ + newPassword: values.new_password, + code: values.otp, + verificationToken: values.recoverSession.verificationToken, + }) + + app.message.info("Password changed successfully") + app.navigation.goAuth() + } catch (error) { + console.error(error) + setError(error.message) + + return { + cancel: true, + } + } +} + +const Header = () => { + return ( +
+

Account Recovery

+
+ ) +} + +const RecoveryPage = (props) => { + return ( + { + props.setActiveKey("selector") + }} + onFinish={OnFinish} + cancelable + /> + ) +} + +export default RecoveryPage diff --git a/packages/app/src/pages/auth/forms/register/index.jsx b/packages/app/src/pages/auth/forms/register/index.jsx index 7b3410b0..f4a42f14 100755 --- a/packages/app/src/pages/auth/forms/register/index.jsx +++ b/packages/app/src/pages/auth/forms/register/index.jsx @@ -13,202 +13,187 @@ import PasswordStep from "./steps/password" import EmailStep from "./steps/email" import TOSStep from "./steps/tos" -const steps = [ - UsernameStep, - PasswordStep, - EmailStep, - TOSStep, -] +const steps = [UsernameStep, PasswordStep, EmailStep, TOSStep] const RegisterForm = (props) => { - const [finishing, setFinishing] = React.useState(false) - const [finishError, setFinishError] = React.useState(false) - const [finishSuccess, setFinishSuccess] = React.useState(false) + const [finishing, setFinishing] = React.useState(false) + const [finishError, setFinishError] = React.useState(false) + const [finishSuccess, setFinishSuccess] = React.useState(false) - const [stepsValues, setStepsValues] = React.useState({}) - const [step, setStep] = React.useState(0) + const [stepsValues, setStepsValues] = React.useState({}) + const [step, setStep] = React.useState(0) - const currentStepData = steps[step - 1] + const currentStepData = steps[step - 1] - async function finish() { - setFinishError(null) - setFinishSuccess(false) - setFinishing(true) + async function finish() { + setFinishError(null) + setFinishSuccess(false) + setFinishing(true) - const result = await AuthModel.register({ - username: stepsValues.username, - password: stepsValues.password, - email: stepsValues.email, - tos: stepsValues.tos, - }).catch((err) => { - setFinishSuccess(false) - setFinishing(false) - setFinishError(err) - }) + const result = await AuthModel.register({ + username: stepsValues.username, + password: stepsValues.password, + email: stepsValues.email, + tos: stepsValues.tos, + }).catch((err) => { + setFinishSuccess(false) + setFinishing(false) + setFinishError(err) + }) - if (result) { - setFinishing(false) - setFinishSuccess(true) - } - } + if (result) { + setFinishing(false) + setFinishSuccess(true) + } + } - function nextStep(to) { - setStep((prev) => { - if (!to) { - to = prev + 1 - } + function nextStep(to) { + setStep((prev) => { + if (!to) { + to = prev + 1 + } - if (to === steps.length + 1) { - finish() - return prev - } + if (to === steps.length + 1) { + finish() + return prev + } - return to - }) - } + return to + }) + } - function prevStep() { - setStep((prev) => { - return prev - 1 - }) - } + function prevStep() { + setStep((prev) => { + return prev - 1 + }) + } - const updateStepValue = (value) => setStepsValues((prev) => { - return { - ...prev, - [currentStepData.key]: value - } - }) + const updateStepValue = (value) => + setStepsValues((prev) => { + return { + ...prev, + [currentStepData.key]: value, + } + }) - function canNextStep() { - if (!currentStepData) { - return true - } + function canNextStep() { + if (!currentStepData) { + return true + } - if (!currentStepData.required) { - return true - } + if (!currentStepData.required) { + return true + } - const currentStepValue = stepsValues[currentStepData.key] + const currentStepValue = stepsValues[currentStepData.key] - if (currentStepData.required) { - if (!currentStepValue) { - return false - } - } + if (currentStepData.required) { + if (!currentStepValue) { + return false + } + } - return true - } + return true + } - return
-
- { - !finishSuccess && !finishing && step === 0 && <> -

đź‘‹ Hi! Nice to meet you

-

Tell us some basic information to get started creating your account.

- - } + return ( +
+
+ {!finishSuccess && !finishing && step === 0 && ( + <> +

đź‘‹ Hi! Nice to meet you

+

+ Tell us some basic information to get started + creating your account. +

+ + )} - { - !finishSuccess && !finishing && step > 0 && <> -

- { - currentStepData?.icon && createIconRender(currentStepData.icon) - } + {!finishSuccess && !finishing && step > 0 && ( + <> +

+ {currentStepData?.icon && + createIconRender(currentStepData.icon)} - {currentStepData?.title} -

-

- { - typeof currentStepData?.description === "function" ? - currentStepData?.description() : currentStepData.description - } -

- - } -
+ {currentStepData?.title} + +

+ {typeof currentStepData?.description === "function" + ? currentStepData?.description() + : currentStepData.description} +

+ + )} +
- { - !finishSuccess && !finishing && step > 0 && React.createElement(currentStepData.content, { - onPressEnter: nextStep, - currentValue: stepsValues[currentStepData.key], - updateValue: updateStepValue, - }) - } + {!finishSuccess && + !finishing && + step > 0 && + React.createElement(currentStepData.content, { + onPressEnter: nextStep, + currentValue: stepsValues[currentStepData.key], + updateValue: updateStepValue, + })} - { - finishing &&
- -

- Creating your account -

-
- } + {finishing && ( +
+ +

Creating your account

+
+ )} - { - finishSuccess &&
- -

- Welcome abord! -

-

- One last step, we need you to login with your new account. -

+ {finishSuccess && ( +
+ +

Welcome abord!

+

+ One last step, we need you to login with your new + account. +

- props.changeStage(0)} - > - Go to login - -
- } + props.setActiveKey("selector")} + > + Go to login + +
+ )} - { - finishError && - } + {finishError && ( + + )} - { - !finishSuccess && !finishing &&
- { - step === 0 && - props.changeStage(0)} - > - Cancel - - } - { - step > 0 && - prevStep()} - > - Back - - } + {!finishSuccess && !finishing && ( +
+ {step === 0 && ( + props.setActiveKey("selector")} + > + Cancel + + )} + {step > 0 && ( + prevStep()}> + Back + + )} - nextStep()} - disabled={!canNextStep()} - > - { - step === steps.length ? "Finish" : "Next" - } - -
- } -
+ nextStep()} + disabled={!canNextStep()} + > + {step === steps.length ? "Finish" : "Next"} + +
+ )} +
+ ) } -export default RegisterForm \ No newline at end of file +export default RegisterForm diff --git a/packages/app/src/pages/auth/forms/selector/index.jsx b/packages/app/src/pages/auth/forms/selector/index.jsx index 3c09e0cc..a532af7f 100755 --- a/packages/app/src/pages/auth/forms/selector/index.jsx +++ b/packages/app/src/pages/auth/forms/selector/index.jsx @@ -4,62 +4,63 @@ import config from "@config" import { Icons } from "@components/Icons" const MainSelector = (props) => { - const { - onClickLogin, - onClickRegister, - } = props + return ( + <> +
+ +
- return <> -
- -
+
+ {app.userData && ( + { + app.navigation.goMain() + }} + > + {" "} + Continue as {app.userData.username} + + )} -
- { - app.userData && { - app.navigation.goMain() - }} - > - Continue as {app.userData.username} - - } + app.controls.openLoginForm()} + icon={} + type="primary" + > + Continue with a Comty™ Account + - } - type="primary" - > - Continue with a Comty™ Account - + app.controls.openLoginForm()} + icon={} + type="primary" + disabled + > + Continue with a RageStudio© ID™ + - } - type="primary" - disabled - > - Continue with a RageStudio© ID™ - +

Or create a new account

-

Or create a new account

+ props.setActiveKey("register")} + icon={} + type="primary" + > + Create a Comty™ Account + - } - type="primary" - > - Create a Comty™ Account - - -

- - Registering a new account accepts the app.location.push("/terms")}>Terms and Conditions and app.location.push("/privacy")}>Privacy policy for the services provided by {config.author} -

-
- + props.setActiveKey("recovery")}> + I need help to recover my account + +
+ + ) } -export default MainSelector \ No newline at end of file +export default MainSelector diff --git a/packages/app/src/pages/auth/index.jsx b/packages/app/src/pages/auth/index.jsx index 3e9bcc52..6efef997 100755 --- a/packages/app/src/pages/auth/index.jsx +++ b/packages/app/src/pages/auth/index.jsx @@ -1,80 +1,82 @@ import React from "react" import useRandomFeaturedWallpaperUrl from "@hooks/useRandomFeaturedWallpaperUrl" +import useUrlQueryActiveKey from "@hooks/useUrlQueryActiveKey" import RegisterForm from "./forms/register" import MainSelector from "./forms/selector" +import RecoveryForm from "./forms/recovery" import "./index.less" const GradientSVG = () => { - return - - - - - - - - - - - - - - - - - - + return ( + + + + + + + + + + + + + + + + + + + + ) } -const stagesToComponents = { - 0: MainSelector, - 2: RegisterForm +const keyToComponents = { + selector: MainSelector, + register: RegisterForm, + recovery: RecoveryForm, } const AuthPage = (props) => { - const [stage, setStage] = React.useState(0) - const randomWallpaperURL = useRandomFeaturedWallpaperUrl() + const [activeKey, setActiveKey] = useUrlQueryActiveKey({ + defaultKey: "selector", + }) + const randomWallpaperURL = useRandomFeaturedWallpaperUrl() - function changeStage(nextStage) { - setStage(nextStage) - } + return ( +
+
+ +
- const onClickLogin = () => { - app.controls.openLoginForm() - } +
+
- const onClickRegister = () => { - changeStage(2) - } - - return
-
- -
- -
-
- -
- { - React.createElement(stagesToComponents[stage] ?? stagesToComponents[0], { - onClickLogin, - onClickRegister, - changeStage, - }) - } -
-
-
+
+ {React.createElement( + keyToComponents[activeKey] ?? + keyToComponents["selector"], + { + setActiveKey: setActiveKey, + }, + )} +
+
+
+ ) } -export default AuthPage \ No newline at end of file +export default AuthPage diff --git a/packages/app/src/pages/password-recovery/index.jsx b/packages/app/src/pages/password-recovery/index.jsx deleted file mode 100644 index a4b2e967..00000000 --- a/packages/app/src/pages/password-recovery/index.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react" - -import "./index.less" - -const AccountPasswordRecovery = () => { - return
-

Account Password Recovery

-
-} - -export default AccountPasswordRecovery \ No newline at end of file diff --git a/packages/app/src/pages/password-recovery/index.less b/packages/app/src/pages/password-recovery/index.less deleted file mode 100644 index d850d946..00000000 --- a/packages/app/src/pages/password-recovery/index.less +++ /dev/null @@ -1,3 +0,0 @@ -.password_recover { - padding: 20px; -} \ No newline at end of file