//step 18 const generateGameCode = () => { const letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; let newGameCode = ''; for (var x=0; x<4; x++) { newGameCode+= letters[Math.floor(Math.random() * (25 - 0 + 1) + 0)]; } return checkGameCode(newGameCode); }; //setp 19 const checkGameCode = newGameCode => { return firestore().collection("ao-games").where("gameCode", "==", newGameCode) .get() .then(results => { if (results.size > 0) { return generateGameCode(); } else { return saveGame(newGameCode); } }) .catch(err => { return { hasError: true, value: err }; }); }; //step 20 const saveGame = newGameCode => { return firestore().collection("ao-games").add({ gameCode: newGameCode, status: "waiting", players: [], owner: auth().currentUser.uid, answer: '', question: '', }) .then(gameDoc => { return gameDoc.id; }) .catch(err => { return { hasError: true, error: err }; }); }; //step 22 const joinGame = () => { if (gameCode.length === 4) { return firestore().collection("ao-games").where("gameCode", "==", gameCode.toUpperCase()) .get() .then(results => { if (results.size > 0) { let thisGameDocID = null; results.forEach(game => { thisGameDocID = game.id; }); setGameDocID(thisGameDocID); setCurrentStep('get-name'); } else { setCurrentStep('error-game-not-found'); } }) .catch(err => { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: err.toString() }; setError(() => { throw friendlyError }); }); } }; //step 22 const createGame = () => { generateGameCode() .then(response => { if (!response.hasError) { setGameDocID(response); setCurrentStep('get-name'); } else { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: response.value !== undefined ? response.value.toString() : '' }; setError(() => { throw friendlyError }); } }) .catch (err => { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: err.toString() }; setError(() => { throw friendlyError }); }); }; //step 25 const updateName = () => { if (userName.length > 0) { return auth().currentUser.updateProfile({ displayName: userName, }) .then((r) => { props.joinGame(gameDocID); }) .catch(err => { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: err.toString() }; setError(() => { throw friendlyError }); }); } }; //step 28 const startGame = () => { if ((props.GameData !== undefined) && (props.GameData.owner === props.auth.uid) && (props.GameData.players.length > 2)) { let questionAsker = { displayName: '', uid: '', avatar: '' }; let answeringSpirit = { displayName: '', uid: '', avatar: '' }; while (questionAsker.uid === answeringSpirit.uid) { questionAsker = getRandomPlayer(props.GameData.players); answeringSpirit = getRandomPlayer(props.GameData.players); } return setRoles(questionAsker, answeringSpirit) .then(response => { if (response.hasError) { let friendlyError = { friendly: "Something has gone terribly wrong.", technical: response.value.toString() }; setError(() => { throw friendlyError }); } }); } }; //step 29 const getRandomPlayer = players => { return players[Math.floor(Math.random() * players.length)]; }; //step 30 const setRoles = (questionAsker, answeringSpirit) => { return firestore().collection("ao-games").doc(props.GameID).update({ status: "playing", questionAsker: questionAsker, answeringSpirit: answeringSpirit, question: '', answer: '', }) .then(() => { return { hasError: false, value: null }; }) .catch(err => { return { hasError: true, value: err }; }); };