(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9221],{75982:function(e,t,a){"use strict";a.d(t,{Z:function(){return w}});var r=a(67294),n=a(32020),s=a(87207),i=a(97130),c=a(34378),o=a(14527),l=a(48912),u=a(66674),m=a(27324),d=a(84278),p=a(62429),h=a(32632),g=a(20778);const b=({applyForMembership:e,clubId:t,hasLoaded:a,isLoading:n,isSubmitting:s,loadNetworkPanelData:i,memberId:l,pendingApplication:u})=>((0,r.useEffect)((()=>{n||a||i(t)}),[]),n?r.createElement(r.Fragment,null,r.createElement(g.Z,{isLoading:!0}),r.createElement(o.Z,{preset:"body--small",color:"dustygrey"},r.createElement(m.cC,{i18nKey:"common:checking_access"},"Checking access"))):u?r.createElement(r.Fragment,null,r.createElement(c.Z,{right:"xsmall"},r.createElement(o.Z,{preset:"body--small",color:"dustygrey"},r.createElement(m.cC,{i18nKey:"common:pending_membership_application"},"Your membership application is pending."))),r.createElement(h.Z,{route:"account.membership.roles",params:{memberId:l}},r.createElement("a",null,r.createElement(o.Z,{preset:"body--small",color:"primary"},r.createElement(m.cC,{i18nKey:"common:manage_roles"},"Manage your roles"))))):r.createElement(r.Fragment,null,r.createElement(g.Z,{isLoading:s}),r.createElement(d.Z,{theme:"primary",onClick:()=>e(t,l),disabled:s},r.createElement(m.cC,{i18nKey:"common:apply_for_membership_label"},"Apply for membership"))));b.defaultProps={memberId:null};var y=(0,n.$j)(((e,{clubId:t})=>({hasLoaded:(0,u.Ik)(e),isLoading:(0,u.Uq)(e),isSubmitting:(0,u.xG)(e),memberId:(0,u.cP)(e,t),pendingApplication:(0,u.hH)(e,t)})),{loadNetworkPanelData:p.w8,applyForMembership:p.zf})(b),f=a(68425);const v=({authorised:e,clubId:t,loggedIn:a,loginTranslationKey:n,messageTranslationKey:l,noHeading:u,onAuthorise:d})=>((0,r.useEffect)((()=>{e&&d()}),[e]),e?null:r.createElement(s.Z,{component:"div",maxWidth:400,center:!0},r.createElement(i.Z,{all:"medium",style:{textAlign:"center"},component:"div"},!u&&r.createElement(c.Z,{bottom:"medium",component:"div"},r.createElement(o.Z,{preset:"subtitle--large",color:"dustygrey"},r.createElement(m.cC,{i18nKey:l},"Access denied"))),a?r.createElement(y,{clubId:t}):r.createElement(f.Z,{translationKey:n}))));v.defaultProps={loginTranslationKey:"common:login",messageTranslationKey:"common:access_denied",noHeading:!1,onAuthorise:()=>{}};var w=(0,n.$j)(((e,t)=>({authorised:(0,u.$S)(e,t.clubId),loggedIn:(0,l.jl)(e)})))(v)},68425:function(e,t,a){"use strict";var r=a(67294),n=a(32020),s=a(84278),i=a(12330),c=a(27324);function o(){return o=Object.assign?Object.assign.bind():function(e){for(var t=1;tr.createElement(s.Z,o({theme:"primary",onClick:e},a),r.createElement(c.cC,{i18nKey:t},"Login"));l.defaultProps={translationKey:"common:login"},t.Z=(0,n.$j)(null,{openPanel:i.H2})(l)},73917:function(e,t,a){"use strict";a.d(t,{Z:function(){return g}});var r=a(67294),n=a(32020),s=a(43726),i=a.n(s),c=a(9008),o=a.n(c),l=a(27324),u=(a(16503),a(57004)),m=a(75072);const d=({club:e,route:t,params:a})=>{try{const n=(0,m.Z)(e,t,a);return r.createElement("link",{rel:"canonical",href:n})}catch(n){return null}};d.defaultProps={params:{}};var p=d;const h=({club:e,description:t,descriptionTranslationKey:a,route:n,routeParams:s,titleTranslationKey:c,translationValues:l,t:u,title:m})=>{const d={...l,clubName:e.name},h=m||u(c,d);let g="";return t&&(g=i()(t)),a&&(g=u(a,{...l,clubName:e.name})),r.createElement(o(),null,r.createElement("title",{key:"title"},h),g.length>1&&r.createElement("meta",{name:"description",content:g.length>160?g.substring(0,160):g,key:"metaDescription"}),r.createElement(p,{club:e,route:n,params:s}))};h.defaultProps={description:null,descriptionTranslationKey:null,routeParams:{},title:null,titleTranslationKey:null,translationValues:{}};var g=(0,l.Zh)(["common","information","media","news","shop","teams"])((0,n.$j)(((e,{club:t})=>({club:t||(0,u.oX)(e)})))(h))},52513:function(e,t,a){"use strict";a(83454).env.INTEGRATION_TESTING;let r;r={info:()=>null,error:()=>null},e.exports=r},63383:function(e,t,a){"use strict";var r=a(96486);t.Z=class{constructor(e,t,a={}){this.clubId=e,this.page=t,this.params=a}paramsString(){return(0,r.map)((0,r.pickBy)(this.params,r.identity),((e,t)=>`${t}=${e}`)).join("&")}stringWithoutClub(){return(0,r.filter)([this.page,this.paramsString()]).join(":")}toString(){return(0,r.filter)([`club${this.clubId}`,this.page,this.paramsString()]).join(":")}}},2539:function(e,t,a){"use strict";a.d(t,{Z:function(){return I}});var r=a(50903);class n extends Error{constructor(e){super(e),this.name="AccessDeniedException",this.errorStatusCode=403}}var s=n;class i extends Error{constructor(e){super(e),this.name="PageDataParsingException",this.errorStatusCode=500}}var c=i,o=a(58306),l=a(52513),u=a.n(l);var m=class{constructor(e,t){this.accessLevel=null,this.clubId=e,this.request=t}async getAccessLevel(){if(this.accessLevel)return this.accessLevel;const e=await Promise.all([a.e(3714),a.e(2231),a.e(7259)]).then(a.bind(a,97259)),t=await e.default(this.request);return t?(this.accessLevel=await this.getAccessLevelFromAPI(t),this.accessLevel):(this.accessLevel="public",this.accessLevel)}async canUserAccessPage(e){if("public"===e.accessLevel)return!0;const t=await this.getAccessLevel();return e.accessLevel===t}async getAccessLevelFromAPI(e){try{const t=`v2/club-website/${this.clubId}/access`;u().info("Checking user access via API",{apiUrl:t});const r={Authorization:`Bearer ${e}`},{makeAPIRequest:n}=await Promise.all([a.e(3714),a.e(2231),a.e(7570)]).then(a.bind(a,6698)),s=await n(t,{headers:r});if(200!==s.status)return u().error(`User access via API returned with status: ${s.status}`),"public";const i=await s.json();return u().info(`Access level returned by API: ${i.access_level}`),i.access_level||"public"}catch(t){return u().error("Error with user access API check",{error:t}),"public"}}},d=a(96486),p=a(87558),h=a.n(p),g=a(30120);var b=class{constructor(e,t,a){this.key=e,this.data=t,this.accessLevel=a}},y=a(83454);const f=a(52513);class v{constructor(e){this.dynamoDbClient=e}getPageData(e,t){if(y.env.INTEGRATION_TESTING){const t="cypress/cypress/fixtures";return new Promise((a=>{try{const r=h().readFileSync(`${t}/page-data/${e.clubId}/${e.stringWithoutClub()}.json`),n=JSON.parse(r),{key:s,data:i,access_level:c}=n;f.info("Loaded page data from file"),a(new b(s,i,c))}catch(r){f.error("Error loading page data from file",r),a(null)}}))}return new Promise((a=>{const r={TableName:v.tableName(),Key:{page_key:e.toString()}};f.info("Checking DynamoDB for page data",{params:r}),this.dynamoDbClient.get(r,((r,n)=>{r&&("ResourceNotFoundException"!==r.code&&f.error("DynamoDb get Error",r),a(null));const s=(0,d.get)(n,"Item.generated",null);if(s&&t)try{const e=g.ou.fromISO(s),r=g.ou.local();eArray.isArray(e)?e.map((e=>({...e,avatar:E.$}))):e;return{...e,accessDenied:!1,players:t(e.players),substitutes:t(e.substitutes),opponents:t(e.opponents)}}canViewAlbum(){const{album:{visibility:e}}=this.matchCentreData.data;return"public"===e||e===this.userAccessLevel}canViewSelection(){const{lineup:{selection_visibility:e}}=this.matchCentreData.data;return"public"===e||e===this.userAccessLevel}canViewProfiles(){const{lineup:{profile_visibility:e}}=this.matchCentreData.data;return"public"===e||e===this.userAccessLevel}};class A{static getPageData(e,t,a){return(0,o.default)()?A.serverSideGet(e,t,a):A.clientSideGet(e)}static async clientSideGet(e){const t=`/data/club/${e.clubId}/${e.page}?${e.paramsString()}`;u().info("Client side page data API request",{apiUrl:t});const a=await fetch(t,{credentials:"include"});if(200!==a.status)throw new r.Z("Error loading page data",a.status,t);const n=await a.json();return new b(e,n.data,n.access_level)}static async serverSideGet(e,t,a){if(!t)throw new Error("Server side calls must provide the request object");const r=await A.serverSideLoad(e,t.dynamoDbClient,a),n=new m(e.clubId,t);let i=!1;try{i=await n.canUserAccessPage(r)}catch(d){throw u().error("Error checking access control",{error:d}),new s("Error checking access control")}if(!i)throw u().info("Access to data denied"),new s("User not authorised to view private page");if("match_centre"!==e.page)return r;const o=await n.getAccessLevel();u().info("Parsing match centre data based on access",{userAccessLevel:o});const l=new P(r,o);try{return l.parseMatchCentreData(r,o)}catch(d){throw u().error("Error Parsing match centre data",{error:d}),new c(d.message)}}static async serverSideLoad(e,t,a){u().info("Looking up page data",{key:e});try{const r=new w(t),n=await r.getPageData(e,a);if(n)return u().info("Received page data from store",{key:e}),n}catch(n){u().error(`Error retrieving data from store: ${n.message}`)}u().info("Page data not found in store",{key:e});const r=await A.loadFromApi(e);return u().info("Received page data from API",{key:e}),r}static async loadFromApi(e){const t=A.apiPath(e);u().info("Page data not found in store requesting from API");const{makeAPIRequest:n}=await Promise.all([a.e(3714),a.e(2231),a.e(7570)]).then(a.bind(a,6698)),s=await n(t);if(200!==s.status)throw new r.Z("Error loading page data",s.status,t);const i=await s.json(),{data:c,access_level:o}=i;if(!c||!o)throw new r.Z("Malformed API response",500,t,i);return new b(e,c,o)}static apiPath(e){return`v2/club-website/${e.clubId}/page?key=${encodeURIComponent(e.stringWithoutClub())}`}}var I=A},87558:function(){},67313:function(){}}]); //# sourceMappingURL=9221-c35c790f3811908c.js.map