From f5b620111b5c1bdc9f1fd1ae3cea5fe472f2ed3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=97=D0=B0=D0=B8=D0=B4=20=D0=9E=D0=BC=D0=B0=D1=80=20?= =?UTF-8?q?=D0=9C=D0=B5=D0=B4=D1=85=D0=B0=D1=82=20=7C=20Zaid=20Omar=20Medh?= =?UTF-8?q?at?= Date: Sat, 11 Jul 2026 04:49:07 +0500 Subject: [PATCH] redesign --- .env.example | 4 +- README.md | 3 +- assets/brand/README.md | 36 + assets/brand/adaptive-icon-foreground.svg | 6 + .../android/adaptive-icon-foreground.png | Bin 0 -> 8091 bytes assets/brand/exports/android/icon-1024.png | Bin 0 -> 33139 bytes assets/brand/exports/ios/icon-1024.png | Bin 0 -> 33139 bytes assets/brand/exports/macos/zovi.icns | Bin 0 -> 312369 bytes assets/brand/exports/splash/splash-dark.png | Bin 0 -> 37950 bytes assets/brand/exports/splash/splash-light.png | Bin 0 -> 35722 bytes assets/brand/exports/windows/zovi.ico | Bin 0 -> 285478 bytes assets/brand/favicon.svg | 7 + assets/brand/icon-macos.svg | 14 + assets/brand/icon-rounded.svg | 11 + assets/brand/icon.svg | 11 + assets/brand/mark-gradient.svg | 9 + assets/brand/splash-dark.svg | 14 + assets/brand/splash-light.svg | 14 + infra/nginx/nginx.conf | 2 +- package.json | 2 +- .../migrations/1720000000008_channels.cjs | 15 + .../1720000000009_conversation_avatar.cjs | 14 + .../1720000000010_reply_forward_pin.cjs | 37 + .../1720000000011_forward_origin_shape.cjs | 28 + packages/backend/src/config.ts | 2 +- packages/backend/src/db/schema.ts | 18 +- .../conversations/conversations.mapper.ts | 5 +- .../conversations/conversations.repository.ts | 39 + .../conversations/conversations.routes.ts | 64 +- .../conversations/conversations.service.ts | 65 +- .../src/modules/messages/messages.mapper.ts | 23 +- .../modules/messages/messages.repository.ts | 92 +- .../src/modules/messages/messages.routes.ts | 145 +- .../src/modules/messages/messages.service.ts | 186 ++- .../src/modules/users/users.repository.ts | 12 +- .../src/modules/users/users.service.ts | 11 +- packages/backend/src/plugins/swagger.ts | 2 +- packages/core/src/api/conversations.ts | 22 +- packages/core/src/api/index.ts | 9 +- packages/core/src/api/media.ts | 65 +- packages/core/src/api/messages.ts | 65 +- packages/core/src/events/index.ts | 9 + packages/core/src/schemas/auth.ts | 1 + packages/core/src/schemas/conversation.ts | 34 + packages/core/src/schemas/entities.ts | 35 +- packages/core/src/schemas/index.ts | 4 + packages/core/src/types/conversation.ts | 12 +- packages/core/src/types/index.ts | 2 +- packages/core/src/types/message.ts | 27 + packages/web/index.html | 7 +- packages/web/public/favicon.ico | Bin 0 -> 285478 bytes packages/web/public/favicon.svg | 7 + .../web/public/icons/apple-touch-icon.png | Bin 0 -> 3124 bytes packages/web/public/icons/icon-192.png | Bin 0 -> 3269 bytes packages/web/public/icons/icon-512.png | Bin 0 -> 11259 bytes packages/web/public/manifest.webmanifest | 23 + packages/web/public/sw.js | 3 +- packages/web/src/app/App.tsx | 304 ++-- packages/web/src/app/index.css | 1228 ++++++++++++++++- .../web/src/features/auth/ui/AuthForm.tsx | 5 +- packages/web/src/features/contacts/index.ts | 1 + .../features/contacts/ui/ContactsPanel.tsx | 193 ++- .../src/features/contacts/ui/UserPicker.tsx | 180 +++ .../web/src/features/conversations/index.ts | 3 + .../web/src/features/conversations/model.ts | 30 +- .../conversations/ui/AvatarPicker.tsx | 51 + .../conversations/ui/ConversationSidebar.tsx | 57 +- .../conversations/ui/ForwardPicker.tsx | 118 ++ .../conversations/ui/NewChannelPanel.tsx | 141 ++ .../conversations/ui/NewGroupPanel.tsx | 115 ++ packages/web/src/features/messaging/index.ts | 2 + packages/web/src/features/messaging/model.ts | 451 +++++- .../web/src/features/messaging/playback.ts | 16 + .../web/src/features/messaging/recorder.ts | 17 +- .../src/features/messaging/ui/ChatView.tsx | 791 ++++++++++- .../features/messaging/ui/MediaMessage.tsx | 38 +- .../src/features/messaging/ui/MediaViewer.tsx | 11 +- .../features/messaging/ui/UploadBubble.tsx | 145 ++ .../features/messaging/ui/VideoMessage.tsx | 21 +- .../src/features/messaging/ui/VideoThumb.tsx | 57 + .../features/messaging/ui/VoiceMessage.tsx | 4 +- packages/web/src/features/profile/index.ts | 1 + .../features/profile/ui/GroupInfoPanel.tsx | 175 +++ .../src/features/profile/ui/HeroAvatar.tsx | 53 + .../src/features/profile/ui/ProfilePanel.tsx | 246 +--- .../src/features/profile/ui/SharedMedia.tsx | 309 +++++ .../features/settings/ui/SettingsPanel.tsx | 271 ++-- packages/web/src/shared/lib/index.ts | 1 + .../web/src/shared/lib/useDebouncedValue.ts | 19 + .../web/src/shared/theme/ThemeProvider.tsx | 2 +- packages/web/src/shared/ui/icons.tsx | 65 + packages/web/src/shared/ui/index.ts | 6 + 92 files changed, 5630 insertions(+), 713 deletions(-) create mode 100644 assets/brand/README.md create mode 100644 assets/brand/adaptive-icon-foreground.svg create mode 100644 assets/brand/exports/android/adaptive-icon-foreground.png create mode 100644 assets/brand/exports/android/icon-1024.png create mode 100644 assets/brand/exports/ios/icon-1024.png create mode 100644 assets/brand/exports/macos/zovi.icns create mode 100644 assets/brand/exports/splash/splash-dark.png create mode 100644 assets/brand/exports/splash/splash-light.png create mode 100644 assets/brand/exports/windows/zovi.ico create mode 100644 assets/brand/favicon.svg create mode 100644 assets/brand/icon-macos.svg create mode 100644 assets/brand/icon-rounded.svg create mode 100644 assets/brand/icon.svg create mode 100644 assets/brand/mark-gradient.svg create mode 100644 assets/brand/splash-dark.svg create mode 100644 assets/brand/splash-light.svg create mode 100644 packages/backend/migrations/1720000000008_channels.cjs create mode 100644 packages/backend/migrations/1720000000009_conversation_avatar.cjs create mode 100644 packages/backend/migrations/1720000000010_reply_forward_pin.cjs create mode 100644 packages/backend/migrations/1720000000011_forward_origin_shape.cjs create mode 100644 packages/web/public/favicon.ico create mode 100644 packages/web/public/favicon.svg create mode 100644 packages/web/public/icons/apple-touch-icon.png create mode 100644 packages/web/public/icons/icon-192.png create mode 100644 packages/web/public/icons/icon-512.png create mode 100644 packages/web/public/manifest.webmanifest create mode 100644 packages/web/src/features/contacts/ui/UserPicker.tsx create mode 100644 packages/web/src/features/conversations/ui/AvatarPicker.tsx create mode 100644 packages/web/src/features/conversations/ui/ForwardPicker.tsx create mode 100644 packages/web/src/features/conversations/ui/NewChannelPanel.tsx create mode 100644 packages/web/src/features/conversations/ui/NewGroupPanel.tsx create mode 100644 packages/web/src/features/messaging/playback.ts create mode 100644 packages/web/src/features/messaging/ui/UploadBubble.tsx create mode 100644 packages/web/src/features/messaging/ui/VideoThumb.tsx create mode 100644 packages/web/src/features/profile/ui/GroupInfoPanel.tsx create mode 100644 packages/web/src/features/profile/ui/HeroAvatar.tsx create mode 100644 packages/web/src/features/profile/ui/SharedMedia.tsx create mode 100644 packages/web/src/shared/lib/index.ts create mode 100644 packages/web/src/shared/lib/useDebouncedValue.ts diff --git a/.env.example b/.env.example index 2fee24f..935cac0 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # ============================================================================ -# Altricade Messenger — environment template. +# Zovi Messenger — environment template. # Copy to `.env` (gitignored) and replace every value below. # The values here are CLEARLY-FAKE dev placeholders — NEVER use in production. # ============================================================================ @@ -67,7 +67,7 @@ MINIO_REGION=us-east-1 # The public key is safe to expose to the browser; keep the private key secret. VAPID_PUBLIC_KEY= VAPID_PRIVATE_KEY= -VAPID_SUBJECT=mailto:admin@altricade.com +VAPID_SUBJECT=mailto:admin@zovi.app # Firebase Cloud Messaging (Android now, iOS later — same code path). Point this # at the service-account JSON mounted into the worker; leave empty to disable FCM. FCM_SERVICE_ACCOUNT_FILE= diff --git a/README.md b/README.md index 6c9bf0d..3c93135 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Altricade Messenger +# Zovi Messenger A self-hosted, cross-platform realtime messenger (chat + later calls). TypeScript everywhere, pnpm monorepo. See `specs.md` for the full architecture brief. @@ -71,6 +71,7 @@ Open the Swagger UI, then: 3. Protected endpoints (`/me`, `/auth/sessions`, `/auth/centrifugo-token`, …) now work from "Try it out". > Dev notes: +> > - The backend runs in Docker with `node_modules` baked into the image. After > changing backend dependencies, recreate the container so it picks them up: > `docker compose up -d --build --force-recreate backend`. diff --git a/assets/brand/README.md b/assets/brand/README.md new file mode 100644 index 0000000..c93b460 --- /dev/null +++ b/assets/brand/README.md @@ -0,0 +1,36 @@ +# Zovi brand assets + +Master artwork is SVG; everything else is generated from it. Brand accent: `#4c6fff` +(gradient `#6c8cff → #4c6fff → #3843e8`, 135°). The glyph is the "bubble Z" — a Z whose +bottom-left tail makes it read as a speech bubble. + +## Masters + +| File | What it is | +| --- | --- | +| `icon.svg` | Full-bleed square icon (gradient + white glyph). Source for iOS/Android/web PNGs. | +| `icon-rounded.svg` | Same with 22.4% corner radius baked in. Source for Windows `.ico`. | +| `icon-macos.svg` | Big Sur style: rounded body at 824/1024 grid with transparent margin. Source for `.icns`. | +| `favicon.svg` | Flat `#4c6fff`, glyph enlarged 14% for 16–32px legibility. Shipped as-is on web. | +| `adaptive-icon-foreground.svg` | White glyph inside Android's 66/108 safe circle, transparent bg. | +| `mark-gradient.svg` | Gradient glyph, no background — for docs/marketing on light surfaces. | +| `splash-light.svg` / `splash-dark.svg` | 2048×2048 splash, centered rounded icon on `#ffffff` / `#0c0d10`. | + +## Exports → where they go + +- `exports/ios/icon-1024.png` — Expo `app.json` → `expo.icon` (square; iOS rounds it). +- `exports/android/icon-1024.png` — legacy Android icon (`expo.android.icon`). +- `exports/android/adaptive-icon-foreground.png` — `expo.android.adaptiveIcon.foregroundImage`, + with `backgroundColor: "#4c6fff"` (or regenerate a gradient background layer). +- `exports/splash/splash-light.png` + `splash-dark.png` — `expo.splash.image` / + `expo.splash.dark.image`, `resizeMode: "contain"`, background `#ffffff` / `#0c0d10`. +- `exports/macos/zovi.icns` — Tauri `bundle.icon` (macOS). +- `exports/windows/zovi.ico` — Tauri `bundle.icon` (Windows); also usable for taskbar/installer. +- Web copies live in `packages/web/public/` (`favicon.svg`, `favicon.ico`, `icons/*`, + `manifest.webmanifest`) — already wired into `index.html`. + +## Regenerating + +PNGs: `npx sharp-cli -i .svg -o out.png resize `. +ICO: `npx png-to-ico > out.ico` (pass a real 256px render). +ICNS: build an `.iconset` (16…1024 incl. @2x) from `icon-macos.svg`, then `iconutil -c icns`. diff --git a/assets/brand/adaptive-icon-foreground.svg b/assets/brand/adaptive-icon-foreground.svg new file mode 100644 index 0000000..8fd625e --- /dev/null +++ b/assets/brand/adaptive-icon-foreground.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/brand/exports/android/adaptive-icon-foreground.png b/assets/brand/exports/android/adaptive-icon-foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1d0834b86b629cda24add70f81805d48872f85 GIT binary patch literal 8091 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/brand/exports/windows/zovi.ico b/assets/brand/exports/windows/zovi.ico new file mode 100644 index 0000000000000000000000000000000000000000..08002f544d37ae195359095ddf0f76663b09499f GIT binary patch literal 285478 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

>gd|EJ;pDR2V*9|y<4Q8Tu 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 Z4K#fNP2WJ%H_-GA9NOQ&gbE+;{{dAk(TM;6 literal 0 HcmV?d00001 diff --git a/assets/brand/favicon.svg b/assets/brand/favicon.svg new file mode 100644 index 0000000..18b123d --- /dev/null +++ b/assets/brand/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/brand/icon-macos.svg b/assets/brand/icon-macos.svg new file mode 100644 index 0000000..4abea9a --- /dev/null +++ b/assets/brand/icon-macos.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/brand/icon-rounded.svg b/assets/brand/icon-rounded.svg new file mode 100644 index 0000000..d0690f1 --- /dev/null +++ b/assets/brand/icon-rounded.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/brand/icon.svg b/assets/brand/icon.svg new file mode 100644 index 0000000..c7e8cec --- /dev/null +++ b/assets/brand/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/brand/mark-gradient.svg b/assets/brand/mark-gradient.svg new file mode 100644 index 0000000..9252132 --- /dev/null +++ b/assets/brand/mark-gradient.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/brand/splash-dark.svg b/assets/brand/splash-dark.svg new file mode 100644 index 0000000..5fb651d --- /dev/null +++ b/assets/brand/splash-dark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/brand/splash-light.svg b/assets/brand/splash-light.svg new file mode 100644 index 0000000..2492884 --- /dev/null +++ b/assets/brand/splash-light.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/infra/nginx/nginx.conf b/infra/nginx/nginx.conf index afc20b3..ccd0f20 100644 --- a/infra/nginx/nginx.conf +++ b/infra/nginx/nginx.conf @@ -55,7 +55,7 @@ http { location / { default_type text/plain; - return 200 "Altricade gateway — /api/* -> backend, /connection/websocket -> centrifugo\n"; + return 200 "Zovi gateway — /api/* -> backend, /connection/websocket -> centrifugo\n"; } } } diff --git a/package.json b/package.json index 7bfc703..4cca201 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "altricade-messenger", + "name": "zovi-messenger", "version": "0.0.0", "private": true, "type": "module", diff --git a/packages/backend/migrations/1720000000008_channels.cjs b/packages/backend/migrations/1720000000008_channels.cjs new file mode 100644 index 0000000..61a0b38 --- /dev/null +++ b/packages/backend/migrations/1720000000008_channels.cjs @@ -0,0 +1,15 @@ +// Channels — broadcast conversations (type='channel') where only the owner and +// admins post. `type` is a plain text column, so the new value needs no DDL; +// channels just add an optional description shown on the info page. + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.up = (pgm) => { + pgm.addColumns('conversations', { + description: { type: 'text' }, + }); +}; + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.down = (pgm) => { + pgm.dropColumns('conversations', ['description']); +}; diff --git a/packages/backend/migrations/1720000000009_conversation_avatar.cjs b/packages/backend/migrations/1720000000009_conversation_avatar.cjs new file mode 100644 index 0000000..006a2f1 --- /dev/null +++ b/packages/backend/migrations/1720000000009_conversation_avatar.cjs @@ -0,0 +1,14 @@ +// Group/channel avatars — stores the public avatar URL (same convention as +// users.avatar_ref), null when unset. + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.up = (pgm) => { + pgm.addColumns('conversations', { + image_ref: { type: 'text' }, + }); +}; + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.down = (pgm) => { + pgm.dropColumns('conversations', ['image_ref']); +}; diff --git a/packages/backend/migrations/1720000000010_reply_forward_pin.cjs b/packages/backend/migrations/1720000000010_reply_forward_pin.cjs new file mode 100644 index 0000000..26f3a8d --- /dev/null +++ b/packages/backend/migrations/1720000000010_reply_forward_pin.cjs @@ -0,0 +1,37 @@ +// Reply, forward attribution, and (multiple) pinned messages. + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.up = (pgm) => { + pgm.addColumns('messages', { + // Reply target; if the replied message is hard-deleted the link clears. + reply_to_id: { type: 'uuid', references: 'messages', onDelete: 'SET NULL' }, + // Whether this message is a forward, and a snapshot of the original author + // (PublicUser jsonb) — null when the forwarder chose to hide the origin. + forwarded: { type: 'boolean', notNull: true, default: false }, + forwarded_from: { type: 'jsonb' }, + }); + pgm.createIndex('messages', 'reply_to_id'); + + // Pinned messages (multiple per conversation), newest pin first. + pgm.createTable('message_pins', { + conversation_id: { + type: 'uuid', + notNull: true, + references: 'conversations', + onDelete: 'CASCADE', + }, + message_id: { type: 'uuid', notNull: true, references: 'messages', onDelete: 'CASCADE' }, + pinned_by: { type: 'uuid', notNull: true, references: 'users', onDelete: 'CASCADE' }, + pinned_at: { type: 'timestamptz', notNull: true, default: pgm.func('now()') }, + }); + pgm.addConstraint('message_pins', 'message_pins_pkey', { + primaryKey: ['conversation_id', 'message_id'], + }); + pgm.createIndex('message_pins', ['conversation_id', 'pinned_at']); +}; + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.down = (pgm) => { + pgm.dropTable('message_pins'); + pgm.dropColumns('messages', ['reply_to_id', 'forwarded', 'forwarded_from']); +}; diff --git a/packages/backend/migrations/1720000000011_forward_origin_shape.cjs b/packages/backend/migrations/1720000000011_forward_origin_shape.cjs new file mode 100644 index 0000000..1490ddf --- /dev/null +++ b/packages/backend/migrations/1720000000011_forward_origin_shape.cjs @@ -0,0 +1,28 @@ +// forwarded_from jsonb shape change: was a bare PublicUser snapshot, now a +// ForwardOrigin {name, user} so channel forwards can carry a name without a +// profile link. Rewrites existing rows in place (guarded, idempotent). + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.up = (pgm) => { + pgm.sql(` + UPDATE messages + SET forwarded_from = jsonb_build_object( + 'name', forwarded_from->>'displayName', + 'user', forwarded_from + ) + WHERE forwarded_from IS NOT NULL + AND forwarded_from ? 'displayName' + AND NOT (forwarded_from ? 'user'); + `); +}; + +/** @param {import('node-pg-migrate').MigrationBuilder} pgm */ +exports.down = (pgm) => { + pgm.sql(` + UPDATE messages + SET forwarded_from = forwarded_from->'user' + WHERE forwarded_from IS NOT NULL + AND forwarded_from ? 'user' + AND forwarded_from->'user' IS NOT NULL; + `); +}; diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 50008b1..b6a157e 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -91,7 +91,7 @@ const buildNotificationsConfig = (): NotificationsConfig => { const privateKey = optional('VAPID_PRIVATE_KEY', ''); const webPush = publicKey !== '' && privateKey !== '' - ? { publicKey, privateKey, subject: optional('VAPID_SUBJECT', 'mailto:admin@altricade.com') } + ? { publicKey, privateKey, subject: optional('VAPID_SUBJECT', 'mailto:admin@zovi.app') } : null; const fcmFile = optional('FCM_SERVICE_ACCOUNT_FILE', ''); return { diff --git a/packages/backend/src/db/schema.ts b/packages/backend/src/db/schema.ts index c1cc134..9852c56 100644 --- a/packages/backend/src/db/schema.ts +++ b/packages/backend/src/db/schema.ts @@ -1,5 +1,5 @@ import type { ColumnType, Generated } from 'kysely'; -import type { MediaRef } from '@altricade/core'; +import type { MediaRef, ForwardOrigin } from '@altricade/core'; // Kysely database registry: one interface per table. Grows with each migration. @@ -33,6 +33,10 @@ export interface ConversationsTable { id: Generated; type: Generated; title: string | null; + /** Optional channel description. */ + description: string | null; + /** Group/channel avatar public URL (null when unset). */ + image_ref: string | null; direct_key: string | null; created_by: string; created_at: Generated; @@ -66,6 +70,17 @@ export interface MessagesTable { media_key: string | null; // jsonb: parsed to a MediaRef on read, JSON string on write. media_meta: ColumnType; + reply_to_id: string | null; + forwarded: Generated; + // jsonb: a ForwardOrigin snapshot ({name, user}), or null (hidden / none). + forwarded_from: ColumnType; +} + +export interface MessagePinsTable { + conversation_id: string; + message_id: string; + pinned_by: string; + pinned_at: Generated; } export interface ContactsTable { @@ -163,4 +178,5 @@ export interface Database { chat_folders: ChatFoldersTable; chat_folder_items: ChatFolderItemsTable; chat_pins: ChatPinsTable; + message_pins: MessagePinsTable; } diff --git a/packages/backend/src/modules/conversations/conversations.mapper.ts b/packages/backend/src/modules/conversations/conversations.mapper.ts index 68cd86b..1e00b7f 100644 --- a/packages/backend/src/modules/conversations/conversations.mapper.ts +++ b/packages/backend/src/modules/conversations/conversations.mapper.ts @@ -14,8 +14,11 @@ export const toConversation = ( unreadCount = 0, ): Conversation => ({ id: row.id, - type: row.type === 'direct' ? 'direct' : 'group', + type: row.type === 'direct' ? 'direct' : row.type === 'channel' ? 'channel' : 'group', title: row.title, + description: row.description, + // For a DM the peer's avatar is the conversation avatar; groups/channels use their own. + avatarUrl: peer !== null ? peer.avatarUrl : row.image_ref, peer, createdBy: row.created_by, createdAt: row.created_at.toISOString(), diff --git a/packages/backend/src/modules/conversations/conversations.repository.ts b/packages/backend/src/modules/conversations/conversations.repository.ts index 6ecc863..dc5958c 100644 --- a/packages/backend/src/modules/conversations/conversations.repository.ts +++ b/packages/backend/src/modules/conversations/conversations.repository.ts @@ -27,6 +27,12 @@ const directKeyFor = (a: string, b: string): string => (a < b ? `${a}:${b}` : `$ export interface ConversationsRepository { createGroup(title: string, ownerId: string, memberIds: string[]): Promise; + createChannel( + title: string, + description: string | null, + ownerId: string, + memberIds: string[], + ): Promise; findOrCreateDirect(userA: string, userB: string): Promise; findById(id: string): Promise; listForUser(userId: string): Promise; @@ -39,6 +45,7 @@ export interface ConversationsRepository { listMembers(conversationId: string): Promise; getDeliveryInfo(conversationId: string): Promise; touchLastMessage(conversationId: string): Promise; + setImage(conversationId: string, imageUrl: string): Promise; /** "Clear history" for me: hide everything up to the current max seq; resets unread. Returns that seq. */ clearForUser(conversationId: string, userId: string): Promise; /** "Delete chat" for me: clear + drop from the list until new activity arrives. Returns cleared seq. */ @@ -118,6 +125,30 @@ export const createConversationsRepository = (db: Kysely): Conversatio return conversation; }), + createChannel: (title, description, ownerId, memberIds) => + db.transaction().execute(async (trx) => { + const conversation = await trx + .insertInto('conversations') + .values({ type: 'channel', title, description, created_by: ownerId }) + .returningAll() + .executeTakeFirstOrThrow(); + const uniqueOthers = memberIds.filter((id) => id !== ownerId); + const rows = [ + { conversation_id: conversation.id, user_id: ownerId, role: 'owner' }, + ...uniqueOthers.map((id) => ({ + conversation_id: conversation.id, + user_id: id, + role: 'member', + })), + ]; + await trx + .insertInto('conversation_members') + .values(rows) + .onConflict((oc) => oc.columns(['conversation_id', 'user_id']).doNothing()) + .execute(); + return conversation; + }), + findOrCreateDirect: async (userA, userB) => { const directKey = directKeyFor(userA, userB); const existing = await db @@ -293,6 +324,14 @@ export const createConversationsRepository = (db: Kysely): Conversatio .execute(); }, + setImage: (conversationId, imageUrl) => + db + .updateTable('conversations') + .set({ image_ref: imageUrl }) + .where('id', '=', conversationId) + .returningAll() + .executeTakeFirst(), + clearForUser, hideForUser: async (conversationId, userId) => { diff --git a/packages/backend/src/modules/conversations/conversations.routes.ts b/packages/backend/src/modules/conversations/conversations.routes.ts index 701e4b1..c4467e2 100644 --- a/packages/backend/src/modules/conversations/conversations.routes.ts +++ b/packages/backend/src/modules/conversations/conversations.routes.ts @@ -2,14 +2,22 @@ import type { FastifyInstance } from 'fastify'; import { createDirectBodySchema, createGroupBodySchema, + createChannelBodySchema, addMemberBodySchema, + setAvatarBodySchema, readBodySchema, conversationSchema, conversationListSchema, conversationMemberListSchema, errorSchema, } from '@altricade/core'; -import type { CreateDirectBody, CreateGroupBody, AddMemberBody, ReadBody } from '@altricade/core'; +import type { + CreateDirectBody, + CreateGroupBody, + CreateChannelBody, + AddMemberBody, + ReadBody, +} from '@altricade/core'; const bearerAuth = [{ bearerAuth: [] }]; const idParamsSchema = { @@ -86,6 +94,31 @@ export const conversationsRoutes = (app: FastifyInstance): Promise => { }, ); + app.post<{ Body: CreateChannelBody }>( + '/conversations/channel', + { + schema: { + tags: ['conversations'], + summary: 'Create a channel (broadcast: only owner/admins post)', + security: bearerAuth, + body: createChannelBodySchema, + response: { 201: conversationSchema, 401: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + const conversation = await app.conversationsService.createChannel( + user.id, + request.body.title, + request.body.description ?? null, + request.body.members ?? [], + ); + return reply.code(201).send(conversation); + }, + ); + app.get<{ Params: { id: string } }>( '/conversations/:id', { @@ -169,6 +202,35 @@ export const conversationsRoutes = (app: FastifyInstance): Promise => { }, ); + app.post<{ Params: { id: string }; Body: { objectKey: string } }>( + '/conversations/:id/avatar', + { + schema: { + tags: ['conversations'], + summary: 'Set a group/channel photo (owner/admin, from an uploaded object key)', + security: bearerAuth, + params: idParamsSchema, + body: setAvatarBodySchema, + response: { + 200: conversationSchema, + 400: errorSchema, + 401: errorSchema, + 403: errorSchema, + 404: errorSchema, + }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + const imageUrl = app.mediaService.avatarPublicUrl(request.body.objectKey); + return reply.send( + await app.conversationsService.setAvatar(request.params.id, user.id, imageUrl), + ); + }, + ); + app.post<{ Params: { id: string } }>( '/conversations/:id/clear', { diff --git a/packages/backend/src/modules/conversations/conversations.service.ts b/packages/backend/src/modules/conversations/conversations.service.ts index e66b613..399466c 100644 --- a/packages/backend/src/modules/conversations/conversations.service.ts +++ b/packages/backend/src/modules/conversations/conversations.service.ts @@ -28,6 +28,12 @@ export interface ConversationsServiceDeps { export interface ConversationsService { createDirect(actorId: string, username: string): Promise; createGroup(actorId: string, title: string, memberUsernames: string[]): Promise; + createChannel( + actorId: string, + title: string, + description: string | null, + memberUsernames: string[], + ): Promise; list(userId: string): Promise; get(conversationId: string, userId: string): Promise; listMembers(conversationId: string, userId: string): Promise; @@ -38,6 +44,7 @@ export interface ConversationsService { markRead(conversationId: string, userId: string, seq: number): Promise; clear(conversationId: string, userId: string): Promise; hide(conversationId: string, userId: string): Promise; + setAvatar(conversationId: string, actorId: string, imageUrl: string): Promise; } export const createConversationsService = ( @@ -62,6 +69,18 @@ export const createConversationsService = ( conversation, }); + // Usernames → ids, dropping unknowns and the actor (who is added as owner). + const resolveMemberIds = async (actorId: string, usernames: string[]): Promise => { + const memberIds: string[] = []; + for (const username of usernames) { + const found = await users.findByUsername(username); + if (found !== undefined && found.id !== actorId) { + memberIds.push(found.id); + } + } + return memberIds; + }; + const membership = ( action: ConversationMembershipEvent['action'], conversationId: string, @@ -96,13 +115,7 @@ export const createConversationsService = ( }, createGroup: async (actorId, title, memberUsernames) => { - const memberIds: string[] = []; - for (const username of memberUsernames) { - const found = await users.findByUsername(username); - if (found !== undefined && found.id !== actorId) { - memberIds.push(found.id); - } - } + const memberIds = await resolveMemberIds(actorId, memberUsernames); const conversation = toConversation( await conversations.createGroup(title, actorId, memberIds), null, @@ -113,6 +126,18 @@ export const createConversationsService = ( return conversation; }, + createChannel: async (actorId, title, description, memberUsernames) => { + const memberIds = await resolveMemberIds(actorId, memberUsernames); + const conversation = toConversation( + await conversations.createChannel(title, description, actorId, memberIds), + null, + ); + for (const userId of [actorId, ...memberIds]) { + await publish(userChannel(userId), conversationNew(conversation)); + } + return conversation; + }, + list: async (userId) => { const rows = await conversations.listForUser(userId); const directIds = rows.filter((row) => row.type === 'direct').map((row) => row.id); @@ -206,6 +231,32 @@ export const createConversationsService = ( }; await publish(userChannel(userId), event); }, + + setAvatar: async (conversationId, actorId, imageUrl) => { + const existing = await conversations.findById(conversationId); + if (existing === undefined) { + throw new HttpError(404, 'not_found', 'Conversation not found'); + } + if (existing.type === 'direct') { + throw new HttpError(400, 'invalid_target', 'Direct chats have no avatar'); + } + // Only the owner/admins may change a group/channel photo. + const role = await conversations.getRole(conversationId, actorId); + if (role !== 'owner' && role !== 'admin') { + throw new HttpError(403, 'not_permitted', 'Only admins can change the photo'); + } + const row = await conversations.setImage(conversationId, imageUrl); + if (row === undefined) { + throw new HttpError(404, 'not_found', 'Conversation not found'); + } + const conversation = toConversation(row, null); + // Broadcast so every member's list/header picks up the new photo. + const info = await conversations.getDeliveryInfo(conversationId); + for (const memberId of info?.memberIds ?? []) { + await publish(userChannel(memberId), conversationNew(conversation)); + } + return conversation; + }, }; }; diff --git a/packages/backend/src/modules/messages/messages.mapper.ts b/packages/backend/src/modules/messages/messages.mapper.ts index c5e5c47..b90e4c9 100644 --- a/packages/backend/src/modules/messages/messages.mapper.ts +++ b/packages/backend/src/modules/messages/messages.mapper.ts @@ -1,6 +1,24 @@ -import type { Message, ReactionSummary } from '@altricade/core'; +import type { Message, ReactionSummary, ReplyPreview, MediaRef } from '@altricade/core'; import type { MessageWithSenderRow } from './messages.repository'; +const MEDIA_KINDS: readonly MediaRef['kind'][] = ['image', 'video', 'video_note', 'voice', 'file']; + +const toReplyPreview = (row: MessageWithSenderRow): ReplyPreview | null => { + if (row.reply_to_id === null) { + return null; + } + const deleted = row.reply_deleted_at !== null; + const rawKind = row.reply_media_kind; + const mediaKind = MEDIA_KINDS.find((kind) => kind === rawKind) ?? null; + return { + id: row.reply_to_id, + senderName: row.reply_sender_name ?? '', + content: deleted ? '' : (row.reply_content ?? ''), + mediaKind: deleted ? null : mediaKind, + deleted, + }; +}; + export const toMessage = ( row: MessageWithSenderRow, reactions: ReactionSummary[] = [], @@ -24,4 +42,7 @@ export const toMessage = ( deletedAt: row.deleted_at === null ? null : row.deleted_at.toISOString(), reactions, media: row.media_meta, + replyTo: toReplyPreview(row), + forwarded: row.forwarded, + forwardedFrom: row.forwarded_from, }); diff --git a/packages/backend/src/modules/messages/messages.repository.ts b/packages/backend/src/modules/messages/messages.repository.ts index fe09e66..2fcd3f4 100644 --- a/packages/backend/src/modules/messages/messages.repository.ts +++ b/packages/backend/src/modules/messages/messages.repository.ts @@ -1,6 +1,6 @@ import { sql } from 'kysely'; import type { Kysely } from 'kysely'; -import type { ReactionSummary, MediaRef } from '@altricade/core'; +import type { ReactionSummary, MediaRef, ForwardOrigin } from '@altricade/core'; import type { Database } from '../../db/schema'; export interface MessageWithSenderRow { @@ -20,6 +20,13 @@ export interface MessageWithSenderRow { sender_username: string; sender_display_name: string; sender_avatar_ref: string | null; + reply_to_id: string | null; + reply_content: string | null; + reply_deleted_at: Date | null; + reply_media_kind: string | null; + reply_sender_name: string | null; + forwarded: boolean; + forwarded_from: ForwardOrigin | null; } export interface NewMessage { @@ -31,6 +38,9 @@ export interface NewMessage { encryption: string | null; mediaKey: string | null; media: MediaRef | null; + replyToId: string | null; + forwarded: boolean; + forwardedFrom: ForwardOrigin | null; } export interface MessagesRepository { @@ -48,6 +58,20 @@ export interface MessagesRepository { beforeSeq: number | null, limit: number, ): Promise; + /** Ascending page after `afterSeq` (downward pagination from a jumped-to context). */ + listAfter( + conversationId: string, + userId: string, + afterSeq: number, + limit: number, + ): Promise; + /** A window centered on `seq`: `half` rows above and `half` rows from it downward. */ + listContext( + conversationId: string, + userId: string, + seq: number, + half: number, + ): Promise; /** Media messages as seen by `userId` (profile panel tabs), newest first. */ listMedia( conversationId: string, @@ -70,6 +94,9 @@ export interface MessagesRepository { addReaction(messageId: string, userId: string, emoji: string): Promise; removeReaction(messageId: string, userId: string, emoji: string): Promise; reactionsFor(messageIds: string[], userId: string): Promise>; + pin(conversationId: string, messageId: string, pinnedBy: string): Promise; + unpin(conversationId: string, messageId: string): Promise; + listPinned(conversationId: string): Promise; } export const createMessagesRepository = (db: Kysely): MessagesRepository => { @@ -77,7 +104,10 @@ export const createMessagesRepository = (db: Kysely): MessagesReposito db .selectFrom('messages') .innerJoin('users', 'users.id', 'messages.sender_id') - .select([ + // Reply preview: the replied message + its author (both optional). + .leftJoin('messages as reply', 'reply.id', 'messages.reply_to_id') + .leftJoin('users as reply_user', 'reply_user.id', 'reply.sender_id') + .select((eb) => [ 'messages.id as id', 'messages.seq as seq', 'messages.conversation_id as conversation_id', @@ -94,6 +124,13 @@ export const createMessagesRepository = (db: Kysely): MessagesReposito 'users.username as sender_username', 'users.display_name as sender_display_name', 'users.avatar_ref as sender_avatar_ref', + 'messages.reply_to_id as reply_to_id', + 'reply.content as reply_content', + 'reply.deleted_at as reply_deleted_at', + eb.fn('nullif', [sql`reply.media_meta->>'kind'`, sql`''`]).as('reply_media_kind'), + 'reply_user.display_name as reply_sender_name', + 'messages.forwarded as forwarded', + 'messages.forwarded_from as forwarded_from', ]); // The per-user view: joins the member row to honor the clear mark and @@ -131,6 +168,9 @@ export const createMessagesRepository = (db: Kysely): MessagesReposito encryption: input.encryption, media_key: input.mediaKey, media_meta: input.media === null ? null : JSON.stringify(input.media), + reply_to_id: input.replyToId, + forwarded: input.forwarded, + forwarded_from: input.forwardedFrom === null ? null : JSON.stringify(input.forwardedFrom), }) .onConflict((oc) => oc.columns(['conversation_id', 'sender_id', 'client_msg_id']).doNothing(), @@ -159,6 +199,30 @@ export const createMessagesRepository = (db: Kysely): MessagesReposito return query.orderBy('messages.seq', 'desc').limit(limit).execute(); }, + listAfter: (conversationId, userId, afterSeq, limit) => + visibleTo(userId) + .where('messages.conversation_id', '=', conversationId) + .where('messages.seq', '>', afterSeq) + .orderBy('messages.seq', 'asc') + .limit(limit) + .execute(), + + listContext: async (conversationId, userId, seq, half) => { + const above = await visibleTo(userId) + .where('messages.conversation_id', '=', conversationId) + .where('messages.seq', '<', seq) + .orderBy('messages.seq', 'desc') + .limit(half) + .execute(); + const fromTarget = await visibleTo(userId) + .where('messages.conversation_id', '=', conversationId) + .where('messages.seq', '>=', seq) + .orderBy('messages.seq', 'asc') + .limit(half) + .execute(); + return [...above, ...fromTarget]; + }, + listMedia: (conversationId, userId, kinds, beforeSeq, limit) => { let query = visibleTo(userId) .where('messages.conversation_id', '=', conversationId) @@ -257,5 +321,29 @@ export const createMessagesRepository = (db: Kysely): MessagesReposito } return map; }, + + pin: async (conversationId, messageId, pinnedBy) => { + await db + .insertInto('message_pins') + .values({ conversation_id: conversationId, message_id: messageId, pinned_by: pinnedBy }) + .onConflict((oc) => oc.columns(['conversation_id', 'message_id']).doNothing()) + .execute(); + }, + + unpin: async (conversationId, messageId) => { + await db + .deleteFrom('message_pins') + .where('conversation_id', '=', conversationId) + .where('message_id', '=', messageId) + .execute(); + }, + + listPinned: (conversationId) => + withSender() + .innerJoin('message_pins', 'message_pins.message_id', 'messages.id') + .where('message_pins.conversation_id', '=', conversationId) + .where('messages.deleted_at', 'is', null) + .orderBy('message_pins.pinned_at', 'desc') + .execute(), }; }; diff --git a/packages/backend/src/modules/messages/messages.routes.ts b/packages/backend/src/modules/messages/messages.routes.ts index 0d0833a..6d97ce1 100644 --- a/packages/backend/src/modules/messages/messages.routes.ts +++ b/packages/backend/src/modules/messages/messages.routes.ts @@ -3,13 +3,20 @@ import { sendMessageBodySchema, editMessageBodySchema, reactionBodySchema, + forwardMessageBodySchema, messageSchema, messageListSchema, mediaUrlSchema, mediaListQuerySchema, errorSchema, } from '@altricade/core'; -import type { SendMessageBody, EditMessageBody, ReactionBody, MediaTab } from '@altricade/core'; +import type { + SendMessageBody, + EditMessageBody, + ReactionBody, + ForwardMessageBody, + MediaTab, +} from '@altricade/core'; const bearerAuth = [{ bearerAuth: [] }]; const idParamsSchema = { @@ -38,17 +45,26 @@ const historyQuerySchema = { type: 'object', properties: { before: { type: 'integer', minimum: 1 }, + // Ascending page after this seq (downward pagination from a jumped context). + after: { type: 'integer', minimum: 0 }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 50 }, }, } as const; +const contextQuerySchema = { + type: 'object', + properties: { + limit: { type: 'integer', minimum: 2, maximum: 100, default: 50 }, + }, +} as const; + export const messagesRoutes = (app: FastifyInstance): Promise => { - app.get<{ Params: { id: string }; Querystring: { before?: number; limit: number } }>( + app.get<{ Params: { id: string }; Querystring: { before?: number; after?: number; limit: number } }>( '/conversations/:id/messages', { schema: { tags: ['messages'], - summary: 'Load conversation message history (newest first)', + summary: 'Load conversation message history (newest first; `after` pages downward)', security: bearerAuth, params: idParamsSchema, querystring: historyQuerySchema, @@ -59,6 +75,16 @@ export const messagesRoutes = (app: FastifyInstance): Promise => { async (request, reply) => { const user = request.authUser; if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + if (request.query.after !== undefined) { + return reply.send( + await app.messagesService.historyAfter( + request.params.id, + user.id, + request.query.after, + request.query.limit, + ), + ); + } const before = request.query.before ?? null; const history = await app.messagesService.history( request.params.id, @@ -70,6 +96,33 @@ export const messagesRoutes = (app: FastifyInstance): Promise => { }, ); + app.get<{ Params: { id: string; messageId: string }; Querystring: { limit: number } }>( + '/conversations/:id/messages/:messageId/context', + { + schema: { + tags: ['messages'], + summary: 'Load a history window centered on a message (jump-to-message / search)', + security: bearerAuth, + params: messageParamsSchema, + querystring: contextQuerySchema, + response: { 200: messageListSchema, 401: errorSchema, 403: errorSchema, 404: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + return reply.send( + await app.messagesService.context( + request.params.id, + user.id, + request.params.messageId, + request.query.limit, + ), + ); + }, + ); + app.post<{ Params: { id: string }; Body: SendMessageBody }>( '/conversations/:id/messages', { @@ -157,6 +210,92 @@ export const messagesRoutes = (app: FastifyInstance): Promise => { }, ); + app.post<{ Params: { id: string }; Body: ForwardMessageBody }>( + '/conversations/:id/forward', + { + schema: { + tags: ['messages'], + summary: 'Forward a message into this conversation', + security: bearerAuth, + params: idParamsSchema, + body: forwardMessageBodySchema, + response: { 200: messageSchema, 400: errorSchema, 401: errorSchema, 403: errorSchema, 404: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + const message = await app.messagesService.forward( + request.params.id, + user.id, + request.body.sourceConversationId, + request.body.messageId, + request.body.hideSender ?? false, + ); + return reply.send(message); + }, + ); + + app.get<{ Params: { id: string } }>( + '/conversations/:id/pinned', + { + schema: { + tags: ['messages'], + summary: 'List pinned messages (newest pin first)', + security: bearerAuth, + params: idParamsSchema, + response: { 200: messageListSchema, 401: errorSchema, 403: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + return reply.send(await app.messagesService.pinned(request.params.id, user.id)); + }, + ); + + app.post<{ Params: { id: string; messageId: string } }>( + '/conversations/:id/messages/:messageId/pin', + { + schema: { + tags: ['messages'], + summary: 'Pin a message', + security: bearerAuth, + params: messageParamsSchema, + response: { 401: errorSchema, 403: errorSchema, 404: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + await app.messagesService.pin(request.params.id, request.params.messageId, user.id); + return reply.code(204).send(); + }, + ); + + app.delete<{ Params: { id: string; messageId: string } }>( + '/conversations/:id/messages/:messageId/pin', + { + schema: { + tags: ['messages'], + summary: 'Unpin a message', + security: bearerAuth, + params: messageParamsSchema, + response: { 401: errorSchema, 403: errorSchema, 404: errorSchema }, + }, + preHandler: app.authenticate, + }, + async (request, reply) => { + const user = request.authUser; + if (user === undefined) return reply.code(401).send({ error: 'unauthorized' }); + await app.messagesService.unpin(request.params.id, request.params.messageId, user.id); + return reply.code(204).send(); + }, + ); + app.get<{ Params: { id: string }; Querystring: { tab: MediaTab; before?: number; limit: number } }>( '/conversations/:id/media', { diff --git a/packages/backend/src/modules/messages/messages.service.ts b/packages/backend/src/modules/messages/messages.service.ts index 4263d7b..1283cd5 100644 --- a/packages/backend/src/modules/messages/messages.service.ts +++ b/packages/backend/src/modules/messages/messages.service.ts @@ -1,3 +1,4 @@ +import { randomUUID } from 'node:crypto'; import { EventType, userChannel } from '@altricade/core'; import type { Message, @@ -5,9 +6,11 @@ import type { MessageEditEvent, MessageDeleteEvent, MessageHiddenEvent, + MessagePinEvent, ReactionEvent, SendMessageBody, MediaTab, + ForwardOrigin, } from '@altricade/core'; import { HttpError } from '../../shared/http-error'; import type { Publisher } from '../../shared/publisher'; @@ -27,11 +30,12 @@ export interface MessagesServiceDeps { notify: (message: Message) => void; } -// Telegram-style shared-media tabs → media kinds. +// Telegram-style shared-media tabs → media kinds. Round video messages live in +// the Voice tab alongside voice notes (both are "instant" messages), not Media. const TAB_KINDS: Record = { - media: ['image', 'video', 'video_note'], + media: ['image', 'video'], files: ['file'], - voice: ['voice'], + voice: ['voice', 'video_note'], }; export interface SentMessage { @@ -47,6 +51,19 @@ export interface MessagesService { beforeSeq: number | null, limit: number, ): Promise; + historyAfter( + conversationId: string, + userId: string, + afterSeq: number, + limit: number, + ): Promise; + /** Window centered on a message — jump-to-message / search result context. */ + context( + conversationId: string, + userId: string, + messageId: string, + limit: number, + ): Promise; edit( conversationId: string, messageId: string, @@ -55,6 +72,16 @@ export interface MessagesService { ): Promise; remove(conversationId: string, messageId: string, userId: string): Promise; hide(conversationId: string, messageId: string, userId: string): Promise; + forward( + targetConversationId: string, + userId: string, + sourceConversationId: string, + messageId: string, + hideSender: boolean, + ): Promise; + pin(conversationId: string, messageId: string, userId: string): Promise; + unpin(conversationId: string, messageId: string, userId: string): Promise; + pinned(conversationId: string, userId: string): Promise; media( conversationId: string, userId: string, @@ -101,9 +128,30 @@ export const createMessagesService = (deps: MessagesServiceDeps): MessagesServic return toMessage(row, reactions.get(messageId) ?? []); }; + // Channels are broadcast: only the owner and admins may post. + const assertCanPost = async (conversationId: string, userId: string): Promise => { + const conversation = await conversations.findById(conversationId); + if (conversation?.type !== 'channel') { + return; + } + const role = await conversations.getRole(conversationId, userId); + if (role !== 'owner' && role !== 'admin') { + throw new HttpError(403, 'not_channel_admin', 'Only channel admins can post'); + } + }; + return { send: async (conversationId, senderId, input) => { await assertMember(conversationId, senderId); + await assertCanPost(conversationId, senderId); + + // Only honor a reply target that lives in this same conversation. + let replyToId: string | null = null; + if (input.replyToId !== undefined) { + if ((await messages.getConversationId(input.replyToId)) === conversationId) { + replyToId = input.replyToId; + } + } const inserted = await messages.insert({ conversationId, @@ -114,6 +162,9 @@ export const createMessagesService = (deps: MessagesServiceDeps): MessagesServic encryption: input.encryption ?? null, mediaKey: input.mediaKey ?? null, media: input.media ?? null, + replyToId, + forwarded: false, + forwardedFrom: null, }); const id = @@ -148,6 +199,34 @@ export const createMessagesService = (deps: MessagesServiceDeps): MessagesServic return rows.map((row) => toMessage(row, reactions.get(row.id) ?? [])); }, + historyAfter: async (conversationId, userId, afterSeq, limit) => { + await assertMember(conversationId, userId); + const rows = await messages.listAfter(conversationId, userId, afterSeq, limit); + const reactions = await messages.reactionsFor( + rows.map((row) => row.id), + userId, + ); + return rows.map((row) => toMessage(row, reactions.get(row.id) ?? [])); + }, + + context: async (conversationId, userId, messageId, limit) => { + await assertMember(conversationId, userId); + const target = await messages.getWithSenderById(messageId); + if (target === undefined) { + throw new HttpError(404, 'not_found', 'Message not found'); + } + if (target.conversation_id !== conversationId) { + throw new HttpError(404, 'not_found', 'Message not found'); + } + const half = Math.max(1, Math.floor(limit / 2)); + const rows = await messages.listContext(conversationId, userId, target.seq, half); + const reactions = await messages.reactionsFor( + rows.map((row) => row.id), + userId, + ); + return rows.map((row) => toMessage(row, reactions.get(row.id) ?? [])); + }, + media: async (conversationId, userId, tab, beforeSeq, limit) => { await assertMember(conversationId, userId); const rows = await messages.listMedia(conversationId, userId, TAB_KINDS[tab], beforeSeq, limit); @@ -172,10 +251,10 @@ export const createMessagesService = (deps: MessagesServiceDeps): MessagesServic await assertMessageIn(conversationId, messageId); let deleted = await messages.softDelete(messageId, userId); if (deleted === undefined) { - // Not the sender: the owner of a group may moderate any message in it. + // Not the sender: the owner of a group/channel may moderate any message in it. const conversation = await conversations.findById(conversationId); const role = await conversations.getRole(conversationId, userId); - if (conversation?.type !== 'group' || role !== 'owner') { + if (conversation === undefined || conversation.type === 'direct' || role !== 'owner') { throw new HttpError( 403, 'not_deletable', @@ -201,6 +280,103 @@ export const createMessagesService = (deps: MessagesServiceDeps): MessagesServic await publish(userChannel(userId), event); }, + forward: async (targetConversationId, userId, sourceConversationId, messageId, hideSender) => { + // Must belong to both ends, and be able to post into the target. + await assertMember(sourceConversationId, userId); + await assertMember(targetConversationId, userId); + await assertCanPost(targetConversationId, userId); + + const source = await messages.getWithSenderById(messageId); + if (source === undefined) { + throw new HttpError(404, 'not_found', 'Message not found'); + } + if (source.conversation_id !== sourceConversationId) { + throw new HttpError(404, 'not_found', 'Message not found'); + } + if (source.deleted_at !== null) { + throw new HttpError(400, 'invalid_target', 'Cannot forward a deleted message'); + } + + // Attribution (Telegram-style): forwarding an already-forwarded message + // preserves the ORIGINAL origin; forwarding from a channel credits the + // channel (no profile link); otherwise credits the author (clickable). + let origin: ForwardOrigin | null; + if (source.forwarded) { + origin = source.forwarded_from; + } else { + const sourceConv = await conversations.findById(sourceConversationId); + if (sourceConv?.type === 'channel') { + origin = { name: sourceConv.title ?? 'Channel', user: null }; + } else { + origin = { + name: source.sender_display_name, + user: { + id: source.sender_id, + username: source.sender_username, + displayName: source.sender_display_name, + avatarUrl: source.sender_avatar_ref, + }, + }; + } + } + + const clientMsgId = randomUUID(); + const inserted = await messages.insert({ + conversationId: targetConversationId, + senderId: userId, + clientMsgId, + content: source.content, + contentType: source.content_type, + encryption: source.encryption, + // Object storage is shared — reference the same media object. + mediaKey: source.media_key, + media: source.media_meta, + replyToId: null, + forwarded: true, + forwardedFrom: hideSender ? null : origin, + }); + const id = + inserted?.id ?? + (await messages.findIdByDedupe(targetConversationId, userId, clientMsgId)); + if (id === undefined) { + throw new HttpError(500, 'internal_error', 'Forward could not be persisted'); + } + const row = await messages.getWithSenderById(id); + if (row === undefined) { + throw new HttpError(500, 'internal_error', 'Message not found after forward'); + } + const message = toMessage(row, []); + await conversations.touchLastMessage(targetConversationId); + const event: MessageNewEvent = { type: EventType.MessageNew, message }; + await deliver(targetConversationId, event); + notify(message); + return message; + }, + + pin: async (conversationId, messageId, userId) => { + await assertMember(conversationId, userId); + await assertMessageIn(conversationId, messageId); + await assertCanPost(conversationId, userId); // channels: admins only + await messages.pin(conversationId, messageId, userId); + const event: MessagePinEvent = { type: EventType.MessagePin, conversationId, messageId }; + await deliver(conversationId, event); + }, + + unpin: async (conversationId, messageId, userId) => { + await assertMember(conversationId, userId); + await assertMessageIn(conversationId, messageId); + await assertCanPost(conversationId, userId); + await messages.unpin(conversationId, messageId); + const event: MessagePinEvent = { type: EventType.MessageUnpin, conversationId, messageId }; + await deliver(conversationId, event); + }, + + pinned: async (conversationId, userId) => { + await assertMember(conversationId, userId); + const rows = await messages.listPinned(conversationId); + return rows.map((row) => toMessage(row, [])); + }, + addReaction: async (conversationId, messageId, userId, emoji) => { await assertMember(conversationId, userId); await assertMessageIn(conversationId, messageId); diff --git a/packages/backend/src/modules/users/users.repository.ts b/packages/backend/src/modules/users/users.repository.ts index 8a5d53d..4ec855d 100644 --- a/packages/backend/src/modules/users/users.repository.ts +++ b/packages/backend/src/modules/users/users.repository.ts @@ -12,6 +12,7 @@ export interface NewUser { } export interface ProfilePatch { + username?: string; displayName?: string; email?: string | null; phone?: string | null; @@ -58,7 +59,13 @@ export const createUsersRepository = (db: Kysely): UsersRepository => .selectAll() .where('id', '!=', excludeUserId) .where((eb) => - eb.or([eb('username', 'ilike', `${query}%`), eb('display_name', 'ilike', `${query}%`)]), + eb.or([ + eb('username', 'ilike', `${query}%`), + eb('display_name', 'ilike', `${query}%`), + // Phone lookup (prefix): matches with or without the leading '+'. + eb('phone', 'like', `${query}%`), + eb('phone', 'like', `+${query}%`), + ]), ) .orderBy('username', 'asc') .limit(limit) @@ -66,6 +73,9 @@ export const createUsersRepository = (db: Kysely): UsersRepository => updateProfile: (id, patch) => { const values: Updateable = { updated_at: new Date() }; + if (patch.username !== undefined) { + values.username = patch.username; + } if (patch.displayName !== undefined) { values.display_name = patch.displayName; } diff --git a/packages/backend/src/modules/users/users.service.ts b/packages/backend/src/modules/users/users.service.ts index 5da2684..0d8fea9 100644 --- a/packages/backend/src/modules/users/users.service.ts +++ b/packages/backend/src/modules/users/users.service.ts @@ -42,7 +42,16 @@ export const createUsersService = ({ users, publish }: UsersServiceDeps): UsersS }, updateProfile: async (userId, patch) => { - const row = await users.updateProfile(userId, patch); + let row; + try { + row = await users.updateProfile(userId, patch); + } catch (error) { + // Unique violation on the citext username column (23505) → taken. + if (typeof error === 'object' && error !== null && 'code' in error && error.code === '23505') { + throw new HttpError(409, 'username_taken', 'That username is already taken'); + } + throw error; + } if (row === undefined) { throw new HttpError(404, 'not_found', 'User not found'); } diff --git a/packages/backend/src/plugins/swagger.ts b/packages/backend/src/plugins/swagger.ts index 4905d6b..53c82b3 100644 --- a/packages/backend/src/plugins/swagger.ts +++ b/packages/backend/src/plugins/swagger.ts @@ -11,7 +11,7 @@ export const swaggerPlugin = fp( await app.register(swagger, { openapi: { info: { - title: 'Altricade API', + title: 'Zovi API', version: '0.1.0', description: 'Realtime chat & calls backend.', }, diff --git a/packages/core/src/api/conversations.ts b/packages/core/src/api/conversations.ts index 314bf25..915739d 100644 --- a/packages/core/src/api/conversations.ts +++ b/packages/core/src/api/conversations.ts @@ -3,7 +3,13 @@ import { conversationListSchema, conversationMemberListSchema, } from '../schemas/index'; -import type { CreateDirectBody, CreateGroupBody, AddMemberBody } from '../schemas/index'; +import type { + CreateDirectBody, + CreateGroupBody, + CreateChannelBody, + AddMemberBody, + SetAvatarBody, +} from '../schemas/index'; import type { Conversation, ConversationMember } from '../types/index'; import { compileValidator, parse, requestJson } from './http'; import type { ApiClientConfig } from './http'; @@ -33,6 +39,12 @@ export const createGroup = async ( ): Promise => parse(conversationV, await requestJson(config, 'POST', '/conversations', body)); +export const createChannel = async ( + config: ApiClientConfig, + body: CreateChannelBody, +): Promise => + parse(conversationV, await requestJson(config, 'POST', '/conversations/channel', body)); + export const listMembers = async ( config: ApiClientConfig, id: string, @@ -62,6 +74,14 @@ export const markRead = async ( await requestJson(config, 'POST', `/conversations/${id}/read`, { seq }); }; +// Set a group/channel photo from an uploaded avatar object key (owner/admin). +export const setConversationAvatar = async ( + config: ApiClientConfig, + id: string, + body: SetAvatarBody, +): Promise => + parse(conversationV, await requestJson(config, 'POST', `/conversations/${id}/avatar`, body)); + // "Clear history" (for me): hides all current messages; the chat stays listed. export const clearConversation = async (config: ApiClientConfig, id: string): Promise => { await requestJson(config, 'POST', `/conversations/${id}/clear`); diff --git a/packages/core/src/api/index.ts b/packages/core/src/api/index.ts index a512e1c..151a42b 100644 --- a/packages/core/src/api/index.ts +++ b/packages/core/src/api/index.ts @@ -19,6 +19,8 @@ export { getConversation, createDirect, createGroup, + createChannel, + setConversationAvatar, listMembers, addMember, removeMember, @@ -29,9 +31,14 @@ export { listContacts, addContact, removeContact } from './contacts'; export { sendMessage, getHistory, + getMessageContext, editMessage, deleteMessage, hideMessage, + forwardMessage, + pinMessage, + unpinMessage, + listPinned, listConversationMedia, addReaction, removeReaction, @@ -41,7 +48,7 @@ export type { HistoryOptions } from './messages'; export { markRead } from './conversations'; export { getPresence, heartbeat } from './presence'; export { getUploadUrl, getAvatarUploadUrl, getMediaUrl, uploadToUrl } from './media'; -export type { UploadTarget, AvatarTarget } from './media'; +export type { UploadTarget, AvatarTarget, UploadOptions } from './media'; export { getVapidPublicKey, registerDevice, diff --git a/packages/core/src/api/media.ts b/packages/core/src/api/media.ts index 5897a39..4778c96 100644 --- a/packages/core/src/api/media.ts +++ b/packages/core/src/api/media.ts @@ -42,14 +42,61 @@ export const getMediaUrl = async ( return result.url; }; +export interface UploadOptions { + /** Called with uploaded/total bytes as the transfer advances. */ + onProgress?: (loaded: number, total: number) => void; + signal?: AbortSignal; +} + // Direct PUT of the file bytes to the presigned MinIO URL (no auth/credentials). -export const uploadToUrl = async (uploadUrl: string, file: Blob, mime: string): Promise => { - const response = await fetch(uploadUrl, { - method: 'PUT', - headers: { 'content-type': mime }, - body: file, +// XHR instead of fetch: fetch cannot report upload progress, and XHR is +// available in both browsers and React Native. +export const uploadToUrl = ( + uploadUrl: string, + file: Blob, + mime: string, + options: UploadOptions = {}, +): Promise => + new Promise((resolve, reject) => { + const { onProgress, signal } = options; + if (signal?.aborted === true) { + reject(new Error('Upload aborted')); + return; + } + const xhr = new XMLHttpRequest(); + const onAbort = (): void => { + xhr.abort(); + }; + signal?.addEventListener('abort', onAbort, { once: true }); + const settle = (outcome: () => void): void => { + signal?.removeEventListener('abort', onAbort); + outcome(); + }; + xhr.upload.onprogress = (event) => { + if (event.lengthComputable) { + onProgress?.(event.loaded, event.total); + } + }; + xhr.onload = () => { + settle(() => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(); + } else { + reject(new Error(`Upload failed with status ${String(xhr.status)}`)); + } + }); + }; + xhr.onerror = () => { + settle(() => { + reject(new Error('Upload failed: network error')); + }); + }; + xhr.onabort = () => { + settle(() => { + reject(new Error('Upload aborted')); + }); + }; + xhr.open('PUT', uploadUrl); + xhr.setRequestHeader('content-type', mime); + xhr.send(file); }); - if (!response.ok) { - throw new Error(`Upload failed with status ${String(response.status)}`); - } -}; diff --git a/packages/core/src/api/messages.ts b/packages/core/src/api/messages.ts index d00b04d..b2e4925 100644 --- a/packages/core/src/api/messages.ts +++ b/packages/core/src/api/messages.ts @@ -1,5 +1,11 @@ import { messageSchema, messageListSchema } from '../schemas/index'; -import type { SendMessageBody, EditMessageBody, ReactionBody, MediaTab } from '../schemas/index'; +import type { + SendMessageBody, + EditMessageBody, + ReactionBody, + ForwardMessageBody, + MediaTab, +} from '../schemas/index'; import type { Message } from '../types/index'; import { compileValidator, parse, requestJson } from './http'; import type { ApiClientConfig } from './http'; @@ -16,6 +22,8 @@ export const sendMessage = async ( export interface HistoryOptions { before?: number; + /** Ascending page after this seq (downward pagination from a jumped context). */ + after?: number; limit?: number; } @@ -28,6 +36,9 @@ export const getHistory = async ( if (options.before !== undefined) { params.set('before', String(options.before)); } + if (options.after !== undefined) { + params.set('after', String(options.after)); + } if (options.limit !== undefined) { params.set('limit', String(options.limit)); } @@ -37,6 +48,23 @@ export const getHistory = async ( return parse(messageListV, await requestJson(config, 'GET', path)); }; +// History window centered on a message — the jump-to-message primitive shared +// by reply quotes, the pinned bar, and (later) search results. +export const getMessageContext = async ( + config: ApiClientConfig, + conversationId: string, + messageId: string, + limit = 50, +): Promise => + parse( + messageListV, + await requestJson( + config, + 'GET', + `/conversations/${conversationId}/messages/${messageId}/context?limit=${String(limit)}`, + ), + ); + export const editMessage = async ( config: ApiClientConfig, conversationId: string, @@ -66,6 +94,41 @@ export const hideMessage = async ( await requestJson(config, 'POST', `/conversations/${conversationId}/messages/${messageId}/hide`); }; +// Forward a message into `targetConversationId` (copies content/media with +// attribution). Returns the new message in the target. +export const forwardMessage = async ( + config: ApiClientConfig, + targetConversationId: string, + body: ForwardMessageBody, +): Promise => + parse( + messageV, + await requestJson(config, 'POST', `/conversations/${targetConversationId}/forward`, body), + ); + +export const pinMessage = async ( + config: ApiClientConfig, + conversationId: string, + messageId: string, +): Promise => { + await requestJson(config, 'POST', `/conversations/${conversationId}/messages/${messageId}/pin`); +}; + +export const unpinMessage = async ( + config: ApiClientConfig, + conversationId: string, + messageId: string, +): Promise => { + await requestJson(config, 'DELETE', `/conversations/${conversationId}/messages/${messageId}/pin`); +}; + +// Pinned messages for a conversation, newest pin first. +export const listPinned = async ( + config: ApiClientConfig, + conversationId: string, +): Promise => + parse(messageListV, await requestJson(config, 'GET', `/conversations/${conversationId}/pinned`)); + // Shared media for the profile panel, newest first, keyset-paginated by seq. export const listConversationMedia = async ( config: ApiClientConfig, diff --git a/packages/core/src/events/index.ts b/packages/core/src/events/index.ts index c4d22c1..3c15fad 100644 --- a/packages/core/src/events/index.ts +++ b/packages/core/src/events/index.ts @@ -20,6 +20,8 @@ export const EventType = { MessageDelete: 'message.delete', ReactionAdd: 'reaction.add', ReactionRemove: 'reaction.remove', + MessagePin: 'message.pin', + MessageUnpin: 'message.unpin', ReadReceipt: 'read.receipt', LastSeen: 'last_seen', ConversationNew: 'conversation.new', @@ -95,6 +97,13 @@ export interface ReadReceiptEvent { seq: number; } +// A message was pinned/unpinned (shared state; clients refetch the pinned list). +export interface MessagePinEvent { + type: typeof EventType.MessagePin | typeof EventType.MessageUnpin; + conversationId: string; + messageId: string; +} + export interface TypingEvent { type: typeof EventType.TypingStart | typeof EventType.TypingStop; conversationId: string; diff --git a/packages/core/src/schemas/auth.ts b/packages/core/src/schemas/auth.ts index 5cae719..018eeec 100644 --- a/packages/core/src/schemas/auth.ts +++ b/packages/core/src/schemas/auth.ts @@ -37,6 +37,7 @@ export const updateMeBodySchema = { additionalProperties: false, minProperties: 1, properties: { + username: { type: 'string', pattern: USERNAME_PATTERN }, displayName: { type: 'string', minLength: 1, maxLength: 64 }, // `null` clears the value; a string sets it. email: { type: ['string', 'null'], format: 'email', maxLength: 254 }, diff --git a/packages/core/src/schemas/conversation.ts b/packages/core/src/schemas/conversation.ts index 47c280d..34ce41a 100644 --- a/packages/core/src/schemas/conversation.ts +++ b/packages/core/src/schemas/conversation.ts @@ -26,6 +26,23 @@ export const createGroupBodySchema = { }, } as const; +// A channel: broadcast conversation; members are subscribers, only the owner +// and admins post. Description is optional (shown on the channel info page). +export const createChannelBodySchema = { + type: 'object', + additionalProperties: false, + required: ['title'], + properties: { + title: { type: 'string', minLength: 1, maxLength: 100 }, + description: { type: 'string', maxLength: 500 }, + members: { + type: 'array', + maxItems: 200, + items: { type: 'string', pattern: USERNAME_PATTERN }, + }, + }, +} as const; + export const addMemberBodySchema = { type: 'object', additionalProperties: false, @@ -48,6 +65,21 @@ export const sendMessageBodySchema = { // Object key returned by the media upload URL + its metadata. mediaKey: { type: 'string', minLength: 1, maxLength: 255 }, media: mediaRefSchema, + // Reply target message id (must be in the same conversation). + replyToId: { type: 'string', format: 'uuid' }, + }, +} as const; + +// Forward a message into the target conversation (the route's :id). +export const forwardMessageBodySchema = { + type: 'object', + additionalProperties: false, + required: ['sourceConversationId', 'messageId'], + properties: { + sourceConversationId: { type: 'string', format: 'uuid' }, + messageId: { type: 'string', format: 'uuid' }, + // When true the original author is hidden ("Hidden account") on the forward. + hideSender: { type: 'boolean' }, }, } as const; @@ -60,8 +92,10 @@ export const addContactBodySchema = { }, } as const; +export type ForwardMessageBody = FromSchema; export type CreateDirectBody = FromSchema; export type CreateGroupBody = FromSchema; +export type CreateChannelBody = FromSchema; export type AddMemberBody = FromSchema; export type SendMessageBody = FromSchema; export type AddContactBody = FromSchema; diff --git a/packages/core/src/schemas/entities.ts b/packages/core/src/schemas/entities.ts index df79f06..69c55da 100644 --- a/packages/core/src/schemas/entities.ts +++ b/packages/core/src/schemas/entities.ts @@ -101,6 +101,8 @@ export const conversationSchema = { 'id', 'type', 'title', + 'description', + 'avatarUrl', 'peer', 'createdBy', 'createdAt', @@ -109,8 +111,10 @@ export const conversationSchema = { ], properties: { id: { type: 'string', format: 'uuid' }, - type: { type: 'string', enum: ['direct', 'group'] }, + type: { type: 'string', enum: ['direct', 'group', 'channel'] }, title: { type: ['string', 'null'] }, + description: { type: ['string', 'null'] }, + avatarUrl: { type: ['string', 'null'] }, peer: { oneOf: [publicUserSchema, { type: 'null' }], }, @@ -177,6 +181,29 @@ export const contactSchema = { export const contactListSchema = { type: 'array', items: contactSchema } as const; +export const forwardOriginSchema = { + type: 'object', + additionalProperties: false, + required: ['name', 'user'], + properties: { + name: { type: 'string' }, + user: { oneOf: [publicUserSchema, { type: 'null' }] }, + }, +} as const; + +export const replyPreviewSchema = { + type: 'object', + additionalProperties: false, + required: ['id', 'senderName', 'content', 'mediaKind', 'deleted'], + properties: { + id: { type: 'string', format: 'uuid' }, + senderName: { type: 'string' }, + content: { type: 'string' }, + mediaKind: { type: ['string', 'null'] }, + deleted: { type: 'boolean' }, + }, +} as const; + export const messageSchema = { type: 'object', additionalProperties: false, @@ -195,6 +222,9 @@ export const messageSchema = { 'deletedAt', 'reactions', 'media', + 'replyTo', + 'forwarded', + 'forwardedFrom', ], properties: { id: { type: 'string', format: 'uuid' }, @@ -211,6 +241,9 @@ export const messageSchema = { deletedAt: { type: ['string', 'null'], format: 'date-time' }, reactions: { type: 'array', items: reactionSummarySchema }, media: { oneOf: [mediaRefSchema, { type: 'null' }] }, + replyTo: { oneOf: [replyPreviewSchema, { type: 'null' }] }, + forwarded: { type: 'boolean' }, + forwardedFrom: { oneOf: [forwardOriginSchema, { type: 'null' }] }, }, } as const; diff --git a/packages/core/src/schemas/index.ts b/packages/core/src/schemas/index.ts index 725902b..587a67a 100644 --- a/packages/core/src/schemas/index.ts +++ b/packages/core/src/schemas/index.ts @@ -3,15 +3,19 @@ export type { RegisterBody, LoginBody, UpdateMeBody } from './auth'; export { createDirectBodySchema, createGroupBodySchema, + createChannelBodySchema, addMemberBodySchema, sendMessageBodySchema, + forwardMessageBodySchema, addContactBodySchema, } from './conversation'; export type { CreateDirectBody, CreateGroupBody, + CreateChannelBody, AddMemberBody, SendMessageBody, + ForwardMessageBody, AddContactBody, } from './conversation'; export { editMessageBodySchema, reactionBodySchema, readBodySchema } from './live'; diff --git a/packages/core/src/types/conversation.ts b/packages/core/src/types/conversation.ts index 2f7b31a..9882185 100644 --- a/packages/core/src/types/conversation.ts +++ b/packages/core/src/types/conversation.ts @@ -1,13 +1,19 @@ import type { PublicUser } from './user'; -export type ConversationType = 'direct' | 'group'; +// 'channel' is a broadcast conversation: everyone reads, only the owner and +// admins (conversation_members.role) may post or edit. +export type ConversationType = 'direct' | 'group' | 'channel'; export interface Conversation { id: string; type: ConversationType; - /** Title for a group; null for a direct conversation. */ + /** Title for a group/channel; null for a direct conversation. */ title: string | null; - /** The other participant for a direct conversation; null for a group. */ + /** Optional channel description (null elsewhere). */ + description: string | null; + /** Avatar URL: the peer's for a DM, the group/channel's own otherwise; null when unset. */ + avatarUrl: string | null; + /** The other participant for a direct conversation; null for a group/channel. */ peer: PublicUser | null; createdBy: string; createdAt: string; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 0fd2c8e..f25567d 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -5,7 +5,7 @@ export type { User, PublicUser } from './user'; export type { AuthResult, Session, CentrifugoToken } from './auth'; export type { Conversation, ConversationType, ConversationMember } from './conversation'; export type { Contact } from './contact'; -export type { Message, ReactionSummary, MediaRef } from './message'; +export type { Message, ReactionSummary, ReplyPreview, ForwardOrigin, MediaRef } from './message'; export type { Presence } from './presence'; export type { ChatFolder, ChatPin, FoldersState } from './folders'; export type { diff --git a/packages/core/src/types/message.ts b/packages/core/src/types/message.ts index ddd8c70..91aeec7 100644 --- a/packages/core/src/types/message.ts +++ b/packages/core/src/types/message.ts @@ -10,6 +10,26 @@ export interface ReactionSummary { mine: boolean; } +// Where a forwarded message originally came from. `user` is set (and clickable +// → profile) when the origin is a person; null when it's a channel (show `name` +// only). The whole object is null on the message when the origin was hidden. +export interface ForwardOrigin { + name: string; + user: PublicUser | null; +} + +// A compact preview of the message being replied to (enough to render a quote). +export interface ReplyPreview { + id: string; + senderName: string; + /** Text preview; empty for media-only. */ + content: string; + /** Media kind of the replied message, if any. */ + mediaKind: MediaRef['kind'] | null; + /** True if the replied message has since been deleted. */ + deleted: boolean; +} + // A chat message. `content` is a crypto-agnostic envelope: plaintext today, // base64 ciphertext once E2EE lands. `seq` is the server-assigned monotonic order. export interface Message { @@ -27,4 +47,11 @@ export interface Message { deletedAt: string | null; reactions: ReactionSummary[]; media: MediaRef | null; + /** The message this one replies to, or null. */ + replyTo: ReplyPreview | null; + /** True if this message was forwarded. */ + forwarded: boolean; + /** Origin when forwarded & not hidden; null when not forwarded OR hidden + * ("Hidden account"). Use `forwarded` to distinguish those two cases. */ + forwardedFrom: ForwardOrigin | null; } diff --git a/packages/web/index.html b/packages/web/index.html index 29e09c7..ec416f7 100644 --- a/packages/web/index.html +++ b/packages/web/index.html @@ -3,7 +3,12 @@ - Altricade + Zovi + + + + +

diff --git a/packages/web/public/favicon.ico b/packages/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..88d25ee7941e0fa6df4681d725d6ec3a2cd9abe7 GIT binary patch literal 285478 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 literal 0 HcmV?d00001 diff --git a/packages/web/public/favicon.svg b/packages/web/public/favicon.svg new file mode 100644 index 0000000..18b123d --- /dev/null +++ b/packages/web/public/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/web/public/icons/apple-touch-icon.png b/packages/web/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bee7c190788381d90ece3c4e225bd3cf20f80b27 GIT binary patch literal 3124 zcmZ8kdpwiv8=p24ax7vSa_&T%tu#$G3FY*5)I_m)M+YNwKAYZh%qztlVxPB!BITIm zlv6TVghr^aL{crv3cveNfBpV=_S~QQx~}ha*nM61_euE6(MC=NB?E)OZ$;m^#sP-siB^r2$0q_ ze~d9;&`$Xvh1pjE6d`F`I|t59$l{<09l4SK@wGclIK5D56%V$6dMu<~V8M`rg4~M7 zzK1rhoJ+2K)Gd|GNg&=M3a6{D!J#D+wwem-wIWXw3h26+evf$!!gkJ%t$n8OM}0da zdnm#2;kVlJF6_fPSN))XEWb~s)ZWo2$^flen`oXqq@{_+NNhq3y5Z$Yuq zFS+MwLREQPYRXW65~*3{Xh4u74EMYS&sL~RK)*r`a?4mNjDTd@zO`YXDnGXL<@If> z<2K`bBaThHnX{5_IL)OL!nJ1=X1qhnRHkjC%I?TZ{p`OXE*;z!JZ)YUxjY&e7FtrT zTOM3eKg;OUtdS`EbmIqb`G#{WE?UVk&Fjs>CVDmHCf&fBz*j%P>$9Z9c^v=#43V|% zNRXK#5QN1^mo)fKInpSFfSsF##j=<6*;lf-56I4Ny75|+G@ddZa}U{pkwINB7b&rg z#TYY2Grb3%5>GX1H}uBxeK?##+r;;I1^&1xfGZs!gA%=z zG!;>9dQ?;Lw=PUhV9YXNJ3vJ9v*+2!H6w{hwf+qXgsqIKDj0~C+18#bnUb8v#R>UZ zCZGSnCQr=ur{rp{WxMKZdT>p1W%8E+1nc9Hx)nf4*qPcy=P=>6^~v zmsL4&wX{#bvvD#ta;!OM6hqX~z6)ctKn;Tkpo32!PdX!~x;>GC?A zX}iUJSJ13K8fO#95mC^Ws7tvC=Q6{Ce=>3LR9D_)McE=5?D|ByzaEK_Iep#-JsgQHo$eZ3cH(o(|84-Nw);M)+QP8?QIF7i1pd*~zW7SZnXWgB- za{rd7wsPr24>Qt5RXlU7fI0Ta^S)udYEhnAr*G-tuc{i)55@8j>!UvAbT2}%4Sw4pKqIVI!Ali(MD@u3)i zHxO?3_T(YtkdM?iiY8i9l__BAk-0e!aF^NEEtolN?~5NSvM)jtWp&0iNF)(qC>7B< zFkB+xz|Ey?^1lJXjE#jRk|+&41sIjyCOhF{`V>~y)T*|ok~;ywNW4G5#n;+ zIp%8-HVezcw7ie&b=U}r^=mYnfT=|L0M!y|Jr&woamZUXBx(~GU z*jH*7B-qO{>UNBP3(>+Nq!a!LR*Diwi~5T@X3!Q(HEYE)5 zvp86_8e4<~r4X-EH>M{n(&lL06M>r`qLHjHrYyK`=)iLjx4t6c%}` z&hvA1pNytt_hoDs*zyj+SMRkw+|qFN;@p^viI-feV-hNH@$JwYxQuG6x3Qea`Ag5P zwyU&acB(<6UWk$ux75KSzvAs^8ekIxRa2PVQwKK>*{Zv9S;0P@YTtG~&botiia!lc zkGqT~F&`EOV4Y-QkZmMQe(|-Z3vp*?%&kVe^s}z~CQh{RR8Ec6K%*7!g>vg^&HHdc z{LHe%0COj>)dt;2p(Wgv@Xo7k=y;;b6OLj3x&sIemV=G>3itVqnp?%+PxTNX=z`avbfrhMB6o_+}$jc}9;x(|jf&2bhsL=3AYi$>BanUMuMu z9ED*SPuW|0&S}37+yY3=fd+%)DWG^CrEb_KoEPK+K9zyx?eY%b8Bd{2_YXWK1GA%w zti9f3Ucb*7f#|sP&@LrBPGLk<)OyEmFQ3ctX=MU3)Bg|7Dfbf_*fU>hRX`N1_Qg5? z1blQ}a+jBa$Pw4@H}R1Z)ADwALlmr*;>%lKzRLK%b&x!UR`e`^KY`+JLz8`2Cr-93 zq<88xj{I>0N8>3j#l?9-P!*G?=i$e literal 0 HcmV?d00001 diff --git a/packages/web/public/icons/icon-192.png b/packages/web/public/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..fe58861aff5b47d80208c8a1c577597d17820203 GIT binary patch literal 3269 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 { @@ -14,6 +14,7 @@ self.addEventListener('push', (event) => { event.waitUntil( self.registration.showNotification(title, { body, + icon: '/icons/icon-192.png', // Collapse multiple messages from the same chat into one notification. tag: conversationId || undefined, renotify: Boolean(conversationId), diff --git a/packages/web/src/app/App.tsx b/packages/web/src/app/App.tsx index bf8cc45..d298a8e 100644 --- a/packages/web/src/app/App.tsx +++ b/packages/web/src/app/App.tsx @@ -1,15 +1,27 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import type { ReactElement, SyntheticEvent } from 'react'; +import type { ReactElement } from 'react'; import type { Conversation, Message, MediaRef, PublicUser, User } from '@altricade/core'; -import { heartbeat } from '@altricade/core/api'; +import { + heartbeat, + getAvatarUploadUrl, + uploadToUrl, + setConversationAvatar, + forwardMessage, +} from '@altricade/core/api'; import { SessionProvider, useSession } from '../entities/session'; import { AuthForm } from '../features/auth'; import { RealtimeProvider } from '../features/realtime'; -import { useConversations, ConversationSidebar } from '../features/conversations'; +import { + useConversations, + ConversationSidebar, + NewGroupPanel, + NewChannelPanel, + ForwardPicker, +} from '../features/conversations'; import { useFolders } from '../features/folders'; import { ContactsPanel } from '../features/contacts'; import { ChatView } from '../features/messaging'; -import { ProfilePanel } from '../features/profile'; +import { ProfilePanel, GroupInfoPanel } from '../features/profile'; import { SettingsPanel } from '../features/settings'; import { NotificationsProvider, useNotifications, unregisterWebPush } from '../features/notifications'; import { apiConfig } from '../shared/api'; @@ -19,15 +31,20 @@ import { UsersIcon, UserIcon, ChatsIcon, - SettingsIcon, ChevronLeftIcon, + MegaphoneIcon, + BrandGlyph, + ContextMenu, + MenuItem, + useContextMenu, } from '../shared/ui'; -type RailView = 'chats' | 'contacts' | 'compose' | 'settings'; +type RailView = 'chats' | 'contacts' | 'new-group' | 'new-channel' | 'settings'; const RAIL_TITLES: Record, string> = { contacts: 'Contacts', - compose: 'New group', + 'new-group': 'New group', + 'new-channel': 'New channel', settings: 'Settings', }; @@ -49,65 +66,6 @@ const mediaLabel = (media: MediaRef | null): string => { } }; -const GroupComposer = ({ - onCreate, -}: { - onCreate: (title: string, members: string[]) => Promise; -}): ReactElement => { - const [title, setTitle] = useState(''); - const [members, setMembers] = useState(''); - const [error, setError] = useState(null); - - const submit = async (event: SyntheticEvent): Promise => { - event.preventDefault(); - const trimmed = title.trim(); - if (trimmed === '') { - return; - } - const list = members - .split(',') - .map((name) => name.trim()) - .filter((name) => name.length > 0); - setError(null); - try { - await onCreate(trimmed, list); - setTitle(''); - setMembers(''); - } catch { - setError('Could not create group'); - } - }; - - return ( -
-

