From 5d4e7e8f6e93f993fde8a638028c9e68e40633b3 Mon Sep 17 00:00:00 2001 From: Steffen Kux Date: Wed, 29 Nov 2023 14:44:18 +0100 Subject: [PATCH] copied package --- packages/messenger-web/.gitignore | 24 ++++ packages/messenger-web/Dockerfile | 9 ++ packages/messenger-web/README.md | 23 +++ packages/messenger-web/config-overrides.js | 43 ++++++ packages/messenger-web/package.json | 66 +++++++++ packages/messenger-web/public/dark-logo.png | Bin 0 -> 50861 bytes packages/messenger-web/public/dm3-logo.png | Bin 0 -> 9345 bytes packages/messenger-web/public/favicon.png | Bin 0 -> 5628 bytes packages/messenger-web/public/index.html | 43 ++++++ packages/messenger-web/public/manifest.json | 8 ++ packages/messenger-web/public/robots.txt | 3 + packages/messenger-web/server.js | 9 ++ packages/messenger-web/src/App.css | 4 + packages/messenger-web/src/App.tsx | 28 ++++ packages/messenger-web/src/Background.css | 132 ++++++++++++++++++ packages/messenger-web/src/Background.tsx | 19 +++ packages/messenger-web/src/Dm3Widget.css | 15 ++ packages/messenger-web/src/Dm3Widget.tsx | 33 +++++ packages/messenger-web/src/Footer.tsx | 36 +++++ packages/messenger-web/src/Header.tsx | 41 ++++++ packages/messenger-web/src/index.css | 53 +++++++ packages/messenger-web/src/index.tsx | 19 +++ packages/messenger-web/src/react-app-env.d.ts | 1 + packages/messenger-web/src/reportWebVitals.ts | 17 +++ packages/messenger-web/src/setupTests.ts | 5 + packages/messenger-web/tsconfig.json | 20 +++ 26 files changed, 651 insertions(+) create mode 100644 packages/messenger-web/.gitignore create mode 100644 packages/messenger-web/Dockerfile create mode 100644 packages/messenger-web/README.md create mode 100644 packages/messenger-web/config-overrides.js create mode 100644 packages/messenger-web/package.json create mode 100644 packages/messenger-web/public/dark-logo.png create mode 100644 packages/messenger-web/public/dm3-logo.png create mode 100644 packages/messenger-web/public/favicon.png create mode 100644 packages/messenger-web/public/index.html create mode 100644 packages/messenger-web/public/manifest.json create mode 100644 packages/messenger-web/public/robots.txt create mode 100644 packages/messenger-web/server.js create mode 100644 packages/messenger-web/src/App.css create mode 100644 packages/messenger-web/src/App.tsx create mode 100644 packages/messenger-web/src/Background.css create mode 100644 packages/messenger-web/src/Background.tsx create mode 100644 packages/messenger-web/src/Dm3Widget.css create mode 100644 packages/messenger-web/src/Dm3Widget.tsx create mode 100644 packages/messenger-web/src/Footer.tsx create mode 100644 packages/messenger-web/src/Header.tsx create mode 100644 packages/messenger-web/src/index.css create mode 100644 packages/messenger-web/src/index.tsx create mode 100644 packages/messenger-web/src/react-app-env.d.ts create mode 100644 packages/messenger-web/src/reportWebVitals.ts create mode 100644 packages/messenger-web/src/setupTests.ts create mode 100644 packages/messenger-web/tsconfig.json diff --git a/packages/messenger-web/.gitignore b/packages/messenger-web/.gitignore new file mode 100644 index 000000000..966bc27cf --- /dev/null +++ b/packages/messenger-web/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.env \ No newline at end of file diff --git a/packages/messenger-web/Dockerfile b/packages/messenger-web/Dockerfile new file mode 100644 index 000000000..9e3a00f6d --- /dev/null +++ b/packages/messenger-web/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-alpine +WORKDIR /app +COPY . . +RUN apk add --update python3 make g++\ + && rm -rf /var/cache/apk/* +RUN yarn install +RUN yarn build +CMD yarn workspace messenger-demo start +EXPOSE 3000 \ No newline at end of file diff --git a/packages/messenger-web/README.md b/packages/messenger-web/README.md new file mode 100644 index 000000000..3943ab9a4 --- /dev/null +++ b/packages/messenger-web/README.md @@ -0,0 +1,23 @@ +# dm3-web + +## Getting Started + +### Build + +``` +cd ../../ && yarn build +``` + +### Usage + +yarn: + +``` +yarn start +``` + +npm: + +``` +yarn start +``` diff --git a/packages/messenger-web/config-overrides.js b/packages/messenger-web/config-overrides.js new file mode 100644 index 000000000..979eeb035 --- /dev/null +++ b/packages/messenger-web/config-overrides.js @@ -0,0 +1,43 @@ +const webpack = require('webpack'); +module.exports = function override(config) { + const fallback = config.resolve.fallback || {}; + Object.assign(fallback, { + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + assert: require.resolve('assert'), + http: require.resolve('stream-http'), + https: require.resolve('https-browserify'), + os: require.resolve('os-browserify'), + url: require.resolve('url'), + path: require.resolve('path-browserify'), + }); + config.module.rules.push({ + test: /\.(js|mjs|jsx)$/, + enforce: 'pre', + loader: require.resolve('source-map-loader'), + resolve: { + fullySpecified: false, + }, + }); + config.resolve.fallback = fallback; + + config.plugins = (config.plugins || []).concat([ + new webpack.ProvidePlugin({ + process: 'process/browser', + Buffer: ['buffer', 'Buffer'], + }), + ]); + + config.module.rules = config.module.rules.map((rule) => { + if (rule.oneOf instanceof Array) { + rule.oneOf[rule.oneOf.length - 1].exclude = [ + /\.(js|mjs|jsx|cjs|ts|tsx)$/, + /\.html$/, + /\.json$/, + ]; + } + return rule; + }); + + return config; +}; diff --git a/packages/messenger-web/package.json b/packages/messenger-web/package.json new file mode 100644 index 000000000..03d22d9bd --- /dev/null +++ b/packages/messenger-web/package.json @@ -0,0 +1,66 @@ +{ + "name": "messenger-web", + "version": "0.1.0", + "dependencies": { + "@popperjs/core": "^2.11.8", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.11.41", + "@types/react": "^18.0.13", + "@types/react-dom": "^18.0.5", + "autoprefixer": "10.4.5", + "bootstrap": "^5.1.3", + "express": "^4.18.2", + "messenger-widget": "workspace:^", + "postcss": "^8.4.24", + "react-dom": "^18.2.0", + "typescript": "^4.7.3", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start:dev": "react-app-rewired start", + "start": "node server.js", + "build": "react-app-rewired build", + "test": "echo 'no tests'", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + "chrome >= 67", + "edge >= 79", + "firefox >= 68", + "opera >= 54", + "safari >= 14" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@testing-library/dom": "^9.3.1", + "@types/three": "^0.141.0", + "add": "^2.0.6", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "crypto-browserify": "^3.12.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "react-app-rewired": "^2.2.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "url": "^0.11.0", + "yarn": "^1.22.19" + } +} diff --git a/packages/messenger-web/public/dark-logo.png b/packages/messenger-web/public/dark-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b1dee8b845067dfcc8c66ebdb164e22d90899e40 GIT binary patch literal 50861 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 bw6PsB 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%0D!&qk2kB4mJE! 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 W=<6A}ogG + + + + + + + + + + + + + dm3 + + + +
+ + diff --git a/packages/messenger-web/public/manifest.json b/packages/messenger-web/public/manifest.json new file mode 100644 index 000000000..f6595ddfd --- /dev/null +++ b/packages/messenger-web/public/manifest.json @@ -0,0 +1,8 @@ +{ + "short_name": "dm3", + "name": "dm3 enables decentralized, open, and secure messaging using established web3 services", + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#000000" +} diff --git a/packages/messenger-web/public/robots.txt b/packages/messenger-web/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/packages/messenger-web/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/packages/messenger-web/server.js b/packages/messenger-web/server.js new file mode 100644 index 000000000..c597a187d --- /dev/null +++ b/packages/messenger-web/server.js @@ -0,0 +1,9 @@ +const express = require('express'); +const app = express(); +const port = process.env.PORT || 8080; + +app.use(express.static('build')); + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`); +}); diff --git a/packages/messenger-web/src/App.css b/packages/messenger-web/src/App.css new file mode 100644 index 000000000..c19e5c83b --- /dev/null +++ b/packages/messenger-web/src/App.css @@ -0,0 +1,4 @@ +body { + background-color: #000000; + overflow: hidden; +} diff --git a/packages/messenger-web/src/App.tsx b/packages/messenger-web/src/App.tsx new file mode 100644 index 000000000..c0b2db02b --- /dev/null +++ b/packages/messenger-web/src/App.tsx @@ -0,0 +1,28 @@ +// Import CSS and JS from Bootstrap +import 'bootstrap/dist/css/bootstrap.min.css'; +import 'bootstrap/dist/js/bootstrap.bundle.min.js'; + +// Import the global CSS file +import './App.css'; + +// Import the components +import Background from './Background'; +import Dm3Widget from './Dm3Widget'; +import Footer from './Footer'; +import Header from './Header'; + +// The main component of the application +function App() { + // The components are rendered in the order they should appear + return ( +
+ +
+
+ +
+ ); +} + +// Export the App component as the default export +export default App; diff --git a/packages/messenger-web/src/Background.css b/packages/messenger-web/src/Background.css new file mode 100644 index 000000000..6e804507e --- /dev/null +++ b/packages/messenger-web/src/Background.css @@ -0,0 +1,132 @@ +.background { + width: 100%; + height: 100%; + + background: #000; + overflow: hidden; + position: absolute; +} + +.gradient-left { + content: ''; + position: absolute; + top: 50%; + width: 120vw; + height: 120vw; + transform: translate(-50%, -50%); +} + +.gradient-right { + content: ''; + position: relative; + top: 30%; + width: 120vw; + height: 120vw; + transform: translate(-50%, -50%); +} + +.gradient-left { + left: 30%; + background: radial-gradient( + circle at 50% 50%, + rgba(135, 44, 255, 0.4) 0%, + transparent 60% + ); + animation: moveSmoothLeft 100s infinite alternate; +} + +.gradient-right { + right: 30%; + background: radial-gradient( + circle at 50% 50%, + rgba(44, 166, 255, 0.4) 0%, + transparent 60% + ); + animation: moveSmoothRight 80s infinite alternate; +} + +@keyframes moveSmoothLeft { + 0%, + 100% { + transform: translate(-75vw, -50%) scale(1); + } + + 10% { + transform: translate(-60vw, -50%) scale(1.1); + } + + 20% { + transform: translate(-75vw, -75vh) scale(1.2); + } + + 30% { + transform: translate(-90vw, -50%) scale(1.1); + } + + 40% { + transform: translate(-75vw, -25vh) scale(1); + } + + 50% { + transform: translate(-60vw, -75vh) scale(1.1); + } + + 60% { + transform: translate(-75vw, -60vh) scale(1.2); + } + + 70% { + transform: translate(-90vw, -75vh) scale(1.1); + } + + 80% { + transform: translate(-75vw, -50vh) scale(1); + } + + 90% { + transform: translate(-60vw, -50vh) scale(1.1); + } +} + +@keyframes moveSmoothRight { + 0%, + 100% { + transform: translate(75vw, -50%) scale(1); + } + + 10% { + transform: translate(60vw, -50%) scale(1.1); + } + + 20% { + transform: translate(75vw, -30vh) scale(0.9); + } + + 30% { + transform: translate(90vw, -50%) scale(1.05); + } + + 40% { + transform: translate(75vw, -50vh) scale(1); + } + + 50% { + transform: translate(60vw, -40vh) scale(1.1); + } + + 60% { + transform: translate(75vw, -60vh) scale(0.9); + } + + 70% { + transform: translate(90vw, -60vh) scale(1.05); + } + + 80% { + transform: translate(75vw, -30vh) scale(1); + } + + 90% { + transform: translate(60vw, -50vh) scale(1.1); + } +} diff --git a/packages/messenger-web/src/Background.tsx b/packages/messenger-web/src/Background.tsx new file mode 100644 index 000000000..d852d3c91 --- /dev/null +++ b/packages/messenger-web/src/Background.tsx @@ -0,0 +1,19 @@ +// Import React and the CSS for this component +import React from 'react'; +import './Background.css'; + +// Define the Background component +const Background: React.FC = () => { + // Return the JSX for this component + return ( + // The main div that contains the background + // 2 different moving gradients +
+
+
+
+ ); +}; + +// Export the Background component as the default export +export default Background; diff --git a/packages/messenger-web/src/Dm3Widget.css b/packages/messenger-web/src/Dm3Widget.css new file mode 100644 index 000000000..7347a2987 --- /dev/null +++ b/packages/messenger-web/src/Dm3Widget.css @@ -0,0 +1,15 @@ +.dm3widget { + width: calc(100% - 40px); + height: calc(100% - 70px - 40px); + background-color: #1a1b22; + border: 1px solid #222222; + border-radius: 10px; + position: absolute; + top: 75px; + left: 20px; + transform: translate(0, 0); + z-index: 10; + box-shadow: 6px 6px 20px 0 rgba(05, 010, 020, 1); + /* margin-top: 30px; /* Adjust this value as needed */ + overflow: hidden; +} diff --git a/packages/messenger-web/src/Dm3Widget.tsx b/packages/messenger-web/src/Dm3Widget.tsx new file mode 100644 index 000000000..8360aa08c --- /dev/null +++ b/packages/messenger-web/src/Dm3Widget.tsx @@ -0,0 +1,33 @@ +// Import React and the CSS for this component +import React from 'react'; +import './Dm3Widget.css'; + +// Ignore TypeScript errors for the next line +//@ts-ignore +// Import the DM3 component from the 'messenger-widget' package +import { DM3 } from 'messenger-widget'; + +// Define the Dm3Widget component +const Dm3Widget: React.FC = () => { + // Define the props for the DM3 component + const props: any = { + defaultContact: 'receiver.beta-user.dm3.eth', + defaultServiceUrl: process.env.REACT_APP_DEFAULT_SERVICE, + ethereumProvider: process.env.REACT_APP_ETHEREUM_PROVIDER, + walletConnectProjectId: process.env.REACT_APP_WALLET_CONNECT_PROJECT_ID, + showAlways: true, + hideFunction: 'attachments,edit,delete', // Optional parameter: 'attachments,edit,delete' or undefined + showContacts: true, // true for all contacts / false for default contact + }; + + // Return the JSX for this component + return ( + // A div that contains the DM3 component +
+ +
+ ); +}; + +// Export the Dm3Widget component as the default export +export default Dm3Widget; diff --git a/packages/messenger-web/src/Footer.tsx b/packages/messenger-web/src/Footer.tsx new file mode 100644 index 000000000..1ab9a724f --- /dev/null +++ b/packages/messenger-web/src/Footer.tsx @@ -0,0 +1,36 @@ +// Import React +import React from 'react'; + +// Define the Footer component +const Footer: React.FC = () => { + // Define the styles for the navbar and the container + const navbarStyle = { backgroundColor: '#000000ff !important' }; + const containerStyle = { justifyContent: 'flex-end', display: 'flex' }; + const linkStyle = { marginRight: '10px' }; + + // Return the JSX for this component + return ( + // A fixed-bottom navbar with a black background + + ); +}; + +// Export the Footer component as the default export +export default Footer; diff --git a/packages/messenger-web/src/Header.tsx b/packages/messenger-web/src/Header.tsx new file mode 100644 index 000000000..34f15ddd8 --- /dev/null +++ b/packages/messenger-web/src/Header.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +// Define the Header component +const Header: React.FC = () => { + // Define the handlers for the mouse over and mouse out events + const handleMouseOver = ( + e: React.MouseEvent, + ) => { + e.currentTarget.style.transform = 'scale(1.2)'; + }; + const handleMouseOut = ( + e: React.MouseEvent, + ) => { + e.currentTarget.style.transform = 'scale(1)'; + }; + + // Return the JSX for this component + return ( + + ); +}; + +export default Header; diff --git a/packages/messenger-web/src/index.css b/packages/messenger-web/src/index.css new file mode 100644 index 000000000..d59e1f6b5 --- /dev/null +++ b/packages/messenger-web/src/index.css @@ -0,0 +1,53 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', + 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', + 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: #000000; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +.filler { + backdrop-filter: blur(1px) !important; + background-color: #0d0d0d !important; + cursor: initial !important; +} + +.container { + margin-top: 2rem !important; +} +.main-content-row { + border-style: none !important; + /* box-shadow: 0px 0px 2px #999; */ +} + +.logo { + position: absolute; + filter: brightness(100%); + top: 2rem; + left: 2rem; + z-index: 9999; + cursor: pointer; +} + +.logo a { + text-decoration: none; +} +.logo:hover { + filter: brightness(110%); +} + +.main-content-row { + filter: drop-shadow(0px 0px 5px rgb(0 0 0 / 0.4)); +} + +.legal { + font-size: 0.8rem !important; + text-decoration: none; +} diff --git a/packages/messenger-web/src/index.tsx b/packages/messenger-web/src/index.tsx new file mode 100644 index 000000000..46b526bd3 --- /dev/null +++ b/packages/messenger-web/src/index.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement, +); +root.render( + + + , +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/packages/messenger-web/src/react-app-env.d.ts b/packages/messenger-web/src/react-app-env.d.ts new file mode 100644 index 000000000..6431bc5fc --- /dev/null +++ b/packages/messenger-web/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/messenger-web/src/reportWebVitals.ts b/packages/messenger-web/src/reportWebVitals.ts new file mode 100644 index 000000000..3a7683286 --- /dev/null +++ b/packages/messenger-web/src/reportWebVitals.ts @@ -0,0 +1,17 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then( + ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }, + ); + } +}; + +export default reportWebVitals; diff --git a/packages/messenger-web/src/setupTests.ts b/packages/messenger-web/src/setupTests.ts new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/packages/messenger-web/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/packages/messenger-web/tsconfig.json b/packages/messenger-web/tsconfig.json new file mode 100644 index 000000000..c0555cbc6 --- /dev/null +++ b/packages/messenger-web/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] +}