このリポジトリは2023-09-09にアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュ、イシューの作成、プルリクエストはできません。
kikikan/backend/resources/js/parent/meeting/index.jsx

338 行
18 KiB
React
Raw 通常表示 履歴

2021-12-18 16:05:52 +09:00
import React, { useRef, useEffect, useState } from 'react';
2021-11-13 02:52:21 +09:00
import axios from 'axios';
import { useHistory, Link } from 'react-router-dom';
import moment from 'moment';
import Notification from '../notification';
import Alert from '../../component/alert';
2021-12-22 05:32:06 +09:00
import PageLoader from '../../component/page_loader';
2021-11-13 02:52:21 +09:00
import InfiniteScroll from "react-infinite-scroll-component";
2021-12-22 05:32:06 +09:00
2021-11-13 02:52:21 +09:00
2021-11-18 16:46:31 +09:00
const INFINITE = 10;
2021-11-13 02:52:21 +09:00
const SCROLL_DELAY_TIME = 1500;
2021-11-16 22:19:56 +09:00
const Meeting = (props) => {
2021-11-13 02:52:21 +09:00
2021-11-14 21:22:30 +09:00
const [notice, setNotice] = useState(localStorage.getItem('notice'));
2021-11-13 02:52:21 +09:00
const [tab_status, setTabStatus] = useState(false);
const [loaded, setLoaded] = useState(false);
const [loaded1, setLoaded1] = useState(false);
const [loaded2, setLoaded2] = useState(false);
2021-11-16 23:32:58 +09:00
const [meeting_list_incomplete, setMeetingListOfIncomplete] = useState([]);
const [meeting_list_complete, setMeetingListOfComplete] = useState([]);
const [fetch_meeting_list_incomplete, setFetchMeetingListOfIncomplete] = useState([]);
const [fetch_meeting_list_complete, setFetchMeetingListOfComplete] = useState([]);
2021-11-17 21:07:34 +09:00
const [_success, setSuccess] = useState(props.history.location?.state);
2021-11-18 12:34:24 +09:00
const [_400error, set400Error] = useState('');
2021-11-13 02:52:21 +09:00
2021-12-18 16:05:52 +09:00
const isMountedRef = useRef(true);
2021-11-13 02:52:21 +09:00
useEffect(()=>{
2021-11-16 23:32:58 +09:00
if(localStorage.getItem("from_login")){
setSuccess("ログインに成功しました!");
localStorage.removeItem("from_login");
}
var navbar_list = document.getElementsByClassName("mypage-nav-list__item");
for(let i=0; i<navbar_list.length; i++)
navbar_list[i].classList.remove('nav-active');
document.getElementsByClassName("-meeting")[0].classList.add('nav-active');
2021-11-13 02:52:21 +09:00
},[]);
useEffect(()=>{
setLoaded(loaded1 && loaded2);
},[loaded1, loaded2])
2021-11-14 21:22:30 +09:00
useEffect(() => {
2021-12-18 16:05:52 +09:00
isMountedRef.current = false;
2021-11-14 21:22:30 +09:00
setLoaded(false);
let father_id = document.getElementById('father_id').value;
if(localStorage.getItem('flag')=="true") return;
axios.get('/api/fathers/meetings/listOfIncompleteOfFather', {params:{father_id: father_id}})
.then(response => {
setLoaded1(true);
2021-11-14 22:13:34 +09:00
setNotice(response.data.notice);
2021-11-14 21:22:30 +09:00
if(response.data.status_code==200){
var list = response.data.params;
var arr = [];
for(var i in list){
var total=0, num=0;
2021-11-16 10:29:32 +09:00
for(var j in list[i].approvals)
2021-11-14 21:22:30 +09:00
{
2021-11-16 10:29:32 +09:00
if(list[i].approvals[j].approval_at) num ++;
2021-11-14 21:22:30 +09:00
total ++;
}
arr.push({...list[i], denominator:total, numerator:num})
2021-11-13 02:52:21 +09:00
}
2021-11-16 23:32:58 +09:00
setMeetingListOfIncomplete(arr);
2021-11-14 21:22:30 +09:00
var len = arr.length;
if(len > INFINITE)
2021-11-16 23:32:58 +09:00
setFetchMeetingListOfIncomplete(arr.slice(0, INFINITE));
else setFetchMeetingListOfIncomplete(arr.slice(0, len));
2021-11-14 21:22:30 +09:00
}
})
axios.get('/api/fathers/meetings/listOfCompleteOfFather', {params:{father_id: father_id}})
.then(response => {
setLoaded2(true);
2021-11-14 22:13:34 +09:00
setNotice(response.data.notice);
2021-11-14 21:22:30 +09:00
if(response.data.status_code==200){
var list = response.data.params;
var arr = [];
for(var i in list){
var total=0, num=0;
2021-11-16 10:29:32 +09:00
for(var j in list[i].approvals)
2021-11-14 21:22:30 +09:00
{
2021-11-16 10:29:32 +09:00
if(list[i].approvals[j].approval_at) num ++;
2021-11-14 21:22:30 +09:00
total ++;
}
arr.push({...list[i], denominator:total, numerator:num})
}
2021-11-16 23:32:58 +09:00
setMeetingListOfComplete(arr);
2021-11-14 21:22:30 +09:00
var len = arr.length;
if(len > INFINITE)
2021-11-16 23:32:58 +09:00
setFetchMeetingListOfComplete(arr.slice(0, INFINITE));
else setFetchMeetingListOfComplete(arr.slice(0, len));
2021-11-14 21:22:30 +09:00
}
})
},[]);
2021-11-13 02:52:21 +09:00
const fetchMoreListNonApproval = () => {
setTimeout(() => {
2021-11-13 20:17:15 +09:00
var x = fetch_meeting_list_incomplete.length;
var y = meeting_list_incomplete.length;
2021-11-13 02:52:21 +09:00
var c = 0;
if(x+INFINITE < y) c = INFINITE;
else c = y - x;
2021-11-16 23:32:58 +09:00
setFetchMeetingListOfIncomplete(meeting_list_incomplete.slice(0, x+c));
2021-11-13 02:52:21 +09:00
}, SCROLL_DELAY_TIME);
};
const fetchMoreListApproval = () => {
setTimeout(() => {
2021-11-13 20:17:15 +09:00
var x = fetch_meeting_list_complete.length;
var y = meeting_list_complete.length;
2021-11-13 02:52:21 +09:00
var c = 0;
if(x+INFINITE < y) c = INFINITE;
else c = y - x;
2021-11-16 23:32:58 +09:00
setFetchMeetingListOfComplete(meeting_list_complete.slice(0, x+c));
2021-11-13 02:52:21 +09:00
}, SCROLL_DELAY_TIME);
};
2021-11-18 20:09:44 +09:00
const handleFavorite = (meetingId, currentFavorite, stateName) => {
2021-11-13 20:17:15 +09:00
const formdata = new FormData();
formdata.append('meeting_id', meetingId);
formdata.append('is_favorite', currentFavorite == 1 ? 0 : 1);
axios.post('/api/fathers/meetings/registerFavorite', formdata)
2021-11-18 20:09:44 +09:00
.then(response=>{ setNotice(response.data.notice)});
if(stateName == "inCompleteOfFather") {
const newList1 = meeting_list_incomplete.map((item) => {
if (item.id === meetingId) {
const updatedItem = {
...item,
is_favorite: item.is_favorite == 1 ? 0 : 1,
};
return updatedItem;
}
return item;
});
setMeetingListOfIncomplete(newList1);
setFetchMeetingListOfIncomplete(newList1.slice(0, fetch_meeting_list_incomplete.length));
} else {
const newList2 = meeting_list_complete.map((item) => {
if (item.id === meetingId) {
const updatedItem = {
...item,
is_favorite: item.is_favorite == 1 ? 0 : 1,
};
return updatedItem;
}
return item;
});
setMeetingListOfComplete(newList2);
setFetchMeetingListOfComplete(newList2.slice(0, fetch_meeting_list_complete.length));
}
2021-11-13 20:17:15 +09:00
};
2021-11-13 02:52:21 +09:00
return (
<div className="l-content">
<div className="l-content__ttl">
<div className="l-content__ttl__left">
<h2>ミーティング一覧</h2>
<div className="p-meetingAdd-btn">
2021-11-13 20:17:15 +09:00
<Link to = '/p-account/meeting/new' data-v-ade1d018="kikikanri"
2021-11-13 02:52:21 +09:00
className="btn-default btn-yellow btn-meeting btn-shadow btn-r8 btn-h48 btn-fz14">
2021-11-25 21:15:28 +09:00
<span className="ft-16">ミーティングを追加</span>
2021-11-13 02:52:21 +09:00
<svg version="1.1" viewBox="0 0 500 500" className="icon svg-icon svg-fill svg-up">
<path fill="#000" stroke="none" pid="0" d="M250 437.6c-16.5 0-30-13.5-30-30V280.1H92.5c-16.5 0-30-13.5-30-30s13.5-30 30-30H220V92.6c0-16.5 13.5-30 30-30s30 13.5 30 30v127.5h127.5c16.5 0 30 13.5 30 30s-13.5 30-30 30H280v127.5c0 16.5-13.5 30-30 30z"></path>
</svg>
</Link>
2021-10-05 00:35:47 +09:00
</div>
2021-10-01 17:45:39 +09:00
</div>
2021-11-13 02:52:21 +09:00
<Notification notice={notice}/>
</div>
2021-10-05 00:35:47 +09:00
2021-11-13 02:52:21 +09:00
<div className="l-content-wrap">
<section className="meeting-tab-container">
<div className="meeting-tab-wrap">
<div className="meeting-head">
<input className="tab-switch" id="tab-01" type="radio" name="tab_btn"/>
<input className="tab-switch" id="tab-02" type="radio" name="tab_btn"/>
<div className="meeting-tab">
2021-11-13 20:17:15 +09:00
<label className={`tab-label ${!tab_status && 'is-active'} `} htmlFor="tab-01" onClick={()=>setTabStatus(false)}><span>未完了</span></label>
<label className={`tab-label ${ tab_status && 'is-active'} `} htmlFor="tab-02" onClick={()=>setTabStatus(true)}><span>完了済み</span></label>
2021-11-13 02:52:21 +09:00
</div>
</div>
</div>
{
2021-12-22 05:32:06 +09:00
!loaded && <PageLoader/>
2021-11-13 02:52:21 +09:00
}
{
loaded &&
<div className="meeting-content">
{
!tab_status &&
<div className="meeting-content-wrap is-active" id="item01">
<InfiniteScroll
2021-11-13 20:17:15 +09:00
dataLength={fetch_meeting_list_incomplete.length}
2021-11-13 02:52:21 +09:00
next={fetchMoreListNonApproval}
2021-11-13 20:17:15 +09:00
hasMore={fetch_meeting_list_incomplete.length != meeting_list_incomplete.length}
2021-11-13 02:52:21 +09:00
loader={
<div id="dots3">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
}
style={{overflow:'none', position:'relative'}}
>
{
2021-11-13 20:17:15 +09:00
fetch_meeting_list_incomplete.length > 0 ?
fetch_meeting_list_incomplete?.map((item, id) =>
<div className="meeting-item" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
<time dateTime="2021-07-30" className="meeting-time">
<span className="meeting-date">{ moment(item.updated_at).format('YYYY/MM/DD') }</span>
</time>
<div className="meeting-member">
<div className="meeting-member-wrap">
<div data-url="login.html" className="meeting-member-link">
<ul className="meeting-member-count">
2021-11-14 21:22:30 +09:00
<li className="numerator">{item.numerator}</li>
<li className="denominator">{item.denominator}</li>
2021-11-13 20:17:15 +09:00
</ul>
2021-11-14 21:22:30 +09:00
<ul className="meeting-member-list" role="list">
2021-11-13 20:17:15 +09:00
{
item.approvals?.map((v, inx1) =>
{
if(v.approval_at)
return(
2021-11-13 20:17:15 +09:00
<li className="meeting-member__item" role="listitem" key={inx1}>
<div className="avatar">
<img alt="name" className="avatar-img" src={v?.child.image} />
</div>
</li>)
})
2021-11-13 20:17:15 +09:00
}
2021-11-14 21:22:30 +09:00
</ul>
2021-11-13 20:17:15 +09:00
</div>
</div>
</div>
</Link>
<button aria-label="お気に入り" data-tooltip="お気に入り"
2021-11-17 00:33:14 +09:00
onClick={e => handleFavorite(item.id, item.is_favorite, 'inCompleteOfFather')}
2021-11-13 20:17:15 +09:00
className={`icon a-icon like-icon ${item.is_favorite == 1 ? "icon-starFill" : "icon-star"} a-icon-size_medium`}>
</button>
</div>
2021-11-13 02:52:21 +09:00
)
: <p className="text-center py-5 ft-xs-17">データはありません</p>
}
</InfiniteScroll>
</div>
}
{
tab_status &&
<div className="meeting-content-wrap is-active" id="item02">
<InfiniteScroll
2021-11-13 20:17:15 +09:00
dataLength={fetch_meeting_list_complete.length}
2021-11-13 02:52:21 +09:00
next={fetchMoreListApproval}
2021-11-13 20:17:15 +09:00
hasMore={fetch_meeting_list_complete.length != meeting_list_complete.length}
2021-11-13 02:52:21 +09:00
loader={
<div id="dots3">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
}
style={{overflow:'none', position:'relative'}}
>
{
2021-11-13 20:17:15 +09:00
fetch_meeting_list_complete.length > 0 ?
fetch_meeting_list_complete?.map((item, id) =>
<div className="meeting-item" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
<time dateTime="2021-07-30" className="meeting-time">
<span className="meeting-date">{ moment(item.updated_at).format('YYYY/MM/DD') }</span>
</time>
<div className="meeting-member">
<div className="meeting-member-wrap">
<div data-url="login.html" className="meeting-member-link">
<ul className="meeting-member-count">
2021-11-14 21:22:30 +09:00
<li className="numerator">{item.numerator}</li>
<li className="denominator">{item.denominator}</li>
2021-11-13 20:17:15 +09:00
</ul>
<ul className="meeting-member-list" role="list">
{
2021-11-16 10:29:32 +09:00
item.approvals?.map((v, inx1) =>
{
if(v.approval_at)
return(
2021-11-13 20:17:15 +09:00
<li className="meeting-member__item" role="listitem" key={inx1}>
<div className="avatar">
<img alt="name" className="avatar-img" src={v?.child.image} />
</div>
</li>)
})
2021-11-13 20:17:15 +09:00
}
</ul>
</div>
2021-11-13 02:52:21 +09:00
</div>
2021-11-13 20:17:15 +09:00
</div>
</Link>
<button aria-label="お気に入り" data-tooltip="お気に入り"
2021-11-17 00:33:14 +09:00
onClick={e => handleFavorite(item.id, item.is_favorite, 'completeOfFather')}
2021-11-13 20:17:15 +09:00
className={`icon a-icon like-icon ${item.is_favorite == 1 ? "icon-starFill" : "icon-star"} a-icon-size_medium`}>
</button>
</div>
)
2021-11-13 02:52:21 +09:00
: <p className="text-center py-5 ft-xs-17">データはありません</p>
}
</InfiniteScroll>
</div>
}
</div>
}
</section>
2021-10-01 17:45:39 +09:00
</div>
2021-11-18 12:34:24 +09:00
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
</div>
2021-11-13 02:52:21 +09:00
)
2021-10-01 17:45:39 +09:00
}
2021-11-13 02:52:21 +09:00
export default Meeting;