├── .gitignore ├── client ├── .eslintrc.json ├── src │ ├── react-app-env.d.ts │ ├── sounds │ │ └── enterRoom.mp3 │ ├── components │ │ ├── ui-showoff │ │ │ └── ui-showoff..tsx │ │ ├── Partner │ │ │ ├── ArrowCustom.styles.scss │ │ │ ├── Arrow-carousel.tsx │ │ │ ├── Partner.styles.tsx │ │ │ └── Partner.tsx │ │ ├── GetStarted │ │ │ ├── GetStarted.styles.tsx │ │ │ └── GetStarted.tsx │ │ ├── constant │ │ │ └── socket.ts │ │ ├── chatbar │ │ │ ├── scroll.scss │ │ │ ├── ChatBar.styles.tsx │ │ │ └── ChatBar.tsx │ │ ├── chat-box │ │ │ ├── chat-box.styles.ts │ │ │ └── chat-box.tsx │ │ ├── users │ │ │ ├── userList.styles.styles.tsx │ │ │ └── UsersList.tsx │ │ ├── Audio-setting │ │ │ ├── Audio-setting.styles.tsx │ │ │ └── Audio-setting.tsx │ │ ├── Footer │ │ │ ├── Footer.styles.tsx │ │ │ └── Footer.tsx │ │ ├── settings │ │ │ ├── settings.styles.ts │ │ │ ├── sidebar │ │ │ │ └── Setting-sidebar.tsx │ │ │ └── settings.tsx │ │ ├── videoGrid │ │ │ ├── videoGrid.styles.tsx │ │ │ └── videoGrid.tsx │ │ ├── Section-Features │ │ │ ├── SectionFeatures.tsx │ │ │ └── SectionFeatures.styles.ts │ │ ├── Room-video │ │ │ ├── RoomVideo.styles.tsx │ │ │ └── RoomVideo.tsx │ │ ├── review │ │ │ ├── Review.styles.tsx │ │ │ └── Review.tsx │ │ ├── Room-navbar │ │ │ ├── Room-navbar.styles.ts │ │ │ └── Room-navbar.tsx │ │ ├── RoomMenu │ │ │ └── RoomMenu.tsx │ │ ├── Audio-level │ │ │ ├── soundmeters.ts │ │ │ └── Audio-level.tsx │ │ ├── Hero │ │ │ ├── Hero.styles.tsx │ │ │ └── Hero.tsx │ │ ├── Whiteboard │ │ │ └── WhiteBoard.tsx │ │ ├── navbar │ │ │ ├── Navbar.styles.tsx │ │ │ └── navbar.tsx │ │ ├── room-menu-android │ │ │ └── room-menu-android.tsx │ │ └── Feature │ │ │ └── Feature.tsx │ ├── pages │ │ ├── Login │ │ │ ├── Login.styles.ts │ │ │ └── Login.tsx │ │ ├── preparePages │ │ │ ├── canvas.scss │ │ │ ├── prepare.tsx │ │ │ ├── dev │ │ │ │ └── webrtchandler.ts │ │ │ └── canvas-designer-widget.tsx │ │ ├── Landing-Page │ │ │ ├── LandingPage.styles.tsx │ │ │ └── LandingPage.tsx │ │ ├── Room │ │ │ ├── Room.styles.ts │ │ │ └── Room.tsx │ │ ├── Dasboard │ │ │ └── Dasboard.tsx │ │ ├── Register │ │ │ └── Register.tsx │ │ └── signup │ │ │ └── SignUp.tsx │ ├── setupTests.ts │ ├── App.test.tsx │ ├── reportWebVitals.ts │ ├── context │ │ ├── Audio.tsx │ │ ├── chatMessage.tsx │ │ ├── ShareScreenContext.tsx │ │ └── AuthContext.tsx │ ├── private-route │ │ └── PrivateRoute.tsx │ ├── index.tsx │ ├── firebase.tsx │ ├── index.scss │ ├── App.tsx │ ├── logo.svg │ └── room-navbar-mobile │ │ └── room-navbar-mobile.tsx ├── public │ ├── robots.txt │ ├── ui.png │ ├── Hero.png │ ├── WeSee.png │ ├── hero2.png │ ├── login.jpg │ ├── logo1.png │ ├── logo2.png │ ├── logo3.png │ ├── review.jpg │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── register.jpg │ ├── showoff2.png │ ├── logo1 (2).png │ ├── manifest.json │ └── index.html ├── .prettierrc.js ├── craco.config.js ├── tailwind.config.js ├── .gitignore ├── tsconfig.json ├── README.md └── package.json ├── .env ├── firebase.js ├── package.json ├── users.js └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /client/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "react-app" 3 | } -------------------------------------------------------------------------------- /client/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/public/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/ui.png -------------------------------------------------------------------------------- /client/public/Hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/Hero.png -------------------------------------------------------------------------------- /client/public/WeSee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/WeSee.png -------------------------------------------------------------------------------- /client/public/hero2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/hero2.png -------------------------------------------------------------------------------- /client/public/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/login.jpg -------------------------------------------------------------------------------- /client/public/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo1.png -------------------------------------------------------------------------------- /client/public/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo2.png -------------------------------------------------------------------------------- /client/public/logo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo3.png -------------------------------------------------------------------------------- /client/public/review.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/review.jpg -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo192.png -------------------------------------------------------------------------------- /client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo512.png -------------------------------------------------------------------------------- /client/public/register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/register.jpg -------------------------------------------------------------------------------- /client/public/showoff2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/showoff2.png -------------------------------------------------------------------------------- /client/public/logo1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/public/logo1 (2).png -------------------------------------------------------------------------------- /client/src/sounds/enterRoom.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tegar97/WeSee-Free-Web-Video-Conference/HEAD/client/src/sounds/enterRoom.mp3 -------------------------------------------------------------------------------- /client/src/components/ui-showoff/ui-showoff..tsx: -------------------------------------------------------------------------------- 1 | function UiShowOff() { 2 | return
; 3 | } 4 | 5 | export default UiShowOff; 6 | -------------------------------------------------------------------------------- /client/src/pages/Login/Login.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | export const LoginContaiener = styled.div ` 4 | display: grid; 5 | ` -------------------------------------------------------------------------------- /client/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | trailingComma: 'all', 4 | singleQuote: true, 5 | printWidth: 120, 6 | tabWidth: 4, 7 | }; -------------------------------------------------------------------------------- /client/src/components/Partner/ArrowCustom.styles.scss: -------------------------------------------------------------------------------- 1 | .slick-next:before, .slick-prev:before { 2 | font-size: 30px; 3 | line-height: 1; 4 | opacity: .75; 5 | color: #0e78f9; 6 | box-shadow: 0px 4px 50px 1px #0e78f9; 7 | } -------------------------------------------------------------------------------- /client/craco.config.js: -------------------------------------------------------------------------------- 1 | // craco.config.js 2 | module.exports = { 3 | style: { 4 | postcss: { 5 | plugins: [ 6 | require('tailwindcss'), 7 | require('autoprefixer'), 8 | ], 9 | }, 10 | }, 11 | } -------------------------------------------------------------------------------- /client/src/setupTests.ts: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /client/src/App.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render, screen } from '@testing-library/react'; 3 | import App from './App'; 4 | 5 | test('renders learn react link', () => { 6 | render(); 7 | const linkElement = screen.getByText(/learn react/i); 8 | expect(linkElement).toBeInTheDocument(); 9 | }); 10 | -------------------------------------------------------------------------------- /client/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'], 3 | darkMode: false, // or 'media' or 'class' 4 | theme: { 5 | fontFamily: { 6 | body: ['Roboto'], 7 | }, 8 | extend: {}, 9 | }, 10 | variants: { 11 | extend: {}, 12 | }, 13 | plugins: [], 14 | } 15 | -------------------------------------------------------------------------------- /client/src/components/GetStarted/GetStarted.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const QuestionContainer = styled.div` 4 | width: 100%; 5 | height: 20rem; 6 | display: flex; 7 | flex-direction: column; 8 | justify-content: center; 9 | align-items: center; 10 | background-color: #000; 11 | `; 12 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | REACT_APP_FIREBASE_API_KEY=AIzaSyCF3AYJQPwB0ENEjo2MBX0xlZPXcLcAIlE 2 | REACT_APP_FIREBASE_AUTH_DOMAIN=wesee-b9922.firebaseapp.com 3 | REACT_APP_FIREBASE_PROJECT_ID=wesee-b9922 4 | REACT_APP_FIREBASE_STORAGE_BUCKET=wesee-b9922.appspot.com 5 | REACT_APP_FIREBASE_MESSAGING_SENDER_ID=925942977495 6 | REACT_APP_FIREBASE_APP_ID=1:925942977495:web:b58ef7f4edabd27d683192 -------------------------------------------------------------------------------- /client/src/components/constant/socket.ts: -------------------------------------------------------------------------------- 1 | import { io } from 'socket.io-client'; 2 | export const ENDPOINT = process.env.NODE_ENV === 'production' ? 'https://backend.tegar.me/': 'http://localhost:5000/'; 3 | export const ENDPOINT2 ='https://rtcmulticonnection.herokuapp.com:443/' 4 | 5 | export const socket = io(ENDPOINT); 6 | export const socket2 = io(ENDPOINT2); 7 | -------------------------------------------------------------------------------- /client/src/components/chatbar/scroll.scss: -------------------------------------------------------------------------------- 1 | ::-webkit-scrollbar { 2 | width: 10px; 3 | } 4 | 5 | /* Track */ 6 | ::-webkit-scrollbar-track { 7 | background: #f1f1f1; 8 | } 9 | 10 | /* Handle */ 11 | ::-webkit-scrollbar-thumb { 12 | background: #888; 13 | } 14 | 15 | /* Handle on hover */ 16 | ::-webkit-scrollbar-thumb:hover { 17 | background: #b4b4b4; 18 | } -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/src/components/chat-box/chat-box.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | export const ChatBoxContainer = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | padding: .8rem 1rem; 7 | z-index: 124124; 8 | ` 9 | 10 | export const MessageText = styled.div` 11 | width: 100%; 12 | letter-spacing: 0; 13 | float: left; 14 | font-size: 1.1em; 15 | word-wrap: break-word; 16 | ` -------------------------------------------------------------------------------- /client/src/components/Partner/Arrow-carousel.tsx: -------------------------------------------------------------------------------- 1 | import './ArrowCustom.styles.scss'; 2 | 3 | export function SampleNextArrow(props) { 4 | const { className, style, onClick } = props; 5 | return
; 6 | } 7 | 8 | export function SamplePrevArrow(props) { 9 | const { className, style, onClick } = props; 10 | return
; 11 | } 12 | -------------------------------------------------------------------------------- /client/src/reportWebVitals.ts: -------------------------------------------------------------------------------- 1 | import { ReportHandler } from 'web-vitals'; 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { 5 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 6 | getCLS(onPerfEntry); 7 | getFID(onPerfEntry); 8 | getFCP(onPerfEntry); 9 | getLCP(onPerfEntry); 10 | getTTFB(onPerfEntry); 11 | }); 12 | } 13 | }; 14 | 15 | export default reportWebVitals; 16 | -------------------------------------------------------------------------------- /client/src/context/Audio.tsx: -------------------------------------------------------------------------------- 1 | import React, { useContext, useState } from 'react'; 2 | const AudioContext = React.createContext(null); 3 | 4 | export function useAudio() { 5 | return useContext(AudioContext); 6 | } 7 | 8 | export function AudioProvider({ children }) { 9 | const [audioMuted, setAudioMuted] = useState(false); 10 | 11 | const value: any = { 12 | setAudioMuted, 13 | audioMuted, 14 | }; 15 | 16 | return {children}; 17 | } 18 | -------------------------------------------------------------------------------- /client/src/private-route/PrivateRoute.tsx: -------------------------------------------------------------------------------- 1 | import { Route, Redirect } from 'react-router-dom'; 2 | import { useAuth } from '../context/AuthContext'; 3 | 4 | export default function PrivateRoute({ component: Component, ...rest }) { 5 | const { currentUser }: any = useAuth(); 6 | 7 | return ( 8 | { 11 | return currentUser ? : ; 12 | }} 13 | > 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /client/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.scss'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root'), 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /firebase.js: -------------------------------------------------------------------------------- 1 | const firebase = require("firebase/app"); 2 | require("firebase/firestore"); 3 | 4 | const firebaseConfig = { 5 | apiKey: process.env.REACT_APP_FIREBASE_API_KEY, 6 | authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, 7 | projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, 8 | storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, 9 | messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, 10 | appId: process.env.REACT_APP_FIREBASE_APP_ID, 11 | }; 12 | firebase.initializeApp(firebaseConfig); 13 | 14 | module.exports = firebase 15 | -------------------------------------------------------------------------------- /client/src/components/users/userList.styles.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const UserContainer = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | padding: 0.5rem 1rem; 7 | `; 8 | 9 | export const UserProfile = styled.div` 10 | background-color: #0e78f9; 11 | color: #fff; 12 | font-size: 1.5rem; 13 | width: 2.5rem; 14 | height: 2.5rem; 15 | padding: 1rem; 16 | display: flex; 17 | justify-content: center; 18 | align-items: center; 19 | text-transform: uppercase; 20 | border-radius: 10px; 21 | `; 22 | -------------------------------------------------------------------------------- /client/src/pages/preparePages/canvas.scss: -------------------------------------------------------------------------------- 1 | 2 | .whiteboard { 3 | height: 100%; 4 | width: 100%; 5 | position: absolute; 6 | background-color: #fff; 7 | left: 0; 8 | right: 0; 9 | bottom: 0; 10 | top: 0; 11 | } 12 | 13 | .colors { 14 | position: fixed; 15 | } 16 | 17 | .color { 18 | display: inline-block; 19 | height: 48px; 20 | width: 48px; 21 | } 22 | 23 | .color.black { background-color: black; } 24 | .color.red { background-color: red; } 25 | .color.green { background-color: green; } 26 | .color.blue { background-color: blue; } 27 | .color.yellow { background-color: yellow; } -------------------------------------------------------------------------------- /client/src/components/users/UsersList.tsx: -------------------------------------------------------------------------------- 1 | import { UserContainer, UserProfile } from './userList.styles.styles'; 2 | 3 | function Users({ user }) { 4 | return ( 5 | 6 |
7 | 8 | {user.name.substring(0, 1)} 9 | 10 | {user.name} 11 |
12 |
13 | ); 14 | } 15 | 16 | export default Users; 17 | -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Wesee", 3 | "name": "Wesee - Free Video Conference", 4 | "icons": [ 5 | { 6 | "src": "WeSee.png", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "WeSee.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "WeSee.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/src/components/Audio-setting/Audio-setting.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const AudioSettingContainer = styled.div` 4 | padding: 2rem 2rem; 5 | display: flex; 6 | flex-direction: row; 7 | width: 100%; 8 | `; 9 | 10 | export const AudiSettingText = styled.div` 11 | color: #0e78f9; 12 | font-size: 1.1rem; 13 | font-weight: 500; 14 | `; 15 | 16 | export const Select = styled.select` 17 | width: 100%; 18 | background-color: #1c1f2e; 19 | margin-top: 1rem; 20 | color: #fff; 21 | border-bottom: 1px solid #fff; 22 | padding: 0.5rem 0; 23 | `; 24 | -------------------------------------------------------------------------------- /client/src/components/Footer/Footer.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const FooterContaiener = styled.footer` 4 | background-color: #191b28; 5 | width: 100%; 6 | padding: 5rem; 7 | color: #fff; 8 | grid-gap: 40px; 9 | display: flex; 10 | flex-direction: column; 11 | `; 12 | 13 | export const FooterGrid = styled.div` 14 | display: grid; 15 | 16 | grid-template-columns: repeat(6, 1fr); 17 | @media only screen and (max-width: 768px) { 18 | grid-template-columns: repeat(2, 1fr); 19 | text-align: center; 20 | grid-gap: 40px; 21 | } 22 | `; 23 | -------------------------------------------------------------------------------- /client/src/context/chatMessage.tsx: -------------------------------------------------------------------------------- 1 | import React, { useContext, useState } from 'react'; 2 | const MessageContext = React.createContext(null); 3 | 4 | export function useMessage() { 5 | return useContext(MessageContext); 6 | } 7 | 8 | export function MessageProvider({ children }) { 9 | const [message, setMessage] = useState(''); 10 | const [messages, setMessages] = useState([]); 11 | 12 | const value: any = { 13 | message, 14 | messages, 15 | setMessage, 16 | setMessages, 17 | }; 18 | 19 | return {children}; 20 | } 21 | -------------------------------------------------------------------------------- /client/src/components/settings/settings.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | export const SettingNav = styled.div` 4 | display: flex; 5 | flex-direction: row; 6 | justify-content: space-between; 7 | color: #bababa; 8 | border-bottom: .1px solid rgb(186,186,186,.2); 9 | padding: .5rem; 10 | width: 100%; 11 | align-items: center; 12 | ` 13 | 14 | export const SettingSideBar = styled.div` 15 | display: flex; 16 | flex-direction: column; 17 | border-right: .1px solid rgb(186,186,186,.2); 18 | width: 11rem; 19 | height: 96%; 20 | color: #fff; 21 | padding :1rem 0; 22 | font-size: 1.2rem; 23 | 24 | ` -------------------------------------------------------------------------------- /client/src/components/videoGrid/videoGrid.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { FullScreen } from 'react-full-screen'; 3 | 4 | export const VideoContainer = styled.div` 5 | width: var(--width); 6 | height: var(--height); 7 | position: relative; 8 | `; 9 | export const VideoMenu = styled.div` 10 | position: 'absolute'; 11 | background: 'rgba(0,0,0,.8)'; 12 | top: '50%'; 13 | left: '50%'; 14 | right: 'auto'; 15 | bottom: 'auto'; 16 | color: '#fff'; 17 | text-align: 'center'; 18 | `; 19 | 20 | export const FullScreenContainer = styled(FullScreen)` 21 | width: var(--width); 22 | height: var(--height); 23 | position: relative; 24 | `; 25 | -------------------------------------------------------------------------------- /client/src/components/Section-Features/SectionFeatures.tsx: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | import React from 'react'; 3 | import { SectionFeatureContainer } from './SectionFeatures.styles'; 4 | import { useMediaQuery } from 'react-responsive'; 5 | import Feature from '../Feature/Feature'; 6 | import Partner from '../Partner/Partner'; 7 | import Review from '../review/Review'; 8 | 9 | function SectionFeatures() { 10 | const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1224px)' }); 11 | 12 | return ( 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | } 20 | 21 | export default SectionFeatures; 22 | -------------------------------------------------------------------------------- /client/src/components/Room-video/RoomVideo.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const RoomVideoContainer = styled.div` 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | width: 100%; 8 | overflow: none; 9 | `; 10 | export const RoomVideoGrid = styled.div` 11 | display: grid; 12 | grid-template-columns: repeat(2, auto); 13 | 14 | grid-gap: 10px; 15 | `; 16 | 17 | export const Video = styled.video` 18 | object-fit: cover; 19 | object-position: center; 20 | 21 | width: 100%; 22 | height: auto; 23 | `; 24 | export const VideoChild = styled.video` 25 | object-fit: cover; 26 | object-position: center; 27 | 28 | width: 100%; 29 | height: 150px; 30 | `; 31 | -------------------------------------------------------------------------------- /client/src/firebase.tsx: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase'; 2 | import 'firebase/auth'; 3 | 4 | const config = { 5 | apiKey: process.env.REACT_APP_FIREBASE_API_KEY, 6 | authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, 7 | projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, 8 | storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, 9 | messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, 10 | appId: process.env.REACT_APP_FIREBASE_APP_ID, 11 | }; 12 | 13 | firebase.initializeApp(config); 14 | 15 | export const auth = firebase.auth(); 16 | export const googleProvider = new firebase.auth.GoogleAuthProvider(); 17 | export const facebookProvider = new firebase.auth.FacebookAuthProvider(); 18 | 19 | export default firebase; 20 | -------------------------------------------------------------------------------- /client/src/components/review/Review.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ReviewContainer = styled.div` 4 | display: grid; 5 | grid-template-columns: 1fr 1fr; 6 | margin-top: 1rem; 7 | color: #fff; 8 | 9 | @media only screen and (max-width: 768px) { 10 | grid-template-columns: 1fr; 11 | } 12 | `; 13 | 14 | export const ReviewText = styled.div` 15 | display: flex; 16 | flex-direction: column; 17 | justify-content: flex-start; 18 | padding: 3rem; 19 | justify-content: center; 20 | `; 21 | 22 | export const ReviewLogoContainer = styled.div` 23 | width: 40%; 24 | @media only screen and (max-width: 768px) { 25 | align-self: center; 26 | } 27 | `; 28 | export const ReviewLogo = styled.img` 29 | max-width: 100%; 30 | `; 31 | -------------------------------------------------------------------------------- /client/src/pages/preparePages/prepare.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { useEffect } from 'react'; 3 | function Prepare() { 4 | useEffect(() => { 5 | var designer = new CanvasDesigner(); 6 | const getBoard = document.getElementById('board'); 7 | designer.addSyncListener(function (data) { 8 | designer.send(JSON.stringify(data)); 9 | }); 10 | 11 | // both links are mandatory 12 | // widget.html will internally use widget.js 13 | designer.widgetHtmlURL = 'https://www.webrtc-experiment.com/Canvas-Designer/widget.html'; // you can place this file anywhere 14 | designer.widgetJsURL = 'https://www.webrtc-experiment.com/Canvas-Designer/widget.js'; 15 | designer.appendTo(getBoard); 16 | }); 17 | 18 | return
; 19 | } 20 | 21 | export default Prepare; 22 | -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": false, 14 | "forceConsistentCasingInFileNames": true, 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "isolatedModules": true, 18 | "resolveJsonModule": true, 19 | "noEmit": true, 20 | "jsx": "react-jsx", 21 | "sourceMap": true, 22 | "declaration": true, 23 | "noUnusedLocals": true, 24 | "noUnusedParameters": true, 25 | "incremental": true, 26 | "noFallthroughCasesInSwitch": true 27 | }, 28 | "include": [ 29 | "src/**/*" 30 | ], 31 | "exclude": [ 32 | "node_modules", 33 | "build" 34 | ] 35 | } -------------------------------------------------------------------------------- /client/src/components/GetStarted/GetStarted.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Reveal, Tween } from 'react-gsap'; 3 | import { HeroButton } from '../Hero/Hero.styles'; 4 | import { FeatureText } from '../Section-Features/SectionFeatures.styles'; 5 | import { QuestionContainer } from './GetStarted.styles'; 6 | 7 | function GetStarted() { 8 | return ( 9 | 10 | 11 | 12 | Get started with Wesee for free! 13 |
14 | Get Started 15 |
16 |
17 |
18 |
19 | ); 20 | } 21 | 22 | export default GetStarted; 23 | -------------------------------------------------------------------------------- /client/src/context/ShareScreenContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { useContext, useState, useRef } from 'react'; 2 | import { socket } from '../components/constant/socket'; 3 | const ShareScreenContext = React.createContext(null); 4 | 5 | export function useShareScreen() { 6 | return useContext(ShareScreenContext); 7 | } 8 | 9 | export function ShareScreenProvider({ children }) { 10 | const [isShareScreen, setIsShareScreen] = useState(false); 11 | const videoShareScreenRef = useRef(); 12 | 13 | React.useEffect(() => { 14 | socket.on('isShareScreenActive', (isShareScreenActive) => { 15 | setIsShareScreen(isShareScreenActive); 16 | }); 17 | }, []); 18 | 19 | const value: any = { 20 | isShareScreen, 21 | setIsShareScreen, 22 | videoShareScreenRef, 23 | }; 24 | 25 | return {children}; 26 | } 27 | -------------------------------------------------------------------------------- /client/src/components/Room-navbar/Room-navbar.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | export const RoomNavbarContainer = styled.div` 4 | display: flex; 5 | width: 100%; 6 | flex-direction: row; 7 | justify-content: space-between; 8 | position: absolute; 9 | bottom: 0; 10 | padding: 1rem 8rem; 11 | background-color: #1C1F2E; 12 | z-index: 1000; 13 | transition: .8s all; 14 | 15 | 16 | ` 17 | 18 | export const RoomNavbarItems = styled.div` 19 | display: flex; 20 | justify-content: center; 21 | align-items : center; 22 | border-radius: 100%; 23 | width: 50px; 24 | height: 50px; 25 | border: 1px solid rgba(255,255,255,.1); 26 | transition: all .5s; 27 | cursor: pointer; 28 | &:hover{ 29 | border: none; 30 | 31 | box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 32 | -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 33 | -moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 34 | } 35 | 36 | 37 | ` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wesee", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon server.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/tegar97/WeSee-Free-Web-Video-Conference.git" 13 | }, 14 | "keywords": [], 15 | "author": "", 16 | "license": "ISC", 17 | "dependencies": { 18 | "canvas-designer": "^1.3.0", 19 | "cors": "^2.8.5", 20 | "dotenv": "^8.2.0", 21 | "express": "^4.17.1", 22 | "firebase": "^8.2.7", 23 | "nodemon": "^2.0.7", 24 | "react-draggable": "^4.4.3", 25 | "react-resize-panel": "^0.3.5", 26 | "react-responsive": "^8.2.0", 27 | "socket.io": "^3.1.0" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/tegar97/WeSee-Free-Web-Video-Conference/issues" 31 | }, 32 | "homepage": "https://github.com/tegar97/WeSee-Free-Web-Video-Conference#readme" 33 | } 34 | -------------------------------------------------------------------------------- /client/src/components/chatbar/ChatBar.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ChatBarContainer = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | height: 100%; 7 | overflow: auto; 8 | `; 9 | 10 | export const ChatInput = styled.input` 11 | padding: 1rem; 12 | border-radius: 5px; 13 | color: #b4b4b4; 14 | width: 100%; 15 | background-color: rgb(33, 36, 50, 0.75); 16 | 17 | &:focus { 18 | outline: none; 19 | } 20 | `; 21 | 22 | export const ChatMessage = styled.div` 23 | width: 100%; 24 | height: 100%; 25 | overflow: auto; 26 | position: absolute; 27 | &:-webkit-scrollbar { 28 | width: 10px; 29 | } 30 | 31 | /* Track */ 32 | &::-webkit-scrollbar-track { 33 | background: #f1f1f1; 34 | } 35 | 36 | /* Handle */ 37 | &::-webkit-scrollbar-thumb { 38 | background: #b4b4b4; 39 | } 40 | 41 | /* Handle on hover */ 42 | &::-webkit-scrollbar-thumb:hover { 43 | background: #b4b4b4; 44 | } 45 | `; 46 | -------------------------------------------------------------------------------- /users.js: -------------------------------------------------------------------------------- 1 | const users = []; 2 | const firebase = require('./firebase') 3 | const db = firebase.firestore(); 4 | 5 | const addUser = ({id , name,room}) => { 6 | name = name.trim().toLowerCase(); 7 | 8 | const existingUsers = users.find(user => user.room & users.name ===name) 9 | if(existingUsers) { 10 | return {error : 'Username is taken'} 11 | } 12 | 13 | 14 | const user = {id,name,room} 15 | 16 | users.push(user); 17 | // try { 18 | // db.collection('room').doc(`${room}`).add({users}) 19 | 20 | // } catch (error) { 21 | // console.log(error) 22 | // } 23 | return {user} 24 | } 25 | 26 | const removeUser = (id) => { 27 | const index = users.findIndex((user) => user.id === id); 28 | if(index !== -1) { 29 | return users.splice(index,1)[0] 30 | } 31 | 32 | 33 | } 34 | 35 | const getUser = (id) => users.find(user => user.id === id); 36 | 37 | const getUsersinRoom = (room) => users.filter(user => user.room === room); 38 | 39 | module.exports = {addUser, removeUser,getUser,getUsersinRoom} -------------------------------------------------------------------------------- /client/src/pages/Landing-Page/LandingPage.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled, { keyframes } from 'styled-components'; 2 | 3 | export const LandingPageContainer = styled.div` 4 | font-family: 'Inter', sans-serif; 5 | `; 6 | const bounce = keyframes` 7 | from { 8 | transform: translateY(0px); 9 | 10 | } 11 | to { 12 | transform: translateY(-8px); 13 | filter: drop-shadow(0px 5px 40px #0E78F9) 14 | } 15 | } 16 | @-webkit-keyframes bounce { 17 | from { 18 | transform: translateY(0px); 19 | } 20 | to { 21 | transform: translateY(-15px); 22 | } 23 | `; 24 | 25 | export const ImageShowContainer = styled.div` 26 | margin-top: '-30rem'; 27 | z-index: 1002; 28 | filter: 'drop-shadow(0px 5px 50px #0E78F9)'; 29 | position: absolute; 30 | animation: ${bounce} 1.5s infinite alternate; 31 | `; 32 | 33 | export const SectionAboutService = styled.section` 34 | background-color: #000; 35 | 36 | width: 100%; 37 | clip-path: polygon(0 0, 100% 14%, 100% 100%, 0 82%); 38 | height: 140rem; 39 | padding: 5rem 2rem; 40 | margin-top: -20rem; 41 | `; 42 | -------------------------------------------------------------------------------- /client/src/components/settings/sidebar/Setting-sidebar.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { SettingSideBar as SettingSideBarContainer } from './../settings.styles'; 3 | function SettingSideBar() { 4 | return ( 5 | 6 |
    7 |
  • 8 |
    21 | 22 |

    Settings

    23 |
    24 |
  • 25 |
26 |
27 | ); 28 | } 29 | 30 | export default SettingSideBar; 31 | -------------------------------------------------------------------------------- /client/src/pages/Room/Room.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | 4 | export const RoomContainer = styled.div` 5 | background-color : #191B28; 6 | display: flex; 7 | height: 100vh; 8 | 9 | width: 100%; 10 | 11 | 12 | ` 13 | 14 | export const RoomChatAndUsers = styled.div` 15 | 16 | position: absolute; 17 | z-index: 124; 18 | display: flex; 19 | 20 | right: 0; 21 | background-color: #1C1F2E; 22 | 23 | ` 24 | 25 | export const RoomChatAndUsersItems = styled.div` 26 | width: 4rem; 27 | height: 3.5rem; 28 | display: flex; 29 | align-items: center; 30 | justify-content: center; 31 | position: relative; 32 | box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 33 | -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 34 | -moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); 35 | cursor: pointer; 36 | 37 | ` 38 | 39 | export const ItemExtends = styled.div` 40 | position: absolute; 41 | 42 | top: .6rem; 43 | right: .6rem; 44 | background-color: #0E78F9; 45 | border-radius: 100%; 46 | display: flex; 47 | justify-content: center; 48 | align-items: center; 49 | color:#fff; 50 | width: 1.5rem; 51 | height: 1rem; 52 | cursor: pointer; 53 | 54 | ` -------------------------------------------------------------------------------- /client/src/components/review/Review.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ReviewContainer, ReviewText, ReviewLogo, ReviewLogoContainer } from './Review.styles'; 3 | import ScrollAnimation from 'react-animate-on-scroll'; 4 | 5 | function Review() { 6 | return ( 7 | 8 | 9 |
10 | review 1 11 |
12 | 13 | 14 | 15 | 16 |
17 | "For 50 years, WWF has been protecting the future of nature. The world's leading conservation 18 | organization, WWF works in 100 countries and is supported by 1.2 million members in the United 19 | States and close to 5 million globally." 20 |
21 | Jessica - company.com 22 |
23 |
24 |
25 | ); 26 | } 27 | 28 | export default Review; 29 | -------------------------------------------------------------------------------- /client/src/components/chat-box/chat-box.tsx: -------------------------------------------------------------------------------- 1 | import { ChatBoxContainer, MessageText } from './chat-box.styles'; 2 | function ChatBox({ message }) { 3 | return ( 4 | <> 5 | {message.user === 'system' ? ( 6 | '' 7 | ) : ( 8 | 9 |
10 |

11 | {message.user} 12 |

13 |
14 | 15 |
27 | {message.text} 28 |
29 |
30 | )} 31 | 32 | ); 33 | } 34 | 35 | export default ChatBox; 36 | -------------------------------------------------------------------------------- /client/src/components/Partner/Partner.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const PartnerSection = styled.section` 4 | margin-top: 16rem; 5 | 6 | @media only screen and (max-width: 768px) { 7 | margin-top: 30rem; 8 | } 9 | `; 10 | export const LogoArea = styled.div` 11 | width: 70%; 12 | text-align: center; 13 | margin: 8rem auto; 14 | `; 15 | 16 | export const LogoContainer = styled.div` 17 | width: 100%; 18 | background-color: #1e1e1e; 19 | border: 5px; 20 | display: flex; 21 | flex-direction: row; 22 | justify-content: center; 23 | align-items: center; 24 | margin: 0; 25 | padding: 1rem; 26 | /* box-shadow: 0px 10px 50px 0px #0e78f9; */ 27 | outline: none; 28 | transition: 0.8s all; 29 | &:hover { 30 | -moz-transform: scale(0.8) skew(-13deg, 0deg); 31 | -webkit-transform: scale(0.8) skew(-13deg, 0deg); 32 | -o-transform: scale(0.8) skew(-13deg, 0deg); 33 | -ms-transform: scale(0.8) skew(-13deg, 0deg); 34 | transform: scale(0.8) skew(-13deg, 0deg); 35 | box-shadow: 0px 10px 50px 0px #0e78f9; 36 | } 37 | `; 38 | 39 | export const LogoImage = styled.img` 40 | width: 100%; 41 | height: 100%; 42 | 43 | /* box-shadow: 0px 0px 50px 0px #0e78f9; */ 44 | 45 | /* box-shadow: 0px 4px 50px 1px #0e78f9; 46 | background: transparent; ; */ 47 | `; 48 | -------------------------------------------------------------------------------- /client/src/components/RoomMenu/RoomMenu.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import Draggable from 'react-draggable'; 4 | import styled from 'styled-components'; 5 | import ResizePanel from 'react-resize-panel'; 6 | 7 | const RoomMenuContainer = styled.div` 8 | width: 30rem; 9 | height: 30rem; 10 | background-color: #1c1f2e; 11 | position: absolute; 12 | z-index: 101241240; 13 | @media only screen and (max-width: 768px) { 14 | width: 100%; 15 | height: 100%; 16 | z-index: 10000; 17 | } 18 | `; 19 | 20 | const RoomMenuNavbar = styled.div` 21 | padding: 0.9rem 1.1rem; 22 | background-color: rgb(33, 36, 50, 0.75); 23 | color: #bababa; 24 | display: flex; 25 | flex-direction: row; 26 | 27 | align-items: center; 28 | justify-content: space-between; 29 | `; 30 | const RoomMenu = ({ children, setRoomMenu, icon, title }) => { 31 | return ( 32 | 33 | 34 |
35 | 36 | {title} 37 |
38 | 41 |
42 | {children} 43 |
44 | ); 45 | }; 46 | 47 | export default RoomMenu; 48 | -------------------------------------------------------------------------------- /client/src/index.scss: -------------------------------------------------------------------------------- 1 | /* ./src/index.css */ 2 | @tailwind base; 3 | @tailwind components; 4 | @tailwind utilities; 5 | 6 | 7 | #gallery { 8 | display: flex; 9 | justify-content: center; 10 | flex-wrap: wrap; 11 | max-width: calc(var(--width) * var(--cols)); 12 | align-items: center; 13 | } 14 | .galleryPin { 15 | display: flex; 16 | justify-content: center; 17 | flex-wrap: wrap; 18 | max-width: 100%; 19 | align-items: center; 20 | } 21 | 22 | .video-container { 23 | width: var(--width); 24 | height: var(--height); 25 | position: relative; 26 | 27 | } 28 | 29 | .video-container:hover > div{ 30 | display: block !important 31 | } 32 | 33 | #pin { 34 | width: 80vw !important; 35 | height: 80vh !important; 36 | position: relative; 37 | 38 | } 39 | 40 | video { 41 | height: 100%; 42 | width: 100%; 43 | } 44 | .slick-slide { 45 | padding: 0 8px; 46 | box-sizing: border-box; 47 | } 48 | .slider-arrow { 49 | position: absolute; 50 | z-index: 1; 51 | height: 100%; 52 | width: 100%; 53 | background-color: none; 54 | } 55 | 56 | .arrow-btn { 57 | top: 45%; 58 | } 59 | .next { 60 | float: right; 61 | } 62 | 63 | .review-slider{ 64 | display: flex; 65 | justify-content: flex-start; 66 | align-items: flex-start; 67 | flex-direction: column; 68 | } 69 | 70 | .active{ 71 | color: #0e78f9 72 | } 73 | 74 | .react-tooltip-lite, .react-tooltip-lite-arrow { 75 | z-index: 124124124124 !important; 76 | } -------------------------------------------------------------------------------- /client/src/pages/Dasboard/Dasboard.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react'; 2 | import { useAuth } from '../../context/AuthContext'; 3 | import { v4 as uuidv4 } from 'uuid'; 4 | import firebase from '../../firebase'; 5 | import { useHistory } from 'react-router-dom'; 6 | 7 | const Dasboard: React.FC = () => { 8 | let history = useHistory(); 9 | 10 | const { currentUser }: any = useAuth(); 11 | const joinRoomRef: any = useRef(); 12 | const db = firebase.firestore(); 13 | function makeid(length) { 14 | var result = ''; 15 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 16 | var charactersLength = characters.length; 17 | for (var i = 0; i < length; i++) { 18 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 19 | } 20 | return result; 21 | } 22 | 23 | const CreateRoom = async () => { 24 | await db.collection('room').add({ roomId: uuidv4(), code: makeid(5), users: [currentUser.displayName] }); 25 | }; 26 | const joinRoom = async () => { 27 | const usersCollection = db.collection('room'); 28 | usersCollection 29 | .where('code', '==', joinRoomRef.current.value) 30 | .get() 31 | .then(function (querySnapshot) { 32 | querySnapshot.forEach(function (doc) { 33 | history.push(`/room/${doc.data().roomId}`); 34 | }); 35 | }) 36 | .catch(function (error) { 37 | console.log('Error getting documents: ', error); 38 | }); 39 | }; 40 | 41 | return ( 42 |
43 | 44 | 45 |

