1
+ import React , { useEffect , useState } from 'react' ;
2
+ import { RouteComponentProps } from 'react-router' ;
3
+ import Helmet from 'react-helmet' ;
4
+ import DefaultNavbar from '../parts/Navbar/DefaultNavbar' ;
5
+ import ArticleListing from '../parts/ArticleListing/ArticleListing' ;
6
+
7
+ import { getArticlesListing , getUserDataByUsername } from '../parts/ApiCaller/ApiCaller' ;
8
+ import { IGetArticleListData } from '../parts/ApiCaller/ApiCaller.d' ;
9
+ import { sortArticleListingByCreated } from '../util' ;
10
+ import { metaTitleTags , metaDescriptionTags , metaKeywordsTag } from '../metaUtils' ;
11
+
12
+ import { defaultTheme as theme } from '../style/themes' ;
13
+
14
+ const defaultPageStyle = {
15
+ marginTop : theme . navbarHeight + theme . topBottomMargin ,
16
+ marginBottom : theme . topBottomMargin
17
+ } ;
18
+
19
+ const META_KEYWORDS = [ 'user' ] ;
20
+
21
+ interface IUserPageMatchParams {
22
+ username : string ;
23
+ }
24
+
25
+ interface IUserPageProps extends RouteComponentProps < IUserPageMatchParams > { }
26
+
27
+ export default function UserPage ( props : IUserPageProps ) {
28
+ const { username } = props . match . params ;
29
+ const [ articles , setArticles ] = useState ( [ ] as IGetArticleListData [ ] ) ;
30
+ const [ userDisplayName , setUserDisplayName ] = useState ( "" ) ;
31
+ const [ errMessage , setErrMessage ] = useState ( "" ) ;
32
+
33
+ // Article Listing
34
+ useEffect ( ( ) => {
35
+ getArticlesListing ( { authorUsername : username } )
36
+ . then ( ( { data : resData } ) => {
37
+ let articleListData = sortArticleListingByCreated ( resData . data ) ;
38
+ let err = resData . err ;
39
+ if ( err ) {
40
+ return setErrMessage ( "getArticlesListing:" + err ) ;
41
+ }
42
+ setArticles ( articleListData ) ;
43
+ } )
44
+ . catch ( err => setErrMessage ( "getArticlesListing:" + err . message ) ) ;
45
+ } , [ username ] ) ;
46
+
47
+ // User Data
48
+ useEffect ( ( ) => {
49
+ getUserDataByUsername ( username )
50
+ . then ( ( { data : resData } ) => {
51
+ const userData = resData . data ;
52
+ const err = resData . err ;
53
+ if ( err ) {
54
+ return setErrMessage ( "getUserDataByUsername:" + err ) ;
55
+ }
56
+ setUserDisplayName ( userData . userDisplayName ) ;
57
+ //setUserDisplayName(userData.)
58
+ } )
59
+ . catch ( err => setErrMessage ( "getUserDataByUsername:" + err . message ) ) ;
60
+ } , [ username ] ) ;
61
+
62
+ const helmet = (
63
+ < Helmet >
64
+ { metaTitleTags ( userDisplayName ) }
65
+ { metaDescriptionTags ( `User profile of ${ userDisplayName } .` ) }
66
+ { metaKeywordsTag ( META_KEYWORDS ) }
67
+ </ Helmet >
68
+ ) ;
69
+
70
+ function userPageRender ( body : any ) {
71
+ return (
72
+ < div className = "user-page" style = { defaultPageStyle } >
73
+ { helmet }
74
+ < DefaultNavbar />
75
+ < p > { errMessage } </ p >
76
+ < h1 className = "user-page__title" style = { theme . articleTitleStyle } >
77
+ { userDisplayName }
78
+ </ h1 >
79
+ { body }
80
+ </ div >
81
+ )
82
+ }
83
+
84
+ // NO ARTICLES (yet)
85
+ if ( articles . length === 0 ) {
86
+ return userPageRender ( (
87
+ < p > (No Articles)</ p >
88
+ ) ) ;
89
+ }
90
+
91
+ // ARTICLES FOUND
92
+ return userPageRender ( (
93
+ < ArticleListing articlesListData = { articles } />
94
+ ) )
95
+ }
0 commit comments