New group

-
void submit(event)}> - { - setTitle(event.target.value); - }} - /> - { - setMembers(event.target.value); - }} - /> - -
- {error !== null ?

{error}

: null} -
- ); -}; - const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): ReactElement => { const me: PublicUser = { id: user.id, @@ -120,6 +78,8 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re const [railView, setRailView] = useState('chats'); const [activeFolderId, setActiveFolderId] = useState(null); const [profileUser, setProfileUser] = useState(null); + const [groupInfo, setGroupInfo] = useState(null); + const [forwarding, setForwarding] = useState(null); const convRef = useRef([]); const folders = useFolders(user.id); @@ -138,16 +98,35 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re [notify], ); - const { conversations, onlineMap, startDirect, createGroupChat, clearChat, deleteChat } = - useConversations(user.id, current?.id ?? null, onIncoming); + const { + conversations, + onlineMap, + startDirect, + createGroupChat, + createChannelChat, + clearChat, + deleteChat, + } = useConversations(user.id, current?.id ?? null, onIncoming); + const composeMenu = useContextMenu(); convRef.current = conversations; const openConversation = useCallback((conversation: Conversation): void => { setCurrent(conversation); setRailView('chats'); setProfileUser(null); + setGroupInfo(null); }, []); + const openUserProfile = useCallback( + (target: PublicUser): void => { + if (target.id !== user.id) { + setGroupInfo(null); + setProfileUser(target); + } + }, + [user.id], + ); + // The DM shared with the profiled user, when one exists (drives shared media). const profileConversation = profileUser === null @@ -156,11 +135,18 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re (item) => item.type === 'direct' && item.peer !== null && item.peer.id === profileUser.id, ) ?? null); - // If the open chat disappears from the list (deleted for me, possibly on - // another device), close it. + // Keep the open chat in sync with the live list: close it if it disappears + // (deleted for me / on another device), else refresh its object so header + // title/avatar changes (e.g. a new group photo) show without reopening. useEffect(() => { - if (current !== null && !conversations.some((c) => c.id === current.id)) { + if (current === null) { + return; + } + const updated = conversations.find((c) => c.id === current.id); + if (updated === undefined) { setCurrent(null); + } else if (updated !== current) { + setCurrent(updated); } }, [conversations, current]); @@ -211,14 +197,47 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re openConversation(await startDirect(username)); }; - const createGroupAndOpen = async (title: string, members: string[]): Promise => { - openConversation(await createGroupChat(title, members)); + // Create → optionally upload the chosen photo → open, so the new chat lands + // with its avatar already set. + const applyAvatar = async (conversation: Conversation, avatar: File | null): Promise => { + if (avatar === null) { + return conversation; + } + const mime = avatar.type.length > 0 ? avatar.type : 'application/octet-stream'; + const target = await getAvatarUploadUrl(apiConfig, { mime, size: avatar.size }); + await uploadToUrl(target.uploadUrl, avatar, mime); + return setConversationAvatar(apiConfig, conversation.id, { objectKey: target.objectKey }); }; + const createGroupAndOpen = async ( + title: string, + members: string[], + avatar: File | null, + ): Promise => { + openConversation(await applyAvatar(await createGroupChat(title, members), avatar)); + }; + + const createChannelAndOpen = async ( + title: string, + description: string | null, + members: string[], + avatar: File | null, + ): Promise => { + openConversation(await applyAvatar(await createChannelChat(title, description, members), avatar)); + }; + + // Own avatar — the Telegram-style entry point to Settings (header + bottom nav). + const renderAvatar = (cls: string): ReactElement => + user.avatarUrl !== null ? ( + + ) : ( + {user.displayName.charAt(0)} + ); + const shellClass = [ 'app-shell', current !== null ? 'has-chat' : '', - profileUser !== null ? 'has-profile' : '', + profileUser !== null || groupInfo !== null ? 'has-profile' : '', ] .filter((token) => token !== '') .join(' '); @@ -230,9 +249,9 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re {railView === 'chats' ? ( - Altricade + Zovi ) : ( @@ -251,41 +270,17 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re )}
{railView === 'chats' ? ( - <> - - - - + ) : ( {current !== null ? ( { - if (target.id !== user.id) { - setProfileUser(target); - } + onOpenProfile={openUserProfile} + onOpenGroupInfo={(conv) => { + setProfileUser(null); + setGroupInfo(conv); + }} + onForward={(msgs) => { + setForwarding(msgs); }} onBack={() => { setCurrent(null); @@ -387,7 +407,7 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re

Select a conversation

Search for someone or start a new chat to begin messaging.

@@ -407,6 +427,40 @@ const Dashboard = ({ user, onLogout }: { user: User; onLogout: () => void }): Re void startDirectAndOpen(username); }} /> + ) : groupInfo !== null ? ( + { + setGroupInfo(null); + }} + onOpenUser={openUserProfile} + /> + ) : null} + + {forwarding !== null ? ( + { + setForwarding(null); + }} + onPick={(target, hideSender) => { + const list = forwarding; + setForwarding(null); + void (async () => { + for (const message of list) { + await forwardMessage(apiConfig, target.id, { + sourceConversationId: message.conversationId, + messageId: message.id, + hideSender, + }); + } + openConversation(target); + })(); + }} + /> ) : null}
); @@ -419,7 +473,7 @@ const Shell = (): ReactElement => { return (
); diff --git a/packages/web/src/app/index.css b/packages/web/src/app/index.css index a68e946..e0f36c7 100644 --- a/packages/web/src/app/index.css +++ b/packages/web/src/app/index.css @@ -1,5 +1,5 @@ /* ============================================================================= - Altricade — design system foundation + Zovi — design system foundation Colors come from ThemeProvider as --color- (see shared/theme/tokens.ts). Everything below is the static primitive layer + base element styling. Component sections are appended further down, grouped by feature. @@ -1086,17 +1086,26 @@ a { opacity: 0.7; } +/* Timestamp on its own line under the content, right-aligned — consistent + across text, media, voice, and round video (no more cramped inline times). */ .bubble-meta { - float: right; - display: inline-flex; + display: flex; align-items: center; - gap: 0.2rem; - margin: 0.35rem 0 -0.1rem 0.6rem; + /* Time (left) … read mark (right). */ + justify-content: space-between; + gap: 0.75rem; + margin-top: 0.2rem; font-size: 0.68rem; line-height: 1; user-select: none; } +.meta-left { + display: inline-flex; + align-items: center; + gap: 0.25rem; +} + .bubble-mine .bubble-meta { color: var(--color-onAccentMuted); } @@ -1722,7 +1731,14 @@ a { .bubble.bubble-bare .bubble-meta { color: var(--color-textFaint); padding: 0; - margin-top: 0.3rem; + margin-top: 0.35rem; +} + +/* Extra breathing room so stacked round-video notes (and their times) don't + crowd each other. */ +.msg-line.has-bare { + margin-top: 0.35rem; + margin-bottom: 0.6rem; } /* ============================================================================= @@ -2321,23 +2337,88 @@ a { background: var(--color-surfaceHover); } -.profile-voice { - display: flex; - align-items: center; - gap: 0.6rem; - padding: 0.35rem 0.5rem; - border-radius: var(--radius-md); - background: var(--color-background); - border: 1px solid var(--color-border); +/* Telegram-style rows in the Voice tab: round thumb, date, sender. */ +.note-month { + margin: 0.65rem 0 0.15rem; + padding: 0 0.25rem; + font-size: var(--text-xs); + font-weight: 600; + letter-spacing: 0.05em; } -.profile-voice .voice { - flex: 1; +.note-row { + display: flex; + align-items: center; + gap: 0.65rem; + width: 100%; + padding: 0.4rem 0.5rem; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + background: var(--color-background); + color: var(--color-text); + text-align: left; +} + +.note-row-click { + cursor: pointer; + transition: background var(--dur-fast) var(--ease); +} + +.note-row-click:hover { + background: var(--color-surfaceHover); +} + +.note-play { + flex: 0 0 auto; + display: grid; + place-items: center; + width: 42px; + height: 42px; + border: none; + border-radius: var(--radius-full); + background: var(--color-accent); + color: #fff; + cursor: pointer; +} + +.note-thumb { + position: relative; + flex: 0 0 auto; + width: 42px; + height: 42px; + border-radius: var(--radius-full); + overflow: hidden; + background: #000; +} + +.note-thumb video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.note-thumb-play { + position: absolute; + inset: 0; + display: grid; + place-items: center; + color: #fff; + background: rgba(0, 0, 0, 0.25); +} + +.note-meta { + display: flex; + flex-direction: column; min-width: 0; } -.profile-voice-date { - flex: 0 0 auto; +.note-date { + font-weight: 600; + font-size: var(--text-sm); +} + +.note-sender { font-size: var(--text-xs); } @@ -2606,8 +2687,45 @@ a { Mobile bottom navigation (Telegram-style) + profile back button ========================================================================== */ +/* Bottom nav toolbar — Telegram-style, always visible (desktop + mobile). */ .rail-nav { - display: none; + display: flex; + align-items: stretch; + flex: 0 0 auto; + border-top: 1px solid var(--color-border); + background: var(--color-surfacePanel); + padding-bottom: env(safe-area-inset-bottom); +} + +.rail-nav-btn { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 0.95rem 0; + border: none; + background: none; + color: var(--color-textFaint); + transition: color var(--dur-fast) var(--ease); +} + +.rail-nav-btn:hover { + color: var(--color-textMuted); +} + +.rail-nav-btn[aria-pressed='true'] { + color: var(--color-accent); +} + +.rail-nav-icon { + position: relative; + display: inline-flex; +} + +.rail-nav-badge { + position: absolute; + top: -6px; + right: -12px; } .profile-back { @@ -2615,47 +2733,6 @@ a { } @media (max-width: 900px) { - .rail-nav { - display: flex; - align-items: stretch; - flex: 0 0 auto; - border-top: 1px solid var(--color-border); - background: var(--color-surfacePanel); - padding-bottom: env(safe-area-inset-bottom); - } - - .rail-nav-btn { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - padding: 0.65rem 0; - border: none; - background: none; - color: var(--color-textFaint); - transition: color var(--dur-fast) var(--ease); - } - - .rail-nav-btn[aria-pressed='true'] { - color: var(--color-accent); - } - - .rail-nav-icon { - position: relative; - display: inline-flex; - } - - .rail-nav-badge { - position: absolute; - top: -6px; - right: -12px; - } - - /* Header shortcuts are redundant next to the bottom nav. */ - .rail-desktop-action { - display: none; - } - /* Profile page: back arrow left (Telegram-style), no X. */ .profile-back { display: inline-flex; @@ -2679,3 +2756,1034 @@ a { right: 0.75rem; } } + +/* ============================================================================= + User picker (Telegram "Select Users") + creation wizards + ========================================================================== */ + +.picker { + display: flex; + flex-direction: column; + min-height: 0; + flex: 1; +} + +.picker-search { + padding: 0.35rem 0.85rem 0.5rem; +} + +.pick-chips { + display: flex; + flex-wrap: wrap; + gap: 0.35rem; + padding: 0.25rem 0.85rem 0; +} + +.pick-chip { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.2rem 0.6rem; + border: none; + border-radius: var(--radius-full); + background: var(--color-accentSoft); + color: var(--color-accent); + font-size: var(--text-sm); + font-weight: 600; + transition: background var(--dur-fast) var(--ease); +} + +.pick-chip:hover { + background: color-mix(in srgb, var(--color-danger) 14%, transparent); + color: var(--color-danger); +} + +.pick-list { + flex: 1; + min-height: 0; + overflow-y: auto; + padding: 0 0.5rem 0.75rem; +} + +.pick-row { + display: flex; + align-items: center; + gap: 0.7rem; + width: 100%; + padding: 0.45rem 0.6rem; + border: none; + border-radius: var(--radius-lg); + background: none; + text-align: left; + transition: background var(--dur-fast) var(--ease); +} + +button.pick-row:hover { + background: var(--color-surfaceHover); +} + +.pick-avatar { + width: 40px; + height: 40px; + font-size: var(--text-base); +} + +.pick-main { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + line-height: 1.3; +} + +.pick-name { + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pick-sub { + font-size: var(--text-sm); + color: var(--color-textMuted); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pick-check { + flex: 0 0 auto; + display: grid; + place-items: center; + width: 22px; + height: 22px; + border-radius: var(--radius-full); + border: 2px solid var(--color-borderStrong); + color: var(--color-onAccent); + transition: + background var(--dur-fast) var(--ease), + border-color var(--dur-fast) var(--ease); +} + +.pick-check.is-on { + background: var(--color-accent); + border-color: var(--color-accent); +} + +/* Wizards (new group / new channel) */ +.wizard { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; +} + +.wizard-bar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + padding: 0.35rem 0.85rem 0.5rem; + flex: 0 0 auto; +} + +.wizard-bar-actions { + display: flex; + align-items: center; + gap: 0.4rem; +} + +.wizard-count { + font-size: var(--text-sm); + font-weight: 600; + color: var(--color-textMuted); +} + +.wizard-form { + display: flex; + flex-direction: column; + gap: 0.9rem; + padding: 1.25rem 1rem; +} + +.wizard-glyph { + align-self: center; + display: grid; + place-items: center; + width: 64px; + height: 64px; + border-radius: var(--radius-full); + background: linear-gradient(140deg, var(--color-accent), var(--color-accentHover)); + color: var(--color-onAccent); + margin-bottom: 0.25rem; +} + +.wizard-desc { + resize: vertical; + min-height: 4.2rem; + font: inherit; +} + +.wizard-note { + font-size: var(--text-sm); +} + +.wizard-actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; +} + +.btn-ghost { + padding: 0.55rem 0.9rem; + border: none; + border-radius: var(--radius-md); + background: none; + color: var(--color-textMuted); + font-size: var(--text-sm); + font-weight: 600; + transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); +} + +.btn-ghost:hover { + background: var(--color-surfaceHover); + color: var(--color-text); +} + +/* Channel read-only footer (subscribers) */ +.channel-readonly { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.85rem; + background: var(--color-surfacePanel); + border-top: 1px solid var(--color-border); + color: var(--color-textMuted); + font-size: var(--text-sm); + font-weight: 600; +} + +/* Contacts typeahead rows */ +.contact-match { + padding-right: 0.25rem; +} + +.contact-match .contact-open { + flex: 1; + min-width: 0; + padding: 0.15rem 0.25rem; +} + +.contact-add { + width: 34px; + height: 34px; + color: var(--color-accent); +} + +.contact-add:hover { + background: var(--color-accentSoft); + color: var(--color-accent); +} + +.contact-added { + display: grid; + place-items: center; + width: 34px; + height: 34px; + color: var(--color-online); +} + +/* ============================================================================= + Settings page v2 — Telegram-style grouped, editable rows + ========================================================================== */ + +.settings-name-display { + font-size: var(--text-lg); + font-weight: 700; +} + +.set-group { + padding: 0 0.85rem; + margin-top: 0.85rem; +} + +.set-card { + border-radius: var(--radius-lg); + background: var(--color-background); + border: 1px solid var(--color-border); + overflow: hidden; +} + +.set-row { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.1rem; + width: 100%; + padding: 0.6rem 0.9rem; + border: none; + background: none; + text-align: left; + color: var(--color-text); + transition: background var(--dur-fast) var(--ease); +} + +.set-card > .set-row + .set-row, +.set-card > .set-row-edit + .set-row, +.set-card > .set-row + .set-row-edit { + border-top: 1px solid var(--color-border); +} + +button.set-row:hover { + background: var(--color-surfaceHover); + cursor: pointer; +} + +.set-value { + font-size: var(--text-base); +} + +.set-placeholder { + color: var(--color-accent); +} + +.set-label { + font-size: var(--text-xs); + color: var(--color-textFaint); +} + +.set-row-static { + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} + +.set-row-static .set-label { + order: -1; + font-size: var(--text-base); + color: var(--color-text); +} + +.set-row-edit { + gap: 0.35rem; + padding: 0.5rem 0.6rem 0.6rem 0.9rem; +} + +.set-input-wrap { + display: flex; + align-items: center; + gap: 0.25rem; + width: 100%; +} + +.set-prefix { + color: var(--color-textMuted); +} + +.set-input { + flex: 1; + min-width: 0; + border: none; + background: none; + color: var(--color-text); + font: inherit; + padding: 0.25rem 0; +} + +.set-input:focus { + outline: none; +} + +.set-row-btn { + width: 32px; + height: 32px; +} + +.set-row-error { + color: var(--color-danger); + font-size: var(--text-xs); +} + +.set-card .settings-logout { + border-radius: 0; +} + +/* ============================================================================= + Avatar-as-Settings entry (desktop header + mobile bottom nav) + ========================================================================== */ + +.rail-avatar-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + flex: 0 0 auto; + padding: 0; + border: none; + border-radius: var(--radius-full); + background: none; + cursor: pointer; + transition: box-shadow var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); +} + +.rail-avatar-btn:hover { + transform: scale(1.05); +} + +.rail-avatar { + width: 32px; + height: 32px; + font-size: var(--text-sm); +} + +/* Mobile bottom-nav avatar tab */ +.rail-nav-avatar-img { + width: 30px; + height: 30px; + font-size: var(--text-sm); + box-shadow: 0 0 0 2px transparent; + transition: box-shadow var(--dur-fast) var(--ease); +} + +.rail-nav-avatar-btn[aria-pressed='true'] .rail-nav-avatar-img { + box-shadow: 0 0 0 2px var(--color-accent); +} + +.contact-online { + color: var(--color-online); +} + +/* ============================================================================= + Group/channel info — members list + ========================================================================== */ + +.profile-about { + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +.member-row { + display: flex; + align-items: center; + gap: 0.7rem; + width: 100%; + padding: 0.4rem 0.5rem; + border: none; + border-radius: var(--radius-md); + background: none; + text-align: left; + transition: background var(--dur-fast) var(--ease); +} + +.member-row:hover { + background: var(--color-surfaceHover); +} + +.member-avatar { + width: 40px; + height: 40px; + font-size: var(--text-base); +} + +.member-main { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + line-height: 1.3; +} + +.member-name { + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.member-sub { + font-size: var(--text-sm); + color: var(--color-textMuted); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.member-role { + flex: 0 0 auto; + font-size: var(--text-xs); + font-weight: 600; + color: var(--color-accent); + text-transform: uppercase; + letter-spacing: 0.03em; +} + +/* ============================================================================= + Hero avatar (view full-size + optional edit) + wizard avatar picker + ========================================================================== */ + +.hero-avatar-wrap { + position: relative; + margin-bottom: 0.6rem; +} + +.hero-avatar-view { + display: block; + padding: 0; + border: none; + background: none; + border-radius: var(--radius-full); + cursor: zoom-in; +} + +.hero-avatar-edit { + position: absolute; + right: 2px; + bottom: 2px; + display: grid; + place-items: center; + width: 32px; + height: 32px; + border-radius: var(--radius-full); + background: var(--color-accent); + color: var(--color-onAccent); + border: 2px solid var(--color-surfacePanel); + cursor: pointer; +} + +/* Round video note inside the profile Voice tab — small player. */ +.profile-videonote .round-video { + width: 56px; + height: 56px; +} + +.profile-videonote .round-video-overlay svg, +.profile-videonote .round-video-time { + transform: scale(0.8); +} + +/* Wizard avatar picker (creation flows) */ +.wizard-name-row { + display: flex; + align-items: flex-end; + gap: 0.75rem; +} + +.wizard-name-field { + flex: 1; + min-width: 0; +} + +.wizard-avatar { + position: relative; + flex: 0 0 auto; + width: 56px; + height: 56px; + border-radius: var(--radius-full); + cursor: pointer; + overflow: visible; +} + +.wizard-avatar-img { + width: 56px; + height: 56px; + border-radius: var(--radius-full); + object-fit: cover; + display: block; +} + +.wizard-avatar-ph { + display: grid; + place-items: center; + width: 56px; + height: 56px; + border-radius: var(--radius-full); + background: var(--color-surface); + color: var(--color-textMuted); + border: 1px dashed var(--color-borderStrong); +} + +.wizard-avatar-cam { + position: absolute; + right: -2px; + bottom: -2px; + display: grid; + place-items: center; + width: 24px; + height: 24px; + border-radius: var(--radius-full); + background: var(--color-accent); + color: var(--color-onAccent); + border: 2px solid var(--color-surfacePanel); +} + +/* ============================================================================= + Reply, forward, pin, select + ========================================================================== */ + +/* Pinned bar (below the chat header) */ +.pin-bar { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.4rem 0.8rem; + background: color-mix(in srgb, var(--color-surfacePanel) 90%, transparent); + backdrop-filter: blur(8px); + border-bottom: 1px solid var(--color-border); +} + +.pin-bar-icon { + color: var(--color-accent); + flex: 0 0 auto; +} + +.pin-bar-main { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 1px; + padding: 0.1rem 0.3rem; + border: none; + border-left: 2px solid var(--color-accent); + padding-left: 0.6rem; + background: none; + text-align: left; + line-height: 1.25; +} + +.pin-bar-label { + font-size: var(--text-xs); + font-weight: 700; + color: var(--color-accent); +} + +.pin-bar-preview { + font-size: var(--text-sm); + color: var(--color-textMuted); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} + +.pin-bar-unpin { + width: 32px; + height: 32px; + flex: 0 0 auto; +} + +.bubble-pin { + opacity: 0.75; +} + +/* Reply quote inside a bubble */ +.reply-quote { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 1px; + width: 100%; + margin: 0 0 0.25rem; + padding: 0.2rem 0.5rem; + border: none; + border-left: 2px solid currentColor; + border-radius: 4px; + background: color-mix(in srgb, currentColor 10%, transparent); + text-align: left; + cursor: pointer; + line-height: 1.3; +} + +.reply-quote-name { + font-size: var(--text-xs); + font-weight: 700; + opacity: 0.95; +} + +.reply-quote-text { + font-size: var(--text-sm); + opacity: 0.8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 260px; +} + +/* Forwarded-from header — its own line above the content, name not clipped. */ +.fwd-head { + display: flex; + align-items: center; + gap: 0.3rem; + width: 100%; + margin-bottom: 0.25rem; + padding: 0; + border: none; + background: none; + text-align: left; + font-size: var(--text-xs); + font-weight: 600; + color: var(--color-accent); +} + +.bubble-mine .fwd-head { + color: var(--color-onAccent); +} + +.fwd-name { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.fwd-link { + cursor: pointer; +} + +.fwd-link:hover .fwd-name { + text-decoration: underline; +} + +/* Forwarded header above a bare round-video note (no bubble background). */ +.fwd-bare { + color: var(--color-accent); + padding: 0 0.1rem 0.1rem; +} + +/* Jump-to-message highlight — Telegram-style wash over the whole row. */ +.msg-line.flash { + animation: flash-line 1.6s var(--ease); + border-radius: var(--radius-md); +} + +@keyframes flash-line { + 0%, + 100% { + background: transparent; + } + 15%, + 55% { + background: color-mix(in srgb, var(--color-accent) 16%, transparent); + } +} + +/* Selection mode */ +.msg-line.select-mode { + cursor: pointer; + padding-left: 0.25rem; +} + +.msg-line.select-mode.selected { + background: color-mix(in srgb, var(--color-accent) 12%, transparent); + border-radius: var(--radius-md); +} + +.select-dot { + flex: 0 0 auto; + align-self: center; + display: grid; + place-items: center; + width: 22px; + height: 22px; + border-radius: var(--radius-full); + border: 2px solid var(--color-borderStrong); + color: var(--color-onAccent); +} + +.select-dot.is-on { + background: var(--color-accent); + border-color: var(--color-accent); +} + +.select-bar { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.6rem clamp(0.6rem, 3vw, 1.5rem); + background: var(--color-surfacePanel); + border-top: 1px solid var(--color-border); +} + +.select-count { + flex: 1; + font-weight: 600; + color: var(--color-textMuted); +} + +.select-actions { + display: flex; + gap: 0.35rem; +} + +.select-actions .icon-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +/* Non-interactive info row in the message context menu */ +.ctx-info { + padding: 0.4rem 0.7rem; + font-size: var(--text-xs); + color: var(--color-textFaint); + border-top: 1px solid var(--color-border); + margin-top: 4px; + font-variant-numeric: tabular-nums; +} + +/* Forward picker modal */ +.forward-panel { + display: flex; + flex-direction: column; + width: min(400px, calc(100vw - 2rem)); + max-height: min(560px, 82vh); + border-radius: var(--radius-lg); + background: var(--color-surfacePanel); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-lg); + overflow: hidden; +} + +.forward-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.6rem 0.5rem 1rem; + border-bottom: 1px solid var(--color-border); +} + +.forward-title { + font-weight: 700; +} + +.forward-hide { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.4rem 1rem 0.2rem; + font-size: var(--text-sm); + color: var(--color-textMuted); + cursor: pointer; +} + +.forward-list { + flex: 1; + min-height: 0; +} + +/* ============================================================================= + Deterministic media boxes — the frame owns the size (from stored dimensions + or a legacy fixed box); the media fills it. Layout never reflows on load, + which is what keeps scroll positions exact. + ========================================================================== */ + +.media-image-btn, +.media-video-frame { + max-width: min(340px, 72vw); + overflow: hidden; +} + +.media-fill { + width: 100% !important; + height: 100% !important; + max-width: none; + max-height: none; + object-fit: cover; + display: block; + border-radius: var(--radius-md); +} + +/* Media sent before dimensions were captured: fixed cover-cropped box. */ +.media-image-btn.media-box-legacy { + width: min(300px, 68vw); + height: 220px; +} + +.media-video-frame.media-box-legacy { + width: min(320px, 72vw); + height: 200px; +} + +/* ============================================================================= + Media upload progress (pending sends) + ========================================================================== */ + +.upload-bubble { + min-width: 200px; +} + +/* --- image/video preview with overlaid ring --- */ + +.upload-media { + position: relative; + border-radius: var(--radius-md); + overflow: hidden; + max-width: min(260px, 60vw); +} + +.upload-media-preview { + display: block; + width: 100%; + max-height: 260px; + object-fit: cover; +} + +.upload-media-shade { + position: absolute; + inset: 0; + background: rgb(0 0 0 / 45%); +} + +.upload-media-overlay { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.45rem; + color: #fff; +} + +.upload-status { + font-size: var(--text-xs); + font-weight: 600; + text-shadow: 0 1px 2px rgb(0 0 0 / 45%); +} + +.upload-media.is-failed .upload-status { + color: #fca5a5; +} + +/* --- voice/file row with the ring in the icon slot --- */ + +.upload-row { + display: flex; + align-items: center; + gap: 0.65rem; + min-width: 220px; + padding: 0.15rem 0; +} + +.upload-row-meta { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; +} + +.upload-row-name { + font-size: var(--text-sm); + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.upload-row-sub { + font-size: var(--text-xs); + opacity: 0.75; +} + +.upload-row.is-failed .upload-row-sub { + color: var(--color-danger); + opacity: 1; +} + +.upload-row-kind { + flex: 0 0 auto; + opacity: 0.7; + display: inline-flex; +} + +/* --- progress ring with cancel inside / sending spinner / retry actions --- */ + +.upload-ring-btn { + position: relative; + width: 40px; + height: 40px; + flex: 0 0 auto; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + border: 0; + border-radius: 50%; + background: color-mix(in srgb, currentColor 12%, transparent); + color: inherit; + cursor: pointer; +} + +.upload-ring-btn.is-busy { + cursor: default; +} + +.upload-media-overlay .upload-ring-btn { + background: rgb(0 0 0 / 40%); + color: #fff; +} + +.upload-ring { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + transform: rotate(-90deg); +} + +.upload-ring-track, +.upload-ring-fill { + fill: none; + stroke-width: 2.5; +} + +.upload-ring-track { + stroke: color-mix(in srgb, currentColor 28%, transparent); +} + +.upload-ring-fill { + stroke: currentColor; + stroke-linecap: round; + transition: stroke-dashoffset 0.2s linear; +} + +.upload-ring-x { + position: relative; +} + +.upload-spinner { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2.5px solid color-mix(in srgb, currentColor 25%, transparent); + border-top-color: currentColor; + animation: upload-spin 0.8s linear infinite; +} + +@keyframes upload-spin { + to { + transform: rotate(360deg); + } +} + +.upload-actions { + display: inline-flex; + align-items: center; + gap: 0.25rem; + flex: 0 0 auto; +} + +.upload-media-overlay .upload-action { + color: #fff; + background: rgb(0 0 0 / 40%); + border-radius: 50%; +} diff --git a/packages/web/src/features/auth/ui/AuthForm.tsx b/packages/web/src/features/auth/ui/AuthForm.tsx index 170eb00..988bd9d 100644 --- a/packages/web/src/features/auth/ui/AuthForm.tsx +++ b/packages/web/src/features/auth/ui/AuthForm.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import type { ReactElement, SyntheticEvent } from 'react'; import { ApiError } from '@altricade/core/api'; import { useSession } from '../../../entities/session'; +import { BrandGlyph } from '../../../shared/ui'; type Mode = 'login' | 'register'; @@ -36,9 +37,9 @@ export const AuthForm = (): ReactElement => {
-

Altricade

+

Zovi

{mode === 'login' ? 'Welcome back.' : 'Create your account.'}

diff --git a/packages/web/src/features/contacts/index.ts b/packages/web/src/features/contacts/index.ts index f900a0a..50a4cda 100644 --- a/packages/web/src/features/contacts/index.ts +++ b/packages/web/src/features/contacts/index.ts @@ -1,3 +1,4 @@ export { useContacts } from './model'; export type { UseContacts } from './model'; export { ContactsPanel } from './ui/ContactsPanel'; +export { UserPicker } from './ui/UserPicker'; diff --git a/packages/web/src/features/contacts/ui/ContactsPanel.tsx b/packages/web/src/features/contacts/ui/ContactsPanel.tsx index cfe7f7a..64c9ce3 100644 --- a/packages/web/src/features/contacts/ui/ContactsPanel.tsx +++ b/packages/web/src/features/contacts/ui/ContactsPanel.tsx @@ -1,52 +1,187 @@ -import { useState } from 'react'; -import type { ReactElement, SyntheticEvent } from 'react'; -import { ApiError } from '@altricade/core/api'; -import { PlusIcon, TrashIcon } from '../../../shared/ui'; +import { useEffect, useMemo, useState } from 'react'; +import type { ReactElement } from 'react'; +import type { Presence, PublicUser } from '@altricade/core'; +import { searchUsers, getPresence, ApiError } from '@altricade/core/api'; +import { apiConfig } from '../../../shared/api'; +import { SearchIcon, PlusIcon, TrashIcon, CheckIcon, CloseIcon } from '../../../shared/ui'; +import { useDebouncedValue } from '../../../shared/lib'; import { useContacts } from '../model'; +const lastSeenLabel = (presence: Presence | undefined): string => { + if (presence === undefined) { + return ''; + } + if (presence.online) { + return 'online'; + } + const iso = presence.lastSeenAt; + if (iso === null) { + return 'last seen a long time ago'; + } + const then = new Date(iso); + const now = new Date(); + if (then.toDateString() === now.toDateString()) { + return `last seen at ${then.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`; + } + return `last seen ${then.toLocaleDateString([], { day: 'numeric', month: 'short' })}`; +}; + interface Props { onStartDirect: (username: string) => Promise; } +// Contacts page: typeahead search (username / name / phone) with add-from-list, +// plus the saved contact list (click to chat, trash to remove). export const ContactsPanel = ({ onStartDirect }: Props): ReactElement => { const { contacts, add, remove } = useContacts(); - const [name, setName] = useState(''); + const [query, setQuery] = useState(''); + const [results, setResults] = useState([]); const [error, setError] = useState(null); + const [presenceMap, setPresenceMap] = useState>(new Map()); - const submit = async (event: SyntheticEvent): Promise => { - event.preventDefault(); - const trimmed = name.trim(); - if (trimmed === '') { - return; + const contactIds = useMemo( + () => new Set(contacts.map((contact) => contact.userId)), + [contacts], + ); + + // Bulk presence for the saved-contact list (drives the "last seen" subtitle). + const contactIdKey = useMemo( + () => contacts.map((contact) => contact.userId).sort((a, b) => a.localeCompare(b)).join(','), + [contacts], + ); + useEffect(() => { + const ids = contactIdKey.split(',').filter((id) => id.length > 0); + if (ids.length === 0) { + return undefined; } + let cancelled = false; + void getPresence(apiConfig, ids).then((list) => { + if (!cancelled) { + setPresenceMap(new Map(list.map((entry) => [entry.userId, entry]))); + } + }); + return () => { + cancelled = true; + }; + }, [contactIdKey]); + + const debouncedQuery = useDebouncedValue(query.trim(), 300); + + // Debounced search-as-you-type (username / name / phone). + useEffect(() => { + if (debouncedQuery.length === 0) { + setResults([]); + return undefined; + } + let cancelled = false; + void searchUsers(apiConfig, debouncedQuery) + .then((found) => { + if (!cancelled) { + setResults(found); + } + }) + .catch(() => { + if (!cancelled) { + setResults([]); + } + }); + return () => { + cancelled = true; + }; + }, [debouncedQuery]); + + const addContact = async (user: PublicUser): Promise => { setError(null); try { - await add(trimmed); - setName(''); + await add(user.username); } catch (caught) { setError(caught instanceof ApiError ? caught.message : 'Could not add contact'); } }; + const searching = query.trim().length > 0; + return (
-

Contacts

-
void submit(event)}> +
+ { - setName(event.target.value); + setQuery(event.target.value); + setError(null); }} /> - - + {searching ? ( + + ) : null} +
{error !== null ?

{error}

: null} - {contacts.length === 0 ? ( -

No contacts yet

+ + {searching ? ( +
+

Matches

+ {results.length === 0 ? ( +

No matches

+ ) : ( + results.map((user) => { + const isContact = contactIds.has(user.id); + return ( +
+ + {isContact ? ( + + + + ) : ( + + )} +
+ ); + }) + )} +
+ ) : contacts.length === 0 ? ( +

No contacts yet — search to add people

) : (
    {contacts.map((contact) => ( @@ -67,7 +202,15 @@ export const ContactsPanel = ({ onStartDirect }: Props): ReactElement => { )} {contact.user.displayName} - @{contact.user.username} + + {lastSeenLabel(presenceMap.get(contact.userId)) || `@${contact.user.username}`} + + ); + }; + + return ( +
    + {selected.length > 0 ? ( +
    + {selected.map((user) => ( + + ))} +
    + ) : null} + +
    + + { + setQuery(event.target.value); + }} + /> +
    + +
    + {matchingContacts.length > 0 ? ( + <> +

    Contacts

    + {matchingContacts.map((user) => + row(user, lastSeenLabel(presenceMap.get(user.id)) || `@${user.username}`), + )} + + ) : null} + {globalResults.length > 0 ? ( + <> +

    Global search

    + {globalResults.map((user) => row(user, `@${user.username}`))} + + ) : null} + {matchingContacts.length === 0 && globalResults.length === 0 ? ( +

    {trimmed === '' ? 'No contacts yet' : 'No matches'}

    + ) : null} +
    +
    + ); +}; diff --git a/packages/web/src/features/conversations/index.ts b/packages/web/src/features/conversations/index.ts index c5f274c..70fce2a 100644 --- a/packages/web/src/features/conversations/index.ts +++ b/packages/web/src/features/conversations/index.ts @@ -1,3 +1,6 @@ export { useConversations } from './model'; export type { UseConversations } from './model'; export { ConversationSidebar } from './ui/ConversationSidebar'; +export { NewGroupPanel } from './ui/NewGroupPanel'; +export { NewChannelPanel } from './ui/NewChannelPanel'; +export { ForwardPicker } from './ui/ForwardPicker'; diff --git a/packages/web/src/features/conversations/model.ts b/packages/web/src/features/conversations/model.ts index bd48505..1dcf7be 100644 --- a/packages/web/src/features/conversations/model.ts +++ b/packages/web/src/features/conversations/model.ts @@ -5,6 +5,7 @@ import { listConversations, createDirect, createGroup, + createChannel, clearConversation, hideConversation, } from '@altricade/core/api'; @@ -17,6 +18,11 @@ export interface UseConversations { onlineMap: Record; startDirect: (username: string) => Promise; createGroupChat: (title: string, members: string[]) => Promise; + createChannelChat: ( + title: string, + description: string | null, + members: string[], + ) => Promise; /** Clear history for me — the chat stays listed with an empty scrollback. */ clearChat: (conversationId: string) => Promise; /** Delete chat for me — removed from the list until new activity arrives. */ @@ -212,6 +218,19 @@ export const useConversations = ( [], ); + const createChannelChat = useCallback( + async (title: string, description: string | null, members: string[]): Promise => { + const conversation = await createChannel(apiConfig, { + title, + ...(description !== null ? { description } : {}), + members, + }); + setConversations((prev) => upsert(prev, conversation)); + return conversation; + }, + [], + ); + const clearChat = useCallback(async (conversationId: string): Promise => { await clearConversation(apiConfig, conversationId); setConversations((prev) => @@ -225,5 +244,14 @@ export const useConversations = ( await hideConversation(apiConfig, conversationId); }, []); - return { conversations, loading, onlineMap, startDirect, createGroupChat, clearChat, deleteChat }; + return { + conversations, + loading, + onlineMap, + startDirect, + createGroupChat, + createChannelChat, + clearChat, + deleteChat, + }; }; diff --git a/packages/web/src/features/conversations/ui/AvatarPicker.tsx b/packages/web/src/features/conversations/ui/AvatarPicker.tsx new file mode 100644 index 0000000..b2984fc --- /dev/null +++ b/packages/web/src/features/conversations/ui/AvatarPicker.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState } from 'react'; +import type { ReactElement, ReactNode, SyntheticEvent } from 'react'; +import { CameraIcon } from '../../../shared/ui'; + +interface Props { + file: File | null; + onPick: (file: File) => void; + /** Placeholder icon shown before a photo is chosen. */ + icon: ReactNode; +} + +// Round avatar picker for the creation wizards: shows a live preview of the +// selected image, or a camera placeholder (Telegram "New Channel" style). +export const AvatarPicker = ({ file, onPick, icon }: Props): ReactElement => { + const [preview, setPreview] = useState(null); + + useEffect(() => { + if (file === null) { + setPreview(null); + return undefined; + } + const url = URL.createObjectURL(file); + setPreview(url); + return () => { + URL.revokeObjectURL(url); + }; + }, [file]); + + const onFile = (event: SyntheticEvent): void => { + const input = event.currentTarget; + const picked = input.files?.[0]; + input.value = ''; + if (picked !== undefined) { + onPick(picked); + } + }; + + return ( + + ); +}; diff --git a/packages/web/src/features/conversations/ui/ConversationSidebar.tsx b/packages/web/src/features/conversations/ui/ConversationSidebar.tsx index effa64d..f7030ee 100644 --- a/packages/web/src/features/conversations/ui/ConversationSidebar.tsx +++ b/packages/web/src/features/conversations/ui/ConversationSidebar.tsx @@ -1,11 +1,13 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import type { ReactElement, SyntheticEvent } from 'react'; import type { ChatFolder, Conversation, PublicUser } from '@altricade/core'; import { searchUsers } from '@altricade/core/api'; import { apiConfig } from '../../../shared/api'; +import { useDebouncedValue } from '../../../shared/lib'; import { SearchIcon, UsersIcon, + MegaphoneIcon, CloseIcon, PlusIcon, PinIcon, @@ -44,13 +46,16 @@ type SidebarDialog = | { kind: 'delete-chat'; conversation: Conversation }; const title = (conversation: Conversation): string => { - if (conversation.type === 'group') { - return conversation.title ?? 'Group'; + if (conversation.type !== 'direct') { + return conversation.title ?? (conversation.type === 'channel' ? 'Channel' : 'Group'); } return conversation.peer === null ? 'Direct' : conversation.peer.displayName; }; const subtitle = (conversation: Conversation): string => { + if (conversation.type === 'channel') { + return 'Channel'; + } if (conversation.type === 'group') { return 'Group'; } @@ -81,13 +86,18 @@ const formatTime = (iso: string): string => { }; const Avatar = ({ conversation }: { conversation: Conversation }): ReactElement => { - const peer = conversation.peer; - if (peer !== null && peer.avatarUrl !== null) { - return ; + if (conversation.avatarUrl !== null) { + return ; } return ( - {conversation.type === 'group' ? : initial(conversation)} + {conversation.type === 'channel' ? ( + + ) : conversation.type === 'group' ? ( + + ) : ( + initial(conversation) + )} ); }; @@ -173,19 +183,30 @@ export const ConversationSidebar = ({ const [dialog, setDialog] = useState(null); const chatMenu = useContextMenu(); const folderMenu = useContextMenu(); + const debouncedQuery = useDebouncedValue(query.trim(), 300); - const runSearch = async (value: string): Promise => { - setQuery(value); - if (value.trim().length === 0) { + // Debounced people search — one request per quiet period, latest wins. + useEffect(() => { + if (debouncedQuery.length === 0) { setResults([]); - return; + return undefined; } - try { - setResults(await searchUsers(apiConfig, value.trim())); - } catch { - setResults([]); - } - }; + let cancelled = false; + void searchUsers(apiConfig, debouncedQuery) + .then((found) => { + if (!cancelled) { + setResults(found); + } + }) + .catch(() => { + if (!cancelled) { + setResults([]); + } + }); + return () => { + cancelled = true; + }; + }, [debouncedQuery]); const start = async (username: string): Promise => { await onStartDirect(username); @@ -225,7 +246,7 @@ export const ConversationSidebar = ({ placeholder="Search people…" value={query} onChange={(event) => { - void runSearch(event.target.value); + setQuery(event.target.value); }} /> {searching ? ( diff --git a/packages/web/src/features/conversations/ui/ForwardPicker.tsx b/packages/web/src/features/conversations/ui/ForwardPicker.tsx new file mode 100644 index 0000000..297b5ff --- /dev/null +++ b/packages/web/src/features/conversations/ui/ForwardPicker.tsx @@ -0,0 +1,118 @@ +import { useMemo, useState } from 'react'; +import type { ReactElement } from 'react'; +import type { Conversation } from '@altricade/core'; +import { SearchIcon, CloseIcon, UsersIcon, MegaphoneIcon } from '../../../shared/ui'; + +interface Props { + conversations: Conversation[]; + /** How many messages are being forwarded (for the header). */ + count: number; + onPick: (target: Conversation, hideSender: boolean) => void; + onClose: () => void; +} + +const label = (conversation: Conversation): string => { + if (conversation.type !== 'direct') { + return conversation.title ?? (conversation.type === 'channel' ? 'Channel' : 'Group'); + } + return conversation.peer?.displayName ?? 'Direct'; +}; + +const initial = (conversation: Conversation): string => label(conversation).charAt(0); + +// Telegram-style "Forward to…" chat picker with a search field and a +// hide-sender toggle. Channels the user can't post to are excluded. +export const ForwardPicker = ({ conversations, count, onPick, onClose }: Props): ReactElement => { + const [query, setQuery] = useState(''); + const [hideSender, setHideSender] = useState(false); + + const results = useMemo(() => { + const trimmed = query.trim().toLowerCase(); + if (trimmed === '') { + return conversations; + } + return conversations.filter((conversation) => + label(conversation).toLowerCase().includes(trimmed), + ); + }, [conversations, query]); + + return ( +
    +
    { + event.stopPropagation(); + }} + > +
    + + Forward {count > 1 ? `${String(count)} messages` : 'message'} + + +
    + +
    + + { + setQuery(event.target.value); + }} + /> +
    + + + +
    + {results.length === 0 ? ( +

    No chats

    + ) : ( + results.map((conversation) => ( + + )) + )} +
    +
    +
    + ); +}; diff --git a/packages/web/src/features/conversations/ui/NewChannelPanel.tsx b/packages/web/src/features/conversations/ui/NewChannelPanel.tsx new file mode 100644 index 0000000..cdb5620 --- /dev/null +++ b/packages/web/src/features/conversations/ui/NewChannelPanel.tsx @@ -0,0 +1,141 @@ +import { useState } from 'react'; +import type { ReactElement, SyntheticEvent } from 'react'; +import type { PublicUser } from '@altricade/core'; +import { MegaphoneIcon } from '../../../shared/ui'; +import { UserPicker } from '../../contacts'; +import { AvatarPicker } from './AvatarPicker'; + +interface Props { + onCreate: ( + title: string, + description: string | null, + members: string[], + avatar: File | null, + ) => Promise; +} + +// Telegram-style channel creation: name + optional description, then add +// subscribers. Only the owner (and later admins) can post in the result. +export const NewChannelPanel = ({ onCreate }: Props): ReactElement => { + const [step, setStep] = useState<'info' | 'members'>('info'); + const [title, setTitle] = useState(''); + const [description, setDescription] = useState(''); + const [avatar, setAvatar] = useState(null); + const [selected, setSelected] = useState([]); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + + const toggle = (user: PublicUser): void => { + setSelected((prev) => + prev.some((item) => item.id === user.id) + ? prev.filter((item) => item.id !== user.id) + : [...prev, user], + ); + }; + + const next = (event: SyntheticEvent): void => { + event.preventDefault(); + if (title.trim() !== '') { + setStep('members'); + } + }; + + const create = async (): Promise => { + if (busy) { + return; + } + setBusy(true); + setError(null); + try { + const trimmedDescription = description.trim(); + await onCreate( + title.trim(), + trimmedDescription === '' ? null : trimmedDescription, + selected.map((user) => user.username), + avatar, + ); + } catch { + setError('Could not create channel'); + setBusy(false); + } + }; + + if (step === 'info') { + return ( +
    +
    +
    + } /> + +
    +