Skip to content

Commit

Permalink
feat(app-signup): add signup logic with firebase connection
Browse files Browse the repository at this point in the history
  • Loading branch information
rams23 committed Dec 28, 2020
1 parent 6b7bb89 commit 06d3eea
Show file tree
Hide file tree
Showing 11 changed files with 111 additions and 11 deletions.
1 change: 1 addition & 0 deletions packages/game-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"devDependencies": {
"@cypress/code-coverage": "^3.8.8",
"@cypress/instrument-cra": "^1.4.0",
"@pipeline/common": "0.0.0",
"@testing-library/jest-dom": "^5.11.6",
"@testing-library/react": "^11.2.2",
"@testing-library/user-event": "^12.6.0",
Expand Down
3 changes: 3 additions & 0 deletions packages/game-app/src/_shared/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import { buildStore } from './store';
import CONFIG from '@pipeline/app-config';
import firebase from 'firebase/app';
import 'firebase/analytics';
import 'firebase/firestore';
import 'firebase/functions';
import 'firebase/database';
import { initializeI18n } from './i18n';
import { actions as authActions, selectors as authSelectors } from './auth';
import { useSelector } from 'react-redux';
Expand Down
3 changes: 2 additions & 1 deletion packages/game-app/src/_shared/store/rootSaga.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Saga } from 'redux-saga';
import { all, call, spawn } from 'redux-saga/effects';
import { saga as authSaga } from '@pipeline/auth';
import signupSaga from '../../signup/sagas';

export default function* rootSaga() {
const sagas: Saga[] = [authSaga];
const sagas: Saga[] = [authSaga, signupSaga];
yield all(
sagas.map(saga =>
spawn(function* () {
Expand Down
4 changes: 4 additions & 0 deletions packages/game-app/src/signup/actions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { createAction } from '@reduxjs/toolkit';
import { SignupInfo } from '../types/signupInfo';

export const signup = createAction<SignupInfo>('signup/start');
34 changes: 34 additions & 0 deletions packages/game-app/src/signup/apis/executeSignup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { SignupInfo } from '../types/signupInfo';
import firebase from 'firebase/app';
import { FirebaseCollection } from '@pipeline/common';
import 'firebase/auth';
import 'firebase/firestore';
import { User } from '../../_shared/auth/slice';

export async function executeSignup(signupInfo: SignupInfo): Promise<User> {
try {
const credentials = await firebase.auth().createUserWithEmailAndPassword(signupInfo.email, signupInfo.password);
if (credentials.user) {
const user = credentials.user;
await firebase.firestore().doc(`${FirebaseCollection.Users}/${user?.uid}`).set({
email: signupInfo.email,
role: signupInfo.role,
devopsMaturity: signupInfo.devopsMaturity,
});
return {
id: user.uid,
email: user.email!,
};
} else {
throw new Error('user-not-created');
}
} catch (e) {
try {
const currentUser = firebase.auth().currentUser;
if (currentUser !== null) {
await currentUser.delete();
}
} catch (e) {}
throw e;
}
}
16 changes: 6 additions & 10 deletions packages/game-app/src/signup/components/Signup/Signup.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import React, { useMemo } from 'react';
import { useForm, FormProvider } from 'react-hook-form';
import { FormProvider, useForm } from 'react-hook-form';
import { FormSelect, FormTextField } from '@pipeline/form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';
import { SignupInfo } from '../../types/signupInfo';
import useSignup from '../../hooks/useSignup';

type Props = {};

interface SignupInfo {
email: string;
password: string;
repeatPassword: string;
role: string;
devopsMaturity: string;
}

//TODO make roles and devops maturity dynamics

const roles = [
Expand Down Expand Up @@ -56,10 +50,12 @@ const Signup: React.FC<Props> = ({}) => {

const { handleSubmit } = methods;

const { execute } = useSignup();

const submit = useMemo(
() =>
handleSubmit((info: SignupInfo) => {
console.log('info', info);
execute(info);
}),
[handleSubmit],
);
Expand Down
16 changes: 16 additions & 0 deletions packages/game-app/src/signup/hooks/useSignup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { useCallback } from 'react';
import { SignupInfo } from '../types/signupInfo';
import { useDispatch } from 'react-redux';
import * as actions from '../actions';

export default function useSignup() {
const dispatch = useDispatch();

const execute = useCallback((info: SignupInfo) => {
dispatch(actions.signup(info));
}, []);

return {
execute,
};
}
3 changes: 3 additions & 0 deletions packages/game-app/src/signup/sagas/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import signupSaga from './signup';

export default signupSaga;
14 changes: 14 additions & 0 deletions packages/game-app/src/signup/sagas/signup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import * as actions from '../actions';
import { executeSignup } from '../apis/executeSignup';
import { call, takeEvery, takeLeading } from 'redux-saga/effects';
import { User } from '../../_shared/auth/slice';

function* signupSaga(action: ReturnType<typeof actions.signup>) {
try {
const user: User = yield call(executeSignup, action.payload);
} catch (e) {}
}

export default function* runSignup() {
yield takeLeading(actions.signup, signupSaga);
}
7 changes: 7 additions & 0 deletions packages/game-app/src/signup/types/signupInfo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export interface SignupInfo {
email: string;
password: string;
repeatPassword: string;
role: string;
devopsMaturity: string;
}
21 changes: 21 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": false,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"outDir": "./build",
"noImplicitAny": true,
"noEmit": false,
"declaration": true
}
}

0 comments on commit 06d3eea

Please sign in to comment.