initalizing the mobile apps

This commit is contained in:
Achintha Isuru
2026-01-21 15:42:51 -05:00
parent fbadd976cf
commit 4a67b2f541
578 changed files with 28462 additions and 2 deletions

View File

@@ -0,0 +1,29 @@
# Feature Manifest: Template Feature
## Overview
**Feature Name:** Template Feature
**Package Path:** `packages/features/shared/template_feature`
**Owner:** [Team Name/Agent]
## Responsibilities
* Describe what this feature does.
* Describe what this feature does NOT do.
## Architecture
* **Domain**:
* `TemplateEntity` (imported from `krow_domain`)
* `TemplateRepositoryInterface`
* **Data**:
* `TemplateRepositoryImpl` (uses `krow_data_connect`)
* **Presentation**:
* `TemplatePage`
* `TemplateBloc`
## Dependencies
* `krow_domain`: For entities.
* `krow_data_connect`: For backend mocking/access.
* `design_system`: For UI components.
## Routes
* `/`: Main template page.
* `/:id`: Detail page (example).

View File

@@ -0,0 +1,20 @@
import 'package:krow_data_connect/krow_data_connect.dart';
import 'package:krow_domain/krow_domain.dart';
import '../../domain/repositories/template_repository_interface.dart';
class TemplateRepositoryImpl implements TemplateRepositoryInterface {
// In a real scenario, you might inject a specific DataSource here.
// For now, we can use the static/singleton mocks from krow_data_connect or inject them.
final AuthRepositoryMock _authMock;
TemplateRepositoryImpl({AuthRepositoryMock? authMock})
: _authMock = authMock ?? AuthRepositoryMock();
@override
Future<User?> getData() async {
// Mapping from DataConnect models to Domain models happens here if needed.
// For the mock stage, we just return the entity.
final result = await _authMock.currentUser.first;
return result;
}
}

View File

@@ -0,0 +1,7 @@
import 'package:krow_domain/krow_domain.dart';
/// Abstract interface for data access.
/// Must be implemented in the Data layer.
abstract interface class TemplateRepositoryInterface {
Future<User?> getData();
}

View File

@@ -0,0 +1,13 @@
import 'package:krow_core/krow_core.dart'; // Assuming Result/UseCases might be here later
import 'package:krow_domain/krow_domain.dart';
import '../repositories/template_repository_interface.dart';
class GetTemplateDataUseCase {
final TemplateRepositoryInterface _repository;
GetTemplateDataUseCase(this._repository);
Future<User?> call() async {
return _repository.getData();
}
}

View File

@@ -0,0 +1,60 @@
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:krow_domain/krow_domain.dart';
import '../../domain/usecases/get_template_data_usecase.dart';
// Events
abstract class TemplateEvent extends Equatable {
const TemplateEvent();
@override
List<Object> get props => [];
}
class TemplateStarted extends TemplateEvent {}
// States
abstract class TemplateState extends Equatable {
const TemplateState();
@override
List<Object?> get props => [];
}
class TemplateInitial extends TemplateState {}
class TemplateLoading extends TemplateState {}
class TemplateLoaded extends TemplateState {
final User user;
const TemplateLoaded(this.user);
@override
List<Object?> get props => [user];
}
class TemplateError extends TemplateState {
final String message;
const TemplateError(this.message);
@override
List<Object?> get props => [message];
}
// BLoC
class TemplateBloc extends Bloc<TemplateEvent, TemplateState> {
final GetTemplateDataUseCase _getDataUseCase;
TemplateBloc({required GetTemplateDataUseCase getDataUseCase})
: _getDataUseCase = getDataUseCase,
super(TemplateInitial()) {
on<TemplateStarted>(_onStarted);
}
Future<void> _onStarted(TemplateStarted event, Emitter<TemplateState> emit) async {
emit(TemplateLoading());
try {
final user = await _getDataUseCase();
if (user != null) {
emit(TemplateLoaded(user));
} else {
emit(const TemplateError('No data found'));
}
} catch (e) {
emit(TemplateError(e.toString()));
}
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:design_system/design_system.dart'; // Import Design System
import '../blocs/template_bloc.dart';
class TemplatePage extends StatelessWidget {
const TemplatePage({super.key});
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => Modular.get<TemplateBloc>()..add(TemplateStarted()),
child: Scaffold(
appBar: AppBar(title: const Text('Template Feature')),
body: BlocBuilder<TemplateBloc, TemplateState>(
builder: (context, state) {
if (state is TemplateLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is TemplateLoaded) {
return Center(child: Text('User: ${state.user.email}'));
} else if (state is TemplateError) {
return Center(child: Text('Error: ${state.message}'));
}
return const Center(child: Text('Welcome'));
},
),
),
);
}
}

View File

@@ -0,0 +1,29 @@
library template_feature;
import 'package:flutter_modular/flutter_modular.dart';
import 'src/data/repositories_impl/template_repository_impl.dart';
import 'src/domain/repositories/template_repository_interface.dart';
import 'src/domain/usecases/get_template_data_usecase.dart';
import 'src/presentation/blocs/template_bloc.dart';
import 'src/presentation/pages/template_page.dart';
export 'src/presentation/pages/template_page.dart';
class TemplateFeatureModule extends Module {
@override
void binds(Injector i) {
// 1. Repositories
i.add<TemplateRepositoryInterface>(TemplateRepositoryImpl.new);
// 2. Use Cases
i.add(GetTemplateDataUseCase.new);
// 3. BLoCs
i.add(TemplateBloc.new);
}
@override
void routes(r) {
r.child('/', child: (_) => const TemplatePage());
}
}

View File

@@ -0,0 +1,32 @@
name: template_feature
description: A template feature package following KROW architecture.
version: 0.0.1
publish_to: none
resolution: workspace
environment:
sdk: '>=3.10.0 <4.0.0'
flutter: ">=3.0.0"
dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.1.0
flutter_modular: ^6.3.0
equatable: ^2.0.5
# Core Architecture
krow_domain:
path: ../../../domain
krow_data_connect:
path: ../../../data_connect
krow_core:
path: ../../../core
design_system:
path: ../../../design_system
dev_dependencies:
flutter_test:
sdk: flutter
bloc_test: ^9.1.0
mocktail: ^1.0.0