1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[54091],{54091:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});var i=a(95155),s=a(12115),n=a(36489),l=a(94511),r=a(81550);let o=async(e,t,a,i,s)=>{if("kushki"===t.paymentProvider&&t.kushkiPublicMerchantId){var n;return{provider:"kushki",publicMerchantId:t.kushkiPublicMerchantId,testMode:!1!==t.kushkiTestMode,courseId:e.id,siteId:t.id,courseName:e.name,price:e.discount?e.discount:e.price,taxEnabled:t.taxEnabled||!1,taxPercentage:null!=(n=t.taxPercentage)?n:15,customerEmail:null==s?void 0:s.email,customerName:null==s?void 0:s.name}}let o=(0,l.c)((0,r.w)(t.stripePublishableKey)),c=await o,u={courseId:e.id,siteId:t.id,courseName:e.name,price:e.discount?e.discount:e.price,successUrl:a,cancelUrl:i,customerEmail:null==s?void 0:s.email,customerName:null==s?void 0:s.name},d=await fetch("/api/create-checkout-session",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)}),{sessionId:m}=await d.json();if(!m)throw Error("Failed to create checkout session");await (null==c?void 0:c.redirectToCheckout({sessionId:m}))};var c=a(62692),u=a(20063),d=a(22663),m=a(17455),p=a(65229);function h(e){let{courseId:t,siteId:a,courseName:n,fields:l,onClose:r,onSubmitted:o}=e,c=Array.isArray(l)&&l.length>0,[u,m]=(0,s.useState)({}),[h,f]=(0,s.useState)(""),[x,g]=(0,s.useState)(!1),b=(e,t)=>m(a=>({...a,[e]:t})),w=async e=>{if(e.preventDefault(),c)for(let e=0;e<l.length;e++){var i;if(l[e].required&&!(null==(i=u[String(e)])?void 0:i.trim()))return void d.Ay.error('Please complete "'.concat(l[e].text,'".'))}else if(!h.trim())return void d.Ay.error("Please tell us why you'd like to enroll.");let s=c?{responses:l.map((e,t)=>({label:e.text,value:u[String(t)]||""}))}:{message:h.trim()};g(!0);try{let e=await fetch("/api/courses/".concat(t,"/applications"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({siteId:a,applicationData:s})}),i=await e.json();if(!e.ok)return void d.Ay.error(i.error||"Could not submit your application.");d.Ay.success("Application submitted"),o()}finally{g(!1)}};return(0,i.jsxs)("div",{className:"modal modal-open",children:[(0,i.jsxs)("div",{className:"modal-box max-w-lg",children:[(0,i.jsxs)("div",{className:"flex items-start justify-between mb-1",children:[(0,i.jsxs)("h3",{className:"font-bold text-lg",children:["Apply to ",n]}),(0,i.jsx)("button",{className:"btn btn-ghost btn-sm btn-square",onClick:r,"aria-label":"Close",children:(0,i.jsx)(p.A,{size:18})})]}),(0,i.jsx)("p",{className:"text-sm text-base-content/60 mb-4",children:"Your application will be reviewed by the team. You'll get an email with the outcome."}),(0,i.jsxs)("form",{onSubmit:w,className:"space-y-4",children:[c?l.map((e,t)=>{var a;let s=String(t),n="apply-field-".concat(t);return(0,i.jsxs)("div",{className:"form-control w-full",children:[(0,i.jsx)("label",{htmlFor:n,className:"label pb-1.5",children:(0,i.jsxs)("span",{className:"label-text text-sm font-medium",children:[e.text,e.required&&(0,i.jsx)("span",{className:"ml-0.5 text-xs text-base-content/40",children:"*"})]})}),"dropdown"===e.type?(0,i.jsxs)("select",{id:n,className:"select select-bordered w-full",required:e.required,value:u[s]||"",onChange:e=>b(s,e.target.value),children:[(0,i.jsxs)("option",{value:"",children:["Select ",e.text]}),null==(a=e.options)?void 0:a.map(e=>(0,i.jsx)("option",{value:e.value,children:e.label},e.value))]}):"textarea"===e.type?(0,i.jsx)("textarea",{id:n,className:"textarea textarea-bordered w-full",rows:3,required:e.required,value:u[s]||"",onChange:e=>b(s,e.target.value)}):(0,i.jsx)("input",{id:n,type:e.type||"text",className:"input input-bordered w-full",required:e.required,value:u[s]||"",onChange:e=>b(s,e.target.value)})]},n)}):(0,i.jsxs)("div",{className:"form-control w-full",children:[(0,i.jsx)("label",{htmlFor:"apply-message",className:"label pb-1.5",children:(0,i.jsx)("span",{className:"label-text text-sm font-medium",children:"Why would you like to enroll?"})}),(0,i.jsx)("textarea",{id:"apply-message",className:"textarea textarea-bordered w-full",rows:4,value:h,onChange:e=>f(e.target.value)})]}),(0,i.jsxs)("div",{className:"modal-action",children:[(0,i.jsx)("button",{type:"button",className:"btn btn-ghost",onClick:r,children:"Cancel"}),(0,i.jsx)("button",{type:"submit",className:"btn btn-primary",disabled:x,children:x?"Submittingâ¦":"Submit application"})]})]})]}),(0,i.jsx)("div",{className:"modal-backdrop bg-black/40",onClick:r})]})}let f=e=>{let{courseId:t,siteId:a,slug:l,course:r,site:p}=e,{status:f,data:x}
1=(0,n.useSession)(),[g,b]=(0,s.useState)([]),[w,y]=(0,s.useState)({}),[v,j]=(0,s.useState)(!1),[N,S]=(0,s.useState)(!1),[I,k]=(0,s.useState)({}),[C,P]=(0,s.useState)(!0),[A,O]=(0,s.useState)(null),[q,D]=(0,s.useState)(null),[E,M]=(0,s.useState)(null),[L,T]=(0,s.useState)(!1),W=(0,u.useRouter)(),Y=e=>e.externalId&&p.isMoodleSite?"/api/moodle/auto-login?siteId=".concat(a,"&courseId=").concat(e.externalId):e.externalId?"/course/".concat(l,"/learning/"):"/course/".concat(l,"/courseware/"),J=e=>{let t=Y(e);e.externalId&&p.isMoodleSite?window.location.href=t:W.push(t)},F=async()=>{var e;let i=await fetch("/api/paymentStatus",{method:"POST",body:JSON.stringify({courseId:t,siteId:a,email:null==x||null==(e=x.user)?void 0:e.email})}),s=await i.json();200===s.status&&k(s.paymentStatus)},G=async function(){var e,i,s,n,l,o,c;let u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"completed";if(r.externalId&&p.isMoodleSite)try{let e=await fetch("/api/moodle/enroll",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({siteId:a,courseId:t,email:null==x||null==(i=x.user)?void 0:i.email,firstName:(null==x||null==(n=x.user)||null==(s=n.name)?void 0:s.split(" ")[0])||"",lastName:(null==x||null==(o=x.user)||null==(l=o.name)?void 0:l.split(" ").slice(1).join(" "))||""})}),r=await e.json();r.success||console.error("Moodle enrollment failed:",r.error)}catch(e){console.error("Moodle enrollment error:",e)}let m={courseId:t,name:null==x?void 0:x.user.name,email:null==x||null==(e=x.user)?void 0:e.email,username:null==x?void 0:x.user.username,siteId:a,status:u};r.externalId&&p.isOpenedxSite&&(m.enrolledInOpenedxCourse=!0),r.externalId&&p.isMoodleSite&&(m.enrolledInMoodleCourse=!0),r.isWaitList&&(m.isWaitListed=!0);let h=await fetch("/api/enrollments/".concat(t),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),f=await h.json();if(409===f.status&&f.missingPrerequisites){let e=f.missingPrerequisites.map(e=>e.name).join(", ");d.Ay.error("Complete the prerequisites first: ".concat(e)),D({allowed:!1,prerequisites:f.missingPrerequisites,missing:f.missingPrerequisites,authenticated:!0});return}if(201===f.status||200===f.status){if(r.externalId&&p.isOpenedxSite)try{await fetch("/api/openedx/enroll",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({siteId:a,courseId:t})})}catch(e){console.error("Open edX enrollment failed:",e)}try{b(e=>[...e,{courseId:t,siteId:a,userId:null==x?void 0:x.user.id}]),j(!0),"completed"===u?(d.Ay.success("You are enrolled in the course"),J(r)):(d.Ay.success("You are in the waitlist"),W.push("/dashboard"));let e=r.isWaitList?"You are in the waitlist for ".concat(null==r?void 0:r.name):"You are enrolled into ".concat(null==r?void 0:r.name);await fetch("/api/send-email",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({site:p,course:r,userFirstname:null==x?void 0:x.user.name,to:null==x||null==(c=x.user)?void 0:c.email,subject:e,type:"enrollment"})})}catch(e){console.log(e)}}};(0,s.useEffect)(()=>{(async()=>{if(x){let e=await fetch("/api/enrollments",{cache:"no-store"}),a=await e.json();b(a.enrollments),y(a.enrollments.find(e=>e.courseId===t))}})()},[x]),(0,s.useEffect)(()=>{let e=!1;return(async()=>{try{let a=await fetch("/api/courses/".concat(t,"/prerequisites"),{cache:"no-store"});if(!a.ok)return;let i=await a.json();e||D(i)}catch(e){}})(),()=>{e=!0}},[t,x]),(0,s.useEffect)(()=>{if(!r.requiresApplication||!x)return;let e=!1;return(async()=>{try{var i,s;let n=await fetch("/api/courses/".concat(t,"/applications?siteId=").concat(a,"&mine=1"),{cache:"no-store"});if(!n.ok)return;let l=await n.json();e||M(null!=(s=null==(i=l.application)?void 0:i.status)?s:null)}catch(e){}})(),()=>{e=!0}},[t,a,x,r.requiresApplication]),(0,s.useEffect)(()=>{if(!x||!r.requiresApplication)return;let e=new URLSearchParams(window.location.search);if("1"===e.get("apply")){T(!0),e.delete("apply");let t=e.toString();window.history.replaceState(null,"",window.location.pathname+(t?"?".concat(t):""))}},[x,r.requiresApplication]),(0,s.useEffect)(()=>{g&&g.length>0&&(j(w&&Object.keys(w).length>0),S(w&&w.isWaitListed),r.price>0&&F())},[g,w,t]);let U=e=>{if(v&&new Date(r.startDate)>new Date&&!r.isOnDemand)return!1;let t=v&&(null==e?void 0:e.status)==="completed";return r.price>0&&r.isWaitList?"paid"===I.status&&!N&&t:r.price>0?"paid"===I.status&&t:r.isWaitList?!N&&t:t},_=async(e,t,a)=>{let i=await o(r,p,e,t,a);i&&"kushki"===i.provider&&O(i)},R=async()=>
1{if(!x){let e={courseId:t,siteId:a,paid:r.price>0,externalId:r.externalId,externalUrl:p.openedxSiteUrl||p.moodleSiteUrl,isWaitList:r.isWaitList,isMoodleSite:p.isMoodleSite||!1};r.price&&"number"==typeof r.price&&!isNaN(r.price)&&r.price>0&&!r.isWaitList?_("".concat(window.location.origin,"/auth/signin"),"".concat(window.location.origin,"/course/").concat(l,"/about")):((0,c.setCookie)("enrollmentIntent",JSON.stringify(e)),window.location.href="/auth/signin");return}if(U(w))return void J(r);r.price&&"number"==typeof r.price&&!isNaN(r.price)&&r.price>0?r.isWaitList?v?v&&!N&&_("".concat(window.location.origin).concat(Y(r)),"".concat(window.location.origin,"/course/").concat(l,"/about"),{email:x.user.email,name:x.user.name,id:x.user.id}):G("pending"):_("".concat(window.location.origin).concat(Y(r)),"".concat(window.location.origin,"/course/").concat(l,"/about"),{email:x.user.email,name:x.user.name,id:x.user.id}):r.isWaitList?G("pending"):G("completed")},$=!v&&null!=q&&!q.allowed&&q.missing.length>0;return r.requiresApplication&&!v?(0,i.jsxs)("div",{className:"flex-none justify-self-end self-end flex flex-col gap-3 items-end",children:["pending"===E?(0,i.jsx)("button",{className:"btn btn-outline",disabled:!0,children:"Application pending review"}):"approved"===E?(0,i.jsx)("button",{className:"btn btn-primary",onClick:()=>J(r),children:"Continue"}):(0,i.jsxs)(i.Fragment,{children:["rejected"===E&&(0,i.jsx)("p",{className:"text-xs text-base-content/60 max-w-xs text-right",children:"Your previous application wasn't accepted. You're welcome to apply again."}),(0,i.jsx)("button",{className:"btn btn-primary",onClick:()=>{if(!x){(0,c.setCookie)("enrollmentIntent",JSON.stringify({courseId:t,siteId:a,requiresApplication:!0,slug:l})),window.location.href="/auth/signin";return}T(!0)},children:"rejected"===E?"Apply again":"Apply"})]}),L&&(0,i.jsx)(h,{courseId:t,siteId:a,courseName:r.name||"this course",fields:r.applicationFields||[],onClose:()=>T(!1),onSubmitted:()=>{T(!1),M("pending")}})]}):(0,i.jsxs)("div",{className:"flex-none justify-self-end self-end flex flex-col gap-3 items-end",children:[$&&(0,i.jsxs)("div",{className:"w-full max-w-sm border border-warning/40 bg-warning/5 rounded-lg p-4 text-sm",children:[(0,i.jsx)("div",{className:"font-semibold text-warning mb-2",children:"Complete these courses first"}),(0,i.jsx)("ul",{className:"space-y-1.5",children:q.missing.map(e=>(0,i.jsxs)("li",{className:"flex items-start gap-2",children:[(0,i.jsx)("span",{className:"opacity-60 mt-0.5",children:e.satisfied?"â":"â¢"}),(0,i.jsxs)("span",{className:"flex-1",children:[e.slug?(0,i.jsx)("a",{href:"/course/".concat(e.slug,"/about"),className:"font-medium hover:underline",children:e.name}):(0,i.jsx)("span",{className:"font-medium",children:e.name}),q.authenticated&&(0,i.jsxs)("span",{className:"opacity-60 ml-2 text-xs",children:[e.progressPercentage,"% / ",e.minProgressPct,"% complete",null!=e.minAvgGradePct&&(0,i.jsxs)(i.Fragment,{children:[" \xb7 ","grade ",null!=e.avgGradePercentage?"".concat(e.avgGradePercentage.toFixed(0),"%"):"-"," / ",e.minAvgGradePct,"%"]})]})]})]},e.id))})]}),(0,i.jsx)("button",{onClick:R,className:"btn btn-primary",disabled:$||N||v&&new Date(r.startDate)>new Date&&!r.isOnDemand||r.price>0&&new Date(r.startDate)>new Date&&!r.isOnDemand,children:$?"Prerequisites required":(()=>{if(U(w))return"Continue";if(v&&new Date(r.startDate)>new Date&&!r.isOnDemand&&!r.isWaitList)return"Coming Soon";if(r.price>0&&r.isWaitList)return N?"You are in the waitlist":"unpaid"===I.status||(null==w?void 0:w.status)==="pending"?"Complete Payment":"Add me to the waitlist";if(r.price>0&&new Date(r.startDate)>new Date&&!r.isOnDemand)return"Coming Soon";if(r.price>0)return r.discount?"Enroll for $".concat(r.discount):"Enroll for $".concat(r.price);if(r.isWaitList){if(!v)return"Add me to the waitlist";if(v&&!N&&(null==w?void 0:w.status)==="pending")return"Complete Enrollment";if(v&&N)return"You are in the waitlist"}return v?"Start Now":"Enroll Now"})()}),A&&(0,i.jsx)(m.A,{isOpen:!0,publicMerchantId:A.publicMerchantId,testMode:A.testMode,amount:A.price,productName:A.courseName,productDescription:"Course enrollment",customerEmail:A.customerEmail,chargeEndpoint:"/api/create-checkout-session/kushki-charge",chargePayload:{courseId:A.courseId,siteId:A.siteId,customerName:A.customerName},taxEnabled:A.taxEnabled,taxPercentage:A.taxPercentage,onSuccess:()=>{O(null),d.Ay.success("Payment successful! You are enrolled in the course."),J(r)},onClose:()=>O(null)})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.