"use client"
import { useDispatch } from "react-redux"
import { setEmail, setPassword } from "@/actions/actions"
import { useState } from "react"
import RegisterService from "@/services/register"
export default function Signup() {
const dispatch = useDispatch()
const [userEmail, setUserEmail] = useState("")
const [userPassword, setUserPassword] = useState("")
const saveEmail = (e:any) => {
e.preventDefault()
const data = e.target.value
setUserEmail(data)
}
const savePassword = (e:any) => {
e.preventDefault()
const data = e.target.value
setUserPassword(data)
}
const submitData = (e: any) => {
e.preventDefault()
dispatch(setEmail(userEmail))
dispatch(setPassword(userPassword))
RegisterService()
}
return (
<div>
<h2>CREATE ACOUNT</h2>
<form onSubmit={submitData}>
<input type="text" placeholder="email" value={userEmail} required onChange={saveEmail}/>
<input type="password" placeholder="password" value={userPassword} required onChange={savePassword}/>
<button>Create</button>
</form>
</div>
)
}
Register Service :
"use client"
import { createUserWithEmailAndPassword } from "firebase/auth";
import {auth} from '../firebase/firebase'
import {useSelector} from "react-redux";
const RegisterService = () => {
const email = useSelector(state => state.email)
const password = useSelector(state => state.password)
createUserWithEmailAndPassword(auth, email, password)
.then((userCredential) => {
// Signed in
const user = userCredential.user;
})
.catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
// ..
});
}
export default RegisterService
RegisterService?<RegisterService ...> или React.createElement(RegisterService, ...) . use - useRegisterService(отсутствие префикса не приведёт к ошибке, но это стандарт).
"use client"
import { useDispatch } from "react-redux"
import { setEmail, setPassword } from "@/actions/actions"
import { useState } from "react"
import RegisterService from "@/services/register"
export default function Signup() {
const dispatch = useDispatch()
const [userEmail, setUserEmail] = useState("")
const [userPassword, setUserPassword] = useState("")
const saveEmail = (e:any) => {
e.preventDefault()
const data = e.target.value
setUserEmail(data)
}
const savePassword = (e:any) => {
e.preventDefault()
const data = e.target.value
setUserPassword(data)
}
const submitData = (e: any) => {
e.preventDefault()
dispatch(setEmail(userEmail))
dispatch(setPassword(userPassword))
RegisterService()
}
return (
<div>
<h2>CREATE ACOUNT</h2>
<form onSubmit={submitData}>
<input type="text" placeholder="email" value={userEmail} required onChange={saveEmail}/>
<input type="password" placeholder="password" value={userPassword} required onChange={savePassword}/>
<button>Create</button>
</form>
</div>
)
}
Вызываю так
Page Login:
"use client"
import Image from 'next/image'
import googleImg from '../../assets/images/icons/google.png'
import styles from './login.module.scss'
import authWithGoogle from '../../services/authWithGoogle'
export default function Login () {
return (
<div className={styles.login}>
<div className={styles.login__container}>
<h1 className={styles.login__text}>LOGIN IN TO YOUR ACCOUNT</h1>
<div className={styles.login__block}>
<div className={styles.google__login__block}>
<button className={styles.google__login__button} onClick={authWithGoogle}>
<Image src={googleImg} alt="login google icon" width={30} quality={100} placeholder='blur'/>
Google</button>
</div>
</div>
</div>
</div>
)
}
Login Service:
import { signInWithPopup, GoogleAuthProvider } from "firebase/auth";
import {auth} from '../firebase/firebase'
const loginService = () => {
const provider = new GoogleAuthProvider();
signInWithPopup(auth, provider)
.then((result) => {
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
const user = result.user;
}).catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
const email = error.customData.email;
const credential = GoogleAuthProvider.credentialFromError(error);
});
}
export default loginService
use<some>), а потому может вызываться когда хочешь.// отрисовка компонента внутри React
globalCurrentState = globalCurrentStateMap.get(Component);
globalCurrentStateIndex = 0
Component(...arguments)
globalCurrentState = null
globalCurrentStateIndex = null
// хук useState
function useState(stateValue) {
// увеличиваем индекс хука относительно компонента на единицу
globalCurrentStateIndex++;
// получаем массив state для текущего вызова useState
let stateArray = globalCurrentState[globalCurrentStateIndex];
if (stateArray) { // если уже есть - просто возвращаем
return stateArray;
} else { // иначе
// создаём setValue
function setValue(newValue) {
stateArray[0] = newValue;
}
// создаём массим state
stateArray = [stateValue, setValue];
// записываем в глобальную переменную
globalCurrentState[globalCurrentStateIndex] = stateArray;
// отдаём
return stateArray;
}
}submitData будет вызван - все глобальные переменные уже десять раз будут переопределены другими компонентами.use<some>), то и сама функция становится хуком и не может работать вне корня компонента.
useSelector. useSelector снаружи и передавать в RegisterService уже полученные параметры. Либо вытащить глобальный redux и брать значения из него без всяких хуков.
const Component = (props) => {
useBrain(); // ok
const justHere = () => {
useBrain()
}
justHere() // ~ok
setTimeout((() => {
useBrain() // not ok
}, 1)
return <div onClick="justHere //not ok">...</div>
}
const Component = () => {
const useJustHere = () => {
useBrain()
}
useJustHere() // ~ok
return ...
}const useJustHere = () => {
useBrain()
}
const Component = () => {
useJustHere() // ok
return ...
}const Component = (props) => {
if(condition) {
useBrain(); // not ok
}
return ...
} т.к. condition может поменяться, а хуки всегда дожны бть вызваны по порядку, а то реакт не поймёт где какой хук.
То что делать так не-надо другой вопрос(потому и ~)., такая запись не сказал бы что хорошая)