buildUri static method
- required LaunchType type,
- String? value,
- Map<
String, dynamic> ? queryParameters, - CalendarEvent? calendarEvent,
Builds a Uri based on the specified type and input parameters.
This method constructs various types of URIs, including web links, phone numbers, email addresses, SMS messages, and social media links. It also supports building URIs for map searches and calendar events.
type - The category of launch (e.g., LaunchType.website, LaunchType.phone).
value - The primary data string relevant to the type (e.g., URL, phone number,
email address, social media handle, map query).
queryParameters - An optional map of additional query parameters.
For LaunchType.email and LaunchType.sms, this map can contain
'subject', 'body', etc. For LaunchType.map, it can include
additional map-specific parameters. For LaunchType.calendar,
it should contain a 'calendarEvent' key with a CalendarEvent object.
Returns a Uri object. If value is null or empty for types that require it,
or if a CalendarEvent is missing for LaunchType.calendar, an empty Uri
might be returned, which should be handled by the caller.
Implementation
static Uri buildUri({
required LaunchType type,
String? value,
Map<String, dynamic>? queryParameters,
CalendarEvent? calendarEvent,
}) {
debugPrint('UrlBuilder.buildUri: type=$type, value=$value');
switch (type) {
case LaunchType.whatsapp:
// Expects a phone number with country code (e.g., "1234567890").
// Removes non-digit characters.
final cleanPhone = value?.replaceAll(RegExp(r'\D'), '') ?? '';
final baseUri = Uri.parse('https://wa.me/$cleanPhone');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.phone:
// Expects a phone number (e.g., "123-456-7890").
// Removes spaces.
final cleanPhone = value?.replaceAll(RegExp(r'\s+'), '') ?? '';
return Uri(scheme: 'tel', path: cleanPhone);
case LaunchType.email:
// Expects an email address in [value].
// `queryParameters` can include 'subject' and 'body'.
return Uri(
scheme: 'mailto',
path: value ?? '',
query: _buildQuery(queryParameters),
);
case LaunchType.sms:
// Expects a phone number in [value].
// `queryParameters` can include 'body'.
return Uri(
scheme: 'sms',
path: value ?? '',
query: _buildQuery(queryParameters),
);
case LaunchType.website:
// Expects a URL in [value]. Automatically prepends 'https://' if missing.
if (value == null || value.isEmpty) return Uri();
var url = value;
if (!url.startsWith('http://') && !url.startsWith('https://')) {
url = 'https://$url';
}
final baseUri = Uri.parse(url);
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.map:
// Expects a map query (e.g., "Eiffel Tower" or "34.0522,-118.2437") in [value].
// `queryParameters` can include additional map-specific parameters.
return buildMapUri(value, queryParameters: queryParameters);
case LaunchType.custom:
// Expects a full custom URI string in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.instagram:
// Expects a full Instagram URI in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.tiktok:
// Expects a full TikTok URI in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.linkedin:
// Expects a full LinkedIn URI in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.facebook:
// Expects a full Facebook URI in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.github:
// Expects a full GitHub URI in [value].
final baseUri = Uri.parse(value ?? '');
return _addQueryParameters(baseUri, queryParameters);
case LaunchType.calendar:
// Expects a [CalendarEvent] object directly.
// If calendarEvent is null, an empty Uri is returned.
return buildCalendarUri(calendarEvent);
case LaunchType.share:
// Share functionality is typically handled by platform-specific share sheets,
// not a direct URI launch. Returns an empty Uri.
return Uri();
}
}