191112 TIL qna구현(미션2), ag-grid

» 1.5막, TIL (Today I Learned), ag-grid

qna구현(미션2)

  • 과제를 내고보니 Promise를 아직 잘 모르는 거 같았다.
  • 좀 더 공부,,,

ssh

  • 프로미스는 콜백함수 resolve(), reject()를 인자로 받는다. 성공시 resolve 함수 호출, 실패시 reject 함수 호출.

자바스크립트 Promise 쉽게 이해하기

이 글 예전에도 분명히 봤을텐데…
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가 있어서 (자동은 아니지만,, ) 반응형도 해볼 수 있을 것 같다.