# CircuitVerse Mobile [![CI](https://github.com/CircuitVerse/mobile-app/actions/workflows/ci.yml/badge.svg)](https://github.com/CircuitVerse/mobile-app/actions/workflows/ci.yml) [![CD](https://github.com/CircuitVerse/mobile-app/actions/workflows/cd.yml/badge.svg)](https://github.com/CircuitVerse/mobile-app/actions/workflows/cd.yml) CircuitVerse for mobile is a cross-platform application built in [Flutter](https://flutter.dev/) using CircuitVerse API. ## Getting Started Follow these instructions to build and run the project ### Prerequisites - Flutter `3.32.2` (stable) - Dart `3.8.1` > Tip: To ensure you’re always using the correct Flutter version, consider using [FVM (Flutter Version Manager)](https://fvm.app/) to manage versions. ### Setup Flutter A detailed guide for multiple platforms setup can be found [in the Flutter installation guide](https://docs.flutter.dev/get-started/install) ### Setup Project - Clone this repository using `git clone https://github.com/CircuitVerse/mobile-app.git`. - `cd` into `mobile_app`. - `flutter pub get` to get all the dependencies. - Generate files using Builder Runner (**required**) ``` flutter pub run build_runner build --delete-conflicting-outputs ``` - Switch to mobile-app's git hooks (**optional but recommended**) ``` git config core.hooksPath .githooks/ # Make sure npm is installed to run the next command npm install -g @commitlint/config-conventional @commitlint/cli ``` > Mobile App enforces [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/), make sure to read and follow them. ### Running the app Make sure you have a connected Android/iOS device/simulator and run the following command to build and run the app in debug mode. `flutter run` #### Running on Chrome (Web) To run the app on Chrome, use: `flutter run -d chrome` > **Note:** When running on Chrome locally, all API calls to `circuitverse.org` will be blocked by the browser's **CORS policy**. This causes Login, Register, and all data loading to fail. To bypass this during local development, launch Chrome with the `--disable-web-security` flag: ```bash flutter run -d chrome --web-browser-flag "--disable-web-security" ``` > ⚠️ Only use `--disable-web-security` for **local development**. Never use it in production. ### Android OAuth Config This project uses Flutter 3.32.2 and hence the support for compile-time variables. To use compile-time variables pass them in `--dart-defines` as `flutter run --dart-define=VAR_NAME=VAR_VALUE`. Supported `dart-defines` include : #### GitHub Configuration 1. `GITHUB_OAUTH_CLIENT_ID` 2. `GITHUB_OAUTH_CLIENT_SECRET` #### Google Configuration For Google OAuth we use [google_sign_in](https://pub.dev/packages/google_sign_in). You'll require a Java KeyStore(`.jks`) 1. Add `cv_debug.jks` in `android/app/`. 2. Add `key.debug.properties` in `android/`. Note: The OAuth Configuration section is not mandatory to get started. To get hold of the above secrets/files drop a message on slack with clear requirements and we'll take care. ## Project Structure ```bash mobile-app/lib/ ├── config/ # configuration files like environment_config ├── enums/ # enum files | └── view_state.dart # defines view states i.e Idle, Busy, Error | └── auth_state.dart # defines auth states i.e logged in using Google/Github/Email ├── l10n/ # localization files like intl_en.arb ├── locale/ # AppLocalization & AppLocalizationDelegate ├── managers/ | └── dialog_manager.dart # show dialogs using dialog navigation key ├── models/ # model classes | └── dialog_models.dart # dialog request and response models ... ├── services/ # services | ├── API/ # API implementations | └── dialog_service.dart # handles dialog | └── local_storage_service.dart # handles local storage (shared prefs) ├── ui/ # UI layer | ├── views/ # views | | └── base_view.dart | | └── cv_landing_view.dart | | └── startup_view.dart | └── components/ # shared components ├── utils/ # utilities such as api_utils routes.dart and styles.dart ├── viewmodels/ # Viewmodels layer ├── app_theme.dart # Shared App Colors/border decorations etc. ├── constants.dart # App constants ├── locator.dart # dependency injection using get_it ├── main.dart # <3 of the app ``` ## Features ### Groups - Create Groups. - Edit/Update/Delete Groups. - Add/Delete Members to the group. ### Assignments - Create/Add Assignment to a Group. - Edit Assignments. - Check Assignment Submissions. - Grade Assignment's projects. - Update/Delete Grades. ### Projects/Circuits - Fork Project. - Edit/Delete Project. - Add/Delete Collaborators. - Star Project to favourites. - View Projects you created/starred. ### Profile - View/Edit Profile ### Multi-language Support - English - Hindi - Arabic ## Screenshots

Splash View Home View NavDrawer View NavDrawer View Login Teachers View About View Contribute View Groups View Assignment Details View Assignment Date View Assignment Time View Login View Register View Profile View Featured Circuits Exit Page

### Simulator

Simulator

### Multilingual Support

English Hindi Arabic

### Dark Mode

Splash View Dark

## Community We would love to hear from you! We communicate on the following platforms: [![Slack](https://img.shields.io/badge/chat-on_slack-purple.svg?style=for-the-badge&logo=slack)](https://circuitverse.org/slack) ## Contributing Whether you have feature requests/ideas, code improvements, refactoring, performance improvements, help is always welcome. The more contributions, the better it gets. If you found any bugs, consider opening an [issue](https://github.com/CircuitVerse/mobile-app/issues/new). ## Contributors CircuitVerse Mobile App Contributors ## License This project is licensed under the [MIT License](LICENSE).