Skip to content

Feature/for you#45

Merged
abelarismendy merged 3 commits intomainfrom
feature/for-you
Oct 3, 2024
Merged

Feature/for you#45
abelarismendy merged 3 commits intomainfrom
feature/for-you

Conversation

@abelarismendy
Copy link
Copy Markdown
Contributor

@abelarismendy abelarismendy commented Oct 3, 2024

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a variety of cuisine types for better categorization of food businesses.
    • Added functionality to fetch and display nearby surplus food businesses based on user location and preferred cuisine.
    • Implemented a new "For You" tab on the home screen, showcasing personalized food business recommendations.
    • Created a user-friendly interface for viewing food offers associated with businesses.
  • Bug Fixes

    • Enhanced error handling during data fetching processes to improve user experience.
  • Documentation

    • Updated documentation to reflect new features and functionalities introduced in the food business module.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Oct 3, 2024

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough
📝 Walkthrough

Walkthrough

This pull request introduces several new components related to food business management, including enumerations for cuisine and offer types, classes for food businesses and offers, and a bloc for managing food business state and events. It enhances the home screen with a new tab for personalized food business recommendations and integrates these features into the application structure, including repository functionality for fetching data from Firestore.

Changes

File Path Change Summary
lib/features/food/domain/models/cuisine_type.dart Added CuisineType enum and CuisineTypeExtension with methods displayName and fromString.
lib/features/food/domain/models/food_business.dart Introduced FoodBusiness class with a factory constructor fromMap, a standard constructor, and a method toMap.
lib/features/food/domain/models/offer.dart Added Offer class with properties, constructors, and methods: toMap, fromMap, and toCartItem.
lib/features/food/domain/models/offer_type.dart Introduced OfferType enum with values: restaurant, ingredient, store, diary, and drink.
lib/features/food/presentation/bloc/food_business_bloc.dart Added FoodBusinessBloc class with a method _onFetchSurplusFoodBusinesses to manage fetching food businesses based on user location.
lib/features/food/presentation/bloc/food_business_event.dart Created FoodBusinessEvent abstract class and FetchSurplusFoodBusinesses subclass with a favoriteCuisine parameter.
lib/features/food/presentation/bloc/food_business_state.dart Introduced FoodBusinessState abstract class with subclasses for different states: FoodBusinessInitial, FoodBusinessLoading, FoodBusinessLoaded, and FoodBusinessError.
lib/features/food/repository/food_business_repository.dart Added FoodBusinessRepository class with a method fetchNearbySurplusFoodBusinesses to retrieve food businesses from Firestore based on user location and cuisine type.
lib/features/home/presentation/screens/home_screen.dart Modified HomeScreen to include a new tab for "For You" and updated initState to fetch food business data.
lib/features/home/presentation/widgets/for_you_tab.dart Introduced ForYouTab widget to display food businesses and offers, including handling different states via BlocBuilder.
lib/main.dart Added imports for FoodBusinessBloc and FoodBusinessRepository, and included FoodBusinessBloc in the MultiBlocProvider for dependency injection.

Possibly related PRs

Suggested labels

enhancement

Suggested reviewers

  • RaulRinconX

Poem

🐇 In the garden of flavors, we hop and play,
With cuisines from afar, brightening our day.
Offers abound, a feast to explore,
For you, dear friend, we’ve opened the door!
So come take a bite, let your taste buds soar,
In this world of food, there’s always more! 🍽️


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

🧹 Outside diff range and nitpick comments (13)
lib/features/food/presentation/bloc/food_business_event.dart (1)

11-17: LGTM: FetchSurplusFoodBusinesses class is well-implemented. Consider adding a brief comment.

The FetchSurplusFoodBusinesses class:

  1. Correctly extends FoodBusinessEvent.
  2. Uses a required named parameter favoriteCuisine, which is a good practice for clarity and type safety.
  3. Properly overrides props to include favoriteCuisine for accurate equality comparisons.

The implementation is solid and aligns with the expected use case of fetching surplus food businesses.

Consider adding a brief comment above the class to describe its purpose, e.g.:

/// Event to fetch surplus food businesses based on a favorite cuisine type.
class FetchSurplusFoodBusinesses extends FoodBusinessEvent {
  // ... (rest of the implementation)
}

This would enhance code readability and provide context for other developers.

lib/features/food/presentation/bloc/food_business_state.dart (1)