JOIN ROOM

46 | 47 | 48 |
49 | ); 50 | }; 51 | 52 | export default Dasboard; 53 | -------------------------------------------------------------------------------- /client/src/components/Room-video/RoomVideo.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { useEffect } from 'react'; 3 | import Draggable from 'react-draggable'; 4 | import { useAuth } from '../../context/AuthContext'; 5 | import ChatBar from '../chatbar/ChatBar'; 6 | import { socket } from '../constant/socket'; 7 | import RoomMenu from '../RoomMenu/RoomMenu'; 8 | import Users from '../users/UsersList'; 9 | import VideoGrid from '../videoGrid/videoGrid'; 10 | import { RoomVideoContainer } from './RoomVideo.styles'; 11 | const RoomVideo = ({ 12 | userVideo, 13 | peers, 14 | stream, 15 | roomMenu, 16 | setRoomMenu, 17 | menuUser, 18 | setUserMenu, 19 | handleShareScreen, 20 | peersRef, 21 | }) => { 22 | const { users, setUsers } = useAuth(); 23 | useEffect(() => { 24 | socket.on('roomData', ({ users }) => { 25 | setUsers(users); 26 | }); 27 | }, []); 28 | 29 | console.log('users', users); 30 | console.log('peerss', peers); 31 | return ( 32 | 33 | {roomMenu ? ( 34 | 35 | 36 | 37 | ) : ( 38 | '' 39 | )} 40 | {menuUser ? ( 41 | 42 | {users.map((user) => ( 43 | 44 | ))} 45 | 46 | ) : ( 47 | '' 48 | )} 49 | 50 | 57 | 58 | ); 59 | }; 60 | 61 | export default RoomVideo; 62 | -------------------------------------------------------------------------------- /client/src/context/AuthContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useContext, useEffect } from 'react'; 2 | 3 | import { auth, googleProvider, facebookProvider } from '../firebase'; 4 | 5 | const AuthContext = React.createContext(null); 6 | export function useAuth() { 7 | return useContext(AuthContext); 8 | } 9 | export function AuthProvider({ children }: any) { 10 | const [currentUser, setCurrentUser]: any = useState(''); 11 | const [users, setUsers] = useState({}); 12 | const [loading, setLoading] = useState(true); 13 | const [pin, setPin] = useState(false); 14 | 15 | function signUp(email: any, password: any) { 16 | return auth.createUserWithEmailAndPassword(email, password); 17 | } 18 | function login(email: string, password: string) { 19 | return auth.signInWithEmailAndPassword(email, password); 20 | } 21 | function logout() { 22 | return auth.signOut(); 23 | } 24 | function updateName(displayName) { 25 | return currentUser.updateProfile({ displayName }); 26 | } 27 | function resetPassword(email: string) { 28 | return auth.sendPasswordResetEmail(email); 29 | } 30 | function GoogleAuth() { 31 | return auth.signInWithPopup(googleProvider); 32 | } 33 | function FacebookAuth() { 34 | return auth.signInWithPopup(facebookProvider); 35 | } 36 | 37 | useEffect(() => { 38 | const unsubcriber = auth.onAuthStateChanged((user: any) => { 39 | setCurrentUser(user); 40 | setLoading(false); 41 | }); 42 | return unsubcriber; 43 | }, []); 44 | 45 | const value: any = { 46 | currentUser, 47 | signUp, 48 | login, 49 | logout, 50 | resetPassword, 51 | updateName, 52 | GoogleAuth, 53 | users, 54 | setUsers, 55 | pin, 56 | setPin, 57 | FacebookAuth, 58 | }; 59 | 60 | return {!loading && children}; 61 | } 62 | -------------------------------------------------------------------------------- /client/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { Suspense } from 'react'; 2 | import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'; 3 | import ReactTooltip from 'react-tooltip'; 4 | import { AuthProvider } from './context/AuthContext'; 5 | import { MessageProvider } from './context/chatMessage'; 6 | import LandingPage from './pages/Landing-Page/LandingPage'; 7 | import Prepare from './pages/preparePages/prepare'; 8 | 9 | import PrivateRoute from './private-route/PrivateRoute'; 10 | 11 | const App: React.FC = () => { 12 | const Room = React.lazy(() => import('./pages/Room/Room')); 13 | const Signin = React.lazy(() => import('./pages/Login/Login')); 14 | const SignUp = React.lazy(() => import('./pages/signup/SignUp')); 15 | 16 | return ( 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 |

