daddy/client/src/components/HomePage/WorkgroupsPanel.tsx

98 lines
3.2 KiB
TypeScript
Raw Normal View History

import React, { useEffect, useState } from 'react';
import { Workgroup } from '../../types/workgroup';
import { User } from '../../types/user';
import { Link } from 'react-router-dom';
2020-07-21 22:25:39 +02:00
import { useWorkgroupsQuery } from '../../gql/queries/workgroups';
import { useUserProfileQuery } from '../../gql/queries/profile';
2020-07-22 09:18:50 +02:00
import { WithLoader } from '../WithLoader';
export function WorkgroupsPanel() {
2020-07-21 22:25:39 +02:00
const workgroupsQuery = useWorkgroupsQuery();
const userProfileQuery = useUserProfileQuery();
const [ state, setState ] = useState({ selectedTab: 0 });
const isLoading = userProfileQuery.loading || workgroupsQuery.loading;
2020-07-22 09:18:50 +02:00
const { userProfile } = (userProfileQuery.data || {});
const { workgroups } = (workgroupsQuery.data || {});
const filterTabs = [
{
2020-07-23 08:25:19 +02:00
label: "Mes groupes en cours",
2020-07-21 22:25:39 +02:00
filter: workgroups => workgroups.filter((wg: Workgroup) => {
2020-07-23 08:25:19 +02:00
return wg.closedAt === null && wg.members.some((u: User) => u.id === (userProfile ? userProfile.id : ''));
})
},
{
label: "Ouverts",
2020-07-21 22:25:39 +02:00
filter: workgroups => workgroups.filter((wg: Workgroup) => !wg.closedAt)
},
{
2020-07-23 08:25:19 +02:00
label: "Clos",
2020-07-21 22:25:39 +02:00
filter: workgroups => workgroups.filter((wg: Workgroup) => !!wg.closedAt)
}
];
const selectTab = (tabIndex: number) => {
setState(state => ({ ...state, selectedTab: tabIndex }));
};
2020-07-21 22:25:39 +02:00
let workgroupsItems = [];
2020-07-22 09:18:50 +02:00
workgroupsItems = filterTabs[state.selectedTab].filter(workgroups || []).map((wg: Workgroup) => {
return (
<Link to={`/workgroups/${wg.id}`} key={`wg-${wg.id}`} className="panel-block">
<span className="panel-icon">
<i className="fas fa-users" aria-hidden="true"></i>
</span>
{wg.name}
</Link>
);
2020-07-21 22:25:39 +02:00
});
return (
<nav className="panel is-info">
<div className="level panel-heading mb-0">
<div className="level-left">
<p className="level-item">
Groupes de travail
</p>
</div>
<div className="level-right">
2020-07-22 09:18:50 +02:00
<Link to="/workgroups/new" className="button level-item is-outlined is-info is-inverted">
<i className="icon fa fa-plus"></i>
</Link>
</div>
</div>
{/* <div className="panel-block">
<p className="control has-icons-left">
<input className="input" type="text" placeholder="Filtrer..." />
<span className="icon is-left">
<i className="fas fa-search" aria-hidden="true"></i>
</span>
</p>
</div> */}
2020-07-22 09:18:50 +02:00
<WithLoader loading={isLoading}>
<p className="panel-tabs">
{
filterTabs.map((tab, i) => {
return (
<a key={`workgroup-tab-${i}`}
onClick={selectTab.bind(null, i)}
className={i === state.selectedTab ? 'is-active' : ''}>
{tab.label}
</a>
)
})
}
</p>
{
2020-07-22 09:18:50 +02:00
workgroupsItems.length > 0 ?
workgroupsItems :
<a className="panel-block has-text-centered is-block">
<em>Aucun groupe dans cet catégorie pour l'instant.</em>
</a>
}
2020-07-22 09:18:50 +02:00
</WithLoader>
</nav>
)
}