diff --git a/package-lock.json b/package-lock.json
index 07eaf298..9d146ebf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1541,11 +1541,27 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
},
+ "@types/lodash": {
+ "version": "4.14.191",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/@types/lodash/-/lodash-4.14.191.tgz",
+ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==",
+ "dev": true
+ },
"@types/node": {
"version": "15.6.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz",
"integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A=="
},
+ "@types/paystack": {
+ "version": "2.0.1",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/@types/paystack/-/paystack-2.0.1.tgz",
+ "integrity": "sha512-pM5xu4ahqFSpxNFi5fm/QJtuplUuSg3PzjnMy7XjDapebUJ+Ixw1soUCV7UbqMra9No2WFXn81AcNdtPvc1niw=="
+ },
+ "@types/pluralize": {
+ "version": "0.0.29",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/@types/pluralize/-/pluralize-0.0.29.tgz",
+ "integrity": "sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA=="
+ },
"@types/pug": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz",
@@ -1680,6 +1696,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -1874,7 +1895,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
@@ -1945,6 +1965,15 @@
"resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.4.0.tgz",
"integrity": "sha512-S18o4Y9PqI/uabdlT/jI3MY7XBJjNxnfapFIkjkMwpz6qNxLFZOm2b22OMf4ZYDL9lpNWI+Ih4fEMVPwO1KHFQ=="
},
+ "carbon-components-svelte": {
+ "version": "0.70.13",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/carbon-components-svelte/-/carbon-components-svelte-0.70.13.tgz",
+ "integrity": "sha512-p6wX8004BM6DrrLH1JJWbkR/VybU0gra+jDWlSW1V2aO8XmAz81evnDLZuTrvbHNkEXPiaC+athSjNsBOf0SjA==",
+ "dev": true,
+ "requires": {
+ "flatpickr": "4.6.9"
+ }
+ },
"carbon-icons-svelte": {
"version": "10.45.1",
"resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/carbon-icons-svelte/-/carbon-icons-svelte-10.45.1.tgz",
@@ -2046,6 +2075,11 @@
}
}
},
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
+ },
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -2331,6 +2365,19 @@
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
"deep-freeze": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
@@ -2347,7 +2394,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
"requires": {
"object-keys": "^1.0.12"
}
@@ -2523,6 +2569,11 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
+ "eventemitter3": {
+ "version": "2.0.3",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+ },
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
@@ -2597,6 +2648,11 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
+ "fast-diff": {
+ "version": "1.1.2",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/fast-diff/-/fast-diff-1.1.2.tgz",
+ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+ },
"fast-glob": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
@@ -2657,6 +2713,12 @@
"pinkie-promise": "^2.0.0"
}
},
+ "flatpickr": {
+ "version": "4.6.9",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/flatpickr/-/flatpickr-4.6.9.tgz",
+ "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==",
+ "dev": true
+ },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -2719,6 +2781,11 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+ },
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
@@ -2757,7 +2824,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dev": true,
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
@@ -2895,8 +2961,15 @@
"has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
- "dev": true
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
},
"has-unicode": {
"version": "2.0.1",
@@ -3043,6 +3116,15 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
+ "is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -3065,6 +3147,14 @@
"has": "^1.0.3"
}
},
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
"is-directory": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
@@ -3126,6 +3216,15 @@
"@types/estree": "*"
}
},
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -3669,11 +3768,19 @@
"integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==",
"dev": true
},
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
"object.assign": {
"version": "4.1.2",
@@ -3738,6 +3845,11 @@
"no-case": "^2.2.0"
}
},
+ "parchment": {
+ "version": "1.1.4",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/parchment/-/parchment-1.1.4.tgz",
+ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+ },
"parse-glob": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
@@ -3818,6 +3930,15 @@
"pinkie-promise": "^2.0.0"
}
},
+ "paystack": {
+ "version": "2.0.1",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/paystack/-/paystack-2.0.1.tgz",
+ "integrity": "sha512-reVONV7ZUMln/iWeM60n0BbogF3/zFWmUrqbKYVNzEAv+p9TcWDCHfNZ2mBGXzIXhyTsNXWwf4wNcXe28btAHw==",
+ "requires": {
+ "promise": "^7.1.1",
+ "request": "^2.79.0"
+ }
+ },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -3846,6 +3967,11 @@
"pinkie": "^2.0.0"
}
},
+ "pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="
+ },
"polka": {
"version": "1.0.0-next.22",
"resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/polka/-/polka-1.0.0-next.22.tgz",
@@ -3988,6 +4114,14 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -4044,6 +4178,29 @@
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true
},
+ "quill": {
+ "version": "1.3.7",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/quill/-/quill-1.3.7.tgz",
+ "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+ "requires": {
+ "clone": "^2.1.1",
+ "deep-equal": "^1.0.1",
+ "eventemitter3": "^2.0.3",
+ "extend": "^3.0.2",
+ "parchment": "^1.1.4",
+ "quill-delta": "^3.6.2"
+ }
+ },
+ "quill-delta": {
+ "version": "3.6.3",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/quill-delta/-/quill-delta-3.6.3.tgz",
+ "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "requires": {
+ "deep-equal": "^1.0.1",
+ "extend": "^3.0.2",
+ "fast-diff": "1.1.2"
+ }
+ },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -4175,6 +4332,16 @@
"@babel/runtime": "^7.8.4"
}
},
+ "regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ }
+ },
"regexparam": {
"version": "1.3.0",
"resolved": "https://flipplib.jfrog.io/artifactory/api/npm/flipp-npm/regexparam/-/regexparam-1.3.0.tgz",
diff --git a/package.json b/package.json
index 1a5d0005..17a0c9f1 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,8 @@
"@sentry/tracing": "^6.13.3",
"@supabase/supabase-js": "^1.20.0",
"@tailwindcss/forms": "^0.3.2",
+ "@types/paystack": "^2.0.1",
+ "@types/pluralize": "0.0.29",
"body-parser": "^1.19.0",
"canvas-confetti": "^1.4.0",
"compression": "^1.7.1",
@@ -27,7 +29,10 @@
"lodash": "^4.17.21",
"marked": "^1.2.7",
"node-sass": "^6.0.0",
+ "paystack": "^2.0.1",
+ "pluralize": "^8.0.0",
"polka": "next",
+ "quill": "^1.3.7",
"sapper-environment": "^1.0.1",
"sirv": "^1.0.0",
"svelte-easy-crop": "^1.0.4",
@@ -47,6 +52,8 @@
"@rollup/plugin-replace": "^2.4.2",
"@rollup/plugin-typescript": "^8.3.0",
"@tailwindcss/typography": "^0.3.1",
+ "@types/lodash": "^4.14.191",
+ "carbon-components-svelte": "^0.70.13",
"carbon-icons-svelte": "^10.21.0",
"dotenv": "^10.0.0",
"postcss": "^8.0.9",
diff --git a/src/components/Apps/components/Poll/components/Poll.svelte b/src/components/Apps/components/Poll/components/Poll.svelte
index 2060b8ea..c6c5ad2e 100644
--- a/src/components/Apps/components/Poll/components/Poll.svelte
+++ b/src/components/Apps/components/Poll/components/Poll.svelte
@@ -1,6 +1,6 @@
-
-
-
-
-
Description
-
diff --git a/src/components/CourseLandingPage/components/Editor/Container.svelte b/src/components/CourseLandingPage/components/Editor/Container.svelte
index d1b1d034..e0dd1552 100644
--- a/src/components/CourseLandingPage/components/Editor/Container.svelte
+++ b/src/components/CourseLandingPage/components/Editor/Container.svelte
@@ -4,14 +4,14 @@
import { isMobile } from '../../../../utils/store/useMobile';
import IconButton from '../../../IconButton/index.svelte';
- let show = true;
+ export let show = true;
{#if show}
-
+
{/if}
@@ -46,6 +46,7 @@
min-width: 300px;
max-width: 300px;
top: 0;
+ left: 0;
border-right: 1px solid var(--border-color);
background-color: rgb(250, 251, 252);
diff --git a/src/components/CourseLandingPage/components/Editor/DescriptionForm.svelte b/src/components/CourseLandingPage/components/Editor/DescriptionForm.svelte
index acf92a2a..83c03cac 100644
--- a/src/components/CourseLandingPage/components/Editor/DescriptionForm.svelte
+++ b/src/components/CourseLandingPage/components/Editor/DescriptionForm.svelte
@@ -1,6 +1,17 @@
-
+
+ {
+ const _course = cloneDeep(course);
+ set(_course, 'metadata.description', html);
+ course = _course;
+ }}
+ />
+
diff --git a/src/components/CourseLandingPage/components/Editor/GoalsForm.svelte b/src/components/CourseLandingPage/components/Editor/GoalsForm.svelte
new file mode 100644
index 00000000..2dfb961b
--- /dev/null
+++ b/src/components/CourseLandingPage/components/Editor/GoalsForm.svelte
@@ -0,0 +1,17 @@
+
+
+
+ {
+ const _course = cloneDeep(course);
+ set(_course, 'metadata.goals', html);
+ course = _course;
+ }}
+ />
+
diff --git a/src/components/CourseLandingPage/components/Editor/HeaderForm.svelte b/src/components/CourseLandingPage/components/Editor/HeaderForm.svelte
index f05c2444..a07cd021 100644
--- a/src/components/CourseLandingPage/components/Editor/HeaderForm.svelte
+++ b/src/components/CourseLandingPage/components/Editor/HeaderForm.svelte
@@ -1,38 +1,31 @@
-
+
-
-
-
-
diff --git a/src/components/CourseLandingPage/components/Editor/InstructorForm.svelte b/src/components/CourseLandingPage/components/Editor/InstructorForm.svelte
new file mode 100644
index 00000000..92ba33bc
--- /dev/null
+++ b/src/components/CourseLandingPage/components/Editor/InstructorForm.svelte
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/CourseLandingPage/components/Editor/PricingForm.svelte b/src/components/CourseLandingPage/components/Editor/PricingForm.svelte
new file mode 100644
index 00000000..e880a1e2
--- /dev/null
+++ b/src/components/CourseLandingPage/components/Editor/PricingForm.svelte
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+ No
+ Yes
+
+
+
+{#if showDiscount}
+
+{/if}
+
+
+
+
+ No
+ Yes
+
+
+
+{#if giftToggled}
+
About Gift
+
+
+ {
+ const _course = cloneDeep(course);
+ set(_course, 'metadata.reward.description', html);
+ course = _course;
+ }}
+ />
+
+{/if}
diff --git a/src/components/CourseLandingPage/components/Editor/RequirementForm.svelte b/src/components/CourseLandingPage/components/Editor/RequirementForm.svelte
index bc80c508..96a78a36 100644
--- a/src/components/CourseLandingPage/components/Editor/RequirementForm.svelte
+++ b/src/components/CourseLandingPage/components/Editor/RequirementForm.svelte
@@ -1,6 +1,17 @@
-
+
+ {
+ const _course = cloneDeep(course);
+ set(_course, 'metadata.requirements', html);
+ course = _course;
+ }}
+ />
+
diff --git a/src/components/CourseLandingPage/components/Editor/SyllabusForm.svelte b/src/components/CourseLandingPage/components/Editor/SyllabusForm.svelte
deleted file mode 100644
index 4e277bce..00000000
--- a/src/components/CourseLandingPage/components/Editor/SyllabusForm.svelte
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
Lessons
-
-{#each $landingPageStore.syllabus.lessons as lesson, index}
-
-
-
- handleDelete(index)}
- contained={true}
- size="small"
- />
-
-
-{/each}
-
-
diff --git a/src/components/CourseLandingPage/components/Editor/index.svelte b/src/components/CourseLandingPage/components/Editor/index.svelte
index 9914c08c..feb4a9d5 100644
--- a/src/components/CourseLandingPage/components/Editor/index.svelte
+++ b/src/components/CourseLandingPage/components/Editor/index.svelte
@@ -8,13 +8,18 @@
import HeaderForm from './HeaderForm.svelte';
import RequirementForm from './RequirementForm.svelte';
import DescriptionForm from './DescriptionForm.svelte';
- import SyllabusForm from './SyllabusForm.svelte';
- import AboutUsForm from './AboutUsForm.svelte';
+ import PricingForm from './PricingForm.svelte';
+ import GoalsForm from './GoalsForm.svelte';
+ import InstructorForm from './InstructorForm.svelte';
import PrimaryButton from '../../../PrimaryButton/index.svelte';
+ import { VARIANTS } from '../../../PrimaryButton/constants';
+ import { updateCourse } from '../../../../utils/services/courses';
+ export let course;
export let courseId;
let borderBottomGrey = 'border-r-0 border-b border-l-0 border-gray-300';
+ let loading = false;
const sections = [
{
@@ -31,11 +36,15 @@
},
{
key: 4,
- title: 'Syllabus',
+ title: 'Goals',
},
{
key: 5,
- title: 'About Us',
+ title: 'Instructor',
+ },
+ {
+ key: 6,
+ title: 'Pricing',
},
];
let selectedSection = null;
@@ -55,29 +64,66 @@
};
}
- function handlePublish() {}
+ function generateSlug(title) {
+ return title
+ .replaceAll(' ', '-')
+ .toLowerCase()
+ .concat(`-${new Date().getTime()}`);
+ }
+
+ async function handleSave() {
+ loading = true;
+ course.slug = course.slug || generateSlug(course.title);
+
+ await updateCourse(courseId, undefined, {
+ ...course,
+ attendance: undefined,
+ group: undefined,
+ lessons: undefined,
+ slug: course.slug,
+ });
+ loading = false;
+
+ return `${window.location.origin}/course/${course.slug}`;
+ }
+ /**
+ * 1. Use all you have for editing now
+ * 2. Make course one interface we might need to computation
+ */
+ async function handlePreview() {
+ const link = `${window.location.origin}/course/${course.slug}`;
+ window.open(link, '_blank');
+ }
-
+
+
{#if !selectedSection}
-
+
-
+
Page Builder
{#each sections as section}
{/each}
{:else}
-
+
+
-
+
{#if selectedSection.key === 1}
-
+
{:else if selectedSection.key === 2}
-
+
{:else if selectedSection.key === 3}
-
+
{:else if selectedSection.key === 4}
-
+
{:else if selectedSection.key === 5}
-
+
+ {:else if selectedSection.key === 6}
+
{/if}
{/if}
diff --git a/src/components/CourseLandingPage/components/PricingSection.svelte b/src/components/CourseLandingPage/components/PricingSection.svelte
new file mode 100644
index 00000000..79f27d68
--- /dev/null
+++ b/src/components/CourseLandingPage/components/PricingSection.svelte
@@ -0,0 +1,147 @@
+
+
+
+
+
+
diff --git a/src/components/CourseLandingPage/constants.ts b/src/components/CourseLandingPage/constants.ts
index 9b1e8150..8207d4d8 100644
--- a/src/components/CourseLandingPage/constants.ts
+++ b/src/components/CourseLandingPage/constants.ts
@@ -1,9 +1,10 @@
export const SECTION_KEYS = {
HEADER: 'header',
- REQUIREMENT: 'requirement',
- DESCRIPTION: 'description',
- SYLLABUS: 'syllabus',
- ABOUT_US: 'about-us',
+ REQUIREMENT: '#requirement',
+ DESCRIPTION: '#description',
+ GOALS: '#goals',
+ LESSONS: '#lessons',
+ INSTRUCTOR: '#instructor',
};
export const NAV_ITEMS = [
@@ -16,11 +17,15 @@ export const NAV_ITEMS = [
label: 'Description',
},
{
- key: SECTION_KEYS.SYLLABUS,
- label: 'Syllabus',
+ key: SECTION_KEYS.GOALS,
+ label: 'Goals',
},
{
- key: SECTION_KEYS.ABOUT_US,
- label: 'About Us',
+ key: SECTION_KEYS.LESSONS,
+ label: 'Lessons',
+ },
+ {
+ key: SECTION_KEYS.INSTRUCTOR,
+ label: 'Instructor',
},
];
diff --git a/src/components/CourseLandingPage/index.svelte b/src/components/CourseLandingPage/index.svelte
index 6a6d1c31..2f5feb05 100644
--- a/src/components/CourseLandingPage/index.svelte
+++ b/src/components/CourseLandingPage/index.svelte
@@ -1,163 +1,347 @@
-
- {$landingPageStore.header.title}
+ {get(courseData, 'title', '')}
-
-
-
-
- {$landingPageStore.header.title}
+
+
+
+
+
+
+ {get(courseData, 'title', '')}
-
- {$landingPageStore.header.description}
-
-
-
-
- Last updated 10/2021
-
-
-
-
-
-
- {$landingPageStore.header.duration}
+
+ {get(courseData, 'description', '')}
-
-
- {$landingPageStore.header.currency}{$landingPageStore.header.cost}
+
+
+ {get(courseData, 'metadata.instructor.name', '')}
+
+
+ {#if video}
+
+
+ {:else}
+
+ {/if}
-
+
+
+
+
+
+
+
+
+
-
+
+
+ Requirement
+
+ {@html get(courseData, 'metadata.requirements', '')}
+
+
-
-
-
+
+
+ Course Description
+
+ {@html get(courseData, 'metadata.description', '')}
+
+
-
-
-
+
+
+ What you'll learn
+
+ {@html get(courseData, 'metadata.goals', '')}
+
+
-
- {#each $landingPageStore.syllabus.lessons as lesson, index}
-
-
Lesson {index + 1}.
- {lesson.title}
+
+
+ Certificate
+
+ When you complete all of the courses in the program, you'll earn a
+ Certificate to share with your professional network.
+
+
+
+
+
+
+
+
Course Content
+
+
+ {pluralize('lesson', lessons.length, true)}
+
+
+ {#each lessons as lesson, index}
+
+
+
+
+
+ {#if lesson.slide_url}
+
1 slide
+ {/if}
+ {#if lesson.note}
+
1 note
+ {/if}
+
+
+ {#if lesson.video_url}
+
1 video
+ {/if}
+ {#if get(lesson, 'totalExercises[0].count')}
+
{pluralize(
+ 'exercise',
+ get(lesson, 'totalExercises[0].count', 0),
+ true
+ )}
+ {/if}
+
+
+
+ {/each}
+
+
+
+
+ Instructor
+
+

+
+
{get(instructor, 'name', '')}
+
{get(instructor, 'role', '')}
+
+
+ {get(instructor, 'courseNo', '')} courses
+
+
+
+
+
+ {get(instructor, 'description', '')}
+
+
- {/each}
-
-
-
-

+
+
-
-
+
diff --git a/src/components/Courses/components/Card/index.svelte b/src/components/Courses/components/Card/index.svelte
index 5fce4988..5b5bd203 100644
--- a/src/components/Courses/components/Card/index.svelte
+++ b/src/components/Courses/components/Card/index.svelte
@@ -35,7 +35,7 @@
diff --git a/src/components/Courses/index.svelte b/src/components/Courses/index.svelte
index 86e0920d..a224dab9 100644
--- a/src/components/Courses/index.svelte
+++ b/src/components/Courses/index.svelte
@@ -1,6 +1,6 @@
-
-
-
Created with love by
+ Created with love by
Rotimi Best
+ target="_blank">Rotimi Best
+
+
diff --git a/src/components/Form/TextArea.svelte b/src/components/Form/TextArea.svelte
index 492a43ae..969b0e78 100644
--- a/src/components/Form/TextArea.svelte
+++ b/src/components/Form/TextArea.svelte
@@ -5,7 +5,8 @@
export let rows = '3';
export let maxRows = 3;
export let className = '';
- export let bgColor = 'bg-gray-100';
+ export let labelClassName = '';
+ export let bgColor = 'bg-gray-200';
export let helperMessage = '';
export let errorMessage = '';
export let isRequired = false;
@@ -17,7 +18,7 @@
diff --git a/src/components/PrimaryButton/index.svelte b/src/components/PrimaryButton/index.svelte
index dab17b70..0fc77aaa 100644
--- a/src/components/PrimaryButton/index.svelte
+++ b/src/components/PrimaryButton/index.svelte
@@ -13,7 +13,7 @@
export let isLoading = false;
$: variant = isLoading ? VARIANTS.OUTLINED : variant;
- $: isDisabled = isLoading ? true : isDisabled;
+ $: isDisabled = isLoading ? true : false;