269 lines
8.0 KiB
TypeScript
Executable File
269 lines
8.0 KiB
TypeScript
Executable File
import React, { Fragment, useState, useEffect } from "react";
|
|
import { Link, useMatch, useNavigate } from "react-router-dom";
|
|
import { createProfile, getCurrentProfile } from "../../actions/profile";
|
|
import { useAppDispatch, useAppSelector } from "../../utils/hooks";
|
|
|
|
const initialState = {
|
|
company: "",
|
|
website: "",
|
|
location: "",
|
|
status: "",
|
|
skills: "",
|
|
githubusername: "",
|
|
bio: "",
|
|
twitter: "",
|
|
facebook: "",
|
|
linkedin: "",
|
|
youtube: "",
|
|
instagram: "",
|
|
};
|
|
|
|
const ProfileForm = () => {
|
|
|
|
const dispatch = useAppDispatch();
|
|
|
|
const { profile, loading }: { profile: any, loading: boolean } = useAppSelector((state) => state.profile);
|
|
//TODO
|
|
// issue with for in
|
|
|
|
const [formData, setFormData] = useState(initialState);
|
|
|
|
const creatingProfile = useMatch("/create-profile");
|
|
|
|
const [displaySocialInputs, toggleSocialInputs] = useState(false);
|
|
|
|
const navigate = useNavigate();
|
|
|
|
useEffect(() => {
|
|
// if there is no profile, attempt to fetch one
|
|
async function fetchData() {
|
|
await dispatch(getCurrentProfile())
|
|
}
|
|
if (!profile) fetchData();
|
|
|
|
// if we finished loading and we do have a profile
|
|
// then build our profileData
|
|
if (!loading && profile) {
|
|
const profileData: any = { ...initialState };
|
|
// cant figure out how to type key to be keyof profile so they are any now
|
|
for (const key in profile) {
|
|
if (key in profileData) profileData[key] = profile[key];
|
|
}
|
|
for (const key in profile.social) {
|
|
if (key in profileData) profileData[key] = profile.social[key];
|
|
}
|
|
// the skills may be an array from our API response
|
|
if (Array.isArray(profileData.skills))
|
|
profileData.skills = profileData.skills.join(", ");
|
|
// set local state with the profileData
|
|
setFormData(profileData);
|
|
}
|
|
}, [loading, dispatch, profile]);
|
|
|
|
const {
|
|
company,
|
|
website,
|
|
location,
|
|
status,
|
|
skills,
|
|
githubusername,
|
|
bio,
|
|
twitter,
|
|
facebook,
|
|
linkedin,
|
|
youtube,
|
|
instagram,
|
|
} = formData;
|
|
|
|
const onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) =>
|
|
setFormData({ ...formData, [e.target.name]: e.target.value });
|
|
|
|
const onSubmit = async (e: React.SyntheticEvent) => {
|
|
const editing = profile ? true : false;
|
|
e.preventDefault();
|
|
await dispatch(createProfile(formData, editing)).then(() => {
|
|
if (!editing) navigate("/dashboard");
|
|
});
|
|
};
|
|
|
|
return (
|
|
<section className="container">
|
|
<h1 className="large text-primary">
|
|
{creatingProfile ? "Create Your Profile" : "Edit Your Profile"}
|
|
</h1>
|
|
<p className="lead">
|
|
<i className="fas fa-user" />
|
|
{creatingProfile
|
|
? ` Let's get some information to make your`
|
|
: " Add some changes to your profile"}
|
|
</p>
|
|
<small>* = required field</small>
|
|
<form className="form" onSubmit={onSubmit}>
|
|
<div className="form-group">
|
|
<select name="status" value={status} onChange={onChange}>
|
|
<option>* Select Professional Status</option>
|
|
<option value="Developer">Developer</option>
|
|
<option value="Junior Developer">Junior Developer</option>
|
|
<option value="Senior Developer">Senior Developer</option>
|
|
<option value="Manager">Manager</option>
|
|
<option value="Student or Learning">Student or Learning</option>
|
|
<option value="Instructor">Instructor or Teacher</option>
|
|
<option value="Intern">Intern</option>
|
|
<option value="Other">Other</option>
|
|
</select>
|
|
<small className="form-text">
|
|
Give us an idea of where you are at in your career
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
placeholder="Company"
|
|
name="company"
|
|
value={company}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">
|
|
Could be your own company or one you work for
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
placeholder="Website"
|
|
name="website"
|
|
value={website}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">
|
|
Could be your own or a company website
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
placeholder="Location"
|
|
name="location"
|
|
value={location}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">
|
|
City & state suggested (eg. Boston, MA)
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
placeholder="* Skills"
|
|
name="skills"
|
|
value={skills}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">
|
|
Please use comma separated values (eg. HTML,CSS,JavaScript,PHP)
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
placeholder="Github Username"
|
|
name="githubusername"
|
|
value={githubusername}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">
|
|
If you want your latest repos and a Github link, include your
|
|
username
|
|
</small>
|
|
</div>
|
|
<div className="form-group">
|
|
<textarea
|
|
placeholder="A short bio of yourself"
|
|
name="bio"
|
|
value={bio}
|
|
onChange={onChange}
|
|
/>
|
|
<small className="form-text">Tell us a little about yourself</small>
|
|
</div>
|
|
|
|
<div className="my-2">
|
|
<button
|
|
onClick={() => toggleSocialInputs(!displaySocialInputs)}
|
|
type="button"
|
|
className="btn btn-light"
|
|
>
|
|
Add Social Network Links
|
|
</button>
|
|
<span>Optional</span>
|
|
</div>
|
|
|
|
{displaySocialInputs && (
|
|
<Fragment>
|
|
<div className="form-group social-input">
|
|
<i className="fab fa-twitter fa-2x" />
|
|
<input
|
|
type="text"
|
|
placeholder="Twitter URL"
|
|
name="twitter"
|
|
value={twitter}
|
|
onChange={onChange}
|
|
/>
|
|
</div>
|
|
|
|
<div className="form-group social-input">
|
|
<i className="fab fa-facebook fa-2x" />
|
|
<input
|
|
type="text"
|
|
placeholder="Facebook URL"
|
|
name="facebook"
|
|
value={facebook}
|
|
onChange={onChange}
|
|
/>
|
|
</div>
|
|
|
|
<div className="form-group social-input">
|
|
<i className="fab fa-youtube fa-2x" />
|
|
<input
|
|
type="text"
|
|
placeholder="YouTube URL"
|
|
name="youtube"
|
|
value={youtube}
|
|
onChange={onChange}
|
|
/>
|
|
</div>
|
|
|
|
<div className="form-group social-input">
|
|
<i className="fab fa-linkedin fa-2x" />
|
|
<input
|
|
type="text"
|
|
placeholder="Linkedin URL"
|
|
name="linkedin"
|
|
value={linkedin}
|
|
onChange={onChange}
|
|
/>
|
|
</div>
|
|
|
|
<div className="form-group social-input">
|
|
<i className="fab fa-instagram fa-2x" />
|
|
<input
|
|
type="text"
|
|
placeholder="Instagram URL"
|
|
name="instagram"
|
|
value={instagram}
|
|
onChange={onChange}
|
|
/>
|
|
</div>
|
|
</Fragment>
|
|
)}
|
|
|
|
<input type="submit" className="btn btn-primary my-1" />
|
|
<Link className="btn btn-light my-1" to="/dashboard">
|
|
Go Back
|
|
</Link>
|
|
</form>
|
|
</section>
|
|
);
|
|
};
|
|
|
|
export default ProfileForm;
|