diff --git a/justfile b/justfile index ea747be8..eaeffbf1 100644 --- a/justfile +++ b/justfile @@ -113,6 +113,10 @@ check_gui_eslint: check_gui_tsc: cd src-gui && yarn run tsc --noEmit +# Check for unused code in the GUI frontend +check_gui_unused_code: + cd src-gui && npx knip + test test_name: cargo test --test {{test_name}} -- --nocapture diff --git a/src-gui/knip.json b/src-gui/knip.json new file mode 100644 index 00000000..9da2939e --- /dev/null +++ b/src-gui/knip.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://unpkg.com/knip@5/schema.json", + "entry": ["src/renderer/index.tsx", "index.html"], + "project": ["src/**/*.{ts,tsx,js,jsx}"], + "ignoreExportsUsedInFile": true, + "tags": ["-lintignore"] +} diff --git a/src-gui/package.json b/src-gui/package.json index 73a19c6e..cc213d95 100644 --- a/src-gui/package.json +++ b/src-gui/package.json @@ -36,7 +36,6 @@ "boring-avatars": "^1.11.2", "dayjs": "^1.11.13", "humanize-duration": "^3.32.1", - "jdenticon": "^3.3.0", "lodash": "^4.17.21", "multiaddr": "^10.0.1", "notistack": "^3.0.1", diff --git a/src-gui/src/models/tauriModelExt.ts b/src-gui/src/models/tauriModelExt.ts index 5ed587b6..eb369af5 100644 --- a/src-gui/src/models/tauriModelExt.ts +++ b/src-gui/src/models/tauriModelExt.ts @@ -422,6 +422,7 @@ export function hasDescriptorProperty( typeof response.wallet_descriptor === "object" && response.wallet_descriptor !== null && "descriptor" in response.wallet_descriptor && - typeof (response.wallet_descriptor as { descriptor?: unknown }).descriptor === "string" + typeof (response.wallet_descriptor as { descriptor?: unknown }) + .descriptor === "string" ); } diff --git a/src-gui/src/renderer/components/App.tsx b/src-gui/src/renderer/components/App.tsx index 8ea05a46..bd164f26 100644 --- a/src-gui/src/renderer/components/App.tsx +++ b/src-gui/src/renderer/components/App.tsx @@ -82,13 +82,62 @@ function InnerContent() { }} > - } /> - } /> - } /> - } /> - } /> - } /> - } /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> ); diff --git a/src-gui/src/renderer/components/icons/IdentIcon.tsx b/src-gui/src/renderer/components/icons/IdentIcon.tsx deleted file mode 100644 index 8faac188..00000000 --- a/src-gui/src/renderer/components/icons/IdentIcon.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React, { useEffect, useRef } from "react"; -import * as jdenticon from "jdenticon"; - -interface IdentIconProps { - value: string; - size?: number | string; - className?: string; -} - -function IdentIcon({ value, size = 40, className = "" }: IdentIconProps) { - const iconRef = useRef(null); - - useEffect(() => { - if (iconRef.current) { - jdenticon.update(iconRef.current, value); - } - }, [value]); - - return ( - - ); -} - -export default IdentIcon; diff --git a/src-gui/src/renderer/components/modal/PaperTextBox.tsx b/src-gui/src/renderer/components/modal/PaperTextBox.tsx deleted file mode 100644 index 0759dfa0..00000000 --- a/src-gui/src/renderer/components/modal/PaperTextBox.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Button, Paper, Typography } from "@mui/material"; - -export default function PaperTextBox({ stdOut }: { stdOut: string }) { - function handleCopyLogs() { - throw new Error("Not implemented"); - } - - return ( - - - {stdOut} - - - - ); -} diff --git a/src-gui/src/renderer/components/modal/introduction/slides/Slide01_GettingStarted.tsx b/src-gui/src/renderer/components/modal/introduction/slides/Slide01_GettingStarted.tsx index 3e5f3803..af6bf12f 100644 --- a/src-gui/src/renderer/components/modal/introduction/slides/Slide01_GettingStarted.tsx +++ b/src-gui/src/renderer/components/modal/introduction/slides/Slide01_GettingStarted.tsx @@ -1,8 +1,9 @@ import { Typography } from "@mui/material"; import SlideTemplate from "./SlideTemplate"; import imagePath from "assets/walletWithBitcoinAndMonero.png"; +import { IntroSlideProps } from "./SlideTypes"; -export default function Slide01_GettingStarted(props: slideProps) { +export default function Slide01_GettingStarted(props: IntroSlideProps) { return ( diff --git a/src-gui/src/renderer/components/modal/introduction/slides/Slide02_ChooseAMaker.tsx b/src-gui/src/renderer/components/modal/introduction/slides/Slide02_ChooseAMaker.tsx index b5cf0161..f63c39af 100644 --- a/src-gui/src/renderer/components/modal/introduction/slides/Slide02_ChooseAMaker.tsx +++ b/src-gui/src/renderer/components/modal/introduction/slides/Slide02_ChooseAMaker.tsx @@ -1,8 +1,9 @@ import { Typography } from "@mui/material"; import SlideTemplate from "./SlideTemplate"; import imagePath from "assets/mockMakerSelection.svg"; +import { IntroSlideProps } from "./SlideTypes"; -export default function Slide02_ChooseAMaker(props: slideProps) { +export default function Slide02_ChooseAMaker(props: IntroSlideProps) { return ( void; }) => { diff --git a/src-gui/src/renderer/components/modal/introduction/slides/Slide07_ReachOut.tsx b/src-gui/src/renderer/components/modal/introduction/slides/Slide07_ReachOut.tsx index 2066da47..f18f00c1 100644 --- a/src-gui/src/renderer/components/modal/introduction/slides/Slide07_ReachOut.tsx +++ b/src-gui/src/renderer/components/modal/introduction/slides/Slide07_ReachOut.tsx @@ -4,8 +4,9 @@ import imagePath from "assets/groupWithChatbubbles.png"; import GitHubIcon from "@mui/icons-material/GitHub"; import MatrixIcon from "renderer/components/icons/MatrixIcon"; import LinkIconButton from "renderer/components/icons/LinkIconButton"; +import { IntroSlideProps } from "./SlideTypes"; -export default function Slide02_ChooseAMaker(props: slideProps) { +export default function Slide02_ChooseAMaker(props: IntroSlideProps) { return ( void; handlePrevious: () => void; hidePreviousButton?: boolean; diff --git a/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx b/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx deleted file mode 100644 index c9045fd3..00000000 --- a/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { IconButton } from "@mui/material"; -import FeedbackIcon from "@mui/icons-material/Feedback"; -import { useState } from "react"; -import FeedbackDialog from "../../feedback/FeedbackDialog"; - -export default function FeedbackSubmitBadge() { - const [showFeedbackDialog, setShowFeedbackDialog] = useState(false); - - return ( - <> - {showFeedbackDialog && ( - setShowFeedbackDialog(false)} - /> - )} - setShowFeedbackDialog(true)} size="large"> - - - - ); -} diff --git a/src-gui/src/renderer/components/other/ErrorBoundary.tsx b/src-gui/src/renderer/components/other/ErrorBoundary.tsx index ecf04fd5..a2c17821 100644 --- a/src-gui/src/renderer/components/other/ErrorBoundary.tsx +++ b/src-gui/src/renderer/components/other/ErrorBoundary.tsx @@ -13,7 +13,7 @@ interface State { class ErrorBoundary extends Component { public state: State = { hasError: false, - error: null + error: null, }; public static getDerivedStateFromError(error: Error): State { @@ -30,13 +30,19 @@ class ErrorBoundary extends Component { return (

