6. Frontend Code Overview
Last updated
Was this helpful?
Was this helpful?
// src/App.js
import React, { Component } from 'react'
import { connect } from 'react-redux'
import AuthPage from 'pages/AuthPage'
import FeedPage from 'pages/FeedPage'
import Nav from 'components/Nav'
import Footer from 'components/Footer'
import Modal from 'components/Modal'
import Toast from 'components/Toast'
import * as authActions from 'redux/actions/auth'
import './App.scss'
class App extends Component {
constructor(props) {
super(props)
/**
* 1. `isLoggedIn` 상태 초기화
* 참고) sessionStorage는 브라우저 탭이 닫힐 때까지 데이터를 저장하는 인터넷 브라우저의 기능입니다.
*/
const walletFromSession = sessionStorage.getItem('walletInstance')
const { integrateWallet, removeWallet } = this.props
if (walletFromSession) {
try {
/**
* 2-1. 지갑 연동
* 'walletInstance' 값이 있는 경우
* intergrateWallet 메서드가 caver 지갑과 리덕스 스토어에 인스턴스를 추가합니다.
* 참고) redux/actions/auth.js -> integrateWallet()
*/
integrateWallet(JSON.parse(walletFromSession).privateKey)
} catch (e) {
/**
* 2-2. 지갑 제거
* sessionStorage의 값이 유효하지 않은 지갑 인스턴스인 경우
* removeWallet 메서드가 caver 지갑과 리덕스 스토어에서 인스턴스를 제거합니다.
* 참고) redux/actions/auth.js -> removeWallet()
*/
removeWallet()
}
}
}
/**
* 3. 페이지 렌더링
* 리덕스가 walletInstance이 세션 스토리지에 존재하는지 여부에 따라 isLoggedIn의 상태를 true 또는 false로 초기화합니다.
*/
render() {
const { isLoggedIn } = this.props
return (
<div className="App">
<Modal />
<Toast />
{isLoggedIn && <Nav />}
{isLoggedIn ? <FeedPage /> : <AuthPage />}
<Footer />
</div>
)
}
}
const mapStateToProps = (state) => ({
isLoggedIn: state.auth.isLoggedIn,
})
const mapDispatchToProps = (dispatch) => ({
integrateWallet: (privateKey) => dispatch(authActions.integrateWallet(privateKey)),
removeWallet: () => dispatch(authActions.removeWallet()),
})
export default connect(mapStateToProps, mapDispatchToProps)(App)// redux/actions/auth.js
// 1. 지갑 삽입
export const integrateWallet = (privateKey) => (dispatch) => {
// caver의 privateKeyToAccount API를 이용하여 지갑 인스턴스를 생성합니다.
const walletInstance = cav.klay.accounts.privateKeyToAccount(privateKey)
// 트랜잭션을 보내려면 지갑 인스턴스를 caver에 추가합니다.
cav.klay.accounts.wallet.add(walletInstance)
// 로그인 상태를 유지하려면 walletInstance를 sessionStorage에 저장합니다.
sessionStorage.setItem('walletInstance', JSON.stringify(walletInstance))
// 애플리케이션을 실행하는 동안 walletInstance 정보에 접근하려면 리덕스 스토어에 저장합니다.
return dispatch({
type: INTEGRATE_WALLET,
payload: {
privateKey,
address: walletInstance.address,
},
})
}
// 2. 지갑 제거
export const removeWallet = () => (dispatch) => {
cav.klay.accounts.wallet.clear()
sessionStorage.removeItem('walletInstance')
return dispatch({
type: REMOVE_WALLET,
})
}