=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),z(r),u}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var o=r.completion;if("throw"===o.type){var n=o.arg;z(r)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,o){return this.delegate={iterator:P(e),resultName:r,nextLoc:o},"next"===this.method&&(this.arg=t),u}},e}function Nu(t,e,r,o,n,i,a){try{var l=t[i](a),s=l.value}catch(t){return void r(t)}l.done?e(s):Promise.resolve(s).then(o,n)}function Mu(t){return function(){var e=this,r=arguments;return new Promise((function(o,n){var i=t.apply(e,r);function a(t){Nu(i,o,n,a,l,"next",t)}function l(t){Nu(i,o,n,a,l,"throw",t)}a(void 0)}))}}qf(new of(lu,((t,{options:e})=>Cu(t.getProvider("app").getImmediate(),t.getProvider("installations-internal").getImmediate(),e)),"PUBLIC")),qf(new of("analytics-internal",(function(t){try{const e=t.getProvider(lu).getImmediate();return{logEvent:(t,r,o)=>function(t,e,r,o){t=rf(t),async function(t,e,r,o,n){if(n&&n.global)t("event",r,o);else{const n=await e;t("event",r,Object.assign(Object.assign({},o),{send_to:n}))}}(Pu,Su[t.app.options.appId],e,r,o).catch((t=>pu.error(t)))}(e,t,r,o)}}catch(t){throw fu.create("interop-component-reg-failed",{reason:t})}}),"PRIVATE")),Wf(Iu,Du),Wf(Iu,Du,"esm2017"),function(t=function(t=Df){const e=Bf.get(t);if(!e&&t===Df&&Gp())return Hf();if(!e)throw Ff.create("no-app",{appName:t});return e}()){const e=Gf(t=rf(t),lu);e.isInitialized()?e.getImmediate():function(t,e={}){const r=Gf(t,lu);if(r.isInitialized()){const t=r.getImmediate();if(Kp(e,r.getOptions()))return t;throw fu.create("already-initialized")}r.initialize({options:e})}(t)}(Hf({apiKey:"AIzaSyDb4Dc0DdfUvK4RNebVW5ckLCSyTfr9Oc8",authDomain:"storyapp-409f8.firebaseapp.com",projectId:"storyapp-409f8",storageBucket:"storyapp-409f8.appspot.com",messagingSenderId:"688766931446",appId:"1:688766931446:web:cbc56bb250ab3f312277d7",measurementId:"G-DE1LJNEG1T"}));var qu={"/":Hs,"/addpage.html":qm,"/addpageforguest.html":Dp,"/login.html":ub,"/register.html":Tb,"/dashboard.html":yp,"/404.html":gp};window.addEventListener("DOMContentLoaded",Mu(Bu().mark((function t(){return Bu().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:document.querySelector("header"),document.querySelector("main"),document.querySelector("footer"),(qu[window.location.pathname]||gp).init();case 3:case"end":return t.stop()}}),t)}))))})()})();
\ No newline at end of file
diff --git a/dist/app.bundle.js.LICENSE.txt b/dist/app.bundle.js.LICENSE.txt
new file mode 100644
index 0000000..c47cbb7
--- /dev/null
+++ b/dist/app.bundle.js.LICENSE.txt
@@ -0,0 +1,122 @@
+/*!
+ * Bootstrap v5.3.2 (https://getbootstrap.com/)
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
+
+/**
+ * @license
+ * Copyright 2014 Travis Webb
+ * SPDX-License-Identifier: MIT
+ */
+
+/**
+ * @license
+ * Copyright 2017 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2017 Google LLC
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @license
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2019 Google LLC
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @license
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2020 Google LLC
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @license
+ * Copyright 2021 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2021 Google LLC
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
diff --git a/dist/dashboard.html b/dist/dashboard.html
new file mode 100644
index 0000000..eb35620
--- /dev/null
+++ b/dist/dashboard.html
@@ -0,0 +1 @@
+StoryApp
\ No newline at end of file
diff --git a/dist/data/data.json b/dist/data/data.json
new file mode 100644
index 0000000..c0cd180
--- /dev/null
+++ b/dist/data/data.json
@@ -0,0 +1,69 @@
+{
+ "error": false,
+ "message": "Stories fetched successfully",
+ "listStory": [
+ {
+ "id": "story-FvU4u0Vp2S3PMsFg",
+ "name": "Faisal Sulaiman",
+ "description": "In rhoncus lorem nec ex egestas mollis vel a mauris. Pellentesque vel diam at neque hendrerit bibendum. Quisque egestas, dolor eu semper dapibus, turpis neque.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?nature",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-q9anz4avd83ni2r3",
+ "name": "Alya Jamaluddin",
+ "description": "In a pretium sem. Suspendisse eget sollicitudin enim, sed suscipit mi. Integer sagittis lorem urna, tincidunt viverra lectus gravida id. Praesent venenatis nibh ac nisi.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?mountain",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-vd83nqai2r39anz4",
+ "name": "Vina Indah",
+ "description": "Curabitur euismod risus venenatis felis iaculis tincidunt. Pellentesque velit risus, tempus et odio vel, venenatis volutpat erat. Vivamus sed gravida lacus, non feugiat nibh. Nam.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?hiking",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-0Vp2S3PMsFgFvU4u",
+ "name": "Cinta Nur",
+ "description": "Pellentesque dignissim fringilla ultricies. Pellentesque velit arcu, mattis sed lacinia sed, congue non nisi. Etiam fermentum id lectus eu fringilla. Nullam a risus nec mauris.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?tennis",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-0VPMsFgFp2S3vU4u",
+ "name": "Eka Kasih",
+ "description": "Vestibulum lacinia mauris vitae felis mattis accumsan. Fusce eleifend tincidunt malesuada. Morbi euismod tempor est, pulvinar varius purus tristique et. Integer mattis at massa eu.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?football",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-usFgFp20VPMS3vU4",
+ "name": "Bulan Jamilah",
+ "description": "Nam quis euismod quam. Donec massa purus, sodales vitae massa eu, malesuada egestas magna. Ut rhoncus mattis lorem. Morbi placerat augue id augue aliquet egestas.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?programming",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-gFp20VPMS3vU4usF",
+ "name": "Nurul Tirta",
+ "description": "Vivamus consectetur eu erat nec luctus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam ornare commodo ipsum non luctus.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?gaming",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-gFpsF20VPMS3vU4u",
+ "name": "Wahyu Cahya",
+ "description": "Ut et dolor vel magna mollis mattis. Ut et erat purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?traveling",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-PFvU4u0Vp2S3MsFg",
+ "name": "Burhanuddin Danial",
+ "description": "Quisque ultricies feugiat tincidunt. Duis auctor condimentum felis, a imperdiet odio lobortis eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?skydiving",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ }
+ ]
+}
diff --git a/dist/dea24bf5a7646d8b84e7.woff2 b/dist/dea24bf5a7646d8b84e7.woff2
new file mode 100644
index 0000000..87032d1
Binary files /dev/null and b/dist/dea24bf5a7646d8b84e7.woff2 differ
diff --git a/dist/index.html b/dist/index.html
new file mode 100644
index 0000000..38fb986
--- /dev/null
+++ b/dist/index.html
@@ -0,0 +1 @@
+StoryApp
\ No newline at end of file
diff --git a/dist/login.html b/dist/login.html
new file mode 100644
index 0000000..e7c0b80
--- /dev/null
+++ b/dist/login.html
@@ -0,0 +1 @@
+Login - StoryApp
\ No newline at end of file
diff --git a/dist/register.html b/dist/register.html
new file mode 100644
index 0000000..f656160
--- /dev/null
+++ b/dist/register.html
@@ -0,0 +1 @@
+Register - StoryApp
\ No newline at end of file
diff --git a/firebase.json b/firebase.json
new file mode 100644
index 0000000..059fe4f
--- /dev/null
+++ b/firebase.json
@@ -0,0 +1,10 @@
+{
+ "hosting": {
+ "public": "dist",
+ "ignore": [
+ "firebase.json",
+ "**/.*",
+ "**/node_modules/**"
+ ]
+ }
+}
diff --git a/lit-localize.json b/lit-localize.json
new file mode 100644
index 0000000..10659bf
--- /dev/null
+++ b/lit-localize.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://raw.githubusercontent.com/lit/lit/main/packages/localize-tools/config.schema.json",
+ "sourceLocale": "en",
+ "targetLocales": ["id", "cn"],
+ "inputFiles": ["./src/js/**/*.js"],
+ "output": {
+ "mode": "runtime",
+ "outputDir": "./src/generated/locales",
+ "localeCodesModule": "./src/generated/locale-codes.js"
+ },
+ "interchange": {
+ "format": "xliff",
+ "xliffDir": "./xliff/"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index c565678..5bae735 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,8 +10,10 @@
"dependencies": {
"@lit/localize": "^0.12.1",
"@popperjs/core": "^2.11.8",
+ "axios": "^1.6.2",
"bootstrap": "^5.3.2",
"bootstrap-icons": "^1.11.1",
+ "firebase": "^10.6.0",
"lit": "^3.0.2"
},
"devDependencies": {
@@ -23,6 +25,7 @@
"clean-webpack-plugin": "^4.0.0",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
+ "html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.3",
"postcss-loader": "^7.3.3",
"prettier": "^3.0.3",
@@ -1695,6 +1698,529 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@firebase/analytics": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz",
+ "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/installations": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/analytics-compat": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz",
+ "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==",
+ "dependencies": {
+ "@firebase/analytics": "0.10.0",
+ "@firebase/analytics-types": "0.8.0",
+ "@firebase/component": "0.6.4",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/analytics-types": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz",
+ "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw=="
+ },
+ "node_modules/@firebase/app": {
+ "version": "0.9.23",
+ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.23.tgz",
+ "integrity": "sha512-CA5pQ88We3FhyuesGKn1thaPBsJSGJGm6AlFToOmEJagWqBeDoNJqBkry/BsHnCs9xeYWWIprKxvuFmAFkdqoA==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "idb": "7.1.1",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/app-check": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz",
+ "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/app-check-compat": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz",
+ "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==",
+ "dependencies": {
+ "@firebase/app-check": "0.8.0",
+ "@firebase/app-check-types": "0.5.0",
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/app-check-interop-types": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz",
+ "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg=="
+ },
+ "node_modules/@firebase/app-check-types": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz",
+ "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ=="
+ },
+ "node_modules/@firebase/app-compat": {
+ "version": "0.2.23",
+ "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.23.tgz",
+ "integrity": "sha512-UCv0LEzcoqAgY+sLsau7aOZz0CJNLN2gESY68bHKmukNXEN6onLPxBKJzn68CsZZGcdiIEXwvrum1riWNPe9Gw==",
+ "dependencies": {
+ "@firebase/app": "0.9.23",
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/app-types": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz",
+ "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q=="
+ },
+ "node_modules/@firebase/auth": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.4.0.tgz",
+ "integrity": "sha512-SfFXZCHDbY+7oSR52NSwx0U7LjYiA+N8imloxphCf3/F+MFty/+mhdjSXGtrJYd0Gbud/qcyedfn2XnWJeIB/g==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "node-fetch": "2.6.7",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x",
+ "@react-native-async-storage/async-storage": "^1.18.1"
+ },
+ "peerDependenciesMeta": {
+ "@react-native-async-storage/async-storage": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@firebase/auth-compat": {
+ "version": "0.4.9",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.9.tgz",
+ "integrity": "sha512-Fw03i7vduIciEBG4imLtA1duJbljgkfbxiBo/EuekcB+BnPxHp+e8OGMUfemPYeO7Munj6kUC9gr5DelsQkiNA==",
+ "dependencies": {
+ "@firebase/auth": "1.4.0",
+ "@firebase/auth-types": "0.12.0",
+ "@firebase/component": "0.6.4",
+ "@firebase/util": "1.9.3",
+ "node-fetch": "2.6.7",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/auth-interop-types": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz",
+ "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg=="
+ },
+ "node_modules/@firebase/auth-types": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz",
+ "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==",
+ "peerDependencies": {
+ "@firebase/app-types": "0.x",
+ "@firebase/util": "1.x"
+ }
+ },
+ "node_modules/@firebase/component": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz",
+ "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==",
+ "dependencies": {
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/database": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz",
+ "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==",
+ "dependencies": {
+ "@firebase/auth-interop-types": "0.2.1",
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "faye-websocket": "0.11.4",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/database-compat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz",
+ "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/database": "1.0.1",
+ "@firebase/database-types": "1.0.0",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/database-types": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz",
+ "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==",
+ "dependencies": {
+ "@firebase/app-types": "0.9.0",
+ "@firebase/util": "1.9.3"
+ }
+ },
+ "node_modules/@firebase/firestore": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.3.2.tgz",
+ "integrity": "sha512-K4TwMbgArWw+XAEUYX/vtk+TVy9n1uLeJKSrQeb89lwfkfyFINGLPME6YleaS0ovD1ziLM5/0WgL1CR4s53fDg==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "@firebase/webchannel-wrapper": "0.10.3",
+ "@grpc/grpc-js": "~1.9.0",
+ "@grpc/proto-loader": "^0.7.8",
+ "node-fetch": "2.6.7",
+ "tslib": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/firestore-compat": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.22.tgz",
+ "integrity": "sha512-M166UvFvRri0CK/+5N0MIeXJVxR6BsX0/96xFT506DxRPIFezLjLcvfddtyFgfe0CtyQWoxBXt060uWUg3d/sw==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/firestore": "4.3.2",
+ "@firebase/firestore-types": "3.0.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/firestore-types": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz",
+ "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==",
+ "peerDependencies": {
+ "@firebase/app-types": "0.x",
+ "@firebase/util": "1.x"
+ }
+ },
+ "node_modules/@firebase/functions": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz",
+ "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==",
+ "dependencies": {
+ "@firebase/app-check-interop-types": "0.3.0",
+ "@firebase/auth-interop-types": "0.2.1",
+ "@firebase/component": "0.6.4",
+ "@firebase/messaging-interop-types": "0.2.0",
+ "@firebase/util": "1.9.3",
+ "node-fetch": "2.6.7",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/functions-compat": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz",
+ "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/functions": "0.10.0",
+ "@firebase/functions-types": "0.6.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/functions-types": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz",
+ "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw=="
+ },
+ "node_modules/@firebase/installations": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz",
+ "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/util": "1.9.3",
+ "idb": "7.0.1",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/installations-compat": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz",
+ "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/installations": "0.6.4",
+ "@firebase/installations-types": "0.5.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/installations-types": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz",
+ "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==",
+ "peerDependencies": {
+ "@firebase/app-types": "0.x"
+ }
+ },
+ "node_modules/@firebase/installations/node_modules/idb": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz",
+ "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg=="
+ },
+ "node_modules/@firebase/logger": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz",
+ "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/messaging": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz",
+ "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/installations": "0.6.4",
+ "@firebase/messaging-interop-types": "0.2.0",
+ "@firebase/util": "1.9.3",
+ "idb": "7.0.1",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/messaging-compat": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz",
+ "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/messaging": "0.12.4",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/messaging-interop-types": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz",
+ "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ=="
+ },
+ "node_modules/@firebase/messaging/node_modules/idb": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz",
+ "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg=="
+ },
+ "node_modules/@firebase/performance": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz",
+ "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/installations": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/performance-compat": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz",
+ "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/performance": "0.6.4",
+ "@firebase/performance-types": "0.2.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/performance-types": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz",
+ "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA=="
+ },
+ "node_modules/@firebase/remote-config": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz",
+ "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/installations": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/remote-config-compat": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz",
+ "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/logger": "0.4.0",
+ "@firebase/remote-config": "0.4.4",
+ "@firebase/remote-config-types": "0.3.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/remote-config-types": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz",
+ "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA=="
+ },
+ "node_modules/@firebase/storage": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz",
+ "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/util": "1.9.3",
+ "node-fetch": "2.6.7",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app": "0.x"
+ }
+ },
+ "node_modules/@firebase/storage-compat": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz",
+ "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==",
+ "dependencies": {
+ "@firebase/component": "0.6.4",
+ "@firebase/storage": "0.11.2",
+ "@firebase/storage-types": "0.8.0",
+ "@firebase/util": "1.9.3",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "@firebase/app-compat": "0.x"
+ }
+ },
+ "node_modules/@firebase/storage-types": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz",
+ "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==",
+ "peerDependencies": {
+ "@firebase/app-types": "0.x",
+ "@firebase/util": "1.x"
+ }
+ },
+ "node_modules/@firebase/util": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz",
+ "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@firebase/webchannel-wrapper": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz",
+ "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA=="
+ },
+ "node_modules/@grpc/grpc-js": {
+ "version": "1.9.11",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.11.tgz",
+ "integrity": "sha512-QDhMfbTROOXUhLHMroow8f3EHiCKUOh6UwxMP5S3EuXMnWMNSVIhatGZRwkpg9OUTYdZPsDUVH3cOAkWhGFUJw==",
+ "dependencies": {
+ "@grpc/proto-loader": "^0.7.8",
+ "@types/node": ">=12.12.47"
+ },
+ "engines": {
+ "node": "^8.13.0 || >=10.10.0"
+ }
+ },
+ "node_modules/@grpc/proto-loader": {
+ "version": "0.7.10",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz",
+ "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==",
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.4",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
@@ -1855,6 +2381,60 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+ },
"node_modules/@types/body-parser": {
"version": "1.19.4",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz",
@@ -1996,7 +2576,6 @@
"version": "20.8.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
"integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
- "dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
@@ -2387,7 +2966,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -2450,6 +3028,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
"node_modules/autoprefixer": {
"version": "10.4.16",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
@@ -2487,6 +3070,16 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/axios": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
+ "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/babel-loader": {
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
@@ -2874,6 +3467,19 @@
"webpack": ">=4.0.0 <6.0.0"
}
},
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -2909,6 +3515,17 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/commander": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
@@ -3309,6 +3926,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -3459,6 +4084,11 @@
"integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==",
"dev": true
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -3524,7 +4154,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -3768,7 +4397,6 @@
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
"dependencies": {
"websocket-driver": ">=0.5.1"
},
@@ -3853,6 +4481,39 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/firebase": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.6.0.tgz",
+ "integrity": "sha512-bnYwHwZ6zB+dM6mGQPEXcFHtAT2WoVzG6H4SIR8HzURVGKJxBW+TqfP3qcJQjTZV3tDqDTo/XZkVmoU/SovV8A==",
+ "dependencies": {
+ "@firebase/analytics": "0.10.0",
+ "@firebase/analytics-compat": "0.2.6",
+ "@firebase/app": "0.9.23",
+ "@firebase/app-check": "0.8.0",
+ "@firebase/app-check-compat": "0.3.7",
+ "@firebase/app-compat": "0.2.23",
+ "@firebase/app-types": "0.9.0",
+ "@firebase/auth": "1.4.0",
+ "@firebase/auth-compat": "0.4.9",
+ "@firebase/database": "1.0.1",
+ "@firebase/database-compat": "1.0.1",
+ "@firebase/firestore": "4.3.2",
+ "@firebase/firestore-compat": "0.3.22",
+ "@firebase/functions": "0.10.0",
+ "@firebase/functions-compat": "0.3.5",
+ "@firebase/installations": "0.6.4",
+ "@firebase/installations-compat": "0.2.4",
+ "@firebase/messaging": "0.12.4",
+ "@firebase/messaging-compat": "0.2.4",
+ "@firebase/performance": "0.6.4",
+ "@firebase/performance-compat": "0.2.4",
+ "@firebase/remote-config": "0.4.4",
+ "@firebase/remote-config-compat": "0.2.4",
+ "@firebase/storage": "0.11.2",
+ "@firebase/storage-compat": "0.3.2",
+ "@firebase/util": "1.9.3"
+ }
+ },
"node_modules/flat": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
@@ -3866,7 +4527,6 @@
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
"integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
- "dev": true,
"funding": [
{
"type": "individual",
@@ -3882,6 +4542,19 @@
}
}
},
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -3971,6 +4644,14 @@
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
@@ -4212,6 +4893,56 @@
}
]
},
+ "node_modules/html-loader": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz",
+ "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==",
+ "dev": true,
+ "dependencies": {
+ "html-minifier-terser": "^7.0.0",
+ "parse5": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/html-loader/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/html-loader/node_modules/html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
"node_modules/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -4309,8 +5040,7 @@
"node_modules/http-parser-js": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
- "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
- "dev": true
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="
},
"node_modules/http-proxy": {
"version": "1.18.1",
@@ -4383,6 +5113,11 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
+ },
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -4594,6 +5329,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -4922,12 +5665,22 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
+ "node_modules/long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+ },
"node_modules/lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
@@ -5026,7 +5779,6 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -5035,7 +5787,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -5141,6 +5892,25 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -5725,6 +6495,29 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "node_modules/protobufjs": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz",
+ "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -5747,6 +6540,11 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -5964,6 +6762,14 @@
"strip-ansi": "^6.0.1"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -6084,7 +6890,6 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -6536,11 +7341,23 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -6749,11 +7566,15 @@
"node": ">=0.6"
}
},
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/type-is": {
"version": "1.6.18",
@@ -6784,8 +7605,7 @@
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@@ -6945,6 +7765,11 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
"node_modules/webpack": {
"version": "5.89.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
@@ -7219,7 +8044,6 @@
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
"dependencies": {
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
@@ -7233,11 +8057,19 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true,
"engines": {
"node": ">=0.8.0"
}
},
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -7259,6 +8091,52 @@
"integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
"dev": true
},
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -7286,12 +8164,45 @@
}
}
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yocto-queue": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
diff --git a/package.json b/package.json
index 0ac560a..3d89696 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"clean-webpack-plugin": "^4.0.0",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
+ "html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.3",
"postcss-loader": "^7.3.3",
"prettier": "^3.0.3",
@@ -33,8 +34,10 @@
"dependencies": {
"@lit/localize": "^0.12.1",
"@popperjs/core": "^2.11.8",
+ "axios": "^1.6.2",
"bootstrap": "^5.3.2",
"bootstrap-icons": "^1.11.1",
+ "firebase": "^10.6.0",
"lit": "^3.0.2"
}
}
diff --git a/src/generated/locale-codes.js b/src/generated/locale-codes.js
new file mode 100644
index 0000000..2785895
--- /dev/null
+++ b/src/generated/locale-codes.js
@@ -0,0 +1,18 @@
+// Do not modify this file by hand!
+// Re-generate this file by running lit-localize.
+
+/**
+ * The locale code that templates in this source code are written in.
+ */
+export const sourceLocale = `en`;
+
+/**
+ * The other locale codes that this application is localized into. Sorted
+ * lexicographically.
+ */
+export const targetLocales = [`cn`, `id`];
+
+/**
+ * All valid project locale codes. Sorted lexicographically.
+ */
+export const allLocales = [`cn`, `en`, `id`];
diff --git a/src/generated/locales/cn.js b/src/generated/locales/cn.js
new file mode 100644
index 0000000..3b9c4c3
--- /dev/null
+++ b/src/generated/locales/cn.js
@@ -0,0 +1,40 @@
+// Do not modify this file by hand!
+// Re-generate this file by running lit-localize
+
+/* eslint-disable no-irregular-whitespace */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+export const templates = {
+ s059d391cd4966b82: `请填写此字段`,
+ s0763aeb5be71575a: `了解更多`,
+ s09442466870144fb: `探索使用我们的应用程序创建的一些故事`,
+ s0f02a0421cdb1c6a: `例如:tester@test.tes`,
+ s1b99042f480ea979: `使用我们的用户友好型应用程序轻松创建和组织您的故事。`,
+ s1e3a08abb66683bd: `画廊`,
+ s1f30f2eaf1e38fb9: `添加故事`,
+ s2c15b9b13a3e2a80: `登记`,
+ s40a4c375c7205b51: `糟糕!找不到页面`,
+ s58267a09d1391646: `登录 StoryApp`,
+ s63d894b1ddb06289: `描述`,
+ s644b5c0ae2dee067: `例如:Wilson`,
+ s67749057edb2586b: `登出`,
+ s6abb1cd87fe0114e: `家`,
+ s72dc4aff9d9092e7: `请上传照片`,
+ s7fbc79601b10256c: `注册 StoryApp`,
+ s7fee95b66225e1fb: `仪表板`,
+ s80cfc1ae5a588ab8: `© 2023 myCompany,保留所有权利。`,
+ s942e10915f41815e: `例如:Wilson很好`,
+ sa0211df274180076: `示例:密码0`,
+ saa1f41ecae4a7112: `很抱歉,但您请求的页面未找到`,
+ sb39e929c85fd7f6e: `为客人添加故事`,
+ sb3d4f79d9d8b71e5: `提交`,
+ sb59d68ed12d46377: `加载中`,
+ sc16e00a7a8b2fde2: `背部`,
+ sc8da3cc71de63832: `登录`,
+ sd19b529ff81b9828: `介绍我们的故事应用程序`,
+ sd1f44f1a8bc20e67: `电子邮件`,
+ se15e5318306cee20: `数据添加成功`,
+ sef49aec68fd1dc66: `名称`,
+ sf1a78dd2508964c3: `照片`,
+ sf6e1665c7022a1f8: `密码`,
+};
diff --git a/src/generated/locales/id.js b/src/generated/locales/id.js
new file mode 100644
index 0000000..8e7a581
--- /dev/null
+++ b/src/generated/locales/id.js
@@ -0,0 +1,40 @@
+// Do not modify this file by hand!
+// Re-generate this file by running lit-localize
+
+/* eslint-disable no-irregular-whitespace */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+export const templates = {
+ s059d391cd4966b82: `Silakan lengkapi kolom ini`,
+ s0763aeb5be71575a: `Lebih Lanjut`,
+ s09442466870144fb: `Jelajahi beberapa cerita yang dibuat menggunakan aplikasi kami`,
+ s0f02a0421cdb1c6a: `Contoh: tester@test.tes`,
+ s1b99042f480ea979: `Buat dan atur cerita Anda dengan mudah menggunakan aplikasi kami yang ramah pengguna.`,
+ s1e3a08abb66683bd: `Galeri`,
+ s1f30f2eaf1e38fb9: `Tambah Cerita`,
+ s2c15b9b13a3e2a80: `Daftar`,
+ s40a4c375c7205b51: `Ups! HALAMAN TIDAK DITEMUKAN`,
+ s58267a09d1391646: `Masuk StoryApp`,
+ s63d894b1ddb06289: `Deskripsi`,
+ s644b5c0ae2dee067: `Contoh: Wilson`,
+ s67749057edb2586b: `Keluar`,
+ s6abb1cd87fe0114e: `Pendahuluan`,
+ s72dc4aff9d9092e7: `Silakan unggah foto`,
+ s7fbc79601b10256c: `Daftar StoryApp`,
+ s7fee95b66225e1fb: `Beranda`,
+ s80cfc1ae5a588ab8: `© 2023 myCompany, Hak cipta dilindungi.`,
+ s942e10915f41815e: `Contoh: Wilson adalah bagus`,
+ sa0211df274180076: `Contoh: Password0`,
+ saa1f41ecae4a7112: `MAAF, TAPI HALAMAN YANG ANDA MINTA TIDAK DITEMUKAN`,
+ sb39e929c85fd7f6e: `Tambah Cerita untuk Tamu`,
+ sb3d4f79d9d8b71e5: `Kirim`,
+ sb59d68ed12d46377: `Memuat`,
+ sc16e00a7a8b2fde2: `Kembali`,
+ sc8da3cc71de63832: `Masuk`,
+ sd19b529ff81b9828: `Memperkenalkan Aplikasi Story kami`,
+ sd1f44f1a8bc20e67: `Surel`,
+ se15e5318306cee20: `Data berhasil ditambahkan`,
+ sef49aec68fd1dc66: `Nama`,
+ sf1a78dd2508964c3: `Foto`,
+ sf6e1665c7022a1f8: `Kata Sandi`,
+};
diff --git a/src/js/base/LitShadowDom.js b/src/js/base/LitShadowDom.js
index 0d89fc1..c2f0794 100644
--- a/src/js/base/LitShadowDom.js
+++ b/src/js/base/LitShadowDom.js
@@ -1,9 +1,9 @@
-import { LitElement } from 'lit';
-
-class LitShadowDom extends LitElement {
- createRenderRoot() {
- return this.attachShadow({ mode: 'open' });
- }
-}
-
-export default LitShadowDom;
\ No newline at end of file
+import { LitElement } from 'lit';
+
+class LitShadowDom extends LitElement {
+ createRenderRoot() {
+ return this.attachShadow({ mode: 'open' });
+ }
+}
+
+export default LitShadowDom;
diff --git a/src/js/base/LitWithoutShadowDom.js b/src/js/base/LitWithoutShadowDom.js
index 5c0cedf..2d1f785 100644
--- a/src/js/base/LitWithoutShadowDom.js
+++ b/src/js/base/LitWithoutShadowDom.js
@@ -1,9 +1,9 @@
-import { LitElement } from 'lit';
-
-class LitWithoutShadowDom extends LitElement {
- createRenderRoot() {
- return this;
- }
-}
-
-export default LitWithoutShadowDom;
\ No newline at end of file
+import { LitElement } from 'lit';
+
+class LitWithoutShadowDom extends LitElement {
+ createRenderRoot() {
+ return this;
+ }
+}
+
+export default LitWithoutShadowDom;
diff --git a/src/js/config/api-endpoint.js b/src/js/config/api-endpoint.js
new file mode 100644
index 0000000..b6958af
--- /dev/null
+++ b/src/js/config/api-endpoint.js
@@ -0,0 +1,11 @@
+import Config from './config';
+
+const ApiEndpoint = {
+ REGISTER: `/register`,
+ LOGIN: `/login`,
+ ADD_NEW_STORY: `${Config.BASE_URL}/stories`,
+ ADD_NEW_STORY_WITHOUT_AUTH: `${Config.BASE_URL}/stories/guest`,
+ GET_ALL_STORIES: `/stories`,
+};
+
+export default ApiEndpoint;
diff --git a/src/js/config/api-instance.js b/src/js/config/api-instance.js
new file mode 100644
index 0000000..0d43be5
--- /dev/null
+++ b/src/js/config/api-instance.js
@@ -0,0 +1,14 @@
+import axios from 'axios';
+import Config from './config';
+import Utils from '../utils/utils';
+
+const instance = (contentType) =>
+ axios.create({
+ baseURL: Config.BASE_URL,
+ headers: {
+ Authorization: `Bearer ${Utils.getUserToken(Config.USER_TOKEN_KEY)}`,
+ 'Content-Type': `${contentType}`,
+ },
+ });
+
+export default instance;
diff --git a/src/js/config/config.js b/src/js/config/config.js
new file mode 100644
index 0000000..9e5d0d8
--- /dev/null
+++ b/src/js/config/config.js
@@ -0,0 +1,7 @@
+const Config = {
+ BASE_URL: 'https://story-api.dicoding.dev/v1',
+ USER_TOKEN_KEY: 'token',
+ NAME: 'name',
+};
+
+export default Config;
diff --git a/src/js/index.js b/src/js/index.js
index 52ee679..0e3776a 100644
--- a/src/js/index.js
+++ b/src/js/index.js
@@ -1,30 +1,42 @@
-// Import our custom CSS
-import '../sass/index.scss';
-// Import javascript file as needed
-import * as bootstrap from 'bootstrap';
-//import dashboard
-import Dashboard from './ui/pages/dashboard';
-import AddPage from './ui/pages/addpage';
-import Page404 from './ui/pages/404page';
-// import footer from "./ui/component/container/footer";
-
-const routes = {
- '/': Dashboard,
- '/add-page.html': AddPage,
- '/404.html': Page404,
-};
-
-const detectRoute = () => routes[window.location.pathname];
-
-const initPages = () => {
- document.querySelector('header');
- document.querySelector('main');
- document.querySelector('footer');
-};
-
-window.addEventListener('DOMContentLoaded', async () => {
- initPages();
-
- const route = detectRoute();
- route.init();
-});
\ No newline at end of file
+// Import our custom CSS
+import '../sass/index.scss';
+// Import javascript file as needed
+import * as bootstrap from 'bootstrap';
+//import dashboard
+import HomePage from './ui/pages/homepage';
+import AddPage from './ui/pages/addstorypage';
+import loginPage from './ui/pages/loginpage';
+import registerPage from './ui/pages/registerpage';
+import Page404 from './ui/pages/404page';
+import dropdown from './ui/component/dropdown/dropdown';
+import DashboardPage from './ui/pages/dashboardpage';
+import AddPageforGuest from './ui/pages/addstorypageforguest';
+import './utils/firebase';
+
+const routes = {
+ '/': HomePage,
+ '/addpage.html': AddPage,
+ '/addpageforguest.html': AddPageforGuest,
+ '/login.html': loginPage,
+ '/register.html': registerPage,
+ '/dashboard.html': DashboardPage,
+ '/404.html': Page404,
+};
+
+const detectRoute = () => {
+ const route = routes[window.location.pathname];
+ return route ? route : Page404;
+};
+
+const initPages = () => {
+ document.querySelector('header');
+ document.querySelector('main');
+ document.querySelector('footer');
+};
+
+window.addEventListener('DOMContentLoaded', async () => {
+ initPages();
+
+ const route = detectRoute();
+ route.init();
+});
diff --git a/src/js/localization/localization.js b/src/js/localization/localization.js
new file mode 100644
index 0000000..493c5de
--- /dev/null
+++ b/src/js/localization/localization.js
@@ -0,0 +1,33 @@
+import { configureLocalization } from '@lit/localize';
+import { sourceLocale, targetLocales } from '../../generated/locale-codes';
+
+export const { getLocale, setLocale } = configureLocalization({
+ sourceLocale,
+ targetLocales,
+ async loadLocale(locale) {
+ return import(`../../generated/locales/${locale}.js`);
+ },
+});
+
+export const setLocaleFromUrl = async () => {
+ const url = new URL(window.location.href);
+ const locale = url.searchParams.get('lang') || sourceLocale;
+
+ console.log('setLocaleFromUrl', locale);
+ console.log('getLocale', getLocale());
+ await setLocale(locale);
+};
+
+function getFlagEmoji(countryCode) {
+ const codePoints = countryCode
+ .toUpperCase()
+ .split('')
+ .map((char) => 127397 + char.charCodeAt());
+ return String.fromCodePoint(...codePoints);
+}
+
+export const localeNames = {
+ en: `${getFlagEmoji('US')} English`,
+ id: `${getFlagEmoji('ID')} Indonesia`,
+ cn: `${getFlagEmoji('CN')} 中国`,
+};
diff --git a/src/js/network/auth.js b/src/js/network/auth.js
new file mode 100644
index 0000000..4d3b992
--- /dev/null
+++ b/src/js/network/auth.js
@@ -0,0 +1,41 @@
+import ApiEndpoint from '../config/api-endpoint';
+import instance from '../config/api-instance';
+
+const Auth = {
+ async register({ name, email, password }) {
+ return await instance('application/json')({
+ method: 'post',
+ url: ApiEndpoint.REGISTER,
+ data: {
+ name: name,
+ email: email,
+ password: password,
+ },
+ })
+ .then((res) => {
+ return res;
+ })
+ .catch((err) => {
+ return err;
+ });
+ },
+
+ async login({ email, password }) {
+ return await instance('application/json')({
+ method: 'post',
+ url: ApiEndpoint.LOGIN,
+ data: {
+ email: email,
+ password: password,
+ },
+ })
+ .then((res) => {
+ return res;
+ })
+ .catch((err) => {
+ return err;
+ });
+ },
+};
+
+export default Auth;
diff --git a/src/js/network/stories.js b/src/js/network/stories.js
new file mode 100644
index 0000000..82e49e8
--- /dev/null
+++ b/src/js/network/stories.js
@@ -0,0 +1,53 @@
+import ApiEndpoint from '../config/api-endpoint';
+import instance from '../config/api-instance';
+
+const Stories = {
+ async getAllStories() {
+ return await instance('application/json')({
+ method: 'get',
+ url: ApiEndpoint.GET_ALL_STORIES,
+ })
+ .then((res) => {
+ return res;
+ })
+ .catch((err) => {
+ return err;
+ });
+ },
+
+ async addNewStory({ description, photo }) {
+ return await instance('multipart/form-data')({
+ method: 'post',
+ url: ApiEndpoint.ADD_NEW_STORY,
+ data: {
+ description: description,
+ photo: photo,
+ },
+ })
+ .then((res) => {
+ return res;
+ })
+ .catch((err) => {
+ return err;
+ });
+ },
+
+ async addNewStoryforGuest({ description, photo }) {
+ return await instance('multipart/form-data')({
+ method: 'post',
+ url: ApiEndpoint.ADD_NEW_STORY_WITHOUT_AUTH,
+ data: {
+ description: description,
+ photo: photo,
+ },
+ })
+ .then((res) => {
+ return res;
+ })
+ .catch((err) => {
+ return err;
+ });
+ },
+};
+
+export default Stories;
diff --git a/src/js/ui/component/alert/alert.js b/src/js/ui/component/alert/alert.js
new file mode 100644
index 0000000..ef6cc25
--- /dev/null
+++ b/src/js/ui/component/alert/alert.js
@@ -0,0 +1,19 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class AlertApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Data added successfully`)}
+
+ `;
+ }
+}
+
+customElements.define('alert-component', AlertApp);
diff --git a/src/js/ui/component/container/footer.js b/src/js/ui/component/container/footer.js
index f5e76af..7840f9c 100644
--- a/src/js/ui/component/container/footer.js
+++ b/src/js/ui/component/container/footer.js
@@ -1,32 +1,36 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-import Socmed from '../icon/socmed';
-
-class FooterApp extends LitWithoutShadowDom {
- constructor() {
- super();
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-customElements.define('footer-component', FooterApp);
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import Socmed from '../icon/socmed';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class FooterApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+
+ `;
+ }
+}
+
+customElements.define('footer-component', FooterApp);
diff --git a/src/js/ui/component/container/gallery.js b/src/js/ui/component/container/gallery.js
new file mode 100644
index 0000000..52cacc8
--- /dev/null
+++ b/src/js/ui/component/container/gallery.js
@@ -0,0 +1,16 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class GalleryApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`${msg(`Gallery`)}`;
+ }
+}
+
+customElements.define('gallery-component', GalleryApp);
diff --git a/src/js/ui/component/container/gallerysubheading.js b/src/js/ui/component/container/gallerysubheading.js
new file mode 100644
index 0000000..139bc39
--- /dev/null
+++ b/src/js/ui/component/container/gallerysubheading.js
@@ -0,0 +1,16 @@
+import LitShadowDom from '../../../base/LitShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class GallerySubHeadingApp extends LitShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`${msg(`Explore some of the stories created using our application`)}`;
+ }
+}
+
+customElements.define('gallerysubheading-component', GallerySubHeadingApp);
diff --git a/src/js/ui/component/container/header.js b/src/js/ui/component/container/header.js
deleted file mode 100644
index 05b662a..0000000
--- a/src/js/ui/component/container/header.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-
-class HeaderApp extends LitWithoutShadowDom {
- constructor() {
- super();
- }
-
- render() {
- return html`
- DashboardPage
- AddPage
- `;
- }
-}
-
-customElements.define('links-appbar', HeaderApp);
\ No newline at end of file
diff --git a/src/js/ui/component/container/homebanner.js b/src/js/ui/component/container/homebanner.js
new file mode 100644
index 0000000..8586972
--- /dev/null
+++ b/src/js/ui/component/container/homebanner.js
@@ -0,0 +1,86 @@
+import LitShadowDom from '../../../base/LitShadowDom';
+import { html, css } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class HomeBannerApp extends LitShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ static styles = css`
+ h1 {
+ margin: 0;
+ padding: 0;
+ }
+
+ .home-banner-heading {
+ color: #ffffff;
+ text-align: center;
+ font-family: 'Raleway';
+ line-height: 1.6;
+ }
+
+ .heading2 {
+ font-size: 2.5rem;
+ }
+
+ .home-banner-sub-heading {
+ color: #ffffff;
+ max-width: 1400px;
+ text-align: center;
+ line-height: 1.6;
+ }
+
+ .home-banner-button {
+ color: #291477ff;
+ transition: 0.3s;
+ font-weight: 700;
+ padding-top: 1.5rem;
+ border-width: 0px;
+ padding-left: 3rem;
+ border-radius: 45px;
+ padding-right: 3rem;
+ padding-bottom: 1.5rem;
+ background-color: #ffffff;
+ }
+
+ .home-banner-button:hover {
+ border-color: rgba(97, 85, 141, 0.9);
+ background-color: rgba(97, 85, 141, 0.9);
+ color: #ffffff;
+ }
+
+ @media (max-width: 767px) {
+ .heading2 {
+ font-size: 1.8rem;
+ }
+
+ .home-banner-sub-heading {
+ padding-left: 16px;
+ padding-right: 16px;
+ }
+ }
+
+ @media (max-width: 991px) {
+ .home-banner-sub-heading {
+ max-width: 100%;
+ }
+ }
+ `;
+
+ render() {
+ return html`
+
+ ${msg(`Introducing our Story Application`)}
+
+ ${msg(`Easily create and organize your stories with our user-friendly application.`)}
+
+ ${msg(`Learn More`)}
+ `;
+ }
+}
+
+customElements.define('homebanner-component', HomeBannerApp);
diff --git a/src/js/ui/component/container/homelinks.js b/src/js/ui/component/container/homelinks.js
new file mode 100644
index 0000000..0e74afe
--- /dev/null
+++ b/src/js/ui/component/container/homelinks.js
@@ -0,0 +1,39 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+import Utils from '../../../utils/utils';
+import CheckUserAuth from '../../pages/checkuserauth';
+import Config from '../../../config/config';
+
+class HomeLinksApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ _userLogOut(event) {
+ event.preventDefault();
+ Utils.destroyUserToken(Config.USER_TOKEN_KEY);
+ Utils.destroyName(Config.NAME);
+ CheckUserAuth.checkLoginState();
+ }
+
+ render() {
+ return html`
+ ${msg(`Home`)}
+ ${msg(`Add Story`)}
+
+ ${msg(`Login`)}
+
+
+ ${msg(`Register`)}
+
+
+ ${msg(`Logout`)}
+
+
+ `;
+ }
+}
+
+customElements.define('homelinks-component', HomeLinksApp);
diff --git a/src/js/ui/component/container/linksappbar.js b/src/js/ui/component/container/linksappbar.js
new file mode 100644
index 0000000..4196eb1
--- /dev/null
+++ b/src/js/ui/component/container/linksappbar.js
@@ -0,0 +1,36 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+import Utils from '../../../utils/utils';
+import CheckUserAuth from '../../pages/checkuserauth';
+import Config from '../../../config/config';
+
+class HeaderApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ _userLogOut(event) {
+ event.preventDefault();
+ Utils.destroyUserToken(Config.USER_TOKEN_KEY);
+ Utils.destroyName(Config.NAME);
+ CheckUserAuth.checkLoginState();
+ }
+
+ render() {
+ return html`
+ ${msg(`Home`)}
+ ${msg(`Add Story`)}
+ ${msg(`Login`)}
+
+ ${msg(`Register`)}
+
+
+ ${msg(`Logout`)}
+
+ `;
+ }
+}
+
+customElements.define('links-appbar', HeaderApp);
diff --git a/src/js/ui/component/dropdown/dropdown.js b/src/js/ui/component/dropdown/dropdown.js
new file mode 100644
index 0000000..8b57158
--- /dev/null
+++ b/src/js/ui/component/dropdown/dropdown.js
@@ -0,0 +1,70 @@
+import { html } from 'lit';
+import { allLocales } from '../../../../generated/locale-codes';
+import { updateWhenLocaleChanges } from '@lit/localize';
+import { getLocale, localeNames, setLocaleFromUrl } from '../../../localization/localization';
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+
+class LocalePicker extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ this._menu = null; // add this line to initialize _menu to null
+ }
+
+ render() {
+ return html`
+
+
+ ${localeNames[getLocale()]}
+
+
+ `;
+ }
+
+ _localeChanged(event) {
+ const newLocale = event.target.getAttribute('value');
+ if (allLocales.includes(newLocale)) {
+ // add this line to check if the locale code is valid
+ if (newLocale !== getLocale()) {
+ const url = new URL(window.location.href);
+ url.searchParams.set('lang', newLocale);
+
+ window.history.pushState(null, '', url.toString());
+ setLocaleFromUrl();
+ }
+ }
+ }
+
+ _menuClicked(event) {
+ // add this method to set _menu to the dropdown menu element
+ this._menu = event.currentTarget;
+ }
+
+ toggle() {
+ // modify this method to check if _menu is not null before calling toggle
+ if (this._menu) {
+ const instance = Dropdown.getInstance(this._menu);
+ if (instance) {
+ instance.toggle();
+ }
+ }
+ }
+}
+
+customElements.define('locale-picker', LocalePicker);
diff --git a/src/js/ui/component/form/form.js b/src/js/ui/component/form/form.js
deleted file mode 100644
index de14988..0000000
--- a/src/js/ui/component/form/form.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-import input from './input';
-
-class FormApp extends LitWithoutShadowDom {
- constructor() {
- super();
- }
-
- render() {
- return html`
- Add Story
-
- `;
- }
-}
-
-customElements.define('form-component', FormApp);
\ No newline at end of file
diff --git a/src/js/ui/component/form/formaddstory.js b/src/js/ui/component/form/formaddstory.js
new file mode 100644
index 0000000..a722380
--- /dev/null
+++ b/src/js/ui/component/form/formaddstory.js
@@ -0,0 +1,49 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import input from './input';
+import inputimage from './input-image';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class FormAddStoryApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Add Story`)}
+
+ `;
+ }
+}
+
+customElements.define('formaddstory-component', FormAddStoryApp);
diff --git a/src/js/ui/component/form/formaddstoryforguest.js b/src/js/ui/component/form/formaddstoryforguest.js
new file mode 100644
index 0000000..9d2f65d
--- /dev/null
+++ b/src/js/ui/component/form/formaddstoryforguest.js
@@ -0,0 +1,40 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import input from './input';
+import inputimage from './input-image';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class FormAddStoryForGuestApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Add Story for Guest`)}
+
+ `;
+ }
+}
+
+customElements.define('formaddstoryforguest-component', FormAddStoryForGuestApp);
diff --git a/src/js/ui/component/form/formlogin.js b/src/js/ui/component/form/formlogin.js
new file mode 100644
index 0000000..8000e7e
--- /dev/null
+++ b/src/js/ui/component/form/formlogin.js
@@ -0,0 +1,44 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import input from './input';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+import showpassword from './showpassword';
+
+class FormLoginApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Login StoryApp`)}
+
+ `;
+ }
+}
+
+customElements.define('formlogin-component', FormLoginApp);
diff --git a/src/js/ui/component/form/formregister.js b/src/js/ui/component/form/formregister.js
new file mode 100644
index 0000000..98cf583
--- /dev/null
+++ b/src/js/ui/component/form/formregister.js
@@ -0,0 +1,53 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import input from './input';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+import showpassword from './showpassword';
+
+class FormRegisterApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Register StoryApp`)}
+
+ `;
+ }
+}
+
+customElements.define('formregister-component', FormRegisterApp);
diff --git a/src/js/ui/component/form/input-image.js b/src/js/ui/component/form/input-image.js
new file mode 100644
index 0000000..6941737
--- /dev/null
+++ b/src/js/ui/component/form/input-image.js
@@ -0,0 +1,112 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html, nothing } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class InputImageApp extends LitWithoutShadowDom {
+ static properties = {
+ inputId: { type: String, reflect: true },
+ defaultImage: { type: String, reflect: true },
+ defaultImageAlt: { type: String, reflect: true },
+ validFeedbackMessage: { type: String, reflect: true },
+ invalidFeedbackMessage: { type: String, reflect: true },
+ required: { type: Boolean, reflect: true },
+ };
+
+ constructor() {
+ super();
+ this.type = 'text';
+ this.defaultImage = '';
+ this.defaultImageAlt = '';
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`Photo`)}
+
+ ${this._imagePreviewTemplate()}
+
+
+
+ ${this._feedbackTemplate()}
+ `;
+ }
+
+ _updatePhotoPreview() {
+ const evidenceImgChange = document.querySelector('#validationCustomEvidenceImgChange');
+ const evidenceImgInput = document.querySelector('#validationCustomEvidence');
+
+ let evidenceRecordImg = null;
+ if (this.defaultImage) {
+ evidenceRecordImg = document.querySelector('#validationCustomEvidenceImg');
+ }
+
+ const photo = evidenceImgInput.files[0];
+ if (!photo) return;
+
+ const reader = new FileReader();
+ reader.onload = (event) => {
+ if (this.defaultImage) {
+ evidenceRecordImg.classList.add('d-none');
+ }
+ evidenceImgChange.parentElement.classList.remove('d-none');
+ evidenceImgChange.classList.remove('d-none');
+ evidenceImgChange.style.backgroundImage = `url('${event.target.result}')`;
+ };
+
+ reader.readAsDataURL(photo);
+ }
+
+ _feedbackTemplate() {
+ let validFeedbackTemplate = '';
+ let invalidFeedbackTemplate = '';
+ if (this.validFeedbackMessage) {
+ validFeedbackTemplate = html`
+ ${this.validFeedbackMessage}
+ `;
+ }
+ if (this.invalidFeedbackMessage) {
+ invalidFeedbackTemplate = html`
+ ${this.invalidFeedbackMessage}
+ `;
+ }
+
+ return html`${validFeedbackTemplate}${invalidFeedbackTemplate}`;
+ }
+
+ _imagePreviewTemplate() {
+ const imgChangeTemplate = html`
+
+ `;
+ if (this.defaultImage) {
+ return html`
+
+ ${imgChangeTemplate}
+ `;
+ }
+
+ return html` ${imgChangeTemplate} `;
+ }
+}
+
+customElements.define('inputimage-component', InputImageApp);
diff --git a/src/js/ui/component/form/input.js b/src/js/ui/component/form/input.js
index 34f1eb8..dba86c0 100644
--- a/src/js/ui/component/form/input.js
+++ b/src/js/ui/component/form/input.js
@@ -1,91 +1,58 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-
-class InputApp extends LitWithoutShadowDom {
- static get properties() {
- return {
- name: { type: String },
- type: { type: String },
- placeholder: { type: String },
- idscss: { type: String },
- };
- }
-
- constructor() {
- super();
- this.name = 'Name';
- this.type = 'text';
- this.placeholder = 'Placeholder';
- this.idscss = 'idscss';
- }
-
- render() {
- return html`
- ${this.name}
-
- `;
- }
-}
-
-customElements.define('input-component', InputApp);
-
-
-
-// import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-// import { html, nothing } from 'lit';
-
-// class InputApp extends LitWithoutShadowDom {
-// static get properties() {
-// return {
-// name: { type: String, reflect: true },
-// type: { type: String, reflect: true },
-// placeholder: { type: String, reflect: true },
-// idscss: { type: String, reflect: true },
-// value: { type: String, reflect: true },
-// required: { type: Boolean, reflect: true },
-// validFeedbackMessage: { type: String, reflect: true },
-// invalidFeedbackMessage: { type: String, reflect: true },
-// };
-// }
-
-// constructor() {
-// super();
-// this.name = 'Name';
-// this.type = 'text';
-// this.placeholder = 'Placeholder';
-// this.idscss = 'idscss';
-// this.required = false;
-// }
-
-// render() {
-// return html`
-// ${this.name}
-// (this.value = e.target.value)}
-// />
-// ${this._validFeedbackTemplate()}
-// ${this.invalidFeedbackMessage}
-// `;
-// }
-
-// _validFeedbackTemplate() {
-// if (this.validFeedbackMessage) {
-// return html` ${this.validFeedbackMessage}
`;
-// }
-
-// return html``;
-// }
-// }
-
-// customElements.define('input-component', InputApp);
\ No newline at end of file
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+
+class InputApp extends LitWithoutShadowDom {
+ static get properties() {
+ return {
+ name: { type: String },
+ type: { type: String },
+ placeholder: { type: String },
+ idscss: { type: String },
+ validFeedbackMessage: { type: String, reflect: true },
+ invalidFeedbackMessage: { type: String, reflect: true },
+ required: { type: Boolean, reflect: true },
+ };
+ }
+
+ constructor() {
+ super();
+ this.name = 'Name';
+ this.type = 'text';
+ this.placeholder = 'Placeholder';
+ this.idscss = 'idscss';
+ }
+
+ render() {
+ return html`
+ ${this.name}
+
+
+ ${this._feedbackTemplate()}
+ `;
+ }
+
+ _feedbackTemplate() {
+ let validFeedbackTemplate = '';
+ let invalidFeedbackTemplate = '';
+ if (this.validFeedbackMessage) {
+ validFeedbackTemplate = html`
+ ${this.validFeedbackMessage}
+ `;
+ }
+ if (this.invalidFeedbackMessage) {
+ invalidFeedbackTemplate = html`
+ ${this.invalidFeedbackMessage}
+ `;
+ }
+
+ return html`${validFeedbackTemplate}${invalidFeedbackTemplate}`;
+ }
+}
+
+customElements.define('input-component', InputApp);
diff --git a/src/js/ui/component/form/showpassword.js b/src/js/ui/component/form/showpassword.js
new file mode 100644
index 0000000..e0ccd0f
--- /dev/null
+++ b/src/js/ui/component/form/showpassword.js
@@ -0,0 +1,31 @@
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+
+class ShowPassword extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ }
+
+ render() {
+ return html`
+ this._showPassword()}
+ />
+ Show Password
+ `;
+ }
+
+ _showPassword() {
+ var passwordText = document.getElementById('password-input');
+ if (passwordText.type === 'password') {
+ passwordText.type = 'text';
+ } else {
+ passwordText.type = 'password';
+ }
+ }
+}
+
+customElements.define('show-password', ShowPassword);
diff --git a/src/js/ui/component/icon/socmed.js b/src/js/ui/component/icon/socmed.js
index f23b463..f1078e1 100644
--- a/src/js/ui/component/icon/socmed.js
+++ b/src/js/ui/component/icon/socmed.js
@@ -1,25 +1,17 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-
-class SocmedLogoApp extends LitWithoutShadowDom {
- constructor() {
- super();
- }
-
- render() {
- return html`
-
-
-
-
-
-
- `;
- }
-}
-
-customElements.define('socmed-component', SocmedLogoApp);
\ No newline at end of file
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+
+class SocmedLogoApp extends LitWithoutShadowDom {
+ constructor() {
+ super();
+ }
+
+ render() {
+ return html`
+
+
+ `;
+ }
+}
+
+customElements.define('socmed-component', SocmedLogoApp);
diff --git a/src/js/ui/component/list/listitem.js b/src/js/ui/component/list/listitem.js
index 9d904f7..5fd40cc 100644
--- a/src/js/ui/component/list/listitem.js
+++ b/src/js/ui/component/list/listitem.js
@@ -1,37 +1,35 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-
-class ListItemApp extends LitWithoutShadowDom {
- static get properties() {
- return {
- image: { type: String },
- name: { type: String },
- description: { type: String },
- createdAt: { type: String },
- };
- }
-
- constructor() {
- super();
- this.image = 'https://images.unsplash.com/photo-1517145598654-91f0bb341394?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w5MTMyMXwwfDF8cmFuZG9tfHx8fHx8fHx8MTY5OTI0NzM3M3w&ixlib=rb-4.0.3&q=80&w=400';
- this.name = 'Name';
- this.description = 'Description';
- this.createdAt = 'createdAt';
- }
-
- render() {
- console.log(this.name);
- return html`
-
- ${this.name}
- ${this.description}
- ${this.createdAt}
- `;
- }
-}
-
-customElements.define('listitem-component', ListItemApp);
\ No newline at end of file
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+
+class ListItemApp extends LitWithoutShadowDom {
+ static get properties() {
+ return {
+ image: { type: String },
+ name: { type: String },
+ description: { type: String },
+ createdAt: { type: String },
+ };
+ }
+
+ constructor() {
+ super();
+ this.image =
+ 'https://images.unsplash.com/photo-1517145598654-91f0bb341394?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w5MTMyMXwwfDF8cmFuZG9tfHx8fHx8fHx8MTY5OTI0NzM3M3w&ixlib=rb-4.0.3&q=80&w=400';
+ this.name = 'Name';
+ this.description = 'Description';
+ this.createdAt = 'createdAt';
+ }
+
+ render() {
+ return html`
+
+
+ ${this.name}
+ ${this.description}
+ ${this.createdAt}
+
+ `;
+ }
+}
+
+customElements.define('listitem-component', ListItemApp);
diff --git a/src/js/ui/component/loading/loading.js b/src/js/ui/component/loading/loading.js
new file mode 100644
index 0000000..f18e111
--- /dev/null
+++ b/src/js/ui/component/loading/loading.js
@@ -0,0 +1,59 @@
+import LitShadowDom from '../../../base/LitShadowDom';
+import { html, css } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+
+class LoadingApp extends LitShadowDom {
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ static styles = css`
+ .loading {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 255, 255, 50);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .loading-indicator {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ border: 3px solid rgba(0, 0, 0, 0.3);
+ border-radius: 50%;
+ border-top-color: #000;
+ margin-right: 20px;
+ animation: spin 1s ease-in-out infinite;
+ }
+
+ @keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+ }
+ `;
+
+ render() {
+ return html`
+
+
+ `;
+ }
+}
+
+customElements.define('loading-component', LoadingApp);
diff --git a/src/js/ui/component/notfound/notfound.js b/src/js/ui/component/notfound/notfound.js
index 5a0503c..ec2b47d 100644
--- a/src/js/ui/component/notfound/notfound.js
+++ b/src/js/ui/component/notfound/notfound.js
@@ -1,37 +1,42 @@
-import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
-import { html } from 'lit';
-
-class NotfoundApp extends LitWithoutShadowDom {
- static get properties() {
- return {
- link: { type: String }
- };
- }
-
- constructor() {
- super();
- this.link = '/';
- }
-
- render() {
- return html`
- OOPS! PAGE NOT FOUND
-
-
404
-
-
-
- WE ARE SORRY, BUT THE PAGE YOU REQUESTED WAS NOT FOUND
-
-
- this._goToDashboard()}>Back
- `;
- }
-
- _goToDashboard() {
- window.location.href = '/';
- document.querySelector;
- }
-}
-
-customElements.define('notfound-component', NotfoundApp);
\ No newline at end of file
+import LitWithoutShadowDom from '../../../base/LitWithoutShadowDom';
+import { html } from 'lit';
+import { msg, updateWhenLocaleChanges } from '@lit/localize';
+import dropdown from '../dropdown/dropdown';
+
+class NotfoundApp extends LitWithoutShadowDom {
+ static get properties() {
+ return {
+ link: { type: String },
+ };
+ }
+
+ constructor() {
+ super();
+ updateWhenLocaleChanges(this);
+ }
+
+ render() {
+ return html`
+ ${msg(`OOPS! PAGE NOT FOUND`)}
+
+
404
+
+
+
+ ${msg(`WE ARE SORRY, BUT THE PAGE YOU REQUESTED WAS NOT FOUND`)}
+
+
+
+ this._goToDashboard()}>
+ ${msg(`Back`)}
+
+ `;
+ }
+
+ _goToDashboard() {
+ window.location.href = '/';
+ document.querySelector;
+ }
+}
+
+customElements.define('notfound-component', NotfoundApp);
diff --git a/src/js/ui/pages/404page.js b/src/js/ui/pages/404page.js
index ed63551..3d49dc9 100644
--- a/src/js/ui/pages/404page.js
+++ b/src/js/ui/pages/404page.js
@@ -1,14 +1,19 @@
-import "../../../sass/style.scss";
-import "../../../sass/404.scss";
-import "../component/notfound/notfound"
-
-const Page404 = {
- async init() {
- this._initialListener();
- },
-
- _initialListener() {
- },
-};
-
-export default Page404;
\ No newline at end of file
+import '../../../sass/style.scss';
+import '../../../sass/404.scss';
+import '../component/notfound/notfound';
+import '../component/loading/loading';
+
+const Page404 = {
+ async init() {
+ await this._showLoading();
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+};
+
+export default Page404;
diff --git a/src/js/ui/pages/addpage.js b/src/js/ui/pages/addpage.js
deleted file mode 100644
index 07bbe0a..0000000
--- a/src/js/ui/pages/addpage.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import "../../../sass/add-page.scss";
-import "../../../sass/style.scss";
-import header from "../component/container/header";
-import footer from "../component/container/footer";
-import form from "../component/form/form";
-
-const AddPage = {
- async init() {
- this._initialListener();
- },
-
- _initialListener() {
- const addFormRecord = document.querySelector('.form-input-form');
- addFormRecord.addEventListener(
- 'submit',
- (event) => {
- event.preventDefault();
- event.stopPropagation();
- this._sendPost();
- },
- false,
- );
- },
-
- _getFormData() {
- const nameInput = document.querySelector('#name-input');
- const descriptionInput = document.querySelector('#description-input');
- return {
- id: `story-${Math.random().toString(18).substring(2, 18)}`,
- name: nameInput.value,
- description: descriptionInput.value,
- };
- },
-
- _sendPost() {
- const formData = this._getFormData();
- if (this._validateFormData({ ...formData })) {
- console.log('formData');
- console.log(formData);
- }
- },
-
- _validateFormData(formData) {
- const formDataFiltered = Object.values(formData).filter((item) => item === '');
- return formDataFiltered.length === 0;
- },
-
- _goToDashboardPage() {
- window.location.href = '/';
- },
-};
-
-export default AddPage;
\ No newline at end of file
diff --git a/src/js/ui/pages/addstorypage.js b/src/js/ui/pages/addstorypage.js
new file mode 100644
index 0000000..a28b239
--- /dev/null
+++ b/src/js/ui/pages/addstorypage.js
@@ -0,0 +1,96 @@
+import '../../../sass/add-page.scss';
+import '../../../sass/style.scss';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import formaddstory from '../component/form/formaddstory';
+import alert from '../component/alert/alert';
+import loading from '../component/loading/loading';
+import CheckUserAuth from './checkuserauth';
+import Stories from '../../network/stories';
+
+const AddPage = {
+ async init() {
+ CheckUserAuth.checkLoginState();
+ this._initialListener();
+ await this._showLoading();
+ },
+
+ _initialListener() {
+ const addFormRecord = document.querySelector('.form-input-form');
+ addFormRecord.addEventListener(
+ 'submit',
+ async (event) => {
+ event.preventDefault();
+ event.stopPropagation();
+ addFormRecord.classList.add('was-validated');
+ await this._sendPost();
+ this._alertNotification();
+ setTimeout(() => {
+ this._goToDashboardPage();
+ }, 3000);
+ },
+ false,
+ );
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+
+ _getFormData() {
+ const evidenceInput = document.querySelector('#validationCustomEvidence');
+ const nameInput = document.querySelector('#storyname-input');
+ const descriptionInput = document.querySelector('#description-input');
+ return {
+ name: nameInput.value,
+ description: descriptionInput.value,
+ photo: evidenceInput.files[0],
+ };
+ },
+
+ async _sendPost() {
+ const formData = this._getFormData();
+ if (this._validateFormData({ ...formData })) {
+ try {
+ const response = await Stories.addNewStory(formData);
+ if (response.status === 201) {
+ window.alert('New Stories added successfully');
+ this._goToDashboardPage();
+ } else {
+ window.alert(`${response.message}`);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ },
+
+ _validateFormData(formData) {
+ const formDataFiltered = Object.values(formData).filter((item) => item === '');
+ return formDataFiltered.length === 0;
+ },
+
+ _getBase64(file) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.onload = () => resolve(reader.result);
+ reader.onerror = (error) => reject(error);
+ });
+ },
+
+ _goToDashboardPage() {
+ window.location.href = '/dashboard.html';
+ },
+
+ _alertNotification() {
+ const alertComponent = document.createElement('alert-component');
+ alertComponent.classList.add('alert', 'alert-success', 'alert-dismissible', 'alertscss');
+ document.body.appendChild(alertComponent);
+ },
+};
+
+export default AddPage;
diff --git a/src/js/ui/pages/addstorypageforguest.js b/src/js/ui/pages/addstorypageforguest.js
new file mode 100644
index 0000000..65be1ef
--- /dev/null
+++ b/src/js/ui/pages/addstorypageforguest.js
@@ -0,0 +1,99 @@
+import '../../../sass/add-page.scss';
+import '../../../sass/style.scss';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import FormAddPageForGuest from '../component/form/formaddstoryforguest';
+import alert from '../component/alert/alert';
+import loading from '../component/loading/loading';
+import Config from '../../config/config';
+import Utils from '../../utils/utils';
+import Stories from '../../network/stories';
+
+const AddPageforGuest = {
+ async init() {
+ this._initialListener();
+ await this._showLoading();
+ },
+
+ _initialListener() {
+ const addFormRecord = document.querySelector('.form-input-form');
+ addFormRecord.addEventListener(
+ 'submit',
+ async (event) => {
+ event.preventDefault();
+ event.stopPropagation();
+ addFormRecord.classList.add('was-validated');
+ await this._sendPost();
+ this._alertNotification();
+ setTimeout(() => {
+ this._goToDashboardPage();
+ }, 3000);
+ },
+ false,
+ );
+ const userToken = Utils.getUserToken(Config.USER_TOKEN_KEY);
+ const isUserSignedIn = Boolean(userToken);
+ const loginlabel = document.querySelector('.login-appbar');
+ const registerlabel = document.querySelector('.register-appbar');
+ const logoutlabel = document.querySelector('.logout-appbar');
+ if (isUserSignedIn) {
+ loginlabel.classList.add('hidden');
+ registerlabel.classList.add('hidden');
+ logoutlabel.classList.remove('hidden');
+ } else {
+ loginlabel.classList.remove('hidden');
+ registerlabel.classList.remove('hidden');
+ logoutlabel.classList.add('hidden');
+ }
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+
+ _getFormData() {
+ const evidenceInput = document.querySelector('#validationCustomEvidence');
+ const descriptionInput = document.querySelector('#description-input');
+ return {
+ description: descriptionInput.value,
+ photo: evidenceInput.files[0],
+ };
+ },
+
+ async _sendPost() {
+ const formData = this._getFormData();
+ if (this._validateFormData({ ...formData })) {
+ try {
+ const response = await Stories.addNewStoryforGuest(formData);
+ if (response.status === 201) {
+ window.alert('New Stories added successfully');
+ this._goToDashboardPage();
+ } else {
+ window.alert(`${response.message}`);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ },
+
+ _validateFormData(formData) {
+ const formDataFiltered = Object.values(formData).filter((item) => item === '');
+ return formDataFiltered.length === 0;
+ },
+
+ _goToDashboardPage() {
+ window.location.href = '/';
+ },
+
+ _alertNotification() {
+ const alertComponent = document.createElement('alert-component');
+ alertComponent.classList.add('alert', 'alert-success', 'alert-dismissible', 'alertscss');
+ document.body.appendChild(alertComponent);
+ },
+};
+
+export default AddPageforGuest;
diff --git a/src/js/ui/pages/checkuserauth.js b/src/js/ui/pages/checkuserauth.js
new file mode 100644
index 0000000..1fc9181
--- /dev/null
+++ b/src/js/ui/pages/checkuserauth.js
@@ -0,0 +1,37 @@
+import Utils from '../../utils/utils';
+import Config from '../../config/config';
+
+const CheckUserAuth = {
+ excludeRedirectPage: ['login.html', 'register.html'],
+
+ checkLoginState() {
+ const userToken = Utils.getUserToken(Config.USER_TOKEN_KEY);
+ const isUserSignedIn = Boolean(userToken);
+ const isUserOnAuthPage = this._isUserOnAuthPage(this.excludeRedirectPage);
+ const loginlabel = document.querySelector('.login-appbar');
+ const registerlabel = document.querySelector('.register-appbar');
+ const logoutlabel = document.querySelector('.logout-appbar');
+
+ if (isUserSignedIn) {
+ loginlabel.classList.add('hidden');
+ registerlabel.classList.add('hidden');
+ logoutlabel.classList.remove('hidden');
+ if (isUserOnAuthPage) {
+ window.location.href = '/dashboard.html';
+ } else {
+ return isUserSignedIn;
+ }
+ } else {
+ if (!isUserOnAuthPage) {
+ window.location.href = '/login.html';
+ }
+ }
+ },
+
+ _isUserOnAuthPage(pages) {
+ const filteredPages = pages.filter((item) => window.location.pathname.endsWith(item));
+ return Boolean(filteredPages.length);
+ },
+};
+
+export default CheckUserAuth;
diff --git a/src/js/ui/pages/dashboard.js b/src/js/ui/pages/dashboard.js
deleted file mode 100644
index a45e9c8..0000000
--- a/src/js/ui/pages/dashboard.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import "../../../sass/index.scss";
-import "../../../sass/style.scss";
-import { showFormattedDateTime } from "../../utils/datetime";
-import header from "../component/container/header";
-import footer from "../component/container/footer";
-import listitem from "../component/list/listitem";
-
-const Dashboard = {
- async init() {
- await this._initialData();
- },
-
- async _initialData() {
- const fetchStory = await fetch('/data/data.json');
- const responseStory = await fetchStory.json();
- this._myStory = responseStory.listStory;
- this._populateStoryRecordToCard(this._myStory);
- },
-
- _populateStoryRecordToCard(listStory = null) {
- if (!(typeof listStory === 'object')) {
- throw new Error(`Parameter listStory should be an object. The value is ${listStory}`);
- }
- if (!Array.isArray(listStory)) {
- throw new Error(`Parameter listStory should be an array. The value is ${listStory}`);
- }
- const recordBodyCard = document.querySelector('.home-container1');
- recordBodyCard.innerHTML = '';
- if (listStory.length <= 0) {
- recordBodyCard.innerHTML = this._templateEmptyBodyCard();
- return;
- }
- listStory.forEach((item, idx) => {
- recordBodyCard.innerHTML += this._templateBodyCard(idx, listStory[idx]);
- });
- },
-
- _templateBodyCard(index, storyRecord) {
- //ubah format datetime dari ISO 8601 menjadi HARI, TANGGAL BULAN TAHUN Pukul JAM:Menit:Detik
- const date = showFormattedDateTime(storyRecord.createdAt);
- return `
-
- `;
- },
-
- _templateEmptyBodyCard() {
- return `
- Tidak ada list cerita
- `;
- },
-};
-
-export default Dashboard;
\ No newline at end of file
diff --git a/src/js/ui/pages/dashboardpage.js b/src/js/ui/pages/dashboardpage.js
new file mode 100644
index 0000000..bf0d92b
--- /dev/null
+++ b/src/js/ui/pages/dashboardpage.js
@@ -0,0 +1,114 @@
+import '../../../sass/index.scss';
+import '../../../sass/style.scss';
+import { showFormattedDateTime } from '../../utils/datetime';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import listitem from '../component/list/listitem';
+import homelinks from '../component/container/homelinks';
+import loading from '../component/loading/loading';
+import CheckUserAuth from './checkuserauth';
+import Stories from '../../network/stories';
+
+const DashboardPage = {
+ async init() {
+ CheckUserAuth.checkLoginState();
+ await this._initialData();
+ this._bindDropdownEvent();
+ await this._showLoading();
+ },
+
+ async _initialData() {
+ try {
+ const response = await Stories.getAllStories();
+ const responseRecords = response.data;
+ this._listStory = responseRecords.listStory;
+ this._populateStoryRecordToCard(this._listStory);
+ } catch (error) {
+ console.error(error);
+ }
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+
+ _bindDropdownEvent() {
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ dropdownbtn.addEventListener('click', () => {
+ this._updateTimezone();
+ });
+ },
+
+ _updateTimezone() {
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ let timezonename;
+ if (dropdownbtn.innerText === '🇮🇩 Indonesia') {
+ timezonename = 'id-ID';
+ } else if (dropdownbtn.innerText === '🇺🇸 English') {
+ timezonename = 'en';
+ } else if (dropdownbtn.innerText === '🇨🇳 中国') {
+ // https://www.rfc-editor.org/bcp/bcp47.txt
+ timezonename = 'zh-Hans';
+ }
+ const listStory = this._listStory;
+ const recordBodyCard = document.querySelector('.home-container1');
+ recordBodyCard.innerHTML = '';
+ if (listStory.length <= 0) {
+ recordBodyCard.innerHTML = this._templateEmptyBodyCard();
+ return;
+ }
+ listStory.forEach((item, idx) => {
+ recordBodyCard.innerHTML += this._templateBodyCard(idx, listStory[idx], timezonename);
+ });
+ },
+
+ _populateStoryRecordToCard(listStory = null) {
+ if (!(typeof listStory === 'object')) {
+ throw new Error(`Parameter listStory should be an object. The value is ${listStory}`);
+ }
+ if (!Array.isArray(listStory)) {
+ throw new Error(`Parameter listStory should be an array. The value is ${listStory}`);
+ }
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ let timezonename;
+ if (dropdownbtn.innerText === 'Indonesia') {
+ timezonename = 'id-ID';
+ } else if (dropdownbtn.innerText === 'English') {
+ timezonename = 'en';
+ }
+ const recordBodyCard = document.querySelector('.home-container1');
+ recordBodyCard.innerHTML = '';
+ if (listStory.length <= 0) {
+ recordBodyCard.innerHTML = this._templateEmptyBodyCard();
+ return;
+ }
+ listStory.forEach((item, idx) => {
+ recordBodyCard.innerHTML += this._templateBodyCard(idx, listStory[idx], timezonename);
+ });
+ },
+
+ _templateBodyCard(index, storyRecord, timezonename) {
+ const date = showFormattedDateTime(timezonename, storyRecord.createdAt);
+ return `
+
+
+ `;
+ },
+
+ _templateEmptyBodyCard() {
+ return `
+ Tidak ada list cerita
+ `;
+ },
+};
+
+export default DashboardPage;
diff --git a/src/js/ui/pages/homepage.js b/src/js/ui/pages/homepage.js
new file mode 100644
index 0000000..0ce4555
--- /dev/null
+++ b/src/js/ui/pages/homepage.js
@@ -0,0 +1,126 @@
+import '../../../sass/index.scss';
+import '../../../sass/style.scss';
+import { showFormattedDateTime } from '../../utils/datetime';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import listitem from '../component/list/listitem';
+import homelinks from '../component/container/homelinks';
+import homebanner from '../component/container/homebanner';
+import gallery from '../component/container/gallery';
+import galleryubheading from '../component/container/gallerysubheading';
+import loading from '../component/loading/loading';
+import Utils from '../../utils/utils';
+import Config from '../../config/config';
+
+const HomePage = {
+ async init() {
+ await this._initialData();
+ this._bindDropdownEvent();
+ await this._showLoading();
+ },
+
+ async _initialData() {
+ const fetchStory = await fetch('/data/data.json');
+ const responseStory = await fetchStory.json();
+ this._myStory = responseStory.listStory;
+ this._populateStoryRecordToCard(this._myStory);
+ const userToken = Utils.getUserToken(Config.USER_TOKEN_KEY);
+ const isUserSignedIn = Boolean(userToken);
+ const loginlabel = document.querySelector('.login-appbar');
+ const registerlabel = document.querySelector('.register-appbar');
+ const logoutlabel = document.querySelector('.logout-appbar');
+ if (isUserSignedIn) {
+ loginlabel.classList.add('hidden');
+ registerlabel.classList.add('hidden');
+ logoutlabel.classList.remove('hidden');
+ } else {
+ loginlabel.classList.remove('hidden');
+ registerlabel.classList.remove('hidden');
+ logoutlabel.classList.add('hidden');
+ }
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+
+ _bindDropdownEvent() {
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ dropdownbtn.addEventListener('click', () => {
+ this._updateTimezone();
+ });
+ },
+
+ _updateTimezone() {
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ let timezonename;
+ if (dropdownbtn.innerText === 'Indonesia') {
+ timezonename = 'id-ID';
+ } else if (dropdownbtn.innerText === 'English') {
+ timezonename = 'en';
+ } else if (dropdownbtn.innerText === '中国') {
+ // https://www.rfc-editor.org/bcp/bcp47.txt
+ timezonename = 'zh-Hans';
+ }
+ const listStory = this._myStory;
+ const recordBodyCard = document.querySelector('.home-container1');
+ recordBodyCard.innerHTML = '';
+ if (listStory.length <= 0) {
+ recordBodyCard.innerHTML = this._templateEmptyBodyCard();
+ return;
+ }
+ listStory.forEach((item, idx) => {
+ recordBodyCard.innerHTML += this._templateBodyCard(idx, listStory[idx], timezonename);
+ });
+ },
+
+ _populateStoryRecordToCard(listStory = null) {
+ if (!(typeof listStory === 'object')) {
+ throw new Error(`Parameter listStory should be an object. The value is ${listStory}`);
+ }
+ if (!Array.isArray(listStory)) {
+ throw new Error(`Parameter listStory should be an array. The value is ${listStory}`);
+ }
+ const dropdownbtn = document.querySelector('#dropdown-primary');
+ let timezonename;
+ if (dropdownbtn.innerText === 'Indonesia') {
+ timezonename = 'id-ID';
+ } else if (dropdownbtn.innerText === 'English') {
+ timezonename = 'en';
+ }
+ const recordBodyCard = document.querySelector('.home-container1');
+ recordBodyCard.innerHTML = '';
+ if (listStory.length <= 0) {
+ recordBodyCard.innerHTML = this._templateEmptyBodyCard();
+ return;
+ }
+ listStory.forEach((item, idx) => {
+ recordBodyCard.innerHTML += this._templateBodyCard(idx, listStory[idx], timezonename);
+ });
+ },
+
+ _templateBodyCard(index, storyRecord, timezonename) {
+ const date = showFormattedDateTime(timezonename, storyRecord.createdAt);
+ return `
+
+
+ `;
+ },
+
+ _templateEmptyBodyCard() {
+ return `
+ Tidak ada list cerita
+ `;
+ },
+};
+
+export default HomePage;
diff --git a/src/js/ui/pages/loginpage.js b/src/js/ui/pages/loginpage.js
new file mode 100644
index 0000000..0e04acb
--- /dev/null
+++ b/src/js/ui/pages/loginpage.js
@@ -0,0 +1,116 @@
+import '../../../sass/add-page.scss';
+import '../../../sass/style.scss';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import formlogin from '../component/form/formlogin';
+import alert from '../component/alert/alert';
+import loading from '../component/loading/loading';
+import Auth from '../../network/auth';
+import CheckUserAuth from './checkuserauth';
+import Config from '../../config/config';
+import Utils from '../../utils/utils';
+
+const LoginPage = {
+ async init() {
+ this._initialListener();
+ await this._showLoading();
+ },
+
+ _initialListener() {
+ const addFormRecord = document.querySelector('.form-input-form');
+ addFormRecord.addEventListener(
+ 'submit',
+ async (event) => {
+ event.preventDefault();
+ event.stopPropagation();
+ addFormRecord.classList.add('was-validated');
+ await this._sendPost();
+ this._alertNotification();
+ setTimeout(() => {
+ this._goToDashboardPage();
+ }, 3000);
+ },
+ false,
+ );
+ const userToken = Utils.getUserToken(Config.USER_TOKEN_KEY);
+ const isUserSignedIn = Boolean(userToken);
+ const logoutlabel = document.querySelector('.logout-appbar');
+ if (isUserSignedIn) {
+ window.location.href = '/dashboard.html';
+ } else {
+ logoutlabel.classList.add('hidden');
+ }
+ },
+
+ async _showLoading() {
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ }, 3000);
+ },
+
+ _getFormData() {
+ const emailInput = document.querySelector('#email-input');
+ const passwordInput = document.querySelector('#password-input');
+ return {
+ email: emailInput.value,
+ password: passwordInput.value,
+ };
+ },
+
+ async _sendPost() {
+ const formData = this._getFormData();
+ if (this._validateFormData({ ...formData })) {
+ try {
+ const response = await Auth.login({
+ email: formData.email,
+ password: formData.password,
+ });
+ if (response.status === 200) {
+ Utils.setUserToken(Config.USER_TOKEN_KEY, response.data.loginResult.token);
+ Utils.setName(Config.NAME, response.data.loginResult.name);
+
+ window.alert('Signed user in detected');
+
+ this._goToDashboardPage();
+ } else {
+ if (formData.password.length <= 8) {
+ window.alert(`Password harus minimal 8 karakter`);
+ } else {
+ window.alert(`${response.message}`);
+ }
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ },
+
+ _validateFormData(formData) {
+ const formDataFiltered = Object.values(formData).filter(
+ (item) => item === '' || item === undefined || item === null,
+ );
+ return formDataFiltered.length === 0;
+ },
+
+ _getBase64(file) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.onload = () => resolve(reader.result);
+ reader.onerror = (error) => reject(error);
+ });
+ },
+
+ _goToDashboardPage() {
+ window.location.href = '/dashboard.html';
+ },
+
+ _alertNotification() {
+ const alertComponent = document.createElement('alert-component');
+ alertComponent.classList.add('alert', 'alert-success', 'alert-dismissible', 'alertscss');
+ document.body.appendChild(alertComponent);
+ },
+};
+
+export default LoginPage;
diff --git a/src/js/ui/pages/registerpage.js b/src/js/ui/pages/registerpage.js
new file mode 100644
index 0000000..8ee432b
--- /dev/null
+++ b/src/js/ui/pages/registerpage.js
@@ -0,0 +1,110 @@
+import '../../../sass/add-page.scss';
+import '../../../sass/style.scss';
+import header from '../component/container/linksappbar';
+import footer from '../component/container/footer';
+import formregister from '../component/form/formregister';
+import alert from '../component/alert/alert';
+import loading from '../component/loading/loading';
+import Auth from '../../network/auth';
+import CheckUserAuth from './checkuserauth';
+import Utils from '../../utils/utils';
+import Config from '../../config/config';
+
+const RegisterPage = {
+ async init() {
+ CheckUserAuth.checkLoginState();
+ this._initialListener();
+ await this._showLoading();
+ },
+
+ _initialListener() {
+ const addFormRecord = document.querySelector('.form-input-form');
+ addFormRecord.addEventListener(
+ 'submit',
+ async (event) => {
+ event.preventDefault();
+ event.stopPropagation();
+ addFormRecord.classList.add('was-validated');
+ await this._sendPost();
+ this._alertNotification();
+ setTimeout(() => {
+ this._goToDashboardPage();
+ }, 3000);
+ },
+ false,
+ );
+ const userToken = Utils.getUserToken(Config.USER_TOKEN_KEY);
+ const isUserSignedIn = Boolean(userToken);
+ const logoutlabel = document.querySelector('.logout-appbar');
+ if (isUserSignedIn) {
+ window.location.href = '/dashboard.html';
+ } else {
+ logoutlabel.classList.add('hidden');
+ }
+ },
+
+ async _showLoading() {
+ const addcontainer = document.querySelector('.add-page-container');
+ addcontainer.classList.add('hidden');
+ await setTimeout(() => {
+ const loadingComponent = document.querySelector('loading-component');
+ loadingComponent.classList.add('hidden');
+ addcontainer.classList.remove('hidden');
+ }, 3000);
+ },
+
+ async _sendPost() {
+ const formData = this._getFormData();
+ if (this._validateFormData({ ...formData })) {
+ try {
+ const response = await Auth.register({
+ name: formData.name,
+ email: formData.email,
+ password: formData.password,
+ });
+ console.log(response.message);
+ if (response.status === 201) {
+ window.alert('Registered a new user');
+ this._goToLoginPage();
+ } else {
+ if (formData.password.length <= 9) {
+ window.alert(`Password harus minimal 8 karakter`);
+ } else {
+ window.alert(`${response.message}`);
+ }
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ },
+
+ _getFormData() {
+ const nameInput = document.querySelector('#name-input');
+ const emailInput = document.querySelector('#email-input');
+ const passwordInput = document.querySelector('#password-input');
+ var date = new Date().toISOString();
+ return {
+ name: nameInput.value,
+ email: emailInput.value,
+ password: passwordInput.value,
+ };
+ },
+
+ _validateFormData(formData) {
+ const formDataFiltered = Object.values(formData).filter((item) => item === '');
+ return formDataFiltered.length === 0;
+ },
+
+ _goToDashboardPage() {
+ window.location.href = '/';
+ },
+
+ _alertNotification() {
+ const alertComponent = document.createElement('alert-component');
+ alertComponent.classList.add('alert', 'alert-success', 'alert-dismissible', 'alertscss');
+ document.body.appendChild(alertComponent);
+ },
+};
+
+export default RegisterPage;
diff --git a/src/js/utils/datetime.js b/src/js/utils/datetime.js
index a6f09e6..b52be18 100644
--- a/src/js/utils/datetime.js
+++ b/src/js/utils/datetime.js
@@ -1,16 +1,16 @@
-const showFormattedDateTime = (date) => {
- const options = {
- weekday: 'long',
- day: 'numeric',
- month: 'long',
- year: 'numeric',
- hour: 'numeric',
- minute: 'numeric',
- second: 'numeric',
- timeZoneName: 'short',
- hour12: false,
- };
- return new Date(date).toLocaleDateString('id-ID', options);
-};
-
-export { showFormattedDateTime };
\ No newline at end of file
+const showFormattedDateTime = (timezone, date) => {
+ const options = {
+ weekday: 'long',
+ day: 'numeric',
+ month: 'long',
+ year: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ timeZoneName: 'short',
+ hour12: false,
+ };
+ return new Date(date).toLocaleDateString(timezone, options);
+};
+
+export { showFormattedDateTime };
diff --git a/src/js/utils/firebase.js b/src/js/utils/firebase.js
new file mode 100644
index 0000000..58a86e0
--- /dev/null
+++ b/src/js/utils/firebase.js
@@ -0,0 +1,21 @@
+// Import the functions you need from the SDKs you need
+import { initializeApp } from 'firebase/app';
+import { getAnalytics } from 'firebase/analytics';
+// TODO: Add SDKs for Firebase products that you want to use
+// https://firebase.google.com/docs/web/setup#available-libraries
+
+// Your web app's Firebase configuration
+// For Firebase JS SDK v7.20.0 and later, measurementId is optional
+const firebaseConfig = {
+ apiKey: 'AIzaSyDb4Dc0DdfUvK4RNebVW5ckLCSyTfr9Oc8',
+ authDomain: 'storyapp-409f8.firebaseapp.com',
+ projectId: 'storyapp-409f8',
+ storageBucket: 'storyapp-409f8.appspot.com',
+ messagingSenderId: '688766931446',
+ appId: '1:688766931446:web:cbc56bb250ab3f312277d7',
+ measurementId: 'G-DE1LJNEG1T',
+};
+
+// Initialize Firebase
+const app = initializeApp(firebaseConfig);
+const analytics = getAnalytics(app);
diff --git a/src/js/utils/utils.js b/src/js/utils/utils.js
new file mode 100644
index 0000000..6d4aa4f
--- /dev/null
+++ b/src/js/utils/utils.js
@@ -0,0 +1,22 @@
+const Utils = {
+ setUserToken(key, value) {
+ return sessionStorage.setItem(key, value);
+ },
+ getUserToken(key) {
+ return sessionStorage.getItem(key);
+ },
+ destroyUserToken(key) {
+ return sessionStorage.removeItem(key);
+ },
+ setName(key, value) {
+ return sessionStorage.setItem(key, value);
+ },
+ getName(key) {
+ return sessionStorage.getItem(key);
+ },
+ destroyName(key) {
+ return sessionStorage.removeItem(key);
+ },
+};
+
+export default Utils;
diff --git a/src/public/data/data.json b/src/public/data/data.json
index f8f3df9..c0cd180 100644
--- a/src/public/data/data.json
+++ b/src/public/data/data.json
@@ -1,70 +1,69 @@
-{
- "error": false,
- "message": "Stories fetched successfully",
- "listStory": [
- {
- "id": "story-FvU4u0Vp2S3PMsFg",
- "name": "Faisal Sulaiman",
- "description": "In rhoncus lorem nec ex egestas mollis vel a mauris. Pellentesque vel diam at neque hendrerit bibendum. Quisque egestas, dolor eu semper dapibus, turpis neque.",
- "photoUrl": "https://source.unsplash.com/1200x700/?nature",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-q9anz4avd83ni2r3",
- "name": "Alya Jamaluddin",
- "description": "In a pretium sem. Suspendisse eget sollicitudin enim, sed suscipit mi. Integer sagittis lorem urna, tincidunt viverra lectus gravida id. Praesent venenatis nibh ac nisi.",
- "photoUrl": "https://source.unsplash.com/1200x700/?mountain",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-vd83nqai2r39anz4",
- "name": "Vina Indah",
- "description": "Curabitur euismod risus venenatis felis iaculis tincidunt. Pellentesque velit risus, tempus et odio vel, venenatis volutpat erat. Vivamus sed gravida lacus, non feugiat nibh. Nam.",
- "photoUrl": "https://source.unsplash.com/1200x700/?hiking",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-0Vp2S3PMsFgFvU4u",
- "name": "Cinta Nur",
- "description": "Pellentesque dignissim fringilla ultricies. Pellentesque velit arcu, mattis sed lacinia sed, congue non nisi. Etiam fermentum id lectus eu fringilla. Nullam a risus nec mauris.",
- "photoUrl": "https://source.unsplash.com/1200x700/?tennis",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-0VPMsFgFp2S3vU4u",
- "name": "Eka Kasih",
- "description": "Vestibulum lacinia mauris vitae felis mattis accumsan. Fusce eleifend tincidunt malesuada. Morbi euismod tempor est, pulvinar varius purus tristique et. Integer mattis at massa eu.",
- "photoUrl": "https://source.unsplash.com/1200x700/?football",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-usFgFp20VPMS3vU4",
- "name": "Bulan Jamilah",
- "description": "Nam quis euismod quam. Donec massa purus, sodales vitae massa eu, malesuada egestas magna. Ut rhoncus mattis lorem. Morbi placerat augue id augue aliquet egestas.",
- "photoUrl": "https://source.unsplash.com/1200x700/?programming",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-gFp20VPMS3vU4usF",
- "name": "Nurul Tirta",
- "description": "Vivamus consectetur eu erat nec luctus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam ornare commodo ipsum non luctus.",
- "photoUrl": "https://source.unsplash.com/1200x700/?gaming",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-gFpsF20VPMS3vU4u",
- "name": "Wahyu Cahya",
- "description": "Ut et dolor vel magna mollis mattis. Ut et erat purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur.",
- "photoUrl": "https://source.unsplash.com/1200x700/?traveling",
- "createdAt": "2022-01-08T06:34:18.598Z"
- },
- {
- "id": "story-PFvU4u0Vp2S3MsFg",
- "name": "Burhanuddin Danial",
- "description": "Quisque ultricies feugiat tincidunt. Duis auctor condimentum felis, a imperdiet odio lobortis eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis.",
- "photoUrl": "https://source.unsplash.com/1200x700/?skydiving",
- "createdAt": "2022-01-08T06:34:18.598Z"
- }
- ]
- }
-
\ No newline at end of file
+{
+ "error": false,
+ "message": "Stories fetched successfully",
+ "listStory": [
+ {
+ "id": "story-FvU4u0Vp2S3PMsFg",
+ "name": "Faisal Sulaiman",
+ "description": "In rhoncus lorem nec ex egestas mollis vel a mauris. Pellentesque vel diam at neque hendrerit bibendum. Quisque egestas, dolor eu semper dapibus, turpis neque.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?nature",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-q9anz4avd83ni2r3",
+ "name": "Alya Jamaluddin",
+ "description": "In a pretium sem. Suspendisse eget sollicitudin enim, sed suscipit mi. Integer sagittis lorem urna, tincidunt viverra lectus gravida id. Praesent venenatis nibh ac nisi.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?mountain",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-vd83nqai2r39anz4",
+ "name": "Vina Indah",
+ "description": "Curabitur euismod risus venenatis felis iaculis tincidunt. Pellentesque velit risus, tempus et odio vel, venenatis volutpat erat. Vivamus sed gravida lacus, non feugiat nibh. Nam.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?hiking",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-0Vp2S3PMsFgFvU4u",
+ "name": "Cinta Nur",
+ "description": "Pellentesque dignissim fringilla ultricies. Pellentesque velit arcu, mattis sed lacinia sed, congue non nisi. Etiam fermentum id lectus eu fringilla. Nullam a risus nec mauris.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?tennis",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-0VPMsFgFp2S3vU4u",
+ "name": "Eka Kasih",
+ "description": "Vestibulum lacinia mauris vitae felis mattis accumsan. Fusce eleifend tincidunt malesuada. Morbi euismod tempor est, pulvinar varius purus tristique et. Integer mattis at massa eu.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?football",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-usFgFp20VPMS3vU4",
+ "name": "Bulan Jamilah",
+ "description": "Nam quis euismod quam. Donec massa purus, sodales vitae massa eu, malesuada egestas magna. Ut rhoncus mattis lorem. Morbi placerat augue id augue aliquet egestas.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?programming",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-gFp20VPMS3vU4usF",
+ "name": "Nurul Tirta",
+ "description": "Vivamus consectetur eu erat nec luctus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam ornare commodo ipsum non luctus.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?gaming",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-gFpsF20VPMS3vU4u",
+ "name": "Wahyu Cahya",
+ "description": "Ut et dolor vel magna mollis mattis. Ut et erat purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?traveling",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ },
+ {
+ "id": "story-PFvU4u0Vp2S3MsFg",
+ "name": "Burhanuddin Danial",
+ "description": "Quisque ultricies feugiat tincidunt. Duis auctor condimentum felis, a imperdiet odio lobortis eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis.",
+ "photoUrl": "https://source.unsplash.com/1200x700/?skydiving",
+ "createdAt": "2022-01-08T06:34:18.598Z"
+ }
+ ]
+}
diff --git a/src/sass/404.scss b/src/sass/404.scss
index 0ff5263..8bdb802 100644
--- a/src/sass/404.scss
+++ b/src/sass/404.scss
@@ -33,17 +33,14 @@
}
.return-button {
- color: var.$color-primary1-blue100;
- transition: 0.3s;
+ transition: 0.3s !important;
font-weight: 700;
- padding-top: 1.5rem;
+ padding-top: 0.5rem !important;
border-width: 5px;
padding-left: 3rem;
- border-radius: 45px;
padding-right: 3rem;
- padding-bottom: 1.5rem;
- background-color: var.$color-gray-white;
- border-color: var.$color-primary1-blue100;
+ padding-bottom: 0.5rem !important;
+ margin-top: 10px;
&:hover {
@include var.hover;
diff --git a/src/sass/add-page.scss b/src/sass/add-page.scss
index fd2d0a6..ca31494 100644
--- a/src/sass/add-page.scss
+++ b/src/sass/add-page.scss
@@ -16,7 +16,7 @@
}
.input-component-textinput {
- width: 500px;
+ width: 500px !important;
align-self: flex-start;
transition: 0.3s;
margin-bottom: 10px;
@@ -26,7 +26,7 @@
}
&:active {
- border-color: red;
+ border-color: rgba(97, 85, 141, 0.9);
border-width: 5px;
}
}
@@ -35,7 +35,9 @@
@include var.input;
}
-.input-component-root-class-name1, .input-component-root-class-name2, .input-component-root-class-name3 {
+.input-component-root-class-name1,
+.input-component-root-class-name2,
+.input-component-root-class-name3 {
margin-bottom: 20px;
}
@@ -51,7 +53,9 @@
@include var.input;
}
-.input-component-root-class-name7, .input-component-root-class-name8, .input-component-root-class-name9 {
+.input-component-root-class-name7,
+.input-component-root-class-name8,
+.input-component-root-class-name9 {
margin-bottom: 20px;
}
@@ -59,7 +63,13 @@
@include var.input;
}
-.input-component-root-class-name11, .input-component-root-class-name12, .input-component-root-class-name13, .input-component-root-class-name14, .input-component-root-class-name15, .input-component-root-class-name20, .input-component-root-class-name21 {
+.input-component-root-class-name11,
+.input-component-root-class-name12,
+.input-component-root-class-name13,
+.input-component-root-class-name14,
+.input-component-root-class-name15,
+.input-component-root-class-name20,
+.input-component-root-class-name21 {
margin-bottom: 20px;
}
@@ -94,17 +104,19 @@
width: 100%;
}
- .input-component-text, .input-component-textinput {
- width: 300px;
+ .input-component-text,
+ .input-component-textinput {
+ width: 300px !important;
align-self: center;
}
}
.form-input-container {
- @include var.fullflexwithcentercolumn;
- height: 400px;
- position: relative;
- justify-content: center;
+ @include var.columncenter;
+ display: flex !important;
+ margin: 20px 20px;
+ position: relative !important;
+ justify-content: center !important;
}
.form-input-text {
@@ -118,16 +130,14 @@
.form-input-hero-button1 {
color: var.$color-primary1-blue100;
- font-size: 18px;
- transition: 0.3s;
- font-weight: bold;
- padding-top: 1.5rem;
- border-color: var.$color-primary1-blue100;
- border-width: 5px;
- padding-left: 3rem;
- border-radius: 45px;
- padding-right: 3rem;
- padding-bottom: 1.5rem;
+ font-size: 18px !important;
+ transition: 0.3s !important;
+ font-weight: bold !important;
+ border-color: var.$color-primary1-blue100 !important;
+ border-width: 5px !important;
+ padding-left: 3rem !important;
+ border-radius: 45px !important;
+ padding-right: 3rem !important;
&:hover {
@include var.hover;
@@ -164,7 +174,7 @@
.add-page-logo {
font-size: 2em;
- font-family: "Lato";
+ font-family: 'Lato';
font-weight: bold;
text-transform: uppercase;
}
@@ -204,12 +214,6 @@
display: none;
}
-.add-page-icon {
- width: var.$size-xsmall;
- cursor: pointer;
- height: var.$size-xsmall;
-}
-
.add-page-mobile-menu {
top: 0px;
left: 0px;
@@ -247,13 +251,6 @@
justify-content: center;
}
-.add-page-icon02 {
- fill: var.$color-gray-900;
- width: var.$size-xsmall;
- cursor: pointer;
- height: var.$size-xsmall;
-}
-
.add-page-links1 {
flex: 0 0 auto;
display: flex;
@@ -262,7 +259,11 @@
flex-direction: column;
}
-.add-page-nav11, .add-page-nav21, .add-page-nav3, .add-page-nav4, .add-page-nav5 {
+.add-page-nav11,
+.add-page-nav21,
+.add-page-nav3,
+.add-page-nav4,
+.add-page-nav5 {
color: var.$color-gray-black;
margin-bottom: var.$space-unit;
}
@@ -300,7 +301,8 @@
}
}
-.add-page-icon04, .add-page-icon06 {
+.add-page-icon04,
+.add-page-icon06 {
width: var.$size-xsmall;
height: var.$size-xsmall;
margin-right: var.$space-twounits;
@@ -435,7 +437,10 @@
margin-bottom: var.$space-unit;
}
- .add-page-nav21, .add-page-nav3, .add-page-nav4, .add-page-nav5 {
+ .add-page-nav21,
+ .add-page-nav3,
+ .add-page-nav4,
+ .add-page-nav5 {
margin-left: 0;
margin-bottom: var.$space-unit;
}
@@ -478,10 +483,6 @@
font-size: 1.5em;
}
- .add-page-icon02 {
- fill: var.$color-gray-900;
- }
-
.add-page-footer1 {
padding: var.$space-unit;
}
diff --git a/src/sass/index.scss b/src/sass/index.scss
index 197f76f..b39747b 100644
--- a/src/sass/index.scss
+++ b/src/sass/index.scss
@@ -8,6 +8,10 @@
align-items: center;
flex-direction: column;
justify-content: center;
+
+ &:hover {
+ @include var.hover;
+ }
}
.gallery-card3-image {
@@ -28,7 +32,6 @@
flex-direction: column;
padding: 1px;
gap: 0.5rem;
- background-color: antiquewhite;
}
.home-container {
@@ -61,7 +64,7 @@
.home-logo {
font-size: 2em;
- font-family: "Lato";
+ font-family: 'Lato';
font-weight: bold;
text-transform: uppercase;
}
@@ -101,12 +104,6 @@
display: none;
}
-.home-icon {
- width: var.$size-xsmall;
- cursor: pointer;
- height: var.$size-xsmall;
-}
-
.home-mobile-menu {
top: 0px;
left: 0px;
@@ -115,7 +112,7 @@
padding: 32px;
z-index: 100;
position: absolute;
- border-radius: 50px;
+ border-radius: 35px;
flex-direction: column;
justify-content: space-between;
background-color: var.$color-gray-white;
@@ -129,7 +126,7 @@
.home-top {
@include var.centerfullflex;
- margin-bottom: var.$space-threeunits;
+ margin-bottom: 8px;
justify-content: space-between;
}
@@ -144,13 +141,6 @@
justify-content: center;
}
-.home-icon02 {
- fill: var.$color-gray-900;
- width: var.$size-xsmall;
- cursor: pointer;
- height: var.$size-xsmall;
-}
-
.home-links1 {
flex: 0 0 auto;
display: flex;
@@ -159,7 +149,11 @@
flex-direction: column;
}
-.home-nav11, .home-nav21, .home-nav3, .home-nav4, .home-nav5 {
+.home-nav11,
+.home-nav21,
+.home-nav3,
+.home-nav4,
+.home-nav5 {
color: var.$color-gray-black;
margin-bottom: var.$space-unit;
}
@@ -197,7 +191,8 @@
}
}
-.home-icon04, .home-icon06 {
+.home-icon04,
+.home-icon06 {
width: var.$size-xsmall;
height: var.$size-xsmall;
margin-right: var.$space-twounits;
@@ -231,37 +226,6 @@
justify-content: flex-start;
}
-.home-banner-heading {
- color: var.$color-gray-white;
- text-align: center;
- font-family: "Raleway";
- line-height: 1.6;
-}
-
-.home-banner-sub-heading {
- color: var.$color-gray-white;
- max-width: var.$size-maxwidth;
- text-align: center;
- line-height: 1.6;
-}
-
-.home-banner-button {
- color: var.$color-gray-white;
- transition: 0.3s;
- font-weight: 700;
- padding-top: 1.5rem;
- border-width: 0px;
- padding-left: 3rem;
- border-radius: 45px;
- padding-right: 3rem;
- padding-bottom: 1.5rem;
- background-color: var.$color-primary1-blue100;
-
- &:hover {
- @include var.hover;
- }
-}
-
.home-gallery {
flex: 0 0 auto;
width: 100%;
@@ -283,7 +247,7 @@
.home-gallery-heading {
text-align: center;
- font-family: "Raleway";
+ font-family: 'Raleway';
line-height: 1.6;
}
@@ -394,23 +358,19 @@
}
.home-icon10 {
- fill: var.$color-secondary-gray500;
+ color: var.$color-secondary-gray500;
width: 24px;
height: 24px;
margin-right: var.$space-twounits;
}
.home-icon12 {
- fill: var.$color-secondary-gray500;
+ color: var.$color-secondary-gray500;
width: 24px;
height: 24px;
}
@media (max-width: 991px) {
- .home-banner-sub-heading {
- max-width: 100%;
- }
-
.home-gallery-sub-heading {
text-align: center;
}
@@ -444,7 +404,10 @@
margin-bottom: var.$space-unit;
}
- .home-nav21, .home-nav3, .home-nav4, .home-nav5 {
+ .home-nav21,
+ .home-nav3,
+ .home-nav4,
+ .home-nav5 {
margin-left: 0;
margin-bottom: var.$space-unit;
}
@@ -453,11 +416,6 @@
@include var.paddingleftandright;
}
- .home-banner-sub-heading {
- padding-left: var.$space-unit;
- padding-right: var.$space-unit;
- }
-
.home-gallery1 {
@include var.paddingleftandright;
}
@@ -505,10 +463,6 @@
padding: 16px;
}
- .home-icon02 {
- fill: var.$color-gray-900;
- }
-
.home-banner1 {
padding-top: var.$space-twounits;
padding-left: var.$space-unit;
@@ -537,4 +491,8 @@
text-align: center;
margin-bottom: var.$space-oneandhalfunits;
}
+
+ .home-nav1 {
+ flex-direction: column;
+ }
}
diff --git a/src/sass/style.scss b/src/sass/style.scss
index 7d058ce..8d820d9 100644
--- a/src/sass/style.scss
+++ b/src/sass/style.scss
@@ -1,7 +1,10 @@
+@use 'vendors';
+@use 'vendors-extensions/bootstrap/components/buttons';
+
$color-gray-800: #595959;
-$color-gray-900: #D9D9D9;
+$color-gray-900: #d9d9d9;
$color-gray-black: #000000;
-$color-gray-white: #FFFFFF;
+$color-gray-white: #ffffff;
$size-xsmall: 16px;
$space-unit: 16px;
$size-maxwidth: 1400px;
@@ -30,25 +33,51 @@ $space-oneandhalfunits: 24px;
}
@mixin baseui {
- html{ line-height: 1.15; }
- body{ margin: 0; }
- *{
+ html {
+ line-height: 1.15;
+ }
+ body {
+ margin: 0;
+ }
+ * {
box-sizing: border-box;
border-width: 0;
border-style: solid;
}
- p,li,ul,pre,div,h1,h2,h3,h4,h5,h6,figure,blockquote,figcaption{
+ p,
+ li,
+ ul,
+ pre,
+ div,
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6,
+ figure,
+ blockquote,
+ figcaption {
margin: 0;
padding: 0;
}
- button{ background-color: transparent; }
- button,input,optgroup,select,textarea{
+ button {
+ background-color: transparent;
+ }
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
font-family: inherit;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
- button,select{ text-transform: none; }
+ button,
+ select {
+ text-transform: none;
+ }
}
@mixin input {
@@ -57,14 +86,14 @@ $space-oneandhalfunits: 24px;
}
@mixin columncenter {
- align-items: center;
- flex-direction: column;
+ align-items: center !important;
+ flex-direction: column !important;
}
@mixin hover {
- border-color: rgba(41, 20, 119, 0.9);
- background-color: rgba(41, 20, 119, 0.9);
- color: $color-gray-white;
+ border-color: rgba(97, 85, 141, 0.9) !important;
+ background-color: rgba(97, 85, 141, 0.9) !important;
+ color: $color-gray-white !important;
}
@mixin content {
@@ -75,8 +104,8 @@ $space-oneandhalfunits: 24px;
}
@mixin fullflex {
- width: 100%;
- display: flex;
+ width: 100% !important;
+ display: flex !important;
}
@mixin paddingleftandright {
@@ -110,6 +139,14 @@ $space-oneandhalfunits: 24px;
justify-content: space-between;
}
+// Tambahkan kelas alertscss dimana alertscss diletakkan di kanan atas dan jangan terlalu rapat
+.alertscss {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 1rem;
+}
+
.button {
@include paddingwithcolorgrayblack;
@include whitewithcolorborderwhite;
@@ -183,6 +220,10 @@ $space-oneandhalfunits: 24px;
font-weight: 700;
}
+.hidden {
+ display: none;
+}
+
@media (max-width: 767px) {
.heading2 {
font-size: 1.8rem;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_alert.scss b/src/sass/vendors-extensions/bootstrap/components/_alert.scss
new file mode 100644
index 0000000..53f6c2a
--- /dev/null
+++ b/src/sass/vendors-extensions/bootstrap/components/_alert.scss
@@ -0,0 +1,6 @@
+$padding-x: 1rem !default;
+$padding-y: 0.75rem !default;
+$margin-bottom: 1rem !default;
+$border-radius: 0.25rem !default;
+$link-font-weight: 700 !default;
+$border-width: 5px !default;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_buttons.scss b/src/sass/vendors-extensions/bootstrap/components/_buttons.scss
index 5d47873..b4301c0 100644
--- a/src/sass/vendors-extensions/bootstrap/components/_buttons.scss
+++ b/src/sass/vendors-extensions/bootstrap/components/_buttons.scss
@@ -1,2 +1,3 @@
-$padding-x: 0.5rem;
-$padding-y: 0.5rem;
\ No newline at end of file
+$padding-x: 1.5rem;
+$padding-y: 1.5rem;
+$transition: 0.3s;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_cards.scss b/src/sass/vendors-extensions/bootstrap/components/_cards.scss
index 819d5ae..42d57e4 100644
--- a/src/sass/vendors-extensions/bootstrap/components/_cards.scss
+++ b/src/sass/vendors-extensions/bootstrap/components/_cards.scss
@@ -1,2 +1,2 @@
-$inner-border-radius: 12px;
-$border-radius: 12px;
\ No newline at end of file
+$inner-border-radius: 12px;
+$border-radius: 12px;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_close.scss b/src/sass/vendors-extensions/bootstrap/components/_close.scss
index 49f013f..1307eec 100644
--- a/src/sass/vendors-extensions/bootstrap/components/_close.scss
+++ b/src/sass/vendors-extensions/bootstrap/components/_close.scss
@@ -1,2 +1,2 @@
-$opacity: 1;
-$hover-opacity: 0.3;
\ No newline at end of file
+$opacity: 1;
+$hover-opacity: 0.3;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_dropdown.scss b/src/sass/vendors-extensions/bootstrap/components/_dropdown.scss
new file mode 100644
index 0000000..73625a5
--- /dev/null
+++ b/src/sass/vendors-extensions/bootstrap/components/_dropdown.scss
@@ -0,0 +1,2 @@
+$border-color: black;
+$border-radius: 3px;
diff --git a/src/sass/vendors-extensions/bootstrap/components/_forms.scss b/src/sass/vendors-extensions/bootstrap/components/_forms.scss
new file mode 100644
index 0000000..00023ae
--- /dev/null
+++ b/src/sass/vendors-extensions/bootstrap/components/_forms.scss
@@ -0,0 +1,2 @@
+$padding-y: 0.5rem;
+$padding-x: 0.5rem;
diff --git a/src/sass/vendors/_bootstrap-icons.scss b/src/sass/vendors/_bootstrap-icons.scss
index fe2905c..e49ccec 100644
--- a/src/sass/vendors/_bootstrap-icons.scss
+++ b/src/sass/vendors/_bootstrap-icons.scss
@@ -1 +1 @@
-@import 'bootstrap-icons/font/bootstrap-icons.css';
\ No newline at end of file
+@import 'bootstrap-icons/font/bootstrap-icons.css';
diff --git a/src/sass/vendors/_bootstrap.scss b/src/sass/vendors/_bootstrap.scss
index 9a4fc71..96986ae 100644
--- a/src/sass/vendors/_bootstrap.scss
+++ b/src/sass/vendors/_bootstrap.scss
@@ -1,56 +1,92 @@
-// ==================================================
-// Bootstrap
-// ==================================================
-
-//
-// Functions Bootstrap
-//
-@import '~bootstrap/scss/functions';
-
-//
-// Variables Bootstrap
-//
-@import '~bootstrap/scss/variables';
-
-// Menerapkan/override variables Bootstrap apa pun di sini
-
-//
-// Konfigurasi Bootstrap
-//
-@import '~bootstrap/scss/maps';
-@import '~bootstrap/scss/mixins';
-@import '~bootstrap/scss/root';
-@import '~bootstrap/scss/utilities';
-@import '~bootstrap/scss/reboot';
-
-//
-// Layouts dan components
-//
-@import '~bootstrap/scss/type';
-@import '~bootstrap/scss/images';
-@import '~bootstrap/scss/containers';
-@import '~bootstrap/scss/grid';
-
-@import '~bootstrap/scss/helpers';
-
-// Komponen-Komponen
-@import '~bootstrap/scss/tables';
-@import '~bootstrap/scss/forms';
-@import '~bootstrap/scss/buttons';
-@import '~bootstrap/scss/transitions';
-@import '~bootstrap/scss/transitions';
-@import '~bootstrap/scss/dropdown';
-@import '~bootstrap/scss/nav';
-@import '~bootstrap/scss/navbar'; // Requires nav
-@import '~bootstrap/scss/card';
-@import '~bootstrap/scss/close';
-@import '~bootstrap/scss/modal'; // Requires transitions
-
-//
-// Utilities API untuk menghasilkan utility classes
-//
-@import '~bootstrap/scss/utilities/api';
-
-//
-// Tambahkan custom code di sini
-//
\ No newline at end of file
+// ==================================================
+// Bootstrap
+// ==================================================
+
+// Using built-in modules
+@use 'sass:map';
+
+// Custom modules
+@use '../vendors-extensions/bootstrap/components/buttons' as btn;
+@use '../vendors-extensions/bootstrap/components/cards' as card;
+@use '../vendors-extensions/bootstrap/components/close' as btn-close;
+@use '../vendors-extensions/bootstrap/components/forms' as input-btn;
+@use '../vendors-extensions/bootstrap/components/dropdown' as dropdown;
+@use '../vendors-extensions/bootstrap/components/alert' as alert;
+
+//
+// Functions Bootstrap
+//
+@import '~bootstrap/scss/functions';
+
+//
+// Variables Bootstrap
+//
+@import '~bootstrap/scss/variables';
+@import '~bootstrap/scss/variables-dark';
+
+// Menerapkan/override variables Bootstrap apa pun di sini
+
+// Buttons
+$btn-padding-x: btn.$padding-x;
+$btn-padding-y: btn.$padding-y;
+$btn-transition: btn.$transition;
+
+// Cards
+$card-border-radius: card.$border-radius;
+$card-inner-border-radius: card.$inner-border-radius;
+
+// Close
+$btn-close-opacity: btn-close.$opacity;
+$btn-close-hover-opacity: btn-close.$hover-opacity;
+
+// Forms
+$input-btn-padding-y: input-btn.$padding-y;
+$input-btn-padding-x: input-btn.$padding-x;
+
+// Dropdown
+$dropdown-border-color: dropdown.$border-color;
+$dropdown-border-width: dropdown.$border-radius;
+
+//Alert
+$alert-padding-y: alert.$padding-y;
+$alert-padding-x: alert.$padding-x;
+$alert-margin-bottom: alert.$margin-bottom;
+$alert-border-radius: alert.$border-radius;
+$alert-link-font-weight: alert.$link-font-weight;
+$alert-border-width: alert.$border-width;
+
+//
+// Konfigurasi Bootstrap
+//
+@import '~bootstrap/scss/maps';
+@import '~bootstrap/scss/mixins';
+@import '~bootstrap/scss/root';
+@import '~bootstrap/scss/utilities';
+@import '~bootstrap/scss/reboot';
+
+//
+// Layouts dan components
+//
+@import '~bootstrap/scss/type';
+@import '~bootstrap/scss/images';
+@import '~bootstrap/scss/containers';
+@import '~bootstrap/scss/grid';
+
+@import '~bootstrap/scss/helpers';
+
+// Komponen-Komponen
+@import '~bootstrap/scss/forms';
+@import '~bootstrap/scss/buttons';
+@import '~bootstrap/scss/dropdown';
+@import '~bootstrap/scss/card';
+@import '~bootstrap/scss/close';
+@import '~bootstrap/scss/alert';
+
+//
+// Utilities API untuk menghasilkan utility classes
+//
+@import '~bootstrap/scss/utilities/api';
+
+//
+// Tambahkan custom code di sini
+//
diff --git a/src/sass/vendors/_index.scss b/src/sass/vendors/_index.scss
index 89badc3..10992cd 100644
--- a/src/sass/vendors/_index.scss
+++ b/src/sass/vendors/_index.scss
@@ -1,2 +1,2 @@
-@forward 'bootstrap';
-@forward 'bootstrap-icons';
\ No newline at end of file
+@forward 'bootstrap';
+@forward 'bootstrap-icons';
diff --git a/src/views/404.html b/src/views/404.html
index 8d1c476..78b4153 100644
--- a/src/views/404.html
+++ b/src/views/404.html
@@ -1,4 +1,4 @@
-
+
404 - Not Found
@@ -9,6 +9,7 @@
+
+
+
diff --git a/src/views/dashboard.html b/src/views/dashboard.html
new file mode 100644
index 0000000..85435ce
--- /dev/null
+++ b/src/views/dashboard.html
@@ -0,0 +1,55 @@
+
+
+
+ StoryApp
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/index.html b/src/views/index.html
index 72887ab..107d822 100644
--- a/src/views/index.html
+++ b/src/views/index.html
@@ -1,8 +1,8 @@
-
+
- Edible Practical Eel
-
+ StoryApp
+
@@ -10,6 +10,7 @@