1+ import * as O from 'fp-ts/Option' ;
12import { getGravatarProfile , getGravatarThumbnail } from '../../templates/avatar' ;
2- import { Html , html , sanitizeOption , sanitizeString } from '../../types/html' ;
3+ import { Html , html , joinHtml , sanitizeOption , sanitizeString } from '../../types/html' ;
34import { ViewModel } from './view-model' ;
45import {
56 renderMemberNumber ,
67 renderMemberNumbers ,
78} from '../../templates/member-number' ;
89import { memberStatusTag } from '../../templates/member-status' ;
910import { otherMemberNumbersTooltip } from '../shared-render/other-member-numbers-tooltip' ;
10- import { renderTrainingMatrix } from '../training-matrix/render' ;
11- import { renderOwnerAgreementStatus } from '../shared-render/owner-agreement' ;
11+ import { renderTrainingMatrix } from '../training-matrix/render' ;
12+ import { renderOwnerAgreementStatus } from '../shared-render/owner-agreement' ;
13+ import { MemberEmail } from '../../read-models/shared-state/return-types' ;
1214
1315const ownPageBanner = html `< h1 > This is your profile!</ h1 > ` ;
1416
@@ -27,6 +29,74 @@ const editFormOfAddress = (viewModel: ViewModel) =>
2729const editAvatar = ( ) =>
2830 html `< a href ="https://gravatar.com/profile "> Edit via Gravatar</ a > ` ;
2931
32+ const addEmail = ( memberNumber : number ) => html `
33+ < a href ="/members/add-email?member= ${ memberNumber } ">
34+ Add email
35+ </ a >
36+ ` ;
37+
38+ const renderEmailStatus = (
39+ email : MemberEmail ,
40+ primaryEmailAddress : string
41+ ) : string => {
42+ if ( email . emailAddress === primaryEmailAddress ) {
43+ return 'Primary' ;
44+ }
45+ if ( O . isSome ( email . verifiedAt ) ) {
46+ return 'Verified' ;
47+ }
48+ return 'Unverified' ;
49+ } ;
50+
51+ const renderEmails = ( viewModel : ViewModel ) : Html => {
52+ const emails = [ ...viewModel . member . emails ] . sort ( ( a , b ) => {
53+ const aIsPrimary = a . emailAddress === viewModel . member . primaryEmailAddress ;
54+ const bIsPrimary = b . emailAddress === viewModel . member . primaryEmailAddress ;
55+ if ( aIsPrimary && ! bIsPrimary ) {
56+ return - 1 ;
57+ }
58+ if ( ! aIsPrimary && bIsPrimary ) {
59+ return 1 ;
60+ }
61+ return a . emailAddress . localeCompare ( b . emailAddress ) ;
62+ } ) ;
63+
64+ return html `
65+ < div >
66+ < table >
67+ < thead >
68+ < tr >
69+ < th scope ="col "> Email</ th >
70+ < th scope ="col "> Status</ th >
71+ </ tr >
72+ </ thead >
73+ < tbody >
74+ ${ joinHtml (
75+ emails . map (
76+ email => html `
77+ < tr >
78+ < td > ${ sanitizeString ( email . emailAddress ) } </ td >
79+ < td >
80+ ${ sanitizeString (
81+ renderEmailStatus (
82+ email ,
83+ viewModel . member . primaryEmailAddress
84+ )
85+ ) }
86+ </ td >
87+ </ tr >
88+ `
89+ )
90+ ) }
91+ </ tbody >
92+ </ table >
93+ ${ viewModel . isSuperUser
94+ ? html `< p > ${ addEmail ( viewModel . member . memberNumber ) } </ p > `
95+ : html `` }
96+ </ div >
97+ ` ;
98+ } ;
99+
30100const ifSelf = ( viewModel : ViewModel , fragment : Html ) =>
31101 viewModel . isSelf ? fragment : '' ;
32102
@@ -52,8 +122,8 @@ export const render = (viewModel: ViewModel) => html`
52122 < td > ${ renderMemberNumbers ( viewModel . member . pastMemberNumbers ) } </ td >
53123 </ tr >
54124 < tr >
55- < th scope ="row "> Primary email </ th >
56- < td > ${ sanitizeString ( viewModel . member . primaryEmailAddress ) } </ td >
125+ < th scope ="row "> Email addresses </ th >
126+ < td > ${ renderEmails ( viewModel ) } </ td >
57127 </ tr >
58128 < tr >
59129 < th scope ="row ">
@@ -89,16 +159,17 @@ export const render = (viewModel: ViewModel) => html`
89159 ${ ifSelf ( viewModel , editAvatar ( ) ) }
90160 </ td >
91161 </ tr >
92- ${ viewModel . isSuperUser ? html `< tr >
93- < th scope ="row "> Owner agreement</ th >
94- < td >
95- ${ renderOwnerAgreementStatus (
96- viewModel . member . agreementSigned ,
97- true
98- ) }
99- </ td >
100- </ tr > `
101- : html `` }
162+ ${ viewModel . isSuperUser
163+ ? html `< tr >
164+ < th scope ="row "> Owner agreement</ th >
165+ < td >
166+ ${ renderOwnerAgreementStatus (
167+ viewModel . member . agreementSigned ,
168+ true
169+ ) }
170+ </ td >
171+ </ tr > `
172+ : html `` }
102173 ${ renderTrainingMatrix ( viewModel . trainingMatrix ) }
103174 </ tbody >
104175 </ table >
0 commit comments