This commit is contained in:
Christien Rioux 2023-07-26 22:38:09 -04:00
parent 9fa1666e8b
commit f754f7d5ed
27 changed files with 655 additions and 289 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View File

@ -1,41 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1003 187" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,0.352497,-60.1919,-339.48)">
<rect id="Artboard1" x="60.192" y="963.071" width="1002.92" height="528.331" style="fill:none;"/>
<g id="Artboard11" serif:id="Artboard1">
<g transform="matrix(12.4032,0,0,35.1866,98.2148,1359.83)">
<g transform="matrix(7.73995,0,0,7.73995,0,-8.88178e-16)">
<path d="M0.375,-0L0,-0.375L0,-1L0.25,-1L0.25,-0.5L0.5,-0.25L0.75,-0.5L0.75,-1L1,-1L1,-0.375L0.625,-0L0.375,-0Z" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,8.51093,-8.88178e-16)">
<path d="M0,-0L0,-1L1,-1L1,-0.75L0.25,-0.75L0.25,-0.625L1,-0.625L1,-0.375L0.25,-0.375L0.25,-0.25L1,-0.25L1,-0L0,-0Z" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,17.0219,-8.88178e-16)">
<rect x="0" y="-1" width="0.25" height="1" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,19.7278,-8.88178e-16)">
<path d="M0,-0L0,-1L0.25,-1L0.25,-0.25L1,-0.25L1,-0L0,-0Z" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,28.2387,-8.88178e-16)">
<rect x="0" y="-1" width="0.25" height="1" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,30.9447,-8.88178e-16)">
<path d="M0.688,-0.25L0.75,-0.313L0.75,-0.688L0.688,-0.75L0.25,-0.75L0.25,-0.25L0.688,-0.25ZM0,-0L0,-1L0.875,-1L1,-0.875L1,-0.125L0.875,-0L0,-0Z" style="fill:rgb(242,89,201);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,39.4556,-8.88178e-16)">
<path d="M0,-0L0,-1L1,-1L1,-0.75L0.25,-0.75L0.25,-0.25L1,-0.25L1,-0L0,-0Z" style="fill:rgb(58,162,232);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,47.9665,-8.88178e-16)">
<path d="M0,-0L0,-1L0.25,-1L0.25,-0.625L0.75,-0.625L0.75,-1L1,-1L1,-0L0.75,-0L0.75,-0.375L0.25,-0.375L0.25,-0L0,-0Z" style="fill:rgb(58,162,232);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,56.4775,-8.88178e-16)">
<path d="M0.75,-0.625L0.75,-0.75L0.25,-0.75L0.25,-0.625L0.75,-0.625ZM0,-0L0,-1L1,-1L1,-0L0.75,-0L0.75,-0.375L0.25,-0.375L0.25,-0L0,-0Z" style="fill:rgb(58,162,232);fill-rule:nonzero;"/>
</g>
<g transform="matrix(7.73995,0,0,7.73995,64.9884,-8.88178e-16)">
<path d="M0.375,-0L0.375,-0.75L0,-0.75L0,-1L1,-1L1,-0.75L0.625,-0.75L0.625,-0L0.375,-0Z" style="fill:rgb(58,162,232);fill-rule:nonzero;"/>
</g>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1257 259" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Artboard1" x="-0" y="-0" width="1256.12" height="258.66" style="fill:none;"/><g id="Artboard11" serif:id="Artboard1"><g transform="matrix(17.2266,0,0,17.2266,1.66215,194.243)"><g transform="matrix(7.73995,0,0,7.73995,0,-8.88178e-16)"><path d="M0.375,-0l-0.375,-0.375l0,-0.625l0.25,0l0,0.5l0.25,0.25l0.25,-0.25l0,-0.5l0.25,0l0,0.625l-0.375,0.375l-0.25,-0Z" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,8.51093,-8.88178e-16)"><path d="M0,-0l0,-1l1,0l0,0.25l-0.75,0l0,0.125l0.75,0l0,0.25l-0.75,0l0,0.125l0.75,0l0,0.25l-1,-0Z" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,17.0219,-8.88178e-16)"><rect x="0" y="-1" width="0.25" height="1" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,19.7278,-8.88178e-16)"><path d="M0,-0l0,-1l0.25,0l0,0.75l0.75,0l0,0.25l-1,-0Z" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,28.2387,-8.88178e-16)"><rect x="0" y="-1" width="0.25" height="1" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,30.9447,-8.88178e-16)"><path d="M0.688,-0.25l0.062,-0.063l0,-0.375l-0.063,-0.062l-0.437,0l-0,0.5l0.437,0Zm-0.687,0.25l0,-1l0.875,0l0.125,0.125l0,0.75l-0.125,0.125l-0.875,-0Z" style="fill:#f259c9;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,39.4556,-8.88178e-16)"><path d="M0,-0l0,-1l1,0l0,0.25l-0.75,0l0,0.5l0.75,0l0,0.25l-1,-0Z" style="fill:#3aa2e8;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,47.9665,-8.88178e-16)"><path d="M0,-0l0,-1l0.25,0l0,0.375l0.5,0l0,-0.375l0.25,0l0,1l-0.25,-0l0,-0.375l-0.5,0l0,0.375l-0.25,-0Z" style="fill:#3aa2e8;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,56.4775,-8.88178e-16)"><path d="M0.75,-0.625l0,-0.125l-0.5,0l0,0.125l0.5,0Zm-0.75,0.625l0,-1l1,0l0,1l-0.25,-0l0,-0.375l-0.5,0l0,0.375l-0.25,-0Z" style="fill:#3aa2e8;fill-rule:nonzero;"/></g><g transform="matrix(7.73995,0,0,7.73995,64.9884,-8.88178e-16)"><path d="M0.375,-0l0,-0.75l-0.375,0l0,-0.25l1,0l0,0.25l-0.375,0l0,0.75l-0.25,-0Z" style="fill:#3aa2e8;fill-rule:nonzero;"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Binary file not shown.

