├── .gitattributes ├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── bookini │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── fonts │ └── GT Sectra Fine Regular.ttf └── images │ ├── Logo.png │ └── test_image.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── core │ ├── api_service.dart │ ├── consts.dart │ ├── depandancy_injection.dart │ ├── errors │ │ └── failure.dart │ ├── routes_config.dart │ └── utils │ │ ├── custom_snack_bar.dart │ │ ├── list_create.dart │ │ └── luanch_url.dart ├── main.dart ├── models │ └── book │ │ ├── access_info.dart │ │ ├── book.dart │ │ ├── epub.dart │ │ ├── image_links.dart │ │ ├── industry_identifier.dart │ │ ├── panelization_summary.dart │ │ ├── pdf.dart │ │ ├── reading_modes.dart │ │ ├── sale_info.dart │ │ ├── search_info.dart │ │ └── volume_info.dart ├── repository │ ├── home │ │ ├── home_repo.dart │ │ └── home_repo_impl.dart │ └── search │ │ ├── search_repo.dart │ │ └── search_repo_impl.dart ├── todo.dart ├── view │ ├── common │ │ ├── book_card.dart │ │ └── custom_app_bar.dart │ ├── detaills │ │ ├── detaills_view.dart │ │ └── widgets │ │ │ ├── action_button.dart │ │ │ ├── custom_book_card.dart │ │ │ ├── custom_title.dart │ │ │ ├── detaills_body.dart │ │ │ ├── rating_box.dart │ │ │ └── similiar_books_section.dart │ ├── home │ │ ├── home.dart │ │ └── widgets │ │ │ ├── best_seller_book_card.dart │ │ │ ├── custom_list_view.dart │ │ │ ├── home_body.dart │ │ │ └── list_view_books.dart │ ├── search │ │ ├── search_view.dart │ │ └── widgets │ │ │ ├── custom_text_field.dart │ │ │ ├── search_body.dart │ │ │ └── search_list_view.dart │ └── splash │ │ ├── splash.dart │ │ └── widgets │ │ ├── sliding_text.dart │ │ └── splash_body.dart └── view_model │ ├── detaills │ └── similar_books_cubit │ │ ├── similar_books_cubit.dart │ │ └── similar_books_state.dart │ ├── home │ ├── featured_books_cubit │ │ ├── featured_books_cubit.dart │ │ └── featured_books_state.dart │ └── newest_books_cubit │ │ ├── newest_book_cubit.dart │ │ └── newest_book_state.dart │ └── search │ └── search_books │ ├── search_books_cubit.dart │ └── search_books_state.dart ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── app_icon_1024.png │ │ ├── app_icon_128.png │ │ ├── app_icon_16.png │ │ ├── app_icon_256.png │ │ ├── app_icon_32.png │ │ ├── app_icon_512.png │ │ └── app_icon_64.png │ ├── Base.lproj │ └── MainMenu.xib │ ├── Configs │ ├── AppInfo.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── pubspec.lock ├── pubspec.yaml └── web ├── favicon.png ├── icons ├── Icon-192.png ├── Icon-512.png ├── Icon-maskable-192.png └── Icon-maskable-512.png ├── index.html └── manifest.json /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled. 5 | 6 | version: 7 | revision: 62bd79521d8d007524e351747471ba66696fc2d4 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 17 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 18 | - platform: android 19 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 20 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 21 | - platform: ios 22 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 23 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 24 | - platform: linux 25 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 26 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 27 | - platform: macos 28 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 29 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 30 | - platform: web 31 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 32 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 33 | - platform: windows 34 | create_revision: 62bd79521d8d007524e351747471ba66696fc2d4 35 | base_revision: 62bd79521d8d007524e351747471ba66696fc2d4 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bookini 2 | A Application that provides books with detailled description on it , Built in With Flutter and Bloc Pattern , also used mvvm architecture 3 | 4 | 5 | ![image](https://cdn.discordapp.com/attachments/655813037483360276/1098120924580036619/bookini2.png) 6 | 7 | 8 | ### Features 9 | - Good Looking Ui 10 | - Clean Code and maintainble 11 | - A Lot of free books are included 12 | ### Author 13 | - Fares Bekkouche 14 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion flutter.compileSdkVersion 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.example.bookini" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 50 | minSdkVersion flutter.minSdkVersion 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/bookini/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.bookini 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.2.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/fonts/GT Sectra Fine Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/assets/fonts/GT Sectra Fine Regular.ttf -------------------------------------------------------------------------------- /assets/images/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/assets/images/Logo.png -------------------------------------------------------------------------------- /assets/images/test_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/assets/images/test_image.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1300; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | alwaysOutOfDate = 1; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | ); 178 | inputPaths = ( 179 | ); 180 | name = "Thin Binary"; 181 | outputPaths = ( 182 | ); 183 | runOnlyForDeploymentPostprocessing = 0; 184 | shellPath = /bin/sh; 185 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 186 | }; 187 | 9740EEB61CF901F6004384FC /* Run Script */ = { 188 | isa = PBXShellScriptBuildPhase; 189 | alwaysOutOfDate = 1; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | ); 193 | inputPaths = ( 194 | ); 195 | name = "Run Script"; 196 | outputPaths = ( 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | shellPath = /bin/sh; 200 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 201 | }; 202 | /* End PBXShellScriptBuildPhase section */ 203 | 204 | /* Begin PBXSourcesBuildPhase section */ 205 | 97C146EA1CF9000F007C117D /* Sources */ = { 206 | isa = PBXSourcesBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 210 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXSourcesBuildPhase section */ 215 | 216 | /* Begin PBXVariantGroup section */ 217 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 218 | isa = PBXVariantGroup; 219 | children = ( 220 | 97C146FB1CF9000F007C117D /* Base */, 221 | ); 222 | name = Main.storyboard; 223 | sourceTree = ""; 224 | }; 225 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 226 | isa = PBXVariantGroup; 227 | children = ( 228 | 97C147001CF9000F007C117D /* Base */, 229 | ); 230 | name = LaunchScreen.storyboard; 231 | sourceTree = ""; 232 | }; 233 | /* End PBXVariantGroup section */ 234 | 235 | /* Begin XCBuildConfiguration section */ 236 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | ALWAYS_SEARCH_USER_PATHS = NO; 240 | CLANG_ANALYZER_NONNULL = YES; 241 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 242 | CLANG_CXX_LIBRARY = "libc++"; 243 | CLANG_ENABLE_MODULES = YES; 244 | CLANG_ENABLE_OBJC_ARC = YES; 245 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 246 | CLANG_WARN_BOOL_CONVERSION = YES; 247 | CLANG_WARN_COMMA = YES; 248 | CLANG_WARN_CONSTANT_CONVERSION = YES; 249 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 250 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 251 | CLANG_WARN_EMPTY_BODY = YES; 252 | CLANG_WARN_ENUM_CONVERSION = YES; 253 | CLANG_WARN_INFINITE_RECURSION = YES; 254 | CLANG_WARN_INT_CONVERSION = YES; 255 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 257 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 258 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 259 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 260 | CLANG_WARN_STRICT_PROTOTYPES = YES; 261 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 262 | CLANG_WARN_UNREACHABLE_CODE = YES; 263 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 264 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 265 | COPY_PHASE_STRIP = NO; 266 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 267 | ENABLE_NS_ASSERTIONS = NO; 268 | ENABLE_STRICT_OBJC_MSGSEND = YES; 269 | GCC_C_LANGUAGE_STANDARD = gnu99; 270 | GCC_NO_COMMON_BLOCKS = YES; 271 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 272 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 273 | GCC_WARN_UNDECLARED_SELECTOR = YES; 274 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 275 | GCC_WARN_UNUSED_FUNCTION = YES; 276 | GCC_WARN_UNUSED_VARIABLE = YES; 277 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 278 | MTL_ENABLE_DEBUG_INFO = NO; 279 | SDKROOT = iphoneos; 280 | SUPPORTED_PLATFORMS = iphoneos; 281 | TARGETED_DEVICE_FAMILY = "1,2"; 282 | VALIDATE_PRODUCT = YES; 283 | }; 284 | name = Profile; 285 | }; 286 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 287 | isa = XCBuildConfiguration; 288 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 289 | buildSettings = { 290 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 291 | CLANG_ENABLE_MODULES = YES; 292 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 293 | ENABLE_BITCODE = NO; 294 | INFOPLIST_FILE = Runner/Info.plist; 295 | LD_RUNPATH_SEARCH_PATHS = ( 296 | "$(inherited)", 297 | "@executable_path/Frameworks", 298 | ); 299 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bookini; 300 | PRODUCT_NAME = "$(TARGET_NAME)"; 301 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 302 | SWIFT_VERSION = 5.0; 303 | VERSIONING_SYSTEM = "apple-generic"; 304 | }; 305 | name = Profile; 306 | }; 307 | 97C147031CF9000F007C117D /* Debug */ = { 308 | isa = XCBuildConfiguration; 309 | buildSettings = { 310 | ALWAYS_SEARCH_USER_PATHS = NO; 311 | CLANG_ANALYZER_NONNULL = YES; 312 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 313 | CLANG_CXX_LIBRARY = "libc++"; 314 | CLANG_ENABLE_MODULES = YES; 315 | CLANG_ENABLE_OBJC_ARC = YES; 316 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 317 | CLANG_WARN_BOOL_CONVERSION = YES; 318 | CLANG_WARN_COMMA = YES; 319 | CLANG_WARN_CONSTANT_CONVERSION = YES; 320 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 321 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 322 | CLANG_WARN_EMPTY_BODY = YES; 323 | CLANG_WARN_ENUM_CONVERSION = YES; 324 | CLANG_WARN_INFINITE_RECURSION = YES; 325 | CLANG_WARN_INT_CONVERSION = YES; 326 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 327 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 328 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 329 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 330 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 331 | CLANG_WARN_STRICT_PROTOTYPES = YES; 332 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 333 | CLANG_WARN_UNREACHABLE_CODE = YES; 334 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 335 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 336 | COPY_PHASE_STRIP = NO; 337 | DEBUG_INFORMATION_FORMAT = dwarf; 338 | ENABLE_STRICT_OBJC_MSGSEND = YES; 339 | ENABLE_TESTABILITY = YES; 340 | GCC_C_LANGUAGE_STANDARD = gnu99; 341 | GCC_DYNAMIC_NO_PIC = NO; 342 | GCC_NO_COMMON_BLOCKS = YES; 343 | GCC_OPTIMIZATION_LEVEL = 0; 344 | GCC_PREPROCESSOR_DEFINITIONS = ( 345 | "DEBUG=1", 346 | "$(inherited)", 347 | ); 348 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 349 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 350 | GCC_WARN_UNDECLARED_SELECTOR = YES; 351 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 352 | GCC_WARN_UNUSED_FUNCTION = YES; 353 | GCC_WARN_UNUSED_VARIABLE = YES; 354 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 355 | MTL_ENABLE_DEBUG_INFO = YES; 356 | ONLY_ACTIVE_ARCH = YES; 357 | SDKROOT = iphoneos; 358 | TARGETED_DEVICE_FAMILY = "1,2"; 359 | }; 360 | name = Debug; 361 | }; 362 | 97C147041CF9000F007C117D /* Release */ = { 363 | isa = XCBuildConfiguration; 364 | buildSettings = { 365 | ALWAYS_SEARCH_USER_PATHS = NO; 366 | CLANG_ANALYZER_NONNULL = YES; 367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 368 | CLANG_CXX_LIBRARY = "libc++"; 369 | CLANG_ENABLE_MODULES = YES; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 372 | CLANG_WARN_BOOL_CONVERSION = YES; 373 | CLANG_WARN_COMMA = YES; 374 | CLANG_WARN_CONSTANT_CONVERSION = YES; 375 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 376 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 377 | CLANG_WARN_EMPTY_BODY = YES; 378 | CLANG_WARN_ENUM_CONVERSION = YES; 379 | CLANG_WARN_INFINITE_RECURSION = YES; 380 | CLANG_WARN_INT_CONVERSION = YES; 381 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 382 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 383 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 384 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 385 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 386 | CLANG_WARN_STRICT_PROTOTYPES = YES; 387 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 388 | CLANG_WARN_UNREACHABLE_CODE = YES; 389 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 390 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 391 | COPY_PHASE_STRIP = NO; 392 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 393 | ENABLE_NS_ASSERTIONS = NO; 394 | ENABLE_STRICT_OBJC_MSGSEND = YES; 395 | GCC_C_LANGUAGE_STANDARD = gnu99; 396 | GCC_NO_COMMON_BLOCKS = YES; 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 404 | MTL_ENABLE_DEBUG_INFO = NO; 405 | SDKROOT = iphoneos; 406 | SUPPORTED_PLATFORMS = iphoneos; 407 | SWIFT_COMPILATION_MODE = wholemodule; 408 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 409 | TARGETED_DEVICE_FAMILY = "1,2"; 410 | VALIDATE_PRODUCT = YES; 411 | }; 412 | name = Release; 413 | }; 414 | 97C147061CF9000F007C117D /* Debug */ = { 415 | isa = XCBuildConfiguration; 416 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 417 | buildSettings = { 418 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 419 | CLANG_ENABLE_MODULES = YES; 420 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 421 | ENABLE_BITCODE = NO; 422 | INFOPLIST_FILE = Runner/Info.plist; 423 | LD_RUNPATH_SEARCH_PATHS = ( 424 | "$(inherited)", 425 | "@executable_path/Frameworks", 426 | ); 427 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bookini; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 430 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 431 | SWIFT_VERSION = 5.0; 432 | VERSIONING_SYSTEM = "apple-generic"; 433 | }; 434 | name = Debug; 435 | }; 436 | 97C147071CF9000F007C117D /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 439 | buildSettings = { 440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 441 | CLANG_ENABLE_MODULES = YES; 442 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 443 | ENABLE_BITCODE = NO; 444 | INFOPLIST_FILE = Runner/Info.plist; 445 | LD_RUNPATH_SEARCH_PATHS = ( 446 | "$(inherited)", 447 | "@executable_path/Frameworks", 448 | ); 449 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bookini; 450 | PRODUCT_NAME = "$(TARGET_NAME)"; 451 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 452 | SWIFT_VERSION = 5.0; 453 | VERSIONING_SYSTEM = "apple-generic"; 454 | }; 455 | name = Release; 456 | }; 457 | /* End XCBuildConfiguration section */ 458 | 459 | /* Begin XCConfigurationList section */ 460 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 461 | isa = XCConfigurationList; 462 | buildConfigurations = ( 463 | 97C147031CF9000F007C117D /* Debug */, 464 | 97C147041CF9000F007C117D /* Release */, 465 | 249021D3217E4FDB00AE95B9 /* Profile */, 466 | ); 467 | defaultConfigurationIsVisible = 0; 468 | defaultConfigurationName = Release; 469 | }; 470 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 471 | isa = XCConfigurationList; 472 | buildConfigurations = ( 473 | 97C147061CF9000F007C117D /* Debug */, 474 | 97C147071CF9000F007C117D /* Release */, 475 | 249021D4217E4FDB00AE95B9 /* Profile */, 476 | ); 477 | defaultConfigurationIsVisible = 0; 478 | defaultConfigurationName = Release; 479 | }; 480 | /* End XCConfigurationList section */ 481 | }; 482 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 483 | } 484 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Bookini 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | bookini 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/core/api_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | class ApiService { 4 | final _baseUrl = 'https://www.googleapis.com/books/v1/'; 5 | final Dio _dio; 6 | 7 | ApiService(this._dio); 8 | 9 | Future> get({required String endPoint}) async { 10 | Response response = await _dio.get('$_baseUrl$endPoint'); 11 | return response.data; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/consts.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | class AppConsts { 4 | static Color kPrimaryColor = const Color(0xff100B20); 5 | static Duration kTranstionDuration = const Duration(milliseconds: 250); 6 | static String kGtSectraFine = 'GT Sectra Fine'; 7 | } 8 | 9 | class AssetsData { 10 | static const logo = 'assets/images/Logo.png'; 11 | static const testImage = 'assets/images/test_image.png'; 12 | } 13 | 14 | abstract class Styles { 15 | static const textStyle18 = TextStyle( 16 | fontSize: 18, 17 | fontWeight: FontWeight.w600, 18 | ); 19 | static const textStyle20 = TextStyle( 20 | fontSize: 20, 21 | fontWeight: FontWeight.normal, 22 | ); 23 | static TextStyle textStyle30 = TextStyle( 24 | fontSize: 30, 25 | fontWeight: FontWeight.w900, 26 | fontFamily: AppConsts.kGtSectraFine, 27 | letterSpacing: 1.2, 28 | ); 29 | static const textStyle14 = TextStyle( 30 | fontSize: 14, 31 | fontWeight: FontWeight.normal, 32 | ); 33 | 34 | static const textStyle16 = TextStyle( 35 | fontSize: 16, 36 | fontWeight: FontWeight.w500, 37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /lib/core/depandancy_injection.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/api_service.dart'; 2 | import 'package:bookini/repository/home/home_repo_impl.dart'; 3 | import 'package:bookini/repository/search/search_repo_impl.dart'; 4 | import 'package:dio/dio.dart'; 5 | import 'package:get_it/get_it.dart'; 6 | 7 | void setupDi() { 8 | GetIt getIt = GetIt.instance; 9 | 10 | getIt.registerSingleton(Dio()); 11 | getIt.registerSingleton(ApiService(getIt.get())); 12 | getIt.registerSingleton(HomeRepoImpl(getIt.get())); 13 | getIt.registerSingleton(SearchRepoImpl(getIt.get())); 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/errors/failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | abstract class Failure { 4 | final String errorMessage; 5 | 6 | Failure(this.errorMessage); 7 | } 8 | 9 | class ServerFailure extends Failure { 10 | ServerFailure(super.errorMessage); 11 | 12 | factory ServerFailure.fromDioError(DioError dioError) { 13 | switch (dioError.type) { 14 | case DioErrorType.connectionTimeout: 15 | return ServerFailure('Connection timeout with ApiServer'); 16 | 17 | case DioErrorType.sendTimeout: 18 | return ServerFailure('Send timeout with ApiServer'); 19 | 20 | case DioErrorType.receiveTimeout: 21 | return ServerFailure('Receive timeout with ApiServer'); 22 | 23 | case DioErrorType.badResponse: 24 | return ServerFailure.fromResponse( 25 | dioError.response!.statusCode, dioError.response!.data); 26 | case DioErrorType.cancel: 27 | return ServerFailure('Request to ApiServer was canceld'); 28 | 29 | case DioErrorType.unknown: 30 | if (dioError.message!.contains('SocketException')) { 31 | return ServerFailure('No Internet Connection'); 32 | } 33 | return ServerFailure('Unexpected Error, Please try again!'); 34 | default: 35 | return ServerFailure('Opps There was an Error, Please try again'); 36 | } 37 | } 38 | factory ServerFailure.fromResponse(int? statuscode, dynamic res) { 39 | if (statuscode == 400 || statuscode == 401 || statuscode == 403) { 40 | return ServerFailure(res["error"]["message"]); 41 | } else if (statuscode == 404) { 42 | return ServerFailure("bad request! pls try again later "); 43 | } 44 | else if(statuscode ==500){ 45 | return ServerFailure("server going down ! pls try again later "); 46 | } 47 | else{ 48 | return ServerFailure("something went wrong ! pls try again later "); 49 | } 50 | } 51 | } 52 | 53 | class CacheFailure extends Failure { 54 | CacheFailure(super.errorMessage); 55 | } 56 | 57 | class NetworkFailure extends Failure { 58 | NetworkFailure(super.errorMessage); 59 | } 60 | -------------------------------------------------------------------------------- /lib/core/routes_config.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view_model/search/search_books/search_books_cubit.dart'; 2 | 3 | import '../repository/home/home_repo_impl.dart'; 4 | import '../repository/search/search_repo_impl.dart'; 5 | import '../view/detaills/detaills_view.dart'; 6 | import '../view/search/search_view.dart'; 7 | import '../view_model/detaills/similar_books_cubit/similar_books_cubit.dart'; 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_bloc/flutter_bloc.dart'; 10 | import 'package:get_it/get_it.dart'; 11 | import 'package:go_router/go_router.dart'; 12 | 13 | import '../models/book/book.dart'; 14 | import '../view/home/home.dart'; 15 | import '../view/splash/splash.dart'; 16 | 17 | abstract class AppRouter { 18 | static final GoRouter router = GoRouter( 19 | routes: [ 20 | GoRoute( 21 | path: '/', 22 | builder: (BuildContext context, GoRouterState state) { 23 | return const SplashView(); 24 | }, 25 | ), 26 | GoRoute( 27 | path: '/home', 28 | builder: (BuildContext context, GoRouterState state) { 29 | return const Home(); 30 | }, 31 | ), 32 | GoRoute( 33 | path: '/detaills', 34 | builder: (BuildContext context, GoRouterState state) { 35 | return BlocProvider( 36 | create: (context) => SimilarBooksCubit(GetIt.I.get()), 37 | child: DetaillsView(book: state.extra as Book), 38 | ); 39 | }, 40 | ), 41 | GoRoute( 42 | path: '/search', 43 | builder: (BuildContext context, GoRouterState state) { 44 | return BlocProvider( 45 | create: (context) => SearchBooksCubit(GetIt.I.get()), 46 | child: const SearchView(), 47 | ); 48 | }, 49 | ), 50 | ], 51 | ); 52 | } 53 | -------------------------------------------------------------------------------- /lib/core/utils/custom_snack_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | void customSnackBar(context, String text) { 4 | ScaffoldMessenger.of(context).showSnackBar( 5 | SnackBar( 6 | content: Text(text), 7 | ), 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/utils/list_create.dart: -------------------------------------------------------------------------------- 1 | import '../../models/book/book.dart'; 2 | 3 | List creatingList(List items) { 4 | List books = []; 5 | for (var item in items) { 6 | books.add(Book.fromMap(item)); 7 | } 8 | return books; 9 | } -------------------------------------------------------------------------------- /lib/core/utils/luanch_url.dart: -------------------------------------------------------------------------------- 1 | import 'package:url_launcher/url_launcher.dart'; 2 | import 'custom_snack_bar.dart'; 3 | 4 | Future launchCustomUr(context, String? url) async { 5 | if (url != null) { 6 | Uri uri = Uri.parse(url); 7 | if (await canLaunchUrl(uri)) { 8 | await launchUrl(uri); 9 | } else { 10 | customSnackBar(context, 'Cannot launch $url'); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/consts.dart'; 2 | import 'package:bookini/repository/home/home_repo_impl.dart'; 3 | import 'package:bookini/view_model/home/featured_books_cubit/featured_books_cubit.dart'; 4 | import 'package:bookini/view_model/home/newest_books_cubit/newest_book_cubit.dart'; 5 | import 'package:device_preview/device_preview.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:flutter_bloc/flutter_bloc.dart'; 8 | import 'package:get_it/get_it.dart'; 9 | import 'package:google_fonts/google_fonts.dart'; 10 | import 'core/depandancy_injection.dart'; 11 | import 'core/routes_config.dart'; 12 | 13 | void main() { 14 | setupDi(); 15 | runApp(DevicePreview( 16 | tools: const [...DevicePreview.defaultTools], 17 | enabled: false, 18 | builder: (BuildContext _) => const MyApp(), 19 | )); 20 | } 21 | 22 | class MyApp extends StatelessWidget { 23 | const MyApp({super.key}); 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | return MultiBlocProvider( 28 | providers: [ 29 | BlocProvider( 30 | create: (BuildContext context) => FeaturedBooksCubit( 31 | GetIt.instance.get(), 32 | )..fetchData()), 33 | BlocProvider( 34 | create: (BuildContext context) => NewestBookCubit( 35 | GetIt.instance.get(), 36 | )..fetchBooks()) 37 | ], 38 | child: MaterialApp.router( 39 | routerConfig: AppRouter.router, 40 | debugShowCheckedModeBanner: false, 41 | theme: ThemeData.dark().copyWith( 42 | scaffoldBackgroundColor: AppConsts.kPrimaryColor, 43 | textTheme: 44 | GoogleFonts.montserratTextTheme(ThemeData.dark().textTheme), 45 | ), 46 | ), 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/models/book/access_info.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | import 'epub.dart'; 6 | import 'pdf.dart'; 7 | 8 | class AccessInfo extends Equatable { 9 | final String? country; 10 | final String? viewability; 11 | final bool? embeddable; 12 | final bool? publicDomain; 13 | final String? textToSpeechPermission; 14 | final Epub? epub; 15 | final Pdf? pdf; 16 | final String? webReaderLink; 17 | final String? accessViewStatus; 18 | final bool? quoteSharingAllowed; 19 | 20 | const AccessInfo({ 21 | this.country, 22 | this.viewability, 23 | this.embeddable, 24 | this.publicDomain, 25 | this.textToSpeechPermission, 26 | this.epub, 27 | this.pdf, 28 | this.webReaderLink, 29 | this.accessViewStatus, 30 | this.quoteSharingAllowed, 31 | }); 32 | 33 | factory AccessInfo.fromMap(Map data) => AccessInfo( 34 | country: data['country'] as String?, 35 | viewability: data['viewability'] as String?, 36 | embeddable: data['embeddable'] as bool?, 37 | publicDomain: data['publicDomain'] as bool?, 38 | textToSpeechPermission: data['textToSpeechPermission'] as String?, 39 | epub: data['epub'] == null 40 | ? null 41 | : Epub.fromMap(data['epub'] as Map), 42 | pdf: data['pdf'] == null 43 | ? null 44 | : Pdf.fromMap(data['pdf'] as Map), 45 | webReaderLink: data['webReaderLink'] as String?, 46 | accessViewStatus: data['accessViewStatus'] as String?, 47 | quoteSharingAllowed: data['quoteSharingAllowed'] as bool?, 48 | ); 49 | 50 | Map toMap() => { 51 | 'country': country, 52 | 'viewability': viewability, 53 | 'embeddable': embeddable, 54 | 'publicDomain': publicDomain, 55 | 'textToSpeechPermission': textToSpeechPermission, 56 | 'epub': epub?.toMap(), 57 | 'pdf': pdf?.toMap(), 58 | 'webReaderLink': webReaderLink, 59 | 'accessViewStatus': accessViewStatus, 60 | 'quoteSharingAllowed': quoteSharingAllowed, 61 | }; 62 | 63 | /// `dart:convert` 64 | /// 65 | /// Parses the string and returns the resulting Json object as [AccessInfo]. 66 | factory AccessInfo.fromJson(String data) { 67 | return AccessInfo.fromMap(json.decode(data) as Map); 68 | } 69 | 70 | /// `dart:convert` 71 | /// 72 | /// Converts [AccessInfo] to a JSON string. 73 | String toJson() => json.encode(toMap()); 74 | 75 | @override 76 | List get props { 77 | return [ 78 | country, 79 | viewability, 80 | embeddable, 81 | publicDomain, 82 | textToSpeechPermission, 83 | epub, 84 | pdf, 85 | webReaderLink, 86 | accessViewStatus, 87 | quoteSharingAllowed, 88 | ]; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /lib/models/book/book.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | import 'access_info.dart'; 6 | import 'sale_info.dart'; 7 | import 'search_info.dart'; 8 | import 'volume_info.dart'; 9 | 10 | class Book extends Equatable { 11 | final String? kind; 12 | final String? id; 13 | final String? etag; 14 | final String? selfLink; 15 | final VolumeInfo volumeInfo; 16 | final SaleInfo? saleInfo; 17 | final AccessInfo? accessInfo; 18 | final SearchInfo? searchInfo; 19 | 20 | const Book({ 21 | this.kind, 22 | this.id, 23 | this.etag, 24 | this.selfLink, 25 | required this.volumeInfo, 26 | this.saleInfo, 27 | this.accessInfo, 28 | this.searchInfo, 29 | }); 30 | 31 | factory Book.fromMap(Map data) => Book( 32 | kind: data['kind'] as String?, 33 | id: data['id'] as String?, 34 | etag: data['etag'] as String?, 35 | selfLink: data['selfLink'] as String?, 36 | volumeInfo: 37 | VolumeInfo.fromMap(data['volumeInfo'] as Map), 38 | saleInfo: data['saleInfo'] == null 39 | ? null 40 | : SaleInfo.fromMap(data['saleInfo'] as Map), 41 | accessInfo: data['accessInfo'] == null 42 | ? null 43 | : AccessInfo.fromMap(data['accessInfo'] as Map), 44 | searchInfo: data['searchInfo'] == null 45 | ? null 46 | : SearchInfo.fromMap(data['searchInfo'] as Map), 47 | ); 48 | 49 | Map toMap() => { 50 | 'kind': kind, 51 | 'id': id, 52 | 'etag': etag, 53 | 'selfLink': selfLink, 54 | 'volumeInfo': volumeInfo.toMap(), 55 | 'saleInfo': saleInfo?.toMap(), 56 | 'accessInfo': accessInfo?.toMap(), 57 | 'searchInfo': searchInfo?.toMap(), 58 | }; 59 | 60 | /// `dart:convert` 61 | /// 62 | /// Parses the string and returns the resulting Json object as [Book]. 63 | factory Book.fromJson(String data) { 64 | return Book.fromMap(json.decode(data) as Map); 65 | } 66 | 67 | /// `dart:convert` 68 | /// 69 | /// Converts [Book] to a JSON string. 70 | String toJson() => json.encode(toMap()); 71 | 72 | @override 73 | List get props { 74 | return [ 75 | kind, 76 | id, 77 | etag, 78 | selfLink, 79 | volumeInfo, 80 | saleInfo, 81 | accessInfo, 82 | searchInfo, 83 | ]; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /lib/models/book/epub.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class Epub extends Equatable { 6 | final bool? isAvailable; 7 | final String? acsTokenLink; 8 | 9 | const Epub({this.isAvailable, this.acsTokenLink}); 10 | 11 | factory Epub.fromMap(Map data) => Epub( 12 | isAvailable: data['isAvailable'] as bool?, 13 | acsTokenLink: data['acsTokenLink'] as String?, 14 | ); 15 | 16 | Map toMap() => { 17 | 'isAvailable': isAvailable, 18 | 'acsTokenLink': acsTokenLink, 19 | }; 20 | 21 | /// `dart:convert` 22 | /// 23 | /// Parses the string and returns the resulting Json object as [Epub]. 24 | factory Epub.fromJson(String data) { 25 | return Epub.fromMap(json.decode(data) as Map); 26 | } 27 | 28 | /// `dart:convert` 29 | /// 30 | /// Converts [Epub] to a JSON string. 31 | String toJson() => json.encode(toMap()); 32 | 33 | @override 34 | List get props => [isAvailable, acsTokenLink]; 35 | } 36 | -------------------------------------------------------------------------------- /lib/models/book/image_links.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class ImageLinks extends Equatable { 6 | final String? smallThumbnail; 7 | final String? thumbnail; 8 | 9 | const ImageLinks({this.smallThumbnail, this.thumbnail}); 10 | 11 | factory ImageLinks.fromMap(Map data) => ImageLinks( 12 | smallThumbnail: data['smallThumbnail'] as String?, 13 | thumbnail: data['thumbnail'] as String?, 14 | ); 15 | 16 | Map toMap() => { 17 | 'smallThumbnail': smallThumbnail, 18 | 'thumbnail': thumbnail, 19 | }; 20 | 21 | /// `dart:convert` 22 | /// 23 | /// Parses the string and returns the resulting Json object as [ImageLinks]. 24 | factory ImageLinks.fromJson(String data) { 25 | return ImageLinks.fromMap(json.decode(data) as Map); 26 | } 27 | 28 | /// `dart:convert` 29 | /// 30 | /// Converts [ImageLinks] to a JSON string. 31 | String toJson() => json.encode(toMap()); 32 | 33 | @override 34 | List get props => [smallThumbnail, thumbnail]; 35 | } 36 | -------------------------------------------------------------------------------- /lib/models/book/industry_identifier.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class IndustryIdentifier extends Equatable { 6 | final String? type; 7 | final String? identifier; 8 | 9 | const IndustryIdentifier({this.type, this.identifier}); 10 | 11 | factory IndustryIdentifier.fromMap(Map data) { 12 | return IndustryIdentifier( 13 | type: data['type'] as String?, 14 | identifier: data['identifier'] as String?, 15 | ); 16 | } 17 | 18 | Map toMap() => { 19 | 'type': type, 20 | 'identifier': identifier, 21 | }; 22 | 23 | /// `dart:convert` 24 | /// 25 | /// Parses the string and returns the resulting Json object as [IndustryIdentifier]. 26 | factory IndustryIdentifier.fromJson(String data) { 27 | return IndustryIdentifier.fromMap( 28 | json.decode(data) as Map); 29 | } 30 | 31 | /// `dart:convert` 32 | /// 33 | /// Converts [IndustryIdentifier] to a JSON string. 34 | String toJson() => json.encode(toMap()); 35 | 36 | @override 37 | List get props => [type, identifier]; 38 | } 39 | -------------------------------------------------------------------------------- /lib/models/book/panelization_summary.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class PanelizationSummary extends Equatable { 6 | final bool? containsEpubBubbles; 7 | final bool? containsImageBubbles; 8 | 9 | const PanelizationSummary({ 10 | this.containsEpubBubbles, 11 | this.containsImageBubbles, 12 | }); 13 | 14 | factory PanelizationSummary.fromMap(Map data) { 15 | return PanelizationSummary( 16 | containsEpubBubbles: data['containsEpubBubbles'] as bool?, 17 | containsImageBubbles: data['containsImageBubbles'] as bool?, 18 | ); 19 | } 20 | 21 | Map toMap() => { 22 | 'containsEpubBubbles': containsEpubBubbles, 23 | 'containsImageBubbles': containsImageBubbles, 24 | }; 25 | 26 | /// `dart:convert` 27 | /// 28 | /// Parses the string and returns the resulting Json object as [PanelizationSummary]. 29 | factory PanelizationSummary.fromJson(String data) { 30 | return PanelizationSummary.fromMap( 31 | json.decode(data) as Map); 32 | } 33 | 34 | /// `dart:convert` 35 | /// 36 | /// Converts [PanelizationSummary] to a JSON string. 37 | String toJson() => json.encode(toMap()); 38 | 39 | @override 40 | List get props => [containsEpubBubbles, containsImageBubbles]; 41 | } 42 | -------------------------------------------------------------------------------- /lib/models/book/pdf.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class Pdf extends Equatable { 6 | final bool? isAvailable; 7 | final String? acsTokenLink; 8 | 9 | const Pdf({this.isAvailable, this.acsTokenLink}); 10 | 11 | factory Pdf.fromMap(Map data) => Pdf( 12 | isAvailable: data['isAvailable'] as bool?, 13 | acsTokenLink: data['acsTokenLink'] as String?, 14 | ); 15 | 16 | Map toMap() => { 17 | 'isAvailable': isAvailable, 18 | 'acsTokenLink': acsTokenLink, 19 | }; 20 | 21 | /// `dart:convert` 22 | /// 23 | /// Parses the string and returns the resulting Json object as [Pdf]. 24 | factory Pdf.fromJson(String data) { 25 | return Pdf.fromMap(json.decode(data) as Map); 26 | } 27 | 28 | /// `dart:convert` 29 | /// 30 | /// Converts [Pdf] to a JSON string. 31 | String toJson() => json.encode(toMap()); 32 | 33 | @override 34 | List get props => [isAvailable, acsTokenLink]; 35 | } 36 | -------------------------------------------------------------------------------- /lib/models/book/reading_modes.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class ReadingModes extends Equatable { 6 | final bool? text; 7 | final bool? image; 8 | 9 | const ReadingModes({this.text, this.image}); 10 | 11 | factory ReadingModes.fromMap(Map data) => ReadingModes( 12 | text: data['text'] as bool?, 13 | image: data['image'] as bool?, 14 | ); 15 | 16 | Map toMap() => { 17 | 'text': text, 18 | 'image': image, 19 | }; 20 | 21 | /// `dart:convert` 22 | /// 23 | /// Parses the string and returns the resulting Json object as [ReadingModes]. 24 | factory ReadingModes.fromJson(String data) { 25 | return ReadingModes.fromMap(json.decode(data) as Map); 26 | } 27 | 28 | /// `dart:convert` 29 | /// 30 | /// Converts [ReadingModes] to a JSON string. 31 | String toJson() => json.encode(toMap()); 32 | 33 | @override 34 | List get props => [text, image]; 35 | } 36 | -------------------------------------------------------------------------------- /lib/models/book/sale_info.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class SaleInfo extends Equatable { 6 | final String? country; 7 | final String? saleability; 8 | final bool? isEbook; 9 | 10 | const SaleInfo({this.country, this.saleability, this.isEbook}); 11 | 12 | factory SaleInfo.fromMap(Map data) => SaleInfo( 13 | country: data['country'] as String?, 14 | saleability: data['saleability'] as String?, 15 | isEbook: data['isEbook'] as bool?, 16 | ); 17 | 18 | Map toMap() => { 19 | 'country': country, 20 | 'saleability': saleability, 21 | 'isEbook': isEbook, 22 | }; 23 | 24 | /// `dart:convert` 25 | /// 26 | /// Parses the string and returns the resulting Json object as [SaleInfo]. 27 | factory SaleInfo.fromJson(String data) { 28 | return SaleInfo.fromMap(json.decode(data) as Map); 29 | } 30 | 31 | /// `dart:convert` 32 | /// 33 | /// Converts [SaleInfo] to a JSON string. 34 | String toJson() => json.encode(toMap()); 35 | 36 | @override 37 | List get props => [country, saleability, isEbook]; 38 | } 39 | -------------------------------------------------------------------------------- /lib/models/book/search_info.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class SearchInfo extends Equatable { 6 | final String? textSnippet; 7 | 8 | const SearchInfo({this.textSnippet}); 9 | 10 | factory SearchInfo.fromMap(Map data) => SearchInfo( 11 | textSnippet: data['textSnippet'] as String?, 12 | ); 13 | 14 | Map toMap() => { 15 | 'textSnippet': textSnippet, 16 | }; 17 | 18 | /// `dart:convert` 19 | /// 20 | /// Parses the string and returns the resulting Json object as [SearchInfo]. 21 | factory SearchInfo.fromJson(String data) { 22 | return SearchInfo.fromMap(json.decode(data) as Map); 23 | } 24 | 25 | /// `dart:convert` 26 | /// 27 | /// Converts [SearchInfo] to a JSON string. 28 | String toJson() => json.encode(toMap()); 29 | 30 | @override 31 | List get props => [textSnippet]; 32 | } 33 | -------------------------------------------------------------------------------- /lib/models/book/volume_info.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:equatable/equatable.dart'; 4 | 5 | import 'image_links.dart'; 6 | import 'industry_identifier.dart'; 7 | import 'panelization_summary.dart'; 8 | import 'reading_modes.dart'; 9 | 10 | class VolumeInfo extends Equatable { 11 | final String? title; 12 | final List? authors; 13 | final String? publisher; 14 | final String? publishedDate; 15 | final String? description; 16 | final List? industryIdentifiers; 17 | final ReadingModes? readingModes; 18 | final int? pageCount; 19 | final String? printType; 20 | final List? categories; 21 | final String? maturityRating; 22 | final bool? allowAnonLogging; 23 | final String? contentVersion; 24 | final PanelizationSummary? panelizationSummary; 25 | final ImageLinks? imageLinks; 26 | final String? language; 27 | final String? previewLink; 28 | final String? infoLink; 29 | final String? canonicalVolumeLink; 30 | 31 | const VolumeInfo({ 32 | this.title, 33 | this.authors, 34 | this.publisher, 35 | this.publishedDate, 36 | this.description, 37 | this.industryIdentifiers, 38 | this.readingModes, 39 | this.pageCount, 40 | this.printType, 41 | this.categories, 42 | this.maturityRating, 43 | this.allowAnonLogging, 44 | this.contentVersion, 45 | this.panelizationSummary, 46 | this.imageLinks, 47 | this.language, 48 | this.previewLink, 49 | this.infoLink, 50 | this.canonicalVolumeLink, 51 | }); 52 | 53 | factory VolumeInfo.fromMap(Map data) => VolumeInfo( 54 | title: data['title'] as String?, 55 | authors: (data['authors'] as List?)?.cast(), 56 | publisher: data['publisher'] as String?, 57 | publishedDate: data['publishedDate'] as String?, 58 | description: data['description'] as String?, 59 | industryIdentifiers: (data['industryIdentifiers'] as List?) 60 | ?.map((e) => IndustryIdentifier.fromMap(e as Map)) 61 | .toList(), 62 | readingModes: data['readingModes'] == null 63 | ? null 64 | : ReadingModes.fromMap( 65 | data['readingModes'] as Map), 66 | pageCount: data['pageCount'] as int?, 67 | printType: data['printType'] as String?, 68 | categories: (data['categories'] as List?)?.cast(), 69 | maturityRating: data['maturityRating'] as String?, 70 | allowAnonLogging: data['allowAnonLogging'] as bool?, 71 | contentVersion: data['contentVersion'] as String?, 72 | panelizationSummary: data['panelizationSummary'] == null 73 | ? null 74 | : PanelizationSummary.fromMap( 75 | data['panelizationSummary'] as Map), 76 | imageLinks: data['imageLinks'] == null 77 | ? null 78 | : ImageLinks.fromMap(data['imageLinks'] as Map), 79 | language: data['language'] as String?, 80 | previewLink: data['previewLink'] as String?, 81 | infoLink: data['infoLink'] as String?, 82 | canonicalVolumeLink: data['canonicalVolumeLink'] as String?, 83 | ); 84 | 85 | Map toMap() => { 86 | 'title': title, 87 | 'authors': authors, 88 | 'publisher': publisher, 89 | 'publishedDate': publishedDate, 90 | 'description': description, 91 | 'industryIdentifiers': 92 | industryIdentifiers?.map((e) => e.toMap()).toList(), 93 | 'readingModes': readingModes?.toMap(), 94 | 'pageCount': pageCount, 95 | 'printType': printType, 96 | 'categories': categories, 97 | 'maturityRating': maturityRating, 98 | 'allowAnonLogging': allowAnonLogging, 99 | 'contentVersion': contentVersion, 100 | 'panelizationSummary': panelizationSummary?.toMap(), 101 | 'imageLinks': imageLinks?.toMap(), 102 | 'language': language, 103 | 'previewLink': previewLink, 104 | 'infoLink': infoLink, 105 | 'canonicalVolumeLink': canonicalVolumeLink, 106 | }; 107 | 108 | /// `dart:convert` 109 | /// 110 | /// Parses the string and returns the resulting Json object as [VolumeInfo]. 111 | factory VolumeInfo.fromJson(String data) { 112 | return VolumeInfo.fromMap(json.decode(data) as Map); 113 | } 114 | 115 | /// `dart:convert` 116 | /// 117 | /// Converts [VolumeInfo] to a JSON string. 118 | String toJson() => json.encode(toMap()); 119 | 120 | @override 121 | List get props { 122 | return [ 123 | title, 124 | authors, 125 | publisher, 126 | publishedDate, 127 | description, 128 | industryIdentifiers, 129 | readingModes, 130 | pageCount, 131 | printType, 132 | categories, 133 | maturityRating, 134 | allowAnonLogging, 135 | contentVersion, 136 | panelizationSummary, 137 | imageLinks, 138 | language, 139 | previewLink, 140 | infoLink, 141 | canonicalVolumeLink, 142 | ]; 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /lib/repository/home/home_repo.dart: -------------------------------------------------------------------------------- 1 | import 'package:dartz/dartz.dart'; 2 | import '../../core/errors/failure.dart'; 3 | import '../../models/book/book.dart'; 4 | 5 | abstract class HomeRepo { 6 | Future>> fetchBestSellerBooks(); 7 | Future>> fetchFeaturedBooks(); 8 | Future>> fetchSimiliarBooks(String categorie); 9 | } 10 | 11 | -------------------------------------------------------------------------------- /lib/repository/home/home_repo_impl.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:dartz/dartz.dart'; 3 | import 'package:dio/dio.dart'; 4 | 5 | import '../../core/api_service.dart'; 6 | import '../../core/errors/failure.dart'; 7 | import '../../core/utils/list_create.dart'; 8 | import '../../models/book/book.dart'; 9 | import 'home_repo.dart'; 10 | 11 | class HomeRepoImpl implements HomeRepo { 12 | final ApiService _apiService; 13 | 14 | HomeRepoImpl(this._apiService); 15 | 16 | @override 17 | Future>> fetchBestSellerBooks() async { 18 | try { 19 | Map data = await _apiService.get( 20 | endPoint: 21 | 'volumes?Filtering=free-ebooks&Sorting=newest&q=computer science'); 22 | List books = creatingList(data['items']); 23 | return Right(books); 24 | } on Exception catch (e) { 25 | if (e is DioError) { 26 | return Left(ServerFailure.fromDioError(e)); 27 | } 28 | return Left(ServerFailure(e.toString())); 29 | } 30 | } 31 | 32 | @override 33 | Future>> fetchFeaturedBooks() async { 34 | try { 35 | Map data = await _apiService.get( 36 | endPoint: 'volumes?Filtering=free-ebooks&q=programming'); 37 | List books = creatingList(data['items']); 38 | return Right(books); 39 | } on Exception catch (e) { 40 | if (e is DioError) { 41 | return Left(ServerFailure.fromDioError(e)); 42 | } 43 | return Left(ServerFailure(e.toString())); 44 | } 45 | } 46 | 47 | @override 48 | Future>> fetchSimiliarBooks(String categorie) async { 49 | try { 50 | Map data = await _apiService.get( 51 | endPoint: 'volumes?Filtering=free-ebooks&sorting=relevance&q=programming'); 52 | List books = creatingList(data['items']); 53 | return Right(books); 54 | } on Exception catch (e) { 55 | if (e is DioError) { 56 | return Left(ServerFailure.fromDioError(e)); 57 | } 58 | return Left(ServerFailure(e.toString())); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/repository/search/search_repo.dart: -------------------------------------------------------------------------------- 1 | import 'package:dartz/dartz.dart'; 2 | 3 | import '../../core/errors/failure.dart'; 4 | import '../../models/book/book.dart'; 5 | 6 | abstract class SearchRepo{ 7 | Future>> fetchSearchBooks(String query); 8 | } -------------------------------------------------------------------------------- /lib/repository/search/search_repo_impl.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | import 'package:bookini/core/api_service.dart'; 3 | import 'package:bookini/core/errors/failure.dart'; 4 | import 'package:bookini/models/book/book.dart'; 5 | import 'package:dartz/dartz.dart'; 6 | import 'package:dio/dio.dart'; 7 | 8 | import '../../core/utils/list_create.dart'; 9 | import 'search_repo.dart'; 10 | 11 | class SearchRepoImpl implements SearchRepo { 12 | SearchRepoImpl( 13 | this._apiService, 14 | ); 15 | final ApiService _apiService; 16 | 17 | @override 18 | Future>> fetchSearchBooks(String query) async { 19 | try { 20 | Map data = await _apiService.get( 21 | endPoint: 'volumes?Filtering=free-ebooks&Sorting=newest&q=$query'); 22 | List books = creatingList(data['items']); 23 | return Right(books); 24 | } on Exception catch (e) { 25 | if (e is DioError) { 26 | return Left(ServerFailure.fromDioError(e)); 27 | } 28 | return Left(ServerFailure(e.toString())); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/todo.dart: -------------------------------------------------------------------------------- 1 | List todo = [ 2 | "fix the ui in the detaill Screen", 3 | "fix the parameter in api call for similiar ", 4 | "try to add a rating to the books", 5 | "back to it " 6 | ]; 7 | -------------------------------------------------------------------------------- /lib/view/common/book_card.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | import 'package:cached_network_image/cached_network_image.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:go_router/go_router.dart'; 5 | 6 | import '../../models/book/book.dart'; 7 | 8 | class BookCard extends StatelessWidget { 9 | BookCard({ 10 | Key? key, 11 | required Book book, 12 | }) : super(key: key) { 13 | _book = book; 14 | } 15 | late final Book _book; 16 | @override 17 | Widget build(BuildContext context) { 18 | return GestureDetector( 19 | onTap: () { 20 | GoRouter.of(context).push( 21 | "/detaills", 22 | extra: _book, 23 | ); 24 | }, 25 | child: ClipRRect( 26 | borderRadius: BorderRadius.circular(14), 27 | child: AspectRatio( 28 | aspectRatio: 2.8 / 4, 29 | child: CachedNetworkImage( 30 | imageUrl: _book.volumeInfo.imageLinks?.thumbnail ?? "", 31 | errorWidget: (context, url, error) => const Icon(Icons.error), 32 | fit: BoxFit.fill, 33 | )), 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/view/common/custom_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CustomAppBar extends StatelessWidget with PreferredSizeWidget { 4 | const CustomAppBar({super.key, required this.leading, required this.action}); 5 | 6 | final Widget leading; 7 | final Widget action; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Padding( 12 | padding: const EdgeInsets.only(top: 40, bottom: 20, right: 30, left: 30), 13 | child: Row( 14 | children: [leading, const Spacer(), action], 15 | ), 16 | ); 17 | } 18 | 19 | @override 20 | Size get preferredSize => const Size.fromHeight(120); 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/detaills/detaills_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view_model/detaills/similar_books_cubit/similar_books_cubit.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | import '../../models/book/book.dart'; 6 | import 'widgets/detaills_body.dart'; 7 | 8 | class DetaillsView extends StatefulWidget { 9 | const DetaillsView({super.key, required this.book}); 10 | 11 | final Book book; 12 | 13 | @override 14 | State createState() => _DetaillsViewState(); 15 | } 16 | 17 | class _DetaillsViewState extends State { 18 | @override 19 | void initState() { 20 | super.initState(); 21 | BlocProvider.of(context).fetchBooks( 22 | widget.book.volumeInfo.categories?.first ?? "", 23 | ); 24 | } 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return Scaffold( 29 | body: DetaillsBody(book:widget.book), 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/action_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:url_launcher/url_launcher.dart'; 3 | 4 | import '../../../core/consts.dart'; 5 | 6 | 7 | // ignore: must_be_immutable 8 | @immutable 9 | class ActionButton extends StatelessWidget { 10 | ActionButton({ 11 | super.key, 12 | url, 13 | }) { 14 | _url = Uri.parse(url); 15 | } 16 | 17 | late Uri _url; 18 | @override 19 | Widget build(BuildContext context) { 20 | return Padding( 21 | padding: EdgeInsets.symmetric( 22 | horizontal: MediaQuery.of(context).size.width * .05), 23 | child: Row( 24 | mainAxisAlignment: MainAxisAlignment.center, 25 | children: [ 26 | Expanded( 27 | child: ElevatedButton( 28 | onPressed: () {}, 29 | style: ElevatedButton.styleFrom( 30 | shape: const RoundedRectangleBorder( 31 | borderRadius: BorderRadius.only( 32 | topLeft: Radius.circular(20), 33 | bottomLeft: Radius.circular(20), 34 | )), 35 | fixedSize: Size(MediaQuery.of(context).size.width * .4, 36 | MediaQuery.of(context).size.height * .085), 37 | backgroundColor: Colors.white), 38 | child: Text( 39 | "Free", 40 | style: Styles.textStyle18.copyWith(color: Colors.black), 41 | )), 42 | ), 43 | Expanded( 44 | child: ElevatedButton( 45 | onPressed: () { 46 | launchUrl(_url); 47 | }, 48 | style: ElevatedButton.styleFrom( 49 | backgroundColor: Colors.red, 50 | shape: const RoundedRectangleBorder( 51 | borderRadius: BorderRadius.only( 52 | topRight: Radius.circular(20), 53 | bottomRight: Radius.circular(20), 54 | )), 55 | fixedSize: Size(MediaQuery.of(context).size.width * .4, 56 | MediaQuery.of(context).size.height * .085), 57 | ), 58 | child: Text( 59 | "Preview", 60 | style: Styles.textStyle16.copyWith( 61 | color: Colors.white, fontWeight: FontWeight.bold), 62 | )), 63 | ), 64 | ], 65 | ), 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/custom_book_card.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../../../models/book/book.dart'; 5 | import '../../common/book_card.dart'; 6 | 7 | class CustomBookCard extends StatelessWidget { 8 | const CustomBookCard({ 9 | Key? key, 10 | required this.book, 11 | }) : super(key: key); 12 | 13 | final Book book; 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return SizedBox( 18 | width: MediaQuery.of(context).size.width * .3, 19 | height: MediaQuery.of(context).size.height * .2, 20 | child: BookCard( 21 | book: book, 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/custom_title.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../core/consts.dart'; 4 | 5 | class CustomTitle extends StatelessWidget { 6 | const CustomTitle({ 7 | super.key, 8 | }); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return const Padding( 13 | padding: EdgeInsets.only(left: 30), 14 | child: Align( 15 | alignment: Alignment.centerLeft, 16 | child: Text( 17 | "You Can Also like", 18 | style: Styles.textStyle18, 19 | ), 20 | ), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/detaills_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/consts.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:go_router/go_router.dart'; 4 | 5 | import '../../../models/book/book.dart'; 6 | import '../../common/custom_app_bar.dart'; 7 | import 'action_button.dart'; 8 | import 'custom_book_card.dart'; 9 | import 'custom_title.dart'; 10 | import 'rating_box.dart'; 11 | import 'similiar_books_section.dart'; 12 | 13 | class DetaillsBody extends StatelessWidget { 14 | const DetaillsBody({super.key, required this.book}); 15 | 16 | final Book book; 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return CustomScrollView( 21 | slivers: [ 22 | SliverFillRemaining( 23 | hasScrollBody: false, 24 | child: Padding( 25 | padding: const EdgeInsets.all(8.0), 26 | child: Column( 27 | crossAxisAlignment: CrossAxisAlignment.center, 28 | children: [ 29 | CustomAppBar( 30 | leading: IconButton( 31 | icon: const Icon( 32 | Icons.close, 33 | size: 30, 34 | ), 35 | onPressed: () { 36 | GoRouter.of(context).pop(); 37 | }, 38 | ), 39 | action: IconButton( 40 | icon: const Icon( 41 | Icons.shopping_cart, 42 | size: 30, 43 | ), 44 | onPressed: () {}, 45 | ), 46 | ), 47 | CustomBookCard( 48 | book: book, 49 | ), 50 | const SizedBox(height: 32), 51 | Text( 52 | book.volumeInfo.title ?? "No Title", 53 | textAlign: TextAlign.center, 54 | style: Styles.textStyle20.copyWith( 55 | fontWeight: FontWeight.w700, 56 | ), 57 | ), 58 | const SizedBox(height: 8), 59 | Opacity( 60 | opacity: .7, 61 | child: Text(book.volumeInfo.authors?.first ?? "No authors", 62 | style: Styles.textStyle14), 63 | ), 64 | const SizedBox(height: 16), 65 | //TODO: since idk why api doesnt give me rating , this will remain static 66 | const RatingBox(), 67 | const SizedBox(height: 32), 68 | ActionButton( 69 | url: book.volumeInfo.previewLink, 70 | ), 71 | const Expanded(child: SizedBox(height: 32)), 72 | const CustomTitle(), 73 | const SizedBox(height: 8), 74 | const SimiliarBooksSection(), 75 | const SizedBox(height: 32), 76 | // create elevated button in flutter for me 77 | ], 78 | ), 79 | ), 80 | ) 81 | ], 82 | ); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/rating_box.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../core/consts.dart'; 4 | 5 | class RatingBox extends StatelessWidget { 6 | const RatingBox({ 7 | super.key, 8 | }); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Row( 13 | mainAxisAlignment: MainAxisAlignment.center, 14 | children: [ 15 | const Icon(Icons.star, color: Colors.yellow), 16 | const SizedBox( 17 | width: 2, 18 | ), 19 | Text( 20 | "4.5", 21 | style: Styles.textStyle14.copyWith( 22 | fontWeight: FontWeight.w700, 23 | ), 24 | ), 25 | const SizedBox( 26 | width: 4, 27 | ), 28 | const Text("(100)"), 29 | ], 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/view/detaills/widgets/similiar_books_section.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | import '../../../view_model/detaills/similar_books_cubit/similar_books_cubit.dart'; 6 | import 'custom_book_card.dart'; 7 | 8 | class SimiliarBooksSection extends StatelessWidget { 9 | const SimiliarBooksSection({ 10 | super.key, 11 | }); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return SizedBox( 16 | height: MediaQuery.of(context).size.height * .2, 17 | child: BlocBuilder( 18 | builder: (context, state) { 19 | if (state is SimilarBooksSucess) { 20 | return ListView.builder( 21 | itemCount: state.books.length, 22 | scrollDirection: Axis.horizontal, 23 | itemBuilder: (_, index) { 24 | return Padding( 25 | padding: const EdgeInsets.all(6.0), 26 | child: CustomBookCard( 27 | book: state.books[index]), 28 | ); 29 | }); 30 | } else if (state is SimilarBooksFailure) { 31 | return Center( 32 | child: 33 | Text("Something Went Wrong${state.errorMessage}"), 34 | ); 35 | } else { 36 | return const Center( 37 | child: CircularProgressIndicator(), 38 | ); 39 | } 40 | }, 41 | ), 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lib/view/home/home.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:go_router/go_router.dart'; 3 | import '../../core/consts.dart'; 4 | import '../common/custom_app_bar.dart'; 5 | import 'widgets/home_body.dart'; 6 | 7 | class Home extends StatelessWidget { 8 | const Home({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return SafeArea( 13 | child: Scaffold( 14 | appBar: CustomAppBar( 15 | leading: Image.asset( 16 | AssetsData.logo, 17 | height: 18, 18 | ), 19 | action: IconButton( 20 | icon: const Icon( 21 | Icons.search, 22 | size: 22, 23 | ), 24 | onPressed: () { 25 | GoRouter.of(context).push("/search"); 26 | }, 27 | ), 28 | ), 29 | body: const HomeBody())); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/view/home/widgets/best_seller_book_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view/common/book_card.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../../../core/consts.dart'; 5 | import '../../../models/book/book.dart'; 6 | 7 | class BestSellerBookCard extends StatelessWidget { 8 | BestSellerBookCard({super.key, required book}) { 9 | _book = book; 10 | } 11 | late final Book _book; 12 | @override 13 | Widget build(BuildContext context) { 14 | return SizedBox( 15 | height: 140, 16 | child: Row( 17 | children: [ 18 | BookCard(book: _book), 19 | const SizedBox( 20 | width: 10, 21 | ), 22 | Expanded( 23 | child: Column( 24 | crossAxisAlignment: CrossAxisAlignment.start, 25 | children: [ 26 | SizedBox( 27 | width: MediaQuery.of(context).size.height * .25, 28 | child: Text( 29 | _book.volumeInfo.title as String, 30 | overflow: TextOverflow.clip, 31 | style: Styles.textStyle14 32 | .copyWith(fontWeight: FontWeight.w500), 33 | ), 34 | ), 35 | const SizedBox( 36 | height: 4, 37 | ), 38 | Text( 39 | _book.volumeInfo.authors?.first ?? "no authoer", 40 | style: Styles.textStyle14, 41 | ), 42 | const SizedBox( 43 | height: 8, 44 | ), 45 | Row( 46 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 47 | children: [ 48 | Text( 49 | "Free", 50 | style: Styles.textStyle20 51 | .copyWith(fontWeight: FontWeight.w700), 52 | ), 53 | Row( 54 | // Since The APi scammed me and it doesnt include average rating and rating count , i will make it static for now 55 | children: const [ 56 | Icon(Icons.star, color: Colors.yellow), 57 | SizedBox( 58 | width: 1, 59 | ), 60 | Text("4.5"), 61 | SizedBox( 62 | width: 4, 63 | ), 64 | Text("(100)"), 65 | ], 66 | ) 67 | ], 68 | ) 69 | ], 70 | ), 71 | ) 72 | ], 73 | ), 74 | ); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /lib/view/home/widgets/custom_list_view.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | 3 | import 'package:bookini/view_model/home/featured_books_cubit/featured_books_cubit.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_bloc/flutter_bloc.dart'; 6 | 7 | import '../../common/book_card.dart'; 8 | 9 | class CustomListView extends StatelessWidget { 10 | const CustomListView({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return BlocBuilder( 15 | builder: (context, state) { 16 | if (state is FeaturedBooksSucess) { 17 | return SizedBox( 18 | height: MediaQuery.of(context).size.height * .35, 19 | child: ListView.builder( 20 | physics: const BouncingScrollPhysics(), 21 | itemCount: state.books.length, 22 | scrollDirection: Axis.horizontal, 23 | itemBuilder: (BuildContext context, int index) { 24 | if (state.books[index].volumeInfo.imageLinks?.thumbnail != 25 | null) { 26 | return Padding( 27 | padding: 28 | const EdgeInsets.only(left: 5.0, right: 10, bottom: 10), 29 | child: BookCard( 30 | book: state.books[index], 31 | )); 32 | } else { 33 | return const SizedBox.shrink(); 34 | } 35 | }, 36 | ), 37 | ); 38 | } else if (state is FeaturedBooksFailure) { 39 | log("error"); 40 | 41 | return Text(state.errorMessage.toString()); 42 | } else { 43 | return const Center(child: CircularProgressIndicator()); 44 | } 45 | }, 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/view/home/widgets/home_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/consts.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import 'custom_list_view.dart'; 5 | import 'list_view_books.dart'; 6 | 7 | class HomeBody extends StatelessWidget { 8 | const HomeBody({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Padding( 13 | padding: const EdgeInsets.symmetric(horizontal: 30), 14 | child: Column( 15 | crossAxisAlignment: CrossAxisAlignment.start, 16 | children: const [ 17 | Text( 18 | "Featured", 19 | style: Styles.textStyle18, 20 | ), 21 | SizedBox(height: 20), 22 | CustomListView(), 23 | SizedBox(height: 20), 24 | Text( 25 | "Best Seller", 26 | style: Styles.textStyle18, 27 | ), 28 | SizedBox(height: 14), 29 | ListViewBooks() 30 | ], 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/view/home/widgets/list_view_books.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view_model/home/newest_books_cubit/newest_book_cubit.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | import 'best_seller_book_card.dart'; 6 | 7 | class ListViewBooks extends StatelessWidget { 8 | const ListViewBooks({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Expanded( 13 | child: BlocBuilder( 14 | //TODO: use shimmer package for loading 15 | builder: (context, state) { 16 | if (state is NewestBookSucess) { 17 | return ListView.builder( 18 | itemCount: state.books.length, 19 | physics: const BouncingScrollPhysics(), 20 | itemBuilder: (BuildContext context, int index) { 21 | if (state.books[index].volumeInfo.imageLinks?.thumbnail != 22 | null) { 23 | return Padding( 24 | padding: 25 | const EdgeInsets.only(left: 5.0, right: 10, bottom: 10), 26 | child: BestSellerBookCard( 27 | book: state.books[index], 28 | ), 29 | ); 30 | } 31 | return const SizedBox.shrink(); 32 | }, 33 | ); 34 | } else if (state is NewestBookFailure) { 35 | return Text(state.errorMessage.toString()); 36 | } else { 37 | return const Center(child: CircularProgressIndicator()); 38 | } 39 | }, 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/view/search/search_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view/search/widgets/search_body.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class SearchView extends StatelessWidget { 5 | const SearchView({super.key}); 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return const Scaffold( 10 | body: SafeArea(child: SearchBody()), 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/view/search/widgets/custom_text_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/view_model/search/search_books/search_books_cubit.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 5 | 6 | // ignore: must_be_immutable 7 | class CustomSearchTextField extends StatelessWidget { 8 | CustomSearchTextField({super.key}); 9 | String valueM = ""; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return TextField( 14 | onSubmitted: (value) { 15 | valueM = value; 16 | BlocProvider.of(context).searchBooks(valueM); 17 | }, 18 | decoration: InputDecoration( 19 | enabledBorder: buildOutlineInputBorder(), 20 | focusedBorder: buildOutlineInputBorder(), 21 | hintText: 'Search', 22 | suffixIcon: IconButton( 23 | onPressed: () { 24 | BlocProvider.of(context).searchBooks(valueM); 25 | }, 26 | icon: const Opacity( 27 | opacity: .8, 28 | child: Icon( 29 | FontAwesomeIcons.magnifyingGlass, 30 | size: 22, 31 | ), 32 | ), 33 | ), 34 | ), 35 | ); 36 | } 37 | 38 | OutlineInputBorder buildOutlineInputBorder() { 39 | return OutlineInputBorder( 40 | borderSide: const BorderSide( 41 | color: Colors.white, 42 | ), 43 | borderRadius: BorderRadius.circular( 44 | 12, 45 | ), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/view/search/widgets/search_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/consts.dart'; 2 | import 'package:bookini/view/search/widgets/custom_text_field.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | import 'search_list_view.dart'; 6 | 7 | class SearchBody extends StatelessWidget { 8 | const SearchBody({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Padding( 13 | padding: const EdgeInsets.symmetric(horizontal: 20), 14 | child: Column( 15 | crossAxisAlignment: CrossAxisAlignment.start, 16 | children: [ 17 | CustomSearchTextField(), 18 | const SizedBox(height: 20), 19 | const Text( 20 | "Search Results", 21 | style: Styles.textStyle18, 22 | ), 23 | const SizedBox(height: 20), 24 | const Expanded(child: SearchResultListView()) 25 | ], 26 | ), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/view/search/widgets/search_list_view.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | 3 | import 'package:bookini/view_model/search/search_books/search_books_cubit.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_bloc/flutter_bloc.dart'; 6 | 7 | import '../../home/widgets/best_seller_book_card.dart'; 8 | 9 | class SearchResultListView extends StatelessWidget { 10 | const SearchResultListView({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Padding( 15 | padding: const EdgeInsets.symmetric(horizontal: 20), 16 | child: BlocBuilder( 17 | builder: (context, state) { 18 | if (state is SearchBooksSuccess) { 19 | return ListView.builder( 20 | shrinkWrap: true, 21 | itemCount: state.books.length, 22 | padding: EdgeInsets.zero, 23 | // ignore: body_might_complete_normally_nullable 24 | itemBuilder: (BuildContext context, int index) { 25 | log(state.books[index].volumeInfo.imageLinks?.toJson() ?? 26 | " no photo sorry"); 27 | try { 28 | return Padding( 29 | padding: 30 | const EdgeInsets.only(right: 5, left: 5, bottom: 15), 31 | child: BestSellerBookCard(book: state.books[index]), 32 | ); 33 | } catch (e) { 34 | // print("error was found fares"); 35 | } 36 | }, 37 | ); 38 | } else if (state is SearchBooksFailure) { 39 | return Center( 40 | child: Text(state.message), 41 | ); 42 | } else if (state is SearchBooksLoading) { 43 | return const Center( 44 | child: CircularProgressIndicator(), 45 | ); 46 | } else { 47 | return const Center( 48 | child: Text( 49 | "Type The Name Of Book to Show It", 50 | ), 51 | ); 52 | } 53 | }, 54 | ), 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/view/splash/splash.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'widgets/splash_body.dart'; 4 | 5 | class SplashView extends StatelessWidget { 6 | const SplashView({super.key}); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return const Scaffold( 11 | body: SplashBody(), 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/view/splash/widgets/sliding_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../core/consts.dart'; 4 | 5 | class SlidingText extends StatelessWidget { 6 | const SlidingText({ 7 | super.key, 8 | required Animation animation, 9 | }) : _animation = animation; 10 | 11 | final Animation _animation; 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return AnimatedBuilder( 16 | builder: (ctx, _) { 17 | return SlideTransition( 18 | position: _animation, 19 | child: const Text("World Of Books", 20 | textAlign: TextAlign.center, style: Styles.textStyle14), 21 | ); 22 | }, 23 | animation: _animation, 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/view/splash/widgets/splash_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/core/consts.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:go_router/go_router.dart'; 4 | 5 | import 'sliding_text.dart'; 6 | 7 | class SplashBody extends StatefulWidget { 8 | const SplashBody({super.key}); 9 | 10 | @override 11 | State createState() => _SplashBodyState(); 12 | } 13 | 14 | class _SplashBodyState extends State 15 | with SingleTickerProviderStateMixin { 16 | late AnimationController _animationController; 17 | late Animation _animation; 18 | 19 | @override 20 | void initState() { 21 | super.initState(); 22 | initAnim(); 23 | Future.delayed( 24 | Duration(seconds: AppConsts.kTranstionDuration.inSeconds + 4), () { 25 | GoRouter.of(context).push('/home'); 26 | }); 27 | } 28 | 29 | @override 30 | void dispose() { 31 | _animationController.dispose(); 32 | super.dispose(); 33 | } 34 | 35 | @override 36 | Widget build(BuildContext context) { 37 | return Column( 38 | mainAxisAlignment: MainAxisAlignment.center, 39 | crossAxisAlignment: CrossAxisAlignment.stretch, 40 | children: [ 41 | Image.asset(AssetsData.logo), 42 | SlidingText(animation: _animation), 43 | ], 44 | ); 45 | } 46 | 47 | void initAnim() { 48 | _animationController = AnimationController( 49 | vsync: this, 50 | duration: AppConsts.kTranstionDuration, 51 | ); 52 | 53 | _animation = Tween( 54 | begin: const Offset(0, 5), 55 | end: Offset.zero, 56 | ).animate(_animationController); 57 | _animationController.forward(); 58 | _animation.addListener(() { 59 | setState(() {}); 60 | }); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /lib/view_model/detaills/similar_books_cubit/similar_books_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/repository/home/home_repo.dart'; 2 | import 'package:bookini/repository/home/home_repo_impl.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | import 'package:equatable/equatable.dart'; 5 | import '../../../models/book/book.dart'; 6 | 7 | part 'similar_books_state.dart'; 8 | 9 | class SimilarBooksCubit extends Cubit { 10 | SimilarBooksCubit(this._homeRepo) : super(SimilarBooksInitial()); 11 | 12 | final HomeRepo _homeRepo; 13 | Future fetchBooks(String categorie) async { 14 | emit(SimilarBooksLoading()); 15 | 16 | await _homeRepo.fetchSimiliarBooks(categorie).then((eitherObject) { 17 | eitherObject.fold( 18 | (failure) => 19 | emit(SimilarBooksFailure(errorMessage: failure.errorMessage)), 20 | (books) => emit(SimilarBooksSucess(books: books)), 21 | ); 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/view_model/detaills/similar_books_cubit/similar_books_state.dart: -------------------------------------------------------------------------------- 1 | part of 'similar_books_cubit.dart'; 2 | 3 | abstract class SimilarBooksState extends Equatable { 4 | const SimilarBooksState(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | 10 | class SimilarBooksInitial extends SimilarBooksState {} 11 | 12 | class SimilarBooksLoading extends SimilarBooksState {} 13 | 14 | class SimilarBooksFailure extends SimilarBooksState { 15 | final String errorMessage; 16 | const SimilarBooksFailure({ 17 | required this.errorMessage, 18 | }); 19 | } 20 | 21 | class SimilarBooksSucess extends SimilarBooksState { 22 | final List books; 23 | const SimilarBooksSucess({ 24 | required this.books, 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /lib/view_model/home/featured_books_cubit/featured_books_cubit.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | import 'package:equatable/equatable.dart'; 4 | 5 | import '../../../models/book/book.dart'; 6 | import '../../../repository/home/home_repo.dart'; 7 | 8 | part 'featured_books_state.dart'; 9 | 10 | class FeaturedBooksCubit extends Cubit { 11 | FeaturedBooksCubit(this._homeRepo) : super(FeaturedBooksInitial()); 12 | final HomeRepo _homeRepo; 13 | 14 | Future fetchData() async { 15 | emit(FeaturedBooksLoading()); 16 | var result = await _homeRepo.fetchFeaturedBooks(); 17 | result.fold( 18 | (failure) => 19 | emit(FeaturedBooksFailure(errorMessage: failure.errorMessage)), 20 | (books) => emit(FeaturedBooksSucess(books: books))); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/view_model/home/featured_books_cubit/featured_books_state.dart: -------------------------------------------------------------------------------- 1 | part of 'featured_books_cubit.dart'; 2 | 3 | abstract class FeaturedBooksState extends Equatable { 4 | const FeaturedBooksState(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | 10 | class FeaturedBooksInitial extends FeaturedBooksState {} 11 | class FeaturedBooksLoading extends FeaturedBooksState {} 12 | class FeaturedBooksFailure extends FeaturedBooksState { 13 | final String errorMessage; 14 | const FeaturedBooksFailure({ 15 | required this.errorMessage, 16 | }); 17 | } 18 | class FeaturedBooksSucess extends FeaturedBooksState { 19 | final List books; 20 | const FeaturedBooksSucess({ 21 | required this.books, 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /lib/view_model/home/newest_books_cubit/newest_book_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | 3 | import 'package:bookini/core/errors/failure.dart'; 4 | import 'package:bookini/models/book/book.dart'; 5 | import 'package:bookini/repository/home/home_repo.dart'; 6 | import 'package:bookini/repository/home/home_repo_impl.dart'; 7 | import 'package:dartz/dartz.dart'; 8 | import 'package:flutter_bloc/flutter_bloc.dart'; 9 | import 'package:equatable/equatable.dart'; 10 | 11 | part 'newest_book_state.dart'; 12 | 13 | class NewestBookCubit extends Cubit { 14 | NewestBookCubit(this._homeRepo) : super(NewestBookInitial()); 15 | final HomeRepo _homeRepo; 16 | 17 | Future fetchBooks() async { 18 | emit(NewestBookLoading()); 19 | log("Loading 2"); 20 | Either> result = 21 | await _homeRepo.fetchBestSellerBooks(); 22 | 23 | result.fold( 24 | (failure) => emit(NewestBookFailure(errorMessage: failure.errorMessage)), 25 | (books) => emit(NewestBookSucess(books: books)), 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/view_model/home/newest_books_cubit/newest_book_state.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | part of 'newest_book_cubit.dart'; 3 | 4 | abstract class NewestBookState extends Equatable { 5 | const NewestBookState(); 6 | 7 | @override 8 | List get props => []; 9 | } 10 | 11 | class NewestBookInitial extends NewestBookState {} 12 | 13 | class NewestBookLoading extends NewestBookState {} 14 | 15 | class NewestBookSucess extends NewestBookState { 16 | final List books; 17 | const NewestBookSucess({ 18 | required this.books, 19 | }); 20 | } 21 | 22 | class NewestBookFailure extends NewestBookState { 23 | final String errorMessage; 24 | const NewestBookFailure({ 25 | required this.errorMessage, 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /lib/view_model/search/search_books/search_books_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:bookini/repository/search/search_repo.dart'; 2 | import 'package:bookini/repository/search/search_repo_impl.dart'; 3 | import '../../../models/book/book.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | part 'search_books_state.dart'; 6 | 7 | class SearchBooksCubit extends Cubit { 8 | SearchBooksCubit(this.searchRepo) : super(SearchBooksInitial()); 9 | 10 | final SearchRepo searchRepo; 11 | 12 | void searchBooks(String query) { 13 | emit(SearchBooksLoading()); 14 | searchRepo.fetchSearchBooks(query).then((eitherObject) { 15 | eitherObject.fold( 16 | (failure) => emit(SearchBooksFailure(message: failure.errorMessage)), 17 | (books) => emit(SearchBooksSuccess(books: books)), 18 | ); 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view_model/search/search_books/search_books_state.dart: -------------------------------------------------------------------------------- 1 | part of 'search_books_cubit.dart'; 2 | 3 | abstract class SearchBooksState {} 4 | 5 | class SearchBooksInitial extends SearchBooksState {} 6 | class SearchBooksLoading extends SearchBooksState {} 7 | class SearchBooksSuccess extends SearchBooksState 8 | { 9 | final List books; 10 | SearchBooksSuccess({required this.books}); 11 | } 12 | class SearchBooksFailure extends SearchBooksState { 13 | final String message; 14 | SearchBooksFailure({required this.message}); 15 | } 16 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/dgph 7 | **/xcuserdata/ 8 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import path_provider_foundation 9 | import shared_preferences_foundation 10 | import sqflite 11 | import url_launcher_macos 12 | 13 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 14 | PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 15 | SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) 16 | SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) 17 | UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) 18 | } 19 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; 13 | buildPhases = ( 14 | 33CC111E2044C6BF0003C045 /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = "Flutter Assemble"; 19 | productName = FLX; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 25 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 26 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 27 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 28 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 33CC10E52044A3C60003C045 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 33CC111A2044C6BA0003C045; 37 | remoteInfo = FLX; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXCopyFilesBuildPhase section */ 42 | 33CC110E2044A8840003C045 /* Bundle Framework */ = { 43 | isa = PBXCopyFilesBuildPhase; 44 | buildActionMask = 2147483647; 45 | dstPath = ""; 46 | dstSubfolderSpec = 10; 47 | files = ( 48 | ); 49 | name = "Bundle Framework"; 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXCopyFilesBuildPhase section */ 53 | 54 | /* Begin PBXFileReference section */ 55 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 56 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 57 | 33CC10ED2044A3C60003C045 /* bookini.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "bookini.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 59 | 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 60 | 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 61 | 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; 62 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; 63 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; 64 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; 65 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; 66 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 67 | 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 68 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; 69 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 70 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 71 | /* End PBXFileReference section */ 72 | 73 | /* Begin PBXFrameworksBuildPhase section */ 74 | 33CC10EA2044A3C60003C045 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 33BA886A226E78AF003329D5 /* Configs */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */, 88 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 89 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 90 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, 91 | ); 92 | path = Configs; 93 | sourceTree = ""; 94 | }; 95 | 33CC10E42044A3C60003C045 = { 96 | isa = PBXGroup; 97 | children = ( 98 | 33FAB671232836740065AC1E /* Runner */, 99 | 33CEB47122A05771004F2AC0 /* Flutter */, 100 | 33CC10EE2044A3C60003C045 /* Products */, 101 | D73912EC22F37F3D000D13A0 /* Frameworks */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | 33CC10EE2044A3C60003C045 /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 33CC10ED2044A3C60003C045 /* bookini.app */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 33CC11242044D66E0003C045 /* Resources */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 33CC10F22044A3C60003C045 /* Assets.xcassets */, 117 | 33CC10F42044A3C60003C045 /* MainMenu.xib */, 118 | 33CC10F72044A3C60003C045 /* Info.plist */, 119 | ); 120 | name = Resources; 121 | path = ..; 122 | sourceTree = ""; 123 | }; 124 | 33CEB47122A05771004F2AC0 /* Flutter */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 128 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 129 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, 130 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, 131 | ); 132 | path = Flutter; 133 | sourceTree = ""; 134 | }; 135 | 33FAB671232836740065AC1E /* Runner */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 139 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 140 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */, 141 | 33E51914231749380026EE4D /* Release.entitlements */, 142 | 33CC11242044D66E0003C045 /* Resources */, 143 | 33BA886A226E78AF003329D5 /* Configs */, 144 | ); 145 | path = Runner; 146 | sourceTree = ""; 147 | }; 148 | D73912EC22F37F3D000D13A0 /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | ); 152 | name = Frameworks; 153 | sourceTree = ""; 154 | }; 155 | /* End PBXGroup section */ 156 | 157 | /* Begin PBXNativeTarget section */ 158 | 33CC10EC2044A3C60003C045 /* Runner */ = { 159 | isa = PBXNativeTarget; 160 | buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; 161 | buildPhases = ( 162 | 33CC10E92044A3C60003C045 /* Sources */, 163 | 33CC10EA2044A3C60003C045 /* Frameworks */, 164 | 33CC10EB2044A3C60003C045 /* Resources */, 165 | 33CC110E2044A8840003C045 /* Bundle Framework */, 166 | 3399D490228B24CF009A79C7 /* ShellScript */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | 33CC11202044C79F0003C045 /* PBXTargetDependency */, 172 | ); 173 | name = Runner; 174 | productName = Runner; 175 | productReference = 33CC10ED2044A3C60003C045 /* bookini.app */; 176 | productType = "com.apple.product-type.application"; 177 | }; 178 | /* End PBXNativeTarget section */ 179 | 180 | /* Begin PBXProject section */ 181 | 33CC10E52044A3C60003C045 /* Project object */ = { 182 | isa = PBXProject; 183 | attributes = { 184 | LastSwiftUpdateCheck = 0920; 185 | LastUpgradeCheck = 1300; 186 | ORGANIZATIONNAME = ""; 187 | TargetAttributes = { 188 | 33CC10EC2044A3C60003C045 = { 189 | CreatedOnToolsVersion = 9.2; 190 | LastSwiftMigration = 1100; 191 | ProvisioningStyle = Automatic; 192 | SystemCapabilities = { 193 | com.apple.Sandbox = { 194 | enabled = 1; 195 | }; 196 | }; 197 | }; 198 | 33CC111A2044C6BA0003C045 = { 199 | CreatedOnToolsVersion = 9.2; 200 | ProvisioningStyle = Manual; 201 | }; 202 | }; 203 | }; 204 | buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; 205 | compatibilityVersion = "Xcode 9.3"; 206 | developmentRegion = en; 207 | hasScannedForEncodings = 0; 208 | knownRegions = ( 209 | en, 210 | Base, 211 | ); 212 | mainGroup = 33CC10E42044A3C60003C045; 213 | productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; 214 | projectDirPath = ""; 215 | projectRoot = ""; 216 | targets = ( 217 | 33CC10EC2044A3C60003C045 /* Runner */, 218 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */, 219 | ); 220 | }; 221 | /* End PBXProject section */ 222 | 223 | /* Begin PBXResourcesBuildPhase section */ 224 | 33CC10EB2044A3C60003C045 /* Resources */ = { 225 | isa = PBXResourcesBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 229 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXResourcesBuildPhase section */ 234 | 235 | /* Begin PBXShellScriptBuildPhase section */ 236 | 3399D490228B24CF009A79C7 /* ShellScript */ = { 237 | isa = PBXShellScriptBuildPhase; 238 | alwaysOutOfDate = 1; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | ); 242 | inputFileListPaths = ( 243 | ); 244 | inputPaths = ( 245 | ); 246 | outputFileListPaths = ( 247 | ); 248 | outputPaths = ( 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | shellPath = /bin/sh; 252 | shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; 253 | }; 254 | 33CC111E2044C6BF0003C045 /* ShellScript */ = { 255 | isa = PBXShellScriptBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | inputFileListPaths = ( 260 | Flutter/ephemeral/FlutterInputs.xcfilelist, 261 | ); 262 | inputPaths = ( 263 | Flutter/ephemeral/tripwire, 264 | ); 265 | outputFileListPaths = ( 266 | Flutter/ephemeral/FlutterOutputs.xcfilelist, 267 | ); 268 | outputPaths = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | shellPath = /bin/sh; 272 | shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; 273 | }; 274 | /* End PBXShellScriptBuildPhase section */ 275 | 276 | /* Begin PBXSourcesBuildPhase section */ 277 | 33CC10E92044A3C60003C045 /* Sources */ = { 278 | isa = PBXSourcesBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 282 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 283 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXSourcesBuildPhase section */ 288 | 289 | /* Begin PBXTargetDependency section */ 290 | 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { 291 | isa = PBXTargetDependency; 292 | target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; 293 | targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; 294 | }; 295 | /* End PBXTargetDependency section */ 296 | 297 | /* Begin PBXVariantGroup section */ 298 | 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { 299 | isa = PBXVariantGroup; 300 | children = ( 301 | 33CC10F52044A3C60003C045 /* Base */, 302 | ); 303 | name = MainMenu.xib; 304 | path = Runner; 305 | sourceTree = ""; 306 | }; 307 | /* End PBXVariantGroup section */ 308 | 309 | /* Begin XCBuildConfiguration section */ 310 | 338D0CE9231458BD00FA5F75 /* Profile */ = { 311 | isa = XCBuildConfiguration; 312 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 313 | buildSettings = { 314 | ALWAYS_SEARCH_USER_PATHS = NO; 315 | CLANG_ANALYZER_NONNULL = YES; 316 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 317 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 318 | CLANG_CXX_LIBRARY = "libc++"; 319 | CLANG_ENABLE_MODULES = YES; 320 | CLANG_ENABLE_OBJC_ARC = YES; 321 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 322 | CLANG_WARN_BOOL_CONVERSION = YES; 323 | CLANG_WARN_CONSTANT_CONVERSION = YES; 324 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 325 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 326 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 327 | CLANG_WARN_EMPTY_BODY = YES; 328 | CLANG_WARN_ENUM_CONVERSION = YES; 329 | CLANG_WARN_INFINITE_RECURSION = YES; 330 | CLANG_WARN_INT_CONVERSION = YES; 331 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 334 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CODE_SIGN_IDENTITY = "-"; 337 | COPY_PHASE_STRIP = NO; 338 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 339 | ENABLE_NS_ASSERTIONS = NO; 340 | ENABLE_STRICT_OBJC_MSGSEND = YES; 341 | GCC_C_LANGUAGE_STANDARD = gnu11; 342 | GCC_NO_COMMON_BLOCKS = YES; 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 346 | GCC_WARN_UNUSED_FUNCTION = YES; 347 | GCC_WARN_UNUSED_VARIABLE = YES; 348 | MACOSX_DEPLOYMENT_TARGET = 10.14; 349 | MTL_ENABLE_DEBUG_INFO = NO; 350 | SDKROOT = macosx; 351 | SWIFT_COMPILATION_MODE = wholemodule; 352 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 353 | }; 354 | name = Profile; 355 | }; 356 | 338D0CEA231458BD00FA5F75 /* Profile */ = { 357 | isa = XCBuildConfiguration; 358 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | CLANG_ENABLE_MODULES = YES; 362 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 363 | CODE_SIGN_STYLE = Automatic; 364 | COMBINE_HIDPI_IMAGES = YES; 365 | INFOPLIST_FILE = Runner/Info.plist; 366 | LD_RUNPATH_SEARCH_PATHS = ( 367 | "$(inherited)", 368 | "@executable_path/../Frameworks", 369 | ); 370 | PROVISIONING_PROFILE_SPECIFIER = ""; 371 | SWIFT_VERSION = 5.0; 372 | }; 373 | name = Profile; 374 | }; 375 | 338D0CEB231458BD00FA5F75 /* Profile */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | CODE_SIGN_STYLE = Manual; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | }; 381 | name = Profile; 382 | }; 383 | 33CC10F92044A3C60003C045 /* Debug */ = { 384 | isa = XCBuildConfiguration; 385 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 386 | buildSettings = { 387 | ALWAYS_SEARCH_USER_PATHS = NO; 388 | CLANG_ANALYZER_NONNULL = YES; 389 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 395 | CLANG_WARN_BOOL_CONVERSION = YES; 396 | CLANG_WARN_CONSTANT_CONVERSION = YES; 397 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 398 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 399 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 400 | CLANG_WARN_EMPTY_BODY = YES; 401 | CLANG_WARN_ENUM_CONVERSION = YES; 402 | CLANG_WARN_INFINITE_RECURSION = YES; 403 | CLANG_WARN_INT_CONVERSION = YES; 404 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 407 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 408 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 409 | CODE_SIGN_IDENTITY = "-"; 410 | COPY_PHASE_STRIP = NO; 411 | DEBUG_INFORMATION_FORMAT = dwarf; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | ENABLE_TESTABILITY = YES; 414 | GCC_C_LANGUAGE_STANDARD = gnu11; 415 | GCC_DYNAMIC_NO_PIC = NO; 416 | GCC_NO_COMMON_BLOCKS = YES; 417 | GCC_OPTIMIZATION_LEVEL = 0; 418 | GCC_PREPROCESSOR_DEFINITIONS = ( 419 | "DEBUG=1", 420 | "$(inherited)", 421 | ); 422 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 423 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 424 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 425 | GCC_WARN_UNUSED_FUNCTION = YES; 426 | GCC_WARN_UNUSED_VARIABLE = YES; 427 | MACOSX_DEPLOYMENT_TARGET = 10.14; 428 | MTL_ENABLE_DEBUG_INFO = YES; 429 | ONLY_ACTIVE_ARCH = YES; 430 | SDKROOT = macosx; 431 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 432 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 433 | }; 434 | name = Debug; 435 | }; 436 | 33CC10FA2044A3C60003C045 /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 439 | buildSettings = { 440 | ALWAYS_SEARCH_USER_PATHS = NO; 441 | CLANG_ANALYZER_NONNULL = YES; 442 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 443 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 444 | CLANG_CXX_LIBRARY = "libc++"; 445 | CLANG_ENABLE_MODULES = YES; 446 | CLANG_ENABLE_OBJC_ARC = YES; 447 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 448 | CLANG_WARN_BOOL_CONVERSION = YES; 449 | CLANG_WARN_CONSTANT_CONVERSION = YES; 450 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 451 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 452 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 453 | CLANG_WARN_EMPTY_BODY = YES; 454 | CLANG_WARN_ENUM_CONVERSION = YES; 455 | CLANG_WARN_INFINITE_RECURSION = YES; 456 | CLANG_WARN_INT_CONVERSION = YES; 457 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 459 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 460 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 461 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 462 | CODE_SIGN_IDENTITY = "-"; 463 | COPY_PHASE_STRIP = NO; 464 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 465 | ENABLE_NS_ASSERTIONS = NO; 466 | ENABLE_STRICT_OBJC_MSGSEND = YES; 467 | GCC_C_LANGUAGE_STANDARD = gnu11; 468 | GCC_NO_COMMON_BLOCKS = YES; 469 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 470 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | MACOSX_DEPLOYMENT_TARGET = 10.14; 475 | MTL_ENABLE_DEBUG_INFO = NO; 476 | SDKROOT = macosx; 477 | SWIFT_COMPILATION_MODE = wholemodule; 478 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 479 | }; 480 | name = Release; 481 | }; 482 | 33CC10FC2044A3C60003C045 /* Debug */ = { 483 | isa = XCBuildConfiguration; 484 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 485 | buildSettings = { 486 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 487 | CLANG_ENABLE_MODULES = YES; 488 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 489 | CODE_SIGN_STYLE = Automatic; 490 | COMBINE_HIDPI_IMAGES = YES; 491 | INFOPLIST_FILE = Runner/Info.plist; 492 | LD_RUNPATH_SEARCH_PATHS = ( 493 | "$(inherited)", 494 | "@executable_path/../Frameworks", 495 | ); 496 | PROVISIONING_PROFILE_SPECIFIER = ""; 497 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 498 | SWIFT_VERSION = 5.0; 499 | }; 500 | name = Debug; 501 | }; 502 | 33CC10FD2044A3C60003C045 /* Release */ = { 503 | isa = XCBuildConfiguration; 504 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 505 | buildSettings = { 506 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 507 | CLANG_ENABLE_MODULES = YES; 508 | CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; 509 | CODE_SIGN_STYLE = Automatic; 510 | COMBINE_HIDPI_IMAGES = YES; 511 | INFOPLIST_FILE = Runner/Info.plist; 512 | LD_RUNPATH_SEARCH_PATHS = ( 513 | "$(inherited)", 514 | "@executable_path/../Frameworks", 515 | ); 516 | PROVISIONING_PROFILE_SPECIFIER = ""; 517 | SWIFT_VERSION = 5.0; 518 | }; 519 | name = Release; 520 | }; 521 | 33CC111C2044C6BA0003C045 /* Debug */ = { 522 | isa = XCBuildConfiguration; 523 | buildSettings = { 524 | CODE_SIGN_STYLE = Manual; 525 | PRODUCT_NAME = "$(TARGET_NAME)"; 526 | }; 527 | name = Debug; 528 | }; 529 | 33CC111D2044C6BA0003C045 /* Release */ = { 530 | isa = XCBuildConfiguration; 531 | buildSettings = { 532 | CODE_SIGN_STYLE = Automatic; 533 | PRODUCT_NAME = "$(TARGET_NAME)"; 534 | }; 535 | name = Release; 536 | }; 537 | /* End XCBuildConfiguration section */ 538 | 539 | /* Begin XCConfigurationList section */ 540 | 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { 541 | isa = XCConfigurationList; 542 | buildConfigurations = ( 543 | 33CC10F92044A3C60003C045 /* Debug */, 544 | 33CC10FA2044A3C60003C045 /* Release */, 545 | 338D0CE9231458BD00FA5F75 /* Profile */, 546 | ); 547 | defaultConfigurationIsVisible = 0; 548 | defaultConfigurationName = Release; 549 | }; 550 | 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 33CC10FC2044A3C60003C045 /* Debug */, 554 | 33CC10FD2044A3C60003C045 /* Release */, 555 | 338D0CEA231458BD00FA5F75 /* Profile */, 556 | ); 557 | defaultConfigurationIsVisible = 0; 558 | defaultConfigurationName = Release; 559 | }; 560 | 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { 561 | isa = XCConfigurationList; 562 | buildConfigurations = ( 563 | 33CC111C2044C6BA0003C045 /* Debug */, 564 | 33CC111D2044C6BA0003C045 /* Release */, 565 | 338D0CEB231458BD00FA5F75 /* Profile */, 566 | ); 567 | defaultConfigurationIsVisible = 0; 568 | defaultConfigurationName = Release; 569 | }; 570 | /* End XCConfigurationList section */ 571 | }; 572 | rootObject = 33CC10E52044A3C60003C045 /* Project object */; 573 | } 574 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = bookini 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bookini 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | $(PRODUCT_COPYRIGHT) 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.10.0" 12 | bloc: 13 | dependency: transitive 14 | description: 15 | name: bloc 16 | sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "8.1.1" 20 | boolean_selector: 21 | dependency: transitive 22 | description: 23 | name: boolean_selector 24 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.1.1" 28 | cached_network_image: 29 | dependency: "direct main" 30 | description: 31 | name: cached_network_image 32 | sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "3.2.3" 36 | cached_network_image_platform_interface: 37 | dependency: transitive 38 | description: 39 | name: cached_network_image_platform_interface 40 | sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "2.0.0" 44 | cached_network_image_web: 45 | dependency: transitive 46 | description: 47 | name: cached_network_image_web 48 | sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.0.2" 52 | characters: 53 | dependency: transitive 54 | description: 55 | name: characters 56 | sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.2.1" 60 | clock: 61 | dependency: transitive 62 | description: 63 | name: clock 64 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.1.1" 68 | collection: 69 | dependency: transitive 70 | description: 71 | name: collection 72 | sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.17.0" 76 | crypto: 77 | dependency: transitive 78 | description: 79 | name: crypto 80 | sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "3.0.2" 84 | cupertino_icons: 85 | dependency: "direct main" 86 | description: 87 | name: cupertino_icons 88 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "1.0.5" 92 | dartz: 93 | dependency: "direct main" 94 | description: 95 | name: dartz 96 | sha256: e6acf34ad2e31b1eb00948692468c30ab48ac8250e0f0df661e29f12dd252168 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "0.10.1" 100 | device_frame: 101 | dependency: transitive 102 | description: 103 | name: device_frame 104 | sha256: afe76182aec178d171953d9b4a50a43c57c7cf3c77d8b09a48bf30c8fa04dd9d 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "1.1.0" 108 | device_preview: 109 | dependency: "direct main" 110 | description: 111 | name: device_preview 112 | sha256: "2f097bf31b929e15e6756dbe0ec1bcb63952ab9ed51c25dc5a2c722d2b21fdaf" 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "1.1.0" 116 | dio: 117 | dependency: "direct main" 118 | description: 119 | name: dio 120 | sha256: "0894a098594263fe1caaba3520e3016d8a855caeb010a882273189cca10f11e9" 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "5.1.1" 124 | equatable: 125 | dependency: "direct main" 126 | description: 127 | name: equatable 128 | sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "2.0.5" 132 | fake_async: 133 | dependency: transitive 134 | description: 135 | name: fake_async 136 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 137 | url: "https://pub.dev" 138 | source: hosted 139 | version: "1.3.1" 140 | ffi: 141 | dependency: transitive 142 | description: 143 | name: ffi 144 | sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 145 | url: "https://pub.dev" 146 | source: hosted 147 | version: "2.0.1" 148 | file: 149 | dependency: transitive 150 | description: 151 | name: file 152 | sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" 153 | url: "https://pub.dev" 154 | source: hosted 155 | version: "6.1.4" 156 | flutter: 157 | dependency: "direct main" 158 | description: flutter 159 | source: sdk 160 | version: "0.0.0" 161 | flutter_bloc: 162 | dependency: "direct main" 163 | description: 164 | name: flutter_bloc 165 | sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775" 166 | url: "https://pub.dev" 167 | source: hosted 168 | version: "8.1.2" 169 | flutter_blurhash: 170 | dependency: transitive 171 | description: 172 | name: flutter_blurhash 173 | sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" 174 | url: "https://pub.dev" 175 | source: hosted 176 | version: "0.7.0" 177 | flutter_cache_manager: 178 | dependency: transitive 179 | description: 180 | name: flutter_cache_manager 181 | sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" 182 | url: "https://pub.dev" 183 | source: hosted 184 | version: "3.3.0" 185 | flutter_lints: 186 | dependency: "direct dev" 187 | description: 188 | name: flutter_lints 189 | sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c 190 | url: "https://pub.dev" 191 | source: hosted 192 | version: "2.0.1" 193 | flutter_localizations: 194 | dependency: transitive 195 | description: flutter 196 | source: sdk 197 | version: "0.0.0" 198 | flutter_test: 199 | dependency: "direct dev" 200 | description: flutter 201 | source: sdk 202 | version: "0.0.0" 203 | flutter_web_plugins: 204 | dependency: transitive 205 | description: flutter 206 | source: sdk 207 | version: "0.0.0" 208 | font_awesome_flutter: 209 | dependency: "direct main" 210 | description: 211 | name: font_awesome_flutter 212 | sha256: "959ef4add147753f990b4a7c6cccb746d5792dbdc81b1cde99e62e7edb31b206" 213 | url: "https://pub.dev" 214 | source: hosted 215 | version: "10.4.0" 216 | freezed_annotation: 217 | dependency: transitive 218 | description: 219 | name: freezed_annotation 220 | sha256: aeac15850ef1b38ee368d4c53ba9a847e900bb2c53a4db3f6881cbb3cb684338 221 | url: "https://pub.dev" 222 | source: hosted 223 | version: "2.2.0" 224 | get: 225 | dependency: "direct main" 226 | description: 227 | name: get 228 | sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" 229 | url: "https://pub.dev" 230 | source: hosted 231 | version: "4.6.5" 232 | get_it: 233 | dependency: "direct main" 234 | description: 235 | name: get_it 236 | sha256: "290fde3a86072e4b37dbb03c07bec6126f0ecc28dad403c12ffe2e5a2d751ab7" 237 | url: "https://pub.dev" 238 | source: hosted 239 | version: "7.2.0" 240 | go_router: 241 | dependency: "direct main" 242 | description: 243 | name: go_router 244 | sha256: "50bc08b72ede07daaf897deb4c00ca8fd8976c8821a4c84d7aeef0e92d1c5620" 245 | url: "https://pub.dev" 246 | source: hosted 247 | version: "6.5.6" 248 | google_fonts: 249 | dependency: "direct main" 250 | description: 251 | name: google_fonts 252 | sha256: "927573f2e8a8d65c17931e21918ad0ab0666b1b636537de7c4932bdb487b190f" 253 | url: "https://pub.dev" 254 | source: hosted 255 | version: "4.0.3" 256 | http: 257 | dependency: transitive 258 | description: 259 | name: http 260 | sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" 261 | url: "https://pub.dev" 262 | source: hosted 263 | version: "0.13.5" 264 | http_parser: 265 | dependency: transitive 266 | description: 267 | name: http_parser 268 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" 269 | url: "https://pub.dev" 270 | source: hosted 271 | version: "4.0.2" 272 | intl: 273 | dependency: transitive 274 | description: 275 | name: intl 276 | sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" 277 | url: "https://pub.dev" 278 | source: hosted 279 | version: "0.17.0" 280 | js: 281 | dependency: transitive 282 | description: 283 | name: js 284 | sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" 285 | url: "https://pub.dev" 286 | source: hosted 287 | version: "0.6.5" 288 | json_annotation: 289 | dependency: transitive 290 | description: 291 | name: json_annotation 292 | sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 293 | url: "https://pub.dev" 294 | source: hosted 295 | version: "4.8.0" 296 | lints: 297 | dependency: transitive 298 | description: 299 | name: lints 300 | sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" 301 | url: "https://pub.dev" 302 | source: hosted 303 | version: "2.0.1" 304 | logging: 305 | dependency: transitive 306 | description: 307 | name: logging 308 | sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" 309 | url: "https://pub.dev" 310 | source: hosted 311 | version: "1.1.1" 312 | matcher: 313 | dependency: transitive 314 | description: 315 | name: matcher 316 | sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" 317 | url: "https://pub.dev" 318 | source: hosted 319 | version: "0.12.13" 320 | material_color_utilities: 321 | dependency: transitive 322 | description: 323 | name: material_color_utilities 324 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 325 | url: "https://pub.dev" 326 | source: hosted 327 | version: "0.2.0" 328 | meta: 329 | dependency: transitive 330 | description: 331 | name: meta 332 | sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" 333 | url: "https://pub.dev" 334 | source: hosted 335 | version: "1.8.0" 336 | nested: 337 | dependency: transitive 338 | description: 339 | name: nested 340 | sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" 341 | url: "https://pub.dev" 342 | source: hosted 343 | version: "1.0.0" 344 | octo_image: 345 | dependency: transitive 346 | description: 347 | name: octo_image 348 | sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" 349 | url: "https://pub.dev" 350 | source: hosted 351 | version: "1.0.2" 352 | path: 353 | dependency: transitive 354 | description: 355 | name: path 356 | sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b 357 | url: "https://pub.dev" 358 | source: hosted 359 | version: "1.8.2" 360 | path_provider: 361 | dependency: transitive 362 | description: 363 | name: path_provider 364 | sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 365 | url: "https://pub.dev" 366 | source: hosted 367 | version: "2.0.14" 368 | path_provider_android: 369 | dependency: transitive 370 | description: 371 | name: path_provider_android 372 | sha256: da97262be945a72270513700a92b39dd2f4a54dad55d061687e2e37a6390366a 373 | url: "https://pub.dev" 374 | source: hosted 375 | version: "2.0.25" 376 | path_provider_foundation: 377 | dependency: transitive 378 | description: 379 | name: path_provider_foundation 380 | sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 381 | url: "https://pub.dev" 382 | source: hosted 383 | version: "2.2.2" 384 | path_provider_linux: 385 | dependency: transitive 386 | description: 387 | name: path_provider_linux 388 | sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" 389 | url: "https://pub.dev" 390 | source: hosted 391 | version: "2.1.10" 392 | path_provider_platform_interface: 393 | dependency: transitive 394 | description: 395 | name: path_provider_platform_interface 396 | sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" 397 | url: "https://pub.dev" 398 | source: hosted 399 | version: "2.0.6" 400 | path_provider_windows: 401 | dependency: transitive 402 | description: 403 | name: path_provider_windows 404 | sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 405 | url: "https://pub.dev" 406 | source: hosted 407 | version: "2.1.5" 408 | pedantic: 409 | dependency: transitive 410 | description: 411 | name: pedantic 412 | sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" 413 | url: "https://pub.dev" 414 | source: hosted 415 | version: "1.11.1" 416 | platform: 417 | dependency: transitive 418 | description: 419 | name: platform 420 | sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" 421 | url: "https://pub.dev" 422 | source: hosted 423 | version: "3.1.0" 424 | plugin_platform_interface: 425 | dependency: transitive 426 | description: 427 | name: plugin_platform_interface 428 | sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" 429 | url: "https://pub.dev" 430 | source: hosted 431 | version: "2.1.4" 432 | process: 433 | dependency: transitive 434 | description: 435 | name: process 436 | sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" 437 | url: "https://pub.dev" 438 | source: hosted 439 | version: "4.2.4" 440 | provider: 441 | dependency: transitive 442 | description: 443 | name: provider 444 | sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f 445 | url: "https://pub.dev" 446 | source: hosted 447 | version: "6.0.5" 448 | rxdart: 449 | dependency: transitive 450 | description: 451 | name: rxdart 452 | sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" 453 | url: "https://pub.dev" 454 | source: hosted 455 | version: "0.27.7" 456 | shared_preferences: 457 | dependency: transitive 458 | description: 459 | name: shared_preferences 460 | sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" 461 | url: "https://pub.dev" 462 | source: hosted 463 | version: "2.1.0" 464 | shared_preferences_android: 465 | dependency: transitive 466 | description: 467 | name: shared_preferences_android 468 | sha256: "7fa90471a6875d26ad78c7e4a675874b2043874586891128dc5899662c97db46" 469 | url: "https://pub.dev" 470 | source: hosted 471 | version: "2.1.2" 472 | shared_preferences_foundation: 473 | dependency: transitive 474 | description: 475 | name: shared_preferences_foundation 476 | sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" 477 | url: "https://pub.dev" 478 | source: hosted 479 | version: "2.2.1" 480 | shared_preferences_linux: 481 | dependency: transitive 482 | description: 483 | name: shared_preferences_linux 484 | sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" 485 | url: "https://pub.dev" 486 | source: hosted 487 | version: "2.2.0" 488 | shared_preferences_platform_interface: 489 | dependency: transitive 490 | description: 491 | name: shared_preferences_platform_interface 492 | sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d 493 | url: "https://pub.dev" 494 | source: hosted 495 | version: "2.2.0" 496 | shared_preferences_web: 497 | dependency: transitive 498 | description: 499 | name: shared_preferences_web 500 | sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" 501 | url: "https://pub.dev" 502 | source: hosted 503 | version: "2.1.0" 504 | shared_preferences_windows: 505 | dependency: transitive 506 | description: 507 | name: shared_preferences_windows 508 | sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" 509 | url: "https://pub.dev" 510 | source: hosted 511 | version: "2.2.0" 512 | shimmer: 513 | dependency: "direct main" 514 | description: 515 | name: shimmer 516 | sha256: "1f1009b5845a1f88f1c5630212279540486f97409e9fc3f63883e71070d107bf" 517 | url: "https://pub.dev" 518 | source: hosted 519 | version: "2.0.0" 520 | sky_engine: 521 | dependency: transitive 522 | description: flutter 523 | source: sdk 524 | version: "0.0.99" 525 | source_span: 526 | dependency: transitive 527 | description: 528 | name: source_span 529 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 530 | url: "https://pub.dev" 531 | source: hosted 532 | version: "1.9.1" 533 | sqflite: 534 | dependency: transitive 535 | description: 536 | name: sqflite 537 | sha256: "500d6fec583d2c021f2d25a056d96654f910662c64f836cd2063167b8f1fa758" 538 | url: "https://pub.dev" 539 | source: hosted 540 | version: "2.2.6" 541 | sqflite_common: 542 | dependency: transitive 543 | description: 544 | name: sqflite_common 545 | sha256: "963dad8c4aa2f814ce7d2d5b1da2f36f31bd1a439d8f27e3dc189bb9d26bc684" 546 | url: "https://pub.dev" 547 | source: hosted 548 | version: "2.4.3" 549 | stack_trace: 550 | dependency: transitive 551 | description: 552 | name: stack_trace 553 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 554 | url: "https://pub.dev" 555 | source: hosted 556 | version: "1.11.0" 557 | stream_channel: 558 | dependency: transitive 559 | description: 560 | name: stream_channel 561 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 562 | url: "https://pub.dev" 563 | source: hosted 564 | version: "2.1.1" 565 | string_scanner: 566 | dependency: transitive 567 | description: 568 | name: string_scanner 569 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 570 | url: "https://pub.dev" 571 | source: hosted 572 | version: "1.2.0" 573 | synchronized: 574 | dependency: transitive 575 | description: 576 | name: synchronized 577 | sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" 578 | url: "https://pub.dev" 579 | source: hosted 580 | version: "3.0.1" 581 | term_glyph: 582 | dependency: transitive 583 | description: 584 | name: term_glyph 585 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 586 | url: "https://pub.dev" 587 | source: hosted 588 | version: "1.2.1" 589 | test_api: 590 | dependency: transitive 591 | description: 592 | name: test_api 593 | sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 594 | url: "https://pub.dev" 595 | source: hosted 596 | version: "0.4.16" 597 | typed_data: 598 | dependency: transitive 599 | description: 600 | name: typed_data 601 | sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" 602 | url: "https://pub.dev" 603 | source: hosted 604 | version: "1.3.1" 605 | url_launcher: 606 | dependency: "direct main" 607 | description: 608 | name: url_launcher 609 | sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" 610 | url: "https://pub.dev" 611 | source: hosted 612 | version: "6.1.10" 613 | url_launcher_android: 614 | dependency: transitive 615 | description: 616 | name: url_launcher_android 617 | sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 618 | url: "https://pub.dev" 619 | source: hosted 620 | version: "6.0.27" 621 | url_launcher_ios: 622 | dependency: transitive 623 | description: 624 | name: url_launcher_ios 625 | sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" 626 | url: "https://pub.dev" 627 | source: hosted 628 | version: "6.1.4" 629 | url_launcher_linux: 630 | dependency: transitive 631 | description: 632 | name: url_launcher_linux 633 | sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" 634 | url: "https://pub.dev" 635 | source: hosted 636 | version: "3.0.4" 637 | url_launcher_macos: 638 | dependency: transitive 639 | description: 640 | name: url_launcher_macos 641 | sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" 642 | url: "https://pub.dev" 643 | source: hosted 644 | version: "3.0.5" 645 | url_launcher_platform_interface: 646 | dependency: transitive 647 | description: 648 | name: url_launcher_platform_interface 649 | sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" 650 | url: "https://pub.dev" 651 | source: hosted 652 | version: "2.1.2" 653 | url_launcher_web: 654 | dependency: transitive 655 | description: 656 | name: url_launcher_web 657 | sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" 658 | url: "https://pub.dev" 659 | source: hosted 660 | version: "2.0.16" 661 | url_launcher_windows: 662 | dependency: transitive 663 | description: 664 | name: url_launcher_windows 665 | sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd 666 | url: "https://pub.dev" 667 | source: hosted 668 | version: "3.0.5" 669 | uuid: 670 | dependency: transitive 671 | description: 672 | name: uuid 673 | sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" 674 | url: "https://pub.dev" 675 | source: hosted 676 | version: "3.0.7" 677 | vector_math: 678 | dependency: transitive 679 | description: 680 | name: vector_math 681 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 682 | url: "https://pub.dev" 683 | source: hosted 684 | version: "2.1.4" 685 | win32: 686 | dependency: transitive 687 | description: 688 | name: win32 689 | sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 690 | url: "https://pub.dev" 691 | source: hosted 692 | version: "3.1.4" 693 | xdg_directories: 694 | dependency: transitive 695 | description: 696 | name: xdg_directories 697 | sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 698 | url: "https://pub.dev" 699 | source: hosted 700 | version: "1.0.0" 701 | sdks: 702 | dart: ">=2.19.6 <3.0.0" 703 | flutter: ">=3.3.0" 704 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: bookini 2 | description: A new Flutter project. 3 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 4 | version: 1.0.0+1 5 | 6 | environment: 7 | sdk: '>=2.19.6 <3.0.0' 8 | 9 | # Dependencies specify other packages that your package needs in order to work. 10 | # To automatically upgrade your package dependencies to the latest versions 11 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 12 | # dependencies can be manually updated by changing the version numbers below to 13 | # the latest version available on pub.dev. To see which dependencies have newer 14 | # versions available, run `flutter pub outdated`. 15 | dependencies: 16 | flutter: 17 | sdk: flutter 18 | 19 | 20 | # The following adds the Cupertino Icons font to your application. 21 | # Use with the CupertinoIcons class for iOS style icons. 22 | cupertino_icons: ^1.0.2 23 | flutter_bloc: ^8.1.2 24 | url_launcher: ^6.1.10 25 | get: ^4.6.5 26 | google_fonts: ^4.0.3 27 | go_router: ^6.5.6 28 | device_preview: ^1.1.0 29 | font_awesome_flutter: ^10.4.0 30 | equatable: ^2.0.5 31 | dartz: ^0.10.1 32 | dio: ^5.1.1 33 | get_it: ^7.2.0 34 | cached_network_image: ^3.2.3 35 | shimmer: ^2.0.0 36 | 37 | dev_dependencies: 38 | flutter_test: 39 | sdk: flutter 40 | 41 | # The "flutter_lints" package below contains a set of recommended lints to 42 | # encourage good coding practices. The lint set provided by the package is 43 | # activated in the `analysis_options.yaml` file located at the root of your 44 | # package. See that file for information about deactivating specific lint 45 | # rules and activating additional ones. 46 | flutter_lints: ^2.0.0 47 | 48 | # For information on the generic Dart part of this file, see the 49 | # following page: https://dart.dev/tools/pub/pubspec 50 | 51 | # The following section is specific to Flutter packages. 52 | flutter: 53 | 54 | # The following line ensures that the Material Icons font is 55 | # included with your application, so that you can use the icons in 56 | # the material Icons class. 57 | uses-material-design: true 58 | 59 | # To add assets to your application, add an assets section, like this: 60 | assets: 61 | - assets/images/test_image.png 62 | - assets/images/Logo.png 63 | 64 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1FarZ1/Bookini/4197b99078069ba9e77c9a141c2f112d15177829/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | bookini 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bookini", 3 | "short_name": "bookini", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | --------------------------------------------------------------------------------