Sorry.. there was an error

-
+          
             {this.state.error?.message}
           
{this.state.error?.stack && ( -
+
Stack trace -
+              
                 {this.state.error.stack}
               
diff --git a/src-gui/src/renderer/components/other/LoadingButton.tsx b/src-gui/src/renderer/components/other/LoadingButton.tsx deleted file mode 100644 index aa60ee2f..00000000 --- a/src-gui/src/renderer/components/other/LoadingButton.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import Button, { ButtonProps } from "@mui/material/Button"; -import CircularProgress from "@mui/material/CircularProgress"; -import React from "react"; - -interface LoadingButtonProps extends ButtonProps { - loading: boolean; -} - -const LoadingButton: React.FC = ({ - loading, - disabled, - children, - ...props -}) => { - return ( - - ); -}; - -export default LoadingButton; diff --git a/src-gui/src/renderer/components/pages/swap/swap/in_progress/BitcoinRedeemedPage.tsx b/src-gui/src/renderer/components/pages/swap/swap/in_progress/BitcoinRedeemedPage.tsx deleted file mode 100644 index 6b972c8a..00000000 --- a/src-gui/src/renderer/components/pages/swap/swap/in_progress/BitcoinRedeemedPage.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import CircularProgressWithSubtitle from "renderer/components/pages/swap/swap/components/CircularProgressWithSubtitle"; - -export default function BitcoinRedeemedPage() { - return ; -} diff --git a/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx b/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx deleted file mode 100644 index cf18b882..00000000 --- a/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Box, Button, Typography } from "@mui/material"; -import SendIcon from "@mui/icons-material/Send"; -import { useState } from "react"; -import { SatsAmount } from "renderer/components/other/Units"; -import { useAppSelector } from "store/hooks"; -import BitcoinIcon from "../../icons/BitcoinIcon"; -import InfoBox from "../swap/swap/components/InfoBox"; -import WithdrawDialog from "../../modal/wallet/WithdrawDialog"; -import WalletRefreshButton from "./WalletRefreshButton"; - -export default function WithdrawWidget() { - const walletBalance = useAppSelector((state) => state.bitcoinWallet.balance); - const [showDialog, setShowDialog] = useState(false); - - function onShowDialog() { - setShowDialog(true); - } - - return ( - <> - - Wallet Balance - - - } - mainContent={ - - - - } - icon={} - additionalContent={ - - } - loading={false} - /> - setShowDialog(false)} /> - - ); -} diff --git a/src-gui/src/utils/cryptoUtils.ts b/src-gui/src/utils/cryptoUtils.ts deleted file mode 100644 index 1e6a4c80..00000000 --- a/src-gui/src/utils/cryptoUtils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createHash } from "crypto"; - -export function sha256(data: string): string { - return createHash("md5").update(data).digest("hex"); -} diff --git a/src-gui/src/utils/event.ts b/src-gui/src/utils/event.ts deleted file mode 100644 index 7aace594..00000000 --- a/src-gui/src/utils/event.ts +++ /dev/null @@ -1,21 +0,0 @@ -export class SingleTypeEventEmitter { - private listeners: Array<(data: T) => void> = []; - - // Method to add a listener for the event - on(listener: (data: T) => void) { - this.listeners.push(listener); - } - - // Method to remove a listener - off(listener: (data: T) => void) { - const index = this.listeners.indexOf(listener); - if (index > -1) { - this.listeners.splice(index, 1); - } - } - - // Method to emit the event - emit(data: T) { - this.listeners.forEach((listener) => listener(data)); - } -} diff --git a/src-gui/yarn.lock b/src-gui/yarn.lock index d916b5bd..bff3501d 100644 --- a/src-gui/yarn.lock +++ b/src-gui/yarn.lock @@ -531,7 +531,7 @@ integrity sha512-upzCtG6awpL6noEZlJ5Z01khZ9VnLNLaj7tb6iPbN6G97eYfUTs8e9OyPKy3rEms3VQWmVBfri7jzeaRxdFIzA== dependencies: "@babel/runtime" "^7.28.2" - + "@mui/material@^7.1.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.3.1.tgz#bd1bf1344cc7a69b6e459248b544f0ae97945b1d" @@ -1132,13 +1132,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93" integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== -"@types/node@*": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec" - integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow== - dependencies: - undici-types "~7.10.0" - "@types/node@^22.15.29": version "22.17.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.17.2.tgz#47a93d6f4b79327da63af727e7c54e8cab8c4d33" @@ -1643,13 +1636,6 @@ caniuse-lite@^1.0.30001735: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz#8292bb7591932ff09e9a765f12fdf5629a241ccc" integrity sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw== -canvas-renderer@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/canvas-renderer/-/canvas-renderer-2.2.1.tgz#c1d131f78a9799aca8af9679ad0a005052b65550" - integrity sha512-RrBgVL5qCEDIXpJ6NrzyRNoTnXxYarqm/cS/W6ERhUJts5UQtt/XPEosGN3rqUkZ4fjBArlnCbsISJ+KCFnIAg== - dependencies: - "@types/node" "*" - chai@^5.1.2: version "5.3.2" resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.2.tgz#e2c35570b8fa23b5b7129b4114d5dc03b3fd3401" @@ -2785,13 +2771,6 @@ iterator.prototype@^1.1.4: has-symbols "^1.1.0" set-function-name "^2.0.2" -jdenticon@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/jdenticon/-/jdenticon-3.3.0.tgz#64bae9f9b3cf5c2a210e183648117afe3a89b367" - integrity sha512-DhuBRNRIybGPeAjMjdHbkIfiwZCCmf8ggu7C49jhp6aJ7DYsZfudnvnTY5/1vgUhrGA7JaDAx1WevnpjCPvaGg== - dependencies: - canvas-renderer "~2.2.0" - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3989,11 +3968,6 @@ undici-types@~6.21.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== -undici-types@~7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" - integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== - update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420"