From 343a2f4d6b2c747afacd6e5844f512b7333758ea Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 22 Oct 2024 14:42:09 +0200 Subject: [PATCH 01/23] Create the Authentication page Setup bootstrap and SASS and creating the Authentaction page. --- feed/index.html | 0 index.html | 120 ++++++++++ package-lock.json | 520 +++++++++++++++++++++++++++++++++++++++++ package.json | 13 +- profile/index.html | 0 src/scss/index.css | 108 +++++++++ src/scss/index.css.map | 1 + src/scss/index.scss | 134 +++++++++++ 8 files changed, 894 insertions(+), 2 deletions(-) create mode 100644 feed/index.html create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 profile/index.html create mode 100644 src/scss/index.css create mode 100644 src/scss/index.css.map diff --git a/feed/index.html b/feed/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/index.html b/index.html new file mode 100644 index 000000000..f020c02f3 --- /dev/null +++ b/index.html @@ -0,0 +1,120 @@ + + + + + + ChatterHub - Login or Register + + + + + + + + +
+
+
+ +
+ ChatterHub Logo +
Welcome to ChatterHub
+
+ +

Connect with your friends and the world around you.

+ +
+
+

Login or Register

+ +
+ +
+ + +
+ Please enter a username. +
+
+ +
+ + +
+ Password must be at least 8 characters long. +
+
+ +
+ + +
+
+
+
+ + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..09124432e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,520 @@ +{ + "name": "css-frameworks-ca", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "css-frameworks-ca", + "version": "0.0.1", + "license": "ISC", + "dependencies": { + "bootstrap": "^5.2.3" + }, + "devDependencies": { + "sass": "^1.80.3" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.6" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass": { + "version": "1.80.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.3.tgz", + "integrity": "sha512-ptDWyVmDMVielpz/oWy3YP3nfs7LpJTHIJZboMVs8GEC9eUmtZTZhMHlTW98wY4aEorDfjN38+Wr/XjskFWcfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + } + } +} diff --git a/package.json b/package.json index 4086f0f7b..fc4078913 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,10 @@ "version": "0.0.1", "description": "A starting point for the CSS Frameworks CA project", "scripts": { - "test": "echo \"We will learn more about testing in the Workflow course\" && exit 1" + "test": "echo \"We will learn more about testing in the Workflow course\" && exit 1", + "build": "sass src/scss:dist/css --style=expanded", + "sass": "sass src/index.scss dist/css/index.css --watch", + "start": "live-server" }, "repository": { "type": "git", @@ -22,5 +25,11 @@ "bugs": { "url": "https://github.com/NoroffFEU/css-frameworks-ca/issues" }, - "homepage": "https://github.com/NoroffFEU/css-frameworks-ca#readme" + "homepage": "https://github.com/NoroffFEU/css-frameworks-ca#readme", + "dependencies": { + "bootstrap": "^5.2.3" + }, + "devDependencies": { + "sass": "^1.80.3" + } } diff --git a/profile/index.html b/profile/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/scss/index.css b/src/scss/index.css new file mode 100644 index 000000000..cb6392e87 --- /dev/null +++ b/src/scss/index.css @@ -0,0 +1,108 @@ +@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap"); +body { + background-color: #FFFFFF; + font-family: "Montserrat", sans-serif; + color: #333333; + margin: 0; + padding: 0; +} + +.navbar { + background-color: #F7F7F7; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +.auth-header { + font-size: 2.5rem; + font-weight: bold; + text-align: center; + color: #333333; + margin-bottom: 20px; +} + +.navbar { + background-color: #FFFFFF; + border-bottom: 2px solid #D94E48; + transition: background-color 0.3s ease; +} +.navbar.shadow-sm { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} +.navbar .navbar-brand { + font-size: 1.5rem; +} +.navbar .nav-link { + color: #333333; + font-weight: 500; + margin-left: 15px; + transition: color 0.3s; +} +.navbar .nav-link:hover { + color: #c52f29; +} +.navbar .dropdown-item { + color: #333333; +} +.navbar .dropdown-item:hover { + background-color: #D94E48; + color: white; +} + +.tagline { + text-align: center; + color: #A59BB0; + margin-bottom: 30px; +} + +.auth-container { + margin-top: 50px; +} + +.card { + border-radius: 8px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); +} + +.form-label { + font-weight: bold; +} + +input[type=text], +input[type=password] { + border-radius: 4px; +} + +.btn { + transition: background-color 0.3s ease; +} + +.btn-primary { + background-color: #D94E48; + border: none; +} + +.btn-primary:hover { + background-color: #c52f29; +} + +.btn-outline-secondary { + color: #A59BB0; + border: 2px solid #A59BB0; +} +.btn-outline-secondary:hover { + background-color: #A59BB0; + color: white; +} + +.footer-links { + text-align: center; + margin-top: 20px; +} +.footer-links a { + color: #A59BB0; + text-decoration: none; + margin: 0 10px; +} +.footer-links a:hover { + text-decoration: underline; +}/*# sourceMappingURL=index.css.map */ \ No newline at end of file diff --git a/src/scss/index.css.map b/src/scss/index.css.map new file mode 100644 index 000000000..60a8cfeb8 --- /dev/null +++ b/src/scss/index.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.scss","index.css"],"names":[],"mappings":"AACQ,4FAAA;AAWR;EACI,yBAPe;EAQf,qCALU;EAMV,cAPS;EAQT,SAAA;EACA,UAAA;ACVJ;;ADcA;EACI,yBAfc;EAgBd,wCAAA;ACXJ;;ADeA;EACI,iBAAA;EACA,iBAAA;EACA,kBAAA;EACA,cAvBS;EAwBT,mBAAA;ACZJ;;ADcA;EACI,yBA7Be;EA8Bf,gCAAA;EACA,sCAAA;ACXJ;ADaI;EACI,wCAAA;ACXR;ADcI;EACI,iBAAA;ACZR;ADeI;EACI,cAxCK;EAyCL,gBAAA;EACA,iBAAA;EACA,sBAAA;ACbR;ADeQ;EACI,cAAA;ACbZ;ADiBI;EACI,cAnDK;ACoCb;ADiBQ;EACI,yBA1DI;EA2DJ,YAAA;ACfZ;;ADqBA;EACI,kBAAA;EACA,cAlEc;EAmEd,mBAAA;AClBJ;;ADsBA;EACI,gBAAA;ACnBJ;;ADuBA;EACI,kBAAA;EACA,yCAAA;ACpBJ;;ADwBA;EACI,iBAAA;ACrBJ;;ADwBA;;EAEI,kBAAA;ACrBJ;;ADyBA;EACI,sCAAA;ACtBJ;;ADyBA;EACI,yBAlGY;EAmGZ,YAAA;ACtBJ;;ADyBA;EACI,yBAAA;ACtBJ;;ADyBA;EACI,cA1Gc;EA2Gd,yBAAA;ACtBJ;ADwBI;EACI,yBA9GU;EA+GV,YAAA;ACtBR;;AD2BA;EACI,kBAAA;EACA,gBAAA;ACxBJ;AD0BI;EACI,cAzHU;EA0HV,qBAAA;EACA,cAAA;ACxBR;AD0BQ;EACI,0BAAA;ACxBZ","file":"index.css"} \ No newline at end of file diff --git a/src/scss/index.scss b/src/scss/index.scss index 8b1378917..3e1456a1c 100644 --- a/src/scss/index.scss +++ b/src/scss/index.scss @@ -1 +1,135 @@ +// Font Import +@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap'); +// Variables for colors and fonts +$primary-color: #D94E48; // Coral Red +$secondary-color: #A59BB0; // Lavender Gray +$background-color: #FFFFFF; // White +$card-background: #F7F7F7; // Light Gray +$text-color: #333333; // Dark Gray +$font-family: 'Montserrat', sans-serif; // Modern font family + +// Global styles +body { + background-color: $background-color; // Body background + font-family: $font-family; // Font family for body + color: $text-color; // Text color + margin: 0; // Remove default margin + padding: 0; // Remove default padding +} + +// Navbar styles +.navbar { + background-color: $card-background; // Navbar background + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); // Subtle shadow +} + +// Header styles +.auth-header { + font-size: 2.5rem; // Increase font size for the header + font-weight: bold; // Make the font bold + text-align: center; // Center text + color: $text-color; // Use the text color defined in your variables + margin-bottom: 20px; // Space below the header +} +.navbar { + background-color: $background-color; // Use your background color + border-bottom: 2px solid $primary-color; // Bottom border for distinction + transition: background-color 0.3s ease; // Smooth transition on scroll + + &.shadow-sm { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); // Subtle shadow + } + + .navbar-brand { + font-size: 1.5rem; // Increase the brand font size + } + + .nav-link { + color: $text-color; // Text color for links + font-weight: 500; // Slightly bolder font for better visibility + margin-left: 15px; // Space between links + transition: color 0.3s; // Smooth transition on hover + + &:hover { + color: darken($primary-color, 10%); // Darken color on hover + } + } + + .dropdown-item { + color: $text-color; // Text color for dropdown items + + &:hover { + background-color: $primary-color; // Change background on hover + color: white; // Change text color on hover + } + } +} + +// Tagline styles +.tagline { + text-align: center; // Center text + color: $secondary-color; // Tagline text color + margin-bottom: 30px; // Margin below tagline +} + +// Authentication container styles +.auth-container { + margin-top: 50px; // Space above the auth container +} + +// Card styles +.card { + border-radius: 8px; // Rounded corners + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); // Card shadow +} + +// Form styles +.form-label { + font-weight: bold; // Bold labels +} + +input[type="text"], +input[type="password"] { + border-radius: 4px; // Rounded corners for inputs +} + +// Button styles +.btn { + transition: background-color 0.3s ease; // Smooth transition for buttons +} + +.btn-primary { + background-color: $primary-color; // Primary button color + border: none; // No border +} + +.btn-primary:hover { + background-color: darken($primary-color, 10%); // Darken on hover +} + +.btn-outline-secondary { + color: $secondary-color; // Outline button color + border: 2px solid $secondary-color; // Outline border + + &:hover { + background-color: $secondary-color; // Change background on hover + color: white; // Change text color on hover + } +} + +// Footer links styles +.footer-links { + text-align: center; // Center footer links + margin-top: 20px; // Space above footer links + + a { + color: $secondary-color; // Link color + text-decoration: none; // No underline + margin: 0 10px; // Space between links + + &:hover { + text-decoration: underline; // Underline on hover + } + } +} \ No newline at end of file From 266d79f456faed1098e09b8396b4931550cdf160 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 22 Oct 2024 15:59:11 +0200 Subject: [PATCH 02/23] Added a Profile and Feed page Added a profile and feed page --- feed/index.html | 150 +++++++++++++++++++++++++++++++++++++++++++++ profile/index.html | 126 +++++++++++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+) diff --git a/feed/index.html b/feed/index.html index e69de29bb..40d68da74 100644 --- a/feed/index.html +++ b/feed/index.html @@ -0,0 +1,150 @@ + + + + + + ChatterHub - Profile + + + + + + + + +
+
+
+ +
+ Profile Picture +
Feed
+
+ +
+ +
+ +
+ +
+ +
+
+