23-29: LGTM with a minor suggestion: FoodBusinessError class is well-implemented.

The FoodBusinessError class is correctly implemented:

  • It extends FoodBusinessState and holds an error message.
  • The constructor uses a required named parameter, which is a good practice.
  • The props getter is properly overridden to include the message, ensuring correct equality comparison.

This implementation will effectively represent error states. However, consider adding a stackTrace property to capture more detailed error information, which can be helpful for debugging:

class FoodBusinessError extends FoodBusinessState {
  const FoodBusinessError({required this.message, this.stackTrace});
  final String message;
  final StackTrace? stackTrace;

  @override
  List<Object?> get props => [message, stackTrace];
}

This addition would provide more context for error handling and debugging without breaking the current implementation.

lib/features/food/domain/models/cuisine_type.dart (1)

1-12: Consider alphabetical ordering and additional cuisine types.

The CuisineType enum is well-defined and follows Dart's naming conventions. However, consider the following improvements:

  1. Alphabetically order the enum values for better readability and easier maintenance.
  2. Consider adding more common cuisine types, such as American, Greek, or Korean, to make the list more comprehensive.

Here's a suggested revision with alphabetical ordering:

enum CuisineType {
  chinese,
  french,
  indian,
  italian,
  japanese,
  local,
  mediterranean,
  mexican,
  thai,
  vegan,
  // Consider adding: american, greek, korean, etc.
}
lib/features/food/domain/models/food_business.dart (3)

1-4: LGTM with a minor suggestion.

The imports look good and are relevant to the FoodBusiness class. However, consider moving the linter ignore directive to be more specific:

class FoodBusiness {
  // ignore: sort_constructors_first
  factory FoodBusiness.fromMap(Map<String, dynamic> map, String id) {
    // ...
  }
  
  // ...
}

This change would make the ignore directive more targeted and easier to maintain.


7-29: LGTM with suggestions for improvement.

The factory constructor looks good overall. It handles all required fields and includes proper error handling for the cuisineType field. However, there are a few points that could be improved:

  1. Consider using a more specific type for the map parameter:

    factory FoodBusiness.fromMap(Map<String, dynamic> map, String id)
  2. The ignore: always_specify_types comment on line 19 could be replaced with an explicit type:

    (Map<String, dynamic> offerMap) => Offer.fromMap(
      offerMap,
      offerMap['id'] as String,
      id,
    ),
  3. Consider adding null checks or default values for optional fields to improve robustness.


47-56: LGTM with a suggestion.

The toMap method looks good overall:

  • It correctly maps all properties to their corresponding keys.
  • The cuisineType is properly converted to its display name.
  • The offers list is correctly mapped to a list of maps.

However, consider including the id field in the resulting map:

Map<String, dynamic> toMap() {
  return <String, dynamic>{
    'id': id,
    'name': name,
    // ... rest of the fields
  };
}

This would make the map representation more complete and consistent with the fromMap factory method.

lib/features/food/domain/models/offer.dart (1)

43-74: LGTM: Well-implemented fromMap() and toCartItem() methods.

Both methods are well-implemented and serve their purposes effectively. The fromMap() method safely parses enums and handles Firestore Timestamp conversion correctly. The toCartItem() method provides a concise representation for cart items.

Minor suggestion for fromMap(): Consider using map['type'] as String and map['cuisineType'] as String to explicitly cast these values to String before comparison. This can prevent potential runtime errors if the map contains unexpected types for these fields.

  static Offer fromMap(Map<String, dynamic> map, String id, String businessId) {
    return Offer(
      id: id,
      type: OfferType.values.firstWhere(
-       (OfferType e) => e.toString().split('.').last == map['type'],
+       (OfferType e) => e.name == map['type'] as String,
        orElse: () => OfferType.values.first,
      ),
      cuisineType: CuisineType.values.firstWhere(
-       (CuisineType e) => e.toString().split('.').last == map['cuisineType'],
+       (CuisineType e) => e.name == map['cuisineType'] as String,
        orElse: () => CuisineType.values.first,
      ),
      // ... rest of the method
    );
  }

This change aligns with the suggestion for toMap() and makes the code more robust.

lib/main.dart (2)

65-70: LGTM: New BlocProvider for FoodBusinessBloc added.

The FoodBusinessBloc is correctly integrated into the MultiBlocProvider with its required dependencies. However, consider the following suggestion:

