Skip to content

Commit

Permalink
refactor: initial steps move and change the project structure by movi…
Browse files Browse the repository at this point in the history
…ng folders and files
  • Loading branch information
Ellet committed Jul 12, 2024
1 parent aaba8a6 commit cd315f0
Show file tree
Hide file tree
Showing 160 changed files with 1,358 additions and 371 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ An ecommerce application developed by Fresh Platform for Alrayada company.
2. Create a file called `.env` and copy the content of `fallback.env` into this newly created file
3. Provide the values, if you can't understand some of the variables, go to
this [File](./lib/utils/env.dart)
4. Change the values in the [Constants](./lib/constants.dart) file
4. Change the values in the [Constants](./lib/common/constants/constants.dart) file
5. Setup App Signing for both Android and iOS
6. Setup Firebase using [Firebase Flutter CLI](https://firebase.google.com/docs/flutter/setup)
7. Setup the [Apis](#third-party-apis)
Expand Down
4 changes: 2 additions & 2 deletions l10n.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
arb-dir: lib/l10n
arb-dir: lib/common/localizations
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
untranslated-messages-file: lib/l10n/untranslated.json
untranslated-messages-file: lib/common/localizations/untranslated.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:go_router/go_router.dart';

import '../../../../../data/product/category/product_category.dart';
import '../../../../../l10n/app_localizations.dart';
import '../../../../../utils/validators/global_validator.dart';
import '../../../../../widgets/image_picker_widget.dart';
import '../../../../../common/global_validator.dart';
import '../../../../../common/localizations/app_localization_extension.dart';
import '../../../../../common/presentation/widgets/image_picker_widget.dart';
import '../../../../../products/data/category/product_category.dart';

@immutable
class AdminAddEditCategoryDialogData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';

import '../../../../../l10n/app_localizations.dart';
import '../../../../../logic/products/category/product_category_cubit.dart';
import '../../../../../utils/extensions/scaffold_messenger_ext.dart';
import '../../../../../widgets/errors/unknown_error.dart';
import '../../../../../widgets/no_data_found.dart';
import '../../../../../widgets/scroll_edge_detector.dart';
import '../../../../../common/extensions/scaffold_messenger_ext.dart';
import '../../../../../common/localizations/app_localization_extension.dart';
import '../../../../../common/presentation/widgets/errors/unknown_error.dart';
import '../../../../../common/presentation/widgets/no_data_found.dart';
import '../../../../../common/presentation/widgets/scroll_edge_detector.dart';
import '../../../../../products/logic/category/product_category_cubit.dart';
import 'admin_add_edit_category_dialog.dart';
import 'admin_category_tile.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';

import '../../../../../data/product/category/product_category.dart';
import '../../../../../l10n/app_localizations.dart';
import '../../../../../logic/products/category/product_category_cubit.dart';
import '../../../../../widgets/errors/unknown_error.dart';
import '../../../../../widgets/no_data_found.dart';
import '../../../../../widgets/scroll_edge_detector.dart';
import '../../../../../common/localizations/app_localization_extension.dart';
import '../../../../../common/presentation/widgets/errors/unknown_error.dart';
import '../../../../../common/presentation/widgets/no_data_found.dart';
import '../../../../../common/presentation/widgets/scroll_edge_detector.dart';
import '../../../../../products/data/category/product_category.dart';
import '../../../../../products/logic/category/product_category_cubit.dart';
import 'admin_add_edit_category_dialog.dart';
import 'admin_category_tile.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:go_router/go_router.dart';

import '../../../../../data/product/category/product_category.dart';
import '../../../../../l10n/app_localizations.dart';
import '../../../../../logic/products/category/product_category_cubit.dart';
import '../../../../../widgets/dialog/ok_cancel_dialog.dart';
import '../../../../../widgets/my_image.dart';
import '../../../../../common/localizations/app_localization_extension.dart';
import '../../../../../common/presentation/widgets/dialog/ok_cancel_dialog.dart';
import '../../../../../common/presentation/widgets/my_image.dart';
import '../../../../../products/data/category/product_category.dart';
import '../../../../../products/logic/category/product_category_cubit.dart';
import 'admin_add_edit_category_dialog.dart';
import 'admin_category_details_screen.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';

import '../../l10n/app_localizations.dart';
import '../../logic/live_chat/admin/admin_live_chat_cubit.dart';
import '../../utils/extensions/scaffold_messenger_ext.dart';
import '../../widgets/responsive_navbar.dart';
import '../dashboard/tab_item.dart';
import '../../common/extensions/scaffold_messenger_ext.dart';
import '../../common/localizations/app_localization_extension.dart';
import '../../common/presentation/widgets/responsive_navbar.dart';
import '../../dashboard/tab_item.dart';
import '../live_chat/logic/admin_live_chat_cubit.dart';
import 'tabs/admin_users_tab.dart';
import 'tabs/live_chat/admin_live_chat_tab.dart';
import 'tabs/product_hub/admin_product_hub_tab.dart';
import 'tabs/users/admin_users_tab.dart';

class AdminDashboardScreen extends StatefulWidget {
const AdminDashboardScreen({super.key});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import 'package:flutter/material.dart';

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';

import '../../../../l10n/app_localizations.dart';
import '../../../../logic/user/admin/admin_user_cubit.dart';
import '../../../../utils/extensions/scaffold_messenger_ext.dart';
import '../../../../widgets/errors/unknown_error.dart';
import '../../../../widgets/scroll_edge_detector.dart';
import 'admin_user_tile.dart';
import '../../../common/extensions/scaffold_messenger_ext.dart';
import '../../../common/localizations/app_localization_extension.dart';
import '../../../common/presentation/widgets/errors/unknown_error.dart';
import '../../../common/presentation/widgets/scroll_edge_detector.dart';
import '../../user/logic/admin_user_cubit.dart';
import '../../user/presentation/admin_user_tile.dart';

class AdminUsersTab extends StatelessWidget {
const AdminUsersTab({super.key});
Expand All @@ -27,7 +26,7 @@ class AdminUsersTab extends StatelessWidget {
),
hintText: context.loc.search,
leading: Icon(PlatformIcons(context).search),
padding: MaterialStateProperty.all(
padding: WidgetStateProperty.all(
const EdgeInsets.symmetric(horizontal: 16),
),
textInputAction: TextInputAction.search,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:go_router/go_router.dart';

import '../../../../data/live_chat/live_chat_api.dart';
import '../../../../data/live_chat/models/live_chat_room.dart';
import '../../../../l10n/app_localizations.dart';
import '../../../../logic/live_chat/admin/admin_live_chat_cubit.dart';
import '../../../live_chat/live_chat_screen.dart';
import '../../../../common/localizations/app_localization_extension.dart';
import '../../../../live_chat/data/live_chat_api.dart';
import '../../../../live_chat/data/models/live_chat_room.dart';
import '../../../../live_chat/presentation/live_chat_screen.dart';
import '../../../live_chat/logic/admin_live_chat_cubit.dart';

class AdminLiveChatRoomTile extends StatelessWidget {
const AdminLiveChatRoomTile({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../../../../l10n/app_localizations.dart';
import '../../../../logic/live_chat/admin/admin_live_chat_cubit.dart';
import '../../../../utils/extensions/scaffold_messenger_ext.dart';
import '../../../../widgets/errors/unknown_error.dart';
import '../../../../widgets/no_data_found.dart';
import '../../../../widgets/scroll_edge_detector.dart';
import '../../../../common/extensions/scaffold_messenger_ext.dart';
import '../../../../common/localizations/app_localization_extension.dart';
import '../../../../common/presentation/widgets/errors/unknown_error.dart';
import '../../../../common/presentation/widgets/no_data_found.dart';
import '../../../../common/presentation/widgets/scroll_edge_detector.dart';
import '../../../live_chat/logic/admin_live_chat_cubit.dart';
import 'admin_live_chat_room_tile.dart';

class AdminLiveChatTab extends StatelessWidget {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';

import '../../../../l10n/app_localizations.dart';
import '../../../../common/localizations/app_localization_extension.dart';
import 'categories/admin_categories_tab.dart';
import 'products/admin_products_tab.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cross_file/cross_file.dart';
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:go_router/go_router.dart';

import '../../../../../common/global_validator.dart';
import '../../../../../common/localizations/app_localization_extension.dart';
import '../../../../../common/presentation/widgets/image_picker_widget.dart';
import '../../../../../products/data/category/product_category.dart';

@immutable
class AdminAddEditCategoryDialogData {
const AdminAddEditCategoryDialogData({
required this.name,
required this.description,
required this.imageFile,
});

final String name;
final String description;
final XFile? imageFile;

/// Will be used for creating category
XFile get imageFileOrThrow =>
imageFile ?? (throw StateError('The image file is required'));
}

class AdminAddEditCategoryDialog extends StatefulWidget {
const AdminAddEditCategoryDialog({
required this.initialCategory,
required this.onSubmit,
super.key,
});

/// If you want to add a new category, pass null to [initialCategory]
/// otherwise pass the existing category so use it default values
final ProductCategory? initialCategory;

/// The widget will call [Navigator.pop] before call [onSubmit]
/// if [initialCategory] is not null then the image file can be nullable
/// otherwise it should not be null
final void Function(AdminAddEditCategoryDialogData data) onSubmit;

static void show({
required BuildContext context,
required ProductCategory? initialCategory,
required void Function(AdminAddEditCategoryDialogData data) onSubmit,
}) =>
showDialog(
context: context,
builder: (context) => AdminAddEditCategoryDialog(
initialCategory: initialCategory,
onSubmit: onSubmit,
),
);

@override
State<AdminAddEditCategoryDialog> createState() =>
_AdminAddEditCategoryDialogState();
}

class _AdminAddEditCategoryDialogState
extends State<AdminAddEditCategoryDialog> {
final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController();
final _descriptionController = TextEditingController();

XFile? _imageFile;

@override
void initState() {
super.initState();
final category = widget.initialCategory;
if (category != null) {
_nameController.text = category.name;
_descriptionController.text = category.description;
}
}

@override
void dispose() {
_nameController.dispose();
_descriptionController.dispose();
super.dispose();
}

/// if the user is updating the category then uploading a new image is optional
/// otherwise the user needs to upload a new image
bool get _isValidData {
final isTextInputsValid = _formKey.currentState?.validate() ?? false;
if (widget.initialCategory != null) {
// Uploading a new image is optional
return isTextInputsValid;
}
return isTextInputsValid && _imageFile != null;
}

@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text(
widget.initialCategory != null
? '${context.loc.edit} ${widget.initialCategory?.name}'
: context.loc.add,
),
content: Form(
key: _formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ImagePickerWidget(
onImagePicked: (imageFile) => _imageFile = imageFile,
initialImageProvider: widget.initialCategory != null
? CachedNetworkImageProvider(widget
.initialCategory?.imageUrls.first ??
(throw StateError('The category should not be null')))
: null,
),
const SizedBox(height: 8),
TextFormField(
controller: _nameController,
textInputAction: TextInputAction.next,
validator: (value) => GlobalValidator.validateTextIsEmpty(
value ?? '',
errorMessage: context.loc.thisFieldCantBeEmpty,
),
decoration: InputDecoration(labelText: context.loc.name),
),
const SizedBox(height: 8),
TextFormField(
controller: _descriptionController,
textInputAction: TextInputAction.newline,
keyboardType: TextInputType.multiline,
maxLines: null,
validator: (value) => GlobalValidator.validateTextIsEmpty(
value ?? '',
errorMessage: context.loc.thisFieldCantBeEmpty,
),
decoration: InputDecoration(labelText: context.loc.description),
),
],
),
),
),
actions: [
PlatformDialogAction(
onPressed: () => context.pop(),
child: Text(context.loc.cancel),
),
PlatformDialogAction(
onPressed: () {
if (!_isValidData) {
return;
}
_formKey.currentState?.save();
context.pop();
widget.onSubmit(AdminAddEditCategoryDialogData(
name: _nameController.text,
description: _descriptionController.text,
imageFile: _imageFile,
));
},
child: Text(
widget.initialCategory != null ? context.loc.edit : context.loc.add,
),
),
],
);
}
}
Loading

0 comments on commit cd315f0

Please sign in to comment.