forked from YJU-OKURA/project_minori-next-deployment-repo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMaterialList.tsx
152 lines (141 loc) · 4.69 KB
/
MaterialList.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import {useEffect, useState} from 'react';
import Image from 'next/image';
import Link from 'next/link';
import {useRecoilValue, useSetRecoilState} from 'recoil';
import MaterialForm from './MaterialForm';
import deleteMaterial from '@/src/api/material/deleteMaterial';
import postPromptAccess from '@/src/api/prompts/postPromptAccess';
import materialState from '@/src/recoil/atoms/materialState';
import userState from '@/src/recoil/atoms/userState';
import {Material} from '@/src/interfaces/navbar';
import icons from '@/public/svgs/navbar';
const MaterialList = ({
materials,
cId,
}: {
materials: Material[];
cId: string;
}) => {
const [isToggleOpen, setIsToggleOpen] = useState<boolean[]>([]);
const [isOpen, setIsOpen] = useState<boolean>(false);
const [editData, setEditData] = useState<Material>();
const user = useRecoilValue(userState);
const setMaterialState = useSetRecoilState(materialState);
useEffect(() => {
setIsToggleOpen(new Array(materials.length).fill(false));
}, [materials]);
useEffect(() => {
if (typeof window !== 'undefined') {
document.addEventListener('click', handleOutsideClick);
return () => {
document.removeEventListener('click', handleOutsideClick);
};
}
}, []);
const handleOutsideClick = (event: MouseEvent) => {
const modalContainer = document.getElementById('modal-container');
const moreHorizIcon = document.getElementById('more-horiz-icon');
if (
modalContainer &&
!modalContainer.contains(event.target as Node) &&
moreHorizIcon !== event.target
) {
closeDropdown();
}
};
const handleClickSubject = (mId: number) => {
const material = materials.find(material => material.id === String(mId));
if (material?.prompts.length === 0 && cId) {
postPromptAccess(parseInt(cId), mId).then(res => {
setMaterialState({
...material,
prompts: [...(material?.prompts || []), {id: res}],
});
});
}
};
const toggleDropdown = (index: number) => {
setIsToggleOpen(prev =>
prev.map((open, i) => (i === index ? !open : false))
);
};
const closeDropdown = () => {
setIsToggleOpen(prev => prev.map(() => false));
};
const handleMaterialDelete = (mId: number) => {
if (cId) {
deleteMaterial(parseInt(cId), mId);
location.reload();
}
};
return (
<div>
<ul>
{materials.map((material, index) => {
return (
<li className="relative flex mb-2 py-1 items-center" key={index}>
<Image
src={icons.book}
alt="prompt"
width={30}
height={30}
className="mr-3"
></Image>
<div className="flex w-full items-center justify-between">
<div onClick={() => handleClickSubject(parseInt(material.id))}>
<Link href={`/classes/${cId}/${material.name}`}>
<div
className="min-h-[30px] flex items-center"
onClick={() => setMaterialState(material)}
>
{material.name}
</div>
</Link>
</div>
{user.role_id === 'ADMIN' ? (
<Image
src={icons.moreHoriz}
alt="icon"
width={30}
height={30}
onClick={() => toggleDropdown(index)}
id="more-horiz-icon"
></Image>
) : null}
</div>
{isToggleOpen[index] ? (
<div
className="absolute top-[32px] right-0 z-20 bg-white rounded-lg overflow-hidden drop-shadow-lg"
id="modal-container"
>
<div
className="p-2 hover:bg-gray-200"
onClick={() => {
setEditData(material);
setIsOpen(true);
setIsToggleOpen(prev => prev.map(() => false));
}}
>
Edit Material
</div>
<div
className="p-2 hover:bg-gray-200"
onClick={() => {
handleMaterialDelete(parseInt(material.id));
}}
>
Delete
</div>
</div>
) : null}
</li>
);
})}
{isOpen && cId ? (
<MaterialForm setIsOpen={setIsOpen} editData={editData} cId={cId} />
) : null}
</ul>
</div>
);
};
export default MaterialList;