diff --git a/packages/app/.babelrc b/packages/app/.babelrc
deleted file mode 100644
index a05f7d9c8..000000000
--- a/packages/app/.babelrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "plugins": [["formatjs"]]
-}
diff --git a/packages/app/.eslintrc.cjs b/packages/app/.eslintrc.cjs
index 3bdddba68..01143548d 100644
--- a/packages/app/.eslintrc.cjs
+++ b/packages/app/.eslintrc.cjs
@@ -3,11 +3,11 @@ module.exports = {
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
root: true,
- ignorePatterns: ["build/", "*.test.ts"],
+ ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: {
browser: true,
worker: true,
commonjs: true,
- node: true,
+ node: false,
},
};
diff --git a/packages/app/babel.config.json b/packages/app/babel.config.json
new file mode 100644
index 000000000..37fbacf05
--- /dev/null
+++ b/packages/app/babel.config.json
@@ -0,0 +1,11 @@
+{
+ "presets": [
+ "@babel/preset-env",
+ "@babel/preset-react"
+ ],
+ "plugins": [
+ [
+ "formatjs"
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/packages/app/config-overrides.js b/packages/app/config-overrides.js
deleted file mode 100644
index 0cc661591..000000000
--- a/packages/app/config-overrides.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* eslint-disable @typescript-eslint/no-var-requires */
-const { useBabelRc, override } = require("customize-cra");
-
-module.exports = override(useBabelRc());
diff --git a/packages/app/d.ts b/packages/app/custom.d.ts
similarity index 100%
rename from packages/app/d.ts
rename to packages/app/custom.d.ts
diff --git a/packages/app/package.json b/packages/app/package.json
index 0b1d73072..4906c3617 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -52,10 +52,9 @@
"workbox-streams": "^6.4.2"
},
"scripts": {
- "start": "react-app-rewired start",
- "build": "react-app-rewired build",
- "test": "react-app-rewired test",
- "eject": "react-scripts eject",
+ "start": "webpack serve",
+ "build": "webpack --mode=production",
+ "test": "",
"intl-extract": "formatjs extract 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file src/lang.json --flatten true",
"intl-compile": "formatjs compile src/lang.json --out-file src/translations/en.json",
"format": "prettier --write .",
@@ -83,22 +82,37 @@
},
"devDependencies": {
"@babel/plugin-syntax-import-assertions": "^7.20.0",
+ "@babel/preset-env": "^7.21.5",
+ "@babel/preset-react": "^7.18.6",
"@formatjs/cli": "^6.0.1",
+ "@formatjs/ts-transformer": "^3.13.1",
"@types/jest": "^29.2.5",
"@types/node": "^18.11.18",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.10",
"@types/webscopeio__react-textarea-autocomplete": "^4.7.2",
"@types/webtorrent": "^0.109.3",
+ "@webpack-cli/generators": "^3.0.4",
"@webscopeio/react-textarea-autocomplete": "^4.9.2",
- "babel-plugin-formatjs": "^10.3.36",
+ "babel-loader": "^9.1.2",
+ "babel-plugin-formatjs": "^10.5.1",
+ "css-loader": "^6.7.3",
+ "css-minimizer-webpack-plugin": "^5.0.0",
"customize-cra": "^1.0.0",
+ "eslint-plugin-formatjs": "^4.10.1",
+ "eslint-webpack-plugin": "^4.0.1",
+ "html-webpack-plugin": "^5.5.1",
"husky": ">=6",
"lint-staged": ">=10",
+ "mini-css-extract-plugin": "^2.7.5",
"prettier": "2.8.3",
- "react-app-rewired": "^2.2.1",
- "react-scripts": "5.0.1",
- "typescript": "^4.9.4"
+ "ts-loader": "^9.4.2",
+ "typescript": "^5.0.4",
+ "webpack": "^5.82.1",
+ "webpack-bundle-analyzer": "^4.8.0",
+ "webpack-cli": "^5.1.1",
+ "webpack-dev-server": "^4.15.0",
+ "workbox-webpack-plugin": "^6.5.4"
},
"lint-staged": {
"*.{js,jsx,ts,tsx,css,md}": "prettier --write"
diff --git a/packages/app/public/icons.svg b/packages/app/public/icons.svg
index 806a5df38..bd3201187 100644
--- a/packages/app/public/icons.svg
+++ b/packages/app/public/icons.svg
@@ -157,6 +157,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/app/public/index.html b/packages/app/public/index.html
index 14de62464..8761a931d 100644
--- a/packages/app/public/index.html
+++ b/packages/app/public/index.html
@@ -2,7 +2,6 @@
-
@@ -13,8 +12,8 @@
-
-
+
+
snort.social - Nostr interface
diff --git a/packages/app/src/Element/NoteToSelf.tsx b/packages/app/src/Element/NoteToSelf.tsx
index 3a0133bae..4d21deec5 100644
--- a/packages/app/src/Element/NoteToSelf.tsx
+++ b/packages/app/src/Element/NoteToSelf.tsx
@@ -1,11 +1,10 @@
import "./NoteToSelf.css";
import { Link, useNavigate } from "react-router-dom";
import { FormattedMessage } from "react-intl";
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { faBook, faCertificate } from "@fortawesome/free-solid-svg-icons";
import { profileLink } from "Util";
import messages from "./messages";
+import Icon from "Icons/Icon";
export interface NoteToSelfProps {
pubkey: string;
@@ -17,7 +16,7 @@ export interface NoteToSelfProps {
function NoteLabel() {
return (
-
+
);
}
@@ -35,7 +34,7 @@ export default function NoteToSelf({ pubkey, clickable, className, link }: NoteT
diff --git a/packages/app/src/Element/Relay.tsx b/packages/app/src/Element/Relay.tsx
index 989f22cdd..5d9e6afcb 100644
--- a/packages/app/src/Element/Relay.tsx
+++ b/packages/app/src/Element/Relay.tsx
@@ -1,33 +1,23 @@
import "./Relay.css";
import { useMemo } from "react";
-import { useIntl, FormattedMessage } from "react-intl";
+import { FormattedMessage } from "react-intl";
import { useNavigate } from "react-router-dom";
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import {
- faPlug,
- faSquareCheck,
- faSquareXmark,
- faWifi,
- faPlugCircleXmark,
- faGear,
- faWarning,
-} from "@fortawesome/free-solid-svg-icons";
import { RelaySettings } from "@snort/nostr";
import useRelayState from "Feed/RelayState";
import { System } from "System";
import { getRelayName, unixNowMs, unwrap } from "Util";
-
-import messages from "./messages";
import useLogin from "Hooks/useLogin";
import { setRelays } from "Login";
+import Icon from "Icons/Icon";
+
+import messages from "./messages";
export interface RelayProps {
addr: string;
}
export default function Relay(props: RelayProps) {
- const { formatMessage } = useIntl();
const navigate = useNavigate();
const login = useLogin();
const relaySettings = unwrap(login.relays.item[props.addr] ?? System.Sockets.get(props.addr)?.Settings ?? {});
@@ -50,7 +40,7 @@ export default function Relay(props: RelayProps) {
<>
-
+
@@ -65,7 +55,7 @@ export default function Relay(props: RelayProps) {
read: relaySettings.read,
})
}>
-
+
@@ -78,28 +68,15 @@ export default function Relay(props: RelayProps) {
read: !relaySettings.read,
})
}>
-
+
-
-
- {latency > 2000
- ? formatMessage(messages.Seconds, {
- n: (latency / 1000).toFixed(0),
- })
- : formatMessage(messages.Milliseconds, {
- n: latency.toLocaleString(),
- })}
-
- {state?.disconnects}
-
- {state?.pendingRequests?.length}
-
+
navigate(state?.id ?? "")}>
-
+
diff --git a/packages/app/src/Hooks/useLoginHandler.tsx b/packages/app/src/Hooks/useLoginHandler.tsx
index 156844df4..94865c5c9 100644
--- a/packages/app/src/Hooks/useLoginHandler.tsx
+++ b/packages/app/src/Hooks/useLoginHandler.tsx
@@ -3,7 +3,7 @@ import { useIntl } from "react-intl";
import { EmailRegex, MnemonicRegex } from "Const";
import { LoginStore } from "Login";
import { generateBip39Entropy, entropyToPrivateKey } from "nip6";
-import { getNip05PubKey } from "Pages/Login";
+import { getNip05PubKey } from "Pages/LoginPage";
import { bech32ToHex } from "Util";
export default function useLoginHandler() {
diff --git a/packages/app/src/Icons/Icon.tsx b/packages/app/src/Icons/Icon.tsx
index 6d9c6400e..677a6306e 100644
--- a/packages/app/src/Icons/Icon.tsx
+++ b/packages/app/src/Icons/Icon.tsx
@@ -1,4 +1,5 @@
import { MouseEventHandler } from "react";
+import IconsSvg from "public/icons.svg";
type Props = {
name: string;
@@ -9,7 +10,7 @@ type Props = {
const Icon = (props: Props) => {
const size = props.size || 20;
- const href = "/icons.svg#" + props.name;
+ const href = `${IconsSvg}#` + props.name;
return (