Mztj67_#M}W?l>kYSliK<%xAp;0j{!}J0!o7b
zE>q9${Lb$D&h7k=+4=!ek^n+`0zq>LL1O?lVyea53S5x`Nqqo2YyeuIrQrJj9XjOp
z{;T5qbj3}&1vg1VK~#9!?b~^C5-}JC@Pyrv-6dSEqJqT}#j9#dJ@GzT@B8}x
zU&J@bBI>f6w6en+CeI)3^kC*U?}X%OD8$Fd$H&LV$H&LV$H&LV#|K5~mLYf|VqzOc
zkc7qL~0sOYuM{tG`rYEDV{DWY`Z8&)kW*hc2VkBuY+^Yx&92j&StN}Wp=LD
zxoGxXw6f&8sB^u})h@b@z0RBeD`K7RMR9deyL(ZJu#39Z>rT)^>v}Khq8U-IbIvT>
z?4pV9qGj=2)TNH3d)=De<+^w;>S7m_eFKTvzeaBeir45xY!^m!FmxnljbSS_3o=g(
z->^wC9%qkR{kbGnW8MfFew_o9h3(r55Is`L$8KI@d+*%{=Nx+FXJ98L0PjFIu;rGnnfY
zn1R5Qnp<{Jq0M1vX=X&F8gtLmcWv$1*M@4ZfF^9``()#hGTeKeP`1!iED
ztNE(TN}M5}3Bbc*d=FIv`DNv&@|C6yYj{sSqUj5oo$#*0$7pu|Dd2TLI>t5%I
zIa4Dvr(iayb+5x=j*Vum9&irk)xV1`t509lnPO0%skL8_1c#Xbamh(2@f?4yUI
zhhuT5<#8RJhGz4%b$`PJwKPAudsm|at?u;*hGgnA
zU1;9gnxVBC)wA(BsB`AW54N{|qmikJR*%x0c`{LGsSfa|NK61pYH(r-UQ4_JXd!Rsz)=k
zL{GMc5{h138)fF5CzHEDM>+FqY)$pdN3}Ml+riTgJOLN0F*Vh?{9ESR{SVVg>*>=#
zix;VJHPtvFFCRY$Ks*F;VX~%*r9F)W`PmPE9F!(&s#x07n2<}?S{(ygpXgX-&B&OM
zONY&BRQ(#%0%jeQs?oJ4P!p*R98>qCy5p8w>_gpuh39NcOlp)(wOoz0sY-Qz55eB~
z7OC-fKBaD1sE3$l-6QgBJO!n?QOTza`!S_YK
z_v-lm^7{VO^8Q@M_^8F)09Ki6%=s?2_5eupee(w1FB%aqSweusQ-T+CH0Xt{`
zFjMvW{@C&TB)k25()nh~_yJ9coBRL(0oO@HK~z}7?bm5j;y@69;bvlHb2tf!$ReA~x{22wTq550
z?f?Hnw(;m3ip30;QzdV~7pi!wyMYhDtXW#cO7T>|f=bdFhu+F!zMZ2UFj;GUKX7tI
z;hv3{q~!*pMj75WP_c}>6)IWvg5_yyg<9Op()eD1hWC19M@?_9_MHec{Z8n3FaF{8
z;u`Mw0ly(uE>*CgQYv{be6ab2LWhlaH1^iLIM{olnag$78^Fd}%dR7;JECQ+hmk|o
z!u2&!3MqPfP5ChDSkFSH8F2WVOEf0(E_M(JL17G}Y+fg0_IuW%WQ
zG(mG&u?|->YSdk0;8rc{yw2@2Z&GA}z{Wb91Ooz9VhA{b2DYE7RmG
zjL}?eq#iX%3#k;JWMx_{^2nNax`xPhByFiDX+a7uTGU|otOvIAUy|dEKkXOm-`aWS
z27pUzD{a)Ct<6p{{3)+lq@i`t@%>-wT4r?*S}k)58e09WZYP0{{R3FC5Sl00039P)t-s|Ns9~
z#rP?<_5oL$Q^olD{r_0T`27C={r>*`|Nj71npVa5OTzc(_WfbW_({R{p56NV{r*M2
z_xt?)2V0#0NsfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H=
zY@z@@bOAMB5Ltl$E>bJJ{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|N
zi~t=w02?-0&j0TD{>bb6sNwsK*!p?V`RMQUl(*DVjk-9Cx+-z1KXab|Ka2oXhX5f%
z`$|e!000AhNklrxs)5QTeTVRiEmz~MKK1WAjCw(c-JK6eox;2O)?`?
zTG`AHia671e^vgmp!llKp|=5sVHk#C7=~epA~VAf-~%aPC=%Qw01h8mnSZ|p?hz91
z7p83F3%LVu9;S$tSI$C^%^yud1dfTM_6p2|+5Ejp$bd`GDvbR|xit>i!ZD&F>@CJrPmu*UjD&?DfZs=$@e3FQA(vNiU+$A*%a}
z?`XcG2jDxJ_ZQ#Md`H{4Lpf6QBDp81_KWZ6Tk#yCy1)32zO#3<7>b`eT7UyYH1eGz
z;O(rH$=QR*L%%ZcBpc=eGua?N55nD^K(8<#gl2+pN_j~b2MHs4#mcLmv%DkspS-3<
zpI1F=^9siI0s-;IN_IrA;5xm~3?3!StX}pUv0vkxMaqm+zxrg7X7(I&*N~&dEd0kD
z-FRV|g=|QuUsuh>-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw
z@1|eLG>!8ruU1pFXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7
zAkD(jpw|oZLNiA>;>hgp1KX7-wxC~31II47gc
zHcehD6Uxlf%+M^^uN5Wc*G%^;>D5qT{>=uxUhX%WJu^Z*(_Wq9y}npFO{Hhb>s6<9
zNi0pHXWFaVZnb)1+RS&F)xOv6&aeILcI)`k#0YE+?e)5r7J#c`3Z7x!LpTc01dx
zrdC3{Z;joZ^KN&))zB_i)I9fWedoN>Zl-6_Iz+^G&*ak2jpF07*qoM6N<$f;w%0(f|Me
literal 0
HcmV?d00001
diff --git a/mobile/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/mobile/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8
GIT binary patch
literal 1418
zcmV;51$Fv~P)q
zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+
zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq
z^={4hPQv)y=I|4n+?>7Fim=dxt1
z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT
zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf`
zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_>
z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3
zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF
z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a
z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE
z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62(
zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;?
zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-<
z{s<&cCV_1`^TD^ia9!*mQDq&
zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw
zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv
zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF
z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC
YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H
literal 0
HcmV?d00001
diff --git a/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/mobile/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/mobile/app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mobile/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..f2e259c
--- /dev/null
+++ b/mobile/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile/app/ios/Runner/Base.lproj/Main.storyboard b/mobile/app/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/mobile/app/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile/app/ios/Runner/Info.plist b/mobile/app/ios/Runner/Info.plist
new file mode 100644
index 0000000..c2e05c5
--- /dev/null
+++ b/mobile/app/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ App
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ app
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/mobile/app/ios/Runner/Runner-Bridging-Header.h b/mobile/app/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/mobile/app/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/mobile/app/ios/RunnerTests/RunnerTests.swift b/mobile/app/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000..86a7c3b
--- /dev/null
+++ b/mobile/app/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/mobile/app/lib/components/ConversationBubblesModel.dart b/mobile/app/lib/components/ConversationBubblesModel.dart
new file mode 100644
index 0000000..e69de29
diff --git a/mobile/app/lib/components/ConversationBubblesWidget.dart b/mobile/app/lib/components/ConversationBubblesWidget.dart
new file mode 100644
index 0000000..e69de29
diff --git a/mobile/app/lib/components/ConversationDetailsOverlayModel.dart b/mobile/app/lib/components/ConversationDetailsOverlayModel.dart
new file mode 100644
index 0000000..8767242
--- /dev/null
+++ b/mobile/app/lib/components/ConversationDetailsOverlayModel.dart
@@ -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 {
+ /// 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();
+ }
+}
diff --git a/mobile/app/lib/components/ConversationDetailsOverlayWidget.dart b/mobile/app/lib/components/ConversationDetailsOverlayWidget.dart
new file mode 100644
index 0000000..0386225
--- /dev/null
+++ b/mobile/app/lib/components/ConversationDetailsOverlayWidget.dart
@@ -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 createState() =>
+ _ConversationDetailsOverlayWidgetState();
+}
+
+class _ConversationDetailsOverlayWidgetState
+ extends State {
+ 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,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/ConversationOptionsModel.dart b/mobile/app/lib/components/ConversationOptionsModel.dart
new file mode 100644
index 0000000..42c8a86
--- /dev/null
+++ b/mobile/app/lib/components/ConversationOptionsModel.dart
@@ -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 {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/mobile/app/lib/components/ConversationOptionsWidget.dart b/mobile/app/lib/components/ConversationOptionsWidget.dart
new file mode 100644
index 0000000..8390957
--- /dev/null
+++ b/mobile/app/lib/components/ConversationOptionsWidget.dart
@@ -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 createState() =>
+ _ConversationOptionsWidgetState();
+}
+
+class _ConversationOptionsWidgetState extends State {
+ 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,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/ConversationThreadModel.dart b/mobile/app/lib/components/ConversationThreadModel.dart
new file mode 100644
index 0000000..9bf6598
--- /dev/null
+++ b/mobile/app/lib/components/ConversationThreadModel.dart
@@ -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 {
+ /// State fields for stateful widgets in this component.
+
+ final formKey = GlobalKey();
+ // 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();
+ }
+}
diff --git a/mobile/app/lib/components/ConversationThreadWidget.dart b/mobile/app/lib/components/ConversationThreadWidget.dart
new file mode 100644
index 0000000..bc35cd6
--- /dev/null
+++ b/mobile/app/lib/components/ConversationThreadWidget.dart
@@ -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 createState() =>
+ _ConversationThreadWidgetState();
+}
+
+class _ConversationThreadWidgetState extends State {
+ 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(),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/ModelItemModel.dart b/mobile/app/lib/components/ModelItemModel.dart
new file mode 100644
index 0000000..2faa5ab
--- /dev/null
+++ b/mobile/app/lib/components/ModelItemModel.dart
@@ -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 {
+ /// 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() {}
+}
diff --git a/mobile/app/lib/components/ModelItemWidget.dart b/mobile/app/lib/components/ModelItemWidget.dart
new file mode 100644
index 0000000..2ba9817
--- /dev/null
+++ b/mobile/app/lib/components/ModelItemWidget.dart
@@ -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 createState() => _ModelItemWidgetState();
+}
+
+class _ModelItemWidgetState extends State {
+ 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);
+ }),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/NoChatsModel.dart b/mobile/app/lib/components/NoChatsModel.dart
new file mode 100644
index 0000000..24e70a3
--- /dev/null
+++ b/mobile/app/lib/components/NoChatsModel.dart
@@ -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 {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/mobile/app/lib/components/NoChatsWidget.dart b/mobile/app/lib/components/NoChatsWidget.dart
new file mode 100644
index 0000000..b1274a3
--- /dev/null
+++ b/mobile/app/lib/components/NoChatsWidget.dart
@@ -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 createState() => _NoChatsWidgetState();
+}
+
+class _NoChatsWidgetState extends State {
+ 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,
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/OptionsDialogModel.dart b/mobile/app/lib/components/OptionsDialogModel.dart
new file mode 100644
index 0000000..8910477
--- /dev/null
+++ b/mobile/app/lib/components/OptionsDialogModel.dart
@@ -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 {
+ /// 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() {}
+}
diff --git a/mobile/app/lib/components/OptionsDialogWidget.dart b/mobile/app/lib/components/OptionsDialogWidget.dart
new file mode 100644
index 0000000..a70dde1
--- /dev/null
+++ b/mobile/app/lib/components/OptionsDialogWidget.dart
@@ -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 createState() => _PopupWidgetState();
+}
+
+class _PopupWidgetState extends State {
+ 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,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/PopupModel.dart b/mobile/app/lib/components/PopupModel.dart
new file mode 100644
index 0000000..4950211
--- /dev/null
+++ b/mobile/app/lib/components/PopupModel.dart
@@ -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 {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/mobile/app/lib/components/PopupWidget.dart b/mobile/app/lib/components/PopupWidget.dart
new file mode 100644
index 0000000..a70dde1
--- /dev/null
+++ b/mobile/app/lib/components/PopupWidget.dart
@@ -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 createState() => _PopupWidgetState();
+}
+
+class _PopupWidgetState extends State {
+ 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,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/components/PromptBoxModel.dart b/mobile/app/lib/components/PromptBoxModel.dart
new file mode 100644
index 0000000..bf0906b
--- /dev/null
+++ b/mobile/app/lib/components/PromptBoxModel.dart
@@ -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 {
+ /// 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();
+ }
+}
diff --git a/mobile/app/lib/components/PromptBoxWidget.dart b/mobile/app/lib/components/PromptBoxWidget.dart
new file mode 100644
index 0000000..7713f62
--- /dev/null
+++ b/mobile/app/lib/components/PromptBoxWidget.dart
@@ -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 createState() => _PromptBoxWidgetState();
+}
+
+class _PromptBoxWidgetState extends State {
+ 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),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/main.dart b/mobile/app/lib/main.dart
new file mode 100644
index 0000000..8e94089
--- /dev/null
+++ b/mobile/app/lib/main.dart
@@ -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 createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State {
+ 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: [
+ 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.
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/ConversationModel.dart b/mobile/app/lib/pages/ConversationModel.dart
new file mode 100644
index 0000000..36fcfb1
--- /dev/null
+++ b/mobile/app/lib/pages/ConversationModel.dart
@@ -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 {
+ /// 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();
+ }
+}
diff --git a/mobile/app/lib/pages/ConversationWidget.dart b/mobile/app/lib/pages/ConversationWidget.dart
new file mode 100644
index 0000000..0954514
--- /dev/null
+++ b/mobile/app/lib/pages/ConversationWidget.dart
@@ -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 createState() => _ConversationWidgetState();
+}
+
+class _ConversationWidgetState extends State {
+ late ConversationModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @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: {
+ 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(),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/ConversationsListModel.dart b/mobile/app/lib/pages/ConversationsListModel.dart
new file mode 100644
index 0000000..b5339a6
--- /dev/null
+++ b/mobile/app/lib/pages/ConversationsListModel.dart
@@ -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 {
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ }
+}
diff --git a/mobile/app/lib/pages/ConversationsListWidget.dart b/mobile/app/lib/pages/ConversationsListWidget.dart
new file mode 100644
index 0000000..da3b2cb
--- /dev/null
+++ b/mobile/app/lib/pages/ConversationsListWidget.dart
@@ -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 createState() =>
+ _ConversationsListWidgetState();
+}
+
+class _ConversationsListWidgetState extends State {
+ late ConversationsListModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @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,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/ImageDetailsModel.dart b/mobile/app/lib/pages/ImageDetailsModel.dart
new file mode 100644
index 0000000..6398018
--- /dev/null
+++ b/mobile/app/lib/pages/ImageDetailsModel.dart
@@ -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 {
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ }
+}
diff --git a/mobile/app/lib/pages/ImageDetailsWidget.dart b/mobile/app/lib/pages/ImageDetailsWidget.dart
new file mode 100644
index 0000000..e5d5c74
--- /dev/null
+++ b/mobile/app/lib/pages/ImageDetailsWidget.dart
@@ -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 createState() => _ImageDetailsWidgetState();
+}
+
+class _ImageDetailsWidgetState extends State
+ with TickerProviderStateMixin {
+ late ImageDetailsModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ final animationsMap = {};
+
+ @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']!),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/SettingsModel.dart b/mobile/app/lib/pages/SettingsModel.dart
new file mode 100644
index 0000000..19e74a3
--- /dev/null
+++ b/mobile/app/lib/pages/SettingsModel.dart
@@ -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 {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/mobile/app/lib/pages/SettingsWidget.dart b/mobile/app/lib/pages/SettingsWidget.dart
new file mode 100644
index 0000000..7905835
--- /dev/null
+++ b/mobile/app/lib/pages/SettingsWidget.dart
@@ -0,0 +1,1809 @@
+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 '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 'settings_model.dart';
+export 'settings_model.dart';
+
+class SettingsWidget extends StatefulWidget {
+ const SettingsWidget({super.key});
+
+ @override
+ State createState() => _SettingsWidgetState();
+}
+
+class _SettingsWidgetState extends State
+ with TickerProviderStateMixin {
+ late SettingsModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ final animationsMap = {};
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => SettingsModel());
+
+ 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, 90.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, 90.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 Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
+ appBar: MediaQuery.sizeOf(context).width <= 991.0
+ ? AppBar(
+ backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
+ automaticallyImplyLeading: false,
+ title: Text(
+ 'My Profile',
+ style: FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily: 'Outfit',
+ letterSpacing: 0,
+ ),
+ ),
+ actions: [],
+ centerTitle: false,
+ elevation: 0,
+ )
+ : null,
+ body: SafeArea(
+ top: true,
+ child: Stack(
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ if (responsiveVisibility(
+ context: context,
+ phone: false,
+ tablet: false,
+ ))
+ Container(
+ width: 270,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(0),
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 1,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0, 24, 0, 16),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16, 0, 16, 12),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.add_task_rounded,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 32,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'check.io',
+ style: FlutterFlowTheme.of(context)
+ .headlineMedium
+ .override(
+ fontFamily: 'Outfit',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Divider(
+ height: 12,
+ thickness: 2,
+ color: FlutterFlowTheme.of(context).alternate,
+ ),
+ Expanded(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 12, 0, 0),
+ child: Text(
+ 'Platform Navigation',
+ style: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.space_dashboard,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'Dashboard',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.forum_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'Chats',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.work,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'Projects',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).accent1,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.receipt_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24,
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(12, 0, 0, 0),
+ child: Text(
+ 'Recent Orders',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ),
+ Container(
+ height: 32,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primary,
+ borderRadius:
+ BorderRadius.circular(8),
+ ),
+ child: Align(
+ alignment:
+ AlignmentDirectional(0, 0),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(8, 4, 8, 4),
+ child: Text(
+ '12',
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 0, 0),
+ child: Text(
+ 'Settings',
+ style: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.attach_money_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'Billing',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 16, 0, 16, 0),
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 200),
+ curve: Curves.easeInOut,
+ width: double.infinity,
+ height: 44,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8, 0, 6, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.wifi_tethering_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Text(
+ 'Explore',
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ].divide(SizedBox(height: 12)),
+ ),
+ ),
+ Align(
+ alignment: AlignmentDirectional(0, -1),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0, 8, 0, 16),
+ child: Container(
+ width: 250,
+ height: 50,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(
+ color:
+ FlutterFlowTheme.of(context).alternate,
+ width: 1,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(4),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Expanded(
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ setDarkModeSetting(
+ context, ThemeMode.light);
+ },
+ child: Container(
+ width: 115,
+ height: 100,
+ decoration: BoxDecoration(
+ color: Theme.of(context)
+ .brightness ==
+ Brightness.light
+ ? FlutterFlowTheme.of(context)
+ .secondaryBackground
+ : FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius.circular(10),
+ border: Border.all(
+ color: valueOrDefault(
+ Theme.of(context)
+ .brightness ==
+ Brightness.light
+ ? FlutterFlowTheme.of(
+ context)
+ .alternate
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ FlutterFlowTheme.of(context)
+ .alternate,
+ ),
+ width: 1,
+ ),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.wb_sunny_rounded,
+ color: Theme.of(context)
+ .brightness ==
+ Brightness.light
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ size: 16,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(4, 0, 0, 0),
+ child: Text(
+ 'Light Mode',
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .light
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ setDarkModeSetting(
+ context, ThemeMode.dark);
+ },
+ child: Container(
+ width: 115,
+ height: 100,
+ decoration: BoxDecoration(
+ color: Theme.of(context)
+ .brightness ==
+ Brightness.dark
+ ? FlutterFlowTheme.of(context)
+ .secondaryBackground
+ : FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius.circular(10),
+ border: Border.all(
+ color: valueOrDefault(
+ Theme.of(context)
+ .brightness ==
+ Brightness.dark
+ ? FlutterFlowTheme.of(
+ context)
+ .alternate
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ ),
+ width: 1,
+ ),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.nightlight_round,
+ color: Theme.of(context)
+ .brightness ==
+ Brightness.dark
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ size: 16,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(4, 0, 0, 0),
+ child: Text(
+ 'Dark Mode',
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .dark
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ height: 12,
+ thickness: 2,
+ color: FlutterFlowTheme.of(context).alternate,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16, 12, 16, 12),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Container(
+ width: 50,
+ height: 50,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).accent1,
+ borderRadius: BorderRadius.circular(12),
+ 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: 500),
+ fadeOutDuration:
+ Duration(milliseconds: 500),
+ imageUrl:
+ 'https://images.unsplash.com/photo-1624561172888-ac93c696e10c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NjJ8fHVzZXJzfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=900&q=60',
+ width: 44,
+ height: 44,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 12, 0, 0, 0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment:
+ CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Casper Ghost',
+ style: FlutterFlowTheme.of(context)
+ .bodyLarge
+ .override(
+ fontFamily: 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ Text(
+ 'admin@gmail.com',
+ style: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16, 0, 16, 0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Icon(
+ Icons.menu_open_rounded,
+ color: FlutterFlowTheme.of(context)
+ .secondaryText,
+ size: 24,
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment: AlignmentDirectional(0, 0),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ if (responsiveVisibility(
+ context: context,
+ phone: false,
+ tablet: false,
+ ))
+ Container(
+ width: double.infinity,
+ height: 24,
+ decoration: BoxDecoration(),
+ ),
+ Align(
+ alignment: AlignmentDirectional(0, -1),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16, 16, 16, 0),
+ child: Wrap(
+ spacing: 16,
+ runSpacing: 16,
+ alignment: WrapAlignment.center,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.center,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ Container(
+ width: double.infinity,
+ constraints: BoxConstraints(
+ maxWidth: 390,
+ ),
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(
+ color: FlutterFlowTheme.of(context)
+ .alternate,
+ width: 1,
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding: EdgeInsets.all(16),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Container(
+ width: 72,
+ height: 72,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(
+ context)
+ .accent1,
+ borderRadius:
+ BorderRadius.circular(12),
+ 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: 500),
+ fadeOutDuration: Duration(
+ milliseconds: 500),
+ imageUrl:
+ 'https://images.unsplash.com/photo-1624561172888-ac93c696e10c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NjJ8fHVzZXJzfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=900&q=60',
+ width: 44,
+ height: 44,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 4, 0, 4),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ crossAxisAlignment:
+ CrossAxisAlignment
+ .start,
+ children: [
+ Text(
+ 'Casper Ghost',
+ style: FlutterFlowTheme
+ .of(context)
+ .headlineSmall
+ .override(
+ fontFamily:
+ 'Outfit',
+ letterSpacing: 0,
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(
+ 0, 4, 0, 0),
+ child: Text(
+ 'casper@ghustbusters.com',
+ style: FlutterFlowTheme
+ .of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Divider(
+ height: 2,
+ thickness: 1,
+ color: FlutterFlowTheme.of(context)
+ .alternate,
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(0, 0, 0, 12),
+ child: Container(
+ width: 200,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ borderRadius:
+ BorderRadius.circular(
+ 8),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(
+ 12, 12, 12, 0),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Icon(
+ Icons.receipt_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ size: 44,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(0,
+ 8, 0, 4),
+ child: Text(
+ '2,200',
+ textAlign: TextAlign
+ .center,
+ style: FlutterFlowTheme
+ .of(context)
+ .headlineSmall
+ .override(
+ fontFamily:
+ 'Outfit',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ),
+ Text(
+ 'Orders Placed',
+ textAlign:
+ TextAlign.center,
+ style: FlutterFlowTheme
+ .of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ).animateOnPageLoad(animationsMap[
+ 'containerOnPageLoadAnimation1']!),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(0, 0, 0, 12),
+ child: Container(
+ width: 200,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ borderRadius:
+ BorderRadius.circular(
+ 8),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(
+ 12, 12, 12, 0),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Icon(
+ Icons
+ .ssid_chart_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ size: 44,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(0,
+ 8, 0, 4),
+ child: Text(
+ '\$212.4k',
+ textAlign: TextAlign
+ .center,
+ style: FlutterFlowTheme
+ .of(context)
+ .headlineSmall
+ .override(
+ fontFamily:
+ 'Outfit',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ),
+ Text(
+ 'Money Earned',
+ textAlign:
+ TextAlign.center,
+ style: FlutterFlowTheme
+ .of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ).animateOnPageLoad(animationsMap[
+ 'containerOnPageLoadAnimation2']!),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ Container(
+ width: double.infinity,
+ constraints: BoxConstraints(
+ maxWidth: 470,
+ ),
+ decoration: BoxDecoration(),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment:
+ CrossAxisAlignment.start,
+ children: [
+ Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius.circular(12),
+ border: Border.all(
+ color:
+ FlutterFlowTheme.of(context)
+ .alternate,
+ ),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 16, 12, 0, 12),
+ child: Text(
+ 'My Account Information',
+ style:
+ FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 0, 0, 0, 1),
+ child: Container(
+ width: double.infinity,
+ height: 60,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0,
+ color: FlutterFlowTheme.of(
+ context)
+ .alternate,
+ offset: Offset(
+ 0,
+ 1,
+ ),
+ )
+ ],
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 0, 16, 0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Text(
+ 'Change Password',
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyLarge
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment:
+ AlignmentDirectional(
+ 1, 0),
+ child: Icon(
+ Icons
+ .chevron_right_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .secondaryText,
+ size: 20,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 0, 0, 0, 1),
+ child: Container(
+ width: double.infinity,
+ height: 60,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0,
+ color: FlutterFlowTheme.of(
+ context)
+ .alternate,
+ offset: Offset(
+ 0,
+ 1,
+ ),
+ )
+ ],
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 0, 16, 0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Text(
+ 'Edit Profile',
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyLarge
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0,
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment:
+ AlignmentDirectional(
+ 1, 0),
+ child: Icon(
+ Icons
+ .chevron_right_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .secondaryText,
+ size: 20,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 0, 12, 0, 0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius.circular(12),
+ border: Border.all(
+ color:
+ FlutterFlowTheme.of(context)
+ .alternate,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 12, 0, 12),
+ child: Text(
+ 'Support',
+ style:
+ FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing: 0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 0, 0, 0, 1),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ context.pushNamed(
+ 'SupportForm',
+ extra: {
+ kTransitionInfoKey:
+ TransitionInfo(
+ hasTransition: true,
+ transitionType:
+ PageTransitionType
+ .rightToLeft,
+ duration: Duration(
+ milliseconds: 250),
+ ),
+ },
+ );
+ },
+ child: Container(
+ width: double.infinity,
+ height: 60,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0,
+ color: FlutterFlowTheme.of(
+ context)
+ .alternate,
+ offset: Offset(
+ 0,
+ 1,
+ ),
+ )
+ ],
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 0, 16, 0),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Text(
+ 'Bug or Feature Request',
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyLarge
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0,
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment:
+ AlignmentDirectional(
+ 1, 0),
+ child: Icon(
+ Icons
+ .chevron_right_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .secondaryText,
+ size: 20,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(
+ 0, 0, 0, 1),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor:
+ Colors.transparent,
+ enableDrag: false,
+ useSafeArea: true,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding:
+ MediaQuery.viewInsetsOf(
+ context),
+ child: PopupWidget(),
+ );
+ },
+ ).then((value) =>
+ safeSetState(() {}));
+ },
+ child: Container(
+ width: double.infinity,
+ height: 60,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0,
+ color: FlutterFlowTheme.of(
+ context)
+ .alternate,
+ offset: Offset(
+ 0,
+ 1,
+ ),
+ )
+ ],
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional
+ .fromSTEB(16, 0, 16, 0),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Text(
+ 'Open-source licenses & other info',
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyLarge
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ letterSpacing:
+ 0,
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment:
+ AlignmentDirectional(
+ 1, 0),
+ child: Icon(
+ Icons
+ .chevron_right_rounded,
+ color: FlutterFlowTheme
+ .of(context)
+ .secondaryText,
+ size: 20,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment:
+ AlignmentDirectional(0, -1),
+ child: Padding(
+ padding: EdgeInsets.all(16),
+ child: Container(
+ width: double.infinity,
+ height: 50,
+ constraints: BoxConstraints(
+ maxWidth: 500,
+ ),
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius.circular(12),
+ border: Border.all(
+ color: FlutterFlowTheme.of(
+ context)
+ .alternate,
+ width: 1,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(4),
+ child: Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.start,
+ children: [
+ Expanded(
+ child: InkWell(
+ splashColor:
+ Colors.transparent,
+ focusColor:
+ Colors.transparent,
+ hoverColor:
+ Colors.transparent,
+ highlightColor:
+ Colors.transparent,
+ onTap: () async {
+ setDarkModeSetting(
+ context,
+ ThemeMode.light);
+ },
+ child: Container(
+ width: 115,
+ height: 100,
+ decoration:
+ BoxDecoration(
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .light
+ ? FlutterFlowTheme.of(
+ context)
+ .secondaryBackground
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius
+ .circular(
+ 10),
+ border: Border.all(
+ color:
+ valueOrDefault<
+ Color>(
+ Theme.of(context)
+ .brightness ==
+ Brightness
+ .light
+ ? FlutterFlowTheme.of(
+ context)
+ .alternate
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ FlutterFlowTheme.of(
+ context)
+ .alternate,
+ ),
+ width: 1,
+ ),
+ ),
+ child: Row(
+ mainAxisSize:
+ MainAxisSize
+ .max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Icon(
+ Icons
+ .wb_sunny_rounded,
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .light
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ size: 16,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(
+ 4,
+ 0,
+ 0,
+ 0),
+ child: Text(
+ 'Light ',
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: Theme.of(context).brightness ==
+ Brightness.light
+ ? FlutterFlowTheme.of(context).primaryText
+ : FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: InkWell(
+ splashColor:
+ Colors.transparent,
+ focusColor:
+ Colors.transparent,
+ hoverColor:
+ Colors.transparent,
+ highlightColor:
+ Colors.transparent,
+ onTap: () async {
+ setDarkModeSetting(
+ context,
+ ThemeMode.dark);
+ },
+ child: Container(
+ width: 115,
+ height: 100,
+ decoration:
+ BoxDecoration(
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .dark
+ ? FlutterFlowTheme.of(
+ context)
+ .secondaryBackground
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ borderRadius:
+ BorderRadius
+ .circular(
+ 10),
+ border: Border.all(
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .dark
+ ? FlutterFlowTheme.of(
+ context)
+ .alternate
+ : FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ width: 1,
+ ),
+ ),
+ child: Row(
+ mainAxisSize:
+ MainAxisSize
+ .max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Icon(
+ Icons
+ .nightlight_round,
+ color: Theme.of(context)
+ .brightness ==
+ Brightness
+ .dark
+ ? FlutterFlowTheme.of(
+ context)
+ .primaryText
+ : FlutterFlowTheme.of(
+ context)
+ .secondaryText,
+ size: 16,
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional
+ .fromSTEB(
+ 4,
+ 0,
+ 0,
+ 0),
+ child: Text(
+ 'Dark',
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ 'Readex Pro',
+ color: Theme.of(context).brightness ==
+ Brightness.dark
+ ? FlutterFlowTheme.of(context).primaryText
+ : FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing:
+ 0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ].addToEnd(SizedBox(height: 72)),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/SetupModel.dart b/mobile/app/lib/pages/SetupModel.dart
new file mode 100644
index 0000000..959f48a
--- /dev/null
+++ b/mobile/app/lib/pages/SetupModel.dart
@@ -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 {
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ }
+}
diff --git a/mobile/app/lib/pages/SetupWidget.dart b/mobile/app/lib/pages/SetupWidget.dart
new file mode 100644
index 0000000..13d9f34
--- /dev/null
+++ b/mobile/app/lib/pages/SetupWidget.dart
@@ -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 createState() => _SetupWidgetState();
+}
+
+class _SetupWidgetState extends State
+ with TickerProviderStateMixin {
+ late SetupModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ final animationsMap = {};
+
+ @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']!),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/lib/pages/SupportFormModel.dart b/mobile/app/lib/pages/SupportFormModel.dart
new file mode 100644
index 0000000..246d59e
--- /dev/null
+++ b/mobile/app/lib/pages/SupportFormModel.dart
@@ -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 {
+ /// 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();
+ }
+}
diff --git a/mobile/app/lib/pages/SupportFormWidget.dart b/mobile/app/lib/pages/SupportFormWidget.dart
new file mode 100644
index 0000000..cb6740c
--- /dev/null
+++ b/mobile/app/lib/pages/SupportFormWidget.dart
@@ -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 createState() => _SupportFormWidgetState();
+}
+
+class _SupportFormWidgetState extends State
+ with TickerProviderStateMixin {
+ late SupportFormModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ final animationsMap = {};
+
+ @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),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/app/linux/.gitignore b/mobile/app/linux/.gitignore
new file mode 100644
index 0000000..d3896c9
--- /dev/null
+++ b/mobile/app/linux/.gitignore
@@ -0,0 +1 @@
+flutter/ephemeral
diff --git a/mobile/app/linux/CMakeLists.txt b/mobile/app/linux/CMakeLists.txt
new file mode 100644
index 0000000..b99d63d
--- /dev/null
+++ b/mobile/app/linux/CMakeLists.txt
@@ -0,0 +1,145 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.10)
+project(runner LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "app")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.app")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Copy the native assets provided by the build.dart from all packages.
+set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
+install(DIRECTORY "${NATIVE_ASSETS_DIR}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/mobile/app/linux/flutter/CMakeLists.txt b/mobile/app/linux/flutter/CMakeLists.txt
new file mode 100644
index 0000000..d5bd016
--- /dev/null
+++ b/mobile/app/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/mobile/app/linux/flutter/generated_plugin_registrant.cc b/mobile/app/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 0000000..e71a16d
--- /dev/null
+++ b/mobile/app/linux/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,11 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+
+void fl_register_plugins(FlPluginRegistry* registry) {
+}
diff --git a/mobile/app/linux/flutter/generated_plugin_registrant.h b/mobile/app/linux/flutter/generated_plugin_registrant.h
new file mode 100644
index 0000000..e0f0a47
--- /dev/null
+++ b/mobile/app/linux/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void fl_register_plugins(FlPluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/mobile/app/linux/flutter/generated_plugins.cmake b/mobile/app/linux/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..2e1de87
--- /dev/null
+++ b/mobile/app/linux/flutter/generated_plugins.cmake
@@ -0,0 +1,23 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/mobile/app/linux/main.cc b/mobile/app/linux/main.cc
new file mode 100644
index 0000000..e7c5c54
--- /dev/null
+++ b/mobile/app/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/mobile/app/linux/my_application.cc b/mobile/app/linux/my_application.cc
new file mode 100644
index 0000000..c4b824f
--- /dev/null
+++ b/mobile/app/linux/my_application.cc
@@ -0,0 +1,124 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "app");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "app");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GApplication::startup.
+static void my_application_startup(GApplication* application) {
+ //MyApplication* self = MY_APPLICATION(object);
+
+ // Perform any actions required at application startup.
+
+ G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
+}
+
+// Implements GApplication::shutdown.
+static void my_application_shutdown(GApplication* application) {
+ //MyApplication* self = MY_APPLICATION(object);
+
+ // Perform any actions required at application shutdown.
+
+ G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_APPLICATION_CLASS(klass)->startup = my_application_startup;
+ G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/mobile/app/linux/my_application.h b/mobile/app/linux/my_application.h
new file mode 100644
index 0000000..72271d5
--- /dev/null
+++ b/mobile/app/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/mobile/app/macos/.gitignore b/mobile/app/macos/.gitignore
new file mode 100644
index 0000000..746adbb
--- /dev/null
+++ b/mobile/app/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/mobile/app/macos/Flutter/Flutter-Debug.xcconfig b/mobile/app/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 0000000..c2efd0b
--- /dev/null
+++ b/mobile/app/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/mobile/app/macos/Flutter/Flutter-Release.xcconfig b/mobile/app/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 0000000..c2efd0b
--- /dev/null
+++ b/mobile/app/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/mobile/app/macos/Flutter/GeneratedPluginRegistrant.swift b/mobile/app/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 0000000..cccf817
--- /dev/null
+++ b/mobile/app/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,10 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+}
diff --git a/mobile/app/macos/Runner.xcodeproj/project.pbxproj b/mobile/app/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..45a7908
--- /dev/null
+++ b/mobile/app/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,705 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "app.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 331C80D2294CF70F00263BE5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C80D6294CF71000263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 331C80D6294CF71000263BE5 /* RunnerTests */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* app.app */,
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C80D4294CF70F00263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C80D1294CF70F00263BE5 /* Sources */,
+ 331C80D2294CF70F00263BE5 /* Frameworks */,
+ 331C80D3294CF70F00263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* app.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C80D4294CF70F00263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 33CC10EC2044A3C60003C045;
+ };
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 331C80D4294CF70F00263BE5 /* RunnerTests */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C80D3294CF70F00263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C80D1294CF70F00263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC10EC2044A3C60003C045 /* Runner */;
+ targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
+ };
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 331C80DB294CF71000263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Debug;
+ };
+ 331C80DC294CF71000263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Release;
+ };
+ 331C80DD294CF71000263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Profile;
+ };
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C80DB294CF71000263BE5 /* Debug */,
+ 331C80DC294CF71000263BE5 /* Release */,
+ 331C80DD294CF71000263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/mobile/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/mobile/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/mobile/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mobile/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..c8582ae
--- /dev/null
+++ b/mobile/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile/app/macos/Runner.xcworkspace/contents.xcworkspacedata b/mobile/app/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/mobile/app/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/mobile/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/mobile/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/mobile/app/macos/Runner/AppDelegate.swift b/mobile/app/macos/Runner/AppDelegate.swift
new file mode 100644
index 0000000..d53ef64
--- /dev/null
+++ b/mobile/app/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/mobile/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mobile/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..a2ec33f
--- /dev/null
+++ b/mobile/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/mobile/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/mobile/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5
GIT binary patch
literal 102994
zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm
z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C
z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_
z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1
z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw=
zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW<
zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~(
zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP
zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ
zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k
z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O
za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S
zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^
z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w|
z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH
z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$-
zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^
zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB
zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd
zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R
zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT
zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47
z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G
zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6
z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M?
z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ
z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv
z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En
zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe
zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t|
z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~
zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U-
zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem
zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr
za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY
z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH
zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N
z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo
zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T&
z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF
zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJