feat: Initialize project

This commit is contained in:
Yaël Perret
2024-10-21 22:03:17 +02:00
parent aefa3309d0
commit e722368fa6
404 changed files with 43535 additions and 2 deletions

View File

@@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:bahla_front/ui/common/app_colors.dart';
import 'package:bahla_front/ui/common/ui_helpers.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'notice_sheet_model.dart';
class NoticeSheet extends StackedView<NoticeSheetModel> {
final Function(SheetResponse)? completer;
final SheetRequest request;
const NoticeSheet({
Key? key,
required this.completer,
required this.request,
}) : super(key: key);
@override
Widget builder(
BuildContext context,
NoticeSheetModel viewModel,
Widget? child,
) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
request.title!,
style: const TextStyle(fontSize: 25, fontWeight: FontWeight.w900),
),
verticalSpaceTiny,
Text(
request.description!,
style: const TextStyle(fontSize: 14, color: kcMediumGrey),
maxLines: 3,
softWrap: true,
),
verticalSpaceLarge,
],
),
);
}
@override
NoticeSheetModel viewModelBuilder(BuildContext context) => NoticeSheetModel();
}

View File

@@ -0,0 +1,3 @@
import 'package:stacked/stacked.dart';
class NoticeSheetModel extends BaseViewModel {}

View File

@@ -0,0 +1,9 @@
import 'package:flutter/material.dart';
const Color kcPrimaryColor = Color(0xFF9600FF);
const Color kcPrimaryColorDark = Color(0xFF300151);
const Color kcDarkGreyColor = Color(0xFF1A1B1E);
const Color kcMediumGrey = Color(0xFF474A54);
const Color kcLightGrey = Color.fromARGB(255, 187, 187, 187);
const Color kcVeryLightGrey = Color(0xFFE3E3E3);
const Color kcBackgroundColor = kcDarkGreyColor;

View File

@@ -0,0 +1,3 @@
const String ksHomeBottomSheetTitle = 'Build Great Apps!';
const String ksHomeBottomSheetDescription =
'Stacked is built to help you build better apps. Give us a chance and we\'ll prove it to you. Check out stacked.filledstacks.com to learn more';

View File

@@ -0,0 +1,78 @@
import 'dart:math';
import 'package:flutter/material.dart';
const double _tinySize = 5.0;
const double _smallSize = 10.0;
const double _mediumSize = 25.0;
const double _largeSize = 50.0;
const double _massiveSize = 120.0;
const Widget horizontalSpaceTiny = SizedBox(width: _tinySize);
const Widget horizontalSpaceSmall = SizedBox(width: _smallSize);
const Widget horizontalSpaceMedium = SizedBox(width: _mediumSize);
const Widget horizontalSpaceLarge = SizedBox(width: _largeSize);
const Widget verticalSpaceTiny = SizedBox(height: _tinySize);
const Widget verticalSpaceSmall = SizedBox(height: _smallSize);
const Widget verticalSpaceMedium = SizedBox(height: _mediumSize);
const Widget verticalSpaceLarge = SizedBox(height: _largeSize);
const Widget verticalSpaceMassive = SizedBox(height: _massiveSize);
Widget spacedDivider = const Column(
children: <Widget>[
verticalSpaceMedium,
Divider(color: Colors.blueGrey, height: 5.0),
verticalSpaceMedium,
],
);
Widget verticalSpace(double height) => SizedBox(height: height);
double screenWidth(BuildContext context) => MediaQuery.of(context).size.width;
double screenHeight(BuildContext context) => MediaQuery.of(context).size.height;
double screenHeightFraction(BuildContext context,
{int dividedBy = 1, double offsetBy = 0, double max = 3000}) =>
min((screenHeight(context) - offsetBy) / dividedBy, max);
double screenWidthFraction(BuildContext context,
{int dividedBy = 1, double offsetBy = 0, double max = 3000}) =>
min((screenWidth(context) - offsetBy) / dividedBy, max);
double halfScreenWidth(BuildContext context) =>
screenWidthFraction(context, dividedBy: 2);
double thirdScreenWidth(BuildContext context) =>
screenWidthFraction(context, dividedBy: 3);
double quarterScreenWidth(BuildContext context) =>
screenWidthFraction(context, dividedBy: 4);
double getResponsiveHorizontalSpaceMedium(BuildContext context) =>
screenWidthFraction(context, dividedBy: 10);
double getResponsiveSmallFontSize(BuildContext context) =>
getResponsiveFontSize(context, fontSize: 14, max: 15);
double getResponsiveMediumFontSize(BuildContext context) =>
getResponsiveFontSize(context, fontSize: 16, max: 17);
double getResponsiveLargeFontSize(BuildContext context) =>
getResponsiveFontSize(context, fontSize: 21, max: 31);
double getResponsiveExtraLargeFontSize(BuildContext context) =>
getResponsiveFontSize(context, fontSize: 25);
double getResponsiveMassiveFontSize(BuildContext context) =>
getResponsiveFontSize(context, fontSize: 30);
double getResponsiveFontSize(BuildContext context,
{double? fontSize, double? max}) {
max ??= 100;
var responsiveSize = min(
screenWidthFraction(context, dividedBy: 10) * ((fontSize ?? 100) / 100),
max);
return responsiveSize;
}

View File

