Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added examples/travel_app_hardcoded/assets/result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@

#include "generated_plugin_registrant.h"

#include <url_launcher_linux/url_launcher_plugin.h>

void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#

list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_linux
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import Foundation
import firebase_app_check
import firebase_auth
import firebase_core
import url_launcher_macos

func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FLTFirebaseAppCheckPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAppCheckPlugin"))
FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
1 change: 1 addition & 0 deletions examples/travel_app_hardcoded/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ flutter:
assets:
- assets/explore/
- assets/agent_icon.png
- assets/result.png
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@

#include <firebase_auth/firebase_auth_plugin_c_api.h>
#include <firebase_core/firebase_core_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>

void RegisterPlugins(flutter::PluginRegistry* registry) {
FirebaseAuthPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi"));
FirebaseCorePluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
firebase_auth
firebase_core
url_launcher_windows
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
Expand Down
4 changes: 4 additions & 0 deletions pkgs/flutter_genui/lib/src/to_merge/agent/agent.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter/widgets.dart';

import '../catalog/messages/elicitation.dart';
import '../catalog/messages/invitation.dart';
import '../catalog/messages/result.dart';
import '../catalog/shared/genui_widget.dart';
import '../model/controller.dart';
import '../model/input.dart';
Expand Down Expand Up @@ -54,6 +55,9 @@ class GenUiAgent {
case ChatBoxInput():
data = fakeElicitationData;
builder = (_) => Elicitation(fakeElicitationData, controller);
case FilterInput():
data = fakeResultData;
builder = (_) => Result(fakeResultData, controller);
default:
throw UnimplementedError(
'The agent does not support input of type ${input.runtimeType}',
Expand Down
10 changes: 10 additions & 0 deletions pkgs/flutter_genui/lib/src/to_merge/agent/fake_output.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import '../catalog/elements/filter.dart';
import '../catalog/elements/text_intro.dart';
import '../catalog/messages/elicitation.dart';
import '../catalog/messages/invitation.dart';
import '../catalog/messages/result.dart';

final fakeInvitationData = InvitationData(
textIntroData: TextIntroData(
Expand Down Expand Up @@ -48,3 +49,12 @@ final fakeElicitationData = ElicitationData(
FilterItemData(label: 'Medium activity', icon: Icons.run_circle_sharp),
], submitLabel: 'Generate'),
);

final fakeResultData = ResultData(
textIntroData: TextIntroData(
h2: 'Zermatt adventure',
intro: '3 days - 3 people',
),
imageAssetUrl: 'assets/result.png',
linkUrl: 'https://www.zermatt.ch/en',
);
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'package:flutter/material.dart';

import '../../model/input.dart';
import '../../model/simple_items.dart';

class Filter extends StatefulWidget {
const Filter(this.data, {super.key});
const Filter(this.data, this.onInput, {super.key});

final FilterData data;
final UserInputCallback onInput;

@override
State<Filter> createState() => _FilterState();
Expand All @@ -29,7 +31,7 @@ class _FilterState extends State<Filter> {
),
const SizedBox(height: 16.0),
ElevatedButton(
onPressed: () {},
onPressed: () => widget.onInput(FilterInput()),
child: Text(widget.data.submitLabel),
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.primary,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ class Elicitation extends StatefulWidget {
}

class _ElicitationState extends State<Elicitation> {
final ValueNotifier<UserInput?> _input = ValueNotifier(null);

@override
Widget build(BuildContext context) {
return Column(
Expand All @@ -29,16 +27,16 @@ class _ElicitationState extends State<Elicitation> {
const SizedBox(height: 8.0),
TextIntro(widget.data.textIntroData),
const SizedBox(height: 16.0),
Filter(widget.data.filterData),
Filter(widget.data.filterData, _onInput),

const SizedBox(height: 16.0),
GenUiWidgetInternal(widget.controller),
],
);
}

void onInput(UserInput input) {
_input.value = input;
void _onInput(UserInput input) {
widget.controller.state.input.complete(input);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:async';

import 'package:flutter/material.dart';

import '../../model/controller.dart';
Expand All @@ -21,7 +19,7 @@ class Invitation extends StatefulWidget {
}

class _InvitationState extends State<Invitation> {
final _input = Completer<Input>();
// final _input = Completer<Input>();

@override
Widget build(BuildContext context) {
Expand All @@ -33,16 +31,16 @@ class _InvitationState extends State<Invitation> {
TextIntro(widget.data.textIntroData),
const SizedBox(height: 16.0),
Text(widget.data.exploreTitle, style: GenUiTextStyles.h2(context)),
Carousel(CarouselData(items: widget.data.exploreItems), onInput),
Carousel(CarouselData(items: widget.data.exploreItems), _onInput),
const SizedBox(height: 16.0),

GenUiWidgetInternal(widget.genUi),
],
);
}

void onInput(UserInput input) {
_input.complete(input);
void _onInput(UserInput input) {
// _input.complete(input);
}
}

Expand Down
75 changes: 75 additions & 0 deletions pkgs/flutter_genui/lib/src/to_merge/catalog/messages/result.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:url_launcher/link.dart';

import '../../model/controller.dart';
import '../../model/simple_items.dart';
import '../elements/text_intro.dart';
import '../shared/text_styles.dart';

class Result extends StatefulWidget {
final ResultData data;
final GenUiController controller;

const Result(this.data, this.controller, {super.key});

@override
State<Result> createState() => _ResultState();
}

class _ResultState extends State<Result> {
@override
Widget build(BuildContext context) {
final uri = Uri.parse(widget.data.imageAssetUrl);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
widget.controller.icon(width: 40, height: 40),
const SizedBox(height: 18.0),
Row(
children: [
Image.asset(widget.data.imageAssetUrl, height: 100),
const SizedBox(width: 8.0),
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
TextIntro(widget.data.textIntroData),
const SizedBox(height: 8.0),
Link(
uri: uri,
builder: (BuildContext context,
Future<void> Function()? followLink) {
return TextButton(
style: TextButton.styleFrom(
padding: const EdgeInsets.all(0),
minimumSize: const Size(0, 0),
),
onPressed: () async {
// TODO (polina-c): figure out why it does not
// open on macOS
await followLink!();
},
child: Text(
'View',
style: GenUiTextStyles.link(context),
),
);
},
),
const SizedBox(height: 16.0),
]),
],
),
],
);
}
}

class ResultData extends WidgetData {
final TextIntroData textIntroData;
final String imageAssetUrl;
final String linkUrl;

ResultData({
required this.textIntroData,
required this.imageAssetUrl,
required this.linkUrl,
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class _GenUiWidgetInternalState extends State<GenUiWidgetInternal> {

@override
void initState() {
print('Initializing GenUiWidget');
super.initState();
_initialize();
}
Expand Down Expand Up @@ -56,8 +55,6 @@ class _GenUiWidgetInternalState extends State<GenUiWidgetInternal> {

void _onInput(UserInput input) {
widget.controller.state.input.complete(input);
widget.controller.state.builder = Completer<WidgetBuilder>();
_initialize();
}

Widget _buildChatBox() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@ import 'package:flutter/material.dart';
abstract class GenUiTextStyles {
static TextStyle normal(BuildContext context) {
return Theme.of(context).textTheme.labelLarge!.copyWith(
fontSize: 14.0,
inherit: true,
fontWeight: FontWeight.w300,
);
fontSize: 14.0,
inherit: true,
fontWeight: FontWeight.w300,
);
}

static TextStyle link(BuildContext context) => normal(
context,
).copyWith(color: Colors.blue, inherit: true);

static TextStyle h1(BuildContext context) => normal(
context,
).copyWith(fontSize: 30.0, fontWeight: FontWeight.w700, inherit: true);
context,
).copyWith(fontSize: 30.0, fontWeight: FontWeight.w700, inherit: true);

static TextStyle h2(BuildContext context) => normal(
context,
).copyWith(fontSize: 22.0, fontWeight: FontWeight.w500, inherit: true);
context,
).copyWith(fontSize: 22.0, fontWeight: FontWeight.w500, inherit: true);
}
12 changes: 12 additions & 0 deletions pkgs/flutter_genui/lib/src/to_merge/model/input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ sealed class Input {
class InitialInput extends Input {
final String initialPrompt;
InitialInput(this.initialPrompt);

@override
Widget build(BuildContext context) {
return const SizedBox.shrink();
}
}

class UserInput extends Input {}
Expand All @@ -27,3 +32,10 @@ class ChatBoxInput extends UserInput {
);
}
}

class FilterInput extends UserInput {
@override
Widget build(BuildContext context) {
return const SizedBox.shrink();
}
}
1 change: 1 addition & 0 deletions pkgs/flutter_genui/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ dependencies:
json_rpc_2: ^4.0.0
platform: ^3.1.6
stream_channel: ^2.1.4
url_launcher: ^6.2.6

dev_dependencies:
dart_flutter_team_lints: ^3.5.2
Expand Down