Common flows
Once the SDK is set up, the most common work is presenting feedback, the roadmap, and updates from the right places in your app.
Show feedback
Use showFeedback() to open the default feedback experience:
UserJot.showFeedback()Pass a board's slug to open that board directly:
UserJot.showFeedback(board: "features")Show roadmap
UserJot.showRoadmap()Show updates
UserJot.showUpdates()Presentation styles on iOS
On iOS, UserJot surfaces are presented as native sheets.
The SDK currently supports multiple presentation styles:
UserJot.showFeedback() // default
UserJot.showFeedback(presentationStyle: .sheet) // full-height sheet
UserJot.showFeedback(presentationStyle: .mediumSheet) // medium-height sheetChoose the style that fits the surrounding app flow. For example, a medium sheet can work well for lightweight feedback entry, while the full-height sheet gives the content more room.
SwiftUI flow
For SwiftUI apps on iOS, the cleanest pattern is usually a state-driven modifier:
import SwiftUI
import UserJot
struct ContentView: View {
@State private var showingFeedback = false
var body: some View {
Button("Send Feedback") {
showingFeedback = true
}
.userJotFeedback(isPresented: $showingFeedback)
}
}Roadmap and updates have no SwiftUI modifier. Call showRoadmap() or showUpdates() from a button action instead.
Common product pattern
A typical settings or help screen might expose both:
struct SettingsView: View {
@State private var showingFeedback = false
var body: some View {
List {
Button("Send Feedback") {
showingFeedback = true
}
Button("View Roadmap") {
UserJot.showRoadmap()
}
}
.userJotFeedback(isPresented: $showingFeedback)
}
}Use your own presentation container
If you do not want the SDK to control presentation, you can ask it for the underlying URLs and load them in your own WebView or app container. The URL methods are async because they wait for the SDK to load your board's address, and they return nil if the board is unavailable:
let feedbackURL = await UserJot.feedbackURL()
let roadmapURL = await UserJot.roadmapURL()
let updatesURL = await UserJot.updatesURL()That is the better fit when:
your app already has a custom WebView shell
you need tighter control over navigation or chrome
you want UserJot inside an existing in-app presentation system
Choosing the right approach
Use
showFeedback,showRoadmap, andshowUpdatesfor the fastest path.Use
.userJotFeedbackwhen feedback presentation should be state-driven.Use the URL methods when you need full control over presentation.