lang-type은 영어버전으로 일단 진행한다.
react-toastify
사용
hook을 이용해 input 값을 관리하는 state를 정의하고 graphql로 서버로 api 호출하여 로그인 또는 회원가입이 되도록 진행한다.
passwordless login
// 📄 AuthQueries.js
export const LOCAL_LOG_IN = gql`
mutation logUserIn($token: String!) {
logUserIn(token: $token) @client
}
`;
...
// 📄 Apollo/LocalState.js
Mutation: {
logUserIn: (_, { token }, { cache }) => {
localStorage.setItem("token", token);
cache.writeData({
data: {
isLoggedIn: true,
},
});
return null;
},
logUserOut: (_, __, { cache }) => {
localStorage.removeItem("token");
window.location.reload();
return null;
},
},
useMutation
react-apollo-hooks
에 useMutation을 이용하여 mutation resolver를 호출할 수 있다.
import { useMutation } from 'apollo-react-hooks';
import gql from 'apollo-boost';
const LOG_IN = gql`
mutation requestSecret($email: String!) {
requestSecret(email: $email)
}
`;
function login() {
let input;
const email = useInput("");
const [requestSecretMutation] = useMutation(LOG_IN, {variables: {email: email.value}});
return (
<div>
<form onSubmit={
async e => {
e.preventDefault();
if(email !== ""){
const {data: {requestSecret}} = await requestSecretMutation();
if(!requestSecret){
toast.error("You don't have an account yet, create one");
} else {
toast.success("Check your email for your login secret");
}
}
}}
>
<input type="email"/>
<button type="submit">Log In</button>
</form>
</div>
);
}