View File

@ -1,122 +1,122 @@
{
"images" : [
"images": [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"filename": "Icon-App-20x20@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "20x20"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
"filename": "Icon-App-20x20@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "20x20"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"filename": "Icon-App-29x29@1x.png",
"idiom": "iphone",
"scale": "1x",
"size": "29x29"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"filename": "Icon-App-29x29@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "29x29"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
"filename": "Icon-App-29x29@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "29x29"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"filename": "Icon-App-40x40@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "40x40"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
"filename": "Icon-App-40x40@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "40x40"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
"filename": "Icon-App-60x60@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "60x60"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
"filename": "Icon-App-60x60@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "60x60"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
"filename": "Icon-App-20x20@1x.png",
"idiom": "ipad",
"scale": "1x",
"size": "20x20"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"filename": "Icon-App-20x20@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "20x20"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"filename": "Icon-App-29x29@1x.png",
"idiom": "ipad",
"scale": "1x",
"size": "29x29"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"filename": "Icon-App-29x29@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "29x29"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
"filename": "Icon-App-40x40@1x.png",
"idiom": "ipad",
"scale": "1x",
"size": "40x40"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"filename": "Icon-App-40x40@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "40x40"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
"filename": "Icon-App-76x76@1x.png",
"idiom": "ipad",
"scale": "1x",
"size": "76x76"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
"filename": "Icon-App-76x76@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "76x76"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
"filename": "Icon-App-83.5x83.5@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "83.5x83.5"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
"filename": "Icon-App-1024x1024@1x.png",
"idiom": "ios-marketing",
"scale": "1x",
"size": "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"info": {
"author": "icons_launcher",
"version": 1
}
}
}

View File

@ -1,3 +1,4 @@
import 'package:awesome_extensions/awesome_extensions.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_translate/flutter_translate.dart';
@ -12,8 +13,9 @@ class DefaultAppBar extends AppBar {
decoration: BoxDecoration(
color: Colors.black.withAlpha(32),
shape: BoxShape.circle),
child: SvgPicture.asset('assets/images/vlogo.svg',
height: 48)),
child:
SvgPicture.asset('assets/images/vlogo.svg', height: 32)
.paddingAll(4)),
actions: (actions ?? <Widget>[])
..add(
IconButton(

View File

@ -24,7 +24,7 @@ _$_Identity _$$_IdentityFromJson(Map<String, dynamic> json) => _$_Identity(
json['account_records'] as Map<String, dynamic>,
(value) => value as String,
(value) => ISet<AccountRecordInfo>.fromJson(
value, AccountRecordInfo.fromJson)),
value, (value) => AccountRecordInfo.fromJson(value))),
);
Map<String, dynamic> _$$_IdentityToJson(_$_Identity instance) =>

