IPC통신이 매끄럽게 해결된 이후로 폭주해서 본격적으로 API를 이용하기 위한 hook과 모듈들을 짜기 시작했다. 꽤 시간 잡아먹은 오류 중에 기억에 남는 건
This expression is not callable.
Not all constituents of type 'boolean | any[] | ((data: any) => void)' are callable.
Type 'false' has no call signatures.
이런 것이었는데, 원인은 커스텀 훅의 리턴 배열 순서에 있었다.
useRiotAPI(작성중)
import{useState, useRef} from "react";
import riotAPI from "../apis/riotAPI";
import { PickAPI_type, Team } from "../types/champSelect.type";
import { userInfo_type } from './../types/userInfo.type';
export default function useRiotAPI(initialState?:JSON){
const callAPI = useRef<riotAPI>(null);
const [pickStatus, setPickStatus] = useState([]);
const [isSelect, setIsSelect] = useState(false);
const setUserInfo = (data:userInfo_type) =>{
callAPI.current = new riotAPI(data);
}
const pickToData = (data:PickAPI_type) =>{
let pickArray: Pick<Team,'cellId'|'championId'>[] = [];
if(data.myTeam.length==0){
pickArray = [];
setIsSelect(false);
}
else{
data.myTeam.forEach((player)=>{
pickArray.push(player);
})
}
console.log(pickArray)
setPickStatus(pickArray);
}
const setSelectLive = async() =>{
setIsSelect(true)
}
return {isSelect, setSelectLive, setUserInfo, pickStatus, pickToData}
}
마지막 부분의 리턴값이 원래 배열이었는데, 계속 수정하다보니 작성 순서대로 리턴하지 않게되었다. 그 경우 함수를 호출할 때 에러가 생긴다. 그래서 항목이 적을 때는 array, 많을 때는 object를 추천한다는 글을 봤다.
CSP설정 (devContentSecurityPolicy에 RIOT API 도메인 추가)
"plugins": [
[
"@electron-forge/plugin-webpack",
{
"devContentSecurityPolicy":"script-src 'self' https://kr.api.riotgames.com 'unsafe-eval'",
"mainConfig": "./webpack.main.config.js",
"renderer": {
"config": "./webpack.renderer.config.js",
"entryPoints": [
{
"html": "./src/index.html",
"js": "./src/renderer.ts",
"name": "main_window",
"preload": {
"js": "./src/preload.ts"
}
}
]
}
}
]
]
역시 정답은 채팅창에 있었다. 픽창에 진입했을 때 받은 채팅창 ID로 아래의 엔드포인트를 요청하여 채팅방 참가자들의 정보를 추출할 수 있었다.
export const LCU_ENDPOINT_PARTICIPANTS = (id:string)=>{
return `/lol-chat/v1/conversations/${id}/participants`
}
이제 본격적으로 리액트에서 이 데이터들을 시각화 해봐야지.