1
1
'use client'
2
- import { dataset } from "@/sanity/env" ;
3
2
import localFont from "next/font/local"
4
3
import Slider from "react-slick" ;
5
4
import "../globals.css" ;
6
5
import "slick-carousel/slick/slick.css" ;
7
6
import "slick-carousel/slick/slick-theme.css" ;
8
- import { useState } from 'react'
9
-
7
+ import { useState , useEffect } from 'react'
8
+ import { client } from "@/sanity/lib/client" ;
9
+ import { urlForImage } from "@/sanity/lib/image" ;
10
10
11
11
const fabulous = localFont ( {
12
12
src : '../static-fonts/fabulous.otf' ,
13
13
display : 'swap' ,
14
14
} )
15
15
16
- export default function about ( ) {
16
+ async function getMembers ( ) {
17
+
18
+ const query = `*[_type == "members"] {
19
+ name,
20
+ title,
21
+ class,
22
+ major,
23
+ image,
24
+ }`
25
+
26
+ const members = await client . fetch ( query )
27
+ return members ;
28
+ }
29
+
30
+ function BoardMembersBlock ( ) {
31
+ const [ members , setMembers ] = useState ( [ ] ) ;
32
+
17
33
const settings = {
18
34
dots : true ,
19
35
infinite : true ,
@@ -23,6 +39,48 @@ export default function about() {
23
39
prevArrow : < SamplePrevArrow />
24
40
}
25
41
42
+ useEffect ( ( ) => {
43
+ async function fetchMembers ( ) {
44
+ const fetchedMembers = await getMembers ( ) ;
45
+ setMembers ( fetchedMembers ) ;
46
+ }
47
+
48
+ fetchMembers ( ) ;
49
+ } , [ ] ) ;
50
+
51
+ const allMembers = [ ...members ] ;
52
+
53
+ return (
54
+ < Slider { ...settings } >
55
+ { allMembers . map ( ( d ) => (
56
+ < div className = "mt-2 sm:mt-8 flex" >
57
+
58
+ { /* Headshot */ }
59
+ < div className = "mt-1 justify-end flex headshot" >
60
+ < div className = "w-1 h-20 sm:h-44 sm:w-2 bg-[#43B697]" > </ div >
61
+ < div className = "w-1 h-20 sm:h-44 sm:w-2 bg-[#282828]" > </ div >
62
+ { /* Image */ }
63
+ < img src = { urlForImage ( d . image ) } alt = "" className = "h-20 w-20 sm:h-44 sm:w-44 border border-white" />
64
+ </ div >
65
+
66
+ { /* Board Member Information */ }
67
+ < div className = "flex member-info text-white" >
68
+ < div className = "sm:mt-5 flex flex-col items-center" >
69
+ < h1 className = "sm:text-xl md:text-2xl" > { d . name } </ h1 >
70
+ < div className = "w-auto sm:h-3 bg-[#282828]" > </ div >
71
+ < h1 className = "text-base sm:text-xl font-light" > { d . title } </ h1 >
72
+ < h1 className = "text-base sm:text-xl font-light" > { d . class } </ h1 >
73
+ < h1 className = "text-base sm:text-xl font-light" > { d . major } </ h1 >
74
+ < div className = "w-auto h-8 sm:h-20 bg-[#282828]" > </ div >
75
+ </ div >
76
+ </ div >
77
+ </ div >
78
+ ) ) }
79
+ </ Slider >
80
+ ) ;
81
+ }
82
+
83
+ export default function about ( ) {
26
84
const [ selected , setSelected ] = useState ( null )
27
85
28
86
const toggle = ( i ) => {
@@ -46,30 +104,27 @@ export default function about() {
46
104
{ /* IMAGES */ }
47
105
{ /* Left 1/3 image layout */ }
48
106
< div className = "w-2/5 bg-black-200" >
49
- < div className = "flex-col " >
107
+ < div className = "grid grid-cols-1 sm:grid-cols-2 items-center " >
50
108
51
- { /* Left half images */ }
52
- < div className = "w-1/2" >
53
- { /* Full-size image */ }
54
- < img className = "h-auto w-full" src = "/about images/About1.jpeg" alt = "Image 1" />
55
- </ div >
109
+ { /* Full size image */ }
110
+ < img className = "w-3/4 h-auto sm:w-full ml-2 mt-8" src = "/about images/About1.jpeg" alt = "Image 1" />
56
111
57
- { /* Right half images */ }
58
- < div className = "w-1/2 flex flex-col" >
59
- < div className = "bg-black-200 p-8" > </ div >
112
+ < div className = "flex-col" >
113
+ < div className = "bg-black-200" > </ div >
60
114
{ /* First half-size image */ }
61
- < img className = "h-auto w-3/4 mb-4 mx-5" src = "/about images/About2.jpeg" alt = "Image 2" />
115
+ < div className = "bg-black-200 mb-4 sm:h-20" > </ div >
116
+ < img className = "h-auto w-3/4 ml-2 mb-4 sm:mx-5" src = "/about images/About2.jpeg" alt = "Image 2" />
62
117
63
118
{ /* Second half-size image */ }
64
- < img className = "h-auto w-full mx-5" src = "/about images/About3.jpeg" alt = "Image 3" />
119
+ < img className = "w-3/4 h-auto ml-2 sm: w-full sm: mx-5" src = "/about images/About3.jpeg" alt = "Image 3" />
65
120
</ div >
66
121
67
122
</ div >
68
123
</ div >
69
124
70
125
{ /* WHO ARE WE - TEXT CONTENT */ }
71
- < div className = "flex justify-end sm:pr-8 w-2/3" >
72
- < div className = "w-5/6 sm:w-4/5" >
126
+ < div className = "flex justify-center pr-5 sm:pr-8 w-2/3" >
127
+ < div className = "sm:w-4/5" >
73
128
< div className = "bg-black-200 p-4 mt-5 sm:mt-20" >
74
129
{ /* Green line */ }
75
130
< div className = "w-1/2 h-2 bg-[#43B697]" > </ div >
@@ -84,7 +139,7 @@ export default function about() {
84
139
</ div >
85
140
</ div >
86
141
</ div >
87
- < div className = "h-8 sm: h-16" > </ div >
142
+ < div className = "h-8 sm:h-16" > </ div >
88
143
89
144
{ /* BOARD MEMBERS SLIDER */ }
90
145
< div className = "latest-events" >
@@ -94,37 +149,12 @@ export default function about() {
94
149
95
150
< div className = "w-3/4 m-auto" >
96
151
< div >
97
- < Slider { ...settings } >
98
- { members . map ( ( d ) => (
99
- < div className = "mt-2 sm:mt-8 flex" >
100
-
101
- { /* Headshot */ }
102
- < div className = "mt-1 justify-end flex headshot" >
103
- < div className = "w-1 h-20 sm:h-44 sm:w-2 bg-[#43B697]" > </ div >
104
- < div className = "w-1 h-20 sm:h-44 sm:w-2 bg-[#282828]" > </ div >
105
- { /* Image */ }
106
- < img src = { d . img } alt = "" className = "h-20 w-20 sm:h-44 sm:w-44 border border-white" />
107
- </ div >
108
-
109
- { /* Board Member Information */ }
110
- < div className = "flex member-info text-white" >
111
- < div className = "sm:mt-5 flex flex-col items-center" >
112
- < h1 className = "sm:text-xl md:text-2xl" > { d . name } </ h1 >
113
- < div className = "w-auto sm:h-3 bg-[#282828]" > </ div >
114
- < h1 className = "text-base sm:text-xl font-light" > { d . title } </ h1 >
115
- < h1 className = "text-base sm:text-xl font-light" > { d . class } </ h1 >
116
- < h1 className = "text-base sm:text-xl font-light" > { d . major } </ h1 >
117
- < div className = "w-auto h-8 sm:h-20 bg-[#282828]" > </ div >
118
- </ div >
119
- </ div >
120
- </ div >
121
- ) ) }
122
- </ Slider >
152
+ < BoardMembersBlock />
123
153
</ div >
124
154
</ div >
125
155
126
156
</ div >
127
- < div className = "h-8 sm: h-16" > </ div >
157
+ < div className = "h-8 sm:h-16" > </ div >
128
158
129
159
{ /* FAQS section */ }
130
160
< div className = { fabulous . className } >
@@ -152,51 +182,11 @@ export default function about() {
152
182
</ div >
153
183
< div className = "h-10" > </ div >
154
184
</ div >
155
- /*
156
- <div className="flex">
157
- <div className = "flex left-wrapper">
158
- <div className = "accordian">
159
-
160
- {left_questions.map((item, i) => (
161
- <div className="item">
162
- <div className = "title" onClick={() => toggle(i)}>
163
- <h2>{item.question}</h2>
164
- <span>{selected === i ? '-' : '+'}</span>
165
- </div>
166
-
167
- <div className = {selected === i ? 'content-show font-light' : 'content'}>
168
- {item.answer}
169
- </div>
170
- </div>
171
- ))}
172
-
173
- </div>
174
- </div>
175
-
176
- <div className = "flex right-wrapper">
177
- <div className = "accordian">
178
-
179
- {right_questions.map((item, i) => (
180
- <div className="item">
181
- <div className = "title" onClick={() => toggle(i)}>
182
- <h2>{item.question}</h2>
183
- <span>{selected === i ? '-' : '+'}</span>
184
- </div>
185
-
186
- <div className = {selected === i ? 'content-show font-light' : 'content'}>
187
- {item.answer}
188
- </div>
189
- </div>
190
- ))}
191
-
192
- </div>
193
- </div>
194
- */
195
185
) ;
196
186
}
197
187
198
188
{ /* BOARD MEMBERS AND HEADSHOTS */ }
199
- const members = [
189
+ const membersmap = [
200
190
{
201
191
name : 'Amy (she/they)' ,
202
192
title : 'President' ,
@@ -262,30 +252,6 @@ const questions = [
262
252
}
263
253
] ;
264
254
265
- { /* LEFT COLUMN QUESTIONS - NOT USED */ }
266
- const left_questions = [
267
- {
268
- question : 'Does Mesh have office hours?' ,
269
- answer : 'Yes. Come to MESH Office Hours every Friday 5-7PM in the MILL!' ,
270
- } ,
271
- {
272
- question : 'How competitive is it to get into Mesh?' ,
273
- answer : 'Answer to Question 3.' ,
274
- } ,
275
- ] ;
276
-
277
- { /* RIGHT COLUMN QUESTIONS - NOT USED */ }
278
- const right_questions = [
279
- {
280
- question : 'When’s the quarterly meeting?' ,
281
- answer : 'Answer to Question 2.' ,
282
- } ,
283
- {
284
- question : 'Where can I find the application form?' ,
285
- answer : 'Answer to Question 4.' ,
286
- }
287
- ] ;
288
-
289
255
{ /* CUSTOM ARROWS */ }
290
256
function SampleNextArrow ( props ) {
291
257
const { className, style, onClick } = props ;
@@ -308,3 +274,5 @@ function SamplePrevArrow(props) {
308
274
/>
309
275
) ;
310
276
}
277
+
278
+
0 commit comments