LOADING .......

30 |
31 | } 32 | > 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ); 44 | }; 45 | 46 | export default App; 47 | -------------------------------------------------------------------------------- /client/src/components/Audio-level/soundmeters.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | /* 3 | * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 4 | * 5 | * Use of this source code is governed by a BSD-style license 6 | * that can be found in the LICENSE file in the root of the source 7 | * tree. 8 | */ 9 | 10 | 11 | // Meter class that generates a number correlated to audio volume. 12 | // The meter class itself displays nothing, but it makes the 13 | // instantaneous and time-decaying volumes available for inspection. 14 | // It also reports on the fraction of samples that were at or near 15 | // the top of the measurement range. 16 | export function SoundMeter(context) { 17 | this.context = context; 18 | this.instant = 0.0; 19 | this.slow = 0.0; 20 | this.clip = 0.0; 21 | this.script = context.createScriptProcessor(2048, 1, 1); 22 | const that = this; 23 | this.script.onaudioprocess = function(event) { 24 | const input = event.inputBuffer.getChannelData(0); 25 | let i; 26 | let sum = 0.0; 27 | let clipcount = 0; 28 | for (i = 0; i < input.length; ++i) { 29 | sum += input[i] * input[i]; 30 | if (Math.abs(input[i]) > 0.99) { 31 | clipcount += 1; 32 | } 33 | } 34 | that.instant = Math.sqrt(sum / input.length); 35 | that.slow = 0.95 * that.slow + 0.05 * that.instant; 36 | that.clip = clipcount / input.length; 37 | }; 38 | } 39 | 40 | SoundMeter.prototype.connectToSource = function(stream, callback) { 41 | console.log('SoundMeter connecting'); 42 | try { 43 | this.mic = this.context.createMediaStreamSource(stream); 44 | this.mic.connect(this.script); 45 | // necessary to make sample run, but should not be. 46 | this.script.connect(this.context.destination); 47 | if (typeof callback !== 'undefined') { 48 | callback(null); 49 | } 50 | } catch (e) { 51 | console.error(e); 52 | if (typeof callback !== 'undefined') { 53 | callback(e); 54 | } 55 | } 56 | }; 57 | 58 | SoundMeter.prototype.stop = function() { 59 | this.mic.disconnect(); 60 | this.script.disconnect(); 61 | }; -------------------------------------------------------------------------------- /client/src/components/Hero/Hero.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const HeroHeader = styled.div` 4 | padding: 3rem; 5 | margin-top: 6.6rem; 6 | 7 | @media only screen and (max-width: 768px) { 8 | margin-top: 4rem; 9 | } 10 | `; 11 | 12 | export const HeroHeaderMainText = styled.h1` 13 | color: #0e78f9; 14 | font-weight: 800; 15 | font-size: 2.5rem; 16 | @media only screen and (max-width: 768px) { 17 | font-size: 2.1rem; 18 | } 19 | `; 20 | 21 | export const HeroHeaderPrimaryText = styled.p` 22 | font-size: 1.45rem; 23 | color: #9ea6b8; 24 | word-wrap: break-word; 25 | line-height: 1.8; 26 | opacity: 60%; 27 | @media only screen and (max-width: 768px) { 28 | font-size: 1.3rem; 29 | } 30 | `; 31 | 32 | export const HeroButton = styled.button` 33 | display: flex; 34 | justify-content: center; 35 | align-items: center; 36 | border-radius: 7px; 37 | width: 8rem; 38 | height: 50px; 39 | background-color: #0e78f9; 40 | color: #fff; 41 | `; 42 | 43 | export const HeroImageContainer = styled.div` 44 | width: 100%; 45 | padding: 0; 46 | 47 | @media only screen and (max-width: 1224px) { 48 | } 49 | `; 50 | 51 | export const RoomCodeInput = styled.input` 52 | background-color: transparent; 53 | border: 0.5px solid rgba(14, 120, 249, 0.3); 54 | padding: 0.1rem 0 0 2.3rem; 55 | height: 50px; 56 | width: 245px; 57 | outline: none; 58 | transition: 0.5s all; 59 | &:focus { 60 | border: 1px solid rgba(14, 120, 249, 1); 61 | } 62 | @media only screen and (max-width: 768px) { 63 | width: 200px; 64 | } 65 | `; 66 | 67 | export const KeyboardInput = styled.i` 68 | position: absolute; 69 | color: #0e78f9; 70 | left: 30px; 71 | `; 72 | 73 | export const HeroContainer = styled.section` 74 | height: 80rem; 75 | width: 100%; 76 | display: grid; 77 | grid-template-columns: 1.2fr 1fr; 78 | background-color: #191b28; 79 | color: #fff; 80 | @media only screen and (max-width: 1224px) { 81 | display: flex; 82 | flex-direction: column; 83 | 84 | height: 60rem; 85 | } 86 | `; 87 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `yarn start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 13 | 14 | The page will reload if you make edits.\ 15 | You will also see any lint errors in the console. 16 | 17 | ### `yarn test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `yarn build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `yarn eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 35 | 36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 39 | 40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | -------------------------------------------------------------------------------- /client/src/components/chatbar/ChatBar.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react'; 2 | import { useMessage } from '../../context/chatMessage'; 3 | import ChatBox from '../chat-box/chat-box'; 4 | import { socket } from '../constant/socket'; 5 | import { ChatBarContainer, ChatInput, ChatMessage } from './ChatBar.styles'; 6 | import './scroll.scss'; 7 | import ScrollToBottom from 'react-scroll-to-bottom'; 8 | 9 | const ChatBar = () => { 10 | const messageRef = useRef(null); 11 | const { messages }: any = useMessage(); 12 | const sendMessage = (event) => { 13 | event.preventDefault(); 14 | 15 | if (messageRef.current.value) { 16 | socket.emit('sendMessage', messageRef.current.value, () => (messageRef.current.value = '')); 17 | } 18 | }; 19 | 20 | return ( 21 | 22 |
23 | 24 | 25 | {messages.map((message, i) => ( 26 | 27 | ))} 28 | 29 | 30 |
31 | 32 | 49 | 50 |
51 |
52 | ); 53 | }; 54 | 55 | export default ChatBar; 56 | -------------------------------------------------------------------------------- /client/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/components/Footer/Footer.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FooterContaiener, FooterGrid } from './Footer.styles'; 3 | 4 | function Footer() { 5 | return ( 6 | 7 | 8 |
9 | logo 1 10 |

11 | Wesee is is a video call service that ensures everyone can be connected with just one click 12 |

13 |
14 |
15 | Link 16 |
    17 |
  • About
  • 18 |
  • Feature
  • 19 |
  • Review
  • 20 |
21 |
22 |
23 | Service 24 |
    25 |
  • About
  • 26 |
  • Feature
  • 27 |
  • Review
  • 28 |
29 |
30 |
31 | Contact 32 |
    33 |
  • About
  • 34 |
  • Feature
  • 35 |
  • Review
  • 36 |
37 |
38 |
39 | Assets 40 | 48 |
49 |
50 |
51 | © 2020 Wesee. All rights reserved 52 |
53 |
54 | ); 55 | } 56 | 57 | export default Footer; 58 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@craco/craco": "^6.1.0", 7 | "@tailwindcss/postcss7-compat": "^2.0.2", 8 | "@tensorflow-models/body-pix": "^2.0.5", 9 | "@tensorflow/tfjs": "^3.0.0", 10 | "@testing-library/jest-dom": "^5.11.4", 11 | "@testing-library/react": "^11.1.0", 12 | "@testing-library/user-event": "^12.1.10", 13 | "@types/jest": "^26.0.15", 14 | "@types/node": "^12.0.0", 15 | "@types/react": "^16.9.53", 16 | "@types/react-dom": "^16.9.8", 17 | "@types/react-router-dom": "^5.1.7", 18 | "@types/styled-components": "^5.1.7", 19 | "autoprefixer": "^9.8.6", 20 | "canvas-free-drawing": "^2.1.0", 21 | "firebase": "^8.2.5", 22 | "gsap": "^3.6.0", 23 | "hark": "^1.2.3", 24 | "howler": "^2.2.1", 25 | "lodash": "^4.17.20", 26 | "node-sass": "4.14.1", 27 | "postcss": "^7.0.35", 28 | "react": "^17.0.1", 29 | "react-animate-on-scroll": "^2.1.5", 30 | "react-dom": "^17.0.1", 31 | "react-full-screen": "^0.3.2-0", 32 | "react-gsap": "^2.2.1", 33 | "react-media": "^1.10.0", 34 | "react-modal": "^3.12.1=", 35 | "react-router-dom": "^5.2.0", 36 | "react-scripts": "4.0.1", 37 | "react-scroll": "^1.8.1", 38 | "react-scroll-to-bottom": "^4.1.0", 39 | "react-slick": "^0.28.0", 40 | "react-tabs": "^3.1.2", 41 | "react-toastify": "^7.0.3", 42 | "react-tooltip": "^4.2.13", 43 | "simple-peer": "^9.9.3", 44 | "slick-carousel": "^1.8.1", 45 | "socket.io-client": "^3.1.0", 46 | "styled-components": "^5.2.1", 47 | "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2", 48 | "typescript": "^4.0.3", 49 | "uuid": "^8.3.2", 50 | "web-vitals": "^0.2.4" 51 | }, 52 | "scripts": { 53 | "start": "craco start", 54 | "build": "craco build", 55 | "test": "craco test", 56 | "eject": "react-scripts eject" 57 | }, 58 | "eslintConfig": { 59 | "extends": [ 60 | "react-app", 61 | "react-app/jest" 62 | ] 63 | }, 64 | "browserslist": { 65 | "production": [ 66 | ">0.2%", 67 | "not dead", 68 | "not op_mini all" 69 | ], 70 | "development": [ 71 | "last 1 chrome version", 72 | "last 1 firefox version", 73 | "last 1 safari version" 74 | ] 75 | }, 76 | "devDependencies": { 77 | "@typescript-eslint/eslint-plugin": "^4.14.1", 78 | "@typescript-eslint/parser": "^4.14.1", 79 | "eslint": "^7.19.0", 80 | "eslint-config-prettier": "^7.2.0", 81 | "eslint-plugin-prettier": "^3.3.1", 82 | "eslint-plugin-react": "^7.22.0", 83 | "prettier": "^2.2.1" 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /client/src/pages/preparePages/dev/webrtchandler.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | export var webrtcHandler = { 3 | createOffer: function (callback) { 4 | var captureStream = document.getElementById('main-canvas').captureStream(); 5 | var peer = this.getPeer(); 6 | 7 | captureStream.getTracks().forEach(function (track) { 8 | peer.addTrack(track, captureStream); 9 | }); 10 | 11 | peer.onicecandidate = function (event) { 12 | if (!event || !!event.candidate) { 13 | return; 14 | } 15 | 16 | callback({ 17 | sdp: peer.localDescription.sdp, 18 | type: peer.localDescription.type, 19 | }); 20 | }; 21 | peer.createOffer({ 22 | OfferToReceiveAudio: false, 23 | OfferToReceiveVideo: false, 24 | }).then(function (sdp) { 25 | peer.setLocalDescription(sdp); 26 | }); 27 | }, 28 | setRemoteDescription: function (sdp) { 29 | this.peer.setRemoteDescription(new RTCSessionDescription(sdp)).then(function () { 30 | if (typeof setTemporaryLine === 'function') { 31 | setTemporaryLine(); 32 | } 33 | }); 34 | }, 35 | createAnswer: function (sdp, callback) { 36 | var peer = this.getPeer(); 37 | peer.onicecandidate = function (event) { 38 | if (!event || !!event.candidate) { 39 | return; 40 | } 41 | 42 | callback({ 43 | sdp: peer.localDescription.sdp, 44 | type: peer.localDescription.type, 45 | }); 46 | }; 47 | this.peer.setRemoteDescription(new RTCSessionDescription(sdp)).then(function () { 48 | peer.createAnswer({ 49 | OfferToReceiveAudio: false, 50 | OfferToReceiveVideo: true, 51 | }).then(function (sdp) { 52 | peer.setLocalDescription(sdp); 53 | }); 54 | }); 55 | 56 | peer.ontrack = function (event) { 57 | callback({ 58 | stream: event.streams[0], 59 | }); 60 | }; 61 | }, 62 | getPeer: function () { 63 | var WebRTC_Native_Peer = 64 | window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; 65 | var RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription; 66 | var RTCIceCandidate = window.RTCIceCandidate || window.mozRTCIceCandidate; 67 | 68 | var peer = new WebRTC_Native_Peer(null); 69 | this.peer = peer; 70 | return peer; 71 | }, 72 | }; 73 | -------------------------------------------------------------------------------- /client/src/components/settings/settings.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { useState, useEffect } from 'react'; 4 | import Draggable from 'react-draggable'; 5 | import Modal from 'react-modal'; 6 | import { SettingNav } from './settings.styles'; 7 | import SettingSideBar from './sidebar/Setting-sidebar'; 8 | import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; 9 | import Prepare from '../../pages/preparePages/prepare'; 10 | import AudioSetting from '../Audio-setting/Audio-setting'; 11 | 12 | const SettingApp = ({ stream, peers, children, userVideo }) => { 13 | const [isOpen, setIsOpen] = useState(false); 14 | 15 | useEffect(() => {}, []); 16 | return ( 17 | <> 18 | 19 | 20 | setIsOpen(false)} 24 | style={{ 25 | overlay: { backgroundColor: 'rgba(25,27,40,.9)' }, 26 | content: { 27 | top: '50%', 28 | left: '50%', 29 | right: 'auto', 30 | bottom: 'auto', 31 | marginRight: '-50%', 32 | transform: 'translate(-50%, -50%)', 33 | width: '60%', 34 | height: '65%', 35 | backgroundColor: '#1c1f2e', 36 | outline: 'none', 37 | border: 'none', 38 | padding: '.2rem 0', 39 | }, 40 | }} 41 | > 42 |
43 | 44 |
45 | 46 | Settings 47 |
48 | 51 |
52 |
53 | 54 |
55 | 56 |
57 |
58 |
59 |
60 | 61 | ); 62 | }; 63 | 64 | export default SettingApp; 65 | -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 46 | Wesee - Free Video Conference 47 | 48 | 49 | 50 |
51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /client/src/components/Partner/Partner.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FeatureText } from '../Section-Features/SectionFeatures.styles'; 3 | import Slider from 'react-slick'; 4 | import { LogoArea, LogoContainer, LogoImage, PartnerSection } from './Partner.styles'; 5 | import { SampleNextArrow, SamplePrevArrow } from './Arrow-carousel'; 6 | import ScrollAnimation from 'react-animate-on-scroll'; 7 | 8 | function Partner() { 9 | var settings = { 10 | dots: true, 11 | infinite: false, 12 | speed: 500, 13 | slidesToShow: 4, 14 | slidesToScroll: 4, 15 | initialSlide: 0, 16 | centerPadding: 140, 17 | nextArrow: , 18 | prevArrow: , 19 | responsive: [ 20 | { 21 | breakpoint: 1024, 22 | settings: { 23 | slidesToShow: 3, 24 | slidesToScroll: 3, 25 | infinite: true, 26 | dots: true, 27 | centerPadding: 30, 28 | }, 29 | }, 30 | { 31 | breakpoint: 600, 32 | settings: { 33 | slidesToShow: 2, 34 | slidesToScroll: 2, 35 | initialSlide: 2, 36 | centerPadding: 30, 37 | }, 38 | }, 39 | { 40 | breakpoint: 480, 41 | settings: { 42 | slidesToShow: 1, 43 | slidesToScroll: 1, 44 | }, 45 | }, 46 | ], 47 | }; 48 | return ( 49 | 50 | 51 | OUR BEST PARTNER 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | ); 75 | } 76 | 77 | export default Partner; 78 | -------------------------------------------------------------------------------- /client/src/pages/Landing-Page/LandingPage.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import Hero from '../../components/Hero/Hero'; 4 | import SectionFeatures from '../../components/Section-Features/SectionFeatures'; 5 | import { ImageShowContainer, LandingPageContainer, SectionAboutService } from './LandingPage.styles'; 6 | import { useMediaQuery } from 'react-responsive'; 7 | import Question from '../../components/GetStarted/GetStarted'; 8 | import Navbar from '../../components/navbar/navbar'; 9 | import Footer from '../../components/Footer/Footer'; 10 | import { Tween } from 'react-gsap'; 11 | import { TweenLite } from 'gsap'; 12 | import { useEffect } from 'react'; 13 | import ScrollAnimation from 'react-animate-on-scroll'; 14 | 15 | const LandingPage = ({ history }) => { 16 | const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1224px)' }); 17 | 18 | useEffect(() => { 19 | const ui = document.getElementById('ui'); 20 | 21 | if (ui) { 22 | ui.onmouseover = function () { 23 | TweenLite.to(ui, 1, { 24 | css: { filter: 'drop-shadow(0px 5px 90px #0E78F9)' }, 25 | }); 26 | }; 27 | } 28 | }, []); 29 | return ( 30 | <> 31 | 32 | 33 | 34 | 35 | {!isTabletOrMobile && ( 36 |
37 | 42 | 50 | 51 | 56 | ui room 57 | 58 | 59 | 60 | 61 |
62 | )} 63 | 64 | 65 | 66 |