Interactive Resume Builder React, JavaScript
👤 Sharing: AI
```javascript
import React, { useState } from 'react';
const ResumeBuilder = () => {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [phone, setPhone] = useState('');
const [summary, setSummary] = useState('');
const [experience, setExperience] = useState([{ company: '', position: '', startDate: '', endDate: '', description: '' }]);
const [education, setEducation] = useState([{ school: '', degree: '', startDate: '', endDate: '', description: '' }]);
const [skills, setSkills] = useState('');
const [projects, setProjects] = useState([{ name: '', description: '' }]);
const handleInputChange = (setState) => (event) => {
setState(event.target.value);
};
const handleExperienceChange = (index) => (event) => {
const values = [...experience];
values[index][event.target.name] = event.target.value;
setExperience(values);
};
const handleEducationChange = (index) => (event) => {
const values = [...education];
values[index][event.target.name] = event.target.value;
setEducation(values);
};
const handleProjectChange = (index) => (event) => {
const values = [...projects];
values[index][event.target.name] = event.target.value;
setProjects(values);
}
const addExperience = () => {
setExperience([...experience, { company: '', position: '', startDate: '', endDate: '', description: '' }]);
};
const removeExperience = (index) => {
const values = [...experience];
values.splice(index, 1);
setExperience(values);
};
const addEducation = () => {
setEducation([...education, { school: '', degree: '', startDate: '', endDate: '', description: '' }]);
};
const removeEducation = (index) => {
const values = [...education];
values.splice(index, 1);
setEducation(values);
};
const addProject = () => {
setProjects([...projects, {name: '', description: ''}]);
}
const removeProject = (index) => {
const values = [...projects];
values.splice(index, 1);
setProjects(values);
}
return (
<div style={{ fontFamily: 'Arial, sans-serif', padding: '20px' }}>
<h1>Interactive Resume Builder</h1>
<h2>Personal Information</h2>
<div>
<label>Name:</label>
<input type="text" value={name} onChange={handleInputChange(setName)} />
</div>
<div>
<label>Email:</label>
<input type="email" value={email} onChange={handleInputChange(setEmail)} />
</div>
<div>
<label>Phone:</label>
<input type="tel" value={phone} onChange={handleInputChange(setPhone)} />
</div>
<h2>Summary</h2>
<div>
<label>Summary:</label>
<textarea value={summary} onChange={handleInputChange(setSummary)} />
</div>
<h2>Experience</h2>
{experience.map((exp, index) => (
<div key={index} style={{ border: '1px solid #ccc', padding: '10px', marginBottom: '10px' }}>
<h3>Experience {index + 1}</h3>
<div>
<label>Company:</label>
<input type="text" name="company" value={exp.company} onChange={handleExperienceChange(index)} />
</div>
<div>
<label>Position:</label>
<input type="text" name="position" value={exp.position} onChange={handleExperienceChange(index)} />
</div>
<div>
<label>Start Date:</label>
<input type="text" name="startDate" value={exp.startDate} onChange={handleExperienceChange(index)} />
</div>
<div>
<label>End Date:</label>
<input type="text" name="endDate" value={exp.endDate} onChange={handleExperienceChange(index)} />
</div>
<div>
<label>Description:</label>
<textarea name="description" value={exp.description} onChange={handleExperienceChange(index)} />
</div>
<button type="button" onClick={() => removeExperience(index)}>Remove</button>
</div>
))}
<button type="button" onClick={addExperience}>Add Experience</button>
<h2>Education</h2>
{education.map((edu, index) => (
<div key={index} style={{ border: '1px solid #ccc', padding: '10px', marginBottom: '10px' }}>
<h3>Education {index + 1}</h3>
<div>
<label>School:</label>
<input type="text" name="school" value={edu.school} onChange={handleEducationChange(index)} />
</div>
<div>
<label>Degree:</label>
<input type="text" name="degree" value={edu.degree} onChange={handleEducationChange(index)} />
</div>
<div>
<label>Start Date:</label>
<input type="text" name="startDate" value={edu.startDate} onChange={handleEducationChange(index)} />
</div>
<div>
<label>End Date:</label>
<input type="text" name="endDate" value={edu.endDate} onChange={handleEducationChange(index)} />
</div>
<div>
<label>Description:</label>
<textarea name="description" value={edu.description} onChange={handleEducationChange(index)} />
</div>
<button type="button" onClick={() => removeEducation(index)}>Remove</button>
</div>
))}
<button type="button" onClick={addEducation}>Add Education</button>
<h2>Skills</h2>
<div>
<label>Skills (comma-separated):</label>
<input type="text" value={skills} onChange={handleInputChange(setSkills)} />
</div>
<h2>Projects</h2>
{projects.map((project, index) => (
<div key={index} style={{ border: '1px solid #ccc', padding: '10px', marginBottom: '10px' }}>
<h3>Project {index + 1}</h3>
<div>
<label>Name:</label>
<input type="text" name="name" value={project.name} onChange={handleProjectChange(index)} />
</div>
<div>
<label>Description:</label>
<textarea name="description" value={project.description} onChange={handleProjectChange(index)} />
</div>
<button type="button" onClick={() => removeProject(index)}>Remove</button>
</div>
))}
<button type="button" onClick={addProject}>Add Project</button>
<h2>Preview</h2>
<div style={{ border: '1px solid #000', padding: '20px', marginTop: '20px' }}>
<h3>{name}</h3>
<p>Email: {email} | Phone: {phone}</p>
<h4>Summary</h4>
<p>{summary}</p>
<h4>Experience</h4>
{experience.map((exp, index) => (
<div key={index}>
<h5>{exp.position}, {exp.company}</h5>
<p>{exp.startDate} - {exp.endDate}</p>
<p>{exp.description}</p>
</div>
))}
<h4>Education</h4>
{education.map((edu, index) => (
<div key={index}>
<h5>{edu.degree}, {edu.school}</h5>
<p>{edu.startDate} - {edu.endDate}</p>
<p>{edu.description}</p>
</div>
))}
<h4>Skills</h4>
<p>{skills}</p>
<h4>Projects</h4>
{projects.map((project, index) => (
<div key={index}>
<h5>{project.name}</h5>
<p>{project.description}</p>
</div>
))}
</div>
</div>
);
};
export default ResumeBuilder;
```
👁️ Viewed: 9
Comments