35 changed files with 1544 additions and 806 deletions
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Binary file not shown.
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"file_generated_by": "FlutterFire CLI", |
||||
|
"purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", |
||||
|
"GOOGLE_APP_ID": "1:280510379185:ios:52af12a619d5443119de90", |
||||
|
"FIREBASE_PROJECT_ID": "teso-ghana", |
||||
|
"GCM_SENDER_ID": "280510379185" |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
// File generated by FlutterFire CLI. |
||||
|
// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members |
||||
|
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; |
||||
|
import 'package:flutter/foundation.dart' |
||||
|
show defaultTargetPlatform, kIsWeb, TargetPlatform; |
||||
|
|
||||
|
/// Default [FirebaseOptions] for use with your Firebase apps. |
||||
|
/// |
||||
|
/// Example: |
||||
|
/// ```dart |
||||
|
/// import 'firebase_options.dart'; |
||||
|
/// // ... |
||||
|
/// await Firebase.initializeApp( |
||||
|
/// options: DefaultFirebaseOptions.currentPlatform, |
||||
|
/// ); |
||||
|
/// ``` |
||||
|
class DefaultFirebaseOptions { |
||||
|
static FirebaseOptions get currentPlatform { |
||||
|
if (kIsWeb) { |
||||
|
throw UnsupportedError( |
||||
|
'DefaultFirebaseOptions have not been configured for web - ' |
||||
|
'you can reconfigure this by running the FlutterFire CLI again.', |
||||
|
); |
||||
|
} |
||||
|
switch (defaultTargetPlatform) { |
||||
|
case TargetPlatform.android: |
||||
|
return android; |
||||
|
case TargetPlatform.iOS: |
||||
|
return ios; |
||||
|
case TargetPlatform.macOS: |
||||
|
throw UnsupportedError( |
||||
|
'DefaultFirebaseOptions have not been configured for macos - ' |
||||
|
'you can reconfigure this by running the FlutterFire CLI again.', |
||||
|
); |
||||
|
case TargetPlatform.windows: |
||||
|
throw UnsupportedError( |
||||
|
'DefaultFirebaseOptions have not been configured for windows - ' |
||||
|
'you can reconfigure this by running the FlutterFire CLI again.', |
||||
|
); |
||||
|
case TargetPlatform.linux: |
||||
|
throw UnsupportedError( |
||||
|
'DefaultFirebaseOptions have not been configured for linux - ' |
||||
|
'you can reconfigure this by running the FlutterFire CLI again.', |
||||
|
); |
||||
|
default: |
||||
|
throw UnsupportedError( |
||||
|
'DefaultFirebaseOptions are not supported for this platform.', |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static const FirebaseOptions android = FirebaseOptions( |
||||
|
apiKey: 'AIzaSyAHBguF6oqPEq7em1vLrh_NP2LoPuabe6o', |
||||
|
appId: '1:280510379185:android:b778de8dca1cf49219de90', |
||||
|
messagingSenderId: '280510379185', |
||||
|
projectId: 'teso-ghana', |
||||
|
databaseURL: 'https://teso-ghana-default-rtdb.firebaseio.com', |
||||
|
storageBucket: 'teso-ghana.appspot.com', |
||||
|
); |
||||
|
|
||||
|
static const FirebaseOptions ios = FirebaseOptions( |
||||
|
apiKey: 'AIzaSyCBDtZO2_Z5JjrNj1TocK6YAlk_wDbzZHs', |
||||
|
appId: '1:280510379185:ios:52af12a619d5443119de90', |
||||
|
messagingSenderId: '280510379185', |
||||
|
projectId: 'teso-ghana', |
||||
|
databaseURL: 'https://teso-ghana-default-rtdb.firebaseio.com', |
||||
|
storageBucket: 'teso-ghana.appspot.com', |
||||
|
androidClientId: '280510379185-0shp8sia3i5m589bov645t3kuddb1032.apps.googleusercontent.com', |
||||
|
iosClientId: '280510379185-67vianhh973klriv75ip2tb9cf8ibitl.apps.googleusercontent.com', |
||||
|
iosBundleId: 'com.tesoapp', |
||||
|
); |
||||
|
} |
@ -0,0 +1,232 @@ |
|||||
|
// import 'dart:math' as math; |
||||
|
// import 'package:flutter/material.dart'; |
||||
|
|
||||
|
// @immutable |
||||
|
// class ExpandableFab extends StatefulWidget { |
||||
|
// const ExpandableFab({ |
||||
|
// super.key, |
||||
|
// this.initialOpen, |
||||
|
// required this.distance, |
||||
|
// required this.children, |
||||
|
// }); |
||||
|
|
||||
|
// final bool? initialOpen; |
||||
|
// final double distance; |
||||
|
// final List<Widget> children; |
||||
|
|
||||
|
// @override |
||||
|
// _ExpandableFabState createState() => _ExpandableFabState(); |
||||
|
// } |
||||
|
|
||||
|
// class _ExpandableFabState extends State<ExpandableFab> |
||||
|
// with SingleTickerProviderStateMixin { |
||||
|
// late final AnimationController _controller; |
||||
|
// late final Animation<double> _expandAnimation; |
||||
|
// bool _open = false; |
||||
|
|
||||
|
// @override |
||||
|
// void initState() { |
||||
|
// super.initState(); |
||||
|
// _open = widget.initialOpen ?? false; |
||||
|
// _controller = AnimationController( |
||||
|
// value: _open ? 1.0 : 0.0, |
||||
|
// duration: const Duration(milliseconds: 250), |
||||
|
// vsync: this, |
||||
|
// ); |
||||
|
// _expandAnimation = CurvedAnimation( |
||||
|
// curve: Curves.fastOutSlowIn, |
||||
|
// reverseCurve: Curves.easeOutQuad, |
||||
|
// parent: _controller, |
||||
|
// ); |
||||
|
// } |
||||
|
|
||||
|
// @override |
||||
|
// void dispose() { |
||||
|
// _controller.dispose(); |
||||
|
// super.dispose(); |
||||
|
// } |
||||
|
|
||||
|
// void _toggle() { |
||||
|
// setState(() { |
||||
|
// _open = !_open; |
||||
|
// if (_open) { |
||||
|
// _controller.forward(); |
||||
|
// } else { |
||||
|
// _controller.reverse(); |
||||
|
// } |
||||
|
// }); |
||||
|
// } |
||||
|
|
||||
|
// @override |
||||
|
// Widget build(BuildContext context) { |
||||
|
// return SizedBox.expand( |
||||
|
// child: Stack( |
||||
|
// alignment: Alignment.bottomRight, |
||||
|
// clipBehavior: Clip.none, |
||||
|
// children: [ |
||||
|
// _buildTapToCloseFab(), |
||||
|
// ..._buildExpandingActionButtons(), |
||||
|
// _buildTapToOpenFab(), |
||||
|
// ], |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
|
||||
|
// Widget _buildTapToCloseFab() { |
||||
|
// return SizedBox( |
||||
|
// width: 56.0, |
||||
|
// height: 56.0, |
||||
|
// child: Center( |
||||
|
// child: Material( |
||||
|
// shape: const CircleBorder(), |
||||
|
// clipBehavior: Clip.antiAlias, |
||||
|
// elevation: 4.0, |
||||
|
// child: InkWell( |
||||
|
// onTap: _toggle, |
||||
|
// child: Padding( |
||||
|
// padding: const EdgeInsets.all(8.0), |
||||
|
// child: Icon( |
||||
|
// Icons.close, |
||||
|
// color: Theme.of(context).primaryColor, |
||||
|
// ), |
||||
|
// ), |
||||
|
// ), |
||||
|
// ), |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
|
||||
|
// List<Widget> _buildExpandingActionButtons() { |
||||
|
// final children = <Widget>[]; |
||||
|
// final count = widget.children.length; |
||||
|
// final step = 90.0 / (count - 1); |
||||
|
// for (var i = 0, angleInDegrees = 0.0; |
||||
|
// i < count; |
||||
|
// i++, angleInDegrees += step) { |
||||
|
// children.add( |
||||
|
// _ExpandingActionButton( |
||||
|
// directionInDegrees: angleInDegrees, |
||||
|
// maxDistance: widget.distance, |
||||
|
// progress: _expandAnimation, |
||||
|
// child: widget.children[i], |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
// return children; |
||||
|
// } |
||||
|
|
||||
|
// Widget _buildTapToOpenFab() { |
||||
|
// return IgnorePointer( |
||||
|
// ignoring: _open, |
||||
|
// child: AnimatedContainer( |
||||
|
// transformAlignment: Alignment.center, |
||||
|
// transform: Matrix4.diagonal3Values( |
||||
|
// _open ? 0.7 : 1.0, |
||||
|
// _open ? 0.7 : 1.0, |
||||
|
// 1.0, |
||||
|
// ), |
||||
|
// duration: const Duration(milliseconds: 250), |
||||
|
// curve: const Interval(0.0, 0.5, curve: Curves.easeOut), |
||||
|
// child: AnimatedOpacity( |
||||
|
// opacity: _open ? 0.0 : 1.0, |
||||
|
// curve: const Interval(0.25, 1.0, curve: Curves.easeInOut), |
||||
|
// duration: const Duration(milliseconds: 250), |
||||
|
// child: FloatingActionButton( |
||||
|
// onPressed: _toggle, |
||||
|
// child: const Icon(Icons.create), |
||||
|
// ), |
||||
|
// ), |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
// } |
||||
|
|
||||
|
// @immutable |
||||
|
// class _ExpandingActionButton extends StatelessWidget { |
||||
|
// const _ExpandingActionButton({ |
||||
|
// required this.directionInDegrees, |
||||
|
// required this.maxDistance, |
||||
|
// required this.progress, |
||||
|
// required this.child, |
||||
|
// }); |
||||
|
|
||||
|
// final double directionInDegrees; |
||||
|
// final double maxDistance; |
||||
|
// final Animation<double> progress; |
||||
|
// final Widget child; |
||||
|
|
||||
|
// @override |
||||
|
// Widget build(BuildContext context) { |
||||
|
// return AnimatedBuilder( |
||||
|
// animation: progress, |
||||
|
// builder: (context, child) { |
||||
|
// final offset = Offset.fromDirection( |
||||
|
// directionInDegrees * (math.pi / 180.0), |
||||
|
// progress.value * maxDistance, |
||||
|
// ); |
||||
|
// return Positioned( |
||||
|
// right: 4.0 + offset.dx, |
||||
|
// bottom: 4.0 + offset.dy, |
||||
|
// child: Transform.rotate( |
||||
|
// angle: (1.0 - progress.value) * math.pi / 2, |
||||
|
// child: child!, |
||||
|
// ), |
||||
|
// ); |
||||
|
// }, |
||||
|
// child: FadeTransition( |
||||
|
// opacity: progress, |
||||
|
// child: child, |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
// } |
||||
|
|
||||
|
// @immutable |
||||
|
// class ActionButton extends StatelessWidget { |
||||
|
// const ActionButton({ |
||||
|
// super.key, |
||||
|
// this.onPressed, |
||||
|
// required this.icon, |
||||
|
// }); |
||||
|
|
||||
|
// final VoidCallback? onPressed; |
||||
|
// final Widget icon; |
||||
|
|
||||
|
// @override |
||||
|
// Widget build(BuildContext context) { |
||||
|
// final theme = Theme.of(context); |
||||
|
// return Material( |
||||
|
// shape: const CircleBorder(), |
||||
|
// clipBehavior: Clip.antiAlias, |
||||
|
// color: theme.colorScheme.secondary, |
||||
|
// elevation: 4.0, |
||||
|
// child: IconButton( |
||||
|
// onPressed: onPressed, |
||||
|
// icon: icon, |
||||
|
// color: theme.colorScheme.secondary, |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
// } |
||||
|
|
||||
|
// @immutable |
||||
|
// class FakeItem extends StatelessWidget { |
||||
|
// const FakeItem({ |
||||
|
// super.key, |
||||
|
// required this.isBig, |
||||
|
// }); |
||||
|
|
||||
|
// final bool isBig; |
||||
|
|
||||
|
// @override |
||||
|
// Widget build(BuildContext context) { |
||||
|
// return Container( |
||||
|
// margin: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 24.0), |
||||
|
// height: isBig ? 128.0 : 36.0, |
||||
|
// decoration: BoxDecoration( |
||||
|
// borderRadius: const BorderRadius.all(Radius.circular(8.0)), |
||||
|
// color: Colors.grey.shade300, |
||||
|
// ), |
||||
|
// ); |
||||
|
// } |
||||
|
// } |
Loading…
Reference in new issue