refactor: formatting
This commit is contained in:
@@ -229,7 +229,7 @@ class BrandService {
|
||||
return AppBar(
|
||||
title: Text(
|
||||
title,
|
||||
style: context != null
|
||||
style: context != null
|
||||
? context.conduitTheme.headingSmall?.copyWith(
|
||||
color: context.conduitTheme.textPrimary,
|
||||
fontWeight: FontWeight.w600,
|
||||
|
||||
@@ -3,13 +3,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
part 'outbound_task.freezed.dart';
|
||||
part 'outbound_task.g.dart';
|
||||
|
||||
enum TaskStatus {
|
||||
queued,
|
||||
running,
|
||||
succeeded,
|
||||
failed,
|
||||
cancelled,
|
||||
}
|
||||
enum TaskStatus { queued, running, succeeded, failed, cancelled }
|
||||
|
||||
@freezed
|
||||
abstract class OutboundTask with _$OutboundTask {
|
||||
@@ -74,7 +68,6 @@ abstract class OutboundTask with _$OutboundTask {
|
||||
String? error,
|
||||
}) = GenerateImageTask;
|
||||
|
||||
|
||||
const factory OutboundTask.generateTitle({
|
||||
required String id,
|
||||
required String conversationId,
|
||||
@@ -106,16 +99,16 @@ abstract class OutboundTask with _$OutboundTask {
|
||||
|
||||
// Provide a unified nullable conversationId across variants
|
||||
String? get maybeConversationId => map(
|
||||
sendTextMessage: (t) => t.conversationId,
|
||||
uploadMedia: (t) => t.conversationId,
|
||||
executeToolCall: (t) => t.conversationId,
|
||||
generateImage: (t) => t.conversationId,
|
||||
generateTitle: (t) => t.conversationId,
|
||||
imageToDataUrl: (t) => t.conversationId,
|
||||
);
|
||||
sendTextMessage: (t) => t.conversationId,
|
||||
uploadMedia: (t) => t.conversationId,
|
||||
executeToolCall: (t) => t.conversationId,
|
||||
generateImage: (t) => t.conversationId,
|
||||
generateTitle: (t) => t.conversationId,
|
||||
imageToDataUrl: (t) => t.conversationId,
|
||||
);
|
||||
|
||||
String get threadKey =>
|
||||
(maybeConversationId == null || maybeConversationId!.isEmpty)
|
||||
? 'new'
|
||||
: maybeConversationId!;
|
||||
? 'new'
|
||||
: maybeConversationId!;
|
||||
}
|
||||
|
||||
@@ -751,10 +751,6 @@ class ConduitThemeExtension extends ThemeExtension<ConduitThemeExtension> {
|
||||
fontFamily: AppTypography.monospaceFontFamily,
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// Extension method to easily access Conduit theme from BuildContext
|
||||
|
||||
@@ -31,7 +31,8 @@ class _ChatActionButtonState extends ConsumerState<ChatActionButton> {
|
||||
Widget build(BuildContext context) {
|
||||
final theme = context.conduitTheme;
|
||||
final hapticEnabled = ref.read(hapticEnabledProvider);
|
||||
final radius = widget.borderRadius ?? BorderRadius.circular(AppBorderRadius.lg);
|
||||
final radius =
|
||||
widget.borderRadius ?? BorderRadius.circular(AppBorderRadius.lg);
|
||||
final overlay = theme.buttonPrimary.withValues(alpha: 0.08);
|
||||
|
||||
return Tooltip(
|
||||
@@ -100,4 +101,3 @@ class _ChatActionButtonState extends ConsumerState<ChatActionButton> {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +101,8 @@ class ConduitButton extends ConsumerWidget {
|
||||
),
|
||||
child: isLoading
|
||||
? Semantics(
|
||||
label: AppLocalizations.of(context)?.loadingContent ?? 'Loading',
|
||||
label:
|
||||
AppLocalizations.of(context)?.loadingContent ?? 'Loading',
|
||||
excludeSemantics: true,
|
||||
child: SizedBox(
|
||||
width: IconSize.small,
|
||||
@@ -206,7 +207,10 @@ class ConduitInput extends StatelessWidget {
|
||||
SizedBox(height: Spacing.sm),
|
||||
],
|
||||
Semantics(
|
||||
label: semanticLabel ?? label ?? (AppLocalizations.of(context)?.inputField ?? 'Input field'),
|
||||
label:
|
||||
semanticLabel ??
|
||||
label ??
|
||||
(AppLocalizations.of(context)?.inputField ?? 'Input field'),
|
||||
textField: true,
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
@@ -784,7 +788,10 @@ class AccessibleFormField extends StatelessWidget {
|
||||
SizedBox(height: isCompact ? Spacing.xs : Spacing.sm),
|
||||
],
|
||||
Semantics(
|
||||
label: semanticLabel ?? label ?? (AppLocalizations.of(context)?.inputField ?? 'Input field'),
|
||||
label:
|
||||
semanticLabel ??
|
||||
label ??
|
||||
(AppLocalizations.of(context)?.inputField ?? 'Input field'),
|
||||
textField: true,
|
||||
child: TextFormField(
|
||||
controller: controller,
|
||||
|
||||
@@ -348,8 +348,13 @@ class LoadingStateWrapper<T> extends StatelessWidget {
|
||||
return asyncValue.when(
|
||||
data: builder,
|
||||
loading: () => showLoadingOverlay
|
||||
? ConduitLoading.overlay(message: AppLocalizations.of(context)!.loadingContent)
|
||||
: loadingWidget ?? ConduitLoading.primary(message: AppLocalizations.of(context)!.loadingContent),
|
||||
? ConduitLoading.overlay(
|
||||
message: AppLocalizations.of(context)!.loadingContent,
|
||||
)
|
||||
: loadingWidget ??
|
||||
ConduitLoading.primary(
|
||||
message: AppLocalizations.of(context)!.loadingContent,
|
||||
),
|
||||
error: (error, stackTrace) {
|
||||
if (errorBuilder != null) {
|
||||
return errorBuilder!(error, stackTrace);
|
||||
|
||||
@@ -155,7 +155,11 @@ class ConduitMarkdownConfig {
|
||||
);
|
||||
}
|
||||
|
||||
static Widget _buildBase64Image(String dataUrl, BuildContext context, ConduitThemeExtension theme) {
|
||||
static Widget _buildBase64Image(
|
||||
String dataUrl,
|
||||
BuildContext context,
|
||||
ConduitThemeExtension theme,
|
||||
) {
|
||||
try {
|
||||
// Extract base64 part from data URL
|
||||
final commaIndex = dataUrl.indexOf(',');
|
||||
|
||||
@@ -20,7 +20,8 @@ class StreamingMarkdownWidget extends StatefulWidget {
|
||||
});
|
||||
|
||||
@override
|
||||
State<StreamingMarkdownWidget> createState() => _StreamingMarkdownWidgetState();
|
||||
State<StreamingMarkdownWidget> createState() =>
|
||||
_StreamingMarkdownWidgetState();
|
||||
}
|
||||
|
||||
class _StreamingMarkdownWidgetState extends State<StreamingMarkdownWidget> {
|
||||
@@ -59,38 +60,38 @@ class _StreamingMarkdownWidgetState extends State<StreamingMarkdownWidget> {
|
||||
if (fenceCount % 2 != 0) {
|
||||
content += '\n```';
|
||||
}
|
||||
|
||||
|
||||
// Fix incomplete bold/italic markers
|
||||
final boldCount = RegExp(r'\*\*').allMatches(content).length;
|
||||
if (boldCount % 2 != 0) {
|
||||
content += '**';
|
||||
}
|
||||
|
||||
|
||||
final italicCount = RegExp(r'(?<!\*)\*(?!\*)').allMatches(content).length;
|
||||
if (italicCount % 2 != 0) {
|
||||
content += '*';
|
||||
}
|
||||
|
||||
|
||||
// Fix incomplete link brackets
|
||||
final openBrackets = '['.allMatches(content).length;
|
||||
final closeBrackets = ']'.allMatches(content).length;
|
||||
if (openBrackets > closeBrackets) {
|
||||
content += ']' * (openBrackets - closeBrackets);
|
||||
}
|
||||
|
||||
|
||||
final openParens = '('.allMatches(content).length;
|
||||
final closeParens = ')'.allMatches(content).length;
|
||||
if (openParens > closeParens) {
|
||||
content += ')' * (openParens - closeParens);
|
||||
}
|
||||
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(StreamingMarkdownWidget oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
|
||||
|
||||
// Handle stream changes
|
||||
if (widget.contentStream != oldWidget.contentStream) {
|
||||
_streamSubscription?.cancel();
|
||||
@@ -98,7 +99,7 @@ class _StreamingMarkdownWidgetState extends State<StreamingMarkdownWidget> {
|
||||
_streamSubscription = widget.contentStream!.listen(_handleChunk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Handle static content changes
|
||||
if (widget.staticContent != oldWidget.staticContent) {
|
||||
setState(() {
|
||||
@@ -182,9 +183,7 @@ class MarkdownWithLoading extends StatelessWidget {
|
||||
if (isLoading && (content == null || content!.isEmpty)) {
|
||||
return Container(
|
||||
padding: padding ?? const EdgeInsets.all(16),
|
||||
child: const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
child: const Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -194,4 +193,4 @@ class MarkdownWithLoading extends StatelessWidget {
|
||||
padding: padding,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,8 +22,9 @@ class MiddleEllipsisText extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
final TextStyle effectiveStyle =
|
||||
DefaultTextStyle.of(context).style.merge(style);
|
||||
final TextStyle effectiveStyle = DefaultTextStyle.of(
|
||||
context,
|
||||
).style.merge(style);
|
||||
final TextDirection direction = Directionality.of(context);
|
||||
final double maxWidth = constraints.maxWidth;
|
||||
|
||||
@@ -74,8 +75,10 @@ class MiddleEllipsisText extends StatelessWidget {
|
||||
? ''
|
||||
: text.substring(text.length - rightCount);
|
||||
|
||||
final trialSpan =
|
||||
TextSpan(text: '$start$ellipsis$end', style: effectiveStyle);
|
||||
final trialSpan = TextSpan(
|
||||
text: '$start$ellipsis$end',
|
||||
style: effectiveStyle,
|
||||
);
|
||||
final trialPainter = TextPainter(
|
||||
text: trialSpan,
|
||||
textDirection: direction,
|
||||
@@ -116,4 +119,3 @@ class MiddleEllipsisText extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -130,7 +130,9 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
|
||||
return widget.emptyWidget ??
|
||||
ImprovedEmptyState(
|
||||
title: AppLocalizations.of(context)!.noItems,
|
||||
subtitle: widget.emptyMessage ?? AppLocalizations.of(context)!.noItemsToDisplay,
|
||||
subtitle:
|
||||
widget.emptyMessage ??
|
||||
AppLocalizations.of(context)!.noItemsToDisplay,
|
||||
icon: Icons.inbox_outlined,
|
||||
);
|
||||
}
|
||||
@@ -138,7 +140,8 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
|
||||
// Build the list
|
||||
Widget listWidget;
|
||||
|
||||
final ScrollPhysics effectivePhysics = widget.physics ??
|
||||
final ScrollPhysics effectivePhysics =
|
||||
widget.physics ??
|
||||
(widget.onRefresh != null
|
||||
? const AlwaysScrollableScrollPhysics()
|
||||
: const ClampingScrollPhysics());
|
||||
@@ -276,14 +279,16 @@ class OptimizedSliverList<T> extends ConsumerWidget {
|
||||
return SliverToBoxAdapter(
|
||||
child:
|
||||
emptyWidget ??
|
||||
Builder(builder: (context) {
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
return ImprovedEmptyState(
|
||||
title: l10n.noItems,
|
||||
subtitle: emptyMessage ?? l10n.noItemsToDisplay,
|
||||
icon: Icons.inbox_outlined,
|
||||
);
|
||||
}),
|
||||
Builder(
|
||||
builder: (context) {
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
return ImprovedEmptyState(
|
||||
title: l10n.noItems,
|
||||
subtitle: emptyMessage ?? l10n.noItemsToDisplay,
|
||||
icon: Icons.inbox_outlined,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,15 +9,18 @@ class SheetHandle extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
child: Container(
|
||||
margin: margin ?? const EdgeInsets.only(top: Spacing.sm, bottom: Spacing.md),
|
||||
margin:
|
||||
margin ??
|
||||
const EdgeInsets.only(top: Spacing.sm, bottom: Spacing.md),
|
||||
width: 40,
|
||||
height: 4,
|
||||
decoration: BoxDecoration(
|
||||
color: context.conduitTheme.textPrimary.withValues(alpha: Alpha.medium),
|
||||
color: context.conduitTheme.textPrimary.withValues(
|
||||
alpha: Alpha.medium,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(AppBorderRadius.xs),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -145,8 +145,10 @@ class ThemedDialogs {
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(AppBorderRadius.md),
|
||||
borderSide:
|
||||
BorderSide(color: theme.buttonPrimary, width: 1),
|
||||
borderSide: BorderSide(
|
||||
color: theme.buttonPrimary,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
horizontal: Spacing.md,
|
||||
@@ -155,8 +157,8 @@ class ThemedDialogs {
|
||||
),
|
||||
onSubmitted: (v) {
|
||||
final trimmed = v.trim();
|
||||
final unchanged = (initialValue != null &&
|
||||
trimmed == initialValue.trim());
|
||||
final unchanged =
|
||||
(initialValue != null && trimmed == initialValue.trim());
|
||||
if (trimmed.isEmpty || unchanged) return;
|
||||
Navigator.of(ctx).pop(trimmed);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user