- Website URL
- Project description
- APIs
- Background
- Progress (what we have done so far)
- Planning (what we still plan to do)
- Files
- Installation
- Developers
https://didyousee-4b593.web.app/
An intuitive and modern web app where you can discover, share and organize your favourite movies and TV series. Personal lists (likes, watchlists, have watched, dislikes) with shareable links
This was a group project for the course DH2642 Interaction Programming and the Dynamic Web at KTH Royal Institute of Technology. The project duration was about ~3 months.
Currently, we've implemented the following:
- Basic layout (HTML & CSS): Home, Result, Profile, Login, Register
- Basic routing (Vue router)
- API call from TMDB
- Firebase hosting and deployment
- User authentication via Auth.js/Auth0/Firebase
- Search functionality, with filters
- Profile page with personal lists (liked, watchlist, have watched, dislikes)
We plan to implement the following:
- Improved UX/UI and usability
- Improved accessibility
- Shareable lists via URL and exportability of lists (CSV, JSON, etc.). Implemented partially in a PR.
.
βββ 404.html
βββ README.md
βββ firebase.json
βββ index.html
βββ package-lock.json
βββ package.json
βββ server
βΒ Β βββ controllers
βΒ Β βΒ Β βββ models
βΒ Β βΒ Β βββ routes
βΒ Β βββ firebase.ts
βΒ Β βββ index.ts
βΒ Β βββ middleware
βΒ Β βββ server.ts
βββ src
βΒ Β βββ App.vue
βΒ Β βββ assets
βΒ Β βΒ Β βββ didyousee.svg
βΒ Β βΒ Β βββ icons8-google.svg
βΒ Β βΒ Β βββ no-backdrop.svg
βΒ Β βΒ Β βββ no-content.svg
βΒ Β βΒ Β βββ no-poster.svg
βΒ Β βΒ Β βββ tmdb_alt_short_blue.svg
βΒ Β βββ components
βΒ Β βΒ Β βββ CarouselCast.vue
βΒ Β βΒ Β βββ CarouselMedia.vue
βΒ Β βΒ Β βββ CastCard.vue
βΒ Β βΒ Β βββ Filter.vue
βΒ Β βΒ Β βββ ListCard.vue
βΒ Β βΒ Β βββ MediaCard.vue
βΒ Β βΒ Β βββ ReviewCard.vue
βΒ Β βΒ Β βββ SearchBar.vue
βΒ Β βΒ Β βββ WatchProviders.vue
βΒ Β βββ firebaseConfig.ts
βΒ Β βββ main.ts
βΒ Β βββ model
βΒ Β βΒ Β βββ apiConfig.ts
βΒ Β βΒ Β βββ apiEndpoints.ts
βΒ Β βΒ Β βββ model.ts
βΒ Β βΒ Β βββ promiseHandler.ts
βΒ Β βββ presenters
βΒ Β βΒ Β βββ AboutPresenter.vue
βΒ Β βΒ Β βββ CastPresenter.vue
βΒ Β βΒ Β βββ ContentPresenter.vue
βΒ Β βΒ Β βββ HomePresenter.vue
βΒ Β βΒ Β βββ ListPresenter.vue
βΒ Β βΒ Β βββ LoginPresenter.vue
βΒ Β βΒ Β βββ PageNotFoundPresenter.vue
βΒ Β βΒ Β βββ ProfilePresenter.vue
βΒ Β βΒ Β βββ RegisterPresenter.vue
βΒ Β βΒ Β βββ ReviewsPresenter.vue
βΒ Β βΒ Β βββ SearchResultsPresenter.vue
βΒ Β βββ router
βΒ Β βΒ Β βββ routes.ts
βΒ Β βββ style.css
βΒ Β βββ types
βΒ Β βΒ Β βββ types.ts
βΒ Β βββ utils
βΒ Β βΒ Β βββ utils.ts
βΒ Β βββ views
βΒ Β βΒ Β βββ AboutView.vue
βΒ Β βΒ Β βββ CastView.vue
βΒ Β βΒ Β βββ ContentView.vue
βΒ Β βΒ Β βββ HomeView.vue
βΒ Β βΒ Β βββ ListView.vue
βΒ Β βΒ Β βββ LoginView.vue
βΒ Β βΒ Β βββ PageNotFoundView.vue
βΒ Β βΒ Β βββ ProfileView.vue
βΒ Β βΒ Β βββ RegisterView.vue
βΒ Β βΒ Β βββ ReviewsView.vue
βΒ Β βΒ Β βββ SearchResultsView.vue
βΒ Β βββ vite-env.d.ts
βββ tsconfig.json
βββ tsconfig.node.json
βββ vite.config.ts
File/Folder | Description |
---|---|
404.html | Error page |
README.md | Readme file |
firebase.json | Firebase configuration file |
index.html | Main HTML file |
package-lock.json | Dependency file |
package.json | Package configuration file |
server/ | Server folder |
server/controllers/ | Controllers folder |
server/controllers/models/ | Models folder |
server/controllers/models/routes/ | Routes folder |
server/firebase.ts | Firebase setup file |
server/index.ts | Server entry point |
server/middleware/ | Middleware folder |
server/server.ts | Server configuration file |
src/ | Source folder |
src/App.vue | Main Vue component |
src/assets/ | Assets folder |
src/assets/didyousee.svg | Asset file |
src/assets/icons8-google.svg | Asset file |
src/assets/no-backdrop.svg | Asset file |
src/assets/no-content.svg | Asset file |
src/assets/no-poster.svg | Asset file |
src/assets/tmdb_alt_short_blue.svg | Asset file |
src/components/ | Vue components folder |
src/components/CarouselCast.vue | Vue component |
src/components/CarouselMedia.vue | Vue component |
src/components/CastCard.vue | Vue component |
src/components/Filter.vue | Vue component |
src/components/ListCard.vue | Vue component |
src/components/MediaCard.vue | Vue component |
src/components/ReviewCard.vue | Vue component |
src/components/SearchBar.vue | Vue component |
src/components/WatchProviders.vue | Vue component |
src/firebaseConfig.ts | Firebase configuration file |
src/main.ts | Main TypeScript file |
src/model/ | Model folder |
src/model/apiConfig.ts | API configuration file |
src/model/apiEndpoints.ts | API endpoints file |
src/model/model.ts | Model file |
src/model/promiseHandler.ts | Promise handler file |
src/presenters/ | Vue presenters folder |
src/presenters/AboutPresenter.vue | Vue presenter |
src/presenters/CastPresenter.vue | Vue presenter |
src/presenters/ContentPresenter.vue | Vue presenter |
src/presenters/HomePresenter.vue | Vue presenter |
src/presenters/ListPresenter.vue | Vue presenter |
src/presenters/LoginPresenter.vue | Vue presenter |
src/presenters/PageNotFoundPresenter.vue | Vue presenter |
src/presenters/ProfilePresenter.vue | Vue presenter |
src/presenters/RegisterPresenter.vue | Vue presenter |
src/presenters/ReviewsPresenter.vue | Vue presenter |
src/presenters/SearchResultsPresenter.vue | Vue presenter |
src/router/ | Vue router folder |
src/router/routes.ts | Router configuration file |
src/style.css | Main CSS file |
src/types/ | TypeScript types folder |
src/types/types.ts | TypeScript types file |
src/utils/ | Utility folder |
src/utils/utils.ts | Utility file |
src/views/ | Vue views folder |
src/views/AboutView.vue | Vue view |
src/views/CastView.vue | Vue view |
src/views/ContentView.vue | Vue view |
src/views/HomeView.vue | Vue view |
src/views/ListView.vue | Vue view |
src/views/LoginView.vue | Vue view |
src/views/PageNotFoundView.vue | Vue view |
src/views/ProfileView.vue | Vue view |
src/views/RegisterView.vue | Vue view |
src/views/ReviewsView.vue | Vue view |
src/views/SearchResultsView.vue | Vue view |
vite-env.d.ts | Typescript definition file for Vite |
tsconfig.json | Typescript configuration file for the project |
tsconfig.node.json | Typescript configuration file for Node.js |
vite.config.ts | Configuration file for Vite |
To setup the site locally, install the packages and build the project.
npm i
npm run build
To get a development build, run npm run dev
. This will run the server and the typescript checker in parallel.
Not included in the repository are the private api keys. To run the code locally you will need to acquire a TMDB api key and set up your own firebase and provide its config. The TMDB api key is provided through the environment, e.g. through a .env
file in the root of the directory. The key is named VITE_TMDB_API_KEY
.
The template of the firebase config file is. It is expected to reside at src/firebaseConfig.ts
:
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
import { getAuth } from 'firebase/auth'
import { getDatabase } from "firebase/database";
const firebaseConfig = {
// Insert your config here
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
//initialize firebase auth
const auth = getAuth()
const db = getDatabase(app)
export { app, auth, db }// Import the functions you need from the SDKs you need
{
"name": "didyousee",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "concurrently \"vue-tsc --watch\" \"vite\"",
"dev-no-tsc": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
"devDependencies": {
"@types/numeral": "^2.0.2",
"@vitejs/plugin-vue": "^4.1.0",
"@vue/compiler-sfc": "^3.2.47",
"autoprefixer": "^10.4.14",
"concurrent": "^0.3.2",
"pinia": "^2.0.33",
"postcss": "^8.4.21",
"prettier": "^2.8.7",
"typescript": "^4.9.3",
"vite": "^4.2.1",
"vue": "^3.2.36",
"vue-tsc": "^1.2.0"
},
"dependencies": {
"@google-cloud/firestore": "^6.5.0",
"@splidejs/vue-splide": "^0.6.12",
"@types/express": "^4.17.17",
"auth-js": "^0.0.16",
"axios": "^1.3.5",
"better-logging": "^5.0.0",
"chart.js": "^4.2.1",
"concurrently": "^8.0.1",
"cors": "^2.8.5",
"dompurify": "^3.0.2",
"dotenv": "^16.0.3",
"express": "^4.18.2",
"firebase": "^9.20.0",
"fuse.js": "^6.6.2",
"fuzzy": "^0.1.3",
"numeral": "^2.0.6",
"vue-router": "^4.1.6"
}
}
- Petrus Matiros
- Max Olof Isralesson (Blezie, maxisr)
- Sebastian Willenbrink