Compare commits

..

No commits in common. "48028193cc69487f131d10631f48d66c2bc66d25" and "c138fc68d0d78f6cab2eb36467635af6d6fd44c6" have entirely different histories.

27 changed files with 5439 additions and 453 deletions

View file

@ -3,6 +3,8 @@ const { merge } = require('webpack-merge')
const path = require( 'path' ); const path = require( 'path' );
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const ReactRefreshTypeScript = require('react-refresh-typescript');
const common = require('./webpack.common.js') const common = require('./webpack.common.js')

View file

@ -6,7 +6,7 @@ const common = require('./webpack.common.js')
module.exports = merge(common, { module.exports = merge(common, {
mode: 'production', mode: 'production',
devtool: 'source-map', devtool: false,
module: { module: {
rules: [ rules: [
{ {
@ -35,5 +35,4 @@ module.exports = merge(common, {
maxEntrypointSize: 512000, maxEntrypointSize: 512000,
maxAssetSize: 512000, maxAssetSize: 512000,
}, },
plugins: [new MiniCssExtractPlugin()]
}) })

View file

@ -2,22 +2,28 @@
"name": "@chatbridge/client", "name": "@chatbridge/client",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"repository": "https://git.jon-e.net/jonny/chatbridge",
"author": "sneakers-the-rat <j@nny.fyi>",
"license": "AGPL-3.0",
"dependencies": { "dependencies": {
"@emotion/react": "^11.11.1", "@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0", "@emotion/styled": "^11.11.0",
"@mui/base": "^5.0.0-beta.8",
"@mui/icons-material": "^5.14.1", "@mui/icons-material": "^5.14.1",
"@mui/material": "^5.14.2", "@mui/material": "^5.14.2",
"@types/node": "^16.18.39",
"@types/react": "^18.2.16",
"@types/react-dom": "^18.2.7",
"file-loader": "^6.2.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"sass": "^1.64.1", "sass": "^1.64.1",
"typescript": "^4.9.5" "typescript": "^4.9.5",
"web-vitals": "^2.1.4"
}, },
"scripts": { "scripts": {
"start": "NODE_ENV=development webpack serve -c ./config/webpack.dev.js --mode development", "start": "NODE_ENV=development webpack serve -c ./config/webpack.dev.js --mode development",
"build": "NODE_ENV=production webpack --config ./config/webpack.prod.js" "build": "NODE_ENV=production webpack --config ./config/webpack.prod.js",
"test": "react-scripts test",
"eject": "react-scripts eject"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -27,15 +33,10 @@
}, },
"devDependencies": { "devDependencies": {
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
"@types/node": "^16.18.39",
"@types/react": "^18.2.16",
"@types/react-dom": "^18.2.7",
"css-loader": "^6.8.1", "css-loader": "^6.8.1",
"css-minimizer-webpack-plugin": "^5.0.1",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.3", "html-webpack-plugin": "^5.5.3",
"mini-css-extract-plugin": "^2.7.6",
"react-refresh": "^0.14.0", "react-refresh": "^0.14.0",
"react-refresh-typescript": "^2.0.9",
"sass-loader": "^13.3.2", "sass-loader": "^13.3.2",
"style-loader": "^3.3.3", "style-loader": "^3.3.3",
"ts-loader": "^9.4.4", "ts-loader": "^9.4.4",

View file

@ -2,16 +2,42 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta <meta
name="description" name="description"
content="Web site created using create-react-app" content="Web site created using create-react-app"
/> />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>ChatBridge</title> <title>ChatBridge</title>
</head> </head>
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div> <div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body> </body>
</html> </html>

View file

@ -1,8 +1,25 @@
{ {
"short_name": "ChatBridge", "short_name": "React App",
"name": "ChatBridge: Bridge ur chatz", "name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".", "start_url": ".",
"display": "standalone", "display": "standalone",
"theme_color": "#FFFFFF", "theme_color": "#000000",
"background_color": "#1C1B22" "background_color": "#ffffff"
} }

View file

@ -1,7 +1,8 @@
import React from 'react'; import React from 'react';
import logo from './logo.svg';
import { createTheme, ThemeProvider } from '@mui/material/styles'; import { createTheme, ThemeProvider } from '@mui/material/styles';
import { yellow} from "@mui/material/colors"; import { yellow} from "@mui/material/colors";
import './sass/index.scss';
const theme = createTheme({ const theme = createTheme({
palette:{ palette:{

View file

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import {useState, useEffect} from "react";
import Table from '@mui/material/Table'; import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody'; import TableBody from '@mui/material/TableBody';
@ -6,6 +7,7 @@ import TableCell from '@mui/material/TableCell';
import TableRow from "@mui/material/TableRow"; import TableRow from "@mui/material/TableRow";
import TableContainer from '@mui/material/TableContainer'; import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead'; import TableHead from '@mui/material/TableHead';
import Typography from "@mui/material/Typography";
import GroupRow from "./groupRow"; import GroupRow from "./groupRow";

View file

@ -1,4 +1,6 @@
import TableCell from '@mui/material/TableCell'; import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TableRow from '@mui/material/TableRow'; import TableRow from '@mui/material/TableRow';
import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; import DeleteForeverIcon from '@mui/icons-material/DeleteForever';
import IconButton from "@mui/material/IconButton" import IconButton from "@mui/material/IconButton"

View file

@ -1,10 +1,9 @@
import {useState} from "react"; import Grid from "@mui/material/Grid";
import TextField from "@mui/material/TextField"; import TextField from "@mui/material/TextField";
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import {setBridgeLabel} from "../../api/bridge"; import {setBridgeLabel} from "../../api/bridge";
import {useState} from "react";
export const JoinBridge = ({ export const JoinBridge = ({

View file

@ -1,17 +1,15 @@
import {useEffect, useState} from "react";
import FormControl from "@mui/material/FormControl"; import FormControl from "@mui/material/FormControl";
import InputLabel from "@mui/material/InputLabel"; import InputLabel from "@mui/material/InputLabel";
import Select from "@mui/material/Select"; import Select from "@mui/material/Select";
import MenuItem from "@mui/material/MenuItem"; import MenuItem from "@mui/material/MenuItem";
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import {stepCompleteType} from "./joinForm"; import {stepCompleteType} from "./joinForm";
import {getSlackChannels, joinSlackChannel} from "../../api/slack";
import {getDiscordChannels} from "../../api/discord";
import {getSlackChannels, joinSlackChannel} from "../../api/slack";
import {useEffect, useState} from "react";
import {channelsType} from "../../types/channel"; import {channelsType} from "../../types/channel";
import {bridgeType} from "../../types/bridge"; import {bridgeType} from "../../types/bridge";
import {getDiscordChannels} from "../../api/discord";
export interface JoinChannelProps { export interface JoinChannelProps {

View file

@ -1,13 +1,12 @@
import {useState, useEffect} from "react";
import Button from '@mui/material/Button';
import {Group} from "../../types/group";
import {JoinStep} from './joinStep'; import {JoinStep} from './joinStep';
import {JoinLogin} from "./joinLogin"; import {JoinLogin} from "./joinLogin";
import {useState, useEffect} from "react";
import Button from '@mui/material/Button';
import {createChannel} from "../../api/channel";
import {JoinBridge} from "./joinBridge"; import {JoinBridge} from "./joinBridge";
import JoinChannel from "./joinChannel"; import JoinChannel from "./joinChannel";
import {createChannel} from "../../api/channel";
import {Group} from "../../types/group";
import {bridgeType} from "../../types/bridge"; import {bridgeType} from "../../types/bridge";
export interface JoinFormProps { export interface JoinFormProps {

View file

@ -1,12 +1,10 @@
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Group} from '../../types/group'
import {groupInvite} from '../../api/groups'
import TextField from "@mui/material/TextField"; import TextField from "@mui/material/TextField";
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import {groupInvite} from '../../api/groups'
import {Group} from '../../types/group'
export interface JoinGroupProps { export interface JoinGroupProps {
group: Group; group: Group;
setGroup: React.Dispatch<React.SetStateAction<Group>> setGroup: React.Dispatch<React.SetStateAction<Group>>

View file

@ -1,8 +1,8 @@
/* /*
Select which platform you're joining from! Select which platform you're joining from!
*/ */
import React, {useEffect, useState} from 'react';
import React, {useEffect, useState} from 'react';
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@mui/material/MenuItem';
import FormControl from '@mui/material/FormControl'; import FormControl from '@mui/material/FormControl';

View file

@ -1,5 +1,4 @@
import * as React from 'react'; import * as React from 'react';
import Accordion from '@mui/material/Accordion'; import Accordion from '@mui/material/Accordion';
import AccordionDetails from '@mui/material/AccordionDetails'; import AccordionDetails from '@mui/material/AccordionDetails';
import AccordionSummary from '@mui/material/AccordionSummary'; import AccordionSummary from '@mui/material/AccordionSummary';
@ -7,6 +6,7 @@ import Typography from '@mui/material/Typography';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked'; import RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked';
import TaskAltIcon from '@mui/icons-material/TaskAlt'; import TaskAltIcon from '@mui/icons-material/TaskAlt';
import {useState} from "react";
export interface JoinStepProps { export interface JoinStepProps {
children: any; children: any;

View file

@ -1,6 +1,7 @@
import * as React from 'react'; import * as React from 'react';
import Tab from '@mui/material/Tab'; import Tab from '@mui/material/Tab';
import TabsList from '@mui/base/TabsList';
import Tabs from '@mui/material/Tabs'; import Tabs from '@mui/material/Tabs';
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import { styled } from '@mui/material/styles'; import { styled } from '@mui/material/styles';

View file

@ -1,10 +1,13 @@
import React from 'react'; import React from 'react';
import {useState, useEffect} from "react"; import {useState, useEffect} from "react";
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import {JoinForm} from "../join/joinForm"; import {JoinForm} from "../join/joinForm";
import {JoinGroup} from '../join/joinGroup'; import {JoinGroup} from '../join/joinGroup';
import {Group} from "../../types/group"; import {Group} from "../../types/group";
import {groupInvite} from "../../api/groups";
export default function JoinPanel(){ export default function JoinPanel(){
const [group, setGroup] = useState<Group>(undefined); const [group, setGroup] = useState<Group>(undefined);

View file

@ -1,6 +1,5 @@
import React from 'react'; import React from 'react';
import {useState, useEffect} from "react"; import {useState, useEffect} from "react";
import TextField from '@mui/material/TextField'; import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button'; import Button from '@mui/material/Button';

View file

@ -1,9 +1,7 @@
import {useEffect, useRef, useState} from "react"; import {useEffect, useRef, useState} from "react";
import Button from "@mui/material/Button";
import {getDiscordInstallURL} from "../../api/discord"; import {getDiscordInstallURL} from "../../api/discord";
import {getBridgeByStateToken} from "../../api/bridge"; import {getBridgeByStateToken} from "../../api/bridge";
import Button from "@mui/material/Button";
export const DiscordLogin = ({ export const DiscordLogin = ({

View file

@ -1,7 +1,5 @@
import React, {useEffect, useRef, useState} from 'react' import React, {useEffect, useRef, useState} from 'react'
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import {getSlackInstallURL} from "../../api/slack"; import {getSlackInstallURL} from "../../api/slack";
import {getBridgeByStateToken} from "../../api/bridge"; import {getBridgeByStateToken} from "../../api/bridge";

View file

@ -1,5 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import Typography from '@mui/material/Typography';
import Box from '@mui/material/Box'; import Box from '@mui/material/Box';
export default function TabPanel(props) { export default function TabPanel(props) {

View file

@ -1,8 +1,7 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom/client'; import ReactDOM from 'react-dom/client';
import App from './App';
import './sass/index.scss'; import './sass/index.scss';
import App from './App';
const root = ReactDOM.createRoot( const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement document.getElementById('root') as HTMLElement

38
client/styles/App.css Normal file
View file

@ -0,0 +1,38 @@
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

13
client/styles/index.css Normal file
View file

@ -0,0 +1,13 @@
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;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}

View file

@ -8,10 +8,7 @@
"scripts": { "scripts": {
"start:client": "npm run start --prefix client", "start:client": "npm run start --prefix client",
"start:server": "npm run start --prefix server", "start:server": "npm run start --prefix server",
"start": "concurrently -k -n \"CLIENT,SERVER\" -c \"bgBlue.bold,bgRed.bold\" \"npm run start:client\" \"npm run start:server\"", "start": "concurrently -k -n \"CLIENT,SERVER\" -c \"bgBlue.bold,bgRed.bold\" \"npm run start:client\" \"npm run start:server\""
"build:client": "npm run build --prefix client",
"build:server": "npm run build --prefix server",
"build": "npm run build:client; npm run build:server"
}, },
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {

View file

@ -3,14 +3,16 @@
"version": "1.0.0", "version": "1.0.0",
"description": "bridging a bunch of chats together", "description": "bridging a bunch of chats together",
"main": "index.js", "main": "index.js",
"repository": "https://git.jon-e.net/jonny/chatbridge", "repository": "https://git.jon-e.net/jonny/ucla-chat",
"author": "sneakers-the-rat <j@nny.fyi>", "author": "sneakers-the-rat <JLSaunders987@gmail.com>",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "NODE_ENV=development ts-node-dev --respawn --transpile-only --exit-child src/app.ts", "start": "NODE_ENV=development ts-node-dev --respawn --transpile-only --exit-child src/app.ts",
"build": "../node_modules/.bin/tsc -p .", "build": "../node_modules/.bin/tsc -p .",
"typeorm": "../node_modules/.bin/typeorm-ts-node-commonjs", "typeorm": "../node_modules/.bin/typeorm-ts-node-commonjs",
"migrate": "rm -rf build && yarn build && yarn ../node_modules/.bin/typeorm migration:generate ./src/migrations/added-user-entity -d ./src/utils/data-source.ts",
"db:push": "rm -rf build && yarn build && yarn ../node_modules/.bin/typeorm migration:run -d src/utils/data-source.ts",
"importData": "npx ts-node-dev --transpile-only --exit-child src/data/seeder.ts", "importData": "npx ts-node-dev --transpile-only --exit-child src/data/seeder.ts",
"test": "jest" "test": "jest"
}, },
@ -27,6 +29,8 @@
"jsonwebtoken": "^9.0.1", "jsonwebtoken": "^9.0.1",
"pg": "^8.11.1", "pg": "^8.11.1",
"pm2": "^5.3.0", "pm2": "^5.3.0",
"pug": "^3.0.2",
"redis": "^4.6.7",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"typeorm": "^0.3.17", "typeorm": "^0.3.17",
@ -41,6 +45,7 @@
"@types/cors": "^2.8.13", "@types/cors": "^2.8.13",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/jest": "^29.5.3", "@types/jest": "^29.5.3",
"@types/jsonwebtoken": "^9.0.2",
"@types/node": "^20.4.2", "@types/node": "^20.4.2",
"@types/pug": "^2.0.6", "@types/pug": "^2.0.6",
"@types/winston": "^2.4.4", "@types/winston": "^2.4.4",

View file

@ -10,7 +10,7 @@
"strictPropertyInitialization": false, "strictPropertyInitialization": false,
"strictNullChecks": false, "strictNullChecks": false,
"skipLibCheck": true, "skipLibCheck": true,
"outDir": "./dist", "outDir": "./build",
"rootDir": ".", "rootDir": ".",
}, },

5676
yarn.lock

File diff suppressed because it is too large Load diff