Skip to content
Snippets Groups Projects
index.tsx 2.45 KiB
Newer Older
import { Link } from 'react-router-dom';
import { useHistory, useParams } from 'react-router';
import { useCallback, useEffect, useState } from 'react';

import { Status } from 'adapters/common';
import { getProject, Project, updateProject } from 'adapters/project';

import Callout from 'components/ui/Callout';
import ProjectForm from 'components/forms/ProjectForm';
import LoadingScreen from 'components/ui/LoadingScreen';

interface Params {
    projectId: string;
}

export default function ProjectEdit() {
    const [project, setProject] = useState<Project>();
    const [error, setError] = useState('');
    const history = useHistory();

    const { projectId } = useParams<Params>();

    useEffect(() => {
        getProject(projectId).then((project) => {
            setProject(project);
        }).catch(() => {
            history.goBack();
        });
    const handleSubmit = useCallback(async (teams: string[], name: string, text: string, color: string, status?: Status, deadline?: string) => {
            if (project) {
                let removedTeams = project.teams, addedTeams = teams;
                removedTeams.filter((teamId) => teams.indexOf(teamId) === -1);
                addedTeams.filter((teamId) => project.teams.indexOf(teamId) === -1);
                await updateProject(project.id, {
                    remove_teams: removedTeams,
                    add_teams: addedTeams,
                    name: name,
                    text, color,
                    status: status,
                    deadline: deadline?.toString()
                });
                history.push(`/projects/${project.id}`);
            }
        } catch (e) {
            setError('There was an error with updating your project. Please try again!');
        }
    }, [history, project]);
                <div className={'project-create-page theme-' + project.color}>
                    <Link className="material-icons back-btn" to={`/projects/${projectId}`} >
                    <div className="content-container">
                        <h1>Edit the project {project.name}</h1>
                        {error && <Callout message={error} />}
                        <ProjectForm onSubmit={handleSubmit} project={project} />
                    </div>
                </div>
            )
            : <LoadingScreen />
    );
}