View File

@ -24,7 +24,7 @@ Map<String, dynamic> _$$_UserLoginToJson(_$_UserLogin instance) =>
_$_ActiveLogins _$$_ActiveLoginsFromJson(Map<String, dynamic> json) =>
_$_ActiveLogins(
userLogins: IList<UserLogin>.fromJson(
json['user_logins'], UserLogin.fromJson),
json['user_logins'], (value) => UserLogin.fromJson(value)),
activeUserLogin: json['active_user_login'] == null
? null
: Typed<FixedEncodedString43>.fromJson(json['active_user_login']),

View File

@ -1,26 +1,310 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:signal_strength_indicator/signal_strength_indicator.dart';
class HomePage extends ConsumerWidget {
import '../tools/tools.dart';
class HomePage extends ConsumerStatefulWidget {
const HomePage({super.key});
static const path = '/home';
@override
Widget build(BuildContext context, WidgetRef ref) => Scaffold(
appBar: AppBar(title: const Text('VeilidChat')),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Home Page'),
// ElevatedButton(
// onPressed: () {
// ref.watch(authNotifierProvider.notifier).logout();
// },
// child: const Text("Logout"),
// ),
],
),
),
);
HomePageState createState() => HomePageState();
}
class HomePageState extends ConsumerState<HomePage>
with TickerProviderStateMixin {
final _unfocusNode = FocusNode();
final scaffoldKey = GlobalKey<ScaffoldState>();
bool hasContainerTriggered = false;
final animationsMap = {
'containerOnActionTriggerAnimation': AnimationInfo(
trigger: AnimationTrigger.onActionTrigger,
applyInitialState: false,
effects: [
MoveEffect(
curve: Curves.bounceOut,
delay: 0.ms,
duration: 500.ms,
begin: const Offset(100, 0),
end: Offset.zero,
),
],
),
};
@override
void initState() {
super.initState();
// // On page load action.
// SchedulerBinding.instance.addPostFrameCallback((_) async {
// await actions.initialize(
// context,
// );
// });
setupAnimations(
animationsMap.values.where((anim) =>
anim.trigger == AnimationTrigger.onActionTrigger ||
!anim.applyInitialState),
this,
);
WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {}));
}
@override
void dispose() {
_unfocusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) => Scaffold(
key: scaffoldKey,
appBar: AppBar(title: const Text('VeilidChat')),
body: SafeArea(
child: GestureDetector(
onTap: () => FocusScope.of(context).requestFocus(_unfocusNode),
child: Stack(
children: [
if (responsiveVisibility(
context: context,
phone: false,
))
Align(
alignment: AlignmentDirectional.centerEnd,
child: Container(
width: MediaQuery.of(context).size.width * 0.66,
height: double.infinity,
decoration: BoxDecoration(
color: Theme.of(context).scaffoldBackgroundColor,
),
child: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: double.infinity,
height: 56,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(0),
),
child: Align(
alignment: AlignmentDirectional.centerStart,
child: Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(
16, 0, 16, 0),
child: Text(
"current contact",
// getJsonField(
// FFAppState().CurrentContact,
// r'''$.name''',
// ).toString(),
textAlign: TextAlign.start,
// style: Theme.of(context)
// .textTheme....
// .override(
// fontFamily: 'Noto Sans',
// color: FlutterFlowTheme.of(context)
// .header,
// ),
),
),
),
),
Expanded(
child: Container(
width: double.infinity,
height: 100,
decoration: const BoxDecoration(),
child: ChatComponentWidget(),
),
),
],
),
),
// if (FFAppState().CurrentContact == null)
// Container(
// width: double.infinity,
// height: double.infinity,
// decoration: const BoxDecoration(),
// child: NoContactComponentWidget(),
// ),
],
),
).animateOnActionTrigger(
animationsMap['containerOnActionTriggerAnimation']!,
hasBeenTriggered: hasContainerTriggered),
),
if (responsiveVisibility(
context: context,
phone: false,
))
Material(
color: Colors.transparent,
elevation: 4,
child: Container(
width: MediaQuery.of(context).size.width * 0.34,
height: double.infinity,
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * 0.34,
),
decoration: BoxDecoration(
color: Theme.of(context).scaffoldBackgroundColor,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
width: double.infinity,
height: 56,
decoration: BoxDecoration(
color: Theme.of(context).secondaryHeaderColor,
borderRadius: BorderRadius.circular(0),
),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
16, 8, 16, 8),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
'Contacts',
textAlign: TextAlign.start,
// style: Theme.of(context).dialogTheme.titleTextStyle
// .title2
// .override(
// fontFamily: 'Noto Sans',
// color: FlutterFlowTheme.of(context)
// .header,
// ),
),
),
),
SignalStrengthIndicator.bars(
value: .5, //_signalStrength,
size: 50,
barCount: 5,
),
],
),
),
),
Expanded(
child: Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 0,
color: Color(0x33000000),
offset: Offset(0, 0),
)
],
),
child: ContactListComponentWidget(),
),
),
],
),
),
),
if (responsiveVisibility(
context: context,
tablet: false,
tabletLandscape: false,
desktop: false,
))
Material(
color: Colors.transparent,
elevation: 4,
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: Theme.of(context).scaffoldBackgroundColor,
),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
width: double.infinity,
height: 56,
decoration: BoxDecoration(
//color: Theme.of(context).secondaryColor,
borderRadius: BorderRadius.circular(0),
),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
16, 8, 16, 8),
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Align(
alignment:
const AlignmentDirectional(-1, 0),
child: Text(
'Contacts',
textAlign: TextAlign.start,
// style: FlutterFlowTheme.of(context)
// .title2
// .override(
// fontFamily: 'Noto Sans',
// color: FlutterFlowTheme.of(context)
// .header,
// ),
),
),
),
SignalStrengthIndicator.bars(
value: .5, //_signalStrength,
size: 50,
barCount: 5,
),
],
),
),
),
Expanded(
child: Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 0,
color: Color(0x33000000),
offset: Offset(0, 0),
)
],
),
child: ContactListComponentWidget(),
),
),
],
),
),
),
],
),
),
));
}

