191112 TIL qna구현(미션2), ag-grid
Nov 12, 2019
»
1.5막,
TIL (Today I Learned),
ag-grid
qna구현(미션2)
- 과제를 내고보니 Promise를 아직 잘 모르는 거 같았다.
- 좀 더 공부,,,
- 프로미스는 콜백함수 resolve(), reject()를 인자로 받는다. 성공시 resolve 함수 호출, 실패시 reject 함수 호출.
이 글 예전에도 분명히 봤을텐데…
Promise 내꺼 만들고 싶다…
function QNA() {
const [qnaList, setQnAList] = Plain.useState([]);
//login 과정도 useState로 구현할 수 있음
//const [loginId, setLoginId] = Plain.useState(null);
function renderQnA(data) {
const target = $(".qna-wrap");
const resultHTML = getQnATemplate(data);
target.innerHTML = resultHTML;
}
async function initRender(callback) {
try {
const res = await fetch(URL.INIT);
const result = await res.json();
setQnAList(data => result.list || data);
} catch (err) {
console.error("render fetching error");
}
}
return {
render() {
if (qnaList.length > 0) renderQnA(qnaList)
},
initComponent() {
initRender(() => {
console.log("init render end")
})
}
};
}
let validation = false;
document.addEventListener("DOMContentLoaded", () => {
let qnaService = Plain.renderComponent(QNA);
qnaService.initComponent();
checkTokenValidation();
$('.login-btn').addEventListener("click", handleOnClick);
});
const checkTokenValidation = () => {
const token = localStorage.getItem('token');
if (token) isTokenValid(token);
}
const handleOnClick = () => {
const token = localStorage.getItem('token');
token ? getLogout() : getLogin();
}
const getLogin = () => {
const body = {
user: 'soom'
};
const fetchData = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(body),
}
fetch(URL.LOGIN, fetchData)
.then(response => response.json())
.then(data => data.auth ? setLoginInfo(data.message, data.token, body.user) : console.log('login: error'))
.catch(e => console.log(e));
}
const setLoginInfo = (message, token, userName) => {
console.log(message, '로그인 되셨습니당...');
localStorage.setItem('token', token);
setUserName(userName);
}
const getLogout = () => {
localStorage.clear();
$('.login-btn').innerText = "로그인";
console.log('로그아웃 되셨습니당...')
}
const isTokenValid = token => {
const fetchData = {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`
}
}
fetch(URL.VALIDATION, fetchData)
.then(response => response.json())
.then(data => {
if (data.authResult) {
setUserName(data.id);
validation = !validation;
} else {
console.log('토큰이 유효하지 않습니다.');
getLogout();
}
})
.catch(e => console.log(e));
}
const setUserName = (userName) => {
localStorage.setItem('username', userName);
$('.login-btn').innerText = userName;
}
ag-grid
material UI와 ag-grid 사용해서 ui를 구축하고 있다.
자동으로 responsive되게 해주는 drawer가 있어서 (자동은 아니지만,, ) 반응형도 해볼 수 있을 것 같다.