@instincthub/react-ui 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/lib/helpFunction.js +1 -1
- package/dist/src/components/lib/helpFunction.js.map +1 -1
- package/dist/src/components/lib/index.js +1 -1
- package/dist/src/components/lib/index.js.map +1 -1
- package/dist/src/types/components/lib/helpFunction.d.ts +25 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t,n,r,o=require("../../../_virtual/_rollupPluginBabelHelpers.js"),a=require("next/navigation"),i=require("./modals/modals.js"),u=require("../../../node_modules/date-fns/format.js"),l="development"===process.env.NODE_ENV,c=null!==(e=process.env.NEXT_PUBLIC_API_HOST)&&void 0!==e?e:"",s=null!==(t=process.env.NEXT_PUBLIC_FILE_URL)&&void 0!==t?t:"",d=null!==(n=process.env.NEXT_PUBLIC_VIDEO_URL)&&void 0!==n?n:"",p=null!==(r=process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8)&&void 0!==r?r:"",f=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t){var n,r,a;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r={name:"".concat(t,".instincthub.com")},a={method:"POST",headers:{Authorization:"Bearer ".concat(null!==(n=process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN)&&void 0!==n?n:"")},body:JSON.stringify(r)},e.abrupt("return",fetch("https://api.vercel.com/v10/projects/".concat(process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID,"/domains?teamId=").concat(process.env.NEXT_PUBLIC_VERCEL_TEAM_ID),a));case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),v=function(e,t,n){var r=document.querySelector("#regForm");if(r){var o=r.querySelector('[name="'.concat(e,'"]'));if(o){o.style.borderColor="var(--TurkishRose)";var a,i=null;if("radio"===o.type)i=(null===(a=o.parentElement)||void 0===a||null===(a=a.parentElement)||void 0===a||null===(a=a.parentElement)||void 0===a?void 0:a.querySelector(".error"))||null;else if("file"===o.type){var u;i=(null===(u=o.parentElement)||void 0===u||null===(u=u.parentElement)||void 0===u?void 0:u.querySelector(".error"))||null}else{var l;i=(null===(l=o.parentElement)||void 0===l?void 0:l.querySelector(".error"))||null}if(i)i.textContent=t;else{var c,s,d=document.createElement("span");d.classList.add("error"),d.textContent=t,d.style.color="var(--TurkishRose)",d.style.display="inline-block";var p="radio"===o.type?null===(c=o.parentElement)||void 0===c||null===(c=c.parentElement)||void 0===c?void 0:c.parentElement:"file"===o.type||"SELECT"===o.nodeName?o.parentElement:null===(s=o.parentElement)||void 0===s?void 0:s.parentElement;null==p||p.appendChild(d)}0===n&&o.focus()}}};var m=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,u=arguments.length>5&&void 0!==arguments[5]&&arguments[5],c=process.env.NEXT_PUBLIC_INSTINCTHUB_SKH_KEY||"",s=process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER||"",d=c&&s?o.defineProperty({},c,s):{},p=process.env.NEXT_PUBLIC_LEADBOARD_SK_NAME||"",f=process.env.NEXT_PUBLIC_LEADBOARD_SK_VALUE||"",v=p&&f?o.defineProperty({},p,f):{},m=process.env.NEXT_PUBLIC_INSTINCTHUB_SK_KEY||"",h=null!==(t=process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET)&&void 0!==t?t:"",g=m&&h&&u?o.defineProperty({},m,h):{},y=o.objectSpread2(o.objectSpread2(o.objectSpread2({},v),d),g);r&&(y.Authorization="Bearer ".concat(r)),i&&(y["channel-id"]=i),"json"===a&&(y["Content-Type"]="application/json"),"form-data"===a&&(y["Content-Type"]="multipart/form-data");var E={method:e,headers:y,redirect:"follow"};return E.body=n||null,l&&console.log(E),E},h=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t,n,r,a,u,l,c,s,d){var p,f,v,m=arguments;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=m.length>9&&void 0!==m[9]&&m[9],n){e.next=3;break}return e.abrupt("return");case 3:return e.prev=3,e.next=6,fetch(t,r);case 6:return f=e.sent,e.next=9,f.json();case 9:if(v=e.sent,401!==f.status){e.next=13;break}return i.openToast("Unauthorized fetchData",401),e.abrupt("return");case 13:p?(u(v.results),l(v.count)):u([].concat(o.toConsumableArray(a),o.toConsumableArray(v.results))),c(v.next),s(v.previous),e.next=22;break;case 18:e.prev=18,e.t0=e.catch(3),i.openToast("Error fetching data",500),console.error("Error fetching data:",e.t0);case 22:return e.prev=22,d(!1),e.finish(22);case 25:case"end":return e.stop()}}),e,null,[[3,18,22,25]])})));return function(t,n,r,o,a,i,u,l,c){return e.apply(this,arguments)}}(),g=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t,n,r){var a,i,u,c,s,d,p,f,v=arguments;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=v.length>3&&void 0!==v[3]&&v[3],i=v.length>4?v[4]:void 0,u=v.length>5?v[5]:void 0,c=v.length>6?v[6]:void 0,s=v.length>7&&void 0!==v[7]&&v[7],e.prev=5,e.next=8,fetch(n,r);case 8:return d=e.sent,p=d.status,e.next=12,d.json();case 12:return f=e.sent,a?([400,401,404,500].includes(p)?null==c||c(f):[200,201].includes(p)&&(t(f),null==c||c(null)),null==u||u(p)):t.setState({data:f,status:p}),l&&console.log("Request Options:",r,"Response Data:",f,"Status Code:",p),s&&y(p),e.abrupt("return",f);case 19:return e.prev=19,e.t0=e.catch(5),a?(t(e.t0),null==c||c(e.t0),null==u||u(null)):t.setState({error:e.t0}),l&&console.log("Request Options:",r,"Error:",e.t0),e.abrupt("return",e.t0);case 24:return e.prev=24,i&&i(!1),e.finish(24);case 27:case"end":return e.stop()}}),e,null,[[5,19,24,27]])})));return function(t,n,r){return e.apply(this,arguments)}}(),y=function(e){401===e?a.forbidden():404===e&&a.notFound()},E=function(e,t,n){if(e){var r=e.querySelector("button.submit_bt");if(r){r.disabled=n;var o=r.querySelector(".bt-spinner");o&&(o.style.display=t)}e.disabled=n}},_=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t){var n,r,a;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(n=new FormData).append("email",t),r=m("POST",n),e.next=5,fetch("".concat(c,"auth/skills/request_new_otp/"),r);case 5:return a=e.sent,e.abrupt("return",a.json());case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();exports.API_HOST_URL=c,exports.CODECS_URL_M3U8=p,exports.FILE_URL=s,exports.IN_DEV_MODE=l,exports.TrackViewPort=function(e){if(!e)return!1;var t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},exports.VIDEO_URL=d,exports.addUserDomain=f,exports.calculateAmountAfterDeduction=function(e,t){return e<0||t<0||t>100?{amount:0,detail:"Amount and percentage should be positive, and percentage should be between 0 and 100."}:{amount:e-e*t/100}},exports.calculateAverageRating=function(e){return e.length?(e.reduce((function(e,t){return e+t}),0)/e.length).toFixed(1):"0.0"},exports.calculateTotalCredits=function(e){return e.reduce((function(e,t){var n=t.course;return e+(Number.parseInt(n.credits.toString(),10)||0)}),0)},exports.convertArrayToFormData=function(e){var t=new FormData;return e.forEach((function(e,n){Object.entries(e).forEach((function(e){var r=o.slicedToArray(e,2),a=r[0],i=r[1];Array.isArray(i)?t.append("item[".concat(n,"].").concat(a),JSON.stringify(i)):"object"===o.typeof(i)&&null!==i?"upload_result"===a&&"objectURL"in i?fetch(i.objectURL).then((function(e){return e.blob()})).then((function(e){t.append("item[".concat(n,"].").concat(a),e,"upload_result_file")})).catch((function(e){return console.error("Error converting blob URL:",e)})):t.append("item[".concat(n,"].").concat(a),JSON.stringify(i)):t.append("item[".concat(n,"].").concat(a),String(null!=i?i:""))}))})),t},exports.convertToFloat=function(e){return parseFloat(e.replace(/,/g,""))||0},exports.convertToSlug=function(e){if(e=(e=(e=(e=e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")).toLowerCase()).replace(/[^a-z0-9]+/g,"-")).replace(/^-+|-+$/g,""),!/^[a-z0-9_-]+$/.test(e))throw new Error('Enter a valid "slug" consisting of letters, numbers, underscores, or hyphens.');return e},exports.extractSubDomain=function(e){if(l)return{value:"eportal.hust.edu.ng",field:"username"};if(!e.includes("instincthub.com")&&!l)return{value:e,field:"domain"};var t,n=e.split(".");return n.length>1?"ngrok-free"===n[1]?{value:"skills",field:"username"}:"instincthub"===n[n.length-2]||e.includes("localhost")?{value:n[0],field:"username"}:{value:e,field:"domain"}:1===n.length||2===n.length?n[0].includes("localhost:3000")||"instincthub"===n[0]||"ngrok-free"===n[1]?{value:"eportal.hust.edu.ng",field:"username"}:null!==(t=n[n.length-2])&&void 0!==t&&t.includes("instincthub")||e.includes("localhost")?{value:n[0],field:"domain"}:{value:e,field:"domain"}:null},exports.fetchAPI=g,exports.fetchData=h,exports.findNullOrEmptyKeys=function(e,t){return e.filter((function(e){return null==t[e]||""===t[e]}))},exports.formatDateToWord=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"iiii do MMMM yyyy";return e?u.formatDate(new Date(e),t):""},exports.formatDuration=function(e){if(0===e)return"...";if(e<60)return Math.floor(e)?"".concat(Math.floor(e)," Minutes"):"".concat(e.toFixed(1)," Seconds");var t=Math.floor(e/60),n=Math.floor(e%60);return 0===n?"".concat(t," Hours"):"".concat(t," Hours, ").concat(n," Minutes")},exports.formatNumberWithCommas=function(e){if(isNaN(e))return"Invalid number";var t=e.toString().split("."),n=o.slicedToArray(t,2),r=n[0],a=n[1],i=r.replace(/\B(?=(\d{3})+(?!\d))/g,",");return a?"".concat(i,".").concat(a):i},exports.getCookie=function(e){if("undefined"==typeof document)return null;var t,n="".concat(e,"="),r=document.cookie.split(";"),a=o.createForOfIteratorHelper(r);try{for(a.s();!(t=a.n()).done;){var i=t.value.trim();if(i.startsWith(n))return i.substring(n.length)}}catch(e){a.e(e)}finally{a.f()}return null},exports.getNestedValue=function(e,t){try{return t.split(".").reduce((function(e,t){return e&&void 0!==e[t]?e[t]:""}),e)}catch(e){return console.warn("Error accessing ".concat(t,":"),e),""}},exports.handleError=function(e,t,n,r){var a,i=document.querySelector(".server_err");if(i)if(400===e)if("This field must be unique."===(null===(a=t.user)||void 0===a?void 0:a[0])||t.username){if(i.style.display="block",i.style.backgroundColor="var(--DarkCyan)",i.querySelector("h3").textContent="We already have your details!",["/register/details","/register/details/"].includes(document.location.pathname)){var u=i.querySelector("a button span");u&&(u.innerHTML="Take Assessment");var l=i.querySelector("a");l&&(l.href="/quiz/")}E(n,"none",!1),window.location.href="#Socials"}else E(n,"none",!1),Object.entries(t).forEach((function(e,t){var n=o.slicedToArray(e,2),r=n[0],a=n[1];return v(r,a[0],t)})),i.style.display="none";else[200,201,202].includes(e)&&r?window.location.href=r:401===e&&(i.style.display="block",i.querySelector("a").innerHTML="",i.querySelector("h3").textContent="string"==typeof t.detail?t.detail:"Unauthorized",E(n,"none",!1),window.location.href="#Socials")},exports.handleInvalid=function(e,t,n){var r=e.target;t.includes(r.name)||n([].concat(o.toConsumableArray(t),[r.dataset.name||r.name]));var a=document.getElementById("id_".concat(r.name));return a&&a.scrollIntoView(),["Error: ".concat(t.join(", ")," field(s) cannot be left blank."),400]},exports.handleResendOTP=_,exports.handleStatusError=y,exports.hostUrlEncode=function(){if("undefined"!=typeof document)return encodeURIComponent(window.location.href)},exports.isValidAlphanumeric=function(e){return(null==e?void 0:e.length)>=3&&/^[a-zA-Z0-9]+$/.test(e)},exports.isValidEmail=function(e){return(null==e?void 0:e.length)>=3&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)},exports.objectIsEmpty=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},exports.printErr=v,exports.removeCookie=function(e){"undefined"!=typeof document&&(document.cookie="".concat(e,"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"))},exports.reqOptions=m,exports.romansFigure=["I","II","III","IV","V","VI","VII","VIII","IX","X"],exports.setCookie=function(e,t,n){if("undefined"!=typeof document){var r=new Date;r.setTime(r.getTime()+24*n*60*60*1e3),document.cookie="".concat(e,"=").concat(t,";expires=").concat(r.toUTCString(),";path=/")}},exports.slugifyFileName=function(e){var t=e.split("."),n=t.pop()||"";return t.join("-").replace(/[^\w\s()-]/g,"").replace(/[\s_]+/g,"-").toLowerCase().replace(/\(([^)]+)\)/g,"").slice(0,50)+"."+n.toLowerCase()},exports.spinBtn=E,exports.stripCommaFromNumber=function(e){try{if("number"==typeof e)return e;var t=e.replace(/,/g,"");return Number(t)||0}catch(e){return 0}},exports.stripHtmlTags=function(e){return e.replace(/<[^>]*>/g,"")},exports.toTitleCase=function(e){return"string"!=typeof e?e:e.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}))},exports.truncateHtml=function(e,t){return e.length>t?"".concat(e.substring(0,t),"..."):e};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t,r,n,o=require("../../../_virtual/_rollupPluginBabelHelpers.js"),a=require("next/navigation"),i=require("./modals/modals.js"),s=require("../../../node_modules/date-fns/format.js"),u="development"===process.env.NODE_ENV,l=null!==(e=process.env.NEXT_PUBLIC_API_HOST)&&void 0!==e?e:"",c=null!==(t=process.env.NEXT_PUBLIC_FILE_URL)&&void 0!==t?t:"",d=null!==(r=process.env.NEXT_PUBLIC_VIDEO_URL)&&void 0!==r?r:"",p=null!==(n=process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8)&&void 0!==n?n:"",f=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t){var r,n,a;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={name:"".concat(t,".instincthub.com")},a={method:"POST",headers:{Authorization:"Bearer ".concat(null!==(r=process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN)&&void 0!==r?r:"")},body:JSON.stringify(n)},e.abrupt("return",fetch("https://api.vercel.com/v10/projects/".concat(process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID,"/domains?teamId=").concat(process.env.NEXT_PUBLIC_VERCEL_TEAM_ID),a));case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),v=function(e,t,r){var n=document.querySelector("#regForm");if(n){var o=n.querySelector('[name="'.concat(e,'"]'));if(o){o.style.borderColor="var(--TurkishRose)";var a,i=null;if("radio"===o.type)i=(null===(a=o.parentElement)||void 0===a||null===(a=a.parentElement)||void 0===a||null===(a=a.parentElement)||void 0===a?void 0:a.querySelector(".error"))||null;else if("file"===o.type){var s;i=(null===(s=o.parentElement)||void 0===s||null===(s=s.parentElement)||void 0===s?void 0:s.querySelector(".error"))||null}else{var u;i=(null===(u=o.parentElement)||void 0===u?void 0:u.querySelector(".error"))||null}if(i)i.textContent=t;else{var l,c,d=document.createElement("span");d.classList.add("error"),d.textContent=t,d.style.color="var(--TurkishRose)",d.style.display="inline-block";var p="radio"===o.type?null===(l=o.parentElement)||void 0===l||null===(l=l.parentElement)||void 0===l?void 0:l.parentElement:"file"===o.type||"SELECT"===o.nodeName?o.parentElement:null===(c=o.parentElement)||void 0===c?void 0:c.parentElement;null==p||p.appendChild(d)}0===r&&o.focus()}}},m=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=document.querySelector("div.".concat(e)),n=document.querySelector("#err_message");if(r&&n&&!r.classList.contains("s_err")){if(r.classList.add("s_err"),n.classList.add("active"),t){var o=r.querySelector(".field");o&&(o.style.border="1px solid var(--TurkishRose)")}var a=document.createElement("LI"),i=r.querySelector("h5"),s=r.querySelector(".text_label");i?a.textContent=i.textContent:s&&(a.textContent=s.textContent);var u=n.querySelector("ul");u&&u.append(a)}};var h=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],l=process.env.NEXT_PUBLIC_INSTINCTHUB_SKH_KEY||"",c=process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER||"",d=l&&c?o.defineProperty({},l,c):{},p=process.env.NEXT_PUBLIC_LEADBOARD_SK_NAME||"",f=process.env.NEXT_PUBLIC_LEADBOARD_SK_VALUE||"",v=p&&f?o.defineProperty({},p,f):{},m=process.env.NEXT_PUBLIC_INSTINCTHUB_SK_KEY||"",h=null!==(t=process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET)&&void 0!==t?t:"",y=m&&h&&s?o.defineProperty({},m,h):{},g=o.objectSpread2(o.objectSpread2(o.objectSpread2({},v),d),y);n&&(g.Authorization="Bearer ".concat(n)),i&&(g["channel-id"]=i),"json"===a&&(g["Content-Type"]="application/json"),"form-data"===a&&(g["Content-Type"]="multipart/form-data");var E={method:e,headers:g,redirect:"follow"};return E.body=r||null,u&&console.log(E),E},y=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t,r,n,a,s,u,l,c,d){var p,f,v,m=arguments;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=m.length>9&&void 0!==m[9]&&m[9],r){e.next=3;break}return e.abrupt("return");case 3:return e.prev=3,e.next=6,fetch(t,n);case 6:return f=e.sent,e.next=9,f.json();case 9:if(v=e.sent,401!==f.status){e.next=13;break}return i.openToast("Unauthorized fetchData",401),e.abrupt("return");case 13:p?(s(v.results),u(v.count)):s([].concat(o.toConsumableArray(a),o.toConsumableArray(v.results))),l(v.next),c(v.previous),e.next=22;break;case 18:e.prev=18,e.t0=e.catch(3),i.openToast("Error fetching data",500),console.error("Error fetching data:",e.t0);case 22:return e.prev=22,d(!1),e.finish(22);case 25:case"end":return e.stop()}}),e,null,[[3,18,22,25]])})));return function(t,r,n,o,a,i,s,u,l){return e.apply(this,arguments)}}(),g=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t,r,n){var a,i,s,l,c,d,p,f,v=arguments;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=v.length>3&&void 0!==v[3]&&v[3],i=v.length>4?v[4]:void 0,s=v.length>5?v[5]:void 0,l=v.length>6?v[6]:void 0,c=v.length>7&&void 0!==v[7]&&v[7],e.prev=5,e.next=8,fetch(r,n);case 8:return d=e.sent,p=d.status,e.next=12,d.json();case 12:return f=e.sent,a?([400,401,404,500].includes(p)?null==l||l(f):[200,201].includes(p)&&(t(f),null==l||l(null)),null==s||s(p)):t.setState({data:f,status:p}),u&&console.log("Request Options:",n,"Response Data:",f,"Status Code:",p),c&&E(p),e.abrupt("return",f);case 19:return e.prev=19,e.t0=e.catch(5),a?(t(e.t0),null==l||l(e.t0),null==s||s(null)):t.setState({error:e.t0}),u&&console.log("Request Options:",n,"Error:",e.t0),e.abrupt("return",e.t0);case 24:return e.prev=24,i&&i(!1),e.finish(24);case 27:case"end":return e.stop()}}),e,null,[[5,19,24,27]])})));return function(t,r,n){return e.apply(this,arguments)}}(),E=function(e){401===e?a.forbidden():404===e&&a.notFound()},_=function(e,t,r){if(e){var n=e.querySelector("button.submit_bt");if(n){n.disabled=r;var o=n.querySelector(".bt-spinner");o&&(o.style.display=t)}e.disabled=r}},b=function(){var e=o.asyncToGenerator(o.regeneratorRuntime().mark((function e(t){var r,n,a;return o.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(r=new FormData).append("email",t),n=h("POST",r),e.next=5,fetch("".concat(l,"auth/skills/request_new_otp/"),n);case 5:return a=e.sent,e.abrupt("return",a.json());case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();exports.API_HOST_URL=l,exports.CODECS_URL_M3U8=p,exports.FILE_URL=c,exports.IN_DEV_MODE=u,exports.TrackViewPort=function(e){if(!e)return!1;var t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},exports.VIDEO_URL=d,exports.abbreviateNumber=function(e){var t=Math.floor(Math.log10(Math.abs(e))/3);if(0===t)return e.toString();var r=["","K","M","B","T"][t];return(e/Math.pow(10,3*t)).toFixed(1)+r},exports.addUserDomain=f,exports.calculateAmountAfterDeduction=function(e,t){return e<0||t<0||t>100?{amount:0,detail:"Amount and percentage should be positive, and percentage should be between 0 and 100."}:{amount:e-e*t/100}},exports.calculateAverageRating=function(e){return e.length?(e.reduce((function(e,t){return e+t}),0)/e.length).toFixed(1):"0.0"},exports.calculateTotalCredits=function(e){return e.reduce((function(e,t){var r=t.course;return e+(Number.parseInt(r.credits.toString(),10)||0)}),0)},exports.convertArrayToFormData=function(e){var t=new FormData;return e.forEach((function(e,r){Object.entries(e).forEach((function(e){var n=o.slicedToArray(e,2),a=n[0],i=n[1];Array.isArray(i)?t.append("item[".concat(r,"].").concat(a),JSON.stringify(i)):"object"===o.typeof(i)&&null!==i?"upload_result"===a&&"objectURL"in i?fetch(i.objectURL).then((function(e){return e.blob()})).then((function(e){t.append("item[".concat(r,"].").concat(a),e,"upload_result_file")})).catch((function(e){return console.error("Error converting blob URL:",e)})):t.append("item[".concat(r,"].").concat(a),JSON.stringify(i)):t.append("item[".concat(r,"].").concat(a),String(null!=i?i:""))}))})),t},exports.convertToFloat=function(e){return parseFloat(e.replace(/,/g,""))||0},exports.convertToSlug=function(e){if(e=(e=(e=(e=e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")).toLowerCase()).replace(/[^a-z0-9]+/g,"-")).replace(/^-+|-+$/g,""),!/^[a-z0-9_-]+$/.test(e))throw new Error('Enter a valid "slug" consisting of letters, numbers, underscores, or hyphens.');return e},exports.extractSubDomain=function(e){if(u)return{value:"eportal.hust.edu.ng",field:"username"};if(!e.includes("instincthub.com")&&!u)return{value:e,field:"domain"};var t,r=e.split(".");return r.length>1?"ngrok-free"===r[1]?{value:"skills",field:"username"}:"instincthub"===r[r.length-2]||e.includes("localhost")?{value:r[0],field:"username"}:{value:e,field:"domain"}:1===r.length||2===r.length?r[0].includes("localhost:3000")||"instincthub"===r[0]||"ngrok-free"===r[1]?{value:"eportal.hust.edu.ng",field:"username"}:null!==(t=r[r.length-2])&&void 0!==t&&t.includes("instincthub")||e.includes("localhost")?{value:r[0],field:"domain"}:{value:e,field:"domain"}:null},exports.fetchAPI=g,exports.fetchData=y,exports.findNullOrEmptyKeys=function(e,t){return e.filter((function(e){return null==t[e]||""===t[e]}))},exports.formatDateToWord=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"iiii do MMMM yyyy";return e?s.formatDate(new Date(e),t):""},exports.formatDuration=function(e){if(0===e)return"...";if(e<60)return Math.floor(e)?"".concat(Math.floor(e)," Minutes"):"".concat(e.toFixed(1)," Seconds");var t=Math.floor(e/60),r=Math.floor(e%60);return 0===r?"".concat(t," Hours"):"".concat(t," Hours, ").concat(r," Minutes")},exports.formatNumberWithCommas=function(e){if(isNaN(e))return"Invalid number";var t=e.toString().split("."),r=o.slicedToArray(t,2),n=r[0],a=r[1],i=n.replace(/\B(?=(\d{3})+(?!\d))/g,",");return a?"".concat(i,".").concat(a):i},exports.getCookie=function(e){if("undefined"==typeof document)return null;var t,r="".concat(e,"="),n=document.cookie.split(";"),a=o.createForOfIteratorHelper(n);try{for(a.s();!(t=a.n()).done;){var i=t.value.trim();if(i.startsWith(r))return i.substring(r.length)}}catch(e){a.e(e)}finally{a.f()}return null},exports.getNestedValue=function(e,t){try{return t.split(".").reduce((function(e,t){return e&&void 0!==e[t]?e[t]:""}),e)}catch(e){return console.warn("Error accessing ".concat(t,":"),e),""}},exports.handleError=function(e,t,r,n){var a,i=document.querySelector(".server_err");if(i)if(400===e)if("This field must be unique."===(null===(a=t.user)||void 0===a?void 0:a[0])||t.username){if(i.style.display="block",i.style.backgroundColor="var(--DarkCyan)",i.querySelector("h3").textContent="We already have your details!",["/register/details","/register/details/"].includes(document.location.pathname)){var s=i.querySelector("a button span");s&&(s.innerHTML="Take Assessment");var u=i.querySelector("a");u&&(u.href="/quiz/")}_(r,"none",!1),window.location.href="#Socials"}else _(r,"none",!1),Object.entries(t).forEach((function(e,t){var r=o.slicedToArray(e,2),n=r[0],a=r[1];return v(n,a[0],t)})),i.style.display="none";else[200,201,202].includes(e)&&n?window.location.href=n:401===e&&(i.style.display="block",i.querySelector("a").innerHTML="",i.querySelector("h3").textContent="string"==typeof t.detail?t.detail:"Unauthorized",_(r,"none",!1),window.location.href="#Socials")},exports.handleInvalid=function(e,t,r){var n=e.target;t.includes(n.name)||r([].concat(o.toConsumableArray(t),[n.dataset.name||n.name]));var a=document.getElementById("id_".concat(n.name));return a&&a.scrollIntoView(),["Error: ".concat(t.join(", ")," field(s) cannot be left blank."),400]},exports.handleResendOTP=b,exports.handleStatusError=E,exports.hostUrlEncode=function(){if("undefined"!=typeof document)return encodeURIComponent(window.location.href)},exports.inputTagErrorEvent=m,exports.isValidAlphanumeric=function(e){return(null==e?void 0:e.length)>=3&&/^[a-zA-Z0-9]+$/.test(e)},exports.isValidEmail=function(e){return(null==e?void 0:e.length)>=3&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)},exports.objectIsEmpty=function(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},exports.printErr=v,exports.printErrNew=function(e){var t;e&&Object.entries(e).forEach((function(e,r){var n=o.slicedToArray(e,2),a=n[0],i=n[1];t=document.querySelector(".".concat(a));var s=document.createElement("P");if(s.classList.add("err_msg"),s.style.color="var(--TurkishRose)",s.textContent=Array.isArray(i)?i[0]:i,t&&!t.classList.contains("s_err")&&!t.querySelector(".err_msg")){t.classList.add("s_err"),t.append(s);var u=t.querySelector(".field input"),l=t.querySelector(".field textarea");if(!u||"number"!==u.getAttribute("type")&&"text"!==u.getAttribute("type")&&"email"!==u.getAttribute("type")&&"password"!==u.getAttribute("type"))if(l)l.style.border="1px solid var(--TurkishRose)";else{var c=t.querySelector(".field");c&&(c.style.border="1px solid var(--TurkishRose)")}else if(u.style.border="1px solid var(--TurkishRose)",0===r){var d=t.querySelector('[name="'.concat(a,'"]'));null==d||d.focus()}m(a,!1)}}))},exports.removeCookie=function(e){"undefined"!=typeof document&&(document.cookie="".concat(e,"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"))},exports.removeErrMsg=function(){var e=document.querySelectorAll(".s_err");e&&e.forEach((function(e){var t=e.querySelector(".field");t&&(t.style.border="none");var r=e.querySelector(".err_msg");if(r){r.remove();var n=e.querySelector("input"),o=e.querySelector("textarea");n?n.style.border="var(--borderDefault)":o&&(o.style.border="var(--borderDefault)")}e.classList.remove("s_err")}));var t=document.querySelector("#err_message");if(t){t.classList.remove("active");var r=t.querySelector("ul");r&&(r.innerHTML="")}},exports.reqOptions=h,exports.romansFigure=["I","II","III","IV","V","VI","VII","VIII","IX","X"],exports.setCookie=function(e,t,r){if("undefined"!=typeof document){var n=new Date;n.setTime(n.getTime()+24*r*60*60*1e3),document.cookie="".concat(e,"=").concat(t,";expires=").concat(n.toUTCString(),";path=/")}},exports.slugifyFileName=function(e){var t=e.split("."),r=t.pop()||"";return t.join("-").replace(/[^\w\s()-]/g,"").replace(/[\s_]+/g,"-").toLowerCase().replace(/\(([^)]+)\)/g,"").slice(0,50)+"."+r.toLowerCase()},exports.spinBtn=_,exports.stripCommaFromNumber=function(e){try{if("number"==typeof e)return e;var t=e.replace(/,/g,"");return Number(t)||0}catch(e){return 0}},exports.stripHtmlTags=function(e){return e.replace(/<[^>]*>/g,"")},exports.toTitleCase=function(e){return"string"!=typeof e?e:e.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}))},exports.truncateHtml=function(e,t){return e.length>t?"".concat(e.substring(0,t),"..."):e};
|
|
2
2
|
//# sourceMappingURL=helpFunction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpFunction.js","sources":["../../../../src/components/lib/helpFunction.ts"],"sourcesContent":["// TypeScript version of the original JavaScript document\r\nimport { format } from \"date-fns\";\r\nimport { forbidden, notFound } from \"next/navigation\";\r\nimport { openToast } from \"./modals/modals\";\r\nimport React from \"react\";\r\n\r\n// Constants with Type Safety\r\nexport const IN_DEV_MODE: boolean = process.env.NODE_ENV === \"development\";\r\nexport const API_HOST_URL: string = process.env.NEXT_PUBLIC_API_HOST ?? \"\";\r\nexport const FILE_URL: string = process.env.NEXT_PUBLIC_FILE_URL ?? \"\";\r\nexport const VIDEO_URL: string = process.env.NEXT_PUBLIC_VIDEO_URL ?? \"\";\r\nexport const CODECS_URL_M3U8: string =\r\n process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8 ?? \"\";\r\n\r\nexport const romansFigure: string[] = [\r\n \"I\",\r\n \"II\",\r\n \"III\",\r\n \"IV\",\r\n \"V\",\r\n \"VI\",\r\n \"VII\",\r\n \"VIII\",\r\n \"IX\",\r\n \"X\",\r\n];\r\n\r\n// Interfaces for Type Safety\r\ninterface VercelDomainRequest {\r\n name: string;\r\n}\r\n\r\ninterface VercelFetchOptions extends RequestInit {\r\n headers: {\r\n Authorization: string;\r\n [key: string]: string;\r\n };\r\n}\r\n\r\ninterface Course {\r\n credits: string | number;\r\n}\r\n\r\ninterface CourseObj {\r\n course: Course;\r\n}\r\n\r\ninterface SubDomainResult {\r\n value: string;\r\n field: \"username\" | \"domain\";\r\n}\r\n\r\ninterface FormItem {\r\n [key: string]: string | number | object | Blob | null | undefined | any[];\r\n}\r\n\r\ninterface RequestOptions extends RequestInit {\r\n headers: Record<string, string>;\r\n body?: BodyInit | FormData | null;\r\n}\r\n\r\n// Functions\r\n\r\n/**\r\n * Adds a subdomain to Vercel project.\r\n * @param domain The domain to add as a subdomain\r\n * @returns Promise resolving to the fetch Response\r\n */\r\nexport const addUserDomain = async (domain: string): Promise<Response> => {\r\n const payload: VercelDomainRequest = { name: `${domain}.instincthub.com` };\r\n const vercelOptions: VercelFetchOptions = {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${\r\n process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN ?? \"\"\r\n }`,\r\n },\r\n body: JSON.stringify(payload),\r\n };\r\n\r\n return fetch(\r\n `https://api.vercel.com/v10/projects/${process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID}/domains?teamId=${process.env.NEXT_PUBLIC_VERCEL_TEAM_ID}`,\r\n vercelOptions\r\n );\r\n};\r\n\r\n/**\r\n * Strips HTML tags from a string.\r\n * @param str Input string with potential HTML tags\r\n * @returns Cleaned string without HTML tags\r\n */\r\nexport const stripHtmlTags = (str: string): string => {\r\n return str.replace(/<[^>]*>/g, \"\");\r\n};\r\n\r\n/**\r\n * Removes commas from a number string and converts to number.\r\n * @param str Input string or number\r\n * @returns Parsed number or 0 if invalid\r\n */\r\nexport const stripCommaFromNumber = (str: string | number): number => {\r\n try {\r\n if (typeof str === \"number\") return str;\r\n const val = str.replace(/,/g, \"\");\r\n return Number(val) || 0;\r\n } catch {\r\n return 0;\r\n }\r\n};\r\n\r\n/**\r\n * Calculates total credits from an array of course objects.\r\n * @param courses Array of course objects\r\n * @returns Total credits as a number\r\n */\r\nexport const calculateTotalCredits = (courses: CourseObj[]): number => {\r\n return courses.reduce((total, { course }) => {\r\n const credits = Number.parseInt(course.credits.toString(), 10) || 0;\r\n return total + credits;\r\n }, 0);\r\n};\r\n\r\n/**\r\n * Calculates amount after percentage deduction.\r\n * @param amount Base amount\r\n * @param percentage Percentage to deduct (0-100)\r\n * @returns Object with final amount or error details\r\n */\r\nexport const calculateAmountAfterDeduction = (\r\n amount: number,\r\n percentage: number\r\n): { amount: number; detail?: string } => {\r\n if (amount < 0 || percentage < 0 || percentage > 100) {\r\n return {\r\n amount: 0,\r\n detail:\r\n \"Amount and percentage should be positive, and percentage should be between 0 and 100.\",\r\n };\r\n }\r\n const deduction = (amount * percentage) / 100;\r\n return { amount: amount - deduction };\r\n};\r\n\r\n/**\r\n * Finds keys in an object that are null, undefined, or empty string.\r\n * @param namesArray Array of keys to check\r\n * @param obj Object to inspect\r\n * @returns Array of keys with null/empty values\r\n */\r\nexport const findNullOrEmptyKeys = <T extends Record<string, any>>(\r\n namesArray: string[],\r\n obj: T\r\n): string[] => {\r\n return namesArray.filter((key) => obj[key] == null || obj[key] === \"\");\r\n};\r\n\r\n/**\r\n * Extracts subdomain or domain from hostname.\r\n * @param hostname Hostname string\r\n * @returns Subdomain result or null\r\n */\r\nexport const extractSubDomain = (hostname: string): SubDomainResult | null => {\r\n if (IN_DEV_MODE) return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n if (!hostname.includes(\"instincthub.com\") && !IN_DEV_MODE) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n\r\n const parts = hostname.split(\".\");\r\n if (parts.length > 1) {\r\n if (parts[1] === \"ngrok-free\")\r\n return { value: \"skills\", field: \"username\" };\r\n if (\r\n parts[parts.length - 2] !== \"instincthub\" &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"username\" };\r\n }\r\n\r\n if (parts.length === 1 || parts.length === 2) {\r\n if (\r\n parts[0].includes(\"localhost:3000\") ||\r\n parts[0] === \"instincthub\" ||\r\n parts[1] === \"ngrok-free\"\r\n ) {\r\n return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n }\r\n if (\r\n !parts[parts.length - 2]?.includes(\"instincthub\") &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"domain\" };\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Converts an array of objects to FormData.\r\n * @param array Array of items to convert\r\n * @returns FormData object\r\n */\r\nexport const convertArrayToFormData = (array: FormItem[]): FormData => {\r\n const formData = new FormData();\r\n array.forEach((item, index) => {\r\n Object.entries(item).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n } else if (typeof value === \"object\" && value !== null) {\r\n if (key === \"upload_result\" && \"objectURL\" in value) {\r\n fetch((value as { objectURL: string }).objectURL)\r\n .then((res) => res.blob())\r\n .then((blob) => {\r\n formData.append(\r\n `item[${index}].${key}`,\r\n blob,\r\n \"upload_result_file\"\r\n );\r\n })\r\n .catch((error) =>\r\n console.error(\"Error converting blob URL:\", error)\r\n );\r\n } else {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n }\r\n } else {\r\n formData.append(`item[${index}].${key}`, String(value ?? \"\"));\r\n }\r\n });\r\n });\r\n return formData;\r\n};\r\n\r\n/**\r\n * Checks if an object is empty\r\n * @param obj Object to check\r\n * @returns True if empty, false otherwise\r\n */\r\nexport const objectIsEmpty = (obj: any): boolean => {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Handles form validation errors.\r\n * @param e Event object from form input\r\n * @param formError Current error list\r\n * @param setFormError Function to update error list\r\n * @returns Error message with status code\r\n */\r\nexport const handleInvalid = (\r\n e: React.FormEvent<HTMLInputElement>,\r\n formError: string[],\r\n setFormError: (errors: string[]) => void\r\n): [string, number] => {\r\n const target = e.target as HTMLInputElement;\r\n if (!formError.includes(target.name)) {\r\n setFormError([...formError, target.dataset.name || target.name]);\r\n }\r\n\r\n const errTag = document.getElementById(`id_${target.name}`);\r\n if (errTag) errTag.scrollIntoView();\r\n\r\n return [`Error: ${formError.join(\", \")} field(s) cannot be left blank.`, 400];\r\n};\r\n\r\n/**\r\n * Calculates average rating from an array of numbers.\r\n * @param ratings Array of ratings\r\n * @returns Average rating as a string with 1 decimal place\r\n */\r\nexport const calculateAverageRating = (ratings: number[]): string => {\r\n if (!ratings.length) return \"0.0\";\r\n const sum = ratings.reduce((acc, rating) => acc + rating, 0);\r\n return (sum / ratings.length).toFixed(1);\r\n};\r\n\r\n/**\r\n * Converts a string to a float, removing commas.\r\n * @param value Input string\r\n * @returns Parsed float\r\n */\r\nexport const convertToFloat = (value: string): number => {\r\n return parseFloat(value.replace(/,/g, \"\")) || 0;\r\n};\r\n\r\n/**\r\n * Formats a number with commas.\r\n * @param number Input number\r\n * @returns Formatted string or error message\r\n */\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n if (isNaN(number)) return \"Invalid number\";\r\n const [integer, decimal] = number.toString().split(\".\");\r\n const formattedInteger = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return decimal ? `${formattedInteger}.${decimal}` : formattedInteger;\r\n};\r\n\r\nexport const slugifyFileName = (fileName: string): string => {\r\n // Split the fileName by dot to separate the name and extension\r\n const parts: string[] = fileName.split(\".\");\r\n\r\n // Extract the extension\r\n const extension: string = parts.pop() || \"\";\r\n\r\n // Join the remaining parts with hyphen and replace special characters and brackets with hyphens\r\n const slugifiedName: string = parts\r\n .join(\"-\")\r\n .replace(/[^\\w\\s()-]/g, \"\")\r\n .replace(/[\\s_]+/g, \"-\")\r\n .toLowerCase();\r\n\r\n // Remove parentheses from the slugified name\r\n const nameWithoutParentheses: string = slugifiedName.replace(\r\n /\\(([^)]+)\\)/g,\r\n \"\"\r\n );\r\n\r\n // Only take first 50 characters\r\n const reduced_txt: string = nameWithoutParentheses.slice(0, 50);\r\n\r\n // Append the extension\r\n return reduced_txt + \".\" + extension.toLowerCase();\r\n};\r\n\r\n/**\r\n * Converts a string to a URL-friendly slug format.\r\n * @param value The string to convert to a slug\r\n * @example\r\n * ```ts\r\n * const slug = convertToSlug(\"Hello World\");\r\n * console.log(slug); // \"hello-world\"\r\n * ```\r\n * @returns A lowercase string with spaces and special characters replaced by hyphens\r\n * @throws Error if the resulting slug contains invalid characters\r\n */\r\nexport const convertToSlug = (value: string): string => {\r\n // Normalize the string to remove accents and other diacritics\r\n value = value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n\r\n // Convert to lowercase\r\n value = value.toLowerCase();\r\n\r\n // Replace any non-alphanumeric characters with a hyphen\r\n value = value.replace(/[^a-z0-9]+/g, \"-\");\r\n\r\n // Remove leading or trailing hyphens\r\n value = value.replace(/^-+|-+$/g, \"\");\r\n\r\n // Ensure the slug only contains valid characters\r\n if (!/^[a-z0-9_-]+$/.test(value)) {\r\n throw new Error(\r\n 'Enter a valid \"slug\" consisting of letters, numbers, underscores, or hyphens.'\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * Checks if an element is in the viewport.\r\n * @param element DOM element\r\n * @returns Boolean indicating visibility\r\n */\r\nexport const TrackViewPort = (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n};\r\n\r\n/**\r\n * Formats duration in minutes to a readable string.\r\n * @param durationInMinutes Duration in minutes\r\n * @returns Formatted duration string\r\n */\r\nexport const formatDuration = (durationInMinutes: number): string => {\r\n if (durationInMinutes === 0) return \"...\";\r\n if (durationInMinutes < 60) {\r\n return Math.floor(durationInMinutes)\r\n ? `${Math.floor(durationInMinutes)} Minutes`\r\n : `${durationInMinutes.toFixed(1)} Seconds`;\r\n }\r\n const hours = Math.floor(durationInMinutes / 60);\r\n const minutes = Math.floor(durationInMinutes % 60);\r\n return minutes === 0\r\n ? `${hours} Hours`\r\n : `${hours} Hours, ${minutes} Minutes`;\r\n};\r\n\r\n/**\r\n * Truncates HTML content to a specified length.\r\n * @param markdownText HTML string\r\n * @param maxLength Maximum length\r\n * @returns Truncated string\r\n */\r\nexport const truncateHtml = (\r\n markdownText: string,\r\n maxLength: number\r\n): string => {\r\n return markdownText.length > maxLength\r\n ? `${markdownText.substring(0, maxLength)}...`\r\n : markdownText;\r\n};\r\n\r\n/**\r\n * Formats a date to a readable string.\r\n * @param date Date object or string\r\n * @param type Format type (default: \"iiii do MMMM yyyy\")\r\n * @returns Formatted date string\r\n */\r\nexport const formatDateToWord = (\r\n date: Date | string,\r\n type: string = \"iiii do MMMM yyyy\"\r\n): string => {\r\n if (!date) return \"\";\r\n return format(new Date(date), type);\r\n};\r\n\r\n/**\r\n * Encodes the current URL.\r\n * @returns Encoded URL string or undefined if not in browser\r\n */\r\nexport const hostUrlEncode = (): string | undefined => {\r\n if (typeof document !== \"undefined\") {\r\n return encodeURIComponent(window.location.href);\r\n }\r\n};\r\n\r\n/**\r\n * Validates if input is alphanumeric and at least 3 characters.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidAlphanumeric = (input: string): boolean => {\r\n return input?.length >= 3 && /^[a-zA-Z0-9]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Validates if input is a valid email.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidEmail = (input: string): boolean => {\r\n return input?.length >= 3 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Converts a string to title case.\r\n * @param str Input string\r\n * @returns Title case string or original value if not a string\r\n */\r\nexport const toTitleCase = (str: any): any => {\r\n if (typeof str !== \"string\") return str;\r\n return str.replace(\r\n /\\w\\S*/g,\r\n (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase()\r\n );\r\n};\r\n\r\n/**\r\n * Gets a cookie value by name.\r\n * @param cname Cookie name\r\n * @returns Cookie value or null\r\n */\r\nexport const getCookie = (cname: string): string | null => {\r\n if (typeof document === \"undefined\") return null;\r\n const name = `${cname}=`;\r\n const ca = document.cookie.split(\";\");\r\n for (const c of ca) {\r\n const trimmed = c.trim();\r\n if (trimmed.startsWith(name)) return trimmed.substring(name.length);\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Removes a cookie by name.\r\n * @param cname Cookie name\r\n */\r\nexport const removeCookie = (cname: string): void => {\r\n if (typeof document !== \"undefined\") {\r\n document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\r\n }\r\n};\r\n\r\n/**\r\n * Sets a cookie with name, value, and expiration days.\r\n * @param cname Cookie name\r\n * @param cvalue Cookie value\r\n * @param exdays Expiration days\r\n */\r\nexport const setCookie = (\r\n cname: string,\r\n cvalue: string,\r\n exdays: number\r\n): void => {\r\n if (typeof document !== \"undefined\") {\r\n const d = new Date();\r\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\r\n document.cookie = `${cname}=${cvalue};expires=${d.toUTCString()};path=/`;\r\n }\r\n};\r\n\r\n/**\r\n * Prints an error message for a form field.\r\n * @param key Field name\r\n * @param value Error message\r\n * @param index Index for focusing first error\r\n */\r\nexport const printErr = (key: string, value: string, index: number): void => {\r\n const form = document.querySelector(\"#regForm\");\r\n if (!form) return;\r\n\r\n const inputField = form.querySelector<HTMLInputElement>(`[name=\"${key}\"]`);\r\n if (!inputField) return;\r\n\r\n inputField.style.borderColor = \"var(--TurkishRose)\";\r\n let errorTag: HTMLElement | null = null;\r\n\r\n if (inputField.type === \"radio\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.parentElement?.querySelector(\r\n \".error\"\r\n ) || null;\r\n } else if (inputField.type === \"file\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.querySelector(\".error\") || null;\r\n } else {\r\n errorTag = inputField.parentElement?.querySelector(\".error\") || null;\r\n }\r\n\r\n if (errorTag) {\r\n errorTag.textContent = value;\r\n } else {\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"error\");\r\n span.textContent = value;\r\n span.style.color = \"var(--TurkishRose)\";\r\n span.style.display = \"inline-block\";\r\n\r\n const parent =\r\n inputField.type === \"radio\"\r\n ? inputField.parentElement?.parentElement?.parentElement\r\n : inputField.type === \"file\" || inputField.nodeName === \"SELECT\"\r\n ? inputField.parentElement\r\n : inputField.parentElement?.parentElement;\r\n parent?.appendChild(span);\r\n }\r\n\r\n if (index === 0) inputField.focus();\r\n};\r\n\r\n/**\r\n * Handles server response errors for forms.\r\n * @param status HTTP status code\r\n * @param items Error or success data\r\n * @param registerForm Form element\r\n * @param r_path Redirect path\r\n */\r\nexport const handleError = (\r\n status: number,\r\n items: Record<string, string[]>,\r\n registerForm: HTMLFormElement | null,\r\n r_path: string | null\r\n): void => {\r\n const serverTag = document.querySelector(\".server_err\") as HTMLElement | null;\r\n if (!serverTag) return;\r\n\r\n if (status === 400) {\r\n if (items.user?.[0] === \"This field must be unique.\" || items.username) {\r\n serverTag.style.display = \"block\";\r\n serverTag.style.backgroundColor = \"var(--DarkCyan)\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n \"We already have your details!\";\r\n if (\r\n [\"/register/details\", \"/register/details/\"].includes(\r\n document.location.pathname\r\n )\r\n ) {\r\n const button = serverTag.querySelector(\"a button span\");\r\n if (button) button.innerHTML = \"Take Assessment\";\r\n const link = serverTag.querySelector(\"a\");\r\n if (link) link.href = \"/quiz/\";\r\n }\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n } else {\r\n spinBtn(registerForm, \"none\", false);\r\n Object.entries(items).forEach(([key, value], index) =>\r\n printErr(key, value[0], index)\r\n );\r\n serverTag.style.display = \"none\";\r\n }\r\n } else if ([200, 201, 202].includes(status) && r_path) {\r\n window.location.href = r_path;\r\n } else if (status === 401) {\r\n serverTag.style.display = \"block\";\r\n serverTag.querySelector(\"a\")!.innerHTML = \"\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n typeof items.detail === \"string\" ? items.detail : \"Unauthorized\";\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n }\r\n};\r\n\r\n/**\r\n * Gets a value from an object using a path string (e.g., \"course.title\" or \"course.lecturer.full_name\")\r\n * @param row The data object to extract value from\r\n * @param accessor The path to the value (e.g., \"course.title\")\r\n * @returns The value at the specified path or empty string if not found\r\n */\r\nexport function getNestedValue(row: any, accessor: string): any {\r\n try {\r\n return accessor\r\n .split(\".\")\r\n .reduce(\r\n (obj, key) => (obj && obj[key] !== undefined ? obj[key] : \"\"),\r\n row\r\n );\r\n } catch (error) {\r\n console.warn(`Error accessing ${accessor}:`, error);\r\n return \"\";\r\n }\r\n}\r\n\r\n/**\r\n * Creates request options for fetch API.\r\n * @param method HTTP method (GET, POST, PUT, DELETE)\r\n * @param data Request body (BodyInit | FormData | null)\r\n * @param token Auth token string or null\r\n * @param content_type Content type (json, form-data, null, false)\r\n * @param channel Channel ID string or null\r\n * @param auth_sk Use auth secret boolean (true, false)\r\n * @returns Request options object\r\n *\r\n * Set environment\r\n * NEXT_PUBLIC_INSTINCTHUB_SK_KEY=\"Your secret key name\"\r\n * NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET=\"Your seceret key\"\r\n */\r\nexport const reqOptions = (\r\n method: string,\r\n data: BodyInit | FormData | null = null,\r\n token: string | null = null,\r\n content_type: \"json\" | \"form-data\" | null | false = false,\r\n channel: string | null = null,\r\n auth_sk: boolean = false\r\n): RequestOptions => {\r\n // InstinctHub SK (for authentication)\r\n const ihub_skn = process.env.NEXT_PUBLIC_INSTINCTHUB_SKH_KEY || \"\";\r\n const ihub_skv = process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER || \"\";\r\n const ihubKey =\r\n ihub_skn && ihub_skv\r\n ? {\r\n [ihub_skn]: ihub_skv,\r\n }\r\n : {};\r\n\r\n // Leadboard SK (for tracking)\r\n const lead_skn = process.env.NEXT_PUBLIC_LEADBOARD_SK_NAME || \"\";\r\n const lead_skv = process.env.NEXT_PUBLIC_LEADBOARD_SK_VALUE || \"\";\r\n const leadKey =\r\n lead_skn && lead_skv\r\n ? {\r\n [lead_skn]: lead_skv,\r\n }\r\n : {};\r\n\r\n // InstinctHub SK (for authentication)\r\n const sk_key = process.env.NEXT_PUBLIC_INSTINCTHUB_SK_KEY || \"\";\r\n const sk_value = process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET ?? \"\";\r\n const authKey =\r\n sk_key && sk_value && auth_sk\r\n ? {\r\n [sk_key]: sk_value,\r\n }\r\n : {};\r\n\r\n // Combine all SKs\r\n const headers: Record<string, string> = {\r\n ...leadKey,\r\n ...ihubKey,\r\n ...authKey,\r\n };\r\n\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n if (channel) headers[\"channel-id\"] = channel;\r\n if (content_type === \"json\") headers[\"Content-Type\"] = \"application/json\";\r\n if (content_type === \"form-data\")\r\n headers[\"Content-Type\"] = \"multipart/form-data\";\r\n\r\n const request: RequestOptions = { method, headers, redirect: \"follow\" };\r\n if (data) request[\"body\"] = data;\r\n else request[\"body\"] = null;\r\n\r\n if (IN_DEV_MODE) console.log(request);\r\n return request;\r\n};\r\n\r\n/**\r\n * Fetches paginated data from an API.\r\n * @function\r\n * @example\r\n * ```ts\r\n * fetchData(page, token, options, data, setData, setCount, setNext, setPrevious, setIsLoading, reset);\r\n * ```\r\n * @param page API endpoint\r\n * @param token Auth token\r\n * @param options Request options\r\n * @param data Existing data\r\n * @param setData Data setter\r\n * @param setCount Count setter\r\n * @param setNext Next page setter\r\n * @param setPrevious Previous page setter\r\n * @param setIsLoading Loading state setter\r\n * @param reset Reset state\r\n * @returns\r\n * @see {@link FetchDataType}\r\n */\r\n\r\nexport const fetchData = async (\r\n page: string,\r\n token: string | null,\r\n options: object,\r\n data: any[],\r\n setData: React.Dispatch<React.SetStateAction<any>>,\r\n setCount: React.Dispatch<React.SetStateAction<number>>,\r\n setNext: React.Dispatch<React.SetStateAction<string | null>>,\r\n setPrevious: React.Dispatch<React.SetStateAction<string | null>>,\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\r\n reset = false\r\n) => {\r\n // Fetch paginated data when user scrolls\r\n if (!token) return;\r\n\r\n try {\r\n // Fetch data from the server with pagination\r\n const response = await fetch(page, options);\r\n const newData: any = await response.json();\r\n if (response.status === 401) {\r\n openToast(\"Unauthorized fetchData\", 401);\r\n return;\r\n }\r\n\r\n // Append the new data to the existing data\r\n if (reset) {\r\n setData(newData.results);\r\n setCount(newData.count);\r\n } else {\r\n setData([...data, ...newData.results]);\r\n }\r\n setNext(newData.next);\r\n setPrevious(newData.previous);\r\n } catch (error) {\r\n openToast(\"Error fetching data\", 500);\r\n console.error(\"Error fetching data:\", error);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Fetches data from an API with error handling.\r\n * @param session Callback or state setter\r\n * @param api API endpoint\r\n * @param reqOptions Request options\r\n * @param isFunctionComponent Is functional component\r\n * @param setIsLoading (optional) IsLoading state setter (boolean)\r\n * @param setStatus (optional) Status setter (number | null)\r\n * @param setError (optional) Error setter (any)\r\n * @param flag (optional) Handle status errors (boolean)\r\n * @returns Promise with result or error\r\n */\r\n\r\nexport const fetchAPI = async <T>(\r\n session:\r\n | ((data: T) => void)\r\n | { setState: (state: { data?: T; status?: number; error?: any }) => void },\r\n api: string,\r\n reqOptions: RequestOptions,\r\n isFunctionComponent: boolean = false,\r\n setIsLoading?: (((loading: boolean) => void) | null) | null,\r\n setStatus?: ((status: number | null) => void) | null,\r\n setError?: ((error: any) => void) | null,\r\n flag: boolean = false\r\n): Promise<T | Error> => {\r\n try {\r\n const response = await fetch(api, reqOptions);\r\n const status = response.status;\r\n const result = (await response.json()) as T;\r\n\r\n if (isFunctionComponent) {\r\n if ([400, 401, 404, 500].includes(status)) {\r\n setError?.(result);\r\n } else if ([200, 201].includes(status)) {\r\n (session as (data: T) => void)(result);\r\n setError?.(null);\r\n }\r\n setStatus?.(status);\r\n } else {\r\n (session as { setState: any }).setState({ data: result, status });\r\n }\r\n\r\n if (IN_DEV_MODE) {\r\n console.log(\r\n \"Request Options:\",\r\n reqOptions,\r\n \"Response Data:\",\r\n result,\r\n \"Status Code:\",\r\n status\r\n );\r\n }\r\n if (flag) handleStatusError(status);\r\n\r\n return result;\r\n } catch (error) {\r\n if (isFunctionComponent) {\r\n (session as (error: any) => void)(error);\r\n setError?.(error);\r\n setStatus?.(null);\r\n } else {\r\n (session as { setState: any }).setState({ error });\r\n }\r\n if (IN_DEV_MODE)\r\n console.log(\"Request Options:\", reqOptions, \"Error:\", error);\r\n return error as Error;\r\n } finally {\r\n if (setIsLoading) setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Handles HTTP status errors with navigation.\r\n * @param status HTTP status code\r\n */\r\nexport const handleStatusError = (status: number): void => {\r\n if (status === 401) forbidden();\r\n else if (status === 404) notFound();\r\n};\r\n\r\n/**\r\n * Toggles form button spinner and disabled state.\r\n * @param form Form element\r\n * @param display Spinner display style\r\n * @param status Disabled status\r\n */\r\nexport const spinBtn = (\r\n form: HTMLFormElement | null,\r\n display: \"none\" | \"inline-block\",\r\n status: boolean\r\n): void => {\r\n if (!form) return;\r\n const button = form.querySelector<HTMLButtonElement>(\"button.submit_bt\");\r\n if (button) {\r\n button.disabled = status;\r\n const spinner = button.querySelector(\".bt-spinner\") as HTMLElement | null;\r\n if (spinner) spinner.style.display = display;\r\n }\r\n form.disabled = status;\r\n};\r\n\r\n/**\r\n * Resends OTP to an email.\r\n * @param email User email\r\n * @returns Promise with response data\r\n */\r\nexport const handleResendOTP = async (email: string): Promise<any> => {\r\n const formData = new FormData();\r\n formData.append(\"email\", email);\r\n const requestOptions = reqOptions(\"POST\", formData);\r\n const response = await fetch(\r\n `${API_HOST_URL}auth/skills/request_new_otp/`,\r\n requestOptions\r\n );\r\n return response.json();\r\n};\r\n"],"names":["IN_DEV_MODE","process","env","NODE_ENV","API_HOST_URL","_process$env$NEXT_PUB","NEXT_PUBLIC_API_HOST","FILE_URL","_process$env$NEXT_PUB2","NEXT_PUBLIC_FILE_URL","VIDEO_URL","_process$env$NEXT_PUB3","NEXT_PUBLIC_VIDEO_URL","CODECS_URL_M3U8","_process$env$NEXT_PUB4","NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8","addUserDomain","_ref","_asyncToGenerator","_regeneratorRuntime","regeneratorRuntime","mark","_callee","domain","_process$env$NEXT_PUB5","payload","vercelOptions","wrap","_context","prev","next","name","concat","method","headers","Authorization","NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN","body","JSON","stringify","abrupt","fetch","NEXT_PUBLIC_VERCEL_PROJECT_ID","NEXT_PUBLIC_VERCEL_TEAM_ID","stop","_x","apply","this","arguments","printErr","key","value","index","form","document","querySelector","inputField","style","borderColor","_inputField$parentEle","errorTag","type","parentElement","_inputField$parentEle2","_inputField$parentEle3","textContent","_inputField$parentEle4","_inputField$parentEle5","span","createElement","classList","add","color","display","parent","nodeName","appendChild","focus","reqOptions","_process$env$NEXT_PUB6","data","length","undefined","token","content_type","channel","auth_sk","ihub_skn","NEXT_PUBLIC_INSTINCTHUB_SKH_KEY","ihub_skv","NEXT_PUBLIC_INSTINCTHUB_SK_HEADER","ihubKey","_defineProperty","lead_skn","NEXT_PUBLIC_LEADBOARD_SK_NAME","lead_skv","NEXT_PUBLIC_LEADBOARD_SK_VALUE","leadKey","sk_key","NEXT_PUBLIC_INSTINCTHUB_SK_KEY","sk_value","NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET","authKey","_objectSpread","objectSpread2","request","redirect","console","log","fetchData","_ref10","_callee2","page","options","setData","setCount","setNext","setPrevious","setIsLoading","reset","response","newData","_args2","_context2","sent","json","status","openToast","results","count","_toConsumableArray","previous","t0","error","finish","_x2","_x3","_x4","_x5","_x6","_x7","_x8","_x9","_x10","fetchAPI","_ref11","_callee3","session","api","isFunctionComponent","setStatus","setError","flag","result","_args3","_context3","includes","setState","handleStatusError","_x11","_x12","_x13","forbidden","notFound","spinBtn","button","disabled","spinner","handleResendOTP","_ref12","_callee4","email","formData","requestOptions","_context4","FormData","append","_x14","element","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","amount","percentage","detail","ratings","reduce","acc","rating","toFixed","courses","total","_ref2","course","Number","parseInt","credits","toString","array","forEach","item","Object","entries","_ref3","_ref4","_slicedToArray","Array","isArray","_typeof","objectURL","then","res","blob","String","parseFloat","replace","normalize","toLowerCase","test","Error","hostname","field","_parts","parts","split","namesArray","obj","filter","date","format","formatDate","Date","durationInMinutes","Math","floor","hours","minutes","number","isNaN","_number$toString$spli","_number$toString$spli2","integer","decimal","formattedInteger","cname","_step","ca","cookie","_iterator","_createForOfIteratorHelper","createForOfIteratorHelper","s","n","done","trimmed","trim","startsWith","substring","err","e","f","row","accessor","warn","items","registerForm","r_path","_items$user","serverTag","user","username","backgroundColor","location","pathname","innerHTML","link","href","_ref5","_ref6","formError","setFormError","target","toConsumableArray","dataset","errTag","getElementById","scrollIntoView","join","encodeURIComponent","input","prop","hasOwnProperty","cvalue","exdays","d","setTime","getTime","toUTCString","fileName","extension","pop","slice","str","val","_unused","txt","charAt","toUpperCase","markdownText","maxLength"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpFunction.js","sources":["../../../../src/components/lib/helpFunction.ts"],"sourcesContent":["// TypeScript version of the original JavaScript document\r\nimport { format } from \"date-fns\";\r\nimport { forbidden, notFound } from \"next/navigation\";\r\nimport { openToast } from \"./modals/modals\";\r\nimport React from \"react\";\r\n\r\n// Constants with Type Safety\r\nexport const IN_DEV_MODE: boolean = process.env.NODE_ENV === \"development\";\r\nexport const API_HOST_URL: string = process.env.NEXT_PUBLIC_API_HOST ?? \"\";\r\nexport const FILE_URL: string = process.env.NEXT_PUBLIC_FILE_URL ?? \"\";\r\nexport const VIDEO_URL: string = process.env.NEXT_PUBLIC_VIDEO_URL ?? \"\";\r\nexport const CODECS_URL_M3U8: string =\r\n process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8 ?? \"\";\r\n\r\nexport const romansFigure: string[] = [\r\n \"I\",\r\n \"II\",\r\n \"III\",\r\n \"IV\",\r\n \"V\",\r\n \"VI\",\r\n \"VII\",\r\n \"VIII\",\r\n \"IX\",\r\n \"X\",\r\n];\r\n\r\n// Interfaces for Type Safety\r\ninterface VercelDomainRequest {\r\n name: string;\r\n}\r\n\r\ninterface VercelFetchOptions extends RequestInit {\r\n headers: {\r\n Authorization: string;\r\n [key: string]: string;\r\n };\r\n}\r\n\r\ninterface Course {\r\n credits: string | number;\r\n}\r\n\r\ninterface CourseObj {\r\n course: Course;\r\n}\r\n\r\ninterface SubDomainResult {\r\n value: string;\r\n field: \"username\" | \"domain\";\r\n}\r\n\r\ninterface FormItem {\r\n [key: string]: string | number | object | Blob | null | undefined | any[];\r\n}\r\n\r\ninterface RequestOptions extends RequestInit {\r\n headers: Record<string, string>;\r\n body?: BodyInit | FormData | null;\r\n}\r\n\r\n// Functions\r\n\r\n/**\r\n * Adds a subdomain to Vercel project.\r\n * @param domain The domain to add as a subdomain\r\n * @returns Promise resolving to the fetch Response\r\n */\r\nexport const addUserDomain = async (domain: string): Promise<Response> => {\r\n const payload: VercelDomainRequest = { name: `${domain}.instincthub.com` };\r\n const vercelOptions: VercelFetchOptions = {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${\r\n process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN ?? \"\"\r\n }`,\r\n },\r\n body: JSON.stringify(payload),\r\n };\r\n\r\n return fetch(\r\n `https://api.vercel.com/v10/projects/${process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID}/domains?teamId=${process.env.NEXT_PUBLIC_VERCEL_TEAM_ID}`,\r\n vercelOptions\r\n );\r\n};\r\n\r\n/**\r\n * Strips HTML tags from a string.\r\n * @param str Input string with potential HTML tags\r\n * @returns Cleaned string without HTML tags\r\n */\r\nexport const stripHtmlTags = (str: string): string => {\r\n return str.replace(/<[^>]*>/g, \"\");\r\n};\r\n\r\n/**\r\n * Removes commas from a number string and converts to number.\r\n * @param str Input string or number\r\n * @returns Parsed number or 0 if invalid\r\n */\r\nexport const stripCommaFromNumber = (str: string | number): number => {\r\n try {\r\n if (typeof str === \"number\") return str;\r\n const val = str.replace(/,/g, \"\");\r\n return Number(val) || 0;\r\n } catch {\r\n return 0;\r\n }\r\n};\r\n\r\n/**\r\n * Calculates total credits from an array of course objects.\r\n * @param courses Array of course objects\r\n * @returns Total credits as a number\r\n */\r\nexport const calculateTotalCredits = (courses: CourseObj[]): number => {\r\n return courses.reduce((total, { course }) => {\r\n const credits = Number.parseInt(course.credits.toString(), 10) || 0;\r\n return total + credits;\r\n }, 0);\r\n};\r\n\r\n/**\r\n * Calculates amount after percentage deduction.\r\n * @param amount Base amount\r\n * @param percentage Percentage to deduct (0-100)\r\n * @returns Object with final amount or error details\r\n */\r\nexport const calculateAmountAfterDeduction = (\r\n amount: number,\r\n percentage: number\r\n): { amount: number; detail?: string } => {\r\n if (amount < 0 || percentage < 0 || percentage > 100) {\r\n return {\r\n amount: 0,\r\n detail:\r\n \"Amount and percentage should be positive, and percentage should be between 0 and 100.\",\r\n };\r\n }\r\n const deduction = (amount * percentage) / 100;\r\n return { amount: amount - deduction };\r\n};\r\n\r\n/**\r\n * Finds keys in an object that are null, undefined, or empty string.\r\n * @param namesArray Array of keys to check\r\n * @param obj Object to inspect\r\n * @returns Array of keys with null/empty values\r\n */\r\nexport const findNullOrEmptyKeys = <T extends Record<string, any>>(\r\n namesArray: string[],\r\n obj: T\r\n): string[] => {\r\n return namesArray.filter((key) => obj[key] == null || obj[key] === \"\");\r\n};\r\n\r\n/**\r\n * Extracts subdomain or domain from hostname.\r\n * @param hostname Hostname string\r\n * @returns Subdomain result or null\r\n */\r\nexport const extractSubDomain = (hostname: string): SubDomainResult | null => {\r\n if (IN_DEV_MODE) return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n if (!hostname.includes(\"instincthub.com\") && !IN_DEV_MODE) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n\r\n const parts = hostname.split(\".\");\r\n if (parts.length > 1) {\r\n if (parts[1] === \"ngrok-free\")\r\n return { value: \"skills\", field: \"username\" };\r\n if (\r\n parts[parts.length - 2] !== \"instincthub\" &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"username\" };\r\n }\r\n\r\n if (parts.length === 1 || parts.length === 2) {\r\n if (\r\n parts[0].includes(\"localhost:3000\") ||\r\n parts[0] === \"instincthub\" ||\r\n parts[1] === \"ngrok-free\"\r\n ) {\r\n return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n }\r\n if (\r\n !parts[parts.length - 2]?.includes(\"instincthub\") &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"domain\" };\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Converts an array of objects to FormData.\r\n * @param array Array of items to convert\r\n * @returns FormData object\r\n */\r\nexport const convertArrayToFormData = (array: FormItem[]): FormData => {\r\n const formData = new FormData();\r\n array.forEach((item, index) => {\r\n Object.entries(item).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n } else if (typeof value === \"object\" && value !== null) {\r\n if (key === \"upload_result\" && \"objectURL\" in value) {\r\n fetch((value as { objectURL: string }).objectURL)\r\n .then((res) => res.blob())\r\n .then((blob) => {\r\n formData.append(\r\n `item[${index}].${key}`,\r\n blob,\r\n \"upload_result_file\"\r\n );\r\n })\r\n .catch((error) =>\r\n console.error(\"Error converting blob URL:\", error)\r\n );\r\n } else {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n }\r\n } else {\r\n formData.append(`item[${index}].${key}`, String(value ?? \"\"));\r\n }\r\n });\r\n });\r\n return formData;\r\n};\r\n\r\n/**\r\n * Checks if an object is empty\r\n * @param obj Object to check\r\n * @returns True if empty, false otherwise\r\n */\r\nexport const objectIsEmpty = (obj: any): boolean => {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Handles form validation errors.\r\n * @param e Event object from form input\r\n * @param formError Current error list\r\n * @param setFormError Function to update error list\r\n * @returns Error message with status code\r\n */\r\nexport const handleInvalid = (\r\n e: React.FormEvent<HTMLInputElement>,\r\n formError: string[],\r\n setFormError: (errors: string[]) => void\r\n): [string, number] => {\r\n const target = e.target as HTMLInputElement;\r\n if (!formError.includes(target.name)) {\r\n setFormError([...formError, target.dataset.name || target.name]);\r\n }\r\n\r\n const errTag = document.getElementById(`id_${target.name}`);\r\n if (errTag) errTag.scrollIntoView();\r\n\r\n return [`Error: ${formError.join(\", \")} field(s) cannot be left blank.`, 400];\r\n};\r\n\r\n/**\r\n * Calculates average rating from an array of numbers.\r\n * @param ratings Array of ratings\r\n * @returns Average rating as a string with 1 decimal place\r\n */\r\nexport const calculateAverageRating = (ratings: number[]): string => {\r\n if (!ratings.length) return \"0.0\";\r\n const sum = ratings.reduce((acc, rating) => acc + rating, 0);\r\n return (sum / ratings.length).toFixed(1);\r\n};\r\n\r\n/**\r\n * Converts a string to a float, removing commas.\r\n * @param value Input string\r\n * @returns Parsed float\r\n */\r\nexport const convertToFloat = (value: string): number => {\r\n return parseFloat(value.replace(/,/g, \"\")) || 0;\r\n};\r\n\r\n/**\r\n * Formats a number with commas.\r\n * @param number Input number\r\n * @returns Formatted string or error message\r\n */\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n if (isNaN(number)) return \"Invalid number\";\r\n const [integer, decimal] = number.toString().split(\".\");\r\n const formattedInteger = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return decimal ? `${formattedInteger}.${decimal}` : formattedInteger;\r\n};\r\n\r\nexport const slugifyFileName = (fileName: string): string => {\r\n // Split the fileName by dot to separate the name and extension\r\n const parts: string[] = fileName.split(\".\");\r\n\r\n // Extract the extension\r\n const extension: string = parts.pop() || \"\";\r\n\r\n // Join the remaining parts with hyphen and replace special characters and brackets with hyphens\r\n const slugifiedName: string = parts\r\n .join(\"-\")\r\n .replace(/[^\\w\\s()-]/g, \"\")\r\n .replace(/[\\s_]+/g, \"-\")\r\n .toLowerCase();\r\n\r\n // Remove parentheses from the slugified name\r\n const nameWithoutParentheses: string = slugifiedName.replace(\r\n /\\(([^)]+)\\)/g,\r\n \"\"\r\n );\r\n\r\n // Only take first 50 characters\r\n const reduced_txt: string = nameWithoutParentheses.slice(0, 50);\r\n\r\n // Append the extension\r\n return reduced_txt + \".\" + extension.toLowerCase();\r\n};\r\n\r\n/**\r\n * Converts a string to a URL-friendly slug format.\r\n * @param value The string to convert to a slug\r\n * @example\r\n * ```ts\r\n * const slug = convertToSlug(\"Hello World\");\r\n * console.log(slug); // \"hello-world\"\r\n * ```\r\n * @returns A lowercase string with spaces and special characters replaced by hyphens\r\n * @throws Error if the resulting slug contains invalid characters\r\n */\r\nexport const convertToSlug = (value: string): string => {\r\n // Normalize the string to remove accents and other diacritics\r\n value = value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n\r\n // Convert to lowercase\r\n value = value.toLowerCase();\r\n\r\n // Replace any non-alphanumeric characters with a hyphen\r\n value = value.replace(/[^a-z0-9]+/g, \"-\");\r\n\r\n // Remove leading or trailing hyphens\r\n value = value.replace(/^-+|-+$/g, \"\");\r\n\r\n // Ensure the slug only contains valid characters\r\n if (!/^[a-z0-9_-]+$/.test(value)) {\r\n throw new Error(\r\n 'Enter a valid \"slug\" consisting of letters, numbers, underscores, or hyphens.'\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * Checks if an element is in the viewport.\r\n * @param element DOM element\r\n * @returns Boolean indicating visibility\r\n */\r\nexport const TrackViewPort = (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n};\r\n\r\n/**\r\n * Formats duration in minutes to a readable string.\r\n * @param durationInMinutes Duration in minutes\r\n * @returns Formatted duration string\r\n */\r\nexport const formatDuration = (durationInMinutes: number): string => {\r\n if (durationInMinutes === 0) return \"...\";\r\n if (durationInMinutes < 60) {\r\n return Math.floor(durationInMinutes)\r\n ? `${Math.floor(durationInMinutes)} Minutes`\r\n : `${durationInMinutes.toFixed(1)} Seconds`;\r\n }\r\n const hours = Math.floor(durationInMinutes / 60);\r\n const minutes = Math.floor(durationInMinutes % 60);\r\n return minutes === 0\r\n ? `${hours} Hours`\r\n : `${hours} Hours, ${minutes} Minutes`;\r\n};\r\n\r\n/**\r\n * Truncates HTML content to a specified length.\r\n * @param markdownText HTML string\r\n * @param maxLength Maximum length\r\n * @returns Truncated string\r\n */\r\nexport const truncateHtml = (\r\n markdownText: string,\r\n maxLength: number\r\n): string => {\r\n return markdownText.length > maxLength\r\n ? `${markdownText.substring(0, maxLength)}...`\r\n : markdownText;\r\n};\r\n\r\n/**\r\n * Formats a date to a readable string.\r\n * @param date Date object or string\r\n * @param type Format type (default: \"iiii do MMMM yyyy\")\r\n * @returns Formatted date string\r\n */\r\nexport const formatDateToWord = (\r\n date: Date | string,\r\n type: string = \"iiii do MMMM yyyy\"\r\n): string => {\r\n if (!date) return \"\";\r\n return format(new Date(date), type);\r\n};\r\n\r\n/**\r\n * Encodes the current URL.\r\n * @returns Encoded URL string or undefined if not in browser\r\n */\r\nexport const hostUrlEncode = (): string | undefined => {\r\n if (typeof document !== \"undefined\") {\r\n return encodeURIComponent(window.location.href);\r\n }\r\n};\r\n\r\n/**\r\n * Validates if input is alphanumeric and at least 3 characters.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidAlphanumeric = (input: string): boolean => {\r\n return input?.length >= 3 && /^[a-zA-Z0-9]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Validates if input is a valid email.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidEmail = (input: string): boolean => {\r\n return input?.length >= 3 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Converts a string to title case.\r\n * @param str Input string\r\n * @returns Title case string or original value if not a string\r\n */\r\nexport const toTitleCase = (str: any): any => {\r\n if (typeof str !== \"string\") return str;\r\n return str.replace(\r\n /\\w\\S*/g,\r\n (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase()\r\n );\r\n};\r\n\r\n/**\r\n * Gets a cookie value by name.\r\n * @param cname Cookie name\r\n * @returns Cookie value or null\r\n */\r\nexport const getCookie = (cname: string): string | null => {\r\n if (typeof document === \"undefined\") return null;\r\n const name = `${cname}=`;\r\n const ca = document.cookie.split(\";\");\r\n for (const c of ca) {\r\n const trimmed = c.trim();\r\n if (trimmed.startsWith(name)) return trimmed.substring(name.length);\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Removes a cookie by name.\r\n * @param cname Cookie name\r\n */\r\nexport const removeCookie = (cname: string): void => {\r\n if (typeof document !== \"undefined\") {\r\n document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\r\n }\r\n};\r\n\r\n/**\r\n * Sets a cookie with name, value, and expiration days.\r\n * @param cname Cookie name\r\n * @param cvalue Cookie value\r\n * @param exdays Expiration days\r\n */\r\nexport const setCookie = (\r\n cname: string,\r\n cvalue: string,\r\n exdays: number\r\n): void => {\r\n if (typeof document !== \"undefined\") {\r\n const d = new Date();\r\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\r\n document.cookie = `${cname}=${cvalue};expires=${d.toUTCString()};path=/`;\r\n }\r\n};\r\n\r\n/**\r\n * Prints an error message for a form field.\r\n * @param key Field name\r\n * @param value Error message\r\n * @param index Index for focusing first error\r\n */\r\nexport const printErr = (key: string, value: string, index: number): void => {\r\n const form = document.querySelector(\"#regForm\");\r\n if (!form) return;\r\n\r\n const inputField = form.querySelector<HTMLInputElement>(`[name=\"${key}\"]`);\r\n if (!inputField) return;\r\n\r\n inputField.style.borderColor = \"var(--TurkishRose)\";\r\n let errorTag: HTMLElement | null = null;\r\n\r\n if (inputField.type === \"radio\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.parentElement?.querySelector(\r\n \".error\"\r\n ) || null;\r\n } else if (inputField.type === \"file\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.querySelector(\".error\") || null;\r\n } else {\r\n errorTag = inputField.parentElement?.querySelector(\".error\") || null;\r\n }\r\n\r\n if (errorTag) {\r\n errorTag.textContent = value;\r\n } else {\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"error\");\r\n span.textContent = value;\r\n span.style.color = \"var(--TurkishRose)\";\r\n span.style.display = \"inline-block\";\r\n\r\n const parent =\r\n inputField.type === \"radio\"\r\n ? inputField.parentElement?.parentElement?.parentElement\r\n : inputField.type === \"file\" || inputField.nodeName === \"SELECT\"\r\n ? inputField.parentElement\r\n : inputField.parentElement?.parentElement;\r\n parent?.appendChild(span);\r\n }\r\n\r\n if (index === 0) inputField.focus();\r\n};\r\n\r\n/**\r\n * Removes all error messages and styles from form fields.\r\n * Cleans up error classes, borders, and error message elements.\r\n */\r\nexport const removeErrMsg = (): void => {\r\n // Remove error messages from fields with .s_err class\r\n const errElements = document.querySelectorAll(\".s_err\");\r\n if (errElements) {\r\n errElements.forEach((element) => {\r\n // Remove error styling from field\r\n const field = element.querySelector(\".field\") as HTMLElement | null;\r\n if (field) {\r\n field.style.border = \"none\";\r\n }\r\n\r\n // Remove error message and reset input/textarea borders\r\n const errMsg = element.querySelector(\".err_msg\");\r\n if (errMsg) {\r\n errMsg.remove();\r\n\r\n const input = element.querySelector(\"input\") as HTMLInputElement | null;\r\n const textarea = element.querySelector(\"textarea\") as HTMLTextAreaElement | null;\r\n\r\n if (input) {\r\n input.style.border = \"var(--borderDefault)\";\r\n } else if (textarea) {\r\n textarea.style.border = \"var(--borderDefault)\";\r\n }\r\n }\r\n\r\n element.classList.remove(\"s_err\");\r\n });\r\n }\r\n\r\n // Remove error banner messages\r\n const errBanner = document.querySelector(\"#err_message\") as HTMLElement | null;\r\n if (errBanner) {\r\n errBanner.classList.remove(\"active\");\r\n const ul = errBanner.querySelector(\"ul\");\r\n if (ul) {\r\n ul.innerHTML = \"\";\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Displays validation errors on form fields.\r\n * @param items Object containing field names as keys and error messages as values\r\n */\r\nexport const printErrNew = (items: Record<string, string | string[]>): void => {\r\n if (!items) return;\r\n\r\n let inputField: Element | null;\r\n\r\n Object.entries(items).forEach((item, index) => {\r\n const [key, value] = item;\r\n inputField = document.querySelector(`.${key}`);\r\n\r\n // Create error message element\r\n const errTag = document.createElement(\"P\");\r\n errTag.classList.add(\"err_msg\");\r\n errTag.style.color = \"var(--TurkishRose)\";\r\n errTag.textContent = Array.isArray(value) ? value[0] : value;\r\n\r\n // Add error styling if not already present\r\n if (\r\n inputField &&\r\n !inputField.classList.contains(\"s_err\") &&\r\n !inputField.querySelector(\".err_msg\")\r\n ) {\r\n inputField.classList.add(\"s_err\");\r\n inputField.append(errTag);\r\n\r\n const inputElement = inputField.querySelector(\".field input\") as HTMLInputElement | null;\r\n const textareaElement = inputField.querySelector(\".field textarea\") as HTMLTextAreaElement | null;\r\n\r\n if (\r\n inputElement &&\r\n (inputElement.getAttribute(\"type\") === \"number\" ||\r\n inputElement.getAttribute(\"type\") === \"text\" ||\r\n inputElement.getAttribute(\"type\") === \"email\" ||\r\n inputElement.getAttribute(\"type\") === \"password\")\r\n ) {\r\n inputElement.style.border = \"1px solid var(--TurkishRose)\";\r\n if (index === 0) {\r\n const targetInput = inputField.querySelector(`[name=\"${key}\"]`) as HTMLInputElement | null;\r\n targetInput?.focus();\r\n }\r\n } else if (textareaElement) {\r\n textareaElement.style.border = \"1px solid var(--TurkishRose)\";\r\n } else {\r\n const field = inputField.querySelector(\".field\") as HTMLElement | null;\r\n if (field) {\r\n field.style.border = \"1px solid var(--TurkishRose)\";\r\n }\r\n }\r\n\r\n inputTagErrorEvent(key, false);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Adds error styling and message to a specific input field.\r\n * @param tags The class name of the input field wrapper\r\n * @param border Whether to add border styling (default: true)\r\n */\r\nexport const inputTagErrorEvent = (tags: string, border: boolean = true): void => {\r\n const inputFieldWrap = document.querySelector(`div.${tags}`) as HTMLElement | null;\r\n const msgWrap = document.querySelector(\"#err_message\") as HTMLElement | null;\r\n\r\n if (!inputFieldWrap || !msgWrap) return;\r\n\r\n // Only add error if not already present\r\n if (!inputFieldWrap.classList.contains(\"s_err\")) {\r\n inputFieldWrap.classList.add(\"s_err\");\r\n msgWrap.classList.add(\"active\");\r\n\r\n // Add border styling if requested\r\n if (border) {\r\n const field = inputFieldWrap.querySelector(\".field\") as HTMLElement | null;\r\n if (field) {\r\n field.style.border = \"1px solid var(--TurkishRose)\";\r\n }\r\n }\r\n\r\n // Add error message to the banner\r\n const msgTag = document.createElement(\"LI\");\r\n const h5 = inputFieldWrap.querySelector(\"h5\");\r\n const textLabel = inputFieldWrap.querySelector(\".text_label\");\r\n\r\n if (h5) {\r\n msgTag.textContent = h5.textContent;\r\n } else if (textLabel) {\r\n msgTag.textContent = textLabel.textContent;\r\n }\r\n\r\n const ul = msgWrap.querySelector(\"ul\");\r\n if (ul) {\r\n ul.append(msgTag);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Abbreviates large numbers into a shorter format with suffixes.\r\n * @param amount The number to abbreviate\r\n * @returns Abbreviated string (e.g., \"1.5K\", \"2.3M\")\r\n * @example\r\n * abbreviateNumber(1500) // Returns \"1.5K\"\r\n * abbreviateNumber(2300000) // Returns \"2.3M\"\r\n */\r\nexport const abbreviateNumber = (amount: number): string => {\r\n const suffixes = [\"\", \"K\", \"M\", \"B\", \"T\"];\r\n const tier = Math.floor(Math.log10(Math.abs(amount)) / 3);\r\n\r\n if (tier === 0) return amount.toString();\r\n\r\n const suffix = suffixes[tier];\r\n const scale = Math.pow(10, tier * 3);\r\n const scaledAmount = amount / scale;\r\n\r\n return scaledAmount.toFixed(1) + suffix;\r\n};\r\n\r\n/**\r\n * Handles server response errors for forms.\r\n * @param status HTTP status code\r\n * @param items Error or success data\r\n * @param registerForm Form element\r\n * @param r_path Redirect path\r\n */\r\nexport const handleError = (\r\n status: number,\r\n items: Record<string, string[]>,\r\n registerForm: HTMLFormElement | null,\r\n r_path: string | null\r\n): void => {\r\n const serverTag = document.querySelector(\".server_err\") as HTMLElement | null;\r\n if (!serverTag) return;\r\n\r\n if (status === 400) {\r\n if (items.user?.[0] === \"This field must be unique.\" || items.username) {\r\n serverTag.style.display = \"block\";\r\n serverTag.style.backgroundColor = \"var(--DarkCyan)\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n \"We already have your details!\";\r\n if (\r\n [\"/register/details\", \"/register/details/\"].includes(\r\n document.location.pathname\r\n )\r\n ) {\r\n const button = serverTag.querySelector(\"a button span\");\r\n if (button) button.innerHTML = \"Take Assessment\";\r\n const link = serverTag.querySelector(\"a\");\r\n if (link) link.href = \"/quiz/\";\r\n }\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n } else {\r\n spinBtn(registerForm, \"none\", false);\r\n Object.entries(items).forEach(([key, value], index) =>\r\n printErr(key, value[0], index)\r\n );\r\n serverTag.style.display = \"none\";\r\n }\r\n } else if ([200, 201, 202].includes(status) && r_path) {\r\n window.location.href = r_path;\r\n } else if (status === 401) {\r\n serverTag.style.display = \"block\";\r\n serverTag.querySelector(\"a\")!.innerHTML = \"\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n typeof items.detail === \"string\" ? items.detail : \"Unauthorized\";\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n }\r\n};\r\n\r\n/**\r\n * Gets a value from an object using a path string (e.g., \"course.title\" or \"course.lecturer.full_name\")\r\n * @param row The data object to extract value from\r\n * @param accessor The path to the value (e.g., \"course.title\")\r\n * @returns The value at the specified path or empty string if not found\r\n */\r\nexport function getNestedValue(row: any, accessor: string): any {\r\n try {\r\n return accessor\r\n .split(\".\")\r\n .reduce(\r\n (obj, key) => (obj && obj[key] !== undefined ? obj[key] : \"\"),\r\n row\r\n );\r\n } catch (error) {\r\n console.warn(`Error accessing ${accessor}:`, error);\r\n return \"\";\r\n }\r\n}\r\n\r\n/**\r\n * Creates request options for fetch API.\r\n * @param method HTTP method (GET, POST, PUT, DELETE)\r\n * @param data Request body (BodyInit | FormData | null)\r\n * @param token Auth token string or null\r\n * @param content_type Content type (json, form-data, null, false)\r\n * @param channel Channel ID string or null\r\n * @param auth_sk Use auth secret boolean (true, false)\r\n * @returns Request options object\r\n *\r\n * Set environment\r\n * NEXT_PUBLIC_INSTINCTHUB_SK_KEY=\"Your secret key name\"\r\n * NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET=\"Your seceret key\"\r\n */\r\nexport const reqOptions = (\r\n method: string,\r\n data: BodyInit | FormData | null = null,\r\n token: string | null = null,\r\n content_type: \"json\" | \"form-data\" | null | false = false,\r\n channel: string | null = null,\r\n auth_sk: boolean = false\r\n): RequestOptions => {\r\n // InstinctHub SK (for authentication)\r\n const ihub_skn = process.env.NEXT_PUBLIC_INSTINCTHUB_SKH_KEY || \"\";\r\n const ihub_skv = process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER || \"\";\r\n const ihubKey =\r\n ihub_skn && ihub_skv\r\n ? {\r\n [ihub_skn]: ihub_skv,\r\n }\r\n : {};\r\n\r\n // Leadboard SK (for tracking)\r\n const lead_skn = process.env.NEXT_PUBLIC_LEADBOARD_SK_NAME || \"\";\r\n const lead_skv = process.env.NEXT_PUBLIC_LEADBOARD_SK_VALUE || \"\";\r\n const leadKey =\r\n lead_skn && lead_skv\r\n ? {\r\n [lead_skn]: lead_skv,\r\n }\r\n : {};\r\n\r\n // InstinctHub SK (for authentication)\r\n const sk_key = process.env.NEXT_PUBLIC_INSTINCTHUB_SK_KEY || \"\";\r\n const sk_value = process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET ?? \"\";\r\n const authKey =\r\n sk_key && sk_value && auth_sk\r\n ? {\r\n [sk_key]: sk_value,\r\n }\r\n : {};\r\n\r\n // Combine all SKs\r\n const headers: Record<string, string> = {\r\n ...leadKey,\r\n ...ihubKey,\r\n ...authKey,\r\n };\r\n\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n if (channel) headers[\"channel-id\"] = channel;\r\n if (content_type === \"json\") headers[\"Content-Type\"] = \"application/json\";\r\n if (content_type === \"form-data\")\r\n headers[\"Content-Type\"] = \"multipart/form-data\";\r\n\r\n const request: RequestOptions = { method, headers, redirect: \"follow\" };\r\n if (data) request[\"body\"] = data;\r\n else request[\"body\"] = null;\r\n\r\n if (IN_DEV_MODE) console.log(request);\r\n return request;\r\n};\r\n\r\n/**\r\n * Fetches paginated data from an API.\r\n * @function\r\n * @example\r\n * ```ts\r\n * fetchData(page, token, options, data, setData, setCount, setNext, setPrevious, setIsLoading, reset);\r\n * ```\r\n * @param page API endpoint\r\n * @param token Auth token\r\n * @param options Request options\r\n * @param data Existing data\r\n * @param setData Data setter\r\n * @param setCount Count setter\r\n * @param setNext Next page setter\r\n * @param setPrevious Previous page setter\r\n * @param setIsLoading Loading state setter\r\n * @param reset Reset state\r\n * @returns\r\n * @see {@link FetchDataType}\r\n */\r\n\r\nexport const fetchData = async (\r\n page: string,\r\n token: string | null,\r\n options: object,\r\n data: any[],\r\n setData: React.Dispatch<React.SetStateAction<any>>,\r\n setCount: React.Dispatch<React.SetStateAction<number>>,\r\n setNext: React.Dispatch<React.SetStateAction<string | null>>,\r\n setPrevious: React.Dispatch<React.SetStateAction<string | null>>,\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\r\n reset = false\r\n) => {\r\n // Fetch paginated data when user scrolls\r\n if (!token) return;\r\n\r\n try {\r\n // Fetch data from the server with pagination\r\n const response = await fetch(page, options);\r\n const newData: any = await response.json();\r\n if (response.status === 401) {\r\n openToast(\"Unauthorized fetchData\", 401);\r\n return;\r\n }\r\n\r\n // Append the new data to the existing data\r\n if (reset) {\r\n setData(newData.results);\r\n setCount(newData.count);\r\n } else {\r\n setData([...data, ...newData.results]);\r\n }\r\n setNext(newData.next);\r\n setPrevious(newData.previous);\r\n } catch (error) {\r\n openToast(\"Error fetching data\", 500);\r\n console.error(\"Error fetching data:\", error);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Fetches data from an API with error handling.\r\n * @param session Callback or state setter\r\n * @param api API endpoint\r\n * @param reqOptions Request options\r\n * @param isFunctionComponent Is functional component\r\n * @param setIsLoading (optional) IsLoading state setter (boolean)\r\n * @param setStatus (optional) Status setter (number | null)\r\n * @param setError (optional) Error setter (any)\r\n * @param flag (optional) Handle status errors (boolean)\r\n * @returns Promise with result or error\r\n */\r\n\r\nexport const fetchAPI = async <T>(\r\n session:\r\n | ((data: T) => void)\r\n | { setState: (state: { data?: T; status?: number; error?: any }) => void },\r\n api: string,\r\n reqOptions: RequestOptions,\r\n isFunctionComponent: boolean = false,\r\n setIsLoading?: (((loading: boolean) => void) | null) | null,\r\n setStatus?: ((status: number | null) => void) | null,\r\n setError?: ((error: any) => void) | null,\r\n flag: boolean = false\r\n): Promise<T | Error> => {\r\n try {\r\n const response = await fetch(api, reqOptions);\r\n const status = response.status;\r\n const result = (await response.json()) as T;\r\n\r\n if (isFunctionComponent) {\r\n if ([400, 401, 404, 500].includes(status)) {\r\n setError?.(result);\r\n } else if ([200, 201].includes(status)) {\r\n (session as (data: T) => void)(result);\r\n setError?.(null);\r\n }\r\n setStatus?.(status);\r\n } else {\r\n (session as { setState: any }).setState({ data: result, status });\r\n }\r\n\r\n if (IN_DEV_MODE) {\r\n console.log(\r\n \"Request Options:\",\r\n reqOptions,\r\n \"Response Data:\",\r\n result,\r\n \"Status Code:\",\r\n status\r\n );\r\n }\r\n if (flag) handleStatusError(status);\r\n\r\n return result;\r\n } catch (error) {\r\n if (isFunctionComponent) {\r\n (session as (error: any) => void)(error);\r\n setError?.(error);\r\n setStatus?.(null);\r\n } else {\r\n (session as { setState: any }).setState({ error });\r\n }\r\n if (IN_DEV_MODE)\r\n console.log(\"Request Options:\", reqOptions, \"Error:\", error);\r\n return error as Error;\r\n } finally {\r\n if (setIsLoading) setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Handles HTTP status errors with navigation.\r\n * @param status HTTP status code\r\n */\r\nexport const handleStatusError = (status: number): void => {\r\n if (status === 401) forbidden();\r\n else if (status === 404) notFound();\r\n};\r\n\r\n/**\r\n * Toggles form button spinner and disabled state.\r\n * @param form Form element\r\n * @param display Spinner display style\r\n * @param status Disabled status\r\n */\r\nexport const spinBtn = (\r\n form: HTMLFormElement | null,\r\n display: \"none\" | \"inline-block\",\r\n status: boolean\r\n): void => {\r\n if (!form) return;\r\n const button = form.querySelector<HTMLButtonElement>(\"button.submit_bt\");\r\n if (button) {\r\n button.disabled = status;\r\n const spinner = button.querySelector(\".bt-spinner\") as HTMLElement | null;\r\n if (spinner) spinner.style.display = display;\r\n }\r\n form.disabled = status;\r\n};\r\n\r\n/**\r\n * Resends OTP to an email.\r\n * @param email User email\r\n * @returns Promise with response data\r\n */\r\nexport const handleResendOTP = async (email: string): Promise<any> => {\r\n const formData = new FormData();\r\n formData.append(\"email\", email);\r\n const requestOptions = reqOptions(\"POST\", formData);\r\n const response = await fetch(\r\n `${API_HOST_URL}auth/skills/request_new_otp/`,\r\n requestOptions\r\n );\r\n return response.json();\r\n};\r\n"],"names":["IN_DEV_MODE","process","env","NODE_ENV","API_HOST_URL","_process$env$NEXT_PUB","NEXT_PUBLIC_API_HOST","FILE_URL","_process$env$NEXT_PUB2","NEXT_PUBLIC_FILE_URL","VIDEO_URL","_process$env$NEXT_PUB3","NEXT_PUBLIC_VIDEO_URL","CODECS_URL_M3U8","_process$env$NEXT_PUB4","NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8","addUserDomain","_ref","_asyncToGenerator","_regeneratorRuntime","regeneratorRuntime","mark","_callee","domain","_process$env$NEXT_PUB5","payload","vercelOptions","wrap","_context","prev","next","name","concat","method","headers","Authorization","NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN","body","JSON","stringify","abrupt","fetch","NEXT_PUBLIC_VERCEL_PROJECT_ID","NEXT_PUBLIC_VERCEL_TEAM_ID","stop","_x","apply","this","arguments","printErr","key","value","index","form","document","querySelector","inputField","style","borderColor","_inputField$parentEle","errorTag","type","parentElement","_inputField$parentEle2","_inputField$parentEle3","textContent","_inputField$parentEle4","_inputField$parentEle5","span","createElement","classList","add","color","display","parent","nodeName","appendChild","focus","inputTagErrorEvent","tags","border","length","undefined","inputFieldWrap","msgWrap","contains","field","msgTag","h5","textLabel","ul","append","reqOptions","_process$env$NEXT_PUB6","data","token","content_type","channel","auth_sk","ihub_skn","NEXT_PUBLIC_INSTINCTHUB_SKH_KEY","ihub_skv","NEXT_PUBLIC_INSTINCTHUB_SK_HEADER","ihubKey","_defineProperty","lead_skn","NEXT_PUBLIC_LEADBOARD_SK_NAME","lead_skv","NEXT_PUBLIC_LEADBOARD_SK_VALUE","leadKey","sk_key","NEXT_PUBLIC_INSTINCTHUB_SK_KEY","sk_value","NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET","authKey","_objectSpread","objectSpread2","request","redirect","console","log","fetchData","_ref10","_callee2","page","options","setData","setCount","setNext","setPrevious","setIsLoading","reset","response","newData","_args2","_context2","sent","json","status","openToast","results","count","_toConsumableArray","previous","t0","error","finish","_x2","_x3","_x4","_x5","_x6","_x7","_x8","_x9","_x10","fetchAPI","_ref11","_callee3","session","api","isFunctionComponent","setStatus","setError","flag","result","_args3","_context3","includes","setState","handleStatusError","_x11","_x12","_x13","forbidden","notFound","spinBtn","button","disabled","spinner","handleResendOTP","_ref12","_callee4","email","formData","requestOptions","_context4","FormData","_x14","element","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","amount","tier","Math","floor","log10","abs","toString","suffix","pow","toFixed","percentage","detail","ratings","reduce","acc","rating","courses","total","_ref2","course","Number","parseInt","credits","array","forEach","item","Object","entries","_ref3","_ref4","_slicedToArray","Array","isArray","_typeof","objectURL","then","res","blob","String","parseFloat","replace","normalize","toLowerCase","test","Error","hostname","_parts","parts","split","namesArray","obj","filter","date","format","formatDate","Date","durationInMinutes","hours","minutes","number","isNaN","_number$toString$spli","_number$toString$spli2","integer","decimal","formattedInteger","cname","_step","ca","cookie","_iterator","_createForOfIteratorHelper","createForOfIteratorHelper","s","n","done","trimmed","trim","startsWith","substring","err","e","f","row","accessor","warn","items","registerForm","r_path","_items$user","serverTag","user","username","backgroundColor","location","pathname","innerHTML","link","href","_ref5","_ref6","formError","setFormError","target","toConsumableArray","dataset","errTag","getElementById","scrollIntoView","join","encodeURIComponent","input","prop","hasOwnProperty","_item","inputElement","textareaElement","getAttribute","targetInput","errElements","querySelectorAll","errMsg","remove","textarea","errBanner","cvalue","exdays","d","setTime","getTime","toUTCString","fileName","extension","pop","slice","str","val","_unused","txt","charAt","toUpperCase","markdownText","maxLength"],"mappings":"+PAOaA,EAAgD,gBAAzBC,QAAQC,IAAIC,SACnCC,EAAuDC,QAA3CA,EAAWJ,QAAQC,IAAII,4BAAoBD,IAAAA,EAAAA,EAAI,GAC3DE,EAAmDC,QAA3CA,EAAWP,QAAQC,IAAIO,4BAAoBD,IAAAA,EAAAA,EAAI,GACvDE,EAAqDC,QAA5CA,EAAWV,QAAQC,IAAIU,6BAAqBD,IAAAA,EAAAA,EAAI,GACzDE,EACkCC,QADnBA,EAC1Bb,QAAQC,IAAIa,yCAAiCD,IAAAA,EAAAA,EAAI,GAwDtCE,EAAa,WAAA,IAAAC,EAAAC,EAAAA,iBAAAC,EAAAC,qBAAAC,MAAG,SAAAC,EAAOC,GAAc,IAAAC,EAAAC,EAAAC,EAAA,OAAAP,EAAAC,qBAAAO,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAU/C,OATKL,EAA+B,CAAEM,KAAI,GAAAC,OAAKT,EAAM,qBAChDG,EAAoC,CACxCO,OAAQ,OACRC,QAAS,CACPC,cAAaH,UAAAA,OACqCR,QADrCA,EACXvB,QAAQC,IAAIkC,4CAAoCZ,IAAAA,EAAAA,EAAI,KAGxDa,KAAMC,KAAKC,UAAUd,IACtBG,EAAAY,OAAA,SAEMC,MAAKT,uCAAAA,OAC6B/B,QAAQC,IAAIwC,8BAA6B,oBAAAV,OAAmB/B,QAAQC,IAAIyC,4BAC/GjB,IACD,KAAA,EAAA,IAAA,MAAA,OAAAE,EAAAgB,OAAA,GAAAtB,EACF,KAAA,OAhBYN,SAAa6B,GAAA,OAAA5B,EAAA6B,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAmcbC,EAAW,SAACC,EAAaC,EAAeC,GACnD,IAAMC,EAAOC,SAASC,cAAc,YACpC,GAAKF,EAAL,CAEA,IAAMG,EAAaH,EAAKE,wBAAavB,OAA6BkB,EAAG,OACrE,GAAKM,EAAL,CAEAA,EAAWC,MAAMC,YAAc,qBAC/B,IAEiCC,EAF7BC,EAA+B,KAEnC,GAAwB,UAApBJ,EAAWK,KACbD,GAC0BD,QAAxBA,EAAAH,EAAWM,qBAAaH,IAAAA,GAAe,QAAfA,EAAxBA,EAA0BG,qBAAa,IAAAH,GAAeA,QAAfA,EAAvCA,EAAyCG,qBAAzCH,IAAsDA,OAAtDA,EAAAA,EAAwDJ,cACtD,YACG,UACF,GAAwB,SAApBC,EAAWK,KAAiB,CAAA,IAAAE,EACrCH,GAC0B,QAAxBG,EAAAP,EAAWM,qBAAa,IAAAC,GAAeA,QAAfA,EAAxBA,EAA0BD,qBAA1BC,IAAuCA,OAAvCA,EAAAA,EAAyCR,cAAc,YAAa,IACvE,KAAM,CAAA,IAAAS,EACLJ,GAAmC,QAAxBI,EAAAR,EAAWM,qBAAa,IAAAE,OAAA,EAAxBA,EAA0BT,cAAc,YAAa,IACjE,CAED,GAAIK,EACFA,EAASK,YAAcd,MAClB,CAAA,IAAAe,EAAAC,EACCC,EAAOd,SAASe,cAAc,QACpCD,EAAKE,UAAUC,IAAI,SACnBH,EAAKH,YAAcd,EACnBiB,EAAKX,MAAMe,MAAQ,qBACnBJ,EAAKX,MAAMgB,QAAU,eAErB,IAAMC,EACgB,UAApBlB,EAAWK,KACiBK,QADDA,EACvBV,EAAWM,qBAAaI,IAAAA,GAAeA,QAAfA,EAAxBA,EAA0BJ,qBAA1BI,IAAuCA,OAAvCA,EAAAA,EAAyCJ,cACrB,SAApBN,EAAWK,MAA2C,WAAxBL,EAAWmB,SACzCnB,EAAWM,cACa,QADAK,EACxBX,EAAWM,qBAAa,IAAAK,OAAA,EAAxBA,EAA0BL,cAChCY,SAAAA,EAAQE,YAAYR,EACrB,CAEa,IAAVhB,GAAaI,EAAWqB,OAnCX,CAHN,CAuCb,EA6GaC,EAAqB,SAACC,GAA8C,IAAhCC,IAAAhC,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,KAAAA,UAAA,GACzCmC,EAAiB7B,SAASC,qBAAavB,OAAQ+C,IAC/CK,EAAU9B,SAASC,cAAc,gBAEvC,GAAK4B,GAAmBC,IAGnBD,EAAeb,UAAUe,SAAS,SAAU,CAK/C,GAJAF,EAAeb,UAAUC,IAAI,SAC7Ba,EAAQd,UAAUC,IAAI,UAGlBS,EAAQ,CACV,IAAMM,EAAQH,EAAe5B,cAAc,UACvC+B,IACFA,EAAM7B,MAAMuB,OAAS,+BAExB,CAGD,IAAMO,EAASjC,SAASe,cAAc,MAChCmB,EAAKL,EAAe5B,cAAc,MAClCkC,EAAYN,EAAe5B,cAAc,eAE3CiC,EACFD,EAAOtB,YAAcuB,EAAGvB,YACfwB,IACTF,EAAOtB,YAAcwB,EAAUxB,aAGjC,IAAMyB,EAAKN,EAAQ7B,cAAc,MAC7BmC,GACFA,EAAGC,OAAOJ,EAEb,CACH,MA8GaK,EAAa,SACxB3D,GAMkB,IAAA4D,EALlBC,EAAmC9C,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,GAAAA,UAAA,GAAA,KACnC+C,EAAA/C,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,GAAAA,UAAA,GAAuB,KACvBgD,EAAAhD,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,IAAAA,UAAA,GACAiD,EAAAjD,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,GAAAA,UAAA,GAAyB,KACzBkD,EAAAlD,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,IAAAA,UAAA,GAGMmD,EAAWlG,QAAQC,IAAIkG,iCAAmC,GAC1DC,EAAWpG,QAAQC,IAAIoG,mCAAqC,GAC5DC,EACJJ,GAAYE,EAAQG,EAAAA,eAAA,CAAA,EAEbL,EAAWE,GAEd,GAGAI,EAAWxG,QAAQC,IAAIwG,+BAAiC,GACxDC,EAAW1G,QAAQC,IAAI0G,gCAAkC,GACzDC,EACJJ,GAAYE,EAAQH,EAAAA,eAAA,CAAA,EAEbC,EAAWE,GAEd,GAGAG,EAAS7G,QAAQC,IAAI6G,gCAAkC,GACvDC,EAA0DnB,QAAlDA,EAAG5F,QAAQC,IAAI+G,2CAAmCpB,IAAAA,EAAAA,EAAI,GAC9DqB,EACJJ,GAAUE,GAAYd,EAAOM,oBAEtBM,EAASE,GAEZ,GAGA9E,EAAOiF,gBAAAA,EAAAA,cAAAA,EAAAC,cAAA,GACRP,GACAN,GACAW,GAGDnB,IAAO7D,EAAuB,cAACF,UAAAA,OAAa+D,IAC5CE,IAAS/D,EAAQ,cAAgB+D,GAChB,SAAjBD,IAAyB9D,EAAQ,gBAAkB,oBAClC,cAAjB8D,IACF9D,EAAQ,gBAAkB,uBAE5B,IAAMmF,EAA0B,CAAEpF,OAAAA,EAAQC,QAAAA,EAASoF,SAAU,UAK7D,OAJUD,EAAc,KAApBvB,GACmB,KAEnB9F,GAAauH,QAAQC,IAAIH,GACtBA,CACT,EAuBaI,EAAS,WAAA,IAAAC,EAAAxG,EAAAA,iBAAAC,EAAAA,qBAAAE,MAAG,SAAAsG,EACvBC,EACA7B,EACA8B,EACA/B,EACAgC,EACAC,EACAC,EACAC,EACAC,GAA2D,IAAAC,EAAAC,EAAAC,EAAAC,EAAAtF,UAAA,OAAA7B,EAAAC,qBAAAO,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAC9C,GAAbqG,EAAKG,EAAArD,OAAA,QAAAC,IAAAoD,EAAA,IAAAA,EAAA,GAGAvC,EAAK,CAAAwC,EAAAzG,KAAA,EAAA,KAAA,CAAA,OAAAyG,EAAA/F,OAAA,UAAA,KAAA,EAAA,OAAA+F,EAAA1G,KAAA,EAAA0G,EAAAzG,KAAA,EAIeW,MAAMmF,EAAMC,GAAQ,KAAA,EAA7B,OAARO,EAAQG,EAAAC,KAAAD,EAAAzG,KAAA,EACasG,EAASK,OAAM,KAAA,EAA7B,GAAPJ,EAAOE,EAAAC,KACW,MAApBJ,EAASM,OAAc,CAAAH,EAAAzG,KAAA,GAAA,KAAA,CACgB,OAAzC6G,YAAU,yBAA0B,KAAKJ,EAAA/F,OAAA,UAAA,KAAA,GAKvC2F,GACFL,EAAQO,EAAQO,SAChBb,EAASM,EAAQQ,QAEjBf,EAAO9F,GAAAA,OAAA8G,oBAAKhD,GAAIgD,EAAAA,kBAAKT,EAAQO,WAE/BZ,EAAQK,EAAQvG,MAChBmG,EAAYI,EAAQU,UAAUR,EAAAzG,KAAA,GAAA,MAAA,KAAA,GAAAyG,EAAA1G,KAAA,GAAA0G,EAAAS,GAAAT,EAAA,MAAA,GAE9BI,YAAU,sBAAuB,KACjCpB,QAAQ0B,MAAM,uBAAsBV,EAAAS,IAAS,KAAA,GAEzB,OAFyBT,EAAA1G,KAAA,GAE7CqG,GAAa,GAAOK,EAAAW,OAAA,IAAA,KAAA,GAAA,IAAA,MAAA,OAAAX,EAAA3F,OAAA,GAAA+E,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,GAAA,KAEvB,KAAA,OAAA,SAvCqBwB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAA,OAAAjC,EAAA5E,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAsDT4G,EAAQ,WAAA,IAAAC,EAAA3I,mBAAAC,EAAAA,qBAAAE,MAAG,SAAAyI,EACtBC,EAGAC,EACApE,GAA0B,IAAAqE,EAAA/B,EAAAgC,EAAAC,EAAAC,EAAAhC,EAAAM,EAAA2B,EAAAC,EAAAtH,UAAA,OAAA7B,EAAAC,qBAAAO,MAAA,SAAA4I,GAAA,cAAAA,EAAA1I,KAAA0I,EAAAzI,MAAA,KAAA,EAKL,OAJrBmI,kCACA/B,EAA2DoC,EAAArF,OAAAqF,EAAAA,UAAApF,EAC3DgF,EAAoDI,EAAArF,OAAAqF,EAAAA,UAAApF,EACpDiF,EAAwCG,EAAArF,OAAAqF,EAAAA,UAAApF,EACxCkF,EAAAE,EAAArF,OAAA,QAAAC,IAAAoF,EAAA,IAAAA,EAAA,GAAqBC,EAAA1I,KAAA,EAAA0I,EAAAzI,KAAA,EAGIW,MAAMuH,EAAKpE,GAAW,KAAA,EACf,OADxBwC,EAAQmC,EAAA/B,KACRE,EAASN,EAASM,OAAM6B,EAAAzI,KAAA,GACRsG,EAASK,OAAM,KAAA,GAwBD,OAxB9B4B,EAAME,EAAA/B,KAERyB,GACE,CAAC,IAAK,IAAK,IAAK,KAAKO,SAAS9B,GAChCyB,SAAAA,EAAWE,GACF,CAAC,IAAK,KAAKG,SAAS9B,KAC5BqB,EAA8BM,GAC/BF,SAAAA,EAAW,OAEbD,SAAAA,EAAYxB,IAEXqB,EAA8BU,SAAS,CAAE3E,KAAMuE,EAAQ3B,OAAAA,IAGtD1I,GACFuH,QAAQC,IACN,mBACA5B,EACA,iBACAyE,EACA,eACA3B,GAGA0B,GAAMM,EAAkBhC,GAAQ6B,EAAA/H,OAAA,SAE7B6H,GAAM,KAAA,GAUkD,OAVlDE,EAAA1I,KAAA,GAAA0I,EAAAvB,GAAAuB,EAAA,MAAA,GAETN,GACDF,EAAgCQ,EAAAvB,IACjCmB,SAAAA,EAAQI,EAAAvB,IACRkB,SAAAA,EAAY,OAEXH,EAA8BU,SAAS,CAAExB,MAAKsB,EAAAvB,KAE7ChJ,GACFuH,QAAQC,IAAI,mBAAoB5B,EAAY,SAAQ2E,EAAAvB,IAASuB,EAAA/H,OAAA+H,SAAAA,EAAAvB,IAAA,KAAA,GAGzB,OAHyBuB,EAAA1I,KAAA,GAG3DqG,GAAcA,GAAa,GAAOqC,EAAArB,OAAA,IAAA,KAAA,GAAA,IAAA,MAAA,OAAAqB,EAAA3H,OAAA,GAAAkH,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,GAAA,KAEzC,KAAA,OAAA,SAxDoBa,EAAAC,EAAAC,GAAA,OAAAhB,EAAA/G,MAAAC,KAAAC,UAAA,CAAA,CAAA,GA8DR0H,EAAoB,SAAChC,GACjB,MAAXA,EAAgBoC,cACA,MAAXpC,GAAgBqC,EAAAA,UAC3B,EAQaC,EAAU,SACrB3H,EACAoB,EACAiE,GAEA,GAAKrF,EAAL,CACA,IAAM4H,EAAS5H,EAAKE,cAAiC,oBACrD,GAAI0H,EAAQ,CACVA,EAAOC,SAAWxC,EAClB,IAAMyC,EAAUF,EAAO1H,cAAc,eACjC4H,IAASA,EAAQ1H,MAAMgB,QAAUA,EACtC,CACDpB,EAAK6H,SAAWxC,CAPL,CAQb,EAOa0C,EAAe,WAAA,IAAAC,EAAAnK,EAAAA,iBAAAC,EAAAC,qBAAAC,MAAG,SAAAiK,EAAOC,GAAa,IAAAC,EAAAC,EAAArD,EAAA,OAAAjH,EAAAC,qBAAAO,MAAA,SAAA+J,GAAA,cAAAA,EAAA7J,KAAA6J,EAAA5J,MAAA,KAAA,EAGE,OAF7C0J,EAAW,IAAIG,UACZhG,OAAO,QAAS4F,GACnBE,EAAiB7F,EAAW,OAAQ4F,GAASE,EAAA5J,KAAA,EAC5BW,MAAKT,GAAAA,OACvB5B,EAAY,gCACfqL,GACD,KAAA,EAHa,OAARrD,EAAQsD,EAAAlD,KAAAkD,EAAAlJ,OAAA,SAIP4F,EAASK,QAAM,KAAA,EAAA,IAAA,MAAA,OAAAiD,EAAA9I,OAAA,GAAA0I,EACvB,KAAA,OATYF,SAAeQ,GAAA,OAAAP,EAAAvI,MAAAC,KAAAC,UAAA,CAAA,CAAA,mHAjqBC,SAAC6I,GAC5B,IAAKA,EAAS,OAAO,EACrB,IAAMC,EAAOD,EAAQE,wBACrB,OACED,EAAKE,KAAO,GACZF,EAAKG,MAAQ,GACbH,EAAKI,SACFC,OAAOC,aAAe9I,SAAS+I,gBAAgBC,eAClDR,EAAKS,QAAUJ,OAAOK,YAAclJ,SAAS+I,gBAAgBI,YAEjE,+CAgVgC,SAACC,GAC/B,IACMC,EAAOC,KAAKC,MAAMD,KAAKE,MAAMF,KAAKG,IAAIL,IAAW,GAEvD,GAAa,IAATC,EAAY,OAAOD,EAAOM,WAE9B,IAAMC,EALW,CAAC,GAAI,IAAK,IAAK,IAAK,KAKbN,GAIxB,OAFqBD,EADPE,KAAKM,IAAI,GAAW,EAAPP,IAGPQ,QAAQ,GAAKF,CACnC,gEArlB6C,SAC3CP,EACAU,GAEA,OAAIV,EAAS,GAAKU,EAAa,GAAKA,EAAa,IACxC,CACLV,OAAQ,EACRW,OACE,yFAIC,CAAEX,OAAQA,EADEA,EAASU,EAAc,IAE5C,iCAsIsC,SAACE,GACrC,OAAKA,EAAQrI,QACDqI,EAAQC,QAAO,SAACC,EAAKC,GAAM,OAAKD,EAAMC,CAAM,GAAE,GAC5CH,EAAQrI,QAAQkI,QAAQ,GAFV,KAG9B,gCApKqC,SAACO,GACpC,OAAOA,EAAQH,QAAO,SAACI,EAAKC,GAAgB,IAAZC,EAAMD,EAANC,OAE9B,OAAOF,GADSG,OAAOC,SAASF,EAAOG,QAAQhB,WAAY,KAAO,EAEnE,GAAE,EACL,iCAoFsC,SAACiB,GACrC,IAAMzC,EAAW,IAAIG,SA2BrB,OA1BAsC,EAAMC,SAAQ,SAACC,EAAM/K,GACnBgL,OAAOC,QAAQF,GAAMD,SAAQ,SAAAI,GAAiB,IAAAC,EAAAC,EAAAA,cAAAF,EAAA,GAAfpL,EAAGqL,EAAA,GAAEpL,EAAKoL,EAAA,GACnCE,MAAMC,QAAQvL,GAChBqI,EAAS7F,OAAM,QAAA3D,OAASoB,EAAKpB,MAAAA,OAAKkB,GAAOZ,KAAKC,UAAUY,IAC9B,WAAjBwL,EAAA,OAAOxL,IAAgC,OAAVA,EAC1B,kBAARD,GAA2B,cAAeC,EAC5CV,MAAOU,EAAgCyL,WACpCC,MAAK,SAACC,GAAG,OAAKA,EAAIC,MAAM,IACxBF,MAAK,SAACE,GACLvD,EAAS7F,OAAM3D,QAAAA,OACLoB,EAAK,MAAApB,OAAKkB,GAClB6L,EACA,qBAEJ,IAAE,OACK,SAAC9F,GAAK,OACX1B,QAAQ0B,MAAM,6BAA8BA,MAGhDuC,EAAS7F,OAAM,QAAA3D,OAASoB,EAAKpB,MAAAA,OAAKkB,GAAOZ,KAAKC,UAAUY,IAG1DqI,EAAS7F,OAAM3D,QAAAA,OAASoB,EAAK,MAAApB,OAAKkB,GAAO8L,OAAO7L,QAAAA,EAAS,IAE7D,GACF,IACOqI,CACT,yBAqD8B,SAACrI,GAC7B,OAAO8L,WAAW9L,EAAM+L,QAAQ,KAAM,MAAQ,CAChD,wBAoD6B,SAAC/L,GAc5B,GAHAA,GAHAA,GAHAA,GAHAA,EAAQA,EAAMgM,UAAU,OAAOD,QAAQ,mBAAoB,KAG7CE,eAGAF,QAAQ,cAAe,MAGvBA,QAAQ,WAAY,KAG7B,gBAAgBG,KAAKlM,GACxB,MAAM,IAAImM,MACR,iFAIJ,OAAOnM,CACT,2BAxMgC,SAACoM,GAC/B,GAAIvP,EAAa,MAAO,CAAEmD,MAAO,sBAAuBmC,MAAO,YAC/D,IAAKiK,EAAS/E,SAAS,qBAAuBxK,EAC5C,MAAO,CAAEmD,MAAOoM,EAAUjK,MAAO,UAGnC,IAa8CkK,EAbxCC,EAAQF,EAASG,MAAM,KAC7B,OAAID,EAAMxK,OAAS,EACA,eAAbwK,EAAM,GACD,CAAEtM,MAAO,SAAUmC,MAAO,YAEL,gBAA5BmK,EAAMA,EAAMxK,OAAS,IACpBsK,EAAS/E,SAAS,aAId,CAAErH,MAAOsM,EAAM,GAAInK,MAAO,YAFxB,CAAEnC,MAAOoM,EAAUjK,MAAO,UAKhB,IAAjBmK,EAAMxK,QAAiC,IAAjBwK,EAAMxK,OAE5BwK,EAAM,GAAGjF,SAAS,mBACL,gBAAbiF,EAAM,IACO,eAAbA,EAAM,GAEC,CAAEtM,MAAO,sBAAuBmC,MAAO,YAGtB,QAAxBkK,EAACC,EAAMA,EAAMxK,OAAS,UAAE,IAAAuK,GAAvBA,EAAyBhF,SAAS,gBAClC+E,EAAS/E,SAAS,aAId,CAAErH,MAAOsM,EAAM,GAAInK,MAAO,UAFxB,CAAEnC,MAAOoM,EAAUjK,MAAO,UAI9B,IACT,qEAhDmC,SACjCqK,EACAC,GAEA,OAAOD,EAAWE,QAAO,SAAC3M,GAAG,OAAiB,MAAZ0M,EAAI1M,IAA6B,KAAb0M,EAAI1M,KAC5D,2BA0QgC,SAC9B4M,GAEU,IADVjM,EAAAb,UAAAiC,OAAA,QAAAC,IAAAlC,UAAA,GAAAA,UAAA,GAAe,oBAEf,OAAK8M,EACEC,EAAMC,WAAC,IAAIC,KAAKH,GAAOjM,GADZ,EAEpB,yBAzC8B,SAACqM,GAC7B,GAA0B,IAAtBA,EAAyB,MAAO,MACpC,GAAIA,EAAoB,GACtB,OAAOtD,KAAKC,MAAMqD,GAAkBlO,GAAAA,OAC7B4K,KAAKC,MAAMqD,GAAkBlO,YAAAA,GAAAA,OAC7BkO,EAAkB/C,QAAQ,GAAY,YAE/C,IAAMgD,EAAQvD,KAAKC,MAAMqD,EAAoB,IACvCE,EAAUxD,KAAKC,MAAMqD,EAAoB,IAC/C,OAAmB,IAAZE,EAAa,GAAApO,OACbmO,EAAKnO,UAAAA,GAAAA,OACLmO,EAAK,YAAAnO,OAAWoO,EAAiB,WAC1C,iCAtGsC,SAACC,GACrC,GAAIC,MAAMD,GAAS,MAAO,iBAC1B,IAAAE,EAA2BF,EAAOrD,WAAW0C,MAAM,KAAIc,EAAAhC,EAAAA,cAAA+B,EAAA,GAAhDE,EAAOD,EAAA,GAAEE,EAAOF,EAAA,GACjBG,EAAmBF,EAAQvB,QAAQ,wBAAyB,KAClE,OAAOwB,EAAO1O,GAAAA,OAAM2O,OAAgB3O,OAAI0O,GAAYC,CACtD,oBA8KyB,SAACC,GACxB,GAAwB,oBAAbtN,SAA0B,OAAO,KAC5C,IAEkBuN,EAFZ9O,EAAI,GAAAC,OAAM4O,EAAQ,KAClBE,EAAKxN,SAASyN,OAAOrB,MAAM,KAAKsB,EAAAC,EAAAC,0BACtBJ,GAAE,IAAlB,IAAAE,EAAAG,MAAAN,EAAAG,EAAAI,KAAAC,MAAoB,CAAA,IACZC,EADIT,EAAA1N,MACQoO,OAClB,GAAID,EAAQE,WAAWzP,GAAO,OAAOuP,EAAQG,UAAU1P,EAAKkD,OAC7D,CAAA,CAAA,MAAAyM,GAAAV,EAAAW,EAAAD,EAAA,CAAA,QAAAV,EAAAY,GAAA,CACD,OAAO,IACT,yBA+SgB,SAAeC,EAAUC,GACvC,IACE,OAAOA,EACJpC,MAAM,KACNnC,QACC,SAACqC,EAAK1M,GAAG,OAAM0M,QAAoB1K,IAAb0K,EAAI1M,GAAqB0M,EAAI1M,GAAO,EAAG,GAC7D2O,EAEL,CAAC,MAAO5I,GAEP,OADA1B,QAAQwK,KAAI/P,mBAAAA,OAAoB8P,EAAQ,KAAK7I,GACtC,EACR,CACH,sBAhE2B,SACzBP,EACAsJ,EACAC,EACAC,GAEA,IAGoBC,EAHdC,EAAY9O,SAASC,cAAc,eACzC,GAAK6O,EAEL,GAAe,MAAX1J,EACF,GAAwB,wCAApByJ,EAAAH,EAAMK,YAAI,IAAAF,OAAA,EAAVA,EAAa,KAAuCH,EAAMM,SAAU,CAKtE,GAJAF,EAAU3O,MAAMgB,QAAU,QAC1B2N,EAAU3O,MAAM8O,gBAAkB,kBAClCH,EAAU7O,cAAc,MAAOU,YAC7B,gCAEA,CAAC,oBAAqB,sBAAsBuG,SAC1ClH,SAASkP,SAASC,UAEpB,CACA,IAAMxH,EAASmH,EAAU7O,cAAc,iBACnC0H,IAAQA,EAAOyH,UAAY,mBAC/B,IAAMC,EAAOP,EAAU7O,cAAc,KACjCoP,IAAMA,EAAKC,KAAO,SACvB,CACD5H,EAAQiH,EAAc,QAAQ,GAC9B9F,OAAOqG,SAASI,KAAO,UACxB,MACC5H,EAAQiH,EAAc,QAAQ,GAC9B7D,OAAOC,QAAQ2D,GAAO9D,SAAQ,SAAA2E,EAAezP,GAAK,IAAA0P,EAAAtE,EAAAA,cAAAqE,EAAA,GAAlB3P,EAAG4P,EAAA,GAAE3P,EAAK2P,EAAA,GAAA,OACxC7P,EAASC,EAAKC,EAAM,GAAIC,MAE1BgP,EAAU3O,MAAMgB,QAAU,WAEnB,CAAC,IAAK,IAAK,KAAK+F,SAAS9B,IAAWwJ,EAC7C/F,OAAOqG,SAASI,KAAOV,EACH,MAAXxJ,IACT0J,EAAU3O,MAAMgB,QAAU,QAC1B2N,EAAU7O,cAAc,KAAMmP,UAAY,GAC1CN,EAAU7O,cAAc,MAAOU,YACL,iBAAjB+N,EAAM3E,OAAsB2E,EAAM3E,OAAS,eACpDrC,EAAQiH,EAAc,QAAQ,GAC9B9F,OAAOqG,SAASI,KAAO,WAE3B,wBA5gB6B,SAC3BjB,EACAoB,EACAC,GAEA,IAAMC,EAAStB,EAAEsB,OACZF,EAAUvI,SAASyI,EAAOlR,OAC7BiR,KAAYhR,OAAA8G,EAAAoK,kBAAKH,GAAWE,CAAAA,EAAOE,QAAQpR,MAAQkR,EAAOlR,QAG5D,IAAMqR,EAAS9P,SAAS+P,eAAc,MAAArR,OAAOiR,EAAOlR,OAGpD,OAFIqR,GAAQA,EAAOE,iBAEZ,CAAA,UAAAtR,OAAW+Q,EAAUQ,KAAK,MAAwC,mCAAA,IAC3E,8EAoK6B,WAC3B,GAAwB,oBAAbjQ,SACT,OAAOkQ,mBAAmBrH,OAAOqG,SAASI,KAE9C,2DAOmC,SAACa,GAClC,OAAOA,aAAK,EAALA,EAAOxO,SAAU,GAAK,iBAAiBoK,KAAKoE,EACrD,uBAO4B,SAACA,GAC3B,OAAOA,aAAK,EAALA,EAAOxO,SAAU,GAAK,6BAA6BoK,KAAKoE,EACjE,wBAtN6B,SAAC7D,GAC5B,IAAK,IAAI8D,KAAQ9D,EACf,GAAIA,EAAI+D,eAAeD,GAAO,OAAO,EAEvC,OAAO,CACT,yCA8W2B,SAAC1B,GAG1B,IAAIxO,EAFCwO,GAIL5D,OAAOC,QAAQ2D,GAAO9D,SAAQ,SAACC,EAAM/K,GACnC,IAAAwQ,EAAApF,EAAAA,cAAqBL,EAAI,GAAlBjL,EAAG0Q,EAAA,GAAEzQ,EAAKyQ,EAAA,GACjBpQ,EAAaF,SAASC,kBAAavB,OAAKkB,IAGxC,IAAMkQ,EAAS9P,SAASe,cAAc,KAMtC,GALA+O,EAAO9O,UAAUC,IAAI,WACrB6O,EAAO3P,MAAMe,MAAQ,qBACrB4O,EAAOnP,YAAcwK,MAAMC,QAAQvL,GAASA,EAAM,GAAKA,EAIrDK,IACCA,EAAWc,UAAUe,SAAS,WAC9B7B,EAAWD,cAAc,YAC1B,CACAC,EAAWc,UAAUC,IAAI,SACzBf,EAAWmC,OAAOyN,GAElB,IAAMS,EAAerQ,EAAWD,cAAc,gBACxCuQ,EAAkBtQ,EAAWD,cAAc,mBAEjD,IACEsQ,GACuC,WAAtCA,EAAaE,aAAa,SACa,SAAtCF,EAAaE,aAAa,SACY,UAAtCF,EAAaE,aAAa,SACY,aAAtCF,EAAaE,aAAa,QAOvB,GAAID,EACTA,EAAgBrQ,MAAMuB,OAAS,mCAC1B,CACL,IAAMM,EAAQ9B,EAAWD,cAAc,UACnC+B,IACFA,EAAM7B,MAAMuB,OAAS,+BAExB,MAXC,GADA6O,EAAapQ,MAAMuB,OAAS,+BACd,IAAV5B,EAAa,CACf,IAAM4Q,EAAcxQ,EAAWD,wBAAavB,OAAWkB,EAAG,OAC1D8Q,SAAAA,EAAanP,OACd,CAUHC,EAAmB5B,GAAK,EACzB,CACH,GACF,uBA7K4B,SAAC0N,GACH,oBAAbtN,WACTA,SAASyN,OAAM,GAAA/O,OAAM4O,EAAwD,qDAEjF,uBAyE4B,WAE1B,IAAMqD,EAAc3Q,SAAS4Q,iBAAiB,UAC1CD,GACFA,EAAY/F,SAAQ,SAACrC,GAEnB,IAAMvG,EAAQuG,EAAQtI,cAAc,UAChC+B,IACFA,EAAM7B,MAAMuB,OAAS,QAIvB,IAAMmP,EAAStI,EAAQtI,cAAc,YACrC,GAAI4Q,EAAQ,CACVA,EAAOC,SAEP,IAAMX,EAAQ5H,EAAQtI,cAAc,SAC9B8Q,EAAWxI,EAAQtI,cAAc,YAEnCkQ,EACFA,EAAMhQ,MAAMuB,OAAS,uBACZqP,IACTA,EAAS5Q,MAAMuB,OAAS,uBAE3B,CAED6G,EAAQvH,UAAU8P,OAAO,QAC3B,IAIF,IAAME,EAAYhR,SAASC,cAAc,gBACzC,GAAI+Q,EAAW,CACbA,EAAUhQ,UAAU8P,OAAO,UAC3B,IAAM1O,EAAK4O,EAAU/Q,cAAc,MAC/BmC,IACFA,EAAGgN,UAAY,GAElB,CACH,4CA/kBsC,CACpC,IACA,KACA,MACA,KACA,IACA,KACA,MACA,OACA,KACA,uBA6duB,SACvB9B,EACA2D,EACAC,GAEA,GAAwB,oBAAblR,SAA0B,CACnC,IAAMmR,EAAI,IAAIxE,KACdwE,EAAEC,QAAQD,EAAEE,UAAqB,GAATH,EAAc,GAAK,GAAK,KAChDlR,SAASyN,OAAM,GAAA/O,OAAM4O,OAAK5O,OAAIuS,EAAM,aAAAvS,OAAYyS,EAAEG,cAAsB,UACzE,CACH,0BAjN+B,SAACC,GAE9B,IAAMpF,EAAkBoF,EAASnF,MAAM,KAGjCoF,EAAoBrF,EAAMsF,OAAS,GAmBzC,OAhB8BtF,EAC3B8D,KAAK,KACLrE,QAAQ,cAAe,IACvBA,QAAQ,UAAW,KACnBE,cAGkDF,QACnD,eACA,IAIiD8F,MAAM,EAAG,IAGvC,IAAMF,EAAU1F,aACvC,iDAnOoC,SAAC6F,GACnC,IACE,GAAmB,iBAARA,EAAkB,OAAOA,EACpC,IAAMC,EAAMD,EAAI/F,QAAQ,KAAM,IAC9B,OAAOpB,OAAOoH,IAAQ,CACvB,CAAC,MAAAC,GACA,OAAO,CACR,CACH,wBAjB6B,SAACF,GAC5B,OAAOA,EAAI/F,QAAQ,WAAY,GACjC,sBAgX2B,SAAC+F,GAC1B,MAAmB,iBAARA,EAAyBA,EAC7BA,EAAI/F,QACT,UACA,SAACkG,GAAG,OAAKA,EAAIC,OAAO,GAAGC,cAAgBF,EAAIJ,MAAM,GAAG5F,gBAExD,uBA9D4B,SAC1BmG,EACAC,GAEA,OAAOD,EAAatQ,OAASuQ,KAASxT,OAC/BuT,EAAa9D,UAAU,EAAG+D,UAC7BD,CACN"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./auth/dbRequestst.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./auth/dbRequestst.js"),r=require("./roles.js"),t=require("./json/accounts.js"),o=require("./json/unsplashDefaultObject.js"),s=require("./createSubscription.js"),a=require("./elementIsVisibleInViewport.js"),i=require("./formError.js"),p=require("./fileToBase64.js"),E=require("./getPriceObjects.js"),n=require("./convertArrayToObject.js"),l=require("./loadScript.js"),x=require("./format.js"),N=require("./helpFunction.js"),_=require("./oauth_json.js"),S=require("./paystack.js"),u=require("./permissions.js"),O=require("./utils.js"),R=require("./queryParameters/index.js"),T=require("./charts.js"),m=require("./modals/modals.js"),A=require("./modals/openConfirmDelete.js");exports.getChannel=e.getChannel,exports.getData=e.getData,exports.INSTRUCTOR_TYPE=r.INSTRUCTOR_TYPE,exports.ROLE_GROUPING=r.ROLE_GROUPING,exports.adminAccessValidation=r.adminAccessValidation,exports.AllCoursesdataList=t.AllCoursesdataList,exports.COMMENTS_BY=t.COMMENTS_BY,exports.DataList=t.DataList,exports.accounts=t.accounts,exports.dataList=t.dataList,exports.pending=t.pending,exports.projectStartHistory=t.projectStartHistory,exports.statesNigeria=t.statesNigeria,exports.unsplashDefaultObject=o.unsplashDefaultObject,exports.createSubscription=s.default,exports.elementIsVisibleInViewport=a.default,exports.handleFormErrors=i.default,exports.fileToBase64=p.default,exports.getPriceObjects=E.default,exports.convertArrayToObject=n.default,exports.loadScript=l.default,exports.formatTime=x.formatTime,exports.API_HOST_URL=N.API_HOST_URL,exports.CODECS_URL_M3U8=N.CODECS_URL_M3U8,exports.FILE_URL=N.FILE_URL,exports.IN_DEV_MODE=N.IN_DEV_MODE,exports.TrackViewPort=N.TrackViewPort,exports.VIDEO_URL=N.VIDEO_URL,exports.abbreviateNumber=N.abbreviateNumber,exports.addUserDomain=N.addUserDomain,exports.calculateAmountAfterDeduction=N.calculateAmountAfterDeduction,exports.calculateAverageRating=N.calculateAverageRating,exports.calculateTotalCredits=N.calculateTotalCredits,exports.convertArrayToFormData=N.convertArrayToFormData,exports.convertToFloat=N.convertToFloat,exports.convertToSlug=N.convertToSlug,exports.extractSubDomain=N.extractSubDomain,exports.fetchAPI=N.fetchAPI,exports.fetchData=N.fetchData,exports.findNullOrEmptyKeys=N.findNullOrEmptyKeys,exports.formatDateToWord=N.formatDateToWord,exports.formatDuration=N.formatDuration,exports.formatNumberWithCommas=N.formatNumberWithCommas,exports.getCookie=N.getCookie,exports.getNestedValue=N.getNestedValue,exports.handleError=N.handleError,exports.handleInvalid=N.handleInvalid,exports.handleResendOTP=N.handleResendOTP,exports.handleStatusError=N.handleStatusError,exports.hostUrlEncode=N.hostUrlEncode,exports.inputTagErrorEvent=N.inputTagErrorEvent,exports.isValidAlphanumeric=N.isValidAlphanumeric,exports.isValidEmail=N.isValidEmail,exports.objectIsEmpty=N.objectIsEmpty,exports.printErr=N.printErr,exports.printErrNew=N.printErrNew,exports.removeCookie=N.removeCookie,exports.removeErrMsg=N.removeErrMsg,exports.reqOptions=N.reqOptions,exports.romansFigure=N.romansFigure,exports.setCookie=N.setCookie,exports.slugifyFileName=N.slugifyFileName,exports.spinBtn=N.spinBtn,exports.stripCommaFromNumber=N.stripCommaFromNumber,exports.stripHtmlTags=N.stripHtmlTags,exports.toTitleCase=N.toTitleCase,exports.truncateHtml=N.truncateHtml,exports.paystackHook=_.paystackHook,exports.profile_goggle_provider=_.profile_goggle_provider,exports.chargeAuthorization=S.chargeAuthorization,exports.handlePaymentSubmit=S.handlePaymentSubmit,exports.payWithPaystack=S.payWithPaystack,exports.paystackDataConfig=S.paystackDataConfig,exports.CHANNEL_ADMIN_ROLES=u.CHANNEL_ADMIN_ROLES,exports.CHANNEL_BLOGGER_ROLES=u.CHANNEL_BLOGGER_ROLES,exports.CHANNEL_EVENT_ROLES=u.CHANNEL_EVENT_ROLES,exports.CHANNEL_FINANCE_ROLES=u.CHANNEL_FINANCE_ROLES,exports.CHANNEL_INSTRUCTOR_ROLES=u.CHANNEL_INSTRUCTOR_ROLES,exports.CHANNEL_LEARNER_ROLES=u.CHANNEL_LEARNER_ROLES,exports.CHANNEL_MODERATOR_ROLES=u.CHANNEL_MODERATOR_ROLES,exports.CHANNEL_REGISTRAR_ROLES=u.CHANNEL_REGISTRAR_ROLES,exports.CHANNEL_SUPER_ADMIN_ROLES=u.CHANNEL_SUPER_ADMIN_ROLES,exports.ROLE_MAP=u.ROLE_MAP,exports.findPermissions=u.findPermissions,exports.hasUserPermission=u.hasUserPermission,exports.headerKeyPermission=u.headerKeyPermission,exports.headerUsernamePermission=u.headerUsernamePermission,exports.ADMIN_PERMISSION=O.ADMIN_PERMISSION,exports.APPLICATION_FEE_TYPE_OPTIONS=O.APPLICATION_FEE_TYPE_OPTIONS,exports.CODE_LANGUAGES=O.CODE_LANGUAGES,exports.COMPANY_SIZES_CHOICES=O.COMPANY_SIZES_CHOICES,exports.CONTENT_TYPE_OPTIONS=O.CONTENT_TYPE_OPTIONS,exports.COURSE_REWARD_OPTIONS=O.COURSE_REWARD_OPTIONS,exports.CREDENTIALS=O.CREDENTIALS,exports.CURRENCY_SYMBOL=O.CURRENCY_SYMBOL,exports.DURATION_FILTERS=O.DURATION_FILTERS,exports.INDUSTRIES=O.INDUSTRIES,exports.KEYWORD_DESCRIPTION=O.KEYWORD_DESCRIPTION,exports.NEXT_AUTH_SESSION_DATA_DUMMY=O.NEXT_AUTH_SESSION_DATA_DUMMY,exports.NIGERIA_BANKS=O.NIGERIA_BANKS,exports.PAYMENT_PROCESSING_OPTIONS=O.PAYMENT_PROCESSING_OPTIONS,exports.PRIVACY=O.PRIVACY,exports.PROGRAM_LEVELS=O.PROGRAM_LEVELS,exports.REGISTRAR_PERMISSION=O.REGISTRAR_PERMISSION,exports.SCOREBOARD_DURATION=O.SCOREBOARD_DURATION,exports.SKILLS_LEVELS=O.SKILLS_LEVELS,exports.STUDENT_STATUS=O.STUDENT_STATUS,exports.SUBSCRIPTION_OPTION=O.SUBSCRIPTION_OPTION,exports.SUPER_PERMISSION=O.SUPER_PERMISSION,exports.TRUE_FALSE=O.TRUE_FALSE,exports.VIDEO_PLAYER_OPTIONS=O.VIDEO_PLAYER_OPTIONS,exports.YES_NO=O.YES_NO,exports.gaugeData=O.gaugeData,exports.buildDataFilterUrl=R.buildDataFilterUrl,exports.buildPaginationUrl=R.buildPaginationUrl,exports.buildUrl=R.buildUrl,exports.cleanUrl=R.cleanUrl,exports.getQueryParam=R.getQueryParam,exports.getQueryParams=R.getQueryParams,exports.hasQueryParam=R.hasQueryParam,exports.navigateWithQuery=R.navigateWithQuery,exports.urlQueryHelper=R.urlQueryHelper,exports.calculatePercentageChange=T.calculatePercentageChange,exports.createTimeSeriesTemplate=T.createTimeSeriesTemplate,exports.formatChartValue=T.formatChartValue,exports.formatDateForChart=T.formatDateForChart,exports.generateChartColors=T.generateChartColors,exports.groupAndAggregateData=T.groupAndAggregateData,exports.transformChartData=T.transformChartData,exports.getUserEmailInputModal=m.getUserEmailInputModal,exports.openConfirmModal=m.openConfirmModal,exports.openToast=m.openToast,exports.openConfirmDelete=A.openConfirmDelete,exports.instinctHubLogoUrl="/assets/logo/instincthub-logo-color.png",exports.instinctHubLogoUrlBlack="/assets/logo/instincthub-logo-black.png",exports.instinctHubLogoUrlWhite="/assets/logo/instincthub-logo-white.png",exports.instinctHubThumbnailLogo="/assets/logo/instincthub-logo-thumbnail.png";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/lib/index.ts"],"sourcesContent":["// src/components/lib/index.ts\r\n\r\nexport * from \"./auth/dbRequestst\";\r\nexport * from \"./roles\";\r\n\r\n// JSON exports\r\nexport * from \"./json/accounts\";\r\nexport * from \"./json/countryNigeria\";\r\nexport * from \"./json/countryObjects\";\r\nexport * from \"./json/educationLevels\";\r\nexport * from \"./json/unsplashDefaultObject\";\r\n\r\n// Utility functions\r\nexport { default as createSubscription } from \"./createSubscription\";\r\nexport { default as elementIsVisibleInViewport } from \"./elementIsVisibleInViewport\";\r\nexport { default as handleFormErrors } from \"./formError\";\r\nexport { default as fileToBase64 } from \"./fileToBase64\";\r\nexport { default as getPriceObjects } from \"./getPriceObjects\";\r\nexport {default as convertArrayToObject} from \"./convertArrayToObject\";\r\nexport {default as loadScript} from \"./loadScript\";\r\nexport * from \"./format\";\r\nexport * from \"./helpFunction\";\r\nexport * from \"./oauth_json\";\r\nexport * from \"./paystack\";\r\nexport * from \"./permissions\";\r\nexport * from \"./utils\";\r\nexport * from \"./queryParameters\";\r\n\r\n// Charts\r\nexport * from \"./charts\";\r\n\r\n// Modals\r\nexport * from \"./modals/modals\";\r\nexport * from \"./modals/openConfirmDelete\";\r\n\r\n// Logo\r\nexport const instinctHubLogoUrl = \"/assets/logo/instincthub-logo-color.png\";\r\nexport const instinctHubLogoUrlWhite =\r\n \"/assets/logo/instincthub-logo-white.png\";\r\nexport const instinctHubLogoUrlBlack =\r\n \"/assets/logo/instincthub-logo-black.png\";\r\nexport const instinctHubThumbnailLogo =\r\n \"/assets/logo/instincthub-logo-thumbnail.png\";\r\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/lib/index.ts"],"sourcesContent":["// src/components/lib/index.ts\r\n\r\nexport * from \"./auth/dbRequestst\";\r\nexport * from \"./roles\";\r\n\r\n// JSON exports\r\nexport * from \"./json/accounts\";\r\nexport * from \"./json/countryNigeria\";\r\nexport * from \"./json/countryObjects\";\r\nexport * from \"./json/educationLevels\";\r\nexport * from \"./json/unsplashDefaultObject\";\r\n\r\n// Utility functions\r\nexport { default as createSubscription } from \"./createSubscription\";\r\nexport { default as elementIsVisibleInViewport } from \"./elementIsVisibleInViewport\";\r\nexport { default as handleFormErrors } from \"./formError\";\r\nexport { default as fileToBase64 } from \"./fileToBase64\";\r\nexport { default as getPriceObjects } from \"./getPriceObjects\";\r\nexport {default as convertArrayToObject} from \"./convertArrayToObject\";\r\nexport {default as loadScript} from \"./loadScript\";\r\nexport * from \"./format\";\r\nexport * from \"./helpFunction\";\r\nexport * from \"./oauth_json\";\r\nexport * from \"./paystack\";\r\nexport * from \"./permissions\";\r\nexport * from \"./utils\";\r\nexport * from \"./queryParameters\";\r\n\r\n// Charts\r\nexport * from \"./charts\";\r\n\r\n// Modals\r\nexport * from \"./modals/modals\";\r\nexport * from \"./modals/openConfirmDelete\";\r\n\r\n// Logo\r\nexport const instinctHubLogoUrl = \"/assets/logo/instincthub-logo-color.png\";\r\nexport const instinctHubLogoUrlWhite =\r\n \"/assets/logo/instincthub-logo-white.png\";\r\nexport const instinctHubLogoUrlBlack =\r\n \"/assets/logo/instincthub-logo-black.png\";\r\nexport const instinctHubThumbnailLogo =\r\n \"/assets/logo/instincthub-logo-thumbnail.png\";\r\n"],"names":[],"mappings":"wzMAoCkC,0EAIhC,0EAFA,2EAIA"}
|
|
@@ -194,6 +194,31 @@ export declare const setCookie: (cname: string, cvalue: string, exdays: number)
|
|
|
194
194
|
* @param index Index for focusing first error
|
|
195
195
|
*/
|
|
196
196
|
export declare const printErr: (key: string, value: string, index: number) => void;
|
|
197
|
+
/**
|
|
198
|
+
* Removes all error messages and styles from form fields.
|
|
199
|
+
* Cleans up error classes, borders, and error message elements.
|
|
200
|
+
*/
|
|
201
|
+
export declare const removeErrMsg: () => void;
|
|
202
|
+
/**
|
|
203
|
+
* Displays validation errors on form fields.
|
|
204
|
+
* @param items Object containing field names as keys and error messages as values
|
|
205
|
+
*/
|
|
206
|
+
export declare const printErrNew: (items: Record<string, string | string[]>) => void;
|
|
207
|
+
/**
|
|
208
|
+
* Adds error styling and message to a specific input field.
|
|
209
|
+
* @param tags The class name of the input field wrapper
|
|
210
|
+
* @param border Whether to add border styling (default: true)
|
|
211
|
+
*/
|
|
212
|
+
export declare const inputTagErrorEvent: (tags: string, border?: boolean) => void;
|
|
213
|
+
/**
|
|
214
|
+
* Abbreviates large numbers into a shorter format with suffixes.
|
|
215
|
+
* @param amount The number to abbreviate
|
|
216
|
+
* @returns Abbreviated string (e.g., "1.5K", "2.3M")
|
|
217
|
+
* @example
|
|
218
|
+
* abbreviateNumber(1500) // Returns "1.5K"
|
|
219
|
+
* abbreviateNumber(2300000) // Returns "2.3M"
|
|
220
|
+
*/
|
|
221
|
+
export declare const abbreviateNumber: (amount: number) => string;
|
|
197
222
|
/**
|
|
198
223
|
* Handles server response errors for forms.
|
|
199
224
|
* @param status HTTP status code
|