Consider moving this BlocProvider higher in the list if FoodBusinessBloc doesn't depend on other blocs initialized after it. This ensures that any potential dependencies are properly initialized before FoodBusinessBloc. If there are no such dependencies, you can place it right after the AddressBloc provider:

 BlocProvider<AddressBloc>(
   create: (BuildContext context) => AddressBloc(),
 ),
+BlocProvider<FoodBusinessBloc>(
+  create: (BuildContext context) => FoodBusinessBloc(
+    foodBusinessRepository: FoodBusinessRepository(),
+    addressBloc: context.read<AddressBloc>(),
+  ),
+),
 // Other BlocProviders...
-BlocProvider<FoodBusinessBloc>(
-  create: (BuildContext context) => FoodBusinessBloc(
-    foodBusinessRepository: FoodBusinessRepository(),
-    addressBloc: context.read<AddressBloc>(),
-  ),
-),

This change would improve the readability and maintainability of the code by grouping related BlocProviders together.


Line range hint 1-74: Summary: FoodBusinessBloc successfully integrated into the main application.

The changes in this file effectively introduce the FoodBusinessBloc to the main application. The new imports and BlocProvider are correctly implemented, allowing the food feature to be accessible throughout the app. This integration enhances the app's functionality by providing access to food business-related features and data.

As the application grows, consider:

  1. Extracting the BlocProvider setup into a separate function or file to improve maintainability.
  2. Implementing a dependency injection system (e.g., get_it) to manage the growing number of dependencies more efficiently.

These steps will help keep the main.dart file clean and make it easier to manage the application's state and dependencies as more features are added.

lib/features/food/presentation/bloc/food_business_bloc.dart (2)

46-48: Log exceptions for debugging purposes

While it's important not to expose internal details to the user, logging the exception can aid in debugging. Consider adding logging within the catch block.

Example using Dart's print for simplicity:

} catch (e, stackTrace) {
  print('Error in _onFetchSurplusFoodBusinesses: $e');
  emit(const FoodBusinessError(message: 'An unexpected error occurred. Please try again later.'));
}

Alternatively, use a logging library like logger for more advanced logging capabilities.


32-38: Consider handling empty results from the repository

If fetchNearbySurplusFoodBusinesses returns an empty list, the UI might not indicate to the user that no businesses are available. Consider emitting a state or handling this case in the UI.

Example:

if (foodBusinesses.isEmpty) {
  emit(const FoodBusinessEmpty(message: 'No surplus food businesses found near you.'));
} else {
  emit(FoodBusinessLoaded(foodBusinesses: foodBusinesses));
}

Ensure FoodBusinessEmpty is a valid state in FoodBusinessState.

lib/features/home/presentation/widgets/for_you_tab.dart (1)

71-73: Implement the 'Add to Cart' functionality

There's a TODO comment indicating that the 'Add to Cart' functionality needs to be implemented. Since you mentioned that offer.toCartItem() can be used, consider implementing this functionality to enhance the user experience.

Would you like assistance in implementing the 'Add to Cart' functionality or creating a GitHub issue to track this task?

lib/features/food/repository/food_business_repository.dart (1)

28-45: Consider using geo-queries to optimize distance filtering

Currently, all food businesses matching the favorite cuisine are fetched and then filtered by distance in the application logic. To improve performance and reduce data transfer, consider using geo-queries or geohashing techniques to filter businesses within the specified distance directly in the Firestore query.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 0f2599b and 78dde76.

📒 Files selected for processing (11)
  • lib/features/food/domain/models/cuisine_type.dart (1 hunks)
  • lib/features/food/domain/models/food_business.dart (1 hunks)
  • lib/features/food/domain/models/offer.dart (1 hunks)
  • lib/features/food/domain/models/offer_type.dart (1 hunks)
  • lib/features/food/presentation/bloc/food_business_bloc.dart (1 hunks)
  • lib/features/food/presentation/bloc/food_business_event.dart (1 hunks)
  • lib/features/food/presentation/bloc/food_business_state.dart (1 hunks)
  • lib/features/food/repository/food_business_repository.dart (1 hunks)
  • lib/features/home/presentation/screens/home_screen.dart (5 hunks)
  • lib/features/home/presentation/widgets/for_you_tab.dart (1 hunks)
  • lib/main.dart (2 hunks)
🔇 Additional comments (20)
lib/features/food/domain/models/offer_type.dart (1)

1-7: Verify completeness of offer types

