diff --git a/apps/android/android/app/build.gradle b/apps/android/android/app/build.gradle index 2eb3f8b..6fb1a9e 100644 --- a/apps/android/android/app/build.gradle +++ b/apps/android/android/app/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 27 - versionName "1.1.1" + versionName "1.1.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/apps/electron/package.json b/apps/electron/package.json index 223bc0e..4eef553 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -1,7 +1,7 @@ { "name": "@discord-clone/electron", "private": true, - "version": "1.1.1", + "version": "1.1.2", "description": "Brycord - Electron app", "author": "Moyettes", "type": "module", diff --git a/apps/web/package.json b/apps/web/package.json index f97a667..de3e051 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@discord-clone/web", "private": true, - "version": "1.1.1", + "version": "1.1.2", "type": "module", "scripts": { "dev": "vite", diff --git a/convex/voiceState.ts b/convex/voiceState.ts index a89188e..1a6aa60 100644 --- a/convex/voiceState.ts +++ b/convex/voiceState.ts @@ -159,6 +159,13 @@ export const getAll = query({ avatarUrl: string | null; joinSoundUrl: string | null; watchingStream: string | null; + // Unix ms of when this voiceState row was created — used by the + // sidebar to render the "time in channel" indicator for the + // current user. `_creationTime` is populated by Convex + // automatically on insert, and since the join/move/afk paths + // always delete + insert (never patch across channels) it also + // correctly restarts on a channel hop. + joinedAt: number; }>> = {}; for (const s of states) { @@ -183,6 +190,7 @@ export const getAll = query({ avatarUrl, joinSoundUrl, watchingStream: s.watchingStream ?? null, + joinedAt: s._creationTime, }); } diff --git a/packages/shared/package.json b/packages/shared/package.json index 62f16fb..6e1326f 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,7 +1,7 @@ { "name": "@discord-clone/shared", "private": true, - "version": "1.1.1", + "version": "1.1.2", "type": "module", "main": "src/App.tsx", "dependencies": { diff --git a/packages/shared/src/assets/icons/hashtag-pinned.svg b/packages/shared/src/assets/icons/hashtag-pinned.svg new file mode 100644 index 0000000..b5d2e2b --- /dev/null +++ b/packages/shared/src/assets/icons/hashtag-pinned.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/shared/src/assets/icons/voice-pinned.svg b/packages/shared/src/assets/icons/voice-pinned.svg new file mode 100644 index 0000000..59db318 --- /dev/null +++ b/packages/shared/src/assets/icons/voice-pinned.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/shared/src/components/channel/LinkEmbed.tsx b/packages/shared/src/components/channel/LinkEmbed.tsx index ac58221..bb99c71 100644 --- a/packages/shared/src/components/channel/LinkEmbed.tsx +++ b/packages/shared/src/components/channel/LinkEmbed.tsx @@ -224,6 +224,13 @@ function DirectMediaEmbed({ // of web video; when the real metadata lands and differs slightly // the ResizeObserver catches it, but the gross box is already // there. + // + // Appending `#t=0.1` is a media-fragment hint that forces the + // browser to seek to 0.1s, which makes it decode and paint that + // frame as a pseudo-poster. Android WebView otherwise renders a + // blank rectangle for `