diff --git a/.forgejo/workflows/deploy-dev.yml b/.forgejo/workflows/deploy-dev.yml index ab7edf1..6854282 100644 --- a/.forgejo/workflows/deploy-dev.yml +++ b/.forgejo/workflows/deploy-dev.yml @@ -168,7 +168,7 @@ jobs: test -d releases find releases -type f | grep -q . - LATEST_PROD_TAG="$(git tag --list '*-prod' --sort=-v:refname | head -n 1 || true)" + LATEST_PROD_TAG="$(git for-each-ref refs/tags --sort=-creatordate --format='%(refname:short)' | awk '!/-/' | head -n 1 || true)" if [ -n "$LATEST_PROD_TAG" ]; then RAW_LOG="$(git log "$LATEST_PROD_TAG"..HEAD --pretty=format:'- %s')" diff --git a/apps/tauri/android.png b/apps/tauri/android.png new file mode 100644 index 0000000..f77258e Binary files /dev/null and b/apps/tauri/android.png differ diff --git a/apps/tauri/background.png b/apps/tauri/background.png new file mode 100644 index 0000000..e6157bd Binary files /dev/null and b/apps/tauri/background.png differ diff --git a/apps/tauri/logo.json b/apps/tauri/logo.json new file mode 100644 index 0000000..9cd2fcb --- /dev/null +++ b/apps/tauri/logo.json @@ -0,0 +1,8 @@ +{ + "default": "./logo.svg", + + "android_fg": "./android.png", + "android_bg": "./background.png", + "android_fg_scale": 100, + "android_monochrome": "./monochrome.png" +} \ No newline at end of file diff --git a/apps/tauri/monochrome.png b/apps/tauri/monochrome.png new file mode 100644 index 0000000..04d3abd Binary files /dev/null and b/apps/tauri/monochrome.png differ diff --git a/apps/tauri/package.json b/apps/tauri/package.json index edde704..a89a309 100644 --- a/apps/tauri/package.json +++ b/apps/tauri/package.json @@ -30,7 +30,7 @@ "build:desktop:raw": "tauri build", "dev:desktop": "if command -v nix >/dev/null 2>&1; then nix develop --command bun dev:desktop:raw; else bun dev:desktop:raw; fi", "build:desktop": "if command -v nix >/dev/null 2>&1; then nix develop --command bun build:desktop:raw; else bun build:desktop:raw; fi", - "gen-icons": "tauri icon ./logo.svg", + "gen-icons": "tauri icon ./logo.json", "format": "bunx prettier --write .", "lint": "eslint src" }, diff --git a/apps/tauri/render-version.ts b/apps/tauri/render-version.ts index 96f1c10..0bd3fca 100644 --- a/apps/tauri/render-version.ts +++ b/apps/tauri/render-version.ts @@ -12,9 +12,7 @@ const tauriConfigPath = path.resolve(__dirname, "./src-tauri/tauri.conf.json"); const isUnrender = process.argv.includes("--unrender"); // Version Source -const packageJson = JSON.parse( - fs.readFileSync(rootPackageJsonPath, "utf8") -); +const packageJson = JSON.parse(fs.readFileSync(rootPackageJsonPath, "utf8")); const packageVersion: string = packageJson.version; @@ -22,9 +20,7 @@ if (!packageVersion && !isUnrender) { throw new Error("No version found in package.json"); } -const targetVersion = isUnrender - ? PLACEHOLDER_VERSION - : packageVersion; +const targetVersion = isUnrender ? PLACEHOLDER_VERSION : packageVersion; // Helpers function updateCargoToml(content: string): string { @@ -34,10 +30,7 @@ function updateCargoToml(content: string): string { throw new Error("Could not find version field in Cargo.toml"); } - return content.replace( - regex, - `version = "${targetVersion}"` - ); + return content.replace(regex, `version = "${targetVersion}"`); } function updateTauriConfig(content: string): string { @@ -47,10 +40,7 @@ function updateTauriConfig(content: string): string { throw new Error("Could not find version field in tauri.conf.json"); } - return content.replace( - regex, - `"version": "${targetVersion}"` - ); + return content.replace(regex, `"version": "${targetVersion}"`); } // Update Cargo.toml @@ -72,4 +62,4 @@ if (isUnrender) { console.log(`Unrendered versions back to ${PLACEHOLDER_VERSION}`); } else { console.log(`Rendered version ${targetVersion}`); -} \ No newline at end of file +} diff --git a/apps/tauri/src-tauri/Cargo.lock b/apps/tauri/src-tauri/Cargo.lock index e65d82e..77d465a 100644 --- a/apps/tauri/src-tauri/Cargo.lock +++ b/apps/tauri/src-tauri/Cargo.lock @@ -4838,7 +4838,7 @@ dependencies = [ [[package]] name = "tensamin" -version = "0.1.0" +version = "0.0.0" dependencies = [ "base64 0.22.1", "image 0.25.10", diff --git a/apps/tauri/src-tauri/Cargo.toml b/apps/tauri/src-tauri/Cargo.toml index 4349e3b..c5b2b18 100644 --- a/apps/tauri/src-tauri/Cargo.toml +++ b/apps/tauri/src-tauri/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "Tensamin" +name = "tensamin" version = "0.0.0" description = "Privacy focused messanger" authors = ["methanium"] diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 2ffbf24..0343c28 100644 --- a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 7ca92f2..fbd7184 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000..b038821 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 95921b1..0eac8d0 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..b1a2c84 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 6f6acb3..7b90201 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index e3ccebc..10832d3 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 0000000..5635294 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index cfed569..b2a3603 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..b13236e Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index f237a2f..f5fb52c 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index fba4b45..4a07614 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000..16908ba Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index 96a1203..ac4b850 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..c929b14 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 3a1dd10..7ed0607 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 75883bf..7aee207 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..15cf062 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 0310c75..6ab46b6 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..21f0293 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 0f39640..f596b89 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 5cc280f..1030031 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..0b02649 Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index f8eeb11..f20325b 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..8c3f92e Binary files /dev/null and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 1a556d3..d70a938 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/values/strings.xml b/apps/tauri/src-tauri/gen/android/app/src/main/res/values/strings.xml index e9951d1..2551e9e 100644 --- a/apps/tauri/src-tauri/gen/android/app/src/main/res/values/strings.xml +++ b/apps/tauri/src-tauri/gen/android/app/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - tensamin - tensamin + Tensamin + Tensamin \ No newline at end of file diff --git a/apps/tauri/src-tauri/icons/icon.icns b/apps/tauri/src-tauri/icons/icon.icns index b1ecd70..daf2362 100644 Binary files a/apps/tauri/src-tauri/icons/icon.icns and b/apps/tauri/src-tauri/icons/icon.icns differ diff --git a/apps/tauri/src/deeplinkHandler.tsx b/apps/tauri/src/deeplinkHandler.tsx index 36def6d..1053ea3 100644 --- a/apps/tauri/src/deeplinkHandler.tsx +++ b/apps/tauri/src/deeplinkHandler.tsx @@ -7,6 +7,7 @@ import { } from "react"; import { getCurrent, onOpenUrl } from "@tauri-apps/plugin-deep-link"; import { isTauri } from "@tauri-apps/api/core"; +import { useIsMobile } from "@tensamin/ui"; type DeeplinkContextValue = { deeplinks: readonly string[]; @@ -31,10 +32,10 @@ export default function DeeplinkProvider({ children: ReactNode; }) { const [deeplinks, setDeeplinks] = useState([]); - const isTauriEnv = isTauri(); + const isMobile = useIsMobile(); useEffect(() => { - if (!isTauriEnv) return; + if (!isTauri() || !isMobile) return; let mounted = true; let unlisten: (() => void) | undefined; @@ -57,7 +58,7 @@ export default function DeeplinkProvider({ mounted = false; unlisten?.(); }; - }, [isTauriEnv]); + }, [isMobile]); return ( +
+ + + + {user.display.slice(0, 2).toUpperCase()} + + +
+

{user.display}

+

{user.username}

+
+
+ +
+

+ 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 9e3ec9d..a49a318 100644 --- a/apps/web/src/components/navbar.tsx +++ b/apps/web/src/components/navbar.tsx @@ -1,7 +1,8 @@ -import { Button } from "@tensamin/ui"; +import { Button, Popover, PopoverContent, PopoverTrigger } from "@tensamin/ui"; import { ArrowLeft, ChevronDown, + ChevronUp, House, Phone, Settings, @@ -17,6 +18,7 @@ import { useState } from "react"; import { SidebarTrigger, useSidebar } from "@tensamin/ui"; import { WindowControls as Controls } from "@tensamin/ui"; import { useSession } from "@tensamin/storage/session"; +import Profile from "./modals/profile"; export default function Navbar({ forMobile }: { forMobile: boolean }) { const navigate = useNavigate(); @@ -33,6 +35,8 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { const [selectOpen, setSelectOpen] = useState(false); + const [userInfoOpen, setUserInfoOpen] = useState(false); + return (
( - + <> + + +

{user?.display}

+ {userInfoOpen ? : } + + } + /> + + + +
+ )} loading={} /> @@ -141,7 +156,7 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { )} )} - +
); diff --git a/apps/web/src/components/screens/login/form.tsx b/apps/web/src/components/screens/login/form.tsx index f275840..e318c4b 100644 --- a/apps/web/src/components/screens/login/form.tsx +++ b/apps/web/src/components/screens/login/form.tsx @@ -1,4 +1,4 @@ -import { Button, cn } from "@tensamin/ui"; +import { Button, cn, useIsMobile } from "@tensamin/ui"; import { Input } from "@tensamin/ui"; import { Label } from "@tensamin/ui"; import { useStorage } from "@tensamin/storage/context"; @@ -84,6 +84,7 @@ function parseTuFileContent(rawFileContent: string): { } export default function Form() { + const isMobile = useIsMobile(); const uploadRef = React.useRef(null); const [isDragging, setIsDragging] = React.useState(false); const { save } = useStorage(); @@ -266,7 +267,7 @@ export default function Form() { return (
- {isTauri() ? ( + {isTauri() && isMobile ? ( <> { diff --git a/bun.lock b/bun.lock index a15bdbe..1f1b34a 100644 --- a/bun.lock +++ b/bun.lock @@ -171,6 +171,7 @@ "name": "@tensamin/notifications", "version": "0.0.0", "dependencies": { + "@tanstack/react-router": "^1.169.1", "@tauri-apps/api": "^2.11.0", "@tensamin/chat": "workspace:*", "@tensamin/crypto": "workspace:*", diff --git a/packages/call/src/store.tsx b/packages/call/src/store.tsx index 5b49603..5398e70 100644 --- a/packages/call/src/store.tsx +++ b/packages/call/src/store.tsx @@ -295,13 +295,15 @@ async function updateLocalParticipantAttributes( screenSharePreviewLength: attributes.screenSharePreview?.length ?? 0, }); - await getRoom().localParticipant.setAttributes(attributes).catch((error) => { - log(1, "call", "red", "Failed to update local participant attributes", { - attributes: Object.keys(attributes), - error, + await getRoom() + .localParticipant.setAttributes(attributes) + .catch((error) => { + log(1, "call", "red", "Failed to update local participant attributes", { + attributes: Object.keys(attributes), + error, + }); + throw error; }); - throw error; - }); log(2, "call", "purple", "Updated local participant attributes", { attributeKeys: Object.keys(attributes), @@ -795,11 +797,13 @@ export async function connect(callId: string) { syncAllRemoteTrackSubscriptions(); - await getRoom().localParticipant.setMicrophoneEnabled(true).catch((error) => { - log(1, "call", "red", "Failed to enable microphone", error); - toast("error", "Failed to enable microphone."); - throw error; - }); + await getRoom() + .localParticipant.setMicrophoneEnabled(true) + .catch((error) => { + log(1, "call", "red", "Failed to enable microphone", error); + toast("error", "Failed to enable microphone."); + throw error; + }); syncParticipantState(); } diff --git a/packages/call/todo.md b/packages/call/todo.md index 61d70ed..4db4db0 100644 --- a/packages/call/todo.md +++ b/packages/call/todo.md @@ -11,4 +11,3 @@ - Desktop-App screenshares - Context menus - Popout Window -- If micGated=true & isSpeaking=false for 5 seconds show banner with mic detection diff --git a/packages/chat/src/components/input.tsx b/packages/chat/src/components/input.tsx index b2aef9e..cf74848 100644 --- a/packages/chat/src/components/input.tsx +++ b/packages/chat/src/components/input.tsx @@ -97,6 +97,7 @@ export default function InputComponent({ > { - messagesRef.current = messages; - }, [messages]); - const getItemKey = React.useCallback( (index: number) => { if (shouldShowConversationStart && index === 0) { @@ -114,9 +109,9 @@ export default function Screen() { } const messageIndex = shouldShowConversationStart ? index - 1 : index; - return messagesRef.current[messageIndex]?.send_time ?? index; + return messages[messageIndex]?.send_time ?? index; }, - [shouldShowConversationStart], + [shouldShowConversationStart, messages], ); const setMeasurementRef = React.useCallback( @@ -360,9 +355,38 @@ export default function Screen() { return; } - scrollRef.current.scrollTop = scrollRef.current.scrollHeight; - isAtBottomRef.current = true; - setHasScrolledToBottomInitially(true); + let rafId: number; + let stableFrames = 0; + let lastScrollHeight = 0; + + const settleToBottom = () => { + if (!scrollRef.current || hasScrolledToBottomInitially) { + return; + } + + scrollRef.current.scrollTop = scrollRef.current.scrollHeight; + const currentScrollHeight = scrollRef.current.scrollHeight; + + if (currentScrollHeight === lastScrollHeight) { + stableFrames++; + } else { + stableFrames = 0; + lastScrollHeight = currentScrollHeight; + } + + if (stableFrames >= 2) { + isAtBottomRef.current = true; + setHasScrolledToBottomInitially(true); + } else { + rafId = requestAnimationFrame(settleToBottom); + } + }; + + settleToBottom(); + + return () => { + cancelAnimationFrame(rafId); + }; }, [hasScrolledToBottomInitially, virtualRowCount]); React.useLayoutEffect(() => { @@ -442,6 +466,19 @@ export default function Screen() { }} onScroll={handleContainerScroll} > + {messagesQuery.isPending && ( +
+

+ + Loading... +

+
+ )} + {messagesQuery.isFetchingNextPage && ( +
+ +
+ )}
(undefined); -function reduceDisplay(display: string) { - const words = display.split(" "); - if (words.length === 1) { - return display.slice(0, 2).toUpperCase(); - } else { - return words[0].charAt(0).toUpperCase() + words[1].charAt(0).toUpperCase(); - } +async function requestNotificationPermission() { + if (!("Notification" in window)) return false; + + if (Notification.permission === "granted") return true; + + const permission = await Notification.requestPermission(); + return permission === "granted"; } export default function Provider(props: { children: React.ReactNode }) { @@ -29,6 +30,7 @@ export default function Provider(props: { children: React.ReactNode }) { const { decryptText, getSharedSecret } = useCrypto(); const { addLiveMessage, userId } = useChat(); const { moveUserIdToTop } = useSession(); + const navigate = useNavigate(); useEffect(() => { return subscribePush(async (ttpMessage) => { @@ -54,7 +56,7 @@ export default function Provider(props: { children: React.ReactNode }) { (await load("settings.read_confirmations")) && userId === sender_id ) { - await send( + void send( "message_state", { message_state: "read", @@ -64,7 +66,7 @@ export default function Provider(props: { children: React.ReactNode }) { }, ); } else { - await send( + void send( "message_state", { message_state: "received", @@ -92,18 +94,41 @@ export default function Provider(props: { children: React.ReactNode }) { if (isTauri()) { console.log("weewoo"); } else { - sonnerToast(user.display, { - classNames: { - content: "pl-4", - }, - description: decryptedContent, - icon: ( - - - {reduceDisplay(user.display)} - - ), - }); + const hasPermissions = await requestNotificationPermission(); + + if (hasPermissions) { + const notification = new Notification(user.display, { + body: decryptedContent, + icon: user.avatar || user.display.slice(0, 2).toUpperCase(), + badge: user.avatar || user.display.slice(0, 2).toUpperCase(), + tag: `message-${user.user_id}`, + silent: true, + }); + + notification.onclick = () => { + window.focus(); + navigate({ + to: `/chat?id=${user.user_id}`, + }); + + notification.close(); + }; + } else { + sonnerToast(user.display, { + classNames: { + content: "pl-4", + }, + description: decryptedContent, + icon: ( + + + + {user.display.slice(0, 2).toUpperCase()} + + + ), + }); + } } } }); @@ -117,6 +142,7 @@ export default function Provider(props: { children: React.ReactNode }) { userId, moveUserIdToTop, send, + navigate, ]); return ( diff --git a/packages/ttp/src/context.tsx b/packages/ttp/src/context.tsx index 2f8fc40..d33313d 100644 --- a/packages/ttp/src/context.tsx +++ b/packages/ttp/src/context.tsx @@ -257,7 +257,7 @@ export function Provider(props: { setErrorDescription( "You could try to restart your Iota, check for updates or check your network connection.", ); - }) + }); }, [connected, subscribePush]); useEffect(() => {