The current set of offer types covers a good range of food-related categories. However, it's worth considering if this list is comprehensive enough for all potential offer types in your system.

To ensure we haven't missed any important categories, let's check for any other uses of offer types in the codebase:

This will help us identify if there are any other offer types or similar concepts used elsewhere in the project that should be included in this enum.

✅ Verification successful

Completeness of Offer Types Verified

The OfferType enum currently encompasses all identified categories within the codebase. No additional offer types or similar enums were found in other parts of the project.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other occurrences of offer types or similar enums
rg --type dart -i "enum.*offer.*type" -g "!lib/features/food/domain/models/offer_type.dart"
rg --type dart -i "offer.*type.*=" -g "!lib/features/food/domain/models/offer_type.dart"

Length of output: 297

lib/features/food/presentation/bloc/food_business_event.dart (2)

1-2: LGTM: Imports are appropriate and follow best practices.

The imports for CuisineType and Equatable are correctly used and necessary for the implementation of the classes in this file. Using Equatable is a good practice for efficient object comparison in Dart, particularly in the context of state management.


4-9: LGTM: FoodBusinessEvent class is well-structured and follows BLoC pattern best practices.

The abstract FoodBusinessEvent class:

  1. Correctly extends Equatable for efficient equality comparisons.
  2. Uses a const constructor, which is appropriate for immutable event objects.
  3. Provides an empty props list, allowing subclasses to define their own properties for equality comparison.

This implementation provides a solid foundation for creating specific food business events.

lib/features/food/presentation/bloc/food_business_state.dart (6)

1-2: LGTM: Imports are correct and necessary.

The import statements are appropriate for the functionality of this file. The FoodBusiness model is imported from the domain layer, and the Equatable package is imported for efficient state comparison.


4-9: LGTM: FoodBusinessState class is well-structured.

The abstract FoodBusinessState class is correctly implemented:

  • It extends Equatable for efficient state comparison.
  • The props getter is overridden with an empty list, which is appropriate for a base class.
  • The use of const constructor promotes immutability.

This structure provides a solid foundation for the concrete state classes.


11-11: LGTM: FoodBusinessInitial class is correctly implemented.

The FoodBusinessInitial class is appropriately defined as a marker state for the initial state of the food business. It correctly extends FoodBusinessState and doesn't introduce any new properties, which is suitable for an initial state.


13-13: LGTM: FoodBusinessLoading class is correctly implemented.

The FoodBusinessLoading class is appropriately defined as a marker state for when food business data is being loaded. It correctly extends FoodBusinessState and doesn't introduce any new properties, which is suitable for a loading state.


15-21: LGTM: FoodBusinessLoaded class is well-implemented.

The FoodBusinessLoaded class is correctly implemented:

  • It extends FoodBusinessState and holds a List<FoodBusiness>.
  • The constructor uses a required named parameter, which is a good practice.
  • The props getter is properly overridden to include the foodBusinesses list, ensuring correct equality comparison.

This implementation will effectively represent the state when food businesses are successfully loaded.


1-29: Overall: Excellent implementation of state management for food business operations.

This file demonstrates a well-structured approach to state management using the BLoC pattern:

  • The abstract base class and concrete subclasses are correctly implemented.
  • Consistent use of Equatable ensures efficient state comparison.
  • The states cover the essential scenarios: initial, loading, loaded, and error.

The code is clean, follows Dart conventions, and provides a solid foundation for managing food business states in the application.

Consider implementing the suggested improvement to the FoodBusinessError class for enhanced error handling and debugging capabilities.

lib/features/food/domain/models/cuisine_type.dart (2)

15-38: LGTM: displayName getter implementation.

The displayName getter is well-implemented:

  • It covers all enum cases.
  • It provides clear, user-friendly names for each cuisine type.
  • The switch statement is an appropriate choice for this use case.

1-47: Overall, well-structured and implemented CuisineType enum and extension.

The file introduces a CuisineType enum and a corresponding extension that provides useful functionality. The implementation is generally good, with clear naming and appropriate use of Dart features. The suggested improvements (alphabetical ordering of enum values, optimizing the fromString method) will further enhance the code's readability and performance.

lib/features/food/domain/models/food_business.dart (2)

30-38: LGTM! Well-structured constructor.

The regular constructor is well-defined:

  • All required fields are marked with required, which is good practice.
  • The optional imageUrl field is correctly handled.
  • The constructor uses a concise syntax for initializing fields.

