Commit Graph
862 Commits
Author SHA1 Message Date
asepharyana e73abf596d fix(fe): handle JSON-stringified fields from backend in message deserialization
Backend returns metadata, ai_moderation_flags, and ai_categories as raw
JSON strings (PostgreSQL JSONB cast to string). Frontend expected parsed
structs/arrays, causing serde to fail silently — entire PageResult parse
failed and user saw empty message list with no error indicator.

Add custom deserialize_with handler (from_json_string_or_value) that
transparently handles null / direct value / JSON-string cases for the
three affected fields.
2026-07-04 09:10:32 +07:00
asepharyana efb1f4e4a5 fix(fe): wiring WS voice/media events, perbaiki race condition, leak, dan history fetch
- Wiring WS events di LivePanel:
  - on_voice_active_user -> update ActiveSpeakers signal
  - on_media_state -> update NowPlaying signal
  - on_voice_recording_uploaded -> trigger RecordingsSubPanel refresh
  - on_binary -> process PCM data dan auto-start audio playback
- AudioPlaybackState: tambah Clone derive + abort AtomicBool
  untuk mencegah loop leak saat teardown
- MusicSubPanel: hapus loading state yang premature reset
  (race condition: loading false sebelum async selesai)
- NowPlaying: ganti prop state jadi RwSignal agar reaktif ke WS
- RecordingsSubPanel: tambah refresh_trigger signal untuk reload
  dari WS event
- MascotChatbot: fetch chat history dari backend saat panel dibuka
- get_review_messages: hapus guildId param (backend ignore)
2026-07-04 05:59:15 +07:00
asepharyana b063524759 fix(fe): perbaiki infinite loop dashboard, config fetching, infinite scroll, dan visualizer reactivity
- Dashboard: ganti Effect::new dengan spawn_local untuk initial fetch agar
  tidak terjadi infinite loop karena reactive dependency tracking
- Config: tambah api/config.rs dan jadikan AppConfig.monitor_guild_id
  RwSignal supaya di-fetch dari backend (saat startup & setelah login)
- Messages: perbaiki messageFetch agar guild_id terbaca dari config reaktif
- Infinite scroll: tambah observer_ready signal + spawn_local trigger
  agar IntersectionObserver setup setelah DOM mount; tambah fallback button
- AudioVisualizer & MicLevelMeter: tambah periodic tick signal (100ms)
  agar efek re-run dan update bars/level dari shared PCM buffer
- pcm_decoder: ganti js_sys::eval dengan wasm-bindgen binding langsung ke btoa
2026-07-04 05:47:47 +07:00
asepharyana 5fa97da969 chore: remove WASM MIME type declaration from nginx configuration 2026-07-04 05:02:25 +07:00
asepharyana 9614546243 feat: upgrade frontend deps — leptos 0.9.0-alpha, leptos-use 0.19, trunk 0.22.0-beta.1 2026-07-04 05:00:18 +07:00
asepharyana f131bd12fb docs: add frontend dependency upgrade design 2026-07-04 03:36:38 +07:00
asepharyana 27e929580e feat: update components and hooks to use get_untracked for improved performance 2026-07-04 03:03:36 +07:00
asepharyana 8166023f91 chore: remove React frontend, rename frontend-leptos to frontend 2026-07-03 23:11:00 +07:00
asepharyana 4390a3da5e Merge branch 'leptos-rewrite' 2026-07-03 22:58:18 +07:00
asepharyana 5216f2204e feat(leptos): Phase 6 polish components 2026-07-03 22:56:45 +07:00
asepharyana 8a2e914f08 feat(leptos): Phase 5 dashboard feature 2026-07-03 22:46:58 +07:00
asepharyana 52d53fc7f7 feat(leptos): Phase 4 Task 7 - LivePanel composition + app.rs wiring 2026-07-03 22:06:40 +07:00
asepharyana ca89dd7a03 feat(leptos): Phase 4 Task 6 - PCM audio playback + mic transmit hooks 2026-07-03 22:05:37 +07:00
asepharyana aaa8faad55 feat(leptos): Phase 4 Task 5 - RecordingsSubPanel + WaveformPlayer 2026-07-03 21:57:45 +07:00
asepharyana 1d7a433b3c feat(leptos): Phase 4 Task 4 - NowPlaying, MusicSubPanel, ScreenSubPanel 2026-07-03 21:54:47 +07:00
asepharyana 8a3ac78bde feat(leptos): Phase 4 Task 3 - AudioVisualizer + MicLevelMeter components 2026-07-03 21:50:48 +07:00
asepharyana d797b6b4c5 feat(leptos): Phase 4 Task 2 - ActiveSpeakers component 2026-07-03 21:04:41 +07:00
asepharyana 1cc04bda66 feat(leptos): Phase 4 Task 2 - VoiceConnectionCard component 2026-07-03 20:56:06 +07:00
asepharyana c9bc5f5b50 feat(leptos): Phase 4 Task 1 - voice/media control hooks 2026-07-03 20:55:19 +07:00
asepharyana 27f0b500f9 docs: implementation plan for leptos live phase 4 2026-07-03 20:50:28 +07:00
asepharyana 3de7f8d823 fix(leptos): resolve Phase 3 compilation errors
- Add PartialEq to MessageRecord and all nested types in shared-types
- Fix String references in view! macro by cloning owned values
- Fix match arm types with .into_any() in app.rs
- Clone on_load_more before FnMut closure in message_feed.rs
- Pre-compute class strings before passing to view! in message_card.rs
- Fix lifetime issues with imgs/vids/cats by using owned Vec<AttachmentRef>
- Use separate closures for different event types in mod.rs
- Fix disabled property to use signal pattern
- Fix filter chip closure signatures
2026-07-03 20:45:35 +07:00
asepharyana 63ddc1e112 fix(leptos): compile errors in Phase 3 message components - WIP
Fixed:
- Icon imports: Replaced lucide-leptos icons with SVG/emoji alternatives
- AnyView lifetime: Fixed render_emojis to use owned strings
- Missing html import in message_feed.rs
- use_messages: Removed #[component] to make it a regular function
- MessageRecord fields: Removed is_reply, is_forward, is_crosspost checks
- String wrapping in view! macros: Wrapped strings in <span> elements
- Closure handling: Changed .into_forget() to .forget() for web_sys Closure
- URL borrowing in image_grid: Clone URLs before using in view!

Remaining issues (in progress):
- String references in class attributes need owned values
- Type inference for None.into_any()
- Closure capture issues with on_load_more
- Match arm type incompatibilities

19 errors remaining out of 31 initial errors - ~61% fixed
2026-07-03 20:32:15 +07:00
asepharyana 9322434daa feat(leptos): messages module skeleton + use_messages hook 2026-07-03 20:14:59 +07:00
asepharyana b47194cc79 docs: implementation plan for leptos messages phase 3 2026-07-03 20:10:37 +07:00
asepharyana 1b970a4c51 fix(leptos): wire format corrections from whole-branch review 2026-07-03 18:43:25 +07:00
asepharyana bf36bf55fe feat(leptos): integrate auth with API + WS auth gating 2026-07-03 18:30:41 +07:00
asepharyana 2520faad47 feat(leptos): app shell with auth gate and tab routing 2026-07-03 18:22:28 +07:00
asepharyana 5389c82f31 feat(leptos): layout components -- Header, Sidebar, TabStrip, MobileTabBar 2026-07-03 18:16:08 +07:00
asepharyana aa20d1a633 feat(leptos): API client with all endpoint functions 2026-07-03 18:09:30 +07:00
asepharyana 20ef844682 feat(leptos): WebSocket singleton with event dispatch 2026-07-03 18:07:01 +07:00
asepharyana 5832ca7cd4 feat(leptos): UI primitives — Skeleton, StatusBadge, EmptyState, Modal 2026-07-03 17:59:38 +07:00
asepharyana b9e3a255bb feat(leptos): UI primitives — Input, Select, Tabs, ScrollArea, Toast 2026-07-03 17:47:21 +07:00
asepharyana 2b514142e6 feat(leptos): UI primitives — Button, Badge, Card 2026-07-03 17:41:07 +07:00
asepharyana 65804acaca feat(leptos): css design system with component classes and animations 2026-07-03 17:36:28 +07:00
asepharyana c4c43ce912 feat(leptos): frontend crate scaffold with empty app
- frontend/ crate compiles to WASM via trunk
- empty Leptos app mounted to body via wasm_bindgen(start)
- dependencies: leptos 0.7 CSR, leptos-use, lucide-leptos, gloo-net, web-sys
- workspace cargo check passes (first time the workspace compiles end-to-end)
- trunk build produces 65KB WASM + 25KB JS glue