@@ -0,0 +1,108 @@
import 'package:flutter/material.dart';
import 'package:bahla_front/ui/common/app_colors.dart';
import 'package:bahla_front/ui/common/ui_helpers.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'info_alert_dialog_model.dart';
const double _graphicSize = 60;
class InfoAlertDialog extends StackedView<InfoAlertDialogModel> {
final DialogRequest request;
final Function(DialogResponse) completer;
const InfoAlertDialog({
Key? key,
required this.request,
required this.completer,
}) : super(key: key);
@override
Widget builder(
BuildContext context,
InfoAlertDialogModel viewModel,
Widget? child,
) {
return Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
backgroundColor: Colors.white,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
request.title!,
style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.w900),
),
verticalSpaceTiny,
Text(
request.description!,
style:
const TextStyle(fontSize: 14, color: kcMediumGrey),
maxLines: 3,
softWrap: true,
),
],
),
),
Container(
width: _graphicSize,
height: _graphicSize,
decoration: const BoxDecoration(
color: Color(0xffF6E7B0),
borderRadius: BorderRadius.all(
Radius.circular(_graphicSize / 2),
),
),
alignment: Alignment.center,
child: const Text(
'⭐️',
style: TextStyle(fontSize: 30),
),
)
],
),
verticalSpaceMedium,
GestureDetector(
onTap: () => completer(DialogResponse(
confirmed: true,
)),
child: Container(
height: 50,
width: double.infinity,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.black,
borderRadius: BorderRadius.circular(10),
),
child: const Text(
'Got it',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
),
)
],
),
),
);
}
@override
InfoAlertDialogModel viewModelBuilder(BuildContext context) =>
InfoAlertDialogModel();
}

View File

@@ -0,0 +1,3 @@
import 'package:stacked/stacked.dart';
class InfoAlertDialogModel extends BaseViewModel {}

View File

@@ -0,0 +1,85 @@
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:bahla_front/ui/common/app_colors.dart';
import 'package:bahla_front/ui/common/ui_helpers.dart';
import 'home_viewmodel.dart';
class HomeView extends StackedView<HomeViewModel> {
const HomeView({Key? key}) : super(key: key);
@override
Widget builder(
BuildContext context,
HomeViewModel viewModel,
Widget? child,
) {
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 25.0),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
verticalSpaceLarge,
Column(
children: [
const Text(
'Hello, STACKED!',
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.w900,
),
),
verticalSpaceMedium,
MaterialButton(
color: Colors.black,
onPressed: viewModel.incrementCounter,
child: Text(
viewModel.counterLabel,
style: const TextStyle(color: Colors.white),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MaterialButton(
color: kcDarkGreyColor,
onPressed: viewModel.showDialog,
child: const Text(
'Show Dialog',
style: TextStyle(
color: Colors.white,
),
),
),
MaterialButton(
color: kcDarkGreyColor,
onPressed: viewModel.showBottomSheet,
child: const Text(
'Show Bottom Sheet',
style: TextStyle(
color: Colors.white,
),
),
),
],
)
],
),
),
),
),
);
}
@override
HomeViewModel viewModelBuilder(
BuildContext context,
) =>
HomeViewModel();
}

View File

@@ -0,0 +1,36 @@
import 'package:bahla_front/app/app.bottomsheets.dart';
import 'package:bahla_front/app/app.dialogs.dart';
import 'package:bahla_front/app/app.locator.dart';
import 'package:bahla_front/ui/common/app_strings.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
class HomeViewModel extends BaseViewModel {
final _dialogService = locator<DialogService>();
final _bottomSheetService = locator<BottomSheetService>();
String get counterLabel => 'Counter is: $_counter';
int _counter = 0;
void incrementCounter() {
_counter++;
rebuildUi();
}
void showDialog() {
_dialogService.showCustomDialog(
variant: DialogType.infoAlert,
title: 'Stacked Rocks!',
description: 'Give stacked $_counter stars on Github',
);
}
void showBottomSheet() {
_bottomSheetService.showCustomSheet(
variant: BottomSheetType.notice,
title: ksHomeBottomSheetTitle,
description: ksHomeBottomSheetDescription,
);
}
}

View File

@@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:stacked/stacked.dart';
import 'package:bahla_front/ui/common/ui_helpers.dart';
import 'startup_viewmodel.dart';
class StartupView extends StackedView<StartupViewModel> {
const StartupView({Key? key}) : super(key: key);
@override
Widget builder(
BuildContext context,
StartupViewModel viewModel,
Widget? child,
) {
return const Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'STACKED',
style: TextStyle(fontSize: 40, fontWeight: FontWeight.w900),
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text('Loading ...', style: TextStyle(fontSize: 16)),
horizontalSpaceSmall,
SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(
color: Colors.black,
strokeWidth: 6,
),
)
],
),
],
),
),
);
}
@override
StartupViewModel viewModelBuilder(
BuildContext context,
) =>
StartupViewModel();
@override
void onViewModelReady(StartupViewModel viewModel) => SchedulerBinding.instance
.addPostFrameCallback((timeStamp) => viewModel.runStartupLogic());
}

View File

@@ -0,0 +1,18 @@
import 'package:stacked/stacked.dart';
import 'package:bahla_front/app/app.locator.dart';
import 'package:bahla_front/app/app.router.dart';
import 'package:stacked_services/stacked_services.dart';
class StartupViewModel extends BaseViewModel {
final _navigationService = locator<NavigationService>();
// Place anything here that needs to happen before we get into the application
Future runStartupLogic() async {
await Future.delayed(const Duration(seconds: 3));
// This is where you can make decisions on where your app should navigate when
// you have custom startup logic
_navigationService.replaceWithHomeView();
}
}