//step 3: import auth from '@react-native-firebase/auth'; import firebase from '@react-native-firebase/app'; //step 4 useEffect(() => { //declare the listener that will listen for changes to authentication state const authSubscriber = auth().onAuthStateChanged(onAuthStateChanged); //we don't use user accounts for this app, so sign in the user anonymously auth() .signInAnonymously() .then(() => { console.log('User signed in anonymously'); }) .catch(err => { let friendlyError = { friendly: "We couldn't authenticate you with the game service.", technical: err.toString() }; }); //when the component is destroyed, unsubscribe to any listeners return (() => { if (subscriber !== null) { subsciber(); authSubscriber; } }); }, []); //step7 import firestore from '@react-native-firebase/firestore'; //step 8 const getPlayers = gameDocID => { return firestore().collection("ao-games").doc(gameDocID).get() .then(doc => { if (doc.exists) { return doc.data().players; } else { return { hasError: true, value: 'doc-not-found' }; } }) .catch(err => { return { hasError: true, value: err }; }); }; //step 10: const updatePlayers = (gameDocID, playersArray) => { return firestore().collection("ao-games").doc(gameDocID).update({ players: playersArray, }) .then(() => { return { hasError: false, value: null } }) .catch(err => { return { hasError: true, value: err } }); }; //step 13: const getAvatar = () => { let key = firestore().collection("ao-avatars").doc().id; return firestore().collection("ao-avatars").where(firebase.firestore.FieldPath.documentId(), ">=", key).limit(1).get() .then(snapshot => { if (snapshot.size > 0) { let avatar = ""; snapshot.forEach(doc => { avatar = doc.data().avatarText; }); return avatar; } else { return firestore().collection("ao-avatars").where(firebase.firestore.FieldPath.documentId(), "<", key).limit(1).get() .then(snapshot => { let avatar = ""; snapshot.forEach(doc => { avatar = doc.data().avatarText; }); return avatar; }) .catch(err => { return { hasError: true, error: err }; }); } }) .catch(err => { return { hasError: true, error: err }; }); }; //step 15 const joinGame = gameDocID => { setGameID(gameDocID); //start listening for updates to game data subscriber = firestore().collection("ao-games").doc(gameDocID).onSnapshot(doc => { updateGameData(doc.data()); }); //add me to the current players list return getAvatar() .then(avatar => { if (!avatar.hasError) { return getPlayers(gameDocID) .then(players => { if (!players.hasError) { let alreadyThere = false; let newPlayers = players; players.forEach(player => { if (player.uid === auth().currentUser.uid) { alreadyThere = true; } }); if (!alreadyThere) { console.log(auth().currentUser.displayName); newPlayers.push({ uid: auth().currentUser.uid, displayName: auth().currentUser.displayName, avatar: avatar, }); return updatePlayers(gameDocID, newPlayers) .then(response => { if (!response.hasError) { setCurrentScreen('lobby'); } else { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: response.value !== undefined ? response.value.toString() : '' }; setError(() => { throw friendlyError }); } }); } else { setCurrentScreen('lobby'); } } else { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: players.value !== undefined ? players.value : ''}; setError(() => { throw friendlyError }); } }); } }); };