diff --git a/.github/workflows/graphql_integration.yml b/.github/workflows/graphql_integration.yml new file mode 100644 index 000000000..31a1b6aad --- /dev/null +++ b/.github/workflows/graphql_integration.yml @@ -0,0 +1,15 @@ +name: "graphql_flutter: integration testing " +on: [push, pull_request] +jobs: + integration_tests: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: subosito/flutter-action@v1 + - run: flutter pub get + - run: chromedriver --port=4444 & + - name: graphql_chat intergration testing + run: | + cd packages/graphql_flutter/example/graphql_chat + flutter pub dev + flutter drive --driver=test_driver/integration_test.dart --target=integration_test/intergration_test.dart -d chrome \ No newline at end of file diff --git a/examples/starwars/.gitignore b/examples/starwars/.gitignore deleted file mode 100644 index 50ce5ca85..000000000 --- a/examples/starwars/.gitignore +++ /dev/null @@ -1,102 +0,0 @@ -# Miscellaneous -*.class -*.lock -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# Visual Studio Code related -.vscode/ -.project - -# Flutter repo-specific -/bin/cache/ -/bin/mingit/ -/dev/benchmarks/mega_gallery/ -/dev/bots/.recipe_deps -/dev/bots/android_tools/ -/dev/docs/doc/ -/dev/docs/flutter.docs.zip -/dev/docs/lib/ -/dev/docs/pubspec.yaml -/dev/integration_tests/**/xcuserdata -/dev/integration_tests/**/Pods -/packages/flutter/coverage/ -version - -# packages file containing multi-root paths -.packages.generated - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.packages -.pub-cache/ -.pub/ -build/ -flutter_*.png -linked_*.ds -unlinked.ds -unlinked_spec.ds - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java -**/android/key.properties -*.jks - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Coverage -coverage/ - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -!/dev/ci/**/Gemfile.lock \ No newline at end of file diff --git a/examples/starwars/Makefile b/examples/starwars/Makefile deleted file mode 100644 index 67c06b7f8..000000000 --- a/examples/starwars/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -CC=dart -CC_UI=flutter - - -default: fmt dep - @echo "Please run \"make server !&\" to run the server" - - -dep: - cd server; $(CC) pub get - $(CC_UI) pub get - -server: - $(CC) pub run graphql_starwars_test_server - -fmt: - $(CC_UI) format . - $(CC_UI) analyze . - -clean: - $(CC_UI) clean diff --git a/examples/starwars/README.md b/examples/starwars/README.md deleted file mode 100644 index 7a2970445..000000000 --- a/examples/starwars/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Star Wars Demo - -### Server side - -To start the server you need to run the following command: -```bash -make && make server !& -``` - -### Client side - -To consume the API of the server you can run the server with the following command - -- `flutter run` to run it on the ios device -- `flutter run -d chrome` for web support: - -### Screenshots - -![flutter for web image](./for_web.png) diff --git a/examples/starwars/android/app/build.gradle b/examples/starwars/android/app/build.gradle deleted file mode 100644 index ad9de98a2..000000000 --- a/examples/starwars/android/app/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.starwars" - minSdkVersion 19 - targetSdkVersion 30 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/examples/starwars/android/app/src/main/AndroidManifest.xml b/examples/starwars/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 2685c8883..000000000 --- a/examples/starwars/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java b/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java deleted file mode 100644 index 9ff1f9f52..000000000 --- a/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.starwars; - -import io.flutter.embedding.android.FlutterActivity; - -public class MainActivity extends FlutterActivity { } diff --git a/examples/starwars/android/app/src/main/res/values/styles.xml b/examples/starwars/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 7f287b04b..000000000 --- a/examples/starwars/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/examples/starwars/android/app/src/profile/AndroidManifest.xml b/examples/starwars/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 94f183474..000000000 --- a/examples/starwars/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/examples/starwars/android/build.gradle b/examples/starwars/android/build.gradle deleted file mode 100644 index bb8a30389..000000000 --- a/examples/starwars/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/examples/starwars/android/gradle.properties b/examples/starwars/android/gradle.properties deleted file mode 100644 index 8bd86f680..000000000 --- a/examples/starwars/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/examples/starwars/android/gradle/wrapper/gradle-wrapper.properties b/examples/starwars/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f..000000000 --- a/examples/starwars/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/examples/starwars/android/settings.gradle b/examples/starwars/android/settings.gradle deleted file mode 100644 index 5a2f14fb1..000000000 --- a/examples/starwars/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/examples/starwars/for_web.png b/examples/starwars/for_web.png deleted file mode 100644 index 3b3ae3bad..000000000 Binary files a/examples/starwars/for_web.png and /dev/null differ diff --git a/examples/starwars/ios/Flutter/AppFrameworkInfo.plist b/examples/starwars/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9367d483e..000000000 --- a/examples/starwars/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/examples/starwars/ios/Flutter/Debug.xcconfig b/examples/starwars/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114..000000000 --- a/examples/starwars/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/examples/starwars/ios/Flutter/Release.xcconfig b/examples/starwars/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e..000000000 --- a/examples/starwars/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/examples/starwars/ios/Podfile b/examples/starwars/ios/Podfile deleted file mode 100644 index f7d6a5e68..000000000 --- a/examples/starwars/ios/Podfile +++ /dev/null @@ -1,38 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/examples/starwars/ios/Runner.xcodeproj/project.pbxproj b/examples/starwars/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 52f552cf0..000000000 --- a/examples/starwars/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,540 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - CBDD155917C1692EC4F78B55 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF82C04C3273D555FFF0D32 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 78BC9F830CF1BC2D0D3115CC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 8BF82C04C3273D555FFF0D32 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C93EF51D6E349EFD8C75D0FD /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D872E1B18A40136E516F1ABC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CBDD155917C1692EC4F78B55 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 277F0233D0FB314B2D8685A3 /* Pods */ = { - isa = PBXGroup; - children = ( - D872E1B18A40136E516F1ABC /* Pods-Runner.debug.xcconfig */, - 78BC9F830CF1BC2D0D3115CC /* Pods-Runner.release.xcconfig */, - C93EF51D6E349EFD8C75D0FD /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 79E42AFF773B845DF87E0080 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8BF82C04C3273D555FFF0D32 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 277F0233D0FB314B2D8685A3 /* Pods */, - 79E42AFF773B845DF87E0080 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - E713952B12A73E808568155D /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - E713952B12A73E808568155D /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = S8QB4VV633; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starwars; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starwars; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starwars; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/examples/starwars/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/starwars/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c..000000000 --- a/examples/starwars/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/starwars/ios/Runner/AppDelegate.h b/examples/starwars/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9..000000000 --- a/examples/starwars/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/examples/starwars/ios/Runner/AppDelegate.m b/examples/starwars/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90b..000000000 --- a/examples/starwars/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e6..000000000 Binary files a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/examples/starwars/ios/Runner/Info.plist b/examples/starwars/ios/Runner/Info.plist deleted file mode 100644 index 14ed19a4c..000000000 --- a/examples/starwars/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - starwars - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/starwars/ios/Runner/main.m b/examples/starwars/ios/Runner/main.m deleted file mode 100644 index dff6597e4..000000000 --- a/examples/starwars/ios/Runner/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples/starwars/lib/generated_plugin_registrant.dart b/examples/starwars/lib/generated_plugin_registrant.dart deleted file mode 100644 index 533f1704b..000000000 --- a/examples/starwars/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,17 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars -// ignore_for_file: depend_on_referenced_packages - -import 'package:connectivity_plus_web/connectivity_plus_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - ConnectivityPlusPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/examples/starwars/lib/main.dart b/examples/starwars/lib/main.dart deleted file mode 100644 index b8a5bb114..000000000 --- a/examples/starwars/lib/main.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:starwars_app/view/client/graphql_view.dart'; -import 'package:universal_platform/universal_platform.dart'; - -import 'view/episode/episode_page.dart'; -import 'view/review/review_page.dart'; -import 'view/review/review_page_list.dart'; - -String get host { -// https://github.com/flutter/flutter/issues/36126#issuecomment-596215587 - if (UniversalPlatform.isAndroid) { - return '10.0.2.2'; - } else { - return '127.0.0.1'; - } -} - -final graphqlEndpoint = 'http://$host:3000/graphql'; -final subscriptionEndpoint = 'ws://$host:3000/subscriptions'; - -void main() async { - await initHiveForFlutter(); - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return ClientProvider( - uri: graphqlEndpoint, - subscriptionUri: subscriptionEndpoint, - child: MaterialApp( - title: 'Graphql Starwars Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: MyHomePage(title: 'Graphql Starwars Demo'), - ), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _selectedIndex = 0; - - void _navigateTo(int index) { - setState(() { - _selectedIndex = index; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: [EpisodePage(), ReviewsPage(), PagingReviews()][_selectedIndex], - bottomNavigationBar: BottomNavigationBar( - items: const [ - EpisodePage.navItem, - ReviewsPage.navItem, - PagingReviews.navItem, - ], - currentIndex: _selectedIndex, - selectedItemColor: Colors.amber[800], - onTap: _navigateTo, - ), - ); - } -} diff --git a/examples/starwars/lib/model/episode/episode.dart b/examples/starwars/lib/model/episode/episode.dart deleted file mode 100644 index 5e84d8bc9..000000000 --- a/examples/starwars/lib/model/episode/episode.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'dart:convert'; - -/// The episodes in the Star Wars trilogy -enum Episode { - NEWHOPE, - EMPIRE, - JEDI, -} - -String episodeToJson(Episode e) { - switch (e) { - case Episode.NEWHOPE: - return 'NEWHOPE'; - case Episode.EMPIRE: - return 'EMPIRE'; - case Episode.JEDI: - return 'JEDI'; - default: - return null; - } -} - -String episodeToDisplay(Episode e) { - switch (e) { - case Episode.NEWHOPE: - return 'EP. IV: A NEW HOPE'; - case Episode.EMPIRE: - return 'EP. V: THE EMPIRE STRIKES BACK'; - case Episode.JEDI: - return 'EP. VI: RETURN OF THE JEDI'; - default: - return null; - } -} - -Episode episodeFromJson(String e) { - switch (e) { - case 'NEWHOPE': - return Episode.NEWHOPE; - case 'EMPIRE': - return Episode.EMPIRE; - case 'JEDI': - return Episode.JEDI; - default: - return null; - } -} - -String getPrettyJSONString(Object jsonObject) { - return const JsonEncoder.withIndent(' ').convert(jsonObject); -} diff --git a/examples/starwars/lib/model/review/review.dart b/examples/starwars/lib/model/review/review.dart deleted file mode 100644 index 2771d07ab..000000000 --- a/examples/starwars/lib/model/review/review.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:starwars_app/model/episode/episode.dart'; - -class Review { - Review({ - @required this.episode, - @required this.stars, - @required this.id, - this.commentary, - }); - - String id; - Episode episode; - int stars; - String commentary; - - Review copyWith({ - Episode episode, - int stars, - String commentary, - }) { - return Review( - id: id, - episode: episode ?? this.episode, - stars: stars ?? this.stars, - commentary: commentary ?? this.commentary, - ); - } - - Map toJson() { - assert(episode != null && stars != null); - - return { - 'episode': episodeToJson(episode), - 'stars': stars, - 'commentary': commentary, - }; - } - - static Review fromJson(Map map) => Review( - id: map['id'], - episode: episodeFromJson(map['episode'] as String), - stars: map['stars'] as int, - commentary: map['commentary'] as String, - ); -} - -const String Function(Object jsonObject) displayReview = getPrettyJSONString; diff --git a/examples/starwars/lib/utils/graphql_provider.dart b/examples/starwars/lib/utils/graphql_provider.dart deleted file mode 100644 index f22593d87..000000000 --- a/examples/starwars/lib/utils/graphql_provider.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:flutter/material.dart'; - -String uuidFromObject(Object object) { - if (object is Map) { - final String typeName = object['__typename']; - final String id = object['id'].toString(); - if (typeName != null && id != null) { - return [typeName, id].join('/'); - } - } - return null; -} - -ValueNotifier clientFor({ - @required String uri, - String subscriptionUri, -}) { - Link link = HttpLink(uri); - if (subscriptionUri != null) { - final WebSocketLink websocketLink = WebSocketLink( - subscriptionUri, - ); - - link = Link.split((request) => request.isSubscription, websocketLink, link); - } - - return ValueNotifier( - GraphQLClient( - cache: GraphQLCache(store: HiveStore()), - link: link, - ), - ); -} diff --git a/examples/starwars/lib/view/client/graphql_view.dart b/examples/starwars/lib/view/client/graphql_view.dart deleted file mode 100644 index e65343678..000000000 --- a/examples/starwars/lib/view/client/graphql_view.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:starwars_app/utils/graphql_provider.dart'; - -/// Wraps the root application with the `graphql_flutter` client. -/// We use the cache for all state management. -class ClientProvider extends StatelessWidget { - ClientProvider({ - @required this.child, - @required String uri, - String subscriptionUri, - }) : client = clientFor( - uri: uri, - subscriptionUri: subscriptionUri, - ); - - final Widget child; - final ValueNotifier client; - - @override - Widget build(BuildContext context) { - return GraphQLProvider( - client: client, - child: child, - ); - } -} diff --git a/examples/starwars/lib/view/episode/episode_page.dart b/examples/starwars/lib/view/episode/episode_page.dart deleted file mode 100644 index c7de2b280..000000000 --- a/examples/starwars/lib/view/episode/episode_page.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../model/episode/episode.dart'; -import 'hero_query.dart'; - -class EpisodePage extends StatefulWidget { - static const BottomNavigationBarItem navItem = BottomNavigationBarItem( - icon: Icon(Icons.movie_filter), - label: 'Episodes', - ); - - @override - _EpisodePageState createState() => _EpisodePageState(); -} - -class _EpisodePageState extends State { - Episode currentEpisode = Episode.EMPIRE; - - void _selectEpisode(Episode ep) { - setState(() { - currentEpisode = ep; - }); - } - - @override - Widget build(BuildContext context) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - EpisodeSelect( - selected: currentEpisode, - onSelect: _selectEpisode, - ), - const Text( - 'Hero for this episode:', - ), - HeroForEpisode( - episode: currentEpisode, - ) - ], - ), - ); - } -} - -typedef OnSelect = void Function(Episode episode); - -class EpisodeSelect extends StatelessWidget { - const EpisodeSelect({ - @required this.onSelect, - @required this.selected, - }); - - final OnSelect onSelect; - final Episode selected; - - @override - Widget build(BuildContext context) { - return DropdownButton( - value: selected, - onChanged: onSelect, - items: Episode.values.map>((Episode value) { - return DropdownMenuItem( - value: value, - child: Text(value.toString()), - ); - }).toList(), - ); - } -} diff --git a/examples/starwars/lib/view/episode/hero_query.dart b/examples/starwars/lib/view/episode/hero_query.dart deleted file mode 100644 index 7ee9ec3a6..000000000 --- a/examples/starwars/lib/view/episode/hero_query.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; - -import '../../model/episode/episode.dart'; - -class HeroForEpisode extends StatelessWidget { - const HeroForEpisode({@required this.episode}); - - final Episode episode; - - @override - Widget build(BuildContext context) { - return Query( - options: QueryOptions( - document: gql(r''' - query HeroForEpisode($ep: Episode!) { - hero(episode: $ep) { - __typename - name - ... on Droid { - primaryFunction - } - ... on Human { - height - homePlanet - } - } - } - '''), - variables: { - 'ep': episodeToJson(episode), - }, - ), - builder: ( - QueryResult result, { - Future Function() refetch, - FetchMore fetchMore, - }) { - // NOTE: a loading message is always sent, but if you're developing locally, - // the network result might be returned so fast that - // flutter rebuilds again too quickly for you don't see the loading result on the stream - // print([ - // result.source, - // if (result.data != null) result.data['hero']['name'] - // ]); - if (result.hasException) { - return Text(result.exception.toString()); - } - - return Column( - children: [ - if (result.isLoading) - const Center( - child: CircularProgressIndicator(), - ), - if (result.data != null) - Text( - getPrettyJSONString(result.data), - ), - ElevatedButton( - onPressed: result.isNotLoading ? refetch : null, - child: const Text('REFETCH'), - ), - ], - ); - }, - ); - } -} diff --git a/examples/starwars/lib/view/review/review_page.dart b/examples/starwars/lib/view/review/review_page.dart deleted file mode 100644 index 4038bd842..000000000 --- a/examples/starwars/lib/view/review/review_page.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'review_subscription.dart'; - -class ReviewsPage extends StatelessWidget { - static const BottomNavigationBarItem navItem = BottomNavigationBarItem( - icon: Icon(Icons.star), - label: 'Reviews', - ); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ListTile(title: Text('Live Stream of Reviews')), - Expanded(child: ReviewFeed()), - ], - ); - } -} diff --git a/examples/starwars/lib/view/review/review_page_list.dart b/examples/starwars/lib/view/review/review_page_list.dart deleted file mode 100644 index 23aab63ec..000000000 --- a/examples/starwars/lib/view/review/review_page_list.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:starwars_app/view/review/review_view.dart'; - -class PagingReviews extends StatelessWidget { - static const BottomNavigationBarItem navItem = BottomNavigationBarItem( - icon: Icon(Icons.description), - label: 'Paging', - ); - - @override - Widget build(BuildContext context) { - return Query( - options: QueryOptions( - // if we have cached results, don't clobber them - fetchPolicy: FetchPolicy.cacheFirst, - document: gql(r''' - query Reviews($page: Int!) { - reviews(page: $page) { - page - reviews { - id - episode - stars - commentary - } - } - } - '''), - variables: {'page': 0}, - ), - builder: ( - QueryResult result, { - Refetch refetch, - FetchMore fetchMore, - }) { - if (result.hasException) { - return Text(result.exception.toString()); - } - - if (result.isLoading && result.data == null) { - return const Center( - child: CircularProgressIndicator(), - ); - } - - final nextPage = result.data['reviews']['page'] + 1; - - return Column( - children: [ - Expanded( - child: DisplayReviews( - reviews: result.data['reviews']['reviews'] - .cast>(), - ), - ), - (result.isLoading) - ? Center( - child: CircularProgressIndicator(), - ) - : ElevatedButton( - onPressed: () { - fetchMore( - FetchMoreOptions.partial( - variables: {'page': nextPage}, - updateQuery: (existing, newReviews) => ({ - 'reviews': { - 'page': newReviews['reviews']['page'], - 'reviews': [ - ...existing['reviews']['reviews'], - ...newReviews['reviews']['reviews'] - ], - } - }), - ), - ); - }, - child: Text('LOAD PAGE ${nextPage + 1}'), - ), - ], - ); - }, - ); - } -} diff --git a/examples/starwars/lib/view/review/review_subscription.dart b/examples/starwars/lib/view/review/review_subscription.dart deleted file mode 100644 index 3b510c4eb..000000000 --- a/examples/starwars/lib/view/review/review_subscription.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:starwars_app/view/review/review_view.dart'; - -class ReviewFeed extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Subscription( - options: SubscriptionOptions( - document: gql( - r''' - subscription reviewAdded { - reviewAdded { - stars, commentary, episode - } - } - ''', - ), - ), - builder: (result) { - if (result.hasException) { - return Text(result.exception.toString()); - } - - if (result.isLoading) { - return Center( - child: const CircularProgressIndicator(), - ); - } - return ResultAccumulator.appendUniqueEntries( - latest: result.data, - builder: (context, {results}) => DisplayReviews( - reviews: results.reversed.toList(), - ), - ); - }, - ); - } -} diff --git a/examples/starwars/lib/view/review/review_view.dart b/examples/starwars/lib/view/review/review_view.dart deleted file mode 100644 index ab3f924b2..000000000 --- a/examples/starwars/lib/view/review/review_view.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:starwars_app/model/review/review.dart'; - -class DisplayReviews extends StatefulWidget { - const DisplayReviews({ - Key key, - @required this.reviews, - }) : super(key: key); - - final List> reviews; - - @override - _DisplayReviewsState createState() => _DisplayReviewsState(); -} - -class _DisplayReviewsState extends State { - List> get reviews => widget.reviews; - - Widget displayRaw(Map raw) => Card( - child: Container( - padding: const EdgeInsets.all(15.0), - //height: 150, - child: Text(displayReview(raw)), - ), - ); - - /* - // for debugging - @override - initState() { - super.initState(); - print( - 'DisplayReviews.initState() called on $this.\n' - 'this should only happen ONCE on this page, regardless of fetchMore calls, etc.', - ); - } - @override - didUpdateWidget(old) { - super.didUpdateWidget(old); - print( - 'DisplayReviews.didUpdateWidget() called on $this.\n' - 'this can happen REPEATEDLY due to fetchMore, etc.', - ); - } - */ - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 0.0), - child: ListView( - children: reviews.map(displayRaw).toList(), - ), - ); - } -} diff --git a/examples/starwars/pubspec.yaml b/examples/starwars/pubspec.yaml deleted file mode 100644 index c8a3aa07c..000000000 --- a/examples/starwars/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: starwars_app -description: An example graphql_flutter application utilizing graphql_starwars_test_server - -publish_to: none - -environment: - sdk: ">=2.10.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - graphql_flutter: - path: ../../packages/graphql_flutter - graphql: ^5.1.2-beta.1 - universal_platform: - ^0.1.3 - # https://github.com/flutter/flutter/issues/36126#issuecomment-596215587 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/examples/starwars/server/pubspec.yaml b/examples/starwars/server/pubspec.yaml deleted file mode 100644 index 63a9e1669..000000000 --- a/examples/starwars/server/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: starwars_server - -publish_to: none - -environment: - sdk: ">=2.10.0 <3.0.0" - -dependencies: - graphql_starwars_test_server: ^0.1.0 - -dependency_overrides: - graphql_server: - git: - url: git@github.com:micimize/angel.git - ref: typeerror2.8-fix - path: packages/graphql/graphql_server - graphql_parser: - git: - url: git@github.com:micimize/angel.git - path: packages/graphql/graphql_parser diff --git a/examples/starwars/web/index.html b/examples/starwars/web/index.html deleted file mode 100644 index 3fa8f76a9..000000000 --- a/examples/starwars/web/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - starwars_app - - - - - - - - diff --git a/examples/starwars/web/manifest.json b/examples/starwars/web/manifest.json deleted file mode 100644 index d35da53e7..000000000 --- a/examples/starwars/web/manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "starwars_app", - "short_name": "starwars_app", - "start_url": ".", - "display": "minimal-ui", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} diff --git a/packages/graphql_flutter/example/README.md b/packages/graphql_flutter/example/README.md deleted file mode 100644 index 3608e1745..000000000 --- a/packages/graphql_flutter/example/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# graphql_flutter example - -A Github API wrapper example where you need to specify you token in the `local.dart` file - -## Getting Started - -Just run `flutter pub get` and run your flutter app diff --git a/packages/graphql_flutter/example/analysis_options.yaml b/packages/graphql_flutter/example/analysis_options.yaml deleted file mode 100644 index 90816a657..000000000 --- a/packages/graphql_flutter/example/analysis_options.yaml +++ /dev/null @@ -1,6 +0,0 @@ -include: package:pedantic/analysis_options.yaml - -linter: - rules: - avoid_as: false - flutter_style_todos: false diff --git a/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml b/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index b15a3d5fb..000000000 --- a/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/graphql_flutter/example/android/app/src/main/res/drawable/launch_background.xml b/packages/graphql_flutter/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88..000000000 --- a/packages/graphql_flutter/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/graphql_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7..000000000 Binary files a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/graphql_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79b..000000000 Binary files a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d439148..000000000 Binary files a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34..000000000 Binary files a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eeb..000000000 Binary files a/packages/graphql_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/packages/graphql_flutter/example/graphql_chat/.gitignore b/packages/graphql_flutter/example/graphql_chat/.gitignore new file mode 100644 index 000000000..a8e938c08 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/.gitignore @@ -0,0 +1,47 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/graphql_flutter/example/graphql_chat/.metadata b/packages/graphql_flutter/example/graphql_chat/.metadata new file mode 100644 index 000000000..48c6a0202 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 676cefaaff197f27424942307668886253e1ec35 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: android + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: ios + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: linux + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: macos + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: web + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + - platform: windows + create_revision: 676cefaaff197f27424942307668886253e1ec35 + base_revision: 676cefaaff197f27424942307668886253e1ec35 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/graphql_flutter/example/graphql_chat/Makefile b/packages/graphql_flutter/example/graphql_chat/Makefile new file mode 100644 index 000000000..6033be37a --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/Makefile @@ -0,0 +1,27 @@ +CC=flutter +FMT=format +PATH= + +default: get fmt check + +get: + $(CC) pub get + +generate: + $(CC) pub run build_runner build --delete-conflicting-outputs; + +fmt: + $(CC) $(FMT) . + $(CC) analyze . + +check: + $(CC) test + +clean: + $(CC) clean + +run: + $(CC) run -d linux + +dep_upgrade: + $(CC) pub upgrade --major-versions diff --git a/packages/graphql_flutter/example/graphql_chat/README.md b/packages/graphql_flutter/example/graphql_chat/README.md new file mode 100644 index 000000000..00d8c30c7 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/README.md @@ -0,0 +1,16 @@ +# graphql_chat + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/graphql_flutter/example/graphql_chat/analysis_options.yaml b/packages/graphql_flutter/example/graphql_chat/analysis_options.yaml new file mode 100644 index 000000000..61b6c4de1 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/graphql_flutter/example/android/.gitignore b/packages/graphql_flutter/example/graphql_chat/android/.gitignore similarity index 100% rename from packages/graphql_flutter/example/android/.gitignore rename to packages/graphql_flutter/example/graphql_chat/android/.gitignore diff --git a/packages/graphql_flutter/example/android/app/build.gradle b/packages/graphql_flutter/example/graphql_chat/android/app/build.gradle similarity index 87% rename from packages/graphql_flutter/example/android/app/build.gradle rename to packages/graphql_flutter/example/graphql_chat/android/app/build.gradle index 69f8d594f..2fe0ea088 100644 --- a/packages/graphql_flutter/example/android/app/build.gradle +++ b/packages/graphql_flutter/example/graphql_chat/android/app/build.gradle @@ -27,6 +27,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -43,7 +44,9 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.demo_migaration" + applicationId "com.example.graphql_chat" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() diff --git a/examples/starwars/android/app/src/debug/AndroidManifest.xml b/packages/graphql_flutter/example/graphql_chat/android/app/src/debug/AndroidManifest.xml similarity index 53% rename from examples/starwars/android/app/src/debug/AndroidManifest.xml rename to packages/graphql_flutter/example/graphql_chat/android/app/src/debug/AndroidManifest.xml index 94f183474..8987f5ec3 100644 --- a/examples/starwars/android/app/src/debug/AndroidManifest.xml +++ b/packages/graphql_flutter/example/graphql_chat/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,7 @@ - diff --git a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/graphql_flutter/example/graphql_chat/android/app/src/main/AndroidManifest.xml similarity index 95% rename from packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml rename to packages/graphql_flutter/example/graphql_chat/android/app/src/main/AndroidManifest.xml index f153f1bf5..ba1992d3e 100644 --- a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/graphql_flutter/example/graphql_chat/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + package="com.example.graphql_chat"> diff --git a/packages/graphql_flutter/example/android/build.gradle b/packages/graphql_flutter/example/graphql_chat/android/build.gradle similarity index 84% rename from packages/graphql_flutter/example/android/build.gradle rename to packages/graphql_flutter/example/graphql_chat/android/build.gradle index 24047dce5..83ae22004 100644 --- a/packages/graphql_flutter/example/android/build.gradle +++ b/packages/graphql_flutter/example/graphql_chat/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/packages/graphql_flutter/example/android/gradle.properties b/packages/graphql_flutter/example/graphql_chat/android/gradle.properties similarity index 100% rename from packages/graphql_flutter/example/android/gradle.properties rename to packages/graphql_flutter/example/graphql_chat/android/gradle.properties diff --git a/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/graphql_flutter/example/graphql_chat/android/gradle/wrapper/gradle-wrapper.properties similarity index 93% rename from packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/graphql_flutter/example/graphql_chat/android/gradle/wrapper/gradle-wrapper.properties index bc6a58afd..cc5527d78 100644 --- a/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/graphql_flutter/example/graphql_chat/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/packages/graphql_flutter/example/android/settings.gradle b/packages/graphql_flutter/example/graphql_chat/android/settings.gradle similarity index 100% rename from packages/graphql_flutter/example/android/settings.gradle rename to packages/graphql_flutter/example/graphql_chat/android/settings.gradle diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/clients/ClientProvider.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/clients/ClientProvider.dart new file mode 100644 index 000000000..b5b5ec212 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/clients/ClientProvider.dart @@ -0,0 +1,58 @@ +/// Client Provider is a utils class that contains in a single place +/// all the client used to ran the integration testing with all the +/// servers. +/// +/// The test supported in this class for the moment are: +/// - GraphQl Client Chat: https://github.com/vincenzopalazzo/keep-safe-graphql +/// +/// author: https://github.com/vincenzopalazzo + +/// ClientProvider is a singleton implementation that contains +/// all the client supported to implement the integration testing. +import 'package:graphql_flutter/graphql_flutter.dart'; + +class ClientProvider { + static ClientProvider? _instance; + + GraphQLClient? _chatApp; + + ClientProvider._internal(); + + factory ClientProvider() { + _instance ??= ClientProvider._internal(); + return _instance!; + } + + /// Init the client regarding the chat app server + /// crete only a single instance of it. + GraphQLClient chatAppClient( + {GraphQLCache? cache, bool forceRecreation = false}) { + if (_chatApp == null || forceRecreation) { + final HttpLink httpLink = HttpLink( + 'https://api.chat.graphql-flutter.dev/graphql', + defaultHeaders: { + "Accept": "application/json", + "Access-Control_Allow_Origin": "*", + }, + ); + var wsLink = WebSocketLink( + 'ws://api.chat.graphql-flutter.dev/graphql', + config: const SocketClientConfig( + inactivityTimeout: Duration(seconds: 40), + ), + subProtocol: GraphQLProtocol.graphqlTransportWs, + ); + final Link link = httpLink.split( + (request) => request.isSubscription, + wsLink, + httpLink, + ); + if (!forceRecreation) { + _chatApp = GraphQLClient(link: link, cache: cache ?? GraphQLCache()); + } else { + return GraphQLClient(link: link, cache: cache ?? GraphQLCache()); + } + } + return _chatApp!; + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/intergration_test.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/intergration_test.dart new file mode 100644 index 000000000..112d2373c --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/intergration_test.dart @@ -0,0 +1,119 @@ +/// Integration test regarding the graphq_flutter widget +/// +/// In this particular test suite we implement a battery of test +/// to make sure that all the operation on a widget are done +/// correctly. +/// +/// More precise in this file all the test are regarding the web socket and +/// the subscription. +/// +/// Trying to reproduce the problems caused by the following issue +/// - Subscription not receive update +/// - https://github.com/zino-hofmann/graphql-flutter/issues/1163 +/// - https://github.com/zino-hofmann/graphql-flutter/issues/1162 +/// +/// author: https://github.com/vincenzopalazzo +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:logger/logger.dart'; +import 'clients/ClientProvider.dart'; +import 'model/chat_app_model.dart'; +import 'widget/MockAppView.dart' as app; +import 'widget/list_view_query.dart'; +import 'widget/list_view_subscription.dart'; + +/// Configure the test to check if the ws `GraphQLProtocol.graphqlTransportWs` receive +/// update correctly. +Future configureTestForSimpleSubscriptionUpdate(dynamic tester) async { + var logger = Logger(); + + /// build a simple client with a in memory + var client = ClientProvider().chatAppClient(); + app.main(client: client, childToTest: ListChatSubscriptionView()); + await tester.pumpAndSettle(); + var listChats = await client.query(QueryOptions(document: gql(r""" + query { + getChats { + __typename + id + description + name + } + } + """))); + logger.d("Exception: ${listChats.exception}"); + expect(listChats.hasException, isFalse); + logger.i("Chats contains inside the server: ${listChats.data}"); + var chatName = "graphql_flutter test chat ${DateTime.now()}"; + var description = "graphql_flutter integration test in ${DateTime.now()}"; + await client.mutate(MutationOptions(document: gql(r""" + mutation CreateChat($description: String!, $name: String!){ + createChat(description: $description, name: $name) { + __typename + name + } + } + """), variables: { + "name": chatName, + "description": description, + })); + + //find new item in the list + await tester.pump(const Duration(seconds: 10)); + final subscriptionItem = find.text(chatName); + expect(subscriptionItem, findsOneWidget); +} + +/// Configure the test to check if we receive all the element from the graphql +Future configureTestForSimpleQuery(dynamic tester) async { + var logger = Logger(); + + /// build a simple client with a in memory + var client = ClientProvider().chatAppClient(); + app.main(client: client, childToTest: ListChatQueryView()); + await tester.pumpAndSettle(); + await tester.pump(const Duration(seconds: 10)); + var listChats = await client.query(QueryOptions( + document: gql(r""" + query { + getChats { + __typename + id + description + name + } + } + """), + parserFn: (Map json) { + var rawList = List.of(json["getChats"] as List); + return rawList + .map((jsonChat) => Chat.fromJSON(jsonChat as Map)) + .toList(); + })); + logger.d("Exception: ${listChats.exception}"); + expect(listChats.hasException, isFalse); + logger.i("Chats contains inside the server: ${listChats.data}"); + var chats = listChats.parsedData as List; + for (var chat in chats) { + //find new item in the list + final subscriptionItem = find.text(chat.name); + + /// Finds not only one but more than one + expect(subscriptionItem, findsWidgets); + } +} + +class CustomBindings extends AutomatedTestWidgetsFlutterBinding { + @override + bool get overrideHttpClient => false; +} + +void main() { + //CustomBindings(); + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + testWidgets('Run simple query and check if we find all the element displayed', + configureTestForSimpleQuery); + testWidgets('Run simple subscription and wait the result of the update', + configureTestForSimpleSubscriptionUpdate); +} diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/model/chat_app_model.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/model/chat_app_model.dart new file mode 100644 index 000000000..29f988f0b --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/model/chat_app_model.dart @@ -0,0 +1,14 @@ +class Chat { + final int id; + final String name; + final String description; + + const Chat({required this.id, required this.name, required this.description}); + + factory Chat.fromJSON(Map json) { + return Chat( + id: json["id"] as int, + name: json["name"].toString(), + description: json["description"].toString()); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/widget/MockAppView.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/MockAppView.dart new file mode 100644 index 000000000..120ce52a3 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/MockAppView.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +void main({GraphQLClient? client, Widget? childToTest}) => runApp( + MockAppView(client: ValueNotifier(client!), childToTest: childToTest!)); + +class MockAppView extends StatelessWidget { + final ValueNotifier client; + final Widget childToTest; + + MockAppView({required this.client, required this.childToTest}); + + @override + Widget build(BuildContext context) { + return GraphQLProvider( + client: client, + child: MaterialApp( + title: 'Mock App', + home: childToTest, + ), + ); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_query.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_query.dart new file mode 100644 index 000000000..e7c89b291 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_query.dart @@ -0,0 +1,57 @@ +/// ListView flutter Widget implementation to display all the information +/// of the chats that are created by by the client chat app. +/// +/// author: https://github.com/vincenzopalazzo +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:logger/logger.dart'; + +import '../model/chat_app_model.dart'; + +class ListChatQueryView extends StatelessWidget { + /// N.B: Please to not use this approach in a dev environment but + /// consider to use code generator or put the query content somewhere else. + String query = r""" + query { + getChats { + __typename + id + description + name + } + } + """; + Logger _logger = Logger(); + List _chats = []; + + @override + Widget build(BuildContext context) { + return Query( + options: QueryOptions>( + fetchPolicy: FetchPolicy.networkOnly, + parserFn: (Map json) { + var rawList = List.of(json["getChats"] as List); + return rawList + .map((jsonChat) => + Chat.fromJSON(Map.from(jsonChat as Map))) + .toList(); + }, + document: gql(query)), + builder: (QueryResult result, + {VoidCallback? refetch, FetchMore? fetchMore}) { + if (result.hasException) { + _logger.e(result.exception); + throw Exception(result.exception); + } + if (result.isLoading) { + _logger.i("Still loading"); + return const Text("Loading chats"); + } + _logger.d(result.data ?? "Data is undefined"); + _chats = result.parsedData as List; + return ListView( + children: _chats.map((chatData) => Text(chatData.name)).toList(), + ); + }); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_subscription.dart b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_subscription.dart new file mode 100644 index 000000000..da0556b43 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/integration_test/widget/list_view_subscription.dart @@ -0,0 +1,56 @@ +/// ListView flutter Widget implementation to display all the information +/// of the chats that are created by by the client chat app. +/// +/// author: https://github.com/vincenzopalazzo +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:logger/logger.dart'; + +import '../model/chat_app_model.dart'; + +class ListChatSubscriptionView extends StatelessWidget { + /// N.B: Please to not use this approach in a dev environment but + /// consider to use code generator or put the query content somewhere else. + String query = r""" + subscription { + chatCreated { + id + name + description + } + } + """; + Logger _logger = Logger(); + List _chats = []; + + @override + Widget build(BuildContext context) { + return Subscription( + options: SubscriptionOptions( + parserFn: (Map json) { + return Chat.fromJSON(json["chatCreated"] as Map); + }, + document: gql(query), + ), + builder: (result) { + if (result.hasException) { + _logger.e(result.exception); + return Text(result.exception.toString()); + } + + if (result.isLoading) { + return const Center( + child: CircularProgressIndicator(), + ); + } + // ResultAccumulator is a provided helper widget for collating subscription results. + _logger.d(result.data ?? "Data is undefined"); + var chat = result.parsedData as Chat; + return ResultAccumulator.appendUniqueEntries( + latest: _chats, + builder: (context, {results}) => + ListView(children: [Text(chat.name)]), + ); + }); + } +} diff --git a/packages/graphql_flutter/example/ios/.gitignore b/packages/graphql_flutter/example/graphql_chat/ios/.gitignore similarity index 100% rename from packages/graphql_flutter/example/ios/.gitignore rename to packages/graphql_flutter/example/graphql_chat/ios/.gitignore diff --git a/packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/graphql_flutter/example/graphql_chat/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/graphql_flutter/example/graphql_chat/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Debug.xcconfig b/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Release.xcconfig b/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.pbxproj similarity index 99% rename from packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.pbxproj index 9e093b833..6d647f619 100644 --- a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.pbxproj @@ -294,7 +294,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; + PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlChat; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -422,7 +422,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; + PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlChat; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -444,7 +444,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; + PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlChat; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/examples/starwars/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/starwars/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/graphql_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/graphql_flutter/example/graphql_chat/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/graphql_flutter/example/ios/Runner/AppDelegate.swift b/packages/graphql_flutter/example/graphql_chat/ios/Runner/AppDelegate.swift similarity index 100% rename from packages/graphql_flutter/example/ios/Runner/AppDelegate.swift rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/AppDelegate.swift diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from examples/starwars/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/examples/starwars/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from examples/starwars/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/examples/starwars/ios/Runner/Base.lproj/Main.storyboard b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from examples/starwars/ios/Runner/Base.lproj/Main.storyboard rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/graphql_flutter/example/ios/Runner/Info.plist b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Info.plist similarity index 92% rename from packages/graphql_flutter/example/ios/Runner/Info.plist rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Info.plist index a2a66afa5..d28c12c71 100644 --- a/packages/graphql_flutter/example/ios/Runner/Info.plist +++ b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Demo Migaration + Graphql Chat CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - demo_migaration + graphql_chat CFBundlePackageType APPL CFBundleShortVersionString @@ -42,6 +42,8 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone diff --git a/packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h b/packages/graphql_flutter/example/graphql_chat/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h rename to packages/graphql_flutter/example/graphql_chat/ios/Runner/Runner-Bridging-Header.h diff --git a/packages/graphql_flutter/example/graphql_chat/lib/api/query.dart b/packages/graphql_flutter/example/graphql_chat/lib/api/query.dart new file mode 100644 index 000000000..78f851bad --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/lib/api/query.dart @@ -0,0 +1,39 @@ +class Queries { + static String getGetQuery() { + return """ + query { + getChats { + __typename + id + description + name + } + } + """; + } + + static String createChatMutation( + {required String name, required String description}) { + return """ + mutation { + createChat(name: $name, description: $description) { + id + name + description + } + } + """; + } + + static String subscribeToNewChat() { + return """ + subscription { + chatCreated { + id + name + description + } + } + """; + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/lib/main.dart b/packages/graphql_flutter/example/graphql_chat/lib/main.dart new file mode 100644 index 000000000..b99b732bd --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/lib/main.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_chat/view/home_view.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:trash_themes/themes.dart'; + +Future main() async { + // We're using HiveStore for persistence, + // so we need to initialize Hive. + await initHiveForFlutter(); + final HttpLink httpLink = HttpLink( + defaultHeaders: { + "Accept": "application/json", + "Access-Control_Allow_Origin": "*", + }, + 'https://api.chat.graphql-flutter.dev/graphql', + ); + var wsLink = WebSocketLink( + 'ws://api.chat.graphql-flutter.dev/graphql', + config: const SocketClientConfig( + inactivityTimeout: Duration(seconds: 40), + ), + subProtocol: SocketSubProtocol.graphqlWs, + ); + final Link link = httpLink.split( + (request) => request.isSubscription, + wsLink, + httpLink, + ); + ValueNotifier client = ValueNotifier( + GraphQLClient( + link: link, + // The default store is the InMemoryStore, which does NOT persist to disk + cache: GraphQLCache(store: HiveStore()), + ), + ); + runApp(ChatApp(client: client)); +} + +class ChatApp extends StatelessWidget { + final ValueNotifier client; + + const ChatApp({Key? key, required this.client}) : super(key: key); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return GraphQLProvider( + client: client, + child: MaterialApp( + title: 'GraphQL flutter', + theme: DraculaTheme().makeDarkTheme(context: context), + home: const HomeView(), + ), + ); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/lib/model/chat.dart b/packages/graphql_flutter/example/graphql_chat/lib/model/chat.dart new file mode 100644 index 000000000..d693bf72a --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/lib/model/chat.dart @@ -0,0 +1,12 @@ +class Chat { + final int id; + final String name; + final String description; + + const Chat({required this.id, required this.name, required this.description}); + + factory Chat.fromJSON(Map json) { + return Chat( + id: json["id"], name: json["name"], description: json["description"]); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/lib/view/home/home_body.dart b/packages/graphql_flutter/example/graphql_chat/lib/view/home/home_body.dart new file mode 100644 index 000000000..db7437b23 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/lib/view/home/home_body.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_chat/api/query.dart'; +import 'package:graphql_chat/model/chat.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:logger/logger.dart'; + +class HomeViewBody extends StatelessWidget { + final Logger _logger = Logger(); + List _chats = []; + + HomeViewBody({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const SizedBox(width: 20, height: 90), + Expanded(child: _buildBodyView(context: context)) + ], + ); + } + + Widget _buildScrollView({required BuildContext context}) { + return Query( + options: QueryOptions>( + fetchPolicy: FetchPolicy.networkOnly, + parserFn: (Map json) { + var rawList = List.of(json["getChats"]); + return rawList + .map((jsonChat) => Chat.fromJSON(jsonChat)) + .toList(); + }, + document: gql(Queries.getGetQuery())), + builder: (QueryResult result, + {VoidCallback? refetch, FetchMore? fetchMore}) { + if (result.hasException) { + _logger.e(result.exception); + throw Exception(result.exception); + } + if (result.isLoading) { + _logger.i("Still loading"); + return const Text("Loading chats"); + } + _logger.d(result.data ?? "Data is undefined"); + _chats = result.parsedData as List; + return ListView( + children: + _chats.map((chatData) => Text(chatData.description)).toList(), + ); + }); + } + + Widget _buildUpdateScrollView({required BuildContext context}) { + return Subscription( + options: SubscriptionOptions( + parserFn: (Map json) { + return Chat.fromJSON(json["chatCreated"]); + }, + document: gql(Queries.subscribeToNewChat()), + ), + builder: (result) { + if (result.hasException) { + _logger.e(result.exception); + return Text(result.exception.toString()); + } + + if (result.isLoading) { + return const Center( + child: CircularProgressIndicator(), + ); + } + // ResultAccumulator is a provided helper widget for collating subscription results. + _logger.d(result.data ?? "Data is undefined"); + var chat = result.parsedData as Chat; + return ResultAccumulator.appendUniqueEntries( + latest: _chats, + builder: (context, {results}) => + ListView(children: [Text(chat.name)]), + ); + }); + } + + /// Build the scroll view with all the information + Widget _buildBodyView({required BuildContext context}) { + return Column( + children: [ + Expanded(child: _buildScrollView(context: context)), + Expanded(child: _buildUpdateScrollView(context: context)), + ], + ); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/lib/view/home_view.dart b/packages/graphql_flutter/example/graphql_chat/lib/view/home_view.dart new file mode 100644 index 000000000..e8dbf6fba --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/lib/view/home_view.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_chat/view/home/home_body.dart'; +import 'package:material_floating_search_bar/material_floating_search_bar.dart'; + +class HomeView extends StatefulWidget { + const HomeView({Key? key}) : super(key: key); + + @override + State createState() => _HomeViewState(); +} + +class _HomeViewState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Theme.of(context).backgroundColor, + appBar: AppBar( + title: const Text("GraphQL Chats"), + centerTitle: true, + primary: true, + elevation: 2, + leading: Container(), + ), + body: Stack( + fit: StackFit.expand, + children: [ + HomeViewBody(), + _buildFloatingSearchBar(context), + ], + )); + } + + /// Build the search bar. + Widget _buildFloatingSearchBar(BuildContext context) { + final isPortrait = + MediaQuery.of(context).orientation == Orientation.portrait; + + return FloatingSearchBar( + backgroundColor: Theme.of(context).cardColor, + hint: 'Search with node id', + scrollPadding: const EdgeInsets.only(top: 16, bottom: 56), + transitionDuration: const Duration(milliseconds: 800), + transitionCurve: Curves.easeInOut, + physics: const BouncingScrollPhysics(), + axisAlignment: isPortrait ? 0.0 : 0.0, + openAxisAlignment: 0.0, + width: isPortrait ? 600 : 500, + debounceDelay: const Duration(milliseconds: 500), + onQueryChanged: (query) { + // Call your model, bloc, controller here. + }, + // Specify a custom transition to be used for + // animating between opened and closed stated. + transition: CircularFloatingSearchBarTransition(), + actions: [ + FloatingSearchBarAction( + showIfOpened: false, + child: IconButton( + icon: const Icon(Icons.close), + onPressed: () {}, + ), + ), + FloatingSearchBarAction.searchToClear( + showIfClosed: false, + ), + ], + builder: (context, transition) { + return ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Material( + color: Colors.white, + elevation: 4.0, + child: Column( + mainAxisSize: MainAxisSize.min, + children: Colors.accents.map((color) { + return Container(height: 112, color: color); + }).toList(), + ), + ), + ); + }, + ); + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/linux/.gitignore b/packages/graphql_flutter/example/graphql_chat/linux/.gitignore new file mode 100644 index 000000000..d3896c984 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/graphql_flutter/example/graphql_chat/linux/CMakeLists.txt b/packages/graphql_flutter/example/graphql_chat/linux/CMakeLists.txt new file mode 100644 index 000000000..977dd5506 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "graphql_chat") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.graphql_chat") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/graphql_flutter/example/graphql_chat/linux/flutter/CMakeLists.txt b/packages/graphql_flutter/example/graphql_chat/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000..d5bd01648 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.cc b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..e71a16d23 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.h b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugins.cmake b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..2e1de87a7 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/graphql_flutter/example/graphql_chat/linux/main.cc b/packages/graphql_flutter/example/graphql_chat/linux/main.cc new file mode 100644 index 000000000..e7c5c5437 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/graphql_flutter/example/graphql_chat/linux/my_application.cc b/packages/graphql_flutter/example/graphql_chat/linux/my_application.cc new file mode 100644 index 000000000..33b8b6372 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "graphql_chat"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "graphql_chat"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/packages/graphql_flutter/example/graphql_chat/linux/my_application.h b/packages/graphql_flutter/example/graphql_chat/linux/my_application.h new file mode 100644 index 000000000..72271d5e4 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/.gitignore b/packages/graphql_flutter/example/graphql_chat/macos/.gitignore new file mode 100644 index 000000000..746adbb6b --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Debug.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000..c2efd0b60 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Release.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000..c2efd0b60 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..79818f90b --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import connectivity_plus_macos +import path_provider_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) +} diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.pbxproj b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..543928be9 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* graphql_chat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "graphql_chat.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* graphql_chat.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* graphql_chat.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/starwars/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 82% rename from examples/starwars/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 786d6aad5..d00920bb1 100644 --- a/examples/starwars/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -26,27 +26,23 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 71% rename from packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/contents.xcworkspacedata index 919434a62..1d526a16e 100644 --- a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "group:Runner.xcodeproj"> diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/AppDelegate.swift b/packages/graphql_flutter/example/graphql_chat/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000..d53ef6437 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..a2ec33f19 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 000000000..3c4935a7c Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 000000000..ed4cc1642 Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 000000000..483be6138 Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 000000000..bcbf36df2 Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 000000000..9c0a65286 Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 000000000..e71a72613 Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 000000000..8a31fe2dd Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Base.lproj/MainMenu.xib b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 000000000..80e867a4e --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/AppInfo.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000..a0378da81 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = graphql_chat + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlChat + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Debug.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000..36b0fd946 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Release.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000..dff4f4956 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Warnings.xcconfig b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000..42bcbf478 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/DebugProfile.entitlements b/packages/graphql_flutter/example/graphql_chat/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000..dddb8a30c --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Info.plist b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Info.plist new file mode 100644 index 000000000..4789daa6a --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/MainFlutterWindow.swift b/packages/graphql_flutter/example/graphql_chat/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000..2722837ec --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/packages/graphql_flutter/example/graphql_chat/macos/Runner/Release.entitlements b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Release.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/packages/graphql_flutter/example/graphql_chat/pubspec.yaml b/packages/graphql_flutter/example/graphql_chat/pubspec.yaml new file mode 100644 index 000000000..4a5b09c85 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/pubspec.yaml @@ -0,0 +1,62 @@ +name: graphql_chat +description: GraphQL flutter community chat app, an example of usage of the library + +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +environment: + sdk: ">=2.17.5 <3.0.0" + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + trash_themes: ^0.0.1 + graphql_flutter: + path: ../../ + material_floating_search_bar: ^0.3.7 + logger: ^1.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + flutter_lints: ^2.0.0 + +dependency_overrides: + graphql_flutter: + path: ../../ + +flutter: + uses-material-design: true + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/graphql_flutter/example/graphql_chat/test/widget_test.dart b/packages/graphql_flutter/example/graphql_chat/test/widget_test.dart new file mode 100644 index 000000000..0db063e31 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/test/widget_test.dart @@ -0,0 +1,12 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); +} diff --git a/packages/graphql_flutter/example/graphql_chat/test_driver/integration_test.dart b/packages/graphql_flutter/example/graphql_chat/test_driver/integration_test.dart new file mode 100644 index 000000000..f077a14d6 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/test_driver/integration_test.dart @@ -0,0 +1,4 @@ +// From flutter docs: https://docs.flutter.dev/cookbook/testing/integration/introduction#5b-web +import 'package:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); diff --git a/examples/starwars/web/favicon.png b/packages/graphql_flutter/example/graphql_chat/web/favicon.png similarity index 100% rename from examples/starwars/web/favicon.png rename to packages/graphql_flutter/example/graphql_chat/web/favicon.png diff --git a/examples/starwars/web/icons/Icon-192.png b/packages/graphql_flutter/example/graphql_chat/web/icons/Icon-192.png similarity index 100% rename from examples/starwars/web/icons/Icon-192.png rename to packages/graphql_flutter/example/graphql_chat/web/icons/Icon-192.png diff --git a/examples/starwars/web/icons/Icon-512.png b/packages/graphql_flutter/example/graphql_chat/web/icons/Icon-512.png similarity index 100% rename from examples/starwars/web/icons/Icon-512.png rename to packages/graphql_flutter/example/graphql_chat/web/icons/Icon-512.png diff --git a/packages/graphql_flutter/example/web/icons/Icon-maskable-192.png b/packages/graphql_flutter/example/graphql_chat/web/icons/Icon-maskable-192.png similarity index 100% rename from packages/graphql_flutter/example/web/icons/Icon-maskable-192.png rename to packages/graphql_flutter/example/graphql_chat/web/icons/Icon-maskable-192.png diff --git a/packages/graphql_flutter/example/web/icons/Icon-maskable-512.png b/packages/graphql_flutter/example/graphql_chat/web/icons/Icon-maskable-512.png similarity index 100% rename from packages/graphql_flutter/example/web/icons/Icon-maskable-512.png rename to packages/graphql_flutter/example/graphql_chat/web/icons/Icon-maskable-512.png diff --git a/packages/graphql_flutter/example/graphql_chat/web/index.html b/packages/graphql_flutter/example/graphql_chat/web/index.html new file mode 100644 index 000000000..cb82597d2 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/web/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + graphql_chat + + + + + + + + + + diff --git a/packages/graphql_flutter/example/web/manifest.json b/packages/graphql_flutter/example/graphql_chat/web/manifest.json similarity index 92% rename from packages/graphql_flutter/example/web/manifest.json rename to packages/graphql_flutter/example/graphql_chat/web/manifest.json index fa0b5a9f2..c8b987662 100644 --- a/packages/graphql_flutter/example/web/manifest.json +++ b/packages/graphql_flutter/example/graphql_chat/web/manifest.json @@ -1,6 +1,6 @@ { - "name": "demo_migaration", - "short_name": "demo_migaration", + "name": "graphql_chat", + "short_name": "graphql_chat", "start_url": ".", "display": "standalone", "background_color": "#0175C2", diff --git a/packages/graphql_flutter/example/graphql_chat/windows/.gitignore b/packages/graphql_flutter/example/graphql_chat/windows/.gitignore new file mode 100644 index 000000000..d492d0d98 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/packages/graphql_flutter/example/graphql_chat/windows/CMakeLists.txt b/packages/graphql_flutter/example/graphql_chat/windows/CMakeLists.txt new file mode 100644 index 000000000..7937f418c --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(graphql_chat LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "graphql_chat") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/packages/graphql_flutter/example/graphql_chat/windows/flutter/CMakeLists.txt b/packages/graphql_flutter/example/graphql_chat/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000..930d2071a --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.cc b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..8083d749b --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); +} diff --git a/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.h b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..dc139d85a --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugins.cmake b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000..8cf5d4267 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + connectivity_plus_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/CMakeLists.txt b/packages/graphql_flutter/example/graphql_chat/windows/runner/CMakeLists.txt new file mode 100644 index 000000000..b9e550fba --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/Runner.rc b/packages/graphql_flutter/example/graphql_chat/windows/runner/Runner.rc new file mode 100644 index 000000000..c734e5bb9 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "graphql_chat" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "graphql_chat" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "graphql_chat.exe" "\0" + VALUE "ProductName", "graphql_chat" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.cpp b/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.cpp new file mode 100644 index 000000000..b43b9095e --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.h b/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.h new file mode 100644 index 000000000..6da0652f0 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/main.cpp b/packages/graphql_flutter/example/graphql_chat/windows/runner/main.cpp new file mode 100644 index 000000000..af62d7fb7 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"graphql_chat", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/resource.h b/packages/graphql_flutter/example/graphql_chat/windows/runner/resource.h new file mode 100644 index 000000000..66a65d1e4 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/resources/app_icon.ico b/packages/graphql_flutter/example/graphql_chat/windows/runner/resources/app_icon.ico new file mode 100644 index 000000000..c04e20caf Binary files /dev/null and b/packages/graphql_flutter/example/graphql_chat/windows/runner/resources/app_icon.ico differ diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/runner.exe.manifest b/packages/graphql_flutter/example/graphql_chat/windows/runner/runner.exe.manifest new file mode 100644 index 000000000..c977c4a42 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.cpp b/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.cpp new file mode 100644 index 000000000..f5bf9fa0f --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.h b/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.h new file mode 100644 index 000000000..3879d5475 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.cpp b/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.cpp new file mode 100644 index 000000000..c10f08dc7 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.h b/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.h new file mode 100644 index 000000000..17ba43112 --- /dev/null +++ b/packages/graphql_flutter/example/graphql_chat/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6f3..000000000 --- a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bfe2..000000000 --- a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Podfile b/packages/graphql_flutter/example/ios/Podfile deleted file mode 100644 index 1e8c3c90a..000000000 --- a/packages/graphql_flutter/example/ios/Podfile +++ /dev/null @@ -1,41 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2..000000000 --- a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf030..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd967..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0b..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde12118..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7e..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc2306c..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd967..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41e1..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f5853..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 0bedcf2fd..000000000 --- a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19eaca..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eaca..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eaca..000000000 Binary files a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b7..000000000 --- a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -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. \ No newline at end of file diff --git a/packages/graphql_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/graphql_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c..000000000 --- a/packages/graphql_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/graphql_flutter/example/ios/Runner/Base.lproj/Main.storyboard b/packages/graphql_flutter/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516f..000000000 --- a/packages/graphql_flutter/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/graphql_flutter/example/lib/fetchmore/main.dart b/packages/graphql_flutter/example/lib/fetchmore/main.dart deleted file mode 100644 index ea9863fb9..000000000 --- a/packages/graphql_flutter/example/lib/fetchmore/main.dart +++ /dev/null @@ -1,175 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; - -import '../graphql_operation/queries/readRepositories.dart' as queries; - -// to run the example, replace with your GitHub token in ../local.dart -import '../local.dart'; - -class FetchMoreWidgetScreen extends StatelessWidget { - const FetchMoreWidgetScreen() : super(); - - @override - Widget build(BuildContext context) { - final httpLink = - HttpLink('https://api.github.com/graphql', defaultHeaders: { - 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - }); - - final client = ValueNotifier( - GraphQLClient( - cache: GraphQLCache(), - link: httpLink, - ), - ); - - return GraphQLProvider( - client: client, - child: const CacheProvider( - child: MyHomePage(title: 'GraphQL Pagination'), - ), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({ - Key? key, - this.title, - }) : super(key: key); - - final String? title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - String _searchQuery = 'flutter'; - int nRepositories = 10; - - void changeQuery(String query) { - setState(() { - print(query); - _searchQuery = query; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title!), - ), - body: Container( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - TextField( - decoration: const InputDecoration( - labelText: 'Search Query', - ), - keyboardType: TextInputType.text, - onSubmitted: changeQuery, - ), - Query( - options: QueryOptions( - document: gql(queries.searchRepositories), - variables: { - 'nRepositories': nRepositories, - 'query': _searchQuery, - // set cursor to null so as to start at the beginning - 'cursor': null - }, - //pollInterval: 10, - ), - builder: (QueryResult result, {refetch, FetchMore? fetchMore}) { - if (result.hasException) { - return Text(result.exception.toString()); - } - - if (result.isLoading && result.data == null) { - return const Center( - child: CircularProgressIndicator(), - ); - } - - if (result.data == null && !result.hasException) { - return const Text( - 'Both data and errors are null, this is a known bug after refactoring, you might have forgotten to set Github token'); - } - - // result.data can be either a [List] or a [Map] - final repositories = - (result.data!['search']['nodes'] as List); - - final Map pageInfo = result.data!['search']['pageInfo']; - final String? fetchMoreCursor = pageInfo['endCursor']; - final opts = FetchMoreOptions( - variables: {'cursor': fetchMoreCursor}, - updateQuery: (previousResultData, fetchMoreResultData) { - // this is where you combine your previous data and response - // in this case, we want to display previous repos plus next repos - // so, we combine data in both into a single list of repos - final repos = [ - ...previousResultData!['search']['nodes'] - as List, - ...fetchMoreResultData!['search']['nodes'] - as List - ]; - - // to avoid alot of work, lets just update the list of repos in returned - // data with new data, this also ensure we have the endCursor already set - // correctlty - fetchMoreResultData['search']['nodes'] = repos; - - return fetchMoreResultData; - }, - ); - - return Expanded( - child: ListView( - children: [ - for (var repository in repositories) - ListTile( - leading: (repository['viewerHasStarred'] as bool) - ? const Icon( - Icons.star, - color: Colors.amber, - ) - : const Icon(Icons.star_border), - title: Text(repository['name'] as String), - ), - if (result.isLoading) - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(), - ], - ), - Text('note: this example has no mutations', - style: Theme.of(context).textTheme.caption), - ElevatedButton( - onPressed: () { - fetchMore!(opts); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Load More'), - ], - ), - ) - ], - ), - ); - }, - ), - ], - ), - ), - ); - } -} diff --git a/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart b/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart deleted file mode 100644 index 3c36ef502..000000000 --- a/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,16 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars - -import 'package:connectivity_plus_web/connectivity_plus_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - ConnectivityPlusPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart b/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart deleted file mode 100644 index 395e3bcf6..000000000 --- a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart +++ /dev/null @@ -1,106 +0,0 @@ -import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:rxdart/rxdart.dart'; - -import '../graphql_operation/mutations/mutations.dart' as mutations; -import '../graphql_operation/queries/readRepositories.dart' as queries; - -// to run the example, replace with your GitHub token in ../local.dart -import '../local.dart'; - -class Repo { - const Repo({this.id, this.name, this.viewerHasStarred}); - final String? id; - final String? name; - final bool? viewerHasStarred; -} - -class Bloc { - Bloc() { - _queryRepo(); - _updateNumberOfRepo.listen((int n) async => _queryRepo(nRepositories: n)); - _toggleStarSubject.listen((Repo t) async { - _toggleStarLoadingSubject.add(t.id); - // @todo handle error - final _ = await _mutateToggleStar(t); - - _repoSubject.add(_repoSubject.value!.map((Repo e) { - if (e.id != t.id) { - return e; - } - return Repo( - id: t.id, name: t.name, viewerHasStarred: !t.viewerHasStarred!); - }).toList()); - _toggleStarLoadingSubject.add(null); - }); - } - - final BehaviorSubject?> _repoSubject = - BehaviorSubject?>(); - Stream?> get repoStream => _repoSubject.stream; - - final ReplaySubject _toggleStarSubject = ReplaySubject(); - Sink get toggleStarSink => _toggleStarSubject; - - /// The repo currently loading, if any - final BehaviorSubject _toggleStarLoadingSubject = - BehaviorSubject(); - - Stream get toggleStarLoadingStream => - _toggleStarLoadingSubject.stream; - - final BehaviorSubject _updateNumberOfRepo = BehaviorSubject(); - - Sink get updateNumberOfRepoSink => _updateNumberOfRepo; - - final GraphQLClient _client = GraphQLClient( - cache: GraphQLCache(), - link: HttpLink('https://api.github.com/graphql', defaultHeaders: { - 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - }), - ); - - Future _mutateToggleStar(Repo repo) async { - final _options = MutationOptions( - document: gql( - repo.viewerHasStarred! ? mutations.removeStar : mutations.addStar), - variables: { - 'starrableId': repo.id, - }, - ); - - final result = await _client.mutate(_options); - return result; - } - - Future _queryRepo({int nRepositories = 50}) async { - // null is loading - _repoSubject.add(null); - final _options = WatchQueryOptions( - document: gql(queries.readRepositories), - variables: { - 'nRepositories': nRepositories, - }, - pollInterval: Duration(seconds: 4), - fetchResults: true, - ); - - final result = await _client.query(_options); - - if (result.hasException) { - _repoSubject.addError(result.exception!); - return; - } - - // result.data can be either a [List] or a [Map] - final repositories = - result.data!['viewer']['repositories']['nodes'] as List; - - _repoSubject.add(repositories - .map((dynamic e) => Repo( - id: e['id'] as String?, - name: e['name'] as String?, - viewerHasStarred: e['viewerHasStarred'] as bool?, - )) - .toList()); - } -} diff --git a/packages/graphql_flutter/example/lib/graphql_bloc/main.dart b/packages/graphql_flutter/example/lib/graphql_bloc/main.dart deleted file mode 100644 index c6e3eaada..000000000 --- a/packages/graphql_flutter/example/lib/graphql_bloc/main.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'bloc.dart' show Bloc, Repo; - -class GraphQLBlocPatternScreen extends StatefulWidget { - GraphQLBlocPatternScreen({ - Key? key, - this.title = 'GraphQL Widget', - }) : bloc = Bloc(), - super(key: key); - - final String title; - final Bloc bloc; - - @override - _MyHomePageState createState() => _MyHomePageState(bloc); -} - -class _MyHomePageState extends State { - _MyHomePageState(this.bloc); - final Bloc bloc; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Container( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - TextField( - decoration: const InputDecoration( - labelText: 'Number of repositories (default 50)', - ), - keyboardType: TextInputType.number, - onChanged: (String n) => - bloc.updateNumberOfRepoSink.add(int.parse(n)), - ), - StreamBuilder?>( - stream: bloc.repoStream, - builder: - (BuildContext context, AsyncSnapshot?> snapshot) { - if (snapshot.hasError) { - return Text('\nErrors: ${snapshot.error.toString()}'); - } - if (snapshot.data == null) { - return const Center( - child: CircularProgressIndicator(), - ); - } - - final repositories = snapshot.data!; - - return Expanded( - child: ListView.builder( - itemCount: repositories.length, - itemBuilder: (BuildContext context, int index) => - StarrableRepository( - repository: repositories[index], bloc: bloc), - ), - ); - }, - ), - ], - ), - ), - ); - } -} - -class StarrableRepository extends StatelessWidget { - const StarrableRepository({ - Key? key, - required this.repository, - required this.bloc, - }) : super(key: key); - - final Bloc bloc; - final Repo repository; - - Map? extractRepositoryData(Map data) { - final action = data['action'] as Map?; - - if (action == null) { - return null; - } - - return action['starrable'] as Map?; - } - - bool? get viewerHasStarred => repository.viewerHasStarred; - - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: bloc.toggleStarLoadingStream, - initialData: null, - builder: (BuildContext context, AsyncSnapshot result) { - final loading = repository.id == result.data; - return ListTile( - leading: viewerHasStarred! - ? const Icon( - Icons.star, - color: Colors.amber, - ) - : const Icon(Icons.star_border), - trailing: loading ? const CircularProgressIndicator() : null, - title: Text(repository.name!), - onTap: () { - bloc.toggleStarSink.add(repository); - }, - ); - }, - ); - } -} diff --git a/packages/graphql_flutter/example/lib/graphql_operation/mutations/addStar.dart b/packages/graphql_flutter/example/lib/graphql_operation/mutations/addStar.dart deleted file mode 100644 index e44616e05..000000000 --- a/packages/graphql_flutter/example/lib/graphql_operation/mutations/addStar.dart +++ /dev/null @@ -1,11 +0,0 @@ -const String addStar = r''' - mutation AddStar($starrableId: ID!) { - action: addStar(input: {starrableId: $starrableId}) { - starrable { - __typename - id - viewerHasStarred - } - } - } -'''; diff --git a/packages/graphql_flutter/example/lib/graphql_operation/mutations/mutations.dart b/packages/graphql_flutter/example/lib/graphql_operation/mutations/mutations.dart deleted file mode 100644 index 19ec2b51e..000000000 --- a/packages/graphql_flutter/example/lib/graphql_operation/mutations/mutations.dart +++ /dev/null @@ -1,2 +0,0 @@ -export './addStar.dart'; -export './removeStar.dart'; diff --git a/packages/graphql_flutter/example/lib/graphql_operation/mutations/removeStar.dart b/packages/graphql_flutter/example/lib/graphql_operation/mutations/removeStar.dart deleted file mode 100644 index 9d08b6594..000000000 --- a/packages/graphql_flutter/example/lib/graphql_operation/mutations/removeStar.dart +++ /dev/null @@ -1,11 +0,0 @@ -const String removeStar = r''' - mutation RemoveStar($starrableId: ID!) { - action: removeStar(input: {starrableId: $starrableId}) { - starrable { - __typename - id - viewerHasStarred - } - } - } -'''; diff --git a/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart b/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart deleted file mode 100644 index 225384e58..000000000 --- a/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart +++ /dev/null @@ -1,50 +0,0 @@ -const String readRepositories = r''' - query ReadRepositories($nRepositories: Int!) { - viewer { - repositories(last: $nRepositories) { - nodes { - __typename - id - name - viewerHasStarred - } - } - } - } -'''; - -const String searchRepositories = r''' - query SearchRepositories($nRepositories: Int!, $query: String!, $cursor: String) { - search(last: $nRepositories, query: $query, type: REPOSITORY, after: $cursor) { - nodes { - __typename - ... on Repository { - name - shortDescriptionHTML - viewerHasStarred - stargazers { - totalCount - } - forks { - totalCount - } - updatedAt - } - } - pageInfo { - endCursor - hasNextPage - } - } - } -'''; - -const String testSubscription = r''' - subscription test { - deviceChanged(id: 2) { - __typename - id - name - } - } -'''; diff --git a/packages/graphql_flutter/example/lib/graphql_widget/main.dart b/packages/graphql_flutter/example/lib/graphql_widget/main.dart deleted file mode 100644 index 70a42e154..000000000 --- a/packages/graphql_flutter/example/lib/graphql_widget/main.dart +++ /dev/null @@ -1,286 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; - -import '../graphql_operation/mutations/mutations.dart' as mutations; -import '../graphql_operation/queries/readRepositories.dart' as queries; -import '../helpers.dart' show withGenericHandling; - -// to run the example, replace with your GitHub token in ../local.dart -import '../local.dart'; - -class GraphQLWidgetScreen extends StatelessWidget { - const GraphQLWidgetScreen() : super(); - - @override - Widget build(BuildContext context) { - var httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { - 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - }); - - final client = ValueNotifier( - GraphQLClient( - cache: GraphQLCache(), - link: httpLink, - ), - ); - - return GraphQLProvider( - client: client, - child: const CacheProvider( - child: MyHomePage(title: 'GraphQL Widget'), - ), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({ - Key? key, - this.title, - }) : super(key: key); - - final String? title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int nRepositories = 50; - - void changeQuery(String number) { - setState(() { - nRepositories = int.parse(number); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title!), - ), - body: Container( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - TextField( - decoration: const InputDecoration( - labelText: 'Number of repositories (default 50)', - ), - keyboardType: TextInputType.number, - onSubmitted: changeQuery, - ), - Query( - options: QueryOptions( - document: gql(queries.readRepositories), - variables: { - 'nRepositories': nRepositories, - }, - //pollInterval: 10, - ), - builder: withGenericHandling( - (QueryResult result, {refetch, fetchMore}) { - if (result.data == null && !result.hasException) { - return const Text( - 'Loading has completed, but both data and errors are null. ' - 'This should never be the case – please open an issue', - ); - } - - // result.data can be either a [List] or a [Map] - final repositories = (result.data!['viewer']['repositories'] - ['nodes'] as List); - - return Expanded( - child: ListView.builder( - itemCount: repositories.length, - itemBuilder: (BuildContext context, int index) { - return StarrableRepository( - repository: repositories[index], - optimistic: result.source == - QueryResultSource.optimisticResult, - ); - }, - ), - ); - }, - ), - ), - ], - ), - ), - ); - } -} - -class StarrableRepository extends StatelessWidget { - const StarrableRepository({ - Key? key, - required this.repository, - required this.optimistic, - }) : super(key: key); - - final Map repository; - final bool optimistic; - - /// Extract the repository data for updating the fragment - Map? extractRepositoryData(Map data) { - final action = data['action'] as Map?; - if (action == null) { - return null; - } - return action['starrable'] as Map?; - } - - /// Get whether the repository is currently starred, according to the current Query - bool? get starred => repository['viewerHasStarred'] as bool?; - - /// Build an optimisticResult based on whether [viewerIsStarrring] - Map expectedResult(bool viewerIsStarrring) => - { - 'action': { - 'starrable': { - '__typename': 'Repository', - 'id': repository['id'], - 'viewerHasStarred': viewerIsStarrring, - } - } - }; - - OnMutationUpdate get update => (cache, result) { - if (result!.hasException) { - print(result.exception); - } else { - final updated = { - ...repository, - ...extractRepositoryData(result.data!)!, - }; - cache.writeFragment( - Fragment( - document: gql( - ''' - fragment fields on Repository { - id - name - viewerHasStarred - } - ''', - ), - ).asRequest(idFields: { - '__typename': updated['__typename'], - 'id': updated['id'], - }), - data: updated, - ); - } - }; - - @override - Widget build(BuildContext context) { - /// While we could toggle between the addStar and removeStar mutations conditionally, - /// this would discard and rebuild each associated [ObservableQuery]. The side effects would still execute, - /// but we would not have a way to inspect the mutation results, such as with [_debugLatestResults]. - return Mutation( - options: MutationOptions( - document: gql(mutations.addStar), - update: update, - onError: (OperationException? error) => - _simpleAlert(context, error.toString()), - onCompleted: (dynamic resultData) => - _simpleAlert(context, 'Thanks for your star!'), - // 'Sorry you changed your mind!', - ), - builder: (RunMutation _addStar, QueryResult? addResult) { - final addStar = () => _addStar({'starrableId': repository['id']}, - optimisticResult: expectedResult(true)); - return Mutation( - options: MutationOptions( - document: gql(mutations.removeStar), - update: update, - onError: (OperationException? error) => - _simpleAlert(context, error.toString()), - onCompleted: (dynamic resultData) => - _simpleAlert(context, 'Sorry you changed your mind!'), - ), - builder: (RunMutation _removeStar, QueryResult? removeResult) { - final removeStar = () => _removeStar( - {'starrableId': repository['id']}, - optimisticResult: expectedResult(false)); - - final anyLoading = - addResult!.isLoading || removeResult!.isLoading || optimistic; - - return ListTile( - leading: starred! - ? Icon( - Icons.star, - color: Colors.amber, - ) - : Icon(Icons.star_border), - trailing: anyLoading ? CircularProgressIndicator() : null, - title: Text(repository['name'] as String), - - /// uncomment this line to see the actual mutation results - subtitle: _debugLatestResults(addResult, removeResult!), - onTap: anyLoading - ? null - : starred! - ? removeStar - : addStar, - ); - }, - ); - }, - ); - } - - // TODO extract these details into better docs on [Policies] - /// Used for inspecting the mutation results. - /// - /// Can be used to observe the behavior in https://github.com/zino-app/graphql-flutter/issues/774, - /// patched in https://github.com/zino-app/graphql-flutter/pull/795 with the addition of [CacheRereadPolicy]. - /// - /// To behavior, add the following to the `Mutations` above: - /// ```dart - /// fetchPolicy: FetchPolicy.networkOnly, - /// cacheRereadPolicy: CacheRereadPolicy.mergeOptimistic, - /// ``` - /// This will cause the mutation results to be rebroadcast from the cache, - /// merging in the new `Repository.viewerHasStarred` state. - /// This can be desirable when a mutation result is used merely as a follow-up query. - Widget? _debugLatestResults(QueryResult add, QueryResult remove) { - //return null; - var latestResults = ''; - if (add.data != null) { - latestResults += 'addResultRepo: ${extractRepositoryData(add.data!)}; '; - } - if (remove.data != null) { - latestResults += - 'removeResultRepo: ${extractRepositoryData(remove.data!)}; '; - } - if (latestResults.isEmpty) { - return null; - } - return Text(latestResults); - } -} - -void _simpleAlert(BuildContext context, String text) => showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text(text), - actions: [ - SimpleDialogOption( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('DISMISS'), - ) - ], - ); - }, - ); diff --git a/packages/graphql_flutter/example/lib/helpers.dart b/packages/graphql_flutter/example/lib/helpers.dart deleted file mode 100644 index c0c2528eb..000000000 --- a/packages/graphql_flutter/example/lib/helpers.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; - -/// boilerplate `result.loading` and `result.hasException` handling -/// -/// ```dart -/// if (result.loading) { -/// return const Center( -/// child: CircularProgressIndicator(), -/// ); -/// } -/// if (result.hasException) { -/// return Text(result.exception.toString()); -/// } -/// ``` -QueryBuilder withGenericHandling(QueryBuilder builder) { - return (result, {fetchMore, refetch}) { - if (result.hasException) { - return Text(result.exception.toString()); - } - - if (result.isLoading) { - return const Center( - child: CircularProgressIndicator(), - ); - } - - return builder(result, fetchMore: fetchMore, refetch: refetch); - }; -} diff --git a/packages/graphql_flutter/example/lib/local.dart b/packages/graphql_flutter/example/lib/local.dart deleted file mode 100644 index 8e5891184..000000000 --- a/packages/graphql_flutter/example/lib/local.dart +++ /dev/null @@ -1 +0,0 @@ -const String YOUR_PERSONAL_ACCESS_TOKEN = ''; diff --git a/packages/graphql_flutter/example/lib/main.dart b/packages/graphql_flutter/example/lib/main.dart deleted file mode 100644 index 9a27ead63..000000000 --- a/packages/graphql_flutter/example/lib/main.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:trash_themes/themes.dart'; -import './graphql_bloc/main.dart' show GraphQLBlocPatternScreen; -import './graphql_widget/main.dart' show GraphQLWidgetScreen; -import 'fetchmore/main.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'GraphQL Flutter Demo', - theme: DraculaTheme().makeDarkTheme(context: context), - home: Builder( - builder: (BuildContext context) => Scaffold( - appBar: AppBar( - title: const Text('GraphQL Demo App'), - ), - body: Center( - child: Column( - children: [ - Spacer(), - Flexible( - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - GraphQLBlocPatternScreen(), - ), - ); - }, - child: const Text('GraphQL BloC pattern'), - )), - Spacer(), - Flexible( - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - const GraphQLWidgetScreen(), - ), - ); - }, - child: const Text('GraphQL Widget'), - )), - Spacer(), - Flexible( - child: ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - const FetchMoreWidgetScreen(), - ), - ); - }, - child: const Text('Fetchmore (Pagination) Example'), - )), - ], - ), - ), - ), - ), - ); - } -} diff --git a/packages/graphql_flutter/example/pubspec.yaml b/packages/graphql_flutter/example/pubspec.yaml deleted file mode 100644 index e26db97df..000000000 --- a/packages/graphql_flutter/example/pubspec.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: app -description: A new Flutter project. - -publish_to: none - -module: - androidX: true - -dependencies: - flutter: - sdk: flutter - cupertino_icons: ^0.1.3 - graphql_flutter: - path: .. - trash_themes: ^0.0.1 - -dev_dependencies: - pedantic: ^1.8.0+1 - flutter_test: - sdk: flutter - test: ^1.17.12 - -flutter: - uses-material-design: true - -dependency_overrides: - graphql: - path: ../../graphql - -environment: - sdk: '>=2.12.0 <3.0.0' diff --git a/packages/graphql_flutter/example/web/favicon.png b/packages/graphql_flutter/example/web/favicon.png deleted file mode 100644 index 8aaa46ac1..000000000 Binary files a/packages/graphql_flutter/example/web/favicon.png and /dev/null differ diff --git a/packages/graphql_flutter/example/web/icons/Icon-192.png b/packages/graphql_flutter/example/web/icons/Icon-192.png deleted file mode 100644 index b749bfef0..000000000 Binary files a/packages/graphql_flutter/example/web/icons/Icon-192.png and /dev/null differ diff --git a/packages/graphql_flutter/example/web/icons/Icon-512.png b/packages/graphql_flutter/example/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48df..000000000 Binary files a/packages/graphql_flutter/example/web/icons/Icon-512.png and /dev/null differ diff --git a/packages/graphql_flutter/example/web/index.html b/packages/graphql_flutter/example/web/index.html deleted file mode 100644 index 60109c1bc..000000000 --- a/packages/graphql_flutter/example/web/index.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - demo_migaration - - - - - - -