Pensil Teaching App
Pensil Teach App is an education platform created specifically for the tutors of the digital age. Pensil Teaching app reduce gap between tutor and students and form a bridge no matter how far they are.
App Screenshots
| Login | Verify OTP | Home | Batch Detail | 
|---|---|---|---|
![]()  | 
![]()  | 
![]()  | 
![]()  | 
| Assignment List | Videos List | Docs List | Create Batch | 
|---|---|---|---|
![]()  | 
![]()  | 
![]()  | 
![]()  | 
| Create Batch | Select Students | Select Students | Upload Material | 
|---|---|---|---|
![]()  | 
![]()  | 
![]()  | 
![]()  | 
| Upload Study Material | Upload Video | Upload Assignment | 
|---|---|---|
![]()  | 
![]()  | 
![]()  | 
Project Setup
Click to expand
1. Flutter Environment Setup
2. Clone the repo
$ git clone https://github.com/pensil-inc/flutter_pensil_app.git
$ cd flutter_pensil_app/
3. Setup the firebase app (Used for Google authentication)
- You'll need to create a Firebase instance. Follow the instructions at https://console.firebase.google.com.
 - Once your Firebase instance is created, you'll need to enable Google authentication.
 
- 
Go to the Firebase Console for your new instance.
 - 
Click "Authentication" in the left-hand menu
 - 
Click the "sign-in method" tab
 - 
Click "Google" and enable it
 - 
Create an app within your Firebase instance for Android, with package name >
com.pensil.pensilapp - 
Run the following command to get your SHA-1 key:
 
keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
- 
In the Firebase console, in the settings of your Android app, add your SHA-1 key by clicking "Add Fingerprint".
 - 
Download google-services.json
 - 
place
google-services.jsoninto/android/app/. 
- (skip if not running on iOS)
 
- Create an app within your Firebase instance for iOS, with your app package name
 - Follow instructions to download GoogleService-Info.plist
 - Open XCode, right click the Runner folder, select the "Add Files to 'Runner'" menu, and select the GoogleService-Info.plist file to add it to /ios/Runner in XCode
 - Open /ios/Runner/Info.plist in a text editor. Locate the CFBundleURLSchemes key. The second item in the array value of this key is specific to the Firebase instance. Replace it with the value for REVERSED_CLIENT_ID from GoogleService-Info.plist
 