39-45: LGTM! Well-defined properties.

The class properties are well-defined:

  • All properties are marked as final, ensuring immutability, which is a good practice for model classes.
  • The types of the properties match those used in the constructors, maintaining consistency.
  • The imageUrl property is correctly defined as nullable (String?).
lib/features/food/domain/models/offer.dart (3)

1-3: LGTM: Imports are appropriate and necessary.

The imports are well-structured and relevant to the Offer class implementation. The use of cloud_firestore suggests Firestore integration, while the internal modules provide necessary types for the class.


5-27: LGTM: Well-structured class declaration and constructor.

The Offer class is well-defined with a clear constructor. The use of named and required parameters ensures that all necessary data is provided when creating an Offer instance, promoting code safety. The optional imageUrl parameter adds flexibility.


1-75: Overall, excellent implementation of the Offer class.

The Offer class is well-designed and implemented, providing a robust structure for managing offers in the food domain. It includes appropriate serialization and deserialization methods, making it suitable for use with Firestore. The code is clean, readable, and follows good Dart practices.

The suggested improvements for enum handling in toMap() and fromMap() methods are minor and aimed at enhancing maintainability and type safety. These changes will make the code more resilient to future modifications of the enum structures.

Great job on this implementation!

lib/main.dart (1)

7-8: LGTM: New imports for FoodBusinessBloc and FoodBusinessRepository.

The new imports are correctly formatted and necessary for the integration of the food feature into the main application.

lib/features/food/presentation/bloc/food_business_bloc.dart (2)

1-8: Optimize import statements

Some imports might not be necessary if their classes or functions are unused. Review and remove any unused imports to improve code clarity.

Run the following script to identify unused imports:

#!/bin/bash
# Description: Detect unused imports in the file.

# Use Dart's analyzer to find unused imports
dart analyze lib/features/food/presentation/bloc/food_business_bloc.dart

15-15: Ensure all events are handled

Currently, the bloc handles FetchSurplusFoodBusinesses events. Verify if there are other events extending FoodBusinessEvent that need to be handled.

Run the following script to list all subclasses of FoodBusinessEvent and check for unhandled events:

✅ Verification successful

Further Verification Required

Please run the following scripts to list all subclasses of FoodBusinessEvent and identify any unhandled events:


All FoodBusinessEvent subclasses are handled

No additional event handlers are required.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: List all subclasses of FoodBusinessEvent and check if they are handled in FoodBusinessBloc.

# List all subclasses of FoodBusinessEvent
ast-grep --lang dart --pattern $'class $_ extends FoodBusinessEvent { $$$ }'

# Check which events are handled in FoodBusinessBloc
rg --type dart -A 2 'on<.*>' lib/features/food/presentation/bloc/food_business_bloc.dart

Length of output: 493


Script:

#!/bin/bash
# List all subclasses of FoodBusinessEvent
rg --type dart 'class\s+\w+\s+extends\s+FoodBusinessEvent'

# List all handled events in FoodBusinessBloc
rg --type dart 'on<(\w+)>' lib/features/food/presentation/bloc/food_business_bloc.dart

Length of output: 338

lib/features/home/presentation/screens/home_screen.dart (1)

242-242: ⚠️ Potential issue

Possible typo in tab label 'Diary'

The tab label is set to 'Diary'. If the intent is to represent dairy products, it should be 'Dairy'. Please verify the spelling to ensure it reflects the intended content.

Comment thread lib/features/food/domain/models/offer_type.dart
Comment thread lib/features/food/domain/models/cuisine_type.dart
Comment thread lib/features/food/domain/models/offer.dart
Comment thread lib/features/food/presentation/bloc/food_business_bloc.dart
Comment thread lib/features/food/presentation/bloc/food_business_bloc.dart
Comment thread lib/features/food/repository/food_business_repository.dart
Comment thread lib/features/food/repository/food_business_repository.dart
Comment thread lib/features/food/repository/food_business_repository.dart
Comment thread lib/features/home/presentation/screens/home_screen.dart
Comment thread lib/features/home/presentation/screens/home_screen.dart
@RaulRinconX RaulRinconX added the enhancement New feature or request label Oct 3, 2024
@RaulRinconX RaulRinconX added this to the Sprint 2 milestone Oct 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: DONE

Development

Successfully merging this pull request may close these issues.

2 participants