diff --git a/.fallowrc.json b/.fallowrc.json index 022e0cc..320cbb5 100644 --- a/.fallowrc.json +++ b/.fallowrc.json @@ -1,11 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", - "entry": [ - "src/index.{ts,tsx,js,jsx}", - "src/main.{ts,tsx,js,jsx}", - "apps/tauri/render-version.ts", - "packages/**/*.test.ts" - ], + "entry": ["src/index.{ts,tsx,js,jsx}", "src/main.{ts,tsx,js,jsx}"], "workspaces": { "packages": ["packages/*", "apps/*"] }, diff --git a/apps/electron/package.json b/apps/electron/package.json index d650270..aa4d5a0 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -9,7 +9,6 @@ "main": "dist/main/main.js", "scripts": { "clean": "rm -rf dist release", - "lint": "eslint src", "build:web": "cd ../.. && bun run build:web", "build": "tsc -p tsconfig.json && esbuild src/preload/preload.ts --bundle --platform=node --format=cjs --external:electron --outfile=dist/preload/preload.cjs", "dev:raw": "cd ../.. && bun run build:web && cd apps/electron && bun run build && electron . --verbose", @@ -27,7 +26,9 @@ "validate:raw": "bun run build && bun run package:linux:raw", "validate": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run validate:raw; else bun run validate:raw; fi" }, - "dependencies": {}, + "dependencies": { + "electron-updater": "^6.6.2" + }, "devDependencies": { "@types/node": "^25.9.1", "electron": "^39.2.7", diff --git a/apps/electron/src/main/main.ts b/apps/electron/src/main/main.ts index ebda1e5..05f88fc 100644 --- a/apps/electron/src/main/main.ts +++ b/apps/electron/src/main/main.ts @@ -12,7 +12,6 @@ import { import { checkForUpdates } from "./updates.js"; import { ipcChannels, - type DesktopScreenShareAudioOutput, type DesktopScreenShareCapabilities, } from "../shared/ipc.js"; @@ -89,7 +88,7 @@ function execJson(command: string, args: string[]) { }); } -async function listAudioOutputs(): Promise { +async function listAudioOutputs() { verboseLog("listAudioOutputs", { platform: process.platform }); if (process.platform !== "linux") return []; @@ -107,9 +106,7 @@ async function listAudioOutputs(): Promise { if (!id || !name) return null; return { id, name, isDefault: false }; }) - .filter( - (output): output is DesktopScreenShareAudioOutput => output != null, - ); + .filter(Boolean); } async function listScreenShareSources() { diff --git a/apps/tauri/package.json b/apps/tauri/package.json index fb41de4..91c18bd 100644 --- a/apps/tauri/package.json +++ b/apps/tauri/package.json @@ -30,10 +30,12 @@ "@tauri-apps/api": "^2", "@tauri-apps/plugin-barcode-scanner": "~2", "@tauri-apps/plugin-deep-link": "~2", - "react-dom": "^19.2.0", + "@tauri-apps/plugin-opener": "^2", "@tensamin/ui": "*", "@tensamin/shared": "workspace:*", - "react": "^19.2.0" + "lucide-react": "^1.14.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" }, "devDependencies": { "@tauri-apps/cli": "^2", diff --git a/apps/web/package.json b/apps/web/package.json index 04d731f..0748a1f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@fontsource-variable/inter": "^5.2.8", + "@noble/curves": "^2.2.0", "@tailwindcss/vite": "^4.2.4", "@tanstack/react-router": "^1.169.1", "@tanstack/react-virtual": "^3.13.24", @@ -29,13 +30,21 @@ "@tensamin/ui": "*", "@tensamin/user": "workspace:*", "@tensamin/notifications": "workspace:*", - "tw-animate-css": "^1.4.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "framer-motion": "^12.38.0", "lucide-react": "^1.14.0", "qrcode": "^1.5.4", "react": "^19.2.0", "react-dom": "^19.2.0", - "tailwindcss": "^4.2.4", + "shadcn": "^4.6.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", "tailwind-scrollbar-hide": "^4.0.0", + "tailwindcss": "^4.2.4", + "tauri-plugin-app-events-api": "^0.2.0", + "tw-animate-css": "^1.4.0", "zod": "^4.3.6" }, "devDependencies": { diff --git a/apps/web/src/components/modals/profile.tsx b/apps/web/src/components/modals/profile.tsx index c46e4ef..6a31e36 100644 --- a/apps/web/src/components/modals/profile.tsx +++ b/apps/web/src/components/modals/profile.tsx @@ -1,62 +1,8 @@ import type { User } from "@tensamin/user/context"; -import { - Avatar, - AvatarFallback, - AvatarImage, - Button, - Tooltip, - TooltipContent, - TooltipTrigger, -} from "@tensamin/ui"; -import { toLossySixDigitCode } from "@tensamin/shared/code"; +import { Avatar, AvatarFallback, AvatarImage } from "@tensamin/ui"; import Text from "@tensamin/markdown/text"; -import { ChevronDown, ChevronUp, Info } from "lucide-react"; -import { useEffect, useState } from "react"; -import { useCrypto } from "@tensamin/crypto/context"; -import { useStorage } from "@tensamin/storage/context"; -import { useUser } from "@tensamin/user/context"; export default function Profile({ user }: { user: User }) { - const [showAdvancedInformation, setShowAdvancedInformation] = useState(false); - const [sharedSecret, setSharedSecret] = useState(""); - - const { getSharedSecret } = useCrypto(); - const { load } = useStorage(); - const { get } = useUser(); - - useEffect(() => { - let active = true; - - void (async () => { - try { - const ownId = await load("user_id"); - const privateKey = await load("private_key"); - const ownData = await get(ownId); - const secret = await getSharedSecret( - privateKey, - ownData.public_key, - user.public_key, - ); - - if (active) { - setSharedSecret(secret); - } - } catch { - if (active) { - setSharedSecret(""); - } - } - })(); - - return () => { - active = false; - }; - }, [get, getSharedSecret, load, user.public_key]); - - const sharedSecretCode = sharedSecret - ? toLossySixDigitCode(sharedSecret) - : "------"; - return (
@@ -72,42 +18,17 @@ export default function Profile({ user }: { user: User }) {
- - {showAdvancedInformation && ( -
-

- Shared Code: {sharedSecretCode}{" "} - - } /> - - You can compare this code with the conversation partner to - validate that this chat is E2EE - - -

-

- Iota ID: {user.iota_id} -

-

- User ID: {user.user_id} -

-

- Public Key: {user.public_key} -

-
- )} +
+

+ iota: {user.iota_id} +

+

+ user: {user.user_id} +

+

+ pub key: {user.public_key} +

+
); } diff --git a/apps/web/src/components/navbar.tsx b/apps/web/src/components/navbar.tsx index 7550b28..1c48c6c 100644 --- a/apps/web/src/components/navbar.tsx +++ b/apps/web/src/components/navbar.tsx @@ -33,6 +33,8 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { const isMobile = useIsMobile(); + const [selectOpen, setSelectOpen] = useState(false); + const [userInfoOpen, setUserInfoOpen] = useState(false); return ( @@ -72,7 +74,7 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { userId={id} component={(user) => isMobile ? ( -

{user?.display}

+

{user?.display}

) : ( -

- {user?.display} -

+

{user?.display}

} /> @@ -131,20 +131,15 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { ) : ( <> - +