Create a New Post

+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+ + +

Posts

+
+
+
+ Post Thumbnail +
+
Post Title 1
+

Brief description of the post...

+ Read More +
+
+
+
+
+ Post Thumbnail +
+
Post Title 2
+

Brief description of the post...

+ Read More +
+
+
+
+
+ Post Thumbnail +
+
Post Title 3
+

Brief description of the post...

+ Read More +
+
+
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/profile/index.html b/profile/index.html index e69de29bb..9c14b6a96 100644 --- a/profile/index.html +++ b/profile/index.html @@ -0,0 +1,126 @@ + + + + + + ChatterHub - Profile + + + + + + + + +
+
+
+ +
+ Profile Picture +
Your Profile
+
+ +
+
+

Profile Details

+
+ +
+ + +
+ Profile Image +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ Password must be at least 8 characters long. +
+
+ +
+ +
+
+
+
+ + +
+
+
+ + + + + + + + \ No newline at end of file From 8547088de7dfd3192754af88e9e4a84fbb7267ba Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 12 Nov 2024 10:35:46 +0100 Subject: [PATCH 03/23] Small updates Fine tuning --- feed/index.html | 11 +++-- index.html | 43 +++++++++--------- profile/index.html | 7 ++- src/scss/index.scss | 106 ++++++++++++++++++++++---------------------- 4 files changed, 82 insertions(+), 85 deletions(-) diff --git a/feed/index.html b/feed/index.html index 40d68da74..088468b2e 100644 --- a/feed/index.html +++ b/feed/index.html @@ -37,10 +37,9 @@ Settings @@ -103,7 +102,7 @@

Posts

- Post Thumbnail + Post Thumbnail
Post Title 1

Brief description of the post...

@@ -113,7 +112,7 @@
Post Title 1
- Post Thumbnail + Post Thumbnail
Post Title 2

Brief description of the post...

@@ -123,7 +122,7 @@
Post Title 2
- Post Thumbnail + Post Thumbnail
Post Title 3

Brief description of the post...

diff --git a/index.html b/index.html index f020c02f3..337a4e575 100644 --- a/index.html +++ b/index.html @@ -24,29 +24,28 @@ - - -
diff --git a/profile/index.html b/profile/index.html index 9c14b6a96..7ae96378a 100644 --- a/profile/index.html +++ b/profile/index.html @@ -37,10 +37,9 @@ Settings @@ -66,7 +65,7 @@

Profile Details