Deviations from brief:
- lucide-leptos: 0.5 (brief) -> 3 (only version published)
- web-sys: removed invalid features ArrayBuffer/DataView (in js-sys/wasm-bindgen)
- src/main.rs -> src/lib.rs with #[wasm_bindgen(start)] to avoid bin/lib duplicate artifact
2026-07-03 17:09:44 +07:00
asepharyana f67bc5125b fix(leptos): correct shared-types timestamps to match JSON wire format 2026-07-03 07:24:28 +07:00
asepharyana 7b746350ca chore: ignore worktrees directory 2026-07-03 06:48:30 +07:00
asepharyana 7f6063909d docs: implementation plan for leptos rewrite phase 1 & 2 2026-07-03 06:38:39 +07:00
asepharyana 4fb59cda95 docs: leptos frontend rewrite design spec 2026-07-03 06:07:12 +07:00
asepharyana 0926f235cb fix(auth): only reset activeTab on mount, don't block tab switching
Previous code continuously forced activeTab to 'messages' when not
authenticated, making dashboard and voice tabs unclickable.
Now uses useEffect once on mount to reset localStorage carryover,
then lets tab switching work normally.
2026-07-02 07:45:02 +07:00
asepharyana 948e41cec6 fix(ui): chat bubble max-w-xs broken by tailwind spacing override (4px not 320px)
tailwind.config.js overrides spacing.xs to 4px, which also overrides
max-w-xs to max-width: 4px instead of the default 20rem (320px).
Changed to explicit max-w-[280px] to bypass the corrupted token.
2026-07-02 07:08:58 +07:00
asepharyana 77812f9452 fix(auth): force activeTab to messages if not authenticated — prevent localStorage carryover
When a user visited the Live tab in a previous session, localStorage
stored activeTab: 'live'. On page reload, even with the new auth guard,
the app would try to render the Live tab and show the auth overlay.
Now if not authenticated, activeTab is always forced to 'messages'.
2026-07-02 07:06:33 +07:00
asepharyana 58de0df24b fix(ui): chat bubble text wrapping — replace break-words with overflow-wrap:anywhere
Fixes MascotChatbot messages wrapping 1 character per line.
overflow-wrap:anywhere handles long unbroken strings better
than break-words which only breaks at word boundaries.
2026-07-02 06:53:27 +07:00
asepharyana ffea9bb0ba fix(backend): only require auth for voice/media routes, rest public
Messages, analysis, mascot-chat, recordings, ui-state, and guilds
endpoints are now accessible without authentication.
Only voice (connect/disconnect/transmit) and media (queue/skip/stop/volume)
remain behind the admin password guard.
2026-07-02 06:51:57 +07:00
asepharyana 0ae1ef1987 fix(auth): only guard Live tab, messages & dashboard are public
Auth overlay only shows when accessing Voice & Media without
authentication. Messages panel and Dashboard panel remain fully
accessible without login.
2026-07-02 06:40:39 +07:00
asepharyana 112b865a5b fix(infra): bypass Cloudflare Rocket Loader — breaks ES module scripts
Cloudflare Rocket Loader transforms <script type="module"> into
type="<hash>-module", which the browser cannot parse as ES module.
The React app never mounts — blank page on every route.

Fix: Vite plugin adds data-cfasync="false" attribute to the module
script tag, telling Rocket Loader to skip transformation.

Also: remove dist/ from the commit (build artifacts excluded).
2026-07-02 06:30:26 +07:00
asepharyana d53ec74d64 fix(build): resolve Tailwind 4 @apply breaking changes
- Replace @apply im-btn in im-btn-primary/secondary/ghost
  with inline Tailwind utilities + CSS properties
- Replace @apply im-status-dot in status dot variants
  with inline properties
- Tailwind 4 cannot @apply component-level classes from within
  @layer components — only standard utility classes are valid
2026-07-02 06:17:58 +07:00
asepharyanaandworkflow agents ade5d6a7c3 fix: backend and discord-gateway improvements
- Update shared database schema
- Add shared utils
- Refactor backend middleware, auth routes, and dashboard repository
- Improve media analysis client with better error handling
- Fix searxng search URL construction
- Update URL fetcher for robustness

Co-authored-by: workflow agents
2026-07-02 06:02:07 +07:00
asepharyana 81a004d250 feat(frontend): IMPHNEN design deep integration — full 5-layer redesign
Layer 0 — Foundation:
- Dark mode palette (30+ CSS var pairs in [data-theme='dark'])
- CSS-first theme engine in styles.css (@theme + CSS vars)
- UseTheme hook with light/dark/system support + localStorage persistence
- Fixed animation keyframes (shimmer 1.5s canonical, glowPulse moved to CSS)
- Smooth theme switch transitions via .theme-transitioning class

Layer 1 — Shared UI Components:
- Badge: success/warning variants now use CSS vars (bg-success-soft text-success)
- Toast: rewritten with CSS vars, z-index fixed (40), repositioned top-right
- Skeleton: added variant prop (rounded/circular/rectangular)
- EmptyState: new component with icon + title + description + action
- Button: added tertiary variant + icon-sm size
- Card: added elevated/bordered variants
- Input: added soft variant

Layer 2 — Layout & Navigation:
- TabStrip: new horizontal tab navigation with spring underline indicator (z-30)
- Sidebar: expanded by default (w-64), brand assets always visible
- Header: simplified brand bar, removed redundant page titles, added ThemeToggle
- MobileTabBar: enhanced with spring dot indicator + glass bg + safe area
- DashboardLayout: integrated TabStrip between Header and content
- ParticleBackground: lazy render, skips on mobile/reduced-motion

Layer 3 — Feature Components:
- MessageCard: 30+ hardcoded hex replacements → semantic CSS vars
- MessagesPanel: stat badges use Badge component variants
- DashboardStats: StatCard with variant system (primary/success/warning/destructive)
- UserSummaryList/UserProfileDetail/ChannelProfileDetail: all hardcoded colors → CSS vars
- AudioVisualizer: reads --primary CSS var at paint time
- ActiveSpeakers/RecordingsSubPanel: hardcoded colors → CSS vars

Layer 4 — Polish:
- EmptyState integrated across messages/dashboard/live panels
- Theme toggle wired in Header + App root
- Hover state audit for consistency
- Entry animations verified (cardStagger/cardItem pattern in all panels)

Resolves DESIGN_TOKENS.md §13.x issues: hardcoded colors, shimmer mismatch,
glow-pulse fragmentation, z-index collisions, toast positioning.
2026-07-02 05:58:36 +07:00
asepharyana 7cfc7ccf07 docs: add implementation plan for frontend redesign
21-task plan covering 5 layers:
- Foundation (theme engine, dark mode, animations)
- Components (Badge, Toast, Skeleton, EmptyState, variants)
- Layout (TabStrip, Sidebar, Header, Mobile, DashboardLayout)
- Features (Messages, Dashboard, Live panel cleanup)
- Polish (empty states, theme toggle, animation audit)
2026-07-02 05:42:40 +07:00