Skip to content

feat: integrate meeting bot frontend#70

Open
Rishavraaj wants to merge 14 commits intomainfrom
feat/meeting-frontend-integration
Open

feat: integrate meeting bot frontend#70
Rishavraaj wants to merge 14 commits intomainfrom
feat/meeting-frontend-integration

Conversation

@Rishavraaj
Copy link
Copy Markdown
Contributor

Summary

  • Connected all meeting UI components (previously using hardcoded dummy
    data) to the real backend API
  • Created a typed meetingsApi client and wired up React Query hooks for
    data fetching and mutations
  • Fixed two backend bugs blocking meeting creation

Changes

Frontend

  • src/lib/api/meetings.ts — new API client with full TypeScript types
    (Meeting, MeetingActionItem, MeetingSummary, TranscriptData) and
    methods: getMeetings, getMeeting, createMeeting, deleteMeeting,
    endMeeting, updateActionItem
  • meeting-list.tsx — replaced hardcoded array with useQuery; delete
    wired to useMutation with cache invalidation; empty state now shows "Add
    to a meeting" CTA
  • meeting-detail.tsx — replaced dummy object with useQuery; polls
    every 5s during IN_PROGRESS/PROCESSING; End Meeting button calls POST /meetings/:id/end; loading and not-found states added
  • add-meeting.tsx — form submission wired to useMutation; redirects
    to detail page on success; removed unused projectId field
  • meetings/page.tsx + meeting/[id]/page.tsx — added
    prefetchQuery for SSR hydration

Backend

  • meeting.controller.ts — moved ZodPipe from @UsePipes
    (method-level) to @Body() (parameter-level) on create and
    addTranscriptChunk; method-level pipes validate all params including
    @OrgId() organizationId: number, causing every create request to fail
    with "expected object, received number"
  • meeting.dto.tsscheduledAt now uses z.string().datetime({ offset: true }) to accept ISO 8601 strings with timezone offset (e.g.
    +05:30)
  • meeting.service.tsfindOne now constructs a public S3 URL
    (recordingUrl) from the stored key and returns transcriptData (parsed
    transcript array) alongside chatMessages

Test Plan

  • /meetings — list loads from DB; empty state shows CTA button
  • Add meeting form — submit with a Google Meet URL → POST /meetings
    succeeds, redirects to detail page
  • Meeting detail — status badge, recording, transcript, chat, summary,
    action items tabs all render from real API data
  • End Meeting button visible on IN_PROGRESS meetings, sends signal to
    bot
  • Delete meeting from list — removed and list refreshes

@Rishavraaj Rishavraaj changed the base branch from main to feat/add-meeting-bot March 30, 2026 06:24
@Rishavraaj Rishavraaj force-pushed the feat/add-meeting-bot branch from 1f26552 to 390927a Compare March 30, 2026 06:41
@Rishavraaj Rishavraaj force-pushed the feat/meeting-frontend-integration branch 2 times, most recently from 32eb12e to 29819b6 Compare March 30, 2026 10:35
Base automatically changed from feat/add-meeting-bot to main April 2, 2026 12:06
Rishavraaj and others added 2 commits April 6, 2026 10:43
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Create meetingsApi client with full CRUD + typed interfaces
- Replace dummy data in meeting-list, meeting-detail, add-meeting with real React Query hooks
- Add SSR prefetch for meetings list and detail pages
- Wire add-meeting form to POST /meetings with success redirect
- Wire End Meeting button to POST /meetings/:id/end
- Poll for status updates every 5s during IN_PROGRESS/PROCESSING
- Add empty state with CTA button in meeting list
- Fix backend: move ZodPipe from method-level to @Body() to avoid validating @orgid() param
- Fix backend: allow ISO 8601 datetime with timezone offset in scheduledAt
- Fix backend: return recordingUrl (presigned S3 URL) and transcriptData from findOne
- Fix frontend: use .toISOString() for scheduledAt to ensure Z-suffix format

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Rishavraaj Rishavraaj force-pushed the feat/meeting-frontend-integration branch from 29819b6 to 814f564 Compare April 6, 2026 05:13
Rishavraaj and others added 12 commits April 6, 2026 11:05
- Forward raw cookie header from browser request instead of using next/headers
- Replace custom list UI and inline dialog with BaseTable and ConfirmDialog
- Move filtering/sorting to useMemo; define columns with tanstack ColumnDef

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add projectName field to Meeting interface
- Display project name in meeting detail sidebar
- Add project dropdown to add-meeting form
- Replace BaseTable with custom list UI in meeting-list
- Fix async handleTabChange and summary override logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r e2e

- Add `group` class back to <li> so waitForMeetingsToLoad selector works
- Use exact heading match in MeetingsPage to avoid strict mode violation
  caused by 'No Meetings Found' h3 also matching /meetings/i

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add meeting ID=1 ("Weekly Product Sync"), summary, and two action
  items to the e2e seed so meeting list and delete-dialog tests resolve
- Override MeetingDetailPage.goto() to intercept the meeting API response
  and inject transcript data, since transcripts are fetched from an
  external URL by the backend and not accessible in the e2e environment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- meetings.spec.ts: expect "Weekly Product Sync" heading (matches DB name)
- seed.ts: point meeting transcript to /api/fixtures/transcript so NestJS
  fetches it during SSR without needing external storage
- api/fixtures/transcript/route.ts: new Next.js route serving test
  transcript JSON (returns 404 in production)
- meeting-detail.tsx: implement handleAddTask with local optimistic state
  so "can add a task" test sees the new item without a backend endpoint
- MeetingDetailPage.ts: remove dead browser-side route mock (data is
  SSR-prefetched, so the mock was never triggered)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- contact-activities: wait for activity item with comment text to be
  fully rendered (MarkdownContent async) before calling .all()
- deals: reset stage to "prospecting" in seed upsert so stage cell
  update test passes on repeated runs
- meetings: use google meet URL in add-meeting validation test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- deals stage: read current value first, always select a different one
  so the update always fires regardless of prior DB state
- companies add contact: use direct link locator instead of fragile
  heading-relative section traversal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- deals stage: scope post-reload assertion to first row's cell to avoid
  strict mode violation when multiple deals share the same stage label
- company-contact-activity: remove scrollIntoView on Activity heading
  (not needed and times out when heading isn't immediately found)
- task-activities/task-activity-events: capture task ID from POST
  response instead of searching the paginated task list, which fails
  when too many tasks exist from prior test runs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- replace custom <ul>/<li> list with BaseTable (proper <table> layout)
- columns: Name, Platform, Date, Status, Actions (dropdown)
- empty state: + button via emptyStateConfig.action
- when meetings exist: + row at bottom of table (showAddRow)
- clicking + shows inline form (name + url) with full validation
  (same zod schema as AddMeeting) — no page navigation required
- cancel collapses the inline form, success invalidates query
- update e2e MeetingsPage POM and spec to match new inline behavior

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Maintains consistency with contacts, deals, tasks, and companies
which don't use ul/li in their list components.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…acts/deals

- Add MEETING_TABLE_METADATA with name/platform/scheduledAt/status columns
- Add GET /tables/meetings backend endpoint with PrismaService query
- Add getTableViewMeetings API method and query option on frontend
- Rewrite MeetingList to use createColumnsFromMetadata + BaseTable (same pattern as ContactsList/DealsList)
- Keep inline add form and dropdown delete action column
- Update unit tests for new table-view data format
- Remove sort select (not supported in table-view pattern) from e2e tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant