Skip to content

feat(UX-1461): Voice Memo component #377

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 41 commits into
base: main
Choose a base branch
from
Open

feat(UX-1461): Voice Memo component #377

wants to merge 41 commits into from

Conversation

thelukewalton
Copy link
Collaborator

@thelukewalton thelukewalton commented Aug 13, 2025

chore: Add animation duration to ZetaProgressIndicator / Circle and added center component to ZetaProgressCircle

@thelukewalton thelukewalton requested a review from Copilot August 13, 2025 16:23
Copilot

This comment was marked as outdated.

Copy link
Contributor

github-actions bot commented Aug 13, 2025

PR Checks complete

  • ✅ - Linting / Formatting
  • ✅ - Static analysis passed
  • ✅ - All tests passed
  • ✅ - Branch is not behind
  • 📈 - Code coverage: 50.48%
    See details
    File Name%Passing?
    packages/zeta_flutter/lib/src/components/accordion/accordion.dart82.2%
    packages/zeta_flutter/lib/src/components/accordion/accordion_item.dart6.5%⛔️
    packages/zeta_flutter/lib/src/components/accordion/accordion_item_ui.dart88%
    packages/zeta_flutter/lib/src/components/avatar_rail/avatar_rail.dart53.7%⛔️
    packages/zeta_flutter/lib/src/components/avatars/avatar.dart94.6%
    packages/zeta_flutter/lib/src/components/badges/indicator.dart100%
    packages/zeta_flutter/lib/src/components/badges/label.dart100%
    packages/zeta_flutter/lib/src/components/badges/priority_pill.dart96.8%
    packages/zeta_flutter/lib/src/components/badges/status_label.dart100%
    packages/zeta_flutter/lib/src/components/badges/tag.dart98.6%
    packages/zeta_flutter/lib/src/components/bottom sheets/bottom_sheet.dart0%⛔️
    packages/zeta_flutter/lib/src/components/bottom sheets/menu_items.dart0%⛔️
    packages/zeta_flutter/lib/src/components/breadcrumb/breadcrumb.dart86.3%
    packages/zeta_flutter/lib/src/components/button_group/button_group.dart0%⛔️
    packages/zeta_flutter/lib/src/components/buttons/button.dart94.3%
    packages/zeta_flutter/lib/src/components/buttons/button_style.dart96.8%
    packages/zeta_flutter/lib/src/components/buttons/icon_button.dart51.2%⛔️
    packages/zeta_flutter/lib/src/components/buttons/input_icon_button.dart72.7%⛔️
    packages/zeta_flutter/lib/src/components/buttons/tile_button.dart69%⛔️
    packages/zeta_flutter/lib/src/components/card/card_container.dart88.5%
    packages/zeta_flutter/lib/src/components/chat_item/chat_item.dart98.2%
    packages/zeta_flutter/lib/src/components/chat_item/contact_item.dart0%⛔️
    packages/zeta_flutter/lib/src/components/checkbox/checkbox.dart99%
    packages/zeta_flutter/lib/src/components/chips/assist_chip.dart0%⛔️
    packages/zeta_flutter/lib/src/components/chips/chip.dart81.7%
    packages/zeta_flutter/lib/src/components/chips/filter_chip.dart0%⛔️
    packages/zeta_flutter/lib/src/components/chips/input_chip.dart0%⛔️
    packages/zeta_flutter/lib/src/components/chips/status_chip.dart90.9%
    packages/zeta_flutter/lib/src/components/comms_button/comms_button.dart82%
    packages/zeta_flutter/lib/src/components/date_input/date_input.dart0%⛔️
    packages/zeta_flutter/lib/src/components/dial_pad/dial_pad.dart100%
    packages/zeta_flutter/lib/src/components/dialog/dialog.dart0%⛔️
    packages/zeta_flutter/lib/src/components/dropdown/dropdown.dart35.8%⛔️
    packages/zeta_flutter/lib/src/components/empty_state/empty_state.dart100%
    packages/zeta_flutter/lib/src/components/fabs/fab.dart100%
    packages/zeta_flutter/lib/src/components/filter_selection/filter_selection.dart0%⛔️
    packages/zeta_flutter/lib/src/components/global_header/global_header.dart0%⛔️
    packages/zeta_flutter/lib/src/components/global_header/header_tab_item.dart0%⛔️
    packages/zeta_flutter/lib/src/components/icon/icon.dart100%
    packages/zeta_flutter/lib/src/components/in_page_banner/in_page_banner.dart98.6%
    packages/zeta_flutter/lib/src/components/list_item/dropdown_list_item.dart0%⛔️
    packages/zeta_flutter/lib/src/components/list_item/list_item.dart0%⛔️
    packages/zeta_flutter/lib/src/components/list_item/list_scope.dart0%⛔️
    packages/zeta_flutter/lib/src/components/list_item/notification_list_item.dart0%⛔️
    packages/zeta_flutter/lib/src/components/navigation bar/navigation_bar.dart94.5%
    packages/zeta_flutter/lib/src/components/navigation_rail/navigation_rail.dart0%⛔️
    packages/zeta_flutter/lib/src/components/pagination/pagination.dart0.6%⛔️
    packages/zeta_flutter/lib/src/components/password/password_input.dart100%
    packages/zeta_flutter/lib/src/components/phone_input/phone_input.dart0%⛔️
    packages/zeta_flutter/lib/src/components/progress/progress.dart0%⛔️
    packages/zeta_flutter/lib/src/components/progress/progress_bar.dart0%⛔️
    packages/zeta_flutter/lib/src/components/progress/progress_circle.dart0%⛔️
    packages/zeta_flutter/lib/src/components/radio/radio.dart0%⛔️
    packages/zeta_flutter/lib/src/components/range_selector/range_selector.dart84.5%
    packages/zeta_flutter/lib/src/components/screen_header_bar/screen_header_bar.dart0%⛔️
    packages/zeta_flutter/lib/src/components/search_bar/search_bar.dart98.3%
    packages/zeta_flutter/lib/src/components/segmented_control/segmented_control.dart0%⛔️
    packages/zeta_flutter/lib/src/components/select_input/select_input.dart0%⛔️
    packages/zeta_flutter/lib/src/components/slider/slider.dart82.3%
    packages/zeta_flutter/lib/src/components/snack_bar/snack_bar.dart0%⛔️
    packages/zeta_flutter/lib/src/components/stepper/stepper.dart95.1%
    packages/zeta_flutter/lib/src/components/stepper_input/stepper_input.dart71.9%⛔️
    packages/zeta_flutter/lib/src/components/switch/material_switch.dart0%⛔️
    packages/zeta_flutter/lib/src/components/switch/zeta_switch.dart0%⛔️
    packages/zeta_flutter/lib/src/components/system_banner/system_banner.dart85.4%
    packages/zeta_flutter/lib/src/components/tabs/tab.dart0%⛔️
    packages/zeta_flutter/lib/src/components/tabs/tab_bar.dart0%⛔️
    packages/zeta_flutter/lib/src/components/text_input/hint_text.dart75.9%⛔️
    packages/zeta_flutter/lib/src/components/text_input/input_label.dart0%⛔️
    packages/zeta_flutter/lib/src/components/text_input/internal_text_input.dart73.1%⛔️
    packages/zeta_flutter/lib/src/components/text_input/text_input.dart0%⛔️
    packages/zeta_flutter/lib/src/components/time_input/time_input.dart0%⛔️
    packages/zeta_flutter/lib/src/components/tooltip/tooltip.dart98.9%
    packages/zeta_flutter/lib/src/components/top_app_bar/extended_top_app_bar.dart93.9%
    packages/zeta_flutter/lib/src/components/top_app_bar/search_top_app_bar.dart86.6%
    packages/zeta_flutter/lib/src/components/top_app_bar/top_app_bar.dart98.1%
    packages/zeta_flutter/lib/src/components/voice_memo/state/playback_state.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/state/recording_state.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/state/wav_amplitude_decoder.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/state/wav_header.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/ui/audio_visualizer.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/ui/play_button.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/ui/recording_control.dart4.2%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/ui/voice_memo.dart0%⛔️
    packages/zeta_flutter/lib/src/components/voice_memo/ui/waveform.dart0%⛔️
    packages/zeta_flutter/lib/src/interfaces/audio_decoder.dart0%⛔️
    packages/zeta_flutter/lib/src/interfaces/countries.dart10%⛔️
    packages/zeta_flutter/lib/src/interfaces/form_field.dart81.4%
    packages/zeta_flutter/lib/src/interfaces/phone_number.dart0%⛔️
    packages/zeta_flutter/lib/src/utils/enums.dart100%
    packages/zeta_flutter/lib/src/utils/widget.dart100%
    packages/zeta_flutter_theme/lib/src/breakpoints.dart81.8%
    packages/zeta_flutter_theme/lib/src/color_extensions.dart86.1%
    packages/zeta_flutter_theme/lib/src/color_swatch.dart57.3%⛔️
    packages/zeta_flutter_theme/lib/src/contrast.dart50%⛔️
    packages/zeta_flutter_theme/lib/src/custom_theme.dart55.6%⛔️
    packages/zeta_flutter_theme/lib/src/generated/tokens/primitives.g.dart64.5%⛔️
    packages/zeta_flutter_theme/lib/src/generated/tokens/semantics.g.dart90.5%
    packages/zeta_flutter_theme/lib/src/rounded.dart83.3%
    packages/zeta_flutter_theme/lib/src/theme_service.dart17.9%⛔️
    packages/zeta_flutter_theme/lib/src/tokens.dart100%
    packages/zeta_flutter_theme/lib/src/typography.dart84.6%
    packages/zeta_flutter_theme/lib/src/zeta.dart97.5%
    packages/zeta_flutter_theme/lib/src/zeta_provider.dart93%
    packages/zeta_flutter_utils/lib/src/debounce.dart100%
    packages/zeta_flutter_utils/lib/src/extensions.dart79.1%⛔️
    packages/zeta_flutter_utils/lib/src/nothing.dart50%⛔️
    packages/zeta_flutter_utils/lib/src/platform/platform_is.dart0%⛔️
    packages/zeta_flutter_utils/lib/src/platform/universal_platform_vm.dart7.1%⛔️
    packages/zeta_icons/lib/src/illustrations.dart0%⛔️

Created with Flutter code quality action

Copy link
Contributor

github-actions bot commented Aug 13, 2025

Visit the preview URL for this PR (updated for commit 121d1fe):

https://zeta-flutter-main--pr-377-ux-1461-4dk6mo27.web.app

(expires Thu, 28 Aug 2025 18:35:07 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: 5ca681de0a0ad9185b252304c113355d5ee04ca6

@thelukewalton thelukewalton force-pushed the UX-1461 branch 2 times, most recently from 656f603 to 4cded56 Compare August 15, 2025 09:05
@thelukewalton thelukewalton marked this pull request as ready for review August 15, 2025 13:14
@thelukewalton thelukewalton requested a review from a team as a code owner August 15, 2025 13:14
@thelukewalton thelukewalton requested a review from Copilot August 21, 2025 06:52
Copilot

This comment was marked as outdated.

Copy link
Contributor

@DE7924 DE7924 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you play a recording for a second time. It doesn't highlight the sound wave bars.

Strange artifact:
Image

@thelukewalton thelukewalton force-pushed the main branch 4 times, most recently from 2875bd3 to f58ba58 Compare August 21, 2025 16:34
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a new Voice Memo component to the Zeta Flutter design system. The implementation includes both a recording component (ZetaVoiceMemo) and an audio visualizer component (ZetaAudioVisualizer) with comprehensive audio waveform visualization capabilities.

  • Adds complete voice recording and playback functionality with audio visualizations
  • Implements WAV audio processing for waveform generation
  • Updates progress components with animation duration support and center widget capability

Reviewed Changes

Copilot reviewed 54 out of 62 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/zeta_flutter/lib/src/components/voice_memo/ New voice memo component implementation with recording controls, audio visualization, and state management
packages/zeta_flutter/lib/src/interfaces/audio_decoder.dart Audio amplitude decoder interface for waveform generation
packages/zeta_flutter/lib/src/components/progress/progress_circle.dart Enhanced progress circle with center widget support and animation duration
packages/zeta_flutter_utils/lib/src/extensions.dart New duration formatting and list utility extensions
widgetbook/ Widgetbook integration and platform-specific audio plugin configurations
example/ Example implementation and platform audio permissions setup
Files not reviewed (1)
  • widgetbook/ios/Runner.xcworkspace/contents.xcworkspacedata: Language not supported

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

thelukewalton and others added 2 commits August 21, 2025 19:22
…m.dart

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…amplitude_decoder.dart

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@aygurs
Copy link
Contributor

aygurs commented Aug 22, 2025

'Can Record' Widgetbook prop is intermittent. The message 'Recording not allowed' flashes up but then dissapears and user is able to record even if 'Can Record' is false.

Nitpick items (Purely UI/Cosmetic & not essential):

  • During audio playback, the voice playback does not line up with the volume increases on the wave forms (so voice and waveform are slightly out of track on playback).
  • When pressing the record button whilst recording audio to stop recording, the waveform jumps back to the beginning (I assume) rather than staying in place, but this could be intended functionality.
  • The delete, restart and send icons could potentially become smaller on smaller screen sizes (for example screen size None and iPhone 13 have the same size icons).
  • During playback, waveform does not scroll with sound playback and stays static.

Copy link
Contributor

@DE7924 DE7924 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the can record prop bug

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.

3 participants