할 일
QR을 찍는다는 것은, 바빌키 uid를 읽어 복호화 한다는 의미이다. 읽어낸 uid는 서버에 보내 실제로 있는 모델인지, 그리고 사용가능한지를 확인한다. 사용가능하면 차대번호를 입력해서 다음 화면으로 넘어간다.
해결 & 코드
QR코드 자체는 당장 우선순위가 아니고, 차대번호 역시 조금 밀린다고 본다. 따라서 지금은 직접 uid를 입력하는 방식으로 만들었다. 그저 db에 해당 uid가 있는지 확인하고, 사용 가능한지 확인하는 작업을 하는 액션이다. 추후 QR 인증 방식으로 전환하는게 좋겠다.
babilLink.js
renderCheckButton = (deviceUid) => {
const disabled = this.state.targetProductUid ? true : false;
const title = disabled ? 'UID 등록 완료' : 'UID 등록';
return (
<ButtonCommon
text={title}
onPress={() => this.props.checkProductExists(deviceUid)
.then(({productIndex, productName}) => this.setState({
targetProductUid: deviceUid,
targetProductIndex: productIndex,
targetProductName: productName
}), (error) => {
console.log(error)
})}
disabled={ disabled }
/>
)
}
renderSubmitButton = () => {
const disabled = this.state.targetProductUid ? false : true;
return (
<ButtonBottom
title="다음"
color='#0FC760'
onPress={()=>this.props.navigation.push("BabilScan", {newBabilKey: {...this.props.route.params.selectedBike, deviceUid: this.state.targetProductUid, deviceIndex: this.state.targetProductIndex, deviceName: this.state.targetProductName}})}
disabled={ disabled }
/>
)
}
사용자에게 uid를 입력받아 바빌 키가 등록 가능한 상태인지 확인한 뒤 결과에 따라 렌더링하는 간단한 컴포넌트이다.
main_actions.js
export const checkProductExists = (deviceUid) => (dispatch) => {
const productsRef = dbRef(db, 'products');
return new Promise( async (resolve, reject) => {
try {
const deviceUidQuery = dbQuery(productsRef, queryOrderByChild('uid'), queryEqualTo(deviceUid));
const snapshot = await dbGet(deviceUidQuery);
snapshot.forEach((child) => {
if (child.exists()) {
if (!child.val().isActivated) {
console.log(child.val().uid, 'exists')
dispatch({type: null, payload: null})
resolve({ productIndex: child.key, productName: child.val().name })
} else {
alert('이미 등록된 uid 입니다.')
reject()
}
} else {
console.log('null data');
}
})
} catch (error) {
alert('존재하지 않는 uid 입니다.');
console.log('error:', error);
reject()
}
})
}
uid로 order by 해서 타겟 uid를 찾는다. isActivated에 따라 resolve할지 reject할지 결정된다. 역시 firebase error에 대한 분기는 안되어 있다...! 사실 모든 액션이 이모양이라, 이슈로 넣기도 민망할 정도이다... 등록이 되면 해당 product 의 isActivated를 true로 바꿔줘야 하므로, 또 접근할 수 있게 key값을 productIndex로 받아온다.
'BABIL_PROJECT > Firebase' 카테고리의 다른 글
자동 로그인 구현 (0) | 2022.05.10 |
---|---|
단일 항목 선택 리스트 (0) | 2022.05.01 |
BABIL_DB스키마 (0) | 2022.04.13 |
오토바이 DB (0) | 2022.04.13 |
Firebase (signIn & signUp) (0) | 2022.04.07 |