Project Structure
Click to expand
|-- lib
|   |-- build.yaml
|   |-- config
|   |   |-- config.dart
|   |   '-- configs.dart
|   |-- helper
|   |   |-- constants.dart
|   |   |-- enum.dart
|   |   |-- images.dart
|   |   |-- shared_prefrence_helper.dart
|   |   '-- utility.dart
|   |-- locator.dart
|   |-- main.dart
|   |-- model
|   |   |-- actor_model.dart
|   |   |-- batch_meterial_model.dart
|   |   |-- batch_model.dart
|   |   | (8 more...)
|   |   |-- quiz_model.dart
|   |   |-- subject.dart
|   |   '-- video_model.dart
|   |-- resources
|   |   |-- contact_service.dart
|   |   |-- exceptions
|   |   |   '-- exceptions.dart
|   |   |-- repository
|   |   |   |-- batch_repository.dart
|   |   |   '-- teacher
|   |   |       '-- teacher_repository.dart
|   |   '-- service
|   |       |-- api_gatway.dart
|   |       |-- api_gatway_impl.dart
|   |       |-- dio_client.dart
|   |       |-- notification_service.dart
|   |       '-- session
|   |           |-- session.dart
|   |           '-- session_impl.dart
|   |-- states
|   |   |-- auth
|   |   |   '-- auth_state.dart
|   |   |-- base_state.dart
|   |   |-- home_state.dart
|   |   |-- notificaion
|   |   |   '-- notification_state.dart
|   |   |-- quiz
|   |   |   '-- quiz_state.dart
|   |   '-- teacher
|   |       |-- announcement_state.dart
|   |       |-- batch_detail_state.dart
|   |       |-- create_batch_state.dart
|   |       |-- material
|   |       |   '-- batch_material_state.dart
|   |       |-- poll_state.dart
|   |       '-- video
|   |           '-- video_state.dart
|   '-- ui
|       |-- app.dart
|       |-- kit
|       |   |-- alert.dart
|       |   '-- overlay_loader.dart
|       |-- page
|       |   |-- announcement
|       |   |   '-- create_announcement.dart
|       |   |-- auth
|       |   |   |-- forgot_password.dart
|       |   |   |-- login.dart
|       |   |   |-- signup.dart
|       |   |   |-- update_password.dart
|       |   |   |-- verify_Otp.dart
|       |   |   '-- widgets
|       |   |       '-- Otp_widget.dart
|       |   |-- batch
|       |   |   |-- batch_master_page.dart
|       |   |   |-- create_batch
|       |   |   |   |-- create_batch.dart
|       |   |   |   |-- device_contacts_page.dart
|       |   |   |   |-- search_student_delegate.dart
|       |   |   |   '-- widget
|       |   |   |       |-- add_students_widget.dart
|       |   |   |       |-- batch_time_slots.dart
|       |   |   |       '-- search_batch_delegate.dart
|       |   |   |-- pages
|       |   |   |   |-- batch_assignment_page.dart
|       |   |   |   |-- detail
|       |   |   |   |   |-- batch_detail_page.dart
|       |   |   |   |   '-- student_list.dart
|       |   |   |   |-- material
|       |   |   |   |   |-- batch_study_material_page.dart
|       |   |   |   |   |-- upload_material.dart
|       |   |   |   |   '-- widget
|       |   |   |   |       '-- batch_material_card.dart
|       |   |   |   |-- quiz
|       |   |   |   |   |-- quiz_list_page.dart
|       |   |   |   |   |-- result
|       |   |   |   |   |   |-- quiz_result_page.dart
|       |   |   |   |   |   '-- view_quiz_solution.dart
|       |   |   |   |   '-- start
|       |   |   |   |       |-- start_quiz.dart
|       |   |   |   |       '-- widget
|       |   |   |   |           |-- question_count_section.dart
|       |   |   |   |           '-- timer.dart
|       |   |   |   '-- video
|       |   |   |       |-- add_video_page.dart
|       |   |   |       |-- batch_videos_page.dart
|       |   |   |       |-- video_player_pag2e.dart
|       |   |   |       |-- video_player_page.dart
|       |   |   |       |-- video_preview.dart
|       |   |   |       '-- widget
|       |   |   |           '-- batch_video_Card.dart
|       |   |   '-- widget
|       |   |       '-- tile_action_widget.dart
|       |   |-- common
|       |   |   |-- pdf_view.dart
|       |   |   |-- splash.dart
|       |   |   '-- web_view.page.dart
|       |   |-- home
|       |   |   |-- home_Scaffold.dart
|       |   |   |-- home_page_student.dart
|       |   |   |-- home_page_teacher.dart
|       |   |   |-- student_list_preview.dart
|       |   |   '-- widget
|       |   |       |-- announcement_widget.dart
|       |   |       |-- batch_widget.dart
|       |   |       '-- poll_widget.dart
|       |   |-- notification
|       |   |   '-- notifications_page.dart
|       |   '-- poll
|       |       |-- View_all_poll_page.dart
|       |       |-- create_poll.dart
|       |       '-- poll_option_widget.dart
|       |-- theme
|       |   |-- extentions.dart
|       |   |-- light_color.dart
|       |   |-- text_theme.dart
|       |   '-- theme.dart
|       '-- widget
|           |-- fab
|           |   |-- animated_fab.dart
|           |   '-- fab_button.dart
|           |-- form
|           |   |-- p_textfield.dart
|           |   '-- validator.dart
|           |-- image_viewer.dart
|           |-- p_avatar.dart
|           |-- p_button.dart
|           |-- p_chiip.dart
|           |-- p_loader.dart
|           |-- p_title_text.dart
|           |-- secondary_app_bar.dart
|           '-- url_Text.dart
|-- pubspec.yaml
Dependencies
Click to expand
- intl
 - dio
 - share
 - share
 - dartz
 - get_it
 - freezed
 - provider
 - equatable
 - file_picker
 - filter_list
 - build_runner
 - url_launcher
 - add_thumbnail
 - image_picker
 - firebase_auth
 - firebase_core
 - google_sign_in
 - json_annotation
 - webview_flutter
 - contacts_service
 - permission_handler
 - firebase_messaging
 - json_serializable
 - freezed_annotation
 - shared_preferences
 - advance_pdf_viewer
 - cached_network_image
 - cached_network_image
 - flutter_launcher_icons
 
Server
This Pensil teaching app uses Node.JS + V8-Engine (Based on Express) in backend to store,retrive and perform logical operation on data for the application.
The pensil-app-backend repo contains the server side code.
            













