mirror of
https://github.com/rjNemo/devbook_ts
synced 2026-06-09 12:06:40 +00:00
add isActive field to dev, checks for user existance on sign up to not overwrite inactive profiles
This commit is contained in:
parent
de6790168c
commit
c988143921
6 changed files with 38 additions and 17 deletions
|
|
@ -10,8 +10,9 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
|
|||
import {faCode, faSignOutAlt, faUser} from '@fortawesome/free-solid-svg-icons';
|
||||
// Typing
|
||||
import User from '../models/User';
|
||||
import Dev from '../models/Dev';
|
||||
|
||||
interface IProps extends WithFirebaseProps<User> {
|
||||
interface IProps extends Dev, WithFirebaseProps<User> {
|
||||
isEmpty: boolean;
|
||||
isLoaded: boolean;
|
||||
}
|
||||
|
|
@ -19,7 +20,7 @@ interface IProps extends WithFirebaseProps<User> {
|
|||
/**
|
||||
* Main Navbar serves navigation Routes.
|
||||
*/
|
||||
const NavBar: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
||||
const NavBar: FC<IProps> = ({firebase, isEmpty, isLoaded, isActive}) => {
|
||||
const publicLinks = (
|
||||
<ul data-testid="publicLinks">
|
||||
<li>
|
||||
|
|
@ -72,7 +73,8 @@ const NavBar: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
|||
);
|
||||
|
||||
/** Display appropriated links after loading given authenticated prop */
|
||||
const RenderLinks = isLoaded && !isEmpty ? privateLinks : publicLinks;
|
||||
const RenderLinks =
|
||||
isLoaded && !isEmpty && isActive ? privateLinks : publicLinks;
|
||||
|
||||
return (
|
||||
<nav className="navbar bg-dark">
|
||||
|
|
|
|||
|
|
@ -13,13 +13,14 @@ import Alert from '../components/Alert';
|
|||
import User from '../models/User';
|
||||
// Form
|
||||
import useForm from '../hooks';
|
||||
import Dev from '../models/Dev';
|
||||
|
||||
interface InitFormData {
|
||||
email: string;
|
||||
password: string;
|
||||
}
|
||||
|
||||
interface IProps extends WithFirebaseProps<User> {
|
||||
interface IProps extends Dev, WithFirebaseProps<User> {
|
||||
isEmpty: boolean;
|
||||
isLoaded: boolean;
|
||||
}
|
||||
|
|
@ -27,7 +28,7 @@ interface IProps extends WithFirebaseProps<User> {
|
|||
/**
|
||||
* Sign in form
|
||||
*/
|
||||
const SignIn: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
||||
const SignIn: FC<IProps> = ({firebase, isEmpty, isLoaded, isActive}) => {
|
||||
const [error, setError] = useState<any>(null);
|
||||
|
||||
// handle form data
|
||||
|
|
@ -57,7 +58,7 @@ const SignIn: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
|||
firebase.login({provider: 'google', type: 'popup'});
|
||||
|
||||
// redirect to dashboard if connected
|
||||
if (isLoaded && !isEmpty) {
|
||||
if (isLoaded && !isEmpty && isActive) {
|
||||
return <Redirect to={Routes.DASHBOARD} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,10 +12,10 @@ import Alert from '../components/Alert';
|
|||
import Header from '../components/Header';
|
||||
// Form
|
||||
import useForm from '../hooks';
|
||||
import {blankDev} from '../models/Dev';
|
||||
import Dev, {blankDev} from '../models/Dev';
|
||||
|
||||
// extends withFirebaseProps type to ad profile info
|
||||
interface IProps extends WithFirebaseProps<User> {
|
||||
interface IProps extends Dev, WithFirebaseProps<User> {
|
||||
isEmpty: boolean;
|
||||
isLoaded: boolean;
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@ interface InitFormData {
|
|||
/**
|
||||
* Sign up form recieves firebase from withFirebase HOC
|
||||
*/
|
||||
const SignUp: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
||||
const SignUp: FC<IProps> = ({firebase, isEmpty, isLoaded, isActive}) => {
|
||||
const [error, setError] = useState<any>(null);
|
||||
|
||||
// handle form data
|
||||
|
|
@ -66,11 +66,29 @@ const SignUp: FC<IProps> = ({firebase, isEmpty, isLoaded}) => {
|
|||
const loginWithGoogle = () =>
|
||||
firebase
|
||||
.login({provider: 'google', type: 'popup'})
|
||||
.then(() => firebase.updateProfile(blankDev, {useSet: true, merge: true}))
|
||||
.then(() => {
|
||||
// updateProfile only if user does not already exists in db
|
||||
const email = firebase.auth().currentUser?.email;
|
||||
let exists: boolean = false;
|
||||
firebase
|
||||
.firestore()
|
||||
.collection('users/')
|
||||
.where('email', '==', email)
|
||||
.get()
|
||||
.then(docs =>
|
||||
docs.forEach(doc => {
|
||||
exists = doc.data().isActive !== undefined;
|
||||
}),
|
||||
)
|
||||
.then(() => {
|
||||
if (!exists)
|
||||
firebase.updateProfile(blankDev, {useSet: true, merge: true});
|
||||
});
|
||||
})
|
||||
.catch(err => setError(err));
|
||||
|
||||
// redirect to dashboard if connected
|
||||
if (isLoaded && !isEmpty) {
|
||||
if (isLoaded && !isEmpty && isActive) {
|
||||
return <Redirect to={Routes.DASHBOARD} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,13 +23,15 @@ const PrivateRoute: FC<IProps> = ({
|
|||
...rest
|
||||
}) => {
|
||||
const auth = useSelector((state: RootState) => state.firebase.auth);
|
||||
const profile = useSelector((state: RootState) => state.firebase.profile);
|
||||
const isActive = profile.isActive;
|
||||
return (
|
||||
<Route
|
||||
exact={exact}
|
||||
path={path}
|
||||
{...rest}
|
||||
render={({location, ...rest}) =>
|
||||
isLoaded(auth) && !isEmpty(auth) ? (
|
||||
isLoaded(auth) && !isEmpty(auth) && isActive ? (
|
||||
<Component {...rest} />
|
||||
) : (
|
||||
<Redirect
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ const rrfProps = {
|
|||
createFirestoreInstance,
|
||||
};
|
||||
|
||||
// Firestore SChema
|
||||
// Firestore Schema
|
||||
export interface Schema {
|
||||
devs: Dev;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,14 @@
|
|||
// Redux
|
||||
import {configureStore} from '@reduxjs/toolkit';
|
||||
// import authReducer from './auth/';
|
||||
// Firebase
|
||||
import {firebaseReducer, FirebaseReducer} from 'react-redux-firebase';
|
||||
import {firestoreReducer} from 'redux-firestore';
|
||||
// Typing
|
||||
import User from '../models/User';
|
||||
import {Schema} from './firebase/config';
|
||||
import Dev from '../models/Dev';
|
||||
|
||||
const store = configureStore({
|
||||
reducer: {
|
||||
// auth: authReducer,
|
||||
firebase: firebaseReducer,
|
||||
firestore: firestoreReducer,
|
||||
},
|
||||
|
|
@ -18,7 +16,7 @@ const store = configureStore({
|
|||
|
||||
// State type
|
||||
export interface RootState {
|
||||
firebase: FirebaseReducer.Reducer<User, Schema>;
|
||||
firebase: FirebaseReducer.Reducer<Dev, Schema>;
|
||||
}
|
||||
|
||||
export default store;
|
||||
|
|
|
|||
Loading…
Reference in a new issue