mirror of
https://github.com/rjNemo/devbook_ts
synced 2026-06-11 21:16:45 +00:00
enable add experience form
This commit is contained in:
parent
ba668bb21e
commit
7ae1082547
4 changed files with 151 additions and 17 deletions
|
|
@ -60,11 +60,13 @@ export const dummyDev: Dev = {
|
||||||
from: new Date(2011, 10),
|
from: new Date(2011, 10),
|
||||||
to: 'Current',
|
to: 'Current',
|
||||||
position: 'Senior Developer',
|
position: 'Senior Developer',
|
||||||
|
location: 'USA',
|
||||||
description:
|
description:
|
||||||
'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Voluptas corrupti rem eius, accusantium ipsum vel eveniet magnam voluptatum? Minus, voluptatum!',
|
'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Voluptas corrupti rem eius, accusantium ipsum vel eveniet magnam voluptatum? Minus, voluptatum!',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
company: 'Sun Microsystems',
|
company: 'Sun Microsystems',
|
||||||
|
location: 'USA',
|
||||||
from: new Date(2004, 10),
|
from: new Date(2004, 10),
|
||||||
to: new Date(2010, 11),
|
to: new Date(2010, 11),
|
||||||
position: 'System Admin',
|
position: 'System Admin',
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,6 @@ const AddEducation: FC<IProps> = ({firebase, educations}) => {
|
||||||
return newEdu;
|
return newEdu;
|
||||||
};
|
};
|
||||||
const newEdu = makeEducation(formData);
|
const newEdu = makeEducation(formData);
|
||||||
console.log(JSON.stringify(newEdu, null, 4));
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
firebase.updateProfile(
|
firebase.updateProfile(
|
||||||
|
|
@ -156,7 +155,7 @@ const AddEducation: FC<IProps> = ({firebase, educations}) => {
|
||||||
name="current"
|
name="current"
|
||||||
checked={formData.current}
|
checked={formData.current}
|
||||||
onChange={handleCheckboxesChange}
|
onChange={handleCheckboxesChange}
|
||||||
/>
|
/>{' '}
|
||||||
Current School
|
Current School
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,98 @@
|
||||||
import React, {FC} from 'react';
|
import React, {FC, useState, FormEvent} from 'react';
|
||||||
|
// Routing
|
||||||
|
import {Link} from 'react-router-dom';
|
||||||
|
import Routes from '../constants/routes';
|
||||||
|
// Redux
|
||||||
|
import {WithFirebaseProps} from 'react-redux-firebase';
|
||||||
|
import {enhance} from '../store/firebase';
|
||||||
|
// Style
|
||||||
import FormHeader from '../components/FormHeader';
|
import FormHeader from '../components/FormHeader';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
// Typing
|
||||||
|
import Dev from '../models/Dev';
|
||||||
|
import User from '../models/User';
|
||||||
|
import IAlert, {formAlert} from '../types/Alert';
|
||||||
|
import Experience from '../types/Experience';
|
||||||
|
import {parseDate} from '../types/TimePeriod';
|
||||||
|
// Form
|
||||||
|
import useForm from '../hooks';
|
||||||
|
|
||||||
|
interface FormData {
|
||||||
|
position: string;
|
||||||
|
company: string;
|
||||||
|
location: string;
|
||||||
|
from: string;
|
||||||
|
to: string;
|
||||||
|
current: boolean;
|
||||||
|
description: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IProps extends Dev, WithFirebaseProps<User> {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Form to add an Education step to Profile
|
* Form to add an Experience step to Profile
|
||||||
*/
|
*/
|
||||||
const AddExperience: FC = () => {
|
const AddExperience: FC<IProps> = ({firebase, experiences}) => {
|
||||||
|
const [alert, setAlert] = useState<IAlert>(formAlert);
|
||||||
|
|
||||||
|
const initFormData: FormData = {
|
||||||
|
position: '',
|
||||||
|
company: '',
|
||||||
|
location: '',
|
||||||
|
from: '',
|
||||||
|
to: '',
|
||||||
|
current: false,
|
||||||
|
description: '',
|
||||||
|
};
|
||||||
|
const {formData, handleChange, handleCheckboxesChange, resetForm} = useForm<
|
||||||
|
FormData
|
||||||
|
>(initFormData);
|
||||||
|
|
||||||
|
const isDisabled: boolean =
|
||||||
|
formData.position === '' || formData.company === '';
|
||||||
|
|
||||||
|
const handleSubmit = (e: FormEvent<HTMLFormElement>): void => {
|
||||||
|
e.preventDefault();
|
||||||
|
const makeExperience = ({
|
||||||
|
position,
|
||||||
|
company,
|
||||||
|
from,
|
||||||
|
location,
|
||||||
|
to,
|
||||||
|
current,
|
||||||
|
description,
|
||||||
|
}: FormData): Experience => {
|
||||||
|
if (current) to = 'Current';
|
||||||
|
const newExp: Experience = {
|
||||||
|
position,
|
||||||
|
company,
|
||||||
|
location,
|
||||||
|
from: parseDate(from),
|
||||||
|
to: parseDate(to),
|
||||||
|
description,
|
||||||
|
};
|
||||||
|
return newExp;
|
||||||
|
};
|
||||||
|
const newExp = makeExperience(formData);
|
||||||
|
console.log(JSON.stringify(newExp, null, 4));
|
||||||
|
|
||||||
|
try {
|
||||||
|
firebase.updateProfile(
|
||||||
|
{experiences: [...experiences, newExp]},
|
||||||
|
{useSet: true, merge: true},
|
||||||
|
);
|
||||||
|
setAlert({
|
||||||
|
show: true,
|
||||||
|
color: 'success',
|
||||||
|
text:
|
||||||
|
'Profile successfully updated. You may continue or go back to your dashboard.',
|
||||||
|
});
|
||||||
|
resetForm();
|
||||||
|
} catch (err) {
|
||||||
|
setAlert({...alert, show: true});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="container">
|
<section className="container">
|
||||||
<FormHeader
|
<FormHeader
|
||||||
|
|
@ -14,27 +102,63 @@ const AddExperience: FC = () => {
|
||||||
icon="code-branch"
|
icon="code-branch"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<form className="form">
|
<form className="form" onSubmit={handleSubmit}>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<input type="text" placeholder="* Job Title" name="title" required />
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="* Job Title"
|
||||||
|
name="position"
|
||||||
|
required
|
||||||
|
value={formData.position}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<input type="text" placeholder="* Company" name="company" required />
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="* Company"
|
||||||
|
name="company"
|
||||||
|
required
|
||||||
|
value={formData.company}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<input type="text" placeholder="Location" name="location" />
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Location"
|
||||||
|
name="location"
|
||||||
|
value={formData.location}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<h4>From Date</h4>
|
<h4>From Date</h4>
|
||||||
<input type="date" name="from" />
|
<input
|
||||||
|
type="date"
|
||||||
|
name="from"
|
||||||
|
value={formData.from}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<h4>To Date</h4>
|
<h4>To Date</h4>
|
||||||
<input type="date" name="to" />
|
<input
|
||||||
|
type="date"
|
||||||
|
name="to"
|
||||||
|
value={formData.to}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<p>
|
<p>
|
||||||
<input type="checkbox" name="current" value="" /> Current Job
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="current"
|
||||||
|
checked={formData.current}
|
||||||
|
onChange={handleCheckboxesChange}
|
||||||
|
/>{' '}
|
||||||
|
Current Job
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
|
|
@ -43,15 +167,23 @@ const AddExperience: FC = () => {
|
||||||
cols={30}
|
cols={30}
|
||||||
rows={5}
|
rows={5}
|
||||||
placeholder="Job Description"
|
placeholder="Job Description"
|
||||||
|
value={formData.description}
|
||||||
|
onChange={handleChange}
|
||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
<input type="submit" className="btn btn-primary my-1" value="Submit" />
|
{alert.show && <Alert text={alert.text} color={alert.color} />}
|
||||||
<a className="btn btn-light my-1" href="dashboard.html">
|
<input
|
||||||
|
type="submit"
|
||||||
|
className="btn btn-primary my-1"
|
||||||
|
value="Submit"
|
||||||
|
disabled={isDisabled}
|
||||||
|
/>
|
||||||
|
<Link className="btn btn-light my-1" to={Routes.DASHBOARD}>
|
||||||
Go Back
|
Go Back
|
||||||
</a>
|
</Link>
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default AddExperience;
|
export default enhance(AddExperience);
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,11 @@ import TimePeriod from '../types/TimePeriod';
|
||||||
|
|
||||||
interface Experience {
|
interface Experience {
|
||||||
company: string;
|
company: string;
|
||||||
from: Date;
|
from: TimePeriod;
|
||||||
to: TimePeriod;
|
to: TimePeriod;
|
||||||
position: string;
|
position: string;
|
||||||
description: string;
|
description: string;
|
||||||
|
location: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Experience;
|
export default Experience;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue