Skip to main content
Version: 0.4

Feedback UI

Fedo ships two UI entry points on each platform:

Android (Compose)iOS (SwiftUI)
Full feedback board (list, details, editor)FedoFeedbackScreen()FedoFeedbackView()
Submission-only sheetFedoCreateFeedbackSheet().presentFedoCreateFeedback(isPresented:)

Signatureโ€‹

@Composable
fun FedoFeedbackScreen(
modifier: Modifier = Modifier,
onDismiss: () -> Unit,
)
ParameterTypeDescription
modifierModifierCompose modifier for sizing/padding
onDismiss() -> UnitCalled when user navigates back from the root screen

Screensโ€‹

The board manages its own internal navigation with three screens (identical on both platforms):

1. Feedback Listโ€‹

  • Shows feedback items in a vertical list with pull-to-refresh
  • Status filter: All, In review, Planned, In progress, Done (Shipped on iOS), Closed (tabs on Android; a toolbar menu with a count per status on iOS)
  • FAB to create new feedback
  • Vote buttons on each item
Fedo feedback board on Android: feature request list with vote counts and status filter tabs

Android

Fedo feedback board on iOS: feature request list with vote counts and an All ยท 63 status filter menu in the toolbar

iOS

The board follows each platform's own conventions, so Android and iOS look different by design.

2. Feedback Detailsโ€‹

  • Full feedback description
  • Comments section
  • Vote on the feedback
  • Edit/delete own feedback (when status allows)
Fedo feedback details on Android: status badge, title, description, author and date, votes button, comments list with a You badge, and an Add a comment field

Android

3. Feedback Editorโ€‹

  • Create new feedback (title + description)
  • Edit existing feedback (pre-populated fields)
  • Validation before submit
  • Asks before discarding unsaved changes
Fedo feedback editor on Android in edit mode: close button, Update button, title field with 21/200 counter, optional details field with 0/5000 counter, and a Posts go to the team for review note

Android

Back navigation is automatic. On Android:

  • Editor โ†’ Details / List
  • Details โ†’ List
  • List โ†’ onDismiss fires

The onDismiss lambda is only called when the user presses back on the root list screen. Your app handles this by popping its own navigation stack.

On iOS there is no onDismiss: FedoFeedbackView pushes onto your NavigationStack, so the system back button pops it for you.

State handlingโ€‹

The screen handles loading, error, and empty states internally. No extra UI work needed.

If the SDK has not been initialized, FedoFeedbackScreen() renders a full-screen "Fedo not initialized" placeholder in place of the board. On iOS, FedoFeedbackView() shows a "Feedback isn't available right now" placeholder and logs an error to OSLog. Neither crashes.


Feedback Sheetโ€‹

The submission sheet is built per platform. On Android, FedoCreateFeedbackSheet() renders a self-contained creation form (title + details fields) as a ModalBottomSheet, with its own submit state and validation - no navigation setup or FedoFeedbackScreen() host required. On iOS, the equivalent is the .presentFedoCreateFeedback(isPresented:) view modifier, which presents the same sheet without requiring a NavigationStack or FedoFeedbackView host. Use it when you want a lightweight "suggest a feature" entry point (e.g. from a menu or FAB) instead of the full feedback flow.

Signatureโ€‹

@Composable
fun FedoCreateFeedbackSheet(
onDismiss: () -> Unit,
modifier: Modifier = Modifier,
)
ParameterTypeDescription
onDismiss() -> UnitCalled when the sheet is dismissed by the user (swipe/scrim/close button) or automatically after a successful submit
modifierModifierCompose modifier applied to the ModalBottomSheet container

There's no visible param - toggle composition yourself:

@Composable
fun MyScreen() {
var showFeedbackSheet by remember { mutableStateOf(false) }

Button(onClick = { showFeedbackSheet = true }) {
Text("Suggest a feature")
}

if (showFeedbackSheet) {
FedoCreateFeedbackSheet(
onDismiss = { showFeedbackSheet = false }
)
}
}

On success, the form is replaced with a brief thank-you message before the sheet auto-dismisses, which fires onDismiss.

info

If Fedo.initialize has not been called, FedoCreateFeedbackSheet() shows the same "Fedo not initialized" error inside the sheet, while FedoFeedbackScreen() shows it full-screen. On iOS, the sheet shows the same "Feedback isn't available right now" placeholder as FedoFeedbackView(). On both platforms, calls to user-management methods (setUserID, setUserEmail, etc.) are silent no-ops โ€” they do not throw.

Fedo create-feedback bottom sheet on Android: submission form with title and details fields

Android