- Profile Image + Profile Image
diff --git a/src/scss/index.scss b/src/scss/index.scss index 3e1456a1c..73de1d4ce 100644 --- a/src/scss/index.scss +++ b/src/scss/index.scss @@ -2,134 +2,134 @@ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap'); // Variables for colors and fonts -$primary-color: #D94E48; // Coral Red -$secondary-color: #A59BB0; // Lavender Gray -$background-color: #FFFFFF; // White -$card-background: #F7F7F7; // Light Gray -$text-color: #333333; // Dark Gray -$font-family: 'Montserrat', sans-serif; // Modern font family +$primary-color: #D94E48; +$secondary-color: #A59BB0; +$background-color: #FFFFFF; +$card-background: #F7F7F7; +$text-color: #333333; +$font-family: 'Montserrat', sans-serif; // Global styles body { - background-color: $background-color; // Body background - font-family: $font-family; // Font family for body - color: $text-color; // Text color - margin: 0; // Remove default margin - padding: 0; // Remove default padding + background-color: $background-color; + font-family: $font-family; + color: $text-color; + margin: 0; + padding: 0; } // Navbar styles .navbar { - background-color: $card-background; // Navbar background - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); // Subtle shadow + background-color: $card-background; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } // Header styles .auth-header { - font-size: 2.5rem; // Increase font size for the header - font-weight: bold; // Make the font bold - text-align: center; // Center text - color: $text-color; // Use the text color defined in your variables - margin-bottom: 20px; // Space below the header + font-size: 2.5rem; + font-weight: bold; + text-align: center; + color: $text-color; + margin-bottom: 20px; } .navbar { - background-color: $background-color; // Use your background color - border-bottom: 2px solid $primary-color; // Bottom border for distinction - transition: background-color 0.3s ease; // Smooth transition on scroll + background-color: $background-color; + border-bottom: 2px solid $primary-color; + transition: background-color 0.3s ease; &.shadow-sm { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); // Subtle shadow + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .navbar-brand { - font-size: 1.5rem; // Increase the brand font size + font-size: 1.5rem; } .nav-link { - color: $text-color; // Text color for links - font-weight: 500; // Slightly bolder font for better visibility - margin-left: 15px; // Space between links - transition: color 0.3s; // Smooth transition on hover + color: $text-color; + font-weight: 500; + margin-left: 15px; + transition: color 0.3s; &:hover { - color: darken($primary-color, 10%); // Darken color on hover + color: darken($primary-color, 10%); } } .dropdown-item { - color: $text-color; // Text color for dropdown items + color: $text-color; &:hover { - background-color: $primary-color; // Change background on hover - color: white; // Change text color on hover + background-color: $primary-color; + color: white; } } } // Tagline styles .tagline { - text-align: center; // Center text - color: $secondary-color; // Tagline text color - margin-bottom: 30px; // Margin below tagline + text-align: center; + color: $secondary-color; + margin-bottom: 30px; } // Authentication container styles .auth-container { - margin-top: 50px; // Space above the auth container + margin-top: 50px; } // Card styles .card { - border-radius: 8px; // Rounded corners - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); // Card shadow + border-radius: 8px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } // Form styles .form-label { - font-weight: bold; // Bold labels + font-weight: bold; } input[type="text"], input[type="password"] { - border-radius: 4px; // Rounded corners for inputs + border-radius: 4px; } // Button styles .btn { - transition: background-color 0.3s ease; // Smooth transition for buttons + transition: background-color 0.3s ease; } .btn-primary { - background-color: $primary-color; // Primary button color - border: none; // No border + background-color: $primary-color; + border: none; } .btn-primary:hover { - background-color: darken($primary-color, 10%); // Darken on hover + background-color: darken($primary-color, 10%); } .btn-outline-secondary { - color: $secondary-color; // Outline button color - border: 2px solid $secondary-color; // Outline border + color: $secondary-color; + border: 2px solid $secondary-color; &:hover { - background-color: $secondary-color; // Change background on hover - color: white; // Change text color on hover + background-color: $secondary-color; + color: white; } } // Footer links styles .footer-links { - text-align: center; // Center footer links - margin-top: 20px; // Space above footer links + text-align: center; + margin-top: 20px; a { - color: $secondary-color; // Link color - text-decoration: none; // No underline - margin: 0 10px; // Space between links + color: $secondary-color; + text-decoration: none; + margin: 0 10px; &:hover { - text-decoration: underline; // Underline on hover + text-decoration: underline; } } } \ No newline at end of file From f57dc262b7efb7681d96af91a529020bec29e18f Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 12 Nov 2024 11:25:17 +0100 Subject: [PATCH 04/23] Update Updated the form to redirect to correct path. --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 337a4e575..2a54b63df 100644 --- a/index.html +++ b/index.html @@ -62,7 +62,7 @@

Login or Register

-
+
From 9ea5a097c4ff8f7f98e2f1622c1a7ea718ee25a5 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 12 Nov 2024 11:26:46 +0100 Subject: [PATCH 05/23] Correction Updated again as it was wrong path again --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 2a54b63df..cde4da447 100644 --- a/index.html +++ b/index.html @@ -62,7 +62,7 @@

Login or Register

- +
From 846d066d09c429449d843fc64e0f19720f4b9964 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Thu, 21 Nov 2024 11:35:06 +0100 Subject: [PATCH 06/23] Loginpage Changed from POST to GET for visuals --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index cde4da447..56c2d8cd0 100644 --- a/index.html +++ b/index.html @@ -62,7 +62,7 @@

Login or Register

- +
From c0ff33902aaa372574adc3515dc1c702c1a0ec10 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Thu, 21 Nov 2024 13:30:11 +0100 Subject: [PATCH 07/23] Changes Added a logo and favicon. Also uploaded images locally. --- feed/index.html | 9 ++++---- images/C Logo.png | Bin 0 -> 21479 bytes images/Default_pfp.svg.png | Bin 0 -> 64285 bytes images/default_image (1).png | Bin 0 -> 1791 bytes index.html | 40 +++-------------------------------- profile/index.html | 30 ++++++++++++++++++++++++-- src/scss/index.css | 1 + src/scss/index.css.map | 2 +- src/scss/index.scss | 2 ++ 9 files changed, 40 insertions(+), 44 deletions(-) create mode 100644 images/C Logo.png create mode 100644 images/Default_pfp.svg.png create mode 100644 images/default_image (1).png diff --git a/feed/index.html b/feed/index.html index 088468b2e..a2ada4b3f 100644 --- a/feed/index.html +++ b/feed/index.html @@ -7,6 +7,7 @@ + @@ -52,7 +53,7 @@
- Profile Picture + Profile Picture
Feed
@@ -102,7 +103,7 @@

Posts

- Post Thumbnail + Post Thumbnail
Post Title 1

Brief description of the post...

@@ -112,7 +113,7 @@
Post Title 1
- Post Thumbnail + Post Thumbnail
Post Title 2

Brief description of the post...

@@ -122,7 +123,7 @@
Post Title 2
- Post Thumbnail + Post Thumbnail
Post Title 3

Brief description of the post...

diff --git a/images/C Logo.png b/images/C Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6631562be092c78600e11da5ca88207aff24bd54 GIT binary patch literal 21479 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 z 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 literal 0 HcmV?d00001 diff --git a/images/default_image (1).png b/images/default_image (1).png new file mode 100644 index 0000000000000000000000000000000000000000..81eb65297e6016ecc61bcca98d0bce1e999f76cb GIT binary patch literal 1791 zcmb`IX;jh)7sio9MWu2G0mbZXGabsmX>Vfg3t^Up<3fo_Rvt4fmvU`XB+`tO2{oO_ zESGW02Tc^B_!gP&v zK_C#!li=F(m25d5**3YO-q4|2w`9vbxY z!wn0n)6J>XbwKfBPqrX7N@|CGC%?g9Fp}Yh|5jZ_JvR2CM=Ut;_~&z(pN75cuiyo9 z-EtFWe2nBQNF7*ilYC|j5lfE1njf0_P{@KAM`IXA&}YSwUB%R=_kz9P12#euS$vnx zj>ucgjqI0M7q$J>PH+^Gz{xRBou?FaP`jTaMXkeh0|#hpg>PjA`!8g^#N(Pgdfc2PCdZcrnpY& z*kdxnvY>{vus0S*75)2cV%M~_65mqqoWam~!Y*|tea75oHiI+JBNIB;Ya#qmrT#n_ zvUyCUovr4JG@A!BkvL8D6BXE>0{M%Pb|P31U#+UmW9p+|>jfuBT{9*a7+_TOlQgW7 z(^WY_1eMTMZEe0Y3Vdz=n&QVO_Wc+r?xpvHL9~;3_O1!%RU#!hf+f z!=Wq-UKW*IbB&8N!+JMfL2RpjKJN`*mWPza%~Vk13@@e9yL2;V+rTZZVdL zk{vOU2p!#WL8dfhT6XZTi%i){>xj8U0PF2F)pQXpnMACcl7Yl?ZJXGp19um`PowMY zMcjsZS6u}tTtk20XA%K0!dwX;#Wz<;cV`%Nd1y{Ax*G4!FZ>WEix!oR{>Y;2%G=ZA zC240=v9S-ow%0SjY($9CGFo{jS$4qKe5-lkWhfMnTYGUsF@iS=LyOw|9-@9$=HF1zpzn?1-3|ajKv0b@g-79qa)nn# zS0ypD9%hiJl_OVhGHQFROHRJ2o3_tX?s@}p2WL$k_6cKl{DzN zu@j>FeXAV=GsGs(N4GANyFb?CAyoXd$8LRUfu{J z`&9Q+lI6Sg9DS;vQF4z7iR7jgsNe%ZZ!d(MWnfM^2H2gxIo6m-MgFc^Kky~{kVBz| z6pH@|8-Du|>-00u#&JeHX=E3Kg=T6=Ult7(et$Hgx@OYt=r{24PD*Y=v9%Tayp}Oy z*vuL=ac--5HIYW35#>x&Blrh!$&mXqVVs1iQ&36Y1!=#OQYzd?0D%@Q$=QY~!)9(9 z3|5suyz~C!qmWOhvA|K-62jahYO9lX4wFZ^D4m(_18CDv_bD@XP?ex1zFpTFNRQnNfxEb}jP z$r73-RBWz(-M@%W43mAW zTgR1aY}H8zRh*4IrgNw_%5|$V4XMd$n744`hPI1JLmIQAoxW`zIDHZ29k~*)ym%}p eDz)|hBzRdKTE{*$k+Sj8K%O4n?p3ao^#1|6(^(7v literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 56c2d8cd0..9e7f0c6d0 100644 --- a/index.html +++ b/index.html @@ -7,52 +7,18 @@ + - +
- ChatterHub Logo + ChatterHub Logo
Welcome to ChatterHub
diff --git a/profile/index.html b/profile/index.html index 7ae96378a..7952b2784 100644 --- a/profile/index.html +++ b/profile/index.html @@ -7,6 +7,7 @@ + @@ -14,7 +15,7 @@
- ChatterHub Logo + ChatterHub Logo ChatterHub @@ -65,7 +66,7 @@

Profile Details

- Profile Image + Profile Image
@@ -93,6 +94,31 @@

Profile Details

+ + +
+
+
Social Stats
+ + +
+
+
Followers
+

1,250

+
+
+
Following
+

350

+
+
+ + +
+
Bio
+

Short description or bio about the user goes here.

+
+
+
@@ -65,6 +66,9 @@

Login or Register

+ + + + diff --git a/images/default_image (1).png b/images/default_image.png similarity index 100% rename from images/default_image (1).png rename to images/default_image.png diff --git a/scripts/posts.js b/scripts/posts.js new file mode 100644 index 000000000..3cbce4fd2 --- /dev/null +++ b/scripts/posts.js @@ -0,0 +1,71 @@ +const options = { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNjg2MjU0NX0.6jkhKB8V-xHdJcFJ6cso8nCUTa_xgV2DJT4knWnoqJ0', + 'X-Noroff-API-Key': 'f1174243-8934-4994-8987-80c3aa38f4a9', + }, +}; + +// Fetch and display posts +async function fetchPosts() { + try { + const response = await fetch('https://v2.api.noroff.dev/social/posts', options); + if (!response.ok) { + throw new Error(`Error fetching posts: ${response.statusText}`); + } + + const posts = await response.json(); + renderPosts(posts.data); // Make sure you pass the correct data property + } catch (error) { + console.error(error.message); + document.getElementById('post-feed').innerText = 'Failed to load posts. Please try again.'; + } +} + +// Render posts in the DOM +function renderPosts(posts) { + const postFeed = document.getElementById('post-feed'); + postFeed.innerHTML = ''; // Clear any existing posts + + // Create a container for the posts + let row = document.createElement('div'); + row.className = 'row'; + + // Fallback image URL + const fallbackImage = '/images/default_image.png'; + + posts.forEach((post, index) => { + const postElement = document.createElement('div'); + postElement.className = 'col-md-4 mb-4'; + + // Check if the post has media (image) + const mediaContent = post.media && post.media.url ? + `${post.media.alt}` : + `Fallback Image`; + + // Create the post HTML structure + postElement.innerHTML = ` +
+ ${mediaContent} +
+
${post.title}
+

${post.body}

+ Read More +
+
+ `; + + // Append each post card to the row + row.appendChild(postElement); + + // Every 3 posts, append the row to the postFeed container + if ((index + 1) % 3 === 0 || index === posts.length - 1) { + postFeed.appendChild(row); + // Create a new row for the next set of 3 posts + row = document.createElement('div'); + row.className = 'row'; + } + }); +} + +// Call the fetchPosts function on page load +fetchPosts(); \ No newline at end of file From a62ca7a894a1579bf4a9ed04e6c660da726fc4e3 Mon Sep 17 00:00:00 2001 From: Daniel Leiken Strandheim <117750912+Daniel-leiken@users.noreply.github.com> Date: Mon, 20 Jan 2025 13:41:50 +0100 Subject: [PATCH 11/23] Create feed.js --- scripts/feed.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/feed.js diff --git a/scripts/feed.js b/scripts/feed.js new file mode 100644 index 000000000..e69de29bb From 991abd0bfbd41aa201c0c9f6e611ab1f438a954d Mon Sep 17 00:00:00 2001 From: Daniel Leiken Strandheim <117750912+Daniel-leiken@users.noreply.github.com> Date: Mon, 20 Jan 2025 13:46:06 +0100 Subject: [PATCH 12/23] Posts.js --- feed/index.html | 42 ++--------- ...efault_image (1).png => default_image.png} | Bin scripts/posts.js | 71 ++++++++++++++++++ 3 files changed, 78 insertions(+), 35 deletions(-) rename images/{default_image (1).png => default_image.png} (100%) create mode 100644 scripts/posts.js diff --git a/feed/index.html b/feed/index.html index c0b5c800d..ef3a9719c 100644 --- a/feed/index.html +++ b/feed/index.html @@ -99,41 +99,9 @@

Create a New Post

-

Posts

-
-
-
- Post Thumbnail -
-
Post Title 1
-

Brief description of the post...

- Read More -
-
-
-
-
- Post Thumbnail -
-
Post Title 2
-

Brief description of the post...

- Read More -
-
-
-
-
- Post Thumbnail -
-
Post Title 3
-

Brief description of the post...

- Read More -
-
-
- -
-
+

Posts

+
+
+ + + + diff --git a/images/default_image (1).png b/images/default_image.png similarity index 100% rename from images/default_image (1).png rename to images/default_image.png diff --git a/scripts/posts.js b/scripts/posts.js new file mode 100644 index 000000000..3cbce4fd2 --- /dev/null +++ b/scripts/posts.js @@ -0,0 +1,71 @@ +const options = { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNjg2MjU0NX0.6jkhKB8V-xHdJcFJ6cso8nCUTa_xgV2DJT4knWnoqJ0', + 'X-Noroff-API-Key': 'f1174243-8934-4994-8987-80c3aa38f4a9', + }, +}; + +// Fetch and display posts +async function fetchPosts() { + try { + const response = await fetch('https://v2.api.noroff.dev/social/posts', options); + if (!response.ok) { + throw new Error(`Error fetching posts: ${response.statusText}`); + } + + const posts = await response.json(); + renderPosts(posts.data); // Make sure you pass the correct data property + } catch (error) { + console.error(error.message); + document.getElementById('post-feed').innerText = 'Failed to load posts. Please try again.'; + } +} + +// Render posts in the DOM +function renderPosts(posts) { + const postFeed = document.getElementById('post-feed'); + postFeed.innerHTML = ''; // Clear any existing posts + + // Create a container for the posts + let row = document.createElement('div'); + row.className = 'row'; + + // Fallback image URL + const fallbackImage = '/images/default_image.png'; + + posts.forEach((post, index) => { + const postElement = document.createElement('div'); + postElement.className = 'col-md-4 mb-4'; + + // Check if the post has media (image) + const mediaContent = post.media && post.media.url ? + `${post.media.alt}` : + `Fallback Image`; + + // Create the post HTML structure + postElement.innerHTML = ` +
+ ${mediaContent} +
+
${post.title}
+

${post.body}

+ Read More +
+
+ `; + + // Append each post card to the row + row.appendChild(postElement); + + // Every 3 posts, append the row to the postFeed container + if ((index + 1) % 3 === 0 || index === posts.length - 1) { + postFeed.appendChild(row); + // Create a new row for the next set of 3 posts + row = document.createElement('div'); + row.className = 'row'; + } + }); +} + +// Call the fetchPosts function on page load +fetchPosts(); \ No newline at end of file From ce58aa43f164337e96bd1f303e74dcd434bdd024 Mon Sep 17 00:00:00 2001 From: Daniel Leiken Strandheim <117750912+Daniel-leiken@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:33:14 +0100 Subject: [PATCH 13/23] Added a filter to posts.js --- feed/index.html | 20 +++++++------- scripts/feed.js | 0 scripts/posts.js | 68 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 68 insertions(+), 20 deletions(-) delete mode 100644 scripts/feed.js diff --git a/feed/index.html b/feed/index.html index ef3a9719c..cf3378d48 100644 --- a/feed/index.html +++ b/feed/index.html @@ -57,18 +57,18 @@
Feed
-
- -
+ +
+ +
- +
diff --git a/scripts/feed.js b/scripts/feed.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/scripts/posts.js b/scripts/posts.js index 3cbce4fd2..3dba9d9a0 100644 --- a/scripts/posts.js +++ b/scripts/posts.js @@ -6,15 +6,33 @@ const options = { }; // Fetch and display posts -async function fetchPosts() { +async function fetchPosts(sortBy = 'newest', searchQuery = '') { try { - const response = await fetch('https://v2.api.noroff.dev/social/posts', options); + let url = 'https://v2.api.noroff.dev/social/posts'; + + // Add sorting query if provided + if (sortBy) { + url += `?_sort=${sortBy}`; + } + + // Add search query if provided + if (searchQuery) { + url += `&q=${encodeURIComponent(searchQuery)}`; + } + + console.log(`Fetching from URL: ${url}`); // Debugging URL + + const response = await fetch(url, options); if (!response.ok) { throw new Error(`Error fetching posts: ${response.statusText}`); } const posts = await response.json(); - renderPosts(posts.data); // Make sure you pass the correct data property + + // Sort posts based on the selected criteria + const sortedPosts = sortPosts(posts.data, sortBy); + + renderPosts(sortedPosts); // Render sorted posts } catch (error) { console.error(error.message); document.getElementById('post-feed').innerText = 'Failed to load posts. Please try again.'; @@ -35,12 +53,13 @@ function renderPosts(posts) { posts.forEach((post, index) => { const postElement = document.createElement('div'); - postElement.className = 'col-md-4 mb-4'; + // Responsive Bootstrap classes: 1 column on mobile, 2 on tablets, 3 on desktops + postElement.className = 'col-12 col-md-6 col-lg-4 mb-4'; // Check if the post has media (image) - const mediaContent = post.media && post.media.url ? - `${post.media.alt}` : - `Fallback Image`; + const mediaContent = post.media && post.media.url + ? `${post.media.alt}` + : `Fallback Image`; // Create the post HTML structure postElement.innerHTML = ` @@ -57,15 +76,44 @@ function renderPosts(posts) { // Append each post card to the row row.appendChild(postElement); - // Every 3 posts, append the row to the postFeed container + // Append the row to the postFeed container after processing all posts if ((index + 1) % 3 === 0 || index === posts.length - 1) { postFeed.appendChild(row); - // Create a new row for the next set of 3 posts row = document.createElement('div'); row.className = 'row'; } }); } +// Sort posts based on the selected criteria +function sortPosts(posts, sortBy) { + switch (sortBy) { + case 'newest': + return posts.sort((a, b) => new Date(b.created) - new Date(a.created)); + case 'oldest': + return posts.sort((a, b) => new Date(a.created) - new Date(b.created)); + case 'title-asc': + return posts.sort((a, b) => a.title.localeCompare(b.title)); + case 'title-desc': + return posts.sort((a, b) => b.title.localeCompare(a.title)); + default: + return posts; // Return unsorted if no valid sortBy is provided + } +} + +// Add event listener for the "Sort by" dropdown +document.getElementById('sort-filter').addEventListener('change', function () { + const sortBy = this.value; // Get the selected sorting option + const searchQuery = document.getElementById('search-input').value; // Get the current search query + fetchPosts(sortBy, searchQuery); // Fetch and render posts based on sorting and search +}); + +// Add event listener for the "Search" input field +document.getElementById('search-input').addEventListener('input', function () { + const searchQuery = this.value; // Get the current search query + const sortBy = document.getElementById('sort-filter').value; // Get the selected sorting option + fetchPosts(sortBy, searchQuery); // Fetch and render posts based on search and sorting +}); + // Call the fetchPosts function on page load -fetchPosts(); \ No newline at end of file +fetchPosts(); From d1f9cb3f126040343b7b025a46942efc32bb20ec Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 28 Jan 2025 09:55:07 +0100 Subject: [PATCH 14/23] Added a Readme file and register page --- README.md | 75 +++++++++++++++++++++++++++++++++++++- register/index.html | 89 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 register/index.html diff --git a/README.md b/README.md index 9afc742da..92b484a19 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,73 @@ -# css-frameworks-ca -Replace this text with a description of your social media project. +ChatterHub - A Social Media Platform Frontend + +Project Overview + +ChatterHub is a social media platform frontend built using HTML, CSS/SCSS, and JavaScript. The platform allows users to register, log in, and view a feed of posts retrieved from the Noroff API. Key features include user authentication, post management, and a visually structured content feed. + +Features + + • User Authentication + • Register with valid @noroff.no or @stud.noroff.no emails. + • Login functionality with secure token storage. + • Post Feed + • Displays posts fetched from the Noroff API in a responsive card grid. + • Pagination with a 9-post display limit. + • Fallback image for posts without media. + +Getting Started + +Prerequisites + + • Visual Studio Code or any preferred IDE + • Basic understanding of JavaScript, HTML, and CSS + • API key from the Noroff API + +Installation + + 1. Clone the repository: +git clone +cd chatterhub + 2. Open in Visual Studio Code: +code . + 3. Install Live Server for local development: + • Search for “Live Server” in the VSCode extensions tab and install it. + +Usage + + 1. Start the project using Live Server. + 2. Navigate to the following routes: + • /login.html for login + • /register.html for registration + • /feed.html to view the post feed + +Project Structure + +chatterhub/ +│ +├── index.html # Home page +├── login.html # Login page +├── register.html # Registration page +├── feed.html # Post feed page +├── src/ # Source files +│ └── scss/ # SCSS styles +├── scripts/ # JavaScript files +│ └── login.js # Login handling script +│ └── register.js # Registration script +│ └── posts.js # Post feed handling +└── images/ # Static images + +API Integration + +Noroff API + +The application integrates with the Noroff API to fetch and display posts as well as handle user authentication. To access the API, make sure to use your valid API key and Authorization Bearer token. + +Development Notes + + • SCSS files are precompiled for cleaner CSS management. + • Responsive Bootstrap grid is used for structured layout design. + • Authenticated routes require valid access tokens. + +License + +This project is licensed under the MIT License. \ No newline at end of file diff --git a/register/index.html b/register/index.html new file mode 100644 index 000000000..6826c8ead --- /dev/null +++ b/register/index.html @@ -0,0 +1,89 @@ + + + + + + ChatterHub - Login or Register + + + + + + + + + +
+
+
+ +
+ ChatterHub Logo +
Welcome to ChatterHub
+
+ +

Connect with your friends and the world around you.

+ +
+
+

Login or Register

+ +
+ +
+ + +
+ Please enter a email or username. +
+
+ +
+ + +
+ Password must be at least 8 characters long. +
+
+ +
+ + +
+
+

+
+
+ + +
+
+
+ + + + + + + + + + + \ No newline at end of file From 26c518c29a4edd608b9f68f5d1db943180b9b4d8 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 28 Jan 2025 10:08:35 +0100 Subject: [PATCH 15/23] Create register.js --- scripts/register.js | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 scripts/register.js diff --git a/scripts/register.js b/scripts/register.js new file mode 100644 index 000000000..3561f9097 --- /dev/null +++ b/scripts/register.js @@ -0,0 +1,67 @@ +const options = { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNDYxMjUwMX0.kdqFQFoJrAEbfiBvonCs3fC5Muc_fnzgf56Tt_8Nf8w', + 'X-Noroff-API-Key': '486ac6ab-b456-4770-bd5e-b4ea0f8a7582' + } + }; + + // Handle click on the register button + document.getElementById('register-btn').addEventListener('click', async (event) => { + event.preventDefault(); // Prevent form from refreshing the page + + const name = document.getElementById('name').value; + const email = document.getElementById('email').value; + const password = document.getElementById('password').value; + const bio = document.getElementById('bio').value || ''; // Optional + const avatarUrl = document.getElementById('avatar-url').value || ''; // Optional + const avatarAlt = document.getElementById('avatar-alt').value || ''; // Optional + const bannerUrl = document.getElementById('banner-url').value || ''; // Optional + const bannerAlt = document.getElementById('banner-alt').value || ''; // Optional + + // Validate email to ensure it's a valid @stud.noroff.no email + if (!email.match(/^[a-zA-Z0-9._%+-]+@stud\.noroff\.no$/)) { + document.getElementById('error-message').innerText = 'Please enter a valid @stud.noroff.no email.'; + return; + } + + // Validate password length + if (password.length < 8) { + document.getElementById('error-message').innerText = 'Password must be at least 8 characters long.'; + return; + } + + try { + const response = await fetch('https://v2.api.noroff.dev/auth/register', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNDYxMjUwMX0.kdqFQFoJrAEbfiBvonCs3fC5Muc_fnzgf56Tt_8Nf8w', + 'X-Noroff-API-Key': '486ac6ab-b456-4770-bd5e-b4ea0f8a7582', + }, + body: JSON.stringify({ + name, + email, + password, + bio, + avatar: avatarUrl ? { url: avatarUrl, alt: avatarAlt } : undefined, + banner: bannerUrl ? { url: bannerUrl, alt: bannerAlt } : undefined, + venueManager: false // You can set this to true if needed + }), + }); + + if (!response.ok) { + throw new Error('Registration failed: Invalid input or email already exists'); + } + + const result = await response.json(); + + // Save access token to localStorage for authenticated requests + localStorage.setItem('accessToken', result.data.accessToken); + + // Redirect to profile page + window.location.href = 'profile/index.html'; + } catch (error) { + // Display error message + document.getElementById('error-message').innerText = error.message; + } + }); \ No newline at end of file From 0948116a7c5b4d3189cbfb95f0f3c07fcace45cf Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 28 Jan 2025 10:36:41 +0100 Subject: [PATCH 16/23] Updated register scss --- register/index.html | 15 +++++++-------- scripts/register.js | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/register/index.html b/register/index.html index 6826c8ead..8f19d2b89 100644 --- a/register/index.html +++ b/register/index.html @@ -6,7 +6,7 @@ ChatterHub - Login or Register - + @@ -19,22 +19,22 @@
ChatterHub Logo -
Welcome to ChatterHub
+
Register to ChatterHub

Connect with your friends and the world around you.

-

Login or Register

+

Register

- +
- Please enter a email or username. + Please enter a valid email.
@@ -47,8 +47,7 @@

Login or Register

- - +

@@ -67,7 +66,7 @@

Login or Register

- + + + + - + + + + - - - + + + + \ No newline at end of file diff --git a/index.html b/index.html index 7f3d39e96..aec39ece9 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,6 @@ -
@@ -27,8 +26,8 @@

Login

- -
+ +
@@ -51,7 +50,8 @@

Login

-

+ +

diff --git a/scripts/login.js b/scripts/login.js index ac71bc166..ae2622cca 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -1,44 +1,35 @@ +// Handle form submission +document.getElementById('auth-form').addEventListener('submit', async (event) => { + event.preventDefault(); // Prevent form from refreshing the page -const options = { - headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNDYxMjUwMX0.kdqFQFoJrAEbfiBvonCs3fC5Muc_fnzgf56Tt_8Nf8w', - 'X-Noroff-API-Key': '486ac6ab-b456-4770-bd5e-b4ea0f8a7582' - } - }; + const email = document.getElementById('email').value; + const password = document.getElementById('password').value; + try { + const response = await fetch('https://v2.api.noroff.dev/auth/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Noroff-API-Key': '486ac6ab-b456-4770-bd5e-b4ea0f8a7582', + }, + body: JSON.stringify({ email, password }), + }); -// Handle form submission -document.getElementById('auth-form').addEventListener('submit', async (event) => { - event.preventDefault(); // Prevent form from refreshing the page - - const email = document.getElementById('email').value; - const password = document.getElementById('password').value; - - try { - const response = await fetch('https://v2.api.noroff.dev/auth/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNDYxMjUwMX0.kdqFQFoJrAEbfiBvonCs3fC5Muc_fnzgf56Tt_8Nf8w', - 'X-Noroff-API-Key': '486ac6ab-b456-4770-bd5e-b4ea0f8a7582', - }, - body: JSON.stringify({ email, password }), - }); - - if (!response.ok) { - throw new Error('Login failed: Invalid email or password'); - } - - const result = await response.json(); - - // Save access token to localStorage for authenticated requests - localStorage.setItem('accessToken', result.data.accessToken); - - // Redirect to profile page - window.location.href = 'profile/index.html'; - } catch (error) { - // Display error message - document.getElementById('error-message').innerText = error.message; + if (!response.ok) { + throw new Error('Login failed: Invalid email or password'); } - }); - \ No newline at end of file + + const result = await response.json(); + console.log('Login successful:', result); + + // Store the access token in a cookie + document.cookie = `accessToken=${result.data.accessToken}; path=/; secure; HttpOnly; SameSite=Strict; max-age=3600`; + console.log('Access Token Stored in Cookie:', result.data.accessToken); + + // Redirect to profile page + window.location.href = 'profile/index.html'; + } catch (error) { + // Display error message + document.getElementById('error-message').innerText = error.message; + } +}); \ No newline at end of file diff --git a/scripts/posts.js b/scripts/posts.js index 3dba9d9a0..5bdb57efa 100644 --- a/scripts/posts.js +++ b/scripts/posts.js @@ -10,14 +10,14 @@ async function fetchPosts(sortBy = 'newest', searchQuery = '') { try { let url = 'https://v2.api.noroff.dev/social/posts'; - // Add sorting query if provided - if (sortBy) { - url += `?_sort=${sortBy}`; - } - - // Add search query if provided + // If a search query is provided, use the search endpoint if (searchQuery) { - url += `&q=${encodeURIComponent(searchQuery)}`; + url = `https://v2.api.noroff.dev/social/posts/search?q=${encodeURIComponent(searchQuery)}`; + } else { + // Add sorting query if no search query is provided + if (sortBy) { + url += `?_sort=${sortBy}`; + } } console.log(`Fetching from URL: ${url}`); // Debugging URL @@ -29,10 +29,10 @@ async function fetchPosts(sortBy = 'newest', searchQuery = '') { const posts = await response.json(); - // Sort posts based on the selected criteria - const sortedPosts = sortPosts(posts.data, sortBy); + // If there's a search query, we don't need to sort again since it’s already filtered by search + const sortedPosts = searchQuery ? posts.data : sortPosts(posts.data, sortBy); - renderPosts(sortedPosts); // Render sorted posts + renderPosts(sortedPosts); // Render sorted or filtered posts } catch (error) { console.error(error.message); document.getElementById('post-feed').innerText = 'Failed to load posts. Please try again.'; @@ -68,7 +68,7 @@ function renderPosts(posts) {
${post.title}

${post.body}

- Read More + Read More
`; @@ -83,6 +83,14 @@ function renderPosts(posts) { row.className = 'row'; } }); + + // Add event listeners to the "Read More" buttons + document.querySelectorAll('.read-more-button').forEach(button => { + button.addEventListener('click', function (event) { + const postId = this.getAttribute('data-post-id'); + viewPostById(postId, event); + }); + }); } // Sort posts based on the selected criteria @@ -101,6 +109,42 @@ function sortPosts(posts, sortBy) { } } +// View a single post by ID +async function viewPostById(postId, event) { + // Prevent the default anchor tag behavior + event.preventDefault(); + + try { + const url = `https://v2.api.noroff.dev/social/posts/${postId}`; + console.log(`Fetching post details from URL: ${url}`); + + const response = await fetch(url, options); + if (!response.ok) { + throw new Error(`Error fetching post details: ${response.statusText}`); + } + + const post = await response.json(); + + // Populate the modal with post data + document.getElementById('post-details-title').innerText = post.data.title; + document.getElementById('post-details-body').innerText = post.data.body; + document.getElementById('post-details-created').innerText = `Created: ${new Date(post.data.created).toLocaleDateString()}`; + document.getElementById('post-details-tags').innerText = `Tags: ${post.data.tags.join(', ')}`; + + // Handle image + const postImage = post.data.media && post.data.media.url ? post.data.media.url : '/images/default_image.png'; + document.getElementById('post-details-image').src = postImage; + + // Show the modal using Bootstrap's Modal API + const modal = new bootstrap.Modal(document.getElementById('post-details-modal')); + modal.show(); // This is the key part + + } catch (error) { + console.error(error.message); + document.getElementById('post-details').innerText = 'Failed to load post details. Please try again.'; + } +} + // Add event listener for the "Sort by" dropdown document.getElementById('sort-filter').addEventListener('change', function () { const sortBy = this.value; // Get the selected sorting option @@ -115,5 +159,54 @@ document.getElementById('search-input').addEventListener('input', function () { fetchPosts(sortBy, searchQuery); // Fetch and render posts based on search and sorting }); +// Add event listener for the "Create Post" form submission +document.getElementById('post-form').addEventListener('submit', async function (event) { + event.preventDefault(); + + const formData = new FormData(this); + const postData = { + title: formData.get('post-title'), + body: formData.get('post-content'), + }; + + // Check if a file is selected + if (formData.get('post-image')) { + const image = formData.get('post-image'); + const imageUrl = await uploadImage(image); // Upload image to the server and get the URL + postData.media = { url: imageUrl }; + } + + // Create the post + try { + const response = await fetch('https://v2.api.noroff.dev/social/posts', { + method: 'POST', + headers: { + ...options.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ data: postData }), + }); + + if (!response.ok) { + throw new Error(`Error creating post: ${response.statusText}`); + } + + // Clear the form + document.getElementById('post-form').reset(); + + // Reload posts after creation + fetchPosts(); + } catch (error) { + console.error(error.message); + } +}); + +// Upload image to the server (simulated) +async function uploadImage(image) { + // You can implement image upload logic here (e.g., to cloud storage) + // For now, we simulate the upload by returning a URL + return '/images/uploaded_image.png'; // Example URL +} + // Call the fetchPosts function on page load -fetchPosts(); +fetchPosts(); \ No newline at end of file From 06d4a51ea60f625242a43bd71999fc180765e245 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 28 Jan 2025 13:21:47 +0100 Subject: [PATCH 19/23] Made publishing posts working --- scripts/posts.js | 56 +++++++++++++----------------------------------- 1 file changed, 15 insertions(+), 41 deletions(-) diff --git a/scripts/posts.js b/scripts/posts.js index 5bdb57efa..ca1c084cd 100644 --- a/scripts/posts.js +++ b/scripts/posts.js @@ -1,6 +1,6 @@ const options = { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNjg2MjU0NX0.6jkhKB8V-xHdJcFJ6cso8nCUTa_xgV2DJT4knWnoqJ0', + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiTGVpa2VuIiwiZW1haWwiOiJEYW5TdHIxNjIyMUBzdHVkLm5vcm9mZi5ubyIsImlhdCI6MTczNjg2MjU0NX0.6jkhKB8V-xHdJcFJ6cso8nCUTa_xgV2DJT4knWnoqJ0', 'X-Noroff-API-Key': 'f1174243-8934-4994-8987-80c3aa38f4a9', }, }; @@ -20,19 +20,15 @@ async function fetchPosts(sortBy = 'newest', searchQuery = '') { } } - console.log(`Fetching from URL: ${url}`); // Debugging URL - const response = await fetch(url, options); if (!response.ok) { throw new Error(`Error fetching posts: ${response.statusText}`); } const posts = await response.json(); - - // If there's a search query, we don't need to sort again since it’s already filtered by search const sortedPosts = searchQuery ? posts.data : sortPosts(posts.data, sortBy); - renderPosts(sortedPosts); // Render sorted or filtered posts + renderPosts(sortedPosts); } catch (error) { console.error(error.message); document.getElementById('post-feed').innerText = 'Failed to load posts. Please try again.'; @@ -42,26 +38,21 @@ async function fetchPosts(sortBy = 'newest', searchQuery = '') { // Render posts in the DOM function renderPosts(posts) { const postFeed = document.getElementById('post-feed'); - postFeed.innerHTML = ''; // Clear any existing posts + postFeed.innerHTML = ''; - // Create a container for the posts let row = document.createElement('div'); row.className = 'row'; - // Fallback image URL const fallbackImage = '/images/default_image.png'; posts.forEach((post, index) => { const postElement = document.createElement('div'); - // Responsive Bootstrap classes: 1 column on mobile, 2 on tablets, 3 on desktops postElement.className = 'col-12 col-md-6 col-lg-4 mb-4'; - // Check if the post has media (image) const mediaContent = post.media && post.media.url ? `${post.media.alt}` : `Fallback Image`; - // Create the post HTML structure postElement.innerHTML = `
${mediaContent} @@ -73,10 +64,8 @@ function renderPosts(posts) {
`; - // Append each post card to the row row.appendChild(postElement); - // Append the row to the postFeed container after processing all posts if ((index + 1) % 3 === 0 || index === posts.length - 1) { postFeed.appendChild(row); row = document.createElement('div'); @@ -84,7 +73,6 @@ function renderPosts(posts) { } }); - // Add event listeners to the "Read More" buttons document.querySelectorAll('.read-more-button').forEach(button => { button.addEventListener('click', function (event) { const postId = this.getAttribute('data-post-id'); @@ -105,19 +93,16 @@ function sortPosts(posts, sortBy) { case 'title-desc': return posts.sort((a, b) => b.title.localeCompare(a.title)); default: - return posts; // Return unsorted if no valid sortBy is provided + return posts; } } // View a single post by ID async function viewPostById(postId, event) { - // Prevent the default anchor tag behavior event.preventDefault(); try { const url = `https://v2.api.noroff.dev/social/posts/${postId}`; - console.log(`Fetching post details from URL: ${url}`); - const response = await fetch(url, options); if (!response.ok) { throw new Error(`Error fetching post details: ${response.statusText}`); @@ -125,19 +110,16 @@ async function viewPostById(postId, event) { const post = await response.json(); - // Populate the modal with post data document.getElementById('post-details-title').innerText = post.data.title; document.getElementById('post-details-body').innerText = post.data.body; document.getElementById('post-details-created').innerText = `Created: ${new Date(post.data.created).toLocaleDateString()}`; document.getElementById('post-details-tags').innerText = `Tags: ${post.data.tags.join(', ')}`; - // Handle image const postImage = post.data.media && post.data.media.url ? post.data.media.url : '/images/default_image.png'; document.getElementById('post-details-image').src = postImage; - // Show the modal using Bootstrap's Modal API const modal = new bootstrap.Modal(document.getElementById('post-details-modal')); - modal.show(); // This is the key part + modal.show(); } catch (error) { console.error(error.message); @@ -147,16 +129,16 @@ async function viewPostById(postId, event) { // Add event listener for the "Sort by" dropdown document.getElementById('sort-filter').addEventListener('change', function () { - const sortBy = this.value; // Get the selected sorting option - const searchQuery = document.getElementById('search-input').value; // Get the current search query - fetchPosts(sortBy, searchQuery); // Fetch and render posts based on sorting and search + const sortBy = this.value; + const searchQuery = document.getElementById('search-input').value; + fetchPosts(sortBy, searchQuery); }); // Add event listener for the "Search" input field document.getElementById('search-input').addEventListener('input', function () { - const searchQuery = this.value; // Get the current search query - const sortBy = document.getElementById('sort-filter').value; // Get the selected sorting option - fetchPosts(sortBy, searchQuery); // Fetch and render posts based on search and sorting + const searchQuery = this.value; + const sortBy = document.getElementById('sort-filter').value; + fetchPosts(sortBy, searchQuery); }); // Add event listener for the "Create Post" form submission @@ -169,10 +151,9 @@ document.getElementById('post-form').addEventListener('submit', async function ( body: formData.get('post-content'), }; - // Check if a file is selected - if (formData.get('post-image')) { - const image = formData.get('post-image'); - const imageUrl = await uploadImage(image); // Upload image to the server and get the URL + // Check if the image URL is provided + const imageUrl = formData.get('post-image-url'); + if (imageUrl) { postData.media = { url: imageUrl }; } @@ -184,7 +165,7 @@ document.getElementById('post-form').addEventListener('submit', async function ( ...options.headers, 'Content-Type': 'application/json', }, - body: JSON.stringify({ data: postData }), + body: JSON.stringify(postData), }); if (!response.ok) { @@ -201,12 +182,5 @@ document.getElementById('post-form').addEventListener('submit', async function ( } }); -// Upload image to the server (simulated) -async function uploadImage(image) { - // You can implement image upload logic here (e.g., to cloud storage) - // For now, we simulate the upload by returning a URL - return '/images/uploaded_image.png'; // Example URL -} - // Call the fetchPosts function on page load fetchPosts(); \ No newline at end of file From 976bb749202ae95d3d153eb4cfef058155f4b568 Mon Sep 17 00:00:00 2001 From: Daniel-leiken Date: Tue, 28 Jan 2025 14:46:40 +0100 Subject: [PATCH 20/23] Added Edit and Delete functions --- feed/index.html | 33 +++++++------- scripts/posts.js | 113 +++++++++++++++++++++++++++++------------------ 2 files changed, 89 insertions(+), 57 deletions(-) diff --git a/feed/index.html b/feed/index.html index 727410db9..ccada0704 100644 --- a/feed/index.html +++ b/feed/index.html @@ -110,23 +110,26 @@

Posts

- -