View File

@ -114,8 +114,11 @@ class NewAccountPageState extends ConsumerState<NewAccountPage> {
enableTitleBar(true);
portraitOnly();
// final localAccountsData = ref.watch(localAccountsProvider);
final displayModalHUD = isInAsyncCall; // || !localAccountsData.hasValue;
final localAccounts = ref.watch(localAccountsProvider);
final logins = ref.watch(loginsProvider);
final displayModalHUD =
isInAsyncCall || !localAccounts.hasValue || !logins.hasValue;
return Scaffold(
// resizeToAvoidBottomInset: false,

View File

@ -6,7 +6,7 @@ part of 'local_accounts.dart';
// RiverpodGenerator
// **************************************************************************
String _$localAccountsHash() => r'37ed2ab40b6ed9063c7d1d00f067b7006c9a7670';
String _$localAccountsHash() => r'f69de269e15fabb83d1afbb7fdb6eb7693d0ce24';
/// See also [LocalAccounts].
@ProviderFor(LocalAccounts)

View File

@ -6,7 +6,7 @@ part of 'logins.dart';
// RiverpodGenerator
// **************************************************************************
String _$loginsHash() => r'cf7f1a2343340a4dc4ebfa4009e846d0a39c0167';
String _$loginsHash() => r'ed9dbe91a248f662ccb0fac6edf5b1892cf2ef92';
/// See also [Logins].
@ProviderFor(Logins)

View File

@ -37,9 +37,13 @@ class RouterNotifier extends _$RouterNotifier implements Listenable {
return null;
}
// No matter where we are, if there's not
switch (state.location) {
case IndexPage.path:
return hasAnyAccount ? HomePage.path : NewAccountPage.path;
case NewAccountPage.path:
return hasAnyAccount ? HomePage.path : null;
default:
return hasAnyAccount ? null : NewAccountPage.path;
}

View File

@ -6,7 +6,7 @@ part of 'router_notifier.dart';
// RiverpodGenerator
// **************************************************************************
String _$routerNotifierHash() => r'00de1dd715945e96b49507ea55d7b97a78366adc';
String _$routerNotifierHash() => r'ef31219dde5e12b2bb224c79ca13ab4f414c81b4';
/// See also [RouterNotifier].
@ProviderFor(RouterNotifier)

98
lib/tools/animations.dart Normal file
View File

@ -0,0 +1,98 @@
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
enum AnimationTrigger {
onPageLoad,
onActionTrigger,
}
class AnimationInfo {
AnimationInfo({
required this.trigger,
required this.effects,
this.loop = false,
this.reverse = false,
this.applyInitialState = true,
});
final AnimationTrigger trigger;
final List<Effect<dynamic>> effects;
final bool applyInitialState;
final bool loop;
final bool reverse;
late Adapter adapter;
late AnimationController controller;
}
void createAnimation(AnimationInfo animation, TickerProvider vsync) {
final newController = AnimationController(vsync: vsync);
animation
..controller = newController
..adapter = (ValueAdapter(0)..attach(newController));
}
void setupAnimations(Iterable<AnimationInfo> animations, TickerProvider vsync) {
for (final animation in animations) {
createAnimation(animation, vsync);
}
}
extension AnimatedWidgetExtension on Widget {
Widget animateOnPageLoad(AnimationInfo animationInfo) => Animate(
controller:
animationInfo.applyInitialState ? null : animationInfo.controller,
adapter: animationInfo.applyInitialState ? null : animationInfo.adapter,
effects: animationInfo.effects,
child: this,
onPlay: (controller) => animationInfo.loop
? controller.repeat(reverse: animationInfo.reverse)
: null,
onComplete: (controller) => !animationInfo.loop && animationInfo.reverse
? controller.reverse()
: null);
Widget animateOnActionTrigger(
AnimationInfo animationInfo, {
bool hasBeenTriggered = false,
}) =>
hasBeenTriggered || animationInfo.applyInitialState
? Animate(
controller: animationInfo.controller,
adapter: animationInfo.adapter,
effects: animationInfo.effects,
child: this)
: this;
}
class TiltEffect extends Effect<Offset> {
const TiltEffect({
super.delay,
super.duration,
super.curve,
Offset? begin,
Offset? end,
}) : super(
begin: begin ?? Offset.zero,
end: end ?? Offset.zero,
);
@override
Widget build(
BuildContext context,
Widget child,
AnimationController controller,
EffectEntry entry,
) {
final animation = buildAnimation(controller, entry);
return getOptimizedBuilder<Offset>(
animation: animation,
builder: (_, __) => Transform(
transform: Matrix4.identity()
..setEntry(3, 2, 0.001)
..rotateX(animation.value.dx)
..rotateY(animation.value.dy),
alignment: Alignment.center,
child: child,
),
);
}
}

32
lib/tools/responsive.dart Normal file
View File

@ -0,0 +1,32 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
bool get isAndroid => !kIsWeb && Platform.isAndroid;
bool get isiOS => !kIsWeb && Platform.isIOS;
bool get isWeb => kIsWeb;
const kMobileWidthCutoff = 479.0;
bool isMobileWidth(BuildContext context) =>
MediaQuery.of(context).size.width < kMobileWidthCutoff;
bool responsiveVisibility({
required BuildContext context,
bool phone = true,
bool tablet = true,
bool tabletLandscape = true,
bool desktop = true,
}) {
final width = MediaQuery.of(context).size.width;
if (width < kMobileWidthCutoff) {
return phone;
} else if (width < 767) {
return tablet;
} else if (width < 991) {
return tabletLandscape;
} else {
return desktop;
}
}

View File

@ -1,6 +1,8 @@
export 'animations.dart';
export 'desktop_control.dart';
export 'external_stream_state.dart';
export 'json_tools.dart';
export 'phono_byte.dart';
export 'protobuf_tools.dart';
export 'responsive.dart';
export 'widget_helpers.dart';

View File

@ -6,7 +6,7 @@ part of 'veilid_init.dart';
// RiverpodGenerator
// **************************************************************************
String _$veilidInstanceHash() => r'6086fc1e7a83e7af81ee05ee84954507d38cb748';
String _$veilidInstanceHash() => r'cca5cf288bafc4a051a1713e285f4c1d3ef4b680';
/// See also [veilidInstance].
@ProviderFor(veilidInstance)

View File

@ -423,6 +423,7 @@
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
@ -560,6 +561,7 @@
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
@ -591,6 +593,7 @@
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";

View File

@ -1,68 +1,68 @@
{
"info": {
"version": 1,
"author": "xcode"
"images": [
{
"filename": "app_icon_16.png",
"idiom": "mac",
"scale": "1x",
"size": "16x16"
},
"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"
}
]
{
"filename": "app_icon_32.png",
"idiom": "mac",
"scale": "2x",
"size": "16x16"
},
{
"filename": "app_icon_32.png",
"idiom": "mac",
"scale": "1x",
"size": "32x32"
},
{
"filename": "app_icon_64.png",
"idiom": "mac",
"scale": "2x",
"size": "32x32"
},
{
"filename": "app_icon_128.png",
"idiom": "mac",
"scale": "1x",
"size": "128x128"
},
{
"filename": "app_icon_256.png",
"idiom": "mac",
"scale": "2x",
"size": "128x128"
},
{
"filename": "app_icon_256.png",
"idiom": "mac",
"scale": "1x",
"size": "256x256"
},
{
"filename": "app_icon_512.png",
"idiom": "mac",
"scale": "2x",
"size": "256x256"
},
{
"filename": "app_icon_512.png",
"idiom": "mac",
"scale": "1x",
"size": "512x512"
},
{
"filename": "app_icon_1024.png",
"idiom": "mac",
"scale": "2x",
"size": "512x512"
}
],
"info": {
"author": "icons_launcher",
"version": 1
}
}

View File

@ -374,6 +374,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_animate:
dependency: "direct main"
description:
name: flutter_animate
sha256: "62f346340a96192070e31e3f2a1bd30a28530f1fe8be978821e06cd56b74d6d2"
url: "https://pub.dev"
source: hosted
version: "4.2.0+1"
flutter_blurhash:
dependency: transitive
description:
@ -406,14 +414,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.18.6"
flutter_launcher_icons:
dependency: "direct dev"
description:
name: flutter_launcher_icons
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
url: "https://pub.dev"
source: hosted
version: "0.13.1"
flutter_localizations:
dependency: "direct main"
description: flutter
@ -557,6 +557,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.2"
icons_launcher:
dependency: "direct dev"
description:
name: icons_launcher
sha256: af05397792f6d82b93375a8a0253b8db0d3f816ef1dd1bf5c35cbab55321d327
url: "https://pub.dev"
source: hosted
version: "2.1.3"
image:
dependency: transitive
description:
@ -949,6 +957,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.4"
signal_strength_indicator:
dependency: "direct main"
description:
name: signal_strength_indicator
sha256: "076f84fbffc69694f0df3d376822d806cc0de67d379aa57ebcdab09384ab839b"
url: "https://pub.dev"
source: hosted
version: "0.4.1"
sky_engine:
dependency: transitive
description: flutter

View File

@ -22,6 +22,7 @@ dependencies:
fixnum: ^1.1.0
flutter:
sdk: flutter
flutter_animate: ^4.2.0+1
flutter_form_builder: ^9.1.0
flutter_hooks: ^0.18.0
flutter_localizations:
@ -45,6 +46,7 @@ dependencies:
reorderable_grid: ^1.0.7
riverpod_annotation: ^2.1.1
shared_preferences: ^2.0.15
signal_strength_indicator: ^0.4.1
uuid: ^3.0.7
veilid:
# veilid: ^0.0.1
@ -53,29 +55,29 @@ dependencies:
dev_dependencies:
build_runner: ^2.4.6
flutter_launcher_icons: "^0.13.1"
flutter_test:
sdk: flutter
freezed: ^2.3.5
icons_launcher: ^2.1.3
json_serializable: ^6.7.1
lint_hard: ^4.0.0
riverpod_generator: ^2.2.3
flutter_launcher_icons:
icons_launcher:
image_path: "assets/launcher/icon.png"
android: true
ios: true
remove_alpha_ios: true
min_sdk_android: 24 # android min sdk min:16, default 21
web:
generate: true
background_color: "#33183f"
theme_color: "#863fa6"
windows:
generate: true
icon_size: 48 # min:48, max:256, default: 48
macos:
generate: true
platforms:
android:
enable: true
ios:
enable: true
web:
enable: true
macos:
enable: true
windows:
enable: true
linux:
enable: true
flutter:
uses-material-design: true

View File

@ -0,0 +1,8 @@
[Desktop Entry]
Name=Flutter Linux App
Comment=Flutter Linux launcher icon
Exec=app_icon
Icon=app_icon.png
Terminal=false
Type=Application
Categories=Entertainment;

BIN
snap/gui/app_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -1,2 +1,3 @@
#!/bin/bash
dart run flutter_launcher_icons
flutter pub get
dart run icons_launcher:create

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 85 KiB