Commit graph

685 commits

Author SHA1 Message Date
Arthur Belleville
a0bbbe15ca
feat(chat-ui): add types, hooks, and security utilities from chatcn
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 13:46:35 +02:00
Arthur Belleville
34fe75cd12
feat(chat-ui): scaffold @xtablo/chat-ui package
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 12:54:19 +02:00
Arthur Belleville
517526ef99
docs: add chatcn integration design spec and implementation plan
Spec and plan for integrating chatcn as @xtablo/chat-ui package,
replacing chatscope for the chat UI rendering layer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 12:06:52 +02:00
Arthur Belleville
fe001b7fc2 feat(chat): improve chat UI with date separators, sender names, and message alignment
- Add shared ChatMessages component with date separators (Aujourd'hui, Hier, etc.)
- Show sender name and avatar on incoming messages
- Own messages aligned to the right, others to the left
- Show message timestamps on each message
- Typing indicator shows member names
- Optimistic messages shown with reduced opacity

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:32:13 +02:00
Arthur Belleville
3b1d8bd2e5 fix: make chat discussion fill full viewport height in tablo detail view
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:16:54 +02:00
Arthur Belleville
76d4db1ea1 chore: add turbo.json for chat-worker deploy task
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:01:00 +02:00
Arthur Belleville
513aa0a316 fix: use fetch() instead of RPC for DO WebSocket upgrades
DO RPC doesn't support WebSocket upgrade requests. Forward the request
via stub.fetch() and pass userId/channelId via custom headers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:58:31 +02:00
Arthur Belleville
28adda9710 chore: add deploy:chat script to root package.json
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:31:03 +02:00
Arthur Belleville
bb9550dd39
fix: resolve pre-existing type errors in test files blocking staging build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:28:35 +02:00
Arthur Belleville
9a56777b8b
Merge pull request #73 from artslidd/feat/chat-self-hosted
Replace Stream Chat with self-hosted chat (Cloudflare DO + Postgres)
2026-04-11 16:21:54 +02:00
Arthur Belleville
daa549a036 fix: use [[routes]] array syntax for custom domain in wrangler.toml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:12:46 +02:00
Arthur Belleville
6ea66c451b fix: use new_sqlite_classes for Durable Objects (required on free plan)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:06:34 +02:00
Arthur Belleville
be7c6d4889 chore: use single chat worker domain for staging and production
Single DB means single chat worker — both frontends connect to chat.xtablo.com.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:01:57 +02:00
Arthur Belleville
f182fff68e fix: use text type for channel_id to match tablos.id column type
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 15:41:52 +02:00
Arthur Belleville
0e8788f32b fix: resolve remaining Stream Chat references and type errors
- Remove useSignUpToStream from hooks/auth.ts and oauth-signin.tsx
- Fix useRef initial values in useChat.ts
- Remove unused destructured variables in chat.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 15:33:48 +02:00
Arthur Belleville
c8db38cf1f chore: remove remaining Stream Chat env vars from API config and Cloud Build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:50:29 +02:00
Arthur Belleville
6081ada013 refactor(main): remove all Stream Chat dependencies and components
- Delete ChatProvider, ChannelPreview, CustomChannelHeader, hooks/channel.ts
- Replace TabloDiscussionSection with chatscope-based implementation using useChat
- Update tablo-details.tsx to use useChatUnread instead of useTabloDiscussionUnread
- Remove streamToken field from User type in UserStoreProvider
- Remove useSignUpToStream from shared auth hooks
- Remove stream-chat and stream-chat-react packages
- Remove stream-chat-react CSS import from main.tsx
- Clean up all streamToken references from test mocks and helpers
- Update chat.test.tsx and tablo-details.layout.test.tsx for new implementation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:49:57 +02:00
Arthur Belleville
37a94ef2b3
refactor(api): remove all Stream Chat dependencies and operations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:44:30 +02:00
Arthur Belleville
54a13c3c30 feat(chat): update env vars — replace Stream API key with chat worker URLs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:28:12 +02:00
Arthur Belleville
bb0aa5e28e feat(chat): rewrite chat page with chatscope UI and custom hooks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:27:46 +02:00
Arthur Belleville
db59316dc3
feat(chat): add useChatUnread hook for polling unread counts 2026-04-11 12:04:27 +02:00
Arthur Belleville
2833b4b2c1
feat(chat): add useChat hook with WebSocket connection and reconnection 2026-04-11 12:04:03 +02:00
Arthur Belleville
2811e51109
feat(chat-worker): add Hono entry point with WebSocket routing and REST endpoints 2026-04-11 12:02:43 +02:00
Arthur Belleville
986b31eff0
feat(chat-worker): implement ChatRoom Durable Object with WebSocket hibernation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:01:24 +02:00
Arthur Belleville
f6a56fdbdd
feat(chat-worker): add JWT auth and PostgREST helpers 2026-04-11 12:00:25 +02:00
Arthur Belleville
d3f4287200
feat(chat-worker): scaffold Cloudflare Worker project
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 11:59:27 +02:00
Arthur Belleville
a9dc771ffb
feat(chat): add messages and channel_read_state tables 2026-04-11 11:58:10 +02:00
Arthur Belleville
f8a0a92fcc
docs: add self-hosted chat implementation plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 11:54:05 +02:00
Arthur Belleville
973d745753
docs: add self-hosted chat design spec (Stream Chat replacement)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 11:40:20 +02:00
Arthur Belleville
1268a268c1
fix: wait for user data before showing paywall, skip for temporary users
Ensures the UpgradeBlockProvider waits for both user and organization
data before computing the block reason, preventing premature paywall
flash. Temporary users are never blocked.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 21:26:10 +02:00
Arthur Belleville
c5d8585918
fix: use useMaybeUser in UpgradeBlockProvider to avoid crash during loading
useUser() throws when the store is null (before user data is fetched).
Switch to useMaybeUser() which safely returns null.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 21:15:42 +02:00
Arthur Belleville
812e56e623
Fix temp users getting blocked 2026-04-07 14:41:08 +02:00
Arthur Belleville
d209504292
fix: reduce mobile sidebar width from w-48 to w-40 and always show expanded on mobile overlay
On mobile, the sidebar was 192px wide (w-48) and could appear collapsed (icons-only)
depending on prior desktop state. This introduces effectivelyCollapsed to always force
expanded mode when the mobile overlay is open, and uses a narrower w-40 (160px) width
to reduce screen coverage on small devices like iPhone SE (375px).

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 08:24:37 +02:00
Arthur Belleville
63cccc4721
fix: prevent mobile overflow in settings page flex containers
Add flex-wrap to the member action row (date + remove button) and the
header badge/language selector row so they wrap gracefully on narrow
screens without affecting desktop layout.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 08:23:32 +02:00
Arthur Belleville
78875f7a9e
fix: rename static icons so worker can intercept all icon requests
Cloudflare serves static assets before the worker runs, so the icon
redirect logic was never reached. Renamed the default icon files to
default-* prefix. The worker now handles all requests for the original
icon paths: redirects to org-specific icons when cookie is set, or to
the renamed defaults otherwise.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:55:21 +02:00
Arthur Belleville
ba2de823c6
fix: redirect apple-touch-icon and favicons to org-specific icons on iOS
iOS uses the apple-touch-icon link tag for the home screen icon, not
the manifest. The worker now intercepts requests for apple-touch-icon
and favicon PNGs, redirecting to the org-specific version from R2
when the x-org-id cookie is set.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:44:28 +02:00
Arthur Belleville
bf66fc4000
fix: use assets.xtablo.com for org icon URLs instead of API proxy
Icons are stored in the web-assets R2 bucket which is already served
via assets.xtablo.com, same as user avatars. No need to proxy through
the API endpoint.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:39:10 +02:00
Arthur Belleville
ec056fbe6c
fix: use full API URL for org icon references
The API runs on a separate domain from the frontend. Org icon URLs
in the manifest and settings page need the full API base URL.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:31:48 +02:00
Arthur Belleville
b20768e280
fix: improve mobile responsiveness for settings page
Stack avatar and org logo sections vertically on mobile, wrap header badges/language selector, and make member list items stack on small screens.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:19:58 +02:00
Arthur Belleville
f82d3f70b8
fix: improve mobile responsiveness for login and signup pages
Add horizontal padding to page containers so cards don't bleed to the
edges on small screens, reduce card inner padding on mobile, scale down
headings at mobile breakpoints, and change the first/last name grid from
a fixed two-column layout to responsive (single column on mobile).
Replace the fixed-width form class (w-95) with w-full on the login form.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:16:20 +02:00
Arthur Belleville
3830bfcf29
index.d.ts 2026-04-02 22:11:32 +02:00
Arthur Belleville
4c8529a355
style: fix import ordering and formatting in new files
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:09:18 +02:00
Arthur Belleville
9679a5816a
fix: convert Buffer to Uint8Array for Response body in org icon endpoint
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:07:46 +02:00
Arthur Belleville
421dc877e2
feat: add organization logo upload UI to settings page
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:05:56 +02:00
Arthur Belleville
203349023d
feat: include logo_url in organization API response 2026-04-02 22:04:27 +02:00
Arthur Belleville
2e9ab46be8
feat: add org ID cookie management and logo upload/remove hooks
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:03:59 +02:00
Arthur Belleville
acc83401f4
feat: disable static manifest generation, add manual manifest link for dynamic serving 2026-04-02 22:02:31 +02:00
Arthur Belleville
595b330741
feat: dynamic manifest in Cloudflare Worker with cookie-based org identification
Adds parseOrgIdFromCookie and buildManifest exports to the worker, intercepting /manifest.webmanifest to serve org-specific PWA icon URLs based on the x-org-id cookie. Removes legacy @ts-nocheck and biome-ignore-file comments.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:01:57 +02:00
Arthur Belleville
538d6e39e6
feat: add public org icon serving endpoint with default fallback
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:00:17 +02:00
Arthur Belleville
bb1b206aea
feat: extend PATCH /organization to accept logo upload and removal
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:59:07 +02:00