created and imported basic GUI from flutter flow

This commit is contained in:
Ashton
2024-07-05 21:10:43 -06:00
parent 4634d3ae86
commit 3c0e777fd6
160 changed files with 10178 additions and 0 deletions
@@ -0,0 +1,30 @@
import '/components/options_dialog/options_dialog_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:ui';
import 'conversation_details_overlay_widget.dart'
show ConversationDetailsOverlayWidget;
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ConversationDetailsOverlayModel
extends FlutterFlowModel<ConversationDetailsOverlayWidget> {
/// State fields for stateful widgets in this component.
// Model for OptionsDialog component.
late OptionsDialogModel optionsDialogModel;
@override
void initState(BuildContext context) {
optionsDialogModel = createModel(context, () => OptionsDialogModel());
}
@override
void dispose() {
optionsDialogModel.dispose();
}
}
@@ -0,0 +1,225 @@
import '/components/options_dialog/options_dialog_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:ui';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'conversation_details_overlay_model.dart';
export 'conversation_details_overlay_model.dart';
class ConversationDetailsOverlayWidget extends StatefulWidget {
const ConversationDetailsOverlayWidget({super.key});
@override
State<ConversationDetailsOverlayWidget> createState() =>
_ConversationDetailsOverlayWidgetState();
}
class _ConversationDetailsOverlayWidgetState
extends State<ConversationDetailsOverlayWidget> {
late ConversationDetailsOverlayModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => ConversationDetailsOverlayModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.circular(0),
child: BackdropFilter(
filter: ImageFilter.blur(
sigmaX: 4,
sigmaY: 4,
),
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(),
child: Align(
alignment: AlignmentDirectional(0, -1),
child: Container(
width: double.infinity,
height: double.infinity,
constraints: BoxConstraints(
maxWidth: 700,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0),
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 70, 0, 0),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 0, 0, 0),
child: Text(
'Chat Details',
style: FlutterFlowTheme.of(context)
.headlineSmall
.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 16, 0),
child: FlutterFlowIconButton(
borderColor: FlutterFlowTheme.of(context).alternate,
borderRadius: 12,
borderWidth: 1,
buttonSize: 40,
fillColor: FlutterFlowTheme.of(context).accent4,
icon: Icon(
Icons.close_rounded,
color: FlutterFlowTheme.of(context).primaryText,
size: 24,
),
onPressed: () async {
Navigator.pop(context);
},
),
),
],
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 4, 0, 4),
child: RichText(
textScaler: MediaQuery.of(context).textScaler,
text: TextSpan(
children: [
TextSpan(
text: 'Group Chat ID: ',
style: TextStyle(),
),
TextSpan(
text: 'Hello World ',
style: TextStyle(
color: FlutterFlowTheme.of(context).primary,
fontWeight: FontWeight.bold,
),
)
],
style:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
),
Expanded(
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Divider(
thickness: 1,
color: FlutterFlowTheme.of(context).tertiary,
),
],
),
),
),
Align(
alignment: AlignmentDirectional(0, -1),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 0, 16, 0),
child: ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Container(
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: FlutterFlowTheme.of(context).alternate,
),
),
child: wrapWithModel(
model: _model.optionsDialogModel,
updateCallback: () => setState(() {}),
updateOnChange: true,
child: OptionsDialogWidget(),
),
),
),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 16, 16, 44),
child: FFButtonWidget(
onPressed: () async {
Navigator.pop(context);
},
text: 'Close',
options: FFButtonOptions(
width: double.infinity,
height: 52,
padding: EdgeInsetsDirectional.fromSTEB(44, 0, 44, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color:
FlutterFlowTheme.of(context).secondaryBackground,
textStyle:
FlutterFlowTheme.of(context).titleLarge.override(
fontFamily: 'Outfit',
fontSize: 18,
letterSpacing: 0,
),
elevation: 0,
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
borderRadius: BorderRadius.circular(12),
hoverColor: FlutterFlowTheme.of(context).alternate,
hoverBorderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
hoverTextColor:
FlutterFlowTheme.of(context).primaryText,
hoverElevation: 3,
),
),
),
],
),
),
),
),
),
),
);
}
}
@@ -0,0 +1,15 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'conversation_options_widget.dart' show ConversationOptionsWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ConversationOptionsModel
extends FlutterFlowModel<ConversationOptionsWidget> {
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
@@ -0,0 +1,254 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'conversation_options_model.dart';
export 'conversation_options_model.dart';
class ConversationOptionsWidget extends StatefulWidget {
const ConversationOptionsWidget({super.key});
@override
State<ConversationOptionsWidget> createState() =>
_ConversationOptionsWidgetState();
}
class _ConversationOptionsWidgetState extends State<ConversationOptionsWidget> {
late ConversationOptionsModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => ConversationOptionsModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground,
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 12, 0, 24),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
height: 60,
decoration: BoxDecoration(),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
color: FlutterFlowTheme.of(context).primaryBackground,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
child: Padding(
padding: EdgeInsets.all(8),
child: Icon(
Icons.share_rounded,
color: FlutterFlowTheme.of(context).secondaryText,
size: 20,
),
),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Share',
style: FlutterFlowTheme.of(context)
.labelLarge
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
],
),
),
),
],
),
),
),
Container(
width: double.infinity,
height: 60,
decoration: BoxDecoration(),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
color: FlutterFlowTheme.of(context).primaryBackground,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
child: Padding(
padding: EdgeInsets.all(8),
child: Icon(
Icons.insert_link,
color: FlutterFlowTheme.of(context).secondaryText,
size: 20,
),
),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Get Link',
style: FlutterFlowTheme.of(context)
.labelLarge
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
],
),
),
),
],
),
),
),
Container(
width: double.infinity,
height: 60,
decoration: BoxDecoration(),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
color: FlutterFlowTheme.of(context).primaryBackground,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
child: Padding(
padding: EdgeInsets.all(8),
child: Icon(
Icons.mode_edit,
color: FlutterFlowTheme.of(context).secondaryText,
size: 20,
),
),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Model selection',
style: FlutterFlowTheme.of(context)
.labelLarge
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
],
),
),
),
],
),
),
),
Container(
width: double.infinity,
height: 60,
decoration: BoxDecoration(),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
color: FlutterFlowTheme.of(context).primaryBackground,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
child: Padding(
padding: EdgeInsets.all(8),
child: Icon(
Icons.hide_source,
color: FlutterFlowTheme.of(context).secondaryText,
size: 20,
),
),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Private',
style: FlutterFlowTheme.of(context)
.labelLarge
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
],
),
),
),
],
),
),
),
],
),
),
);
}
}
@@ -0,0 +1,36 @@
import '/components/conversation_bubbles/conversation_bubbles_widget.dart';
import '/components/prompt_box/prompt_box_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_media_display.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_video_player.dart';
import 'conversation_thread_widget.dart' show ConversationThreadWidget;
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ConversationThreadModel
extends FlutterFlowModel<ConversationThreadWidget> {
/// State fields for stateful widgets in this component.
final formKey = GlobalKey<FormState>();
// Model for ConversationBubbles component.
late ConversationBubblesModel conversationBubblesModel;
// Model for PromptBox component.
late PromptBoxModel promptBoxModel;
@override
void initState(BuildContext context) {
conversationBubblesModel =
createModel(context, () => ConversationBubblesModel());
promptBoxModel = createModel(context, () => PromptBoxModel());
}
@override
void dispose() {
conversationBubblesModel.dispose();
promptBoxModel.dispose();
}
}
@@ -0,0 +1,191 @@
import '/components/conversation_bubbles/conversation_bubbles_widget.dart';
import '/components/prompt_box/prompt_box_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_media_display.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_video_player.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'conversation_thread_model.dart';
export 'conversation_thread_model.dart';
class ConversationThreadWidget extends StatefulWidget {
const ConversationThreadWidget({super.key});
@override
State<ConversationThreadWidget> createState() =>
_ConversationThreadWidgetState();
}
class _ConversationThreadWidgetState extends State<ConversationThreadWidget> {
late ConversationThreadModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => ConversationThreadModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground,
),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: ListView(
padding: EdgeInsets.fromLTRB(
0,
12,
0,
24,
),
reverse: true,
scrollDirection: Axis.vertical,
children: [
Container(
decoration: BoxDecoration(),
),
Container(
height: MediaQuery.sizeOf(context).height * 1,
constraints: BoxConstraints(
minHeight: MediaQuery.sizeOf(context).height * 1,
),
decoration: BoxDecoration(),
child: wrapWithModel(
model: _model.conversationBubblesModel,
updateCallback: () => setState(() {}),
child: ConversationBubblesWidget(),
),
),
],
),
),
Container(
width: double.infinity,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground,
boxShadow: [
BoxShadow(
blurRadius: 3,
color: Color(0x33000000),
offset: Offset(
0,
-2,
),
)
],
),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 12, 0, 0),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
FlutterFlowMediaDisplay(
path: '',
imageBuilder: (path) => ClipRRect(
borderRadius: BorderRadius.circular(8),
child: CachedNetworkImage(
fadeInDuration: Duration(milliseconds: 500),
fadeOutDuration:
Duration(milliseconds: 500),
imageUrl: path,
width: 120,
height: 100,
fit: BoxFit.cover,
),
),
videoPlayerBuilder: (path) =>
FlutterFlowVideoPlayer(
path: path,
width: 300,
autoPlay: false,
looping: true,
showControls: true,
allowFullScreen: true,
allowPlaybackSpeedMenu: false,
),
),
Align(
alignment: AlignmentDirectional(-1, -1),
child: FlutterFlowIconButton(
borderColor:
FlutterFlowTheme.of(context).error,
borderRadius: 20,
borderWidth: 2,
buttonSize: 40,
fillColor: FlutterFlowTheme.of(context)
.primaryBackground,
icon: Icon(
Icons.delete_outline_rounded,
color: FlutterFlowTheme.of(context).error,
size: 24,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
]
.divide(SizedBox(width: 8))
.addToStart(SizedBox(width: 16))
.addToEnd(SizedBox(width: 16)),
),
),
),
),
],
),
Form(
key: _model.formKey,
autovalidateMode: AutovalidateMode.disabled,
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 8),
child: wrapWithModel(
model: _model.promptBoxModel,
updateCallback: () => setState(() {}),
child: PromptBoxWidget(),
),
),
),
],
),
),
],
),
);
}
}
@@ -0,0 +1,19 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'model_item_widget.dart' show ModelItemWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ModelItemModel extends FlutterFlowModel<ModelItemWidget> {
/// State fields for stateful widgets in this component.
// State field(s) for iuser widget.
bool iuserHovered = false;
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
@@ -0,0 +1,122 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'model_item_model.dart';
export 'model_item_model.dart';
class ModelItemWidget extends StatefulWidget {
const ModelItemWidget({super.key});
@override
State<ModelItemWidget> createState() => _ModelItemWidgetState();
}
class _ModelItemWidgetState extends State<ModelItemWidget> {
late ModelItemModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => ModelItemModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MouseRegion(
opaque: false,
cursor: MouseCursor.defer ?? MouseCursor.defer,
child: Container(
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground,
borderRadius: BorderRadius.circular(0),
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).accent1,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: FlutterFlowTheme.of(context).primary,
width: 2,
),
),
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Text(
'A',
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context).bodyLarge.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
fontWeight: FontWeight.bold,
),
),
),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 8, 0),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Randy Peterson',
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
fontWeight: FontWeight.bold,
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0),
child: Text(
'name@domainname.com',
style:
FlutterFlowTheme.of(context).bodySmall.override(
fontFamily: 'Readex Pro',
color: FlutterFlowTheme.of(context).primary,
letterSpacing: 0,
),
),
),
],
),
),
),
],
),
),
),
onEnter: ((event) async {
setState(() => _model.iuserHovered = true);
}),
onExit: ((event) async {
setState(() => _model.iuserHovered = false);
}),
);
}
}
@@ -0,0 +1,14 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'no_chats_widget.dart' show NoChatsWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class NoChatsModel extends FlutterFlowModel<NoChatsWidget> {
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
@@ -0,0 +1,85 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'no_chats_model.dart';
export 'no_chats_model.dart';
class NoChatsWidget extends StatefulWidget {
const NoChatsWidget({
super.key,
this.icon,
String? title,
String? body,
}) : this.title = title ?? 'No Comments',
this.body = body ?? 'There are no comments associated with this post.';
final Widget? icon;
final String title;
final String body;
@override
State<NoChatsWidget> createState() => _NoChatsWidgetState();
}
class _NoChatsWidgetState extends State<NoChatsWidget> {
late NoChatsModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => NoChatsModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Align(
alignment: AlignmentDirectional(0, -1),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
widget.icon!,
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Text(
widget.title,
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context).headlineSmall.override(
fontFamily: 'Outfit',
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0,
),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 8, 16, 0),
child: Text(
widget.body,
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
],
),
);
}
}
@@ -0,0 +1,21 @@
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'options_dialog_widget.dart' show OptionsDialogWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class OptionsDialogModel extends FlutterFlowModel<OptionsDialogWidget> {
/// State fields for stateful widgets in this component.
// State field(s) for MouseRegion widget.
bool mouseRegionHovered1 = false;
// State field(s) for MouseRegion widget.
bool mouseRegionHovered2 = false;
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
@@ -0,0 +1,210 @@
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'popup_model.dart';
export 'popup_model.dart';
class PopupWidget extends StatefulWidget {
const PopupWidget({super.key});
@override
State<PopupWidget> createState() => _PopupWidgetState();
}
class _PopupWidgetState extends State<PopupWidget> {
late PopupModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => PopupModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Visibility(
visible: true,
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Container(
width: double.infinity,
constraints: BoxConstraints(
maxWidth: 570,
maxHeight: 375,
),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
blurRadius: 64,
color: Color(0xB2000000),
offset: Offset(
2,
2,
),
spreadRadius: 225,
)
],
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: Color(0xFFE0E3E7),
),
),
alignment: AlignmentDirectional(0, 0),
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Padding(
padding: EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 12, 0),
child: Text(
'Refine the components modal.',
style: FlutterFlowTheme.of(context)
.headlineMedium
.override(
fontFamily: 'Outfit',
color: Color(0xFF14181B),
fontSize: 24,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
),
),
),
FlutterFlowIconButton(
borderColor: Color(0xFFF1F4F8),
borderRadius: 30,
borderWidth: 2,
buttonSize: 44,
icon: Icon(
Icons.close_rounded,
color: Color(0xFF57636C),
size: 24,
),
onPressed: () async {
Navigator.pop(context);
},
),
],
),
Divider(
height: 24,
thickness: 2,
color: Color(0xFFF1F4F8),
),
Text(
'FlutterFlow is a visual development platform that allows you to easily create beautiful and responsive user interfaces for your mobile and web applications. With its drag-and-drop interface and pre-built components, you can quickly prototype and build your app without writing any code. \nAdditionally, FlutterFlow\'s real-time preview feature allows you to see your changes in real-time and make adjustments on the fly.',
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
color: Color(0xFF57636C),
fontSize: 14,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FFButtonWidget(
onPressed: () async {
Navigator.pop(context);
},
text: 'Cancel',
options: FFButtonOptions(
height: 40,
padding:
EdgeInsetsDirectional.fromSTEB(24, 0, 24, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: Colors.white,
textStyle:
FlutterFlowTheme.of(context).bodySmall.override(
fontFamily: 'Readex Pro',
color: Color(0xFF14181B),
fontSize: 12,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
elevation: 0,
borderSide: BorderSide(
color: Color(0xFFF1F4F8),
width: 2,
),
borderRadius: BorderRadius.circular(8),
hoverColor: Color(0xFFF1F4F8),
hoverTextColor: Color(0xFF14181B),
),
),
FFButtonWidget(
onPressed: () {
print('Button pressed ...');
},
text: 'Create Task',
options: FFButtonOptions(
width: 130,
height: 40,
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: Color(0xFF4B39EF),
textStyle: FlutterFlowTheme.of(context)
.titleSmall
.override(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 16,
letterSpacing: 0,
fontWeight: FontWeight.w500,
),
elevation: 3,
borderSide: BorderSide(
color: Colors.transparent,
width: 1,
),
borderRadius: BorderRadius.circular(8),
hoverColor: Color(0xFF2B16ED),
hoverTextColor: Colors.white,
),
),
],
),
),
],
),
),
),
),
),
);
}
}
+16
View File
@@ -0,0 +1,16 @@
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'popup_widget.dart' show PopupWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class PopupModel extends FlutterFlowModel<PopupWidget> {
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
+210
View File
@@ -0,0 +1,210 @@
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'popup_model.dart';
export 'popup_model.dart';
class PopupWidget extends StatefulWidget {
const PopupWidget({super.key});
@override
State<PopupWidget> createState() => _PopupWidgetState();
}
class _PopupWidgetState extends State<PopupWidget> {
late PopupModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => PopupModel());
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Visibility(
visible: true,
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Container(
width: double.infinity,
constraints: BoxConstraints(
maxWidth: 570,
maxHeight: 375,
),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
blurRadius: 64,
color: Color(0xB2000000),
offset: Offset(
2,
2,
),
spreadRadius: 225,
)
],
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: Color(0xFFE0E3E7),
),
),
alignment: AlignmentDirectional(0, 0),
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Padding(
padding: EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 12, 0),
child: Text(
'Refine the components modal.',
style: FlutterFlowTheme.of(context)
.headlineMedium
.override(
fontFamily: 'Outfit',
color: Color(0xFF14181B),
fontSize: 24,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
),
),
),
FlutterFlowIconButton(
borderColor: Color(0xFFF1F4F8),
borderRadius: 30,
borderWidth: 2,
buttonSize: 44,
icon: Icon(
Icons.close_rounded,
color: Color(0xFF57636C),
size: 24,
),
onPressed: () async {
Navigator.pop(context);
},
),
],
),
Divider(
height: 24,
thickness: 2,
color: Color(0xFFF1F4F8),
),
Text(
'FlutterFlow is a visual development platform that allows you to easily create beautiful and responsive user interfaces for your mobile and web applications. With its drag-and-drop interface and pre-built components, you can quickly prototype and build your app without writing any code. \nAdditionally, FlutterFlow\'s real-time preview feature allows you to see your changes in real-time and make adjustments on the fly.',
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
color: Color(0xFF57636C),
fontSize: 14,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FFButtonWidget(
onPressed: () async {
Navigator.pop(context);
},
text: 'Cancel',
options: FFButtonOptions(
height: 40,
padding:
EdgeInsetsDirectional.fromSTEB(24, 0, 24, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: Colors.white,
textStyle:
FlutterFlowTheme.of(context).bodySmall.override(
fontFamily: 'Readex Pro',
color: Color(0xFF14181B),
fontSize: 12,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
elevation: 0,
borderSide: BorderSide(
color: Color(0xFFF1F4F8),
width: 2,
),
borderRadius: BorderRadius.circular(8),
hoverColor: Color(0xFFF1F4F8),
hoverTextColor: Color(0xFF14181B),
),
),
FFButtonWidget(
onPressed: () {
print('Button pressed ...');
},
text: 'Create Task',
options: FFButtonOptions(
width: 130,
height: 40,
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: Color(0xFF4B39EF),
textStyle: FlutterFlowTheme.of(context)
.titleSmall
.override(
fontFamily: 'Readex Pro',
color: Colors.white,
fontSize: 16,
letterSpacing: 0,
fontWeight: FontWeight.w500,
),
elevation: 3,
borderSide: BorderSide(
color: Colors.transparent,
width: 1,
),
borderRadius: BorderRadius.circular(8),
hoverColor: Color(0xFF2B16ED),
hoverTextColor: Colors.white,
),
),
],
),
),
],
),
),
),
),
),
);
}
}
@@ -0,0 +1,26 @@
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'prompt_box_widget.dart' show PromptBoxWidget;
import 'package:easy_debounce/easy_debounce.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class PromptBoxModel extends FlutterFlowModel<PromptBoxWidget> {
/// State fields for stateful widgets in this component.
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode;
TextEditingController? textController;
String? Function(BuildContext, String?)? textControllerValidator;
@override
void initState(BuildContext context) {}
@override
void dispose() {
textFieldFocusNode?.dispose();
textController?.dispose();
}
}
@@ -0,0 +1,244 @@
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'package:easy_debounce/easy_debounce.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'prompt_box_model.dart';
export 'prompt_box_model.dart';
class PromptBoxWidget extends StatefulWidget {
const PromptBoxWidget({super.key});
@override
State<PromptBoxWidget> createState() => _PromptBoxWidgetState();
}
class _PromptBoxWidgetState extends State<PromptBoxWidget> {
late PromptBoxModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => PromptBoxModel());
_model.textController ??= TextEditingController();
_model.textFieldFocusNode ??= FocusNode();
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground,
borderRadius: BorderRadius.circular(10),
),
alignment: AlignmentDirectional(0, 0),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: Padding(
padding: EdgeInsets.all(14),
child: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 40,
icon: Icon(
Icons.file_upload_outlined,
color: FlutterFlowTheme.of(context).secondaryText,
size: 30,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
),
Expanded(
child: Padding(
padding: EdgeInsets.all(14),
child: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 40,
icon: Icon(
Icons.photo_outlined,
color: FlutterFlowTheme.of(context).secondaryText,
size: 30,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
),
Expanded(
child: Padding(
padding: EdgeInsets.all(14),
child: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 40,
icon: Icon(
Icons.mic_none,
color: FlutterFlowTheme.of(context).secondaryText,
size: 30,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
),
Expanded(
child: Padding(
padding: EdgeInsets.all(14),
child: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 40,
icon: Icon(
Icons.videocam_outlined,
color: FlutterFlowTheme.of(context).secondaryText,
size: 30,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
),
Expanded(
child: Padding(
padding: EdgeInsets.all(14),
child: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 40,
icon: Icon(
Icons.camera_alt_outlined,
color: FlutterFlowTheme.of(context).secondaryText,
size: 30,
),
onPressed: () {
print('IconButton pressed ...');
},
),
),
),
],
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
flex: 7,
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0),
child: TextFormField(
controller: _model.textController,
focusNode: _model.textFieldFocusNode,
onChanged: (_) => EasyDebounce.debounce(
'_model.textController',
Duration(milliseconds: 2000),
() => setState(() {}),
),
autofocus: true,
textCapitalization: TextCapitalization.none,
textInputAction: TextInputAction.go,
obscureText: false,
decoration: InputDecoration(
isDense: false,
counterStyle: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: FlutterFlowTheme.of(context).secondaryText,
letterSpacing: 0,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).secondaryText,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0x00000000),
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0x00000000),
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0x00000000),
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
filled: true,
fillColor: FlutterFlowTheme.of(context).alternate,
suffixIcon: Icon(
Icons.send,
color: FlutterFlowTheme.of(context).primary,
size: 30,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Lato',
fontSize: 14,
letterSpacing: 0,
fontWeight: FontWeight.normal,
),
textAlign: TextAlign.start,
maxLines: 5,
minLines: 1,
validator:
_model.textControllerValidator.asValidator(context),
),
),
),
],
),
],
),
),
);
}
}
+125
View File
@@ -0,0 +1,125 @@
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// TRY THIS: Try running your application with "flutter run". You'll see
// the application has a purple toolbar. Then, without quitting the app,
// try changing the seedColor in the colorScheme below to Colors.green
// and then invoke "hot reload" (save your changes or press the "hot
// reload" button in a Flutter-supported IDE, or press "r" if you used
// the command line to start the app).
//
// Notice that the counter didn't reset back to zero; the application
// state is not lost during the reload. To reset the state, use hot
// restart instead.
//
// This works for code too, not just values: Most code changes can be
// tested with just a hot reload.
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
@override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// TRY THIS: Try changing the color here to a specific color (to
// Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
// change color while the other colors stay the same.
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
//
// TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
// action in the IDE, or press "p" in the console), to see the
// wireframe for each widget.
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
@@ -0,0 +1,35 @@
import '/components/conversation_details_overlay/conversation_details_overlay_widget.dart';
import '/components/conversation_thread/conversation_thread_widget.dart';
import '/components/model_item/model_item_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'conversation_widget.dart' show ConversationWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ConversationModel extends FlutterFlowModel<ConversationWidget> {
/// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
// Model for ConversationThread component.
late ConversationThreadModel conversationThreadModel;
// Model for ModelItem component.
late ModelItemModel modelItemModel;
@override
void initState(BuildContext context) {
conversationThreadModel =
createModel(context, () => ConversationThreadModel());
modelItemModel = createModel(context, () => ModelItemModel());
}
@override
void dispose() {
unfocusNode.dispose();
conversationThreadModel.dispose();
modelItemModel.dispose();
}
}
@@ -0,0 +1,131 @@
import '/components/conversation_details_overlay/conversation_details_overlay_widget.dart';
import '/components/conversation_thread/conversation_thread_widget.dart';
import '/components/model_item/model_item_widget.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'conversation_model.dart';
export 'conversation_model.dart';
class ConversationWidget extends StatefulWidget {
const ConversationWidget({super.key});
@override
State<ConversationWidget> createState() => _ConversationWidgetState();
}
class _ConversationWidgetState extends State<ConversationWidget> {
late ConversationModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
_model = createModel(context, () => ConversationModel());
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
appBar: AppBar(
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
automaticallyImplyLeading: false,
leading: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 60,
icon: Icon(
Icons.arrow_back_rounded,
color: FlutterFlowTheme.of(context).primaryText,
size: 30,
),
onPressed: () async {
context.goNamed(
'ConversationsList',
extra: <String, dynamic>{
kTransitionInfoKey: TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.leftToRight,
duration: Duration(milliseconds: 250),
),
},
);
},
),
title: wrapWithModel(
model: _model.modelItemModel,
updateCallback: () => setState(() {}),
child: ModelItemWidget(),
),
actions: [
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 8, 16, 8),
child: FlutterFlowIconButton(
borderColor: FlutterFlowTheme.of(context).alternate,
borderRadius: 12,
borderWidth: 2,
buttonSize: 40,
fillColor: FlutterFlowTheme.of(context).primaryBackground,
icon: Icon(
Icons.more_vert,
color: FlutterFlowTheme.of(context).primaryText,
size: 24,
),
onPressed: () async {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
enableDrag: false,
context: context,
builder: (context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context)
.requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Padding(
padding: MediaQuery.viewInsetsOf(context),
child: ConversationDetailsOverlayWidget(),
),
);
},
).then((value) => safeSetState(() {}));
},
),
),
],
centerTitle: false,
elevation: 0,
),
body: SafeArea(
top: true,
child: wrapWithModel(
model: _model.conversationThreadModel,
updateCallback: () => setState(() {}),
child: ConversationThreadWidget(),
),
),
),
);
}
}
@@ -0,0 +1,22 @@
import '/components/conversation_options/conversation_options_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'conversations_list_widget.dart' show ConversationsListWidget;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ConversationsListModel extends FlutterFlowModel<ConversationsListWidget> {
/// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
@override
void initState(BuildContext context) {}
@override
void dispose() {
unfocusNode.dispose();
}
}
@@ -0,0 +1,252 @@
import '/components/conversation_options/conversation_options_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'conversations_list_model.dart';
export 'conversations_list_model.dart';
class ConversationsListWidget extends StatefulWidget {
const ConversationsListWidget({super.key});
@override
State<ConversationsListWidget> createState() =>
_ConversationsListWidgetState();
}
class _ConversationsListWidgetState extends State<ConversationsListWidget> {
late ConversationsListModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
_model = createModel(context, () => ConversationsListModel());
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
floatingActionButton: InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onLongPress: () async {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
enableDrag: false,
context: context,
builder: (context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Padding(
padding: MediaQuery.viewInsetsOf(context),
child: ConversationOptionsWidget(),
),
);
},
).then((value) => safeSetState(() {}));
context.pushNamed('Conversation');
},
child: FloatingActionButton(
onPressed: () async {
context.pushNamed('Conversation');
},
backgroundColor: FlutterFlowTheme.of(context).primary,
elevation: 8,
child: Icon(
Icons.add,
color: FlutterFlowTheme.of(context).info,
size: 24,
),
),
),
appBar: AppBar(
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
automaticallyImplyLeading: false,
title: Text(
'My Chats',
style: FlutterFlowTheme.of(context).headlineLarge.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
),
actions: [],
centerTitle: false,
elevation: 0,
),
body: SafeArea(
top: true,
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 0, 0, 0),
child: Text(
'AI conversations',
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
Expanded(
child: Align(
alignment: AlignmentDirectional(0, 0),
child: ListView(
padding: EdgeInsets.zero,
reverse: true,
scrollDirection: Axis.vertical,
children: [
Align(
alignment: AlignmentDirectional(0, 0),
child: InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onTap: () async {
context.pushNamed('Conversation');
},
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
),
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Icon(
Icons.settings_outlined,
color: FlutterFlowTheme.of(context)
.secondaryText,
size: 48,
),
),
),
Expanded(
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Container(
width: 100,
height: 100,
constraints: BoxConstraints(
minWidth:
MediaQuery.sizeOf(context).width,
),
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
shape: BoxShape.rectangle,
),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Align(
alignment:
AlignmentDirectional(-1, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Text(
'Hello World',
style:
FlutterFlowTheme.of(context)
.headlineLarge
.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
),
],
),
),
Align(
alignment:
AlignmentDirectional(-1, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Text(
'Hello World',
style: FlutterFlowTheme.of(
context)
.bodyMedium
.override(
fontFamily:
'Readex Pro',
letterSpacing: 0,
),
),
),
],
),
),
],
),
),
),
),
Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
),
child: Icon(
Icons.chevron_right_rounded,
color: FlutterFlowTheme.of(context)
.secondaryText,
size: 48,
),
),
],
),
),
),
],
),
),
),
],
),
),
),
);
}
}
@@ -0,0 +1,28 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'image_details_widget.dart' show ImageDetailsWidget;
import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class ImageDetailsModel extends FlutterFlowModel<ImageDetailsWidget> {
/// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
@override
void initState(BuildContext context) {}
@override
void dispose() {
unfocusNode.dispose();
}
}
@@ -0,0 +1,264 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'image_details_model.dart';
export 'image_details_model.dart';
class ImageDetailsWidget extends StatefulWidget {
const ImageDetailsWidget({super.key});
@override
State<ImageDetailsWidget> createState() => _ImageDetailsWidgetState();
}
class _ImageDetailsWidgetState extends State<ImageDetailsWidget>
with TickerProviderStateMixin {
late ImageDetailsModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>();
final animationsMap = <String, AnimationInfo>{};
@override
void initState() {
super.initState();
_model = createModel(context, () => ImageDetailsModel());
animationsMap.addAll({
'imageOnPageLoadAnimation': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 1.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: Offset(0.0, 30.0),
end: Offset(0.0, 0.0),
),
ScaleEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: Offset(0.7, 0.7),
end: Offset(1.0, 1.0),
),
],
),
'rowOnPageLoadAnimation': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 1.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: Offset(0.0, 30.0),
end: Offset(0.0, 0.0),
),
TiltEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 300.0.ms,
begin: Offset(-0.698, 0),
end: Offset(0, 0),
),
],
),
});
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
appBar: AppBar(
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
automaticallyImplyLeading: false,
leading: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 60,
icon: Icon(
Icons.arrow_back_rounded,
color: FlutterFlowTheme.of(context).primaryText,
size: 30,
),
onPressed: () async {
context.pop();
},
),
actions: [],
centerTitle: false,
elevation: 0,
),
body: SafeArea(
top: true,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: EdgeInsets.all(12),
child: Hero(
tag: 'hero',
transitionOnUserGestures: true,
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: CachedNetworkImage(
fadeInDuration: Duration(milliseconds: 500),
fadeOutDuration: Duration(milliseconds: 500),
imageUrl: 'https://picsum.photos/seed/150/600',
width: double.infinity,
fit: BoxFit.fitWidth,
memCacheWidth: 1200,
memCacheHeight: 1200,
),
),
).animateOnPageLoad(
animationsMap['imageOnPageLoadAnimation']!),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(12, 12, 12, 32),
child: Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 4, 8, 16),
child: Container(
width: 36,
height: 36,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).accent1,
borderRadius: BorderRadius.circular(12),
shape: BoxShape.rectangle,
border: Border.all(
color: FlutterFlowTheme.of(context).primary,
width: 2,
),
),
child: Padding(
padding: EdgeInsets.all(2),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: CachedNetworkImage(
fadeInDuration: Duration(milliseconds: 200),
fadeOutDuration: Duration(milliseconds: 200),
imageUrl:
'https://images.unsplash.com/photo-1521572267360-ee0c2909d518?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w0NTYyMDF8MHwxfHNlYXJjaHwyMHx8cHJvZmlsZXxlbnwwfHx8fDE2OTU4MjQ5OTN8MA&ixlib=rb-4.0.3&q=80&w=1080',
width: 44,
height: 44,
fit: BoxFit.cover,
),
),
),
),
),
Flexible(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 8),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
SelectionArea(
child: AutoSizeText(
'Thanks so much! We really do appreciate it!',
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
lineHeight: 1.5,
),
)),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 4, 0, 0),
child: Text(
'Just Now',
style: FlutterFlowTheme.of(context)
.labelSmall
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
].divide(SizedBox(width: 4)),
),
Padding(
padding:
EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0),
child: SelectionArea(
child: AutoSizeText(
'Thanks so much! We really do appreciate it!',
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.labelLarge
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
lineHeight: 1.5,
),
)),
),
],
),
),
),
],
).animateOnPageLoad(animationsMap['rowOnPageLoadAnimation']!),
),
],
),
),
),
);
}
}
+21
View File
@@ -0,0 +1,21 @@
import '/components/popup/popup_widget.dart';
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'settings_widget.dart' show SettingsWidget;
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class SettingsModel extends FlutterFlowModel<SettingsWidget> {
@override
void initState(BuildContext context) {}
@override
void dispose() {}
}
File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'setup_widget.dart' show SetupWidget;
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class SetupModel extends FlutterFlowModel<SetupWidget> {
/// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
@override
void initState(BuildContext context) {}
@override
void dispose() {
unfocusNode.dispose();
}
}
+325
View File
@@ -0,0 +1,325 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'setup_model.dart';
export 'setup_model.dart';
class SetupWidget extends StatefulWidget {
const SetupWidget({super.key});
@override
State<SetupWidget> createState() => _SetupWidgetState();
}
class _SetupWidgetState extends State<SetupWidget>
with TickerProviderStateMixin {
late SetupModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>();
final animationsMap = <String, AnimationInfo>{};
@override
void initState() {
super.initState();
_model = createModel(context, () => SetupModel());
animationsMap.addAll({
'containerOnPageLoadAnimation1': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 1.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 400.0.ms,
begin: 0.0,
end: 1.0,
),
ScaleEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 400.0.ms,
begin: Offset(3.0, 3.0),
end: Offset(1.0, 1.0),
),
],
),
'containerOnPageLoadAnimation2': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 300.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 300.0.ms,
duration: 300.0.ms,
begin: 0.0,
end: 1.0,
),
ScaleEffect(
curve: Curves.bounceOut,
delay: 300.0.ms,
duration: 300.0.ms,
begin: Offset(0.6, 0.6),
end: Offset(1.0, 1.0),
),
],
),
'textOnPageLoadAnimation1': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 350.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 350.0.ms,
duration: 400.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 350.0.ms,
duration: 400.0.ms,
begin: Offset(0.0, 30.0),
end: Offset(0.0, 0.0),
),
],
),
'textOnPageLoadAnimation2': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 400.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 400.0.ms,
duration: 400.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 400.0.ms,
duration: 400.0.ms,
begin: Offset(0.0, 30.0),
end: Offset(0.0, 0.0),
),
],
),
'rowOnPageLoadAnimation': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
VisibilityEffect(duration: 300.ms),
FadeEffect(
curve: Curves.easeInOut,
delay: 300.0.ms,
duration: 600.0.ms,
begin: 0.0,
end: 1.0,
),
ScaleEffect(
curve: Curves.bounceOut,
delay: 300.0.ms,
duration: 600.0.ms,
begin: Offset(0.6, 0.6),
end: Offset(1.0, 1.0),
),
],
),
});
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
body: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
width: double.infinity,
height: 500,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
FlutterFlowTheme.of(context).primary,
FlutterFlowTheme.of(context).error,
FlutterFlowTheme.of(context).tertiary
],
stops: [0, 0.5, 1],
begin: AlignmentDirectional(-1, -1),
end: AlignmentDirectional(1, 1),
),
),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0x00FFFFFF),
FlutterFlowTheme.of(context).secondaryBackground
],
stops: [0, 1],
begin: AlignmentDirectional(0, -1),
end: AlignmentDirectional(0, 1),
),
),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: 120,
height: 120,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).accent4,
shape: BoxShape.circle,
),
child: Padding(
padding: EdgeInsets.all(8),
child: Image.network(
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/f-f-templates-q1-23-fbcr63/assets/ax4fvwjz7awx/@4xff_badgeDesign_dark_small.png',
width: 100,
height: 100,
fit: BoxFit.cover,
),
),
).animateOnPageLoad(
animationsMap['containerOnPageLoadAnimation2']!),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 44, 0, 0),
child: Text(
'Welcome!',
style: FlutterFlowTheme.of(context)
.displaySmall
.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
).animateOnPageLoad(
animationsMap['textOnPageLoadAnimation1']!),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(44, 8, 44, 0),
child: Text(
'Thanks for joining! Access or create your account below, and get started on your journey!',
textAlign: TextAlign.center,
style:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
).animateOnPageLoad(
animationsMap['textOnPageLoadAnimation2']!),
),
],
),
),
).animateOnPageLoad(
animationsMap['containerOnPageLoadAnimation1']!),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 24, 16, 44),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 8, 16),
child: FFButtonWidget(
onPressed: () {
print('Button pressed ...');
},
text: 'Get Started',
options: FFButtonOptions(
width: 230,
height: 52,
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: FlutterFlowTheme.of(context)
.secondaryBackground,
textStyle:
FlutterFlowTheme.of(context).bodyLarge.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
elevation: 0,
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
),
),
),
),
Expanded(
child: Align(
alignment: AlignmentDirectional(0, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(8, 0, 0, 16),
child: FFButtonWidget(
onPressed: () {
print('Button pressed ...');
},
text: 'My Account',
options: FFButtonOptions(
width: 230,
height: 52,
padding: EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: FlutterFlowTheme.of(context).primary,
textStyle: FlutterFlowTheme.of(context)
.titleSmall
.override(
fontFamily: 'Readex Pro',
color: Colors.white,
letterSpacing: 0,
),
elevation: 3,
borderSide: BorderSide(
color: Colors.transparent,
width: 1,
),
borderRadius: BorderRadius.circular(12),
),
),
),
),
),
],
).animateOnPageLoad(animationsMap['rowOnPageLoadAnimation']!),
),
],
),
),
);
}
}
@@ -0,0 +1,46 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'support_form_widget.dart' show SupportFormWidget;
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
class SupportFormModel extends FlutterFlowModel<SupportFormWidget> {
/// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode1;
TextEditingController? textController1;
String? Function(BuildContext, String?)? textController1Validator;
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode2;
TextEditingController? textController2;
String? Function(BuildContext, String?)? textController2Validator;
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode3;
TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator;
@override
void initState(BuildContext context) {}
@override
void dispose() {
unfocusNode.dispose();
textFieldFocusNode1?.dispose();
textController1?.dispose();
textFieldFocusNode2?.dispose();
textController2?.dispose();
textFieldFocusNode3?.dispose();
textController3?.dispose();
}
}
+576
View File
@@ -0,0 +1,576 @@
import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import 'support_form_model.dart';
export 'support_form_model.dart';
class SupportFormWidget extends StatefulWidget {
const SupportFormWidget({super.key});
@override
State<SupportFormWidget> createState() => _SupportFormWidgetState();
}
class _SupportFormWidgetState extends State<SupportFormWidget>
with TickerProviderStateMixin {
late SupportFormModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>();
final animationsMap = <String, AnimationInfo>{};
@override
void initState() {
super.initState();
_model = createModel(context, () => SupportFormModel());
_model.textController1 ??= TextEditingController();
_model.textFieldFocusNode1 ??= FocusNode();
_model.textController2 ??= TextEditingController();
_model.textFieldFocusNode2 ??= FocusNode();
_model.textController3 ??= TextEditingController();
_model.textFieldFocusNode3 ??= FocusNode();
animationsMap.addAll({
'containerOnPageLoadAnimation1': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: Offset(0.0, 110.0),
end: Offset(0.0, 0.0),
),
],
),
'containerOnPageLoadAnimation2': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: Offset(0.0, 110.0),
end: Offset(0.0, 0.0),
),
],
),
'containerOnPageLoadAnimation3': AnimationInfo(
trigger: AnimationTrigger.onPageLoad,
effectsBuilder: () => [
FadeEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: 0.0,
end: 1.0,
),
MoveEffect(
curve: Curves.easeInOut,
delay: 0.0.ms,
duration: 600.0.ms,
begin: Offset(0.0, 110.0),
end: Offset(0.0, 0.0),
),
],
),
});
setupAnimations(
animationsMap.values.where((anim) =>
anim.trigger == AnimationTrigger.onActionTrigger ||
!anim.applyInitialState),
this,
);
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
appBar: AppBar(
backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
automaticallyImplyLeading: false,
leading: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30,
borderWidth: 1,
buttonSize: 60,
icon: Icon(
Icons.arrow_back_rounded,
color: FlutterFlowTheme.of(context).primaryText,
size: 30,
),
onPressed: () async {
context.pop();
},
),
title: Text(
'Submit Ticket',
style: FlutterFlowTheme.of(context).titleLarge.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
),
actions: [],
centerTitle: false,
elevation: 0,
),
body: SafeArea(
top: true,
child: Align(
alignment: AlignmentDirectional(0, 1),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(16, 12, 16, 0),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Welcome to support',
style: FlutterFlowTheme.of(context).labelLarge.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0),
child: Text(
'Submit a bug',
style: FlutterFlowTheme.of(context)
.headlineMedium
.override(
fontFamily: 'Outfit',
letterSpacing: 0,
),
),
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding:
EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Container(
width: 120,
constraints: BoxConstraints(
maxWidth: 500,
),
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
8, 16, 8, 16),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Icon(
Icons.email_outlined,
color:
FlutterFlowTheme.of(context).primary,
size: 36,
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 12, 0, 0),
child: Text(
'Email Us',
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
],
),
),
).animateOnPageLoad(animationsMap[
'containerOnPageLoadAnimation1']!),
),
),
Expanded(
child: Padding(
padding:
EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Container(
width: 120,
constraints: BoxConstraints(
maxWidth: 500,
),
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.secondaryBackground,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
8, 16, 8, 16),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Icon(
Icons.search_rounded,
color:
FlutterFlowTheme.of(context).primary,
size: 36,
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 12, 0, 0),
child: Text(
'Search FAQs',
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
],
),
),
).animateOnPageLoad(animationsMap[
'containerOnPageLoadAnimation2']!),
),
),
].divide(SizedBox(width: 12)),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
TextFormField(
controller: _model.textController1,
focusNode: _model.textFieldFocusNode1,
autofocus: true,
obscureText: false,
decoration: InputDecoration(
labelText: 'Channel Name',
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
contentPadding: EdgeInsetsDirectional.fromSTEB(
16, 12, 16, 12),
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
cursorColor: FlutterFlowTheme.of(context).primary,
validator: _model.textController1Validator
.asValidator(context),
),
TextFormField(
controller: _model.textController2,
focusNode: _model.textFieldFocusNode2,
autofocus: true,
obscureText: false,
decoration: InputDecoration(
labelText: 'Channel ID',
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
contentPadding: EdgeInsetsDirectional.fromSTEB(
16, 12, 16, 12),
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
cursorColor: FlutterFlowTheme.of(context).primary,
validator: _model.textController2Validator
.asValidator(context),
),
TextFormField(
controller: _model.textController3,
focusNode: _model.textFieldFocusNode3,
autofocus: true,
obscureText: false,
decoration: InputDecoration(
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
hintText:
'Short Description of what is going on...',
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2,
),
borderRadius: BorderRadius.circular(12),
),
contentPadding: EdgeInsetsDirectional.fromSTEB(
16, 24, 16, 12),
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
maxLines: 16,
minLines: 6,
cursorColor: FlutterFlowTheme.of(context).primary,
validator: _model.textController3Validator
.asValidator(context),
),
].divide(SizedBox(height: 12)),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 0),
child: Container(
width: double.infinity,
constraints: BoxConstraints(
maxWidth: 500,
),
decoration: BoxDecoration(
color:
FlutterFlowTheme.of(context).secondaryBackground,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: FlutterFlowTheme.of(context).alternate,
width: 2,
),
),
child: Padding(
padding: EdgeInsets.all(8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.add_a_photo_rounded,
color: FlutterFlowTheme.of(context).primary,
size: 32,
),
Padding(
padding:
EdgeInsetsDirectional.fromSTEB(16, 0, 0, 0),
child: Text(
'Upload Screenshot',
textAlign: TextAlign.center,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
letterSpacing: 0,
),
),
),
],
),
),
).animateOnPageLoad(
animationsMap['containerOnPageLoadAnimation3']!),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(0, 24, 0, 12),
child: FFButtonWidget(
onPressed: () {
print('Button pressed ...');
},
text: 'Submit Ticket',
icon: Icon(
Icons.receipt_long,
size: 15,
),
options: FFButtonOptions(
width: double.infinity,
height: 48,
padding: EdgeInsets.all(0),
iconPadding:
EdgeInsetsDirectional.fromSTEB(0, 0, 0, 0),
color: FlutterFlowTheme.of(context).primary,
textStyle:
FlutterFlowTheme.of(context).titleSmall.override(
fontFamily: 'Readex Pro',
color: Colors.white,
letterSpacing: 0,
),
elevation: 4,
borderSide: BorderSide(
color: Colors.transparent,
width: 1,
),
borderRadius: BorderRadius.circular(60),
),
),
),
],
),
),
),
),
),
),
);
}
}