80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:island/models/thought.dart';
 | 
						|
import 'package:island/widgets/content/markdown.dart';
 | 
						|
import 'package:island/widgets/thought/thought_proposal.dart';
 | 
						|
 | 
						|
class ThoughtContent extends StatelessWidget {
 | 
						|
  const ThoughtContent({
 | 
						|
    super.key,
 | 
						|
    required this.isStreaming,
 | 
						|
    required this.streamingText,
 | 
						|
    this.thought,
 | 
						|
  });
 | 
						|
 | 
						|
  final bool isStreaming;
 | 
						|
  final String streamingText;
 | 
						|
  final SnThinkingThought? thought;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    if (isStreaming) {
 | 
						|
      // Streaming text with spinner
 | 
						|
      if (streamingText.isNotEmpty) {
 | 
						|
        return Row(
 | 
						|
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
          children: [
 | 
						|
            Expanded(
 | 
						|
              child: MarkdownTextContent(
 | 
						|
                isSelectable: true,
 | 
						|
                content: streamingText,
 | 
						|
                extraBlockSyntaxList: [ProposalBlockSyntax()],
 | 
						|
                textStyle: Theme.of(context).textTheme.bodyMedium,
 | 
						|
                extraGenerators: [
 | 
						|
                  ProposalGenerator(
 | 
						|
                    backgroundColor:
 | 
						|
                        Theme.of(context).colorScheme.secondaryContainer,
 | 
						|
                    foregroundColor:
 | 
						|
                        Theme.of(context).colorScheme.onSecondaryContainer,
 | 
						|
                    borderColor: Theme.of(context).colorScheme.outline,
 | 
						|
                  ),
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
            const SizedBox(width: 8),
 | 
						|
            SizedBox(
 | 
						|
              width: 16,
 | 
						|
              height: 16,
 | 
						|
              child: CircularProgressIndicator(
 | 
						|
                strokeWidth: 2,
 | 
						|
                valueColor: AlwaysStoppedAnimation<Color>(
 | 
						|
                  Theme.of(context).colorScheme.primary,
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ],
 | 
						|
        );
 | 
						|
      }
 | 
						|
      return const SizedBox.shrink();
 | 
						|
    } else {
 | 
						|
      // Regular thought content
 | 
						|
      if (thought!.content != null && thought!.content!.isNotEmpty) {
 | 
						|
        return MarkdownTextContent(
 | 
						|
          isSelectable: true,
 | 
						|
          content: thought!.content!,
 | 
						|
          extraBlockSyntaxList: [ProposalBlockSyntax()],
 | 
						|
          textStyle: Theme.of(context).textTheme.bodyMedium,
 | 
						|
          extraGenerators: [
 | 
						|
            ProposalGenerator(
 | 
						|
              backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
 | 
						|
              foregroundColor:
 | 
						|
                  Theme.of(context).colorScheme.onSecondaryContainer,
 | 
						|
              borderColor: Theme.of(context).colorScheme.outline,
 | 
						|
            ),
 | 
						|
          ],
 | 
						|
        );
 | 
						|
      }
 | 
						|
      return const SizedBox.shrink();
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |