Skip to content

Commit f74e6dc

Browse files
authored
release: v5.19.0
RC: v5.19.0
2 parents 465e901 + 3d78754 commit f74e6dc

18 files changed

Lines changed: 213 additions & 50 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ any that are empty.
1818
- **Deprecated** — features marked for removal.
1919
- **Removed** — features removed.
2020

21+
## [5.19.0] - 2026-06-13
22+
23+
### Added
24+
25+
- Group chats are now one tap from the main navigation, with a dot that lights up when one of your groups has new messages and clears once you open the room. Your Groups list also gains a chat shortcut on each group.
26+
27+
### Changed
28+
29+
- The Umamin Chat shortcut moved from the navigation bar into your account menu. It stays in the bar when you're signed out.
30+
2131
## [5.18.0] - 2026-06-13
2232

2333
### Added
@@ -732,6 +742,7 @@ Turso query cost, and a set of audit-driven correctness and security fixes.
732742
- Stopped logging raw errors that could contain usernames or token internals.
733743
- Added a daily cron that prunes expired sessions.
734744

745+
[5.19.0]: https://github.com/omsimos/umamin/compare/v5.18.0...v5.19.0
735746
[5.18.0]: https://github.com/omsimos/umamin/compare/v5.17.0...v5.18.0
736747
[5.17.0]: https://github.com/omsimos/umamin/compare/v5.16.0...v5.17.0
737748
[5.16.0]: https://github.com/omsimos/umamin/compare/v5.15.0...v5.16.0

apps/www/app/(private)/groups/groups-hub.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Button } from "@umamin/ui/components/button";
66
import { cn } from "@umamin/ui/lib/utils";
77
import {
88
CheckIcon,
9+
MessageCircleIcon,
910
PlusIcon,
1011
SettingsIcon,
1112
UsersRoundIcon,
@@ -233,6 +234,19 @@ export function GroupsHub() {
233234
</p>
234235
</Link>
235236

237+
{/* Row → info page (unchanged); this icon jumps straight to
238+
chat. The unread dot lives on the glyph above. */}
239+
<Button
240+
asChild
241+
size="icon"
242+
variant="ghost"
243+
aria-label={`Open ${group.name} chat`}
244+
>
245+
<Link href={`/groups/${group.tag}/chat`}>
246+
<MessageCircleIcon />
247+
</Link>
248+
</Button>
249+
236250
{role === "owner" && (
237251
<Button
238252
asChild

apps/www/app/(private)/inbox/components/sent/sent-card.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import { formatDistanceToNow } from "date-fns";
99
import { CircleUserIcon } from "lucide-react";
1010
import { ChatList } from "@/components/chat-list";
1111
import { HoverPrefetchLink } from "@/components/hover-prefetch-link";
12-
import type { PublicUser } from "@/types/user";
12+
import type { FeedAuthor } from "@/types/user";
1313

1414
export function SentMessageCard({
1515
data,
1616
}: {
17-
data: SelectMessage & { receiver: PublicUser };
17+
data: SelectMessage & { receiver: FeedAuthor };
1818
}) {
1919
return (
2020
<Card>

apps/www/app/(public)/feed/components/repost-header.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import { BadgeCheckIcon, Repeat2Icon } from "lucide-react";
44
import Link from "next/link";
55
import { shortTimeAgo } from "@/lib/utils";
6-
import type { PublicUser } from "@/types/user";
6+
import type { FeedAuthor } from "@/types/user";
77

88
// Plain-repost attribution line — quotes are real posts with their own card.
99
export function RepostHeader({
1010
user,
1111
createdAt,
1212
}: {
13-
user: PublicUser;
13+
user: FeedAuthor;
1414
createdAt: Date;
1515
}) {
1616
const verified =

apps/www/app/(public)/groups/[tag]/chat/group-chat.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ import type {
7070
} from "@/lib/query-types";
7171
import { ReactionsDrawer } from "./reactions-drawer";
7272

73-
const HEAD_POLL_MS = 5000;
73+
// 8s (was 5s): the head poll is the only continuous interval poller and each
74+
// tick is a billed Vercel edge request — 8s trims ~37% of them with minimal
75+
// perceived latency. Keep aligned with HEAD_CACHE_SECONDS in the head route.
76+
const HEAD_POLL_MS = 8000;
7477
const GROUP_MESSAGE_MAX = 1000;
7578
// Cursor for an empty room: "everything since epoch" (bounded) so a brand-new
7679
// room still discovers its first message via the delta path.

apps/www/app/(public)/notes/components/reply-drawer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import { ChatList } from "@/components/chat-list";
2121
import { useDynamicTextarea } from "@/hooks/use-dynamic-textarea";
2222
import { useMediaQuery } from "@/hooks/use-media-query";
2323
import { formatContent } from "@/lib/utils";
24-
import type { PublicUser } from "@/types/user";
24+
import type { FeedAuthorWithBadge } from "@/types/user";
2525

2626
type ChatFormProps = {
27-
note: SelectNote & { user: PublicUser };
27+
note: SelectNote & { user: FeedAuthorWithBadge };
2828
};
2929

3030
type ReplyDrawerProps = {

apps/www/app/api/groups/[tag]/chat/head/route.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import {
1414
// coarse activity markers, and group metadata is already public. Both null
1515
// without Redis — the client then polls the delta directly and reactions become
1616
// eventual on reload.
17-
const HEAD_CACHE_SECONDS = 5;
17+
// Aligned with the client HEAD_POLL_MS (8s) so many members' polls keep
18+
// collapsing to one CDN hit per window.
19+
const HEAD_CACHE_SECONDS = 8;
1820

1921
export async function GET(req: NextRequest) {
2022
const groupId = new URL(req.url).searchParams.get("id");
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getNotesPage } from "@/lib/server/data";
22
import { withPublicRead } from "@/lib/server/read-route";
33

4-
export const GET = withPublicRead("fetching public notes", 120, async (req) => {
4+
export const GET = withPublicRead("fetching public notes", 180, async (req) => {
55
const cursor = req.nextUrl.searchParams.get("cursor");
66
return getNotesPage({ cursor });
77
});

apps/www/app/api/public/posts/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { DEFAULT_FEED_SORT, normalizeFeedSort } from "@/lib/feed-sort";
22
import { getPostsPage } from "@/lib/server/data";
33
import { withPublicRead } from "@/lib/server/read-route";
44

5-
export const GET = withPublicRead("fetching public posts", 120, async (req) => {
5+
export const GET = withPublicRead("fetching public posts", 180, async (req) => {
66
const cursor = req.nextUrl.searchParams.get("cursor");
77
const requestedSort = normalizeFeedSort(req.nextUrl.searchParams.get("sort"));
88
const sort =

apps/www/components/account-sheet.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ import {
1919
CircleFadingPlusIcon,
2020
CircleUserRoundIcon,
2121
LogOutIcon,
22+
MessageSquareQuoteIcon,
2223
SettingsIcon,
2324
UsersRoundIcon,
2425
} from "lucide-react";
2526
import Link from "next/link";
2627
import { GroupBadge } from "@/components/group-badge";
2728
import { ThemeToggleButton } from "@/components/theme-toggle-button";
2829
import { logout } from "@/lib/auth";
30+
import { umaminChatUrl } from "@/lib/chat-link";
2931
import {
3032
infiniteQueryDefaults,
3133
PRIVATE_STALE_TIME,
@@ -36,6 +38,10 @@ import { fetchCurrentUserOptional } from "@/lib/query-fetchers";
3638
const NAV_ITEM_CLASS =
3739
"flex items-center gap-4 rounded-md py-3 text-lg font-semibold transition-colors hover:text-foreground/80";
3840

41+
// Cross-promo to the anonymous chat app, demoted here from the bottom nav (its
42+
// slot now holds Groups). Logged-out viewers still get the full promo in the bar.
43+
const CHAT_URL = umaminChatUrl("account");
44+
3945
// Avatar that opens the account drawer (X-style). Logged-out viewers get a
4046
// plain Login link instead — no drawer to open.
4147
export function AccountSheet({
@@ -154,6 +160,18 @@ export function AccountSheet({
154160
</Link>
155161
</DrawerClose>
156162

163+
<DrawerClose asChild>
164+
<a
165+
href={CHAT_URL}
166+
target="_blank"
167+
rel="noopener noreferrer"
168+
className={NAV_ITEM_CLASS}
169+
>
170+
<MessageSquareQuoteIcon className="size-6" />
171+
Umamin Chat
172+
</a>
173+
</DrawerClose>
174+
157175
<DrawerClose asChild>
158176
<Link href="/settings" className={NAV_ITEM_CLASS}>
159177
<SettingsIcon className="size-6" />

0 commit comments

Comments
 (0)