11import React , { useState , useEffect } from 'react' ;
22import { useParams , Link as RouterLink } from 'react-router-dom' ;
33import {
4- Box , VStack , Heading , Text , Spinner , Image , HStack , Icon , Link , Button ,
5- useColorModeValue
4+ Box ,
5+ VStack ,
6+ Heading ,
7+ Text ,
8+ Spinner ,
9+ HStack ,
10+ Button ,
11+ useColorModeValue ,
12+ Avatar ,
613} from '@chakra-ui/react' ;
7- import { FaDiscord , FaLinkedin , FaEnvelope , FaArrowLeft } from 'react-icons/fa' ;
14+ import { FaArrowLeft } from 'react-icons/fa' ;
815import { memberService } from '../service/memberService' ;
916import { IMember } from '../interfaces/IMember' ;
1017import { Layout } from '../components/Layout' ;
1118import GitHubCalendar from 'react-github-calendar' ;
1219
13- 1
1420interface GHCalProps {
1521 username : string ;
1622}
@@ -20,22 +26,27 @@ const GHCal: React.FC<GHCalProps> = ({ username }) => {
2026 display : 'flex' ,
2127 justifyContent : 'center' ,
2228 alignItems : 'center' ,
23- }
29+ } ;
2430
25- const content = < GitHubCalendar username = { extractUsername ( username ) } colorScheme = 'light' />
31+ const content = (
32+ < GitHubCalendar
33+ username = { extractGithubUsername ( username ) }
34+ colorScheme = "light"
35+ />
36+ ) ;
2637
27- return (
28- < Box style = { centered } >
29- { content }
30- </ Box >
31- )
32- }
38+ return < Box style = { centered } > { content } </ Box > ;
39+ } ;
3340
34- const extractUsername = ( maybeUrl : string ) =>
35- ( maybeUrl . indexOf ( "/" ) === - 1 )
36- ? maybeUrl
37- : new URL ( maybeUrl ) . pathname . split ( '/' ) [ 1 ]
41+ const extractGithubUsername = ( maybeUrl : string ) => {
42+ if ( maybeUrl . startsWith ( 'https://' ) ) {
43+ return maybeUrl . split ( '/' ) [ 3 ] ;
44+ }
3845
46+ return maybeUrl . indexOf ( '/' ) === - 1
47+ ? maybeUrl
48+ : new URL ( `https://${ maybeUrl } ` ) . pathname . split ( '/' ) [ 1 ] ;
49+ } ;
3950
4051export const MemberDetailsPage : React . FC = ( ) => {
4152 const { id } = useParams < { id : string } > ( ) ;
@@ -66,8 +77,18 @@ export const MemberDetailsPage: React.FC = () => {
6677 fetchMember ( ) ;
6778 } , [ id ] ) ;
6879
69- if ( loading ) return < Layout > < Spinner size = "xl" /> </ Layout > ;
70- if ( error || ! member ) return < Layout > < Text color = "red.500" > { error || 'Member not found' } </ Text > </ Layout > ;
80+ if ( loading )
81+ return (
82+ < Layout >
83+ < Spinner size = "xl" />
84+ </ Layout >
85+ ) ;
86+ if ( error || ! member )
87+ return (
88+ < Layout >
89+ < Text color = "red.500" > { error || 'Member not found' } </ Text >
90+ </ Layout >
91+ ) ;
7192
7293 return (
7394 < Layout >
@@ -82,36 +103,36 @@ export const MemberDetailsPage: React.FC = () => {
82103 margin = "auto"
83104 >
84105 < VStack spacing = { 6 } align = "stretch" >
85- < Button as = { RouterLink } to = "/members" leftIcon = { < FaArrowLeft /> } alignSelf = "flex-start" >
106+ < Button
107+ as = { RouterLink }
108+ to = "/members"
109+ leftIcon = { < FaArrowLeft /> }
110+ alignSelf = "flex-start"
111+ >
86112 Back to Members
87113 </ Button >
88114 < HStack spacing = { 6 } >
89- < Image
90- borderRadius = "full "
91- boxSize = "150px"
115+ < Avatar
116+ size = "xl "
117+ name = { ` ${ member . firstName } ${ member . lastName } ` }
92118 src = { member . profilePicture }
93- alt = { `${ member . firstName } ${ member . lastName } ` }
94119 />
95120 < VStack align = "start" spacing = { 2 } >
96- < Heading size = "xl" > { member . firstName } { member . lastName } </ Heading >
97- < Text fontSize = "lg" color = "gray.500" > { member . email } </ Text >
121+ < Heading size = "xl" >
122+ { member . firstName } { member . lastName }
123+ </ Heading >
98124 </ VStack >
99125 </ HStack >
100- < GHCal username = { member . github } />
101- < HStack spacing = { 4 } >
102- < Link href = { `mailto:${ member . email } ` } isExternal >
103- < Icon as = { FaEnvelope } w = { 6 } h = { 6 } color = "gray.500" _hover = { { color : 'blue.500' } } />
104- </ Link >
105- < Link href = { `https://discord.com/users/${ member . discord } ` } isExternal >
106- < Icon as = { FaDiscord } w = { 6 } h = { 6 } color = "gray.500" _hover = { { color : 'blue.500' } } />
107- </ Link >
108- < Link href = { member . linkedin } isExternal >
109- < Icon as = { FaLinkedin } w = { 6 } h = { 6 } color = "gray.500" _hover = { { color : 'blue.500' } } />
110- </ Link >
111- </ HStack >
126+ { member . github !== '' ? (
127+ < GHCal username = { member . github } />
128+ ) : (
129+ < Text fontSize = "lg" color = "gray.500" >
130+ No GitHub calendar available
131+ </ Text >
132+ ) }
112133 { /* Add more member details here as needed */ }
113134 </ VStack >
114135 </ Box >
115136 </ Layout >
116137 ) ;
117- } ;
138+ } ;
0 commit comments