├── supabase ├── seed.sql ├── .gitignore ├── .env.example ├── migrations │ ├── 20231010044029_related_films_function.sql │ └── 20231009120230_films_table.sql ├── functions │ └── get_film_data │ │ └── index.ts └── config.toml ├── flutter ├── ios │ ├── Runner │ │ ├── Runner-Bridging-Header.h │ │ ├── Assets.xcassets │ │ │ ├── LaunchImage.imageset │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ ├── README.md │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ │ └── Contents.json │ │ ├── AppDelegate.swift │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Flutter │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── AppFrameworkInfo.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ └── project.pbxproj │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── RunnerTests │ │ └── RunnerTests.swift │ ├── .gitignore │ ├── Podfile │ └── Podfile.lock ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ ├── Icon-512.png │ │ ├── Icon-maskable-192.png │ │ └── Icon-maskable-512.png │ ├── manifest.json │ └── index.html ├── android │ ├── gradle.properties │ ├── app │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night │ │ │ │ │ │ └── styles.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── supabase │ │ │ │ │ │ └── filmsearch │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── AndroidManifest.xml │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── .gitignore │ ├── build.gradle │ └── settings.gradle ├── pubspec.yaml ├── lib │ ├── models │ │ └── film.dart │ ├── main.dart │ ├── pages │ │ ├── home_page.dart │ │ └── details_page.dart │ └── components │ │ └── film_cell.dart ├── .gitignore ├── test │ └── widget_test.dart ├── analysis_options.yaml ├── .metadata └── pubspec.lock ├── .github ├── images │ └── app.jpg └── workflows │ └── ci.yaml ├── .vscode └── settings.json ├── filmsearch.code-workspace └── README.md /supabase/seed.sql: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /supabase/.gitignore: -------------------------------------------------------------------------------- 1 | # Supabase 2 | .branches 3 | .temp 4 | .env -------------------------------------------------------------------------------- /flutter/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /supabase/.env.example: -------------------------------------------------------------------------------- 1 | TMDB_API_KEY=your_tmdb_api_key 2 | OPEN_AI_API_KEY=your_tmdb_api_key -------------------------------------------------------------------------------- /.github/images/app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/.github/images/app.jpg -------------------------------------------------------------------------------- /flutter/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/web/favicon.png -------------------------------------------------------------------------------- /flutter/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /flutter/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/web/icons/Icon-192.png -------------------------------------------------------------------------------- /flutter/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/web/icons/Icon-512.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.lint": true, 4 | "deno.unstable": true, 5 | "deno.cacheOnSave": true 6 | } 7 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /flutter/web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/kotlin/com/supabase/filmsearch/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.supabase.filmsearch 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /filmsearch.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "project-root", 5 | "path": "./" 6 | }, 7 | { 8 | "name": "supabase-functions", 9 | "path": "supabase/functions" 10 | } 11 | ], 12 | "settings": { 13 | "files.exclude": { 14 | "supabase/functions/": true 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /flutter/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /flutter/ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /flutter/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: filmsearch 2 | description: A new Flutter project. 3 | 4 | publish_to: 'none' 5 | 6 | version: 1.0.0+1 7 | 8 | environment: 9 | sdk: '>=3.1.3 <4.0.0' 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | 15 | supabase_flutter: ^1.10.22 16 | intl: ^0.18.1 17 | 18 | dev_dependencies: 19 | flutter_test: 20 | sdk: flutter 21 | 22 | flutter_lints: ^2.0.0 23 | 24 | flutter: 25 | uses-material-design: true 26 | -------------------------------------------------------------------------------- /flutter/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /supabase/migrations/20231010044029_related_films_function.sql: -------------------------------------------------------------------------------- 1 | -- Set index on embedding column 2 | create index on films using hnsw (embedding vector_cosine_ops); 3 | 4 | -- Create function to find related films 5 | create or replace function get_related_film(embedding vector(1536), film_id integer) 6 | returns setof films 7 | language sql 8 | as $$ 9 | select * 10 | from films 11 | where id != film_id 12 | order by films.embedding <=> get_related_film.embedding 13 | limit 6; 14 | $$ security invoker; -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /supabase/migrations/20231009120230_films_table.sql: -------------------------------------------------------------------------------- 1 | -- Enable pgvector extension 2 | create extension vector 3 | with 4 | schema extensions; 5 | 6 | -- Create table 7 | create table public.films ( 8 | id integer primary key, 9 | title text, 10 | overview text, 11 | release_date date, 12 | backdrop_path text, 13 | embedding vector(1536) 14 | ); 15 | 16 | -- Enable row level security 17 | alter table public.films enable row level security; 18 | 19 | -- Create policy to allow anyone to read the films table 20 | create policy "Fils are public." on public.films for select using (true); 21 | -------------------------------------------------------------------------------- /flutter/lib/models/film.dart: -------------------------------------------------------------------------------- 1 | class Film { 2 | final int id; 3 | final String title; 4 | final String overview; 5 | final String imageUrl; 6 | final DateTime releaseDate; 7 | final String embedding; 8 | 9 | Film.fromJson(Map json) 10 | : id = json['id'] as int, 11 | title = json['title'] as String, 12 | overview = json['overview'] as String, 13 | imageUrl = 14 | 'https://image.tmdb.org/t/p/w500${json['backdrop_path'] as String}', 15 | releaseDate = DateTime.parse(json['release_date'] as String), 16 | embedding = json['embedding'] as String; 17 | } 18 | -------------------------------------------------------------------------------- /flutter/ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy Migrations to Production 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | deploy: 11 | runs-on: ubuntu-latest 12 | 13 | env: 14 | SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }} 15 | SUPABASE_DB_PASSWORD: ${{ secrets.DB_PASSWORD }} 16 | SUPABASE_PROJECT_ID: ${{ secrets.PROJECT_ID }} 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - uses: supabase/setup-cli@v1 22 | with: 23 | version: latest 24 | 25 | - run: supabase link --project-ref $SUPABASE_PROJECT_ID 26 | - run: supabase db push 27 | - run: supabase functions deploy --project-ref $SUPABASE_PROJECT_ID 28 | -------------------------------------------------------------------------------- /flutter/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.3.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | tasks.register("clean", Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /flutter/android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | } 9 | settings.ext.flutterSdkPath = flutterSdkPath() 10 | 11 | includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") 12 | 13 | plugins { 14 | id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false 15 | } 16 | } 17 | 18 | include ":app" 19 | 20 | apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" 21 | -------------------------------------------------------------------------------- /flutter/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /flutter/web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "filmsearch", 3 | "short_name": "filmsearch", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /flutter/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:filmsearch/pages/home_page.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:supabase_flutter/supabase_flutter.dart'; 4 | 5 | void main() async { 6 | await Supabase.initialize( 7 | url: 'https://dqbvrguqoahxeqraccxo.supabase.co', 8 | anonKey: 9 | 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRxYnZyZ3Vxb2FoeGVxcmFjY3hvIiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTY4NTQ0MDgsImV4cCI6MjAxMjQzMDQwOH0.8GyUQfmINFOrBRuN8OTbocb3U4T3LSp-1Z6C0W1LOJ0', 10 | ); 11 | runApp(const MyApp()); 12 | } 13 | 14 | final supabase = Supabase.instance.client; 15 | 16 | class MyApp extends StatelessWidget { 17 | const MyApp({super.key}); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return MaterialApp( 22 | title: 'Flutter Demo', 23 | debugShowCheckedModeBanner: false, 24 | theme: ThemeData( 25 | colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), 26 | useMaterial3: true, 27 | ), 28 | home: const HomePage(), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /flutter/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:filmsearch/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /flutter/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 26 | 27 | # Additional information about this file can be found at 28 | # https://dart.dev/guides/language/analysis-options 29 | -------------------------------------------------------------------------------- /flutter/lib/pages/home_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:filmsearch/components/film_cell.dart'; 2 | import 'package:filmsearch/main.dart'; 3 | import 'package:filmsearch/models/film.dart'; 4 | 5 | import 'package:flutter/material.dart'; 6 | 7 | class HomePage extends StatefulWidget { 8 | const HomePage({super.key}); 9 | 10 | @override 11 | State createState() => _HomePageState(); 12 | } 13 | 14 | class _HomePageState extends State { 15 | final filmsFuture = supabase 16 | .from('films') 17 | .select>>() 18 | .withConverter>((data) => data.map(Film.fromJson).toList()); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return Scaffold( 23 | appBar: AppBar( 24 | title: const Text('Films'), 25 | ), 26 | body: FutureBuilder( 27 | future: filmsFuture, 28 | builder: (context, snapshot) { 29 | if (snapshot.hasError) { 30 | return Center( 31 | child: Text(snapshot.error.toString()), 32 | ); 33 | } 34 | if (!snapshot.hasData) { 35 | return const Center(child: CircularProgressIndicator()); 36 | } 37 | final films = snapshot.data!; 38 | return ListView.builder( 39 | itemBuilder: (context, index) { 40 | final film = films[index]; 41 | return FilmCell(film: film); 42 | }, 43 | itemCount: films.length, 44 | ); 45 | }), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /flutter/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '11.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | target 'RunnerTests' do 36 | inherit! :search_paths 37 | end 38 | end 39 | 40 | post_install do |installer| 41 | installer.pods_project.targets.each do |target| 42 | flutter_additional_ios_build_settings(target) 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 14 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Filmsearch 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | filmsearch 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | CADisableMinimumFrameDurationOnPhone 45 | 46 | UIApplicationSupportsIndirectInputEvents 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /flutter/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: "ead455963c12b453cdb2358cad34969c76daf180" 8 | channel: "stable" 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 17 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 18 | - platform: android 19 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 20 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 21 | - platform: ios 22 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 23 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 24 | - platform: linux 25 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 26 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 27 | - platform: macos 28 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 29 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 30 | - platform: web 31 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 32 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 33 | - platform: windows 34 | create_revision: ead455963c12b453cdb2358cad34969c76daf180 35 | base_revision: ead455963c12b453cdb2358cad34969c76daf180 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!WARNING] 2 | > This repo has been moved [here](https://github.com/dshukertjr/examples/tree/main/movie-recommendation). 3 | 4 | # Content recommendation feature using Flutter, Open AI and Supabase 5 | 6 | A Flutter app demonstrating how semantic search powered by Open AI and Supabase vector database can be used to build a recommendation engine for movie films. 7 | 8 | ![Flutter recommendation app](https://raw.githubusercontent.com/dshukertjr/flutter-movie-recommendation/main/.github/images/app.jpg) 9 | 10 | ## Getting Started 11 | 12 | Obtain environment variables 13 | Head to [TMDB API](https://developer.themoviedb.org/reference/intro/getting-started), and [Open AI API](https://openai.com/blog/openai-api) to create an API key. Then copy `supabase/.env.example` to `supabase/.env` and fill in the variables. 14 | 15 | ```bash 16 | TMDB_API_KEY=your_tmdb_api_key 17 | OPEN_AI_API_KEY=your_tmdb_api_key 18 | ``` 19 | 20 | Set environment variables on Supabase Edge functions 21 | 22 | ```bash 23 | supabase link --project-ref YOUR_PROJECT_REF 24 | supabase secrets set --env-file ./supabase/.env 25 | ``` 26 | 27 | Install the Flutter dependencies: 28 | 29 | ```bash 30 | cd flutter 31 | dart pub get 32 | cd .. 33 | ``` 34 | 35 | Setup Supabase project 36 | 37 | ```bash 38 | supabase link --project-ref YOUR_PROJECT_REF 39 | supabase db push 40 | ``` 41 | 42 | Deploy edge functions 43 | 44 | ```bash 45 | supabase functions deploy 46 | ``` 47 | 48 | Run the Flutter app 49 | 50 | ```bash 51 | flutter run 52 | ``` 53 | 54 | ## Tools used 55 | 56 | - [Flutter](https://flutter.dev/) - Used to create the interface of the app 57 | - [Supabase](https://supabase.com/) - Used to store embeddings as well as other movie data in the database 58 | - [Open AI API](https://openai.com/blog/openai-api) - Used to convert movie data into embeddings 59 | - [TMDB API](https://developer.themoviedb.org/docs) - Used to retrieve movie data 60 | -------------------------------------------------------------------------------- /flutter/lib/components/film_cell.dart: -------------------------------------------------------------------------------- 1 | import 'package:filmsearch/models/film.dart'; 2 | import 'package:filmsearch/pages/details_page.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class FilmCell extends StatelessWidget { 6 | const FilmCell({ 7 | super.key, 8 | required this.film, 9 | this.fontSize = 20, 10 | this.isHeroEnabled = true, 11 | }); 12 | final Film film; 13 | final double fontSize; 14 | final bool isHeroEnabled; 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return InkWell( 19 | onTap: () { 20 | Navigator.of(context).push( 21 | MaterialPageRoute( 22 | builder: (context) => DetailsPage(film: film), 23 | ), 24 | ); 25 | }, 26 | child: Stack( 27 | children: [ 28 | AspectRatio( 29 | aspectRatio: 16 / 9, 30 | child: HeroMode( 31 | enabled: isHeroEnabled, 32 | child: Hero( 33 | tag: film.imageUrl, 34 | child: Image.network(film.imageUrl), 35 | ), 36 | ), 37 | ), 38 | Positioned.fill( 39 | top: null, 40 | child: DecoratedBox( 41 | decoration: BoxDecoration( 42 | gradient: LinearGradient( 43 | begin: Alignment.bottomCenter, 44 | end: Alignment.topCenter, 45 | colors: [ 46 | Colors.black, 47 | Colors.black.withAlpha(0), 48 | ], 49 | )), 50 | child: Padding( 51 | padding: const EdgeInsets.all(8.0), 52 | child: Text( 53 | film.title, 54 | style: TextStyle( 55 | color: Colors.white, 56 | fontSize: fontSize, 57 | ), 58 | ), 59 | ), 60 | ), 61 | ), 62 | ], 63 | ), 64 | ); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /flutter/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | filmsearch 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /flutter/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - app_links (0.0.1): 3 | - Flutter 4 | - Flutter (1.0.0) 5 | - path_provider_foundation (0.0.1): 6 | - Flutter 7 | - FlutterMacOS 8 | - shared_preferences_foundation (0.0.1): 9 | - Flutter 10 | - FlutterMacOS 11 | - sign_in_with_apple (0.0.1): 12 | - Flutter 13 | - url_launcher_ios (0.0.1): 14 | - Flutter 15 | - webview_flutter_wkwebview (0.0.1): 16 | - Flutter 17 | 18 | DEPENDENCIES: 19 | - app_links (from `.symlinks/plugins/app_links/ios`) 20 | - Flutter (from `Flutter`) 21 | - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) 22 | - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) 23 | - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) 24 | - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) 25 | - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) 26 | 27 | EXTERNAL SOURCES: 28 | app_links: 29 | :path: ".symlinks/plugins/app_links/ios" 30 | Flutter: 31 | :path: Flutter 32 | path_provider_foundation: 33 | :path: ".symlinks/plugins/path_provider_foundation/darwin" 34 | shared_preferences_foundation: 35 | :path: ".symlinks/plugins/shared_preferences_foundation/darwin" 36 | sign_in_with_apple: 37 | :path: ".symlinks/plugins/sign_in_with_apple/ios" 38 | url_launcher_ios: 39 | :path: ".symlinks/plugins/url_launcher_ios/ios" 40 | webview_flutter_wkwebview: 41 | :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" 42 | 43 | SPEC CHECKSUMS: 44 | app_links: 5ef33d0d295a89d9d16bb81b0e3b0d5f70d6c875 45 | Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 46 | path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 47 | shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 48 | sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 49 | url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 50 | webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a 51 | 52 | PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 53 | 54 | COCOAPODS: 1.14.3 55 | -------------------------------------------------------------------------------- /flutter/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | } 6 | 7 | def localProperties = new Properties() 8 | def localPropertiesFile = rootProject.file('local.properties') 9 | if (localPropertiesFile.exists()) { 10 | localPropertiesFile.withReader('UTF-8') { reader -> 11 | localProperties.load(reader) 12 | } 13 | } 14 | 15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 16 | if (flutterVersionCode == null) { 17 | flutterVersionCode = '1' 18 | } 19 | 20 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 21 | if (flutterVersionName == null) { 22 | flutterVersionName = '1.0' 23 | } 24 | 25 | android { 26 | namespace "com.supabase.filmsearch" 27 | compileSdkVersion flutter.compileSdkVersion 28 | ndkVersion flutter.ndkVersion 29 | 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_1_8 32 | targetCompatibility JavaVersion.VERSION_1_8 33 | } 34 | 35 | kotlinOptions { 36 | jvmTarget = '1.8' 37 | } 38 | 39 | sourceSets { 40 | main.java.srcDirs += 'src/main/kotlin' 41 | } 42 | 43 | defaultConfig { 44 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 45 | applicationId "com.supabase.filmsearch" 46 | // You can update the following values to match your application needs. 47 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 48 | minSdkVersion flutter.minSdkVersion 49 | targetSdkVersion flutter.targetSdkVersion 50 | versionCode flutterVersionCode.toInteger() 51 | versionName flutterVersionName 52 | } 53 | 54 | buildTypes { 55 | release { 56 | // TODO: Add your own signing config for the release build. 57 | // Signing with the debug keys for now, so `flutter run --release` works. 58 | signingConfig signingConfigs.debug 59 | } 60 | } 61 | } 62 | 63 | flutter { 64 | source '../..' 65 | } 66 | 67 | dependencies {} 68 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /flutter/lib/pages/details_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:filmsearch/components/film_cell.dart'; 2 | import 'package:filmsearch/main.dart'; 3 | import 'package:filmsearch/models/film.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:intl/intl.dart'; 6 | 7 | class DetailsPage extends StatefulWidget { 8 | const DetailsPage({super.key, required this.film}); 9 | 10 | final Film film; 11 | 12 | @override 13 | State createState() => _DetailsPageState(); 14 | } 15 | 16 | class _DetailsPageState extends State { 17 | late final Future> relatedFilmsFuture; 18 | 19 | @override 20 | void initState() { 21 | super.initState(); 22 | relatedFilmsFuture = supabase.rpc('get_related_film', params: { 23 | 'embedding': widget.film.embedding, 24 | 'film_id': widget.film.id, 25 | }).withConverter>((data) => 26 | List>.from(data).map(Film.fromJson).toList()); 27 | } 28 | 29 | @override 30 | Widget build(BuildContext context) { 31 | return Scaffold( 32 | appBar: AppBar( 33 | title: Text(widget.film.title), 34 | ), 35 | body: ListView( 36 | children: [ 37 | Hero( 38 | tag: widget.film.imageUrl, 39 | child: Image.network(widget.film.imageUrl), 40 | ), 41 | Padding( 42 | padding: const EdgeInsets.all(8.0), 43 | child: Column( 44 | crossAxisAlignment: CrossAxisAlignment.stretch, 45 | children: [ 46 | Text( 47 | DateFormat.yMMMd().format(widget.film.releaseDate), 48 | style: const TextStyle(color: Colors.grey), 49 | ), 50 | const SizedBox(height: 8), 51 | Text( 52 | widget.film.overview, 53 | style: const TextStyle(fontSize: 16), 54 | ), 55 | const SizedBox(height: 24), 56 | const Text( 57 | 'You might also like:', 58 | style: TextStyle( 59 | fontSize: 16, 60 | fontWeight: FontWeight.bold, 61 | ), 62 | ), 63 | ], 64 | ), 65 | ), 66 | FutureBuilder>( 67 | future: relatedFilmsFuture, 68 | builder: (context, snapshot) { 69 | if (snapshot.hasError) { 70 | return Center( 71 | child: Text(snapshot.error.toString()), 72 | ); 73 | } 74 | if (!snapshot.hasData) { 75 | return const Center(child: CircularProgressIndicator()); 76 | } 77 | final films = snapshot.data!; 78 | return Wrap( 79 | children: films 80 | .map((film) => InkWell( 81 | onTap: () { 82 | Navigator.of(context).push(MaterialPageRoute( 83 | builder: (context) => 84 | DetailsPage(film: film))); 85 | }, 86 | child: FractionallySizedBox( 87 | widthFactor: 0.5, 88 | child: FilmCell( 89 | film: film, 90 | isHeroEnabled: false, 91 | fontSize: 16, 92 | ), 93 | ), 94 | )) 95 | .toList(), 96 | ); 97 | }), 98 | ], 99 | ), 100 | ); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 49 | 50 | 51 | 52 | 53 | 63 | 65 | 71 | 72 | 73 | 74 | 80 | 82 | 88 | 89 | 90 | 91 | 93 | 94 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /supabase/functions/get_film_data/index.ts: -------------------------------------------------------------------------------- 1 | import { serve } from 'https://deno.land/std@0.168.0/http/server.ts' 2 | import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.38.0' 3 | 4 | interface Film { 5 | id: number 6 | title: string 7 | overview: string 8 | release_date: string 9 | backdrop_path: string 10 | } 11 | 12 | interface SupabaseFilm extends Film { 13 | embedding: number[] 14 | } 15 | 16 | serve(async (req) => { 17 | // Get the environment variables 18 | const supabaseUrl = Deno.env.get('SUPABASE_URL') 19 | if (!supabaseUrl) { 20 | return returnError({ 21 | message: 'Environment variable SUPABASE_URL is not set', 22 | }) 23 | } 24 | const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') 25 | if (!supabaseServiceKey) { 26 | return returnError({ 27 | message: 'Environment variable SUPABASE_SERVICE_ROLE_KEY is not set', 28 | }) 29 | } 30 | /** API key for TMDB API */ 31 | const tmdbApiKey = Deno.env.get('TMDB_API_KEY') 32 | if (!tmdbApiKey) { 33 | return returnError({ 34 | message: 'Environment variable TMDB_KEY is not set', 35 | }) 36 | } 37 | /** API key for Open AI API */ 38 | const openAiApiKey = Deno.env.get('OPEN_AI_API_KEY') 39 | if (!openAiApiKey) { 40 | return returnError({ 41 | message: 'Environment variable OPEN_AI_API_KEY is not set', 42 | }) 43 | } 44 | 45 | const supabase = createClient(supabaseUrl, supabaseServiceKey) 46 | 47 | const year = new URLSearchParams(req.url.split('?')[1]).get('year') 48 | 49 | if (!year) { 50 | return returnError({ 51 | message: 'year parameter was not set', 52 | }) 53 | } 54 | 55 | const searchParams = new URLSearchParams() 56 | searchParams.set('sort_by', 'popularity.desc') 57 | searchParams.set('page', '1') 58 | searchParams.set('language', 'en-US') 59 | searchParams.set('primary_release_year', `${year}`) 60 | searchParams.set('include_adult', 'false') 61 | searchParams.set('include_video', 'false') 62 | searchParams.set('region', 'US') 63 | searchParams.set('watch_region', 'US') 64 | searchParams.set('with_original_language', 'en') 65 | 66 | const tmdbResponse = await fetch( 67 | `https://api.themoviedb.org/3/discover/movie?${searchParams.toString()}`, 68 | { 69 | method: 'GET', 70 | headers: { 71 | 'Content-Type': 'application/json', 72 | Authorization: `Bearer ${tmdbApiKey}`, 73 | }, 74 | } 75 | ) 76 | 77 | const tmdbJson = await tmdbResponse.json() 78 | 79 | const tmdbStatus = tmdbResponse.status 80 | if (!(200 <= tmdbStatus && tmdbStatus <= 299)) { 81 | return returnError({ 82 | message: 'Error retrieving data from tmdb API', 83 | }) 84 | } 85 | 86 | const films = tmdbJson.results as Film[] 87 | 88 | const filmsWithEmbeddings: SupabaseFilm[] = [] 89 | 90 | for (const film of films) { 91 | const response = await fetch('https://api.openai.com/v1/embeddings', { 92 | method: 'POST', 93 | headers: { 94 | 'Content-Type': 'application/json', 95 | Authorization: `Bearer ${openAiApiKey}`, 96 | }, 97 | body: JSON.stringify({ 98 | input: film.overview, 99 | model: 'text-embedding-ada-002', 100 | }), 101 | }) 102 | 103 | const responseData = await response.json() 104 | if (responseData.error) { 105 | return returnError({ 106 | message: `Error obtaining Open API embedding: ${responseData.error.message}`, 107 | }) 108 | } 109 | 110 | const embedding = responseData.data[0].embedding 111 | 112 | filmsWithEmbeddings.push({ 113 | id: film.id, 114 | title: film.title, 115 | overview: film.overview, 116 | release_date: film.release_date, 117 | backdrop_path: film.backdrop_path, 118 | embedding, 119 | }) 120 | } 121 | 122 | const { error } = await supabase.from('films').upsert(filmsWithEmbeddings) 123 | 124 | if (error) { 125 | return returnError({ 126 | message: error.message, 127 | }) 128 | } 129 | 130 | return new Response( 131 | JSON.stringify({ 132 | message: `${filmsWithEmbeddings.length} films added for year ${year}`, 133 | }), 134 | { 135 | status: 200, 136 | headers: { 'Content-Type': 'application/json' }, 137 | } 138 | ) 139 | }) 140 | 141 | function returnError({ 142 | message, 143 | status = 400, 144 | }: { 145 | message: string 146 | status?: number 147 | }) { 148 | return new Response( 149 | JSON.stringify({ 150 | message, 151 | }), 152 | { 153 | status: status, 154 | headers: { 'Content-Type': 'application/json' }, 155 | } 156 | ) 157 | } 158 | -------------------------------------------------------------------------------- /supabase/config.toml: -------------------------------------------------------------------------------- 1 | # A string used to distinguish different Supabase projects on the same host. Defaults to the 2 | # working directory name when running `supabase init`. 3 | project_id = "filmsearch" 4 | 5 | [api] 6 | # Port to use for the API URL. 7 | port = 54321 8 | # Schemas to expose in your API. Tables, views and stored procedures in this schema will get API 9 | # endpoints. public and storage are always included. 10 | schemas = ["public", "storage", "graphql_public"] 11 | # Extra schemas to add to the search_path of every request. public is always included. 12 | extra_search_path = ["public", "extensions"] 13 | # The maximum number of rows returns from a view, table, or stored procedure. Limits payload size 14 | # for accidental or malicious requests. 15 | max_rows = 1000 16 | 17 | [db] 18 | # Port to use for the local database URL. 19 | port = 54322 20 | # Port used by db diff command to initialise the shadow database. 21 | shadow_port = 54320 22 | # The database major version to use. This has to be the same as your remote database's. Run `SHOW 23 | # server_version;` on the remote database to check. 24 | major_version = 15 25 | 26 | [db.pooler] 27 | enabled = false 28 | port = 54329 29 | pool_mode = "transaction" 30 | default_pool_size = 20 31 | max_client_conn = 100 32 | 33 | [studio] 34 | enabled = true 35 | # Port to use for Supabase Studio. 36 | port = 54323 37 | # External URL of the API server that frontend connects to. 38 | api_url = "http://localhost" 39 | 40 | # Email testing server. Emails sent with the local dev setup are not actually sent - rather, they 41 | # are monitored, and you can view the emails that would have been sent from the web interface. 42 | [inbucket] 43 | enabled = true 44 | # Port to use for the email testing server web interface. 45 | port = 54324 46 | # Uncomment to expose additional ports for testing user applications that send emails. 47 | # smtp_port = 54325 48 | # pop3_port = 54326 49 | 50 | [storage] 51 | # The maximum file size allowed (e.g. "5MB", "500KB"). 52 | file_size_limit = "50MiB" 53 | 54 | [auth] 55 | # The base URL of your website. Used as an allow-list for redirects and for constructing URLs used 56 | # in emails. 57 | site_url = "http://localhost:3000" 58 | # A list of *exact* URLs that auth providers are permitted to redirect to post authentication. 59 | additional_redirect_urls = ["https://localhost:3000"] 60 | # How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). 61 | jwt_expiry = 3600 62 | # If disabled, the refresh token will never expire. 63 | enable_refresh_token_rotation = true 64 | # Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. 65 | # Requires enable_refresh_token_rotation = true. 66 | refresh_token_reuse_interval = 10 67 | # Allow/disallow new user signups to your project. 68 | enable_signup = true 69 | 70 | [auth.email] 71 | # Allow/disallow new user signups via email to your project. 72 | enable_signup = true 73 | # If enabled, a user will be required to confirm any email change on both the old, and new email 74 | # addresses. If disabled, only the new email is required to confirm. 75 | double_confirm_changes = true 76 | # If enabled, users need to confirm their email address before signing in. 77 | enable_confirmations = false 78 | 79 | # Uncomment to customize email template 80 | # [auth.email.template.invite] 81 | # subject = "You have been invited" 82 | # content_path = "./supabase/templates/invite.html" 83 | 84 | [auth.sms] 85 | # Allow/disallow new user signups via SMS to your project. 86 | enable_signup = true 87 | # If enabled, users need to confirm their phone number before signing in. 88 | enable_confirmations = false 89 | 90 | # Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. 91 | [auth.sms.twilio] 92 | enabled = false 93 | account_sid = "" 94 | message_service_sid = "" 95 | # DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: 96 | auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" 97 | 98 | # Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, 99 | # `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`, 100 | # `twitter`, `slack`, `spotify`, `workos`, `zoom`. 101 | [auth.external.apple] 102 | enabled = false 103 | client_id = "" 104 | # DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: 105 | secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" 106 | # Overrides the default auth redirectUrl. 107 | redirect_uri = "" 108 | # Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, 109 | # or any other third-party OIDC providers. 110 | url = "" 111 | 112 | [analytics] 113 | enabled = false 114 | port = 54327 115 | vector_port = 54328 116 | # Configure one of the supported backends: `postgres`, `bigquery` 117 | backend = "postgres" 118 | -------------------------------------------------------------------------------- /flutter/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | app_links: 5 | dependency: transitive 6 | description: 7 | name: app_links 8 | sha256: eb83c2b15b78a66db04e95132678e910fcdb8dc3a9b0aed0c138f50b2bef0dae 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "3.4.5" 12 | async: 13 | dependency: transitive 14 | description: 15 | name: async 16 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.11.0" 20 | boolean_selector: 21 | dependency: transitive 22 | description: 23 | name: boolean_selector 24 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.1.1" 28 | characters: 29 | dependency: transitive 30 | description: 31 | name: characters 32 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.3.0" 36 | clock: 37 | dependency: transitive 38 | description: 39 | name: clock 40 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.1.1" 44 | collection: 45 | dependency: transitive 46 | description: 47 | name: collection 48 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.18.0" 52 | crypto: 53 | dependency: transitive 54 | description: 55 | name: crypto 56 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "3.0.3" 60 | fake_async: 61 | dependency: transitive 62 | description: 63 | name: fake_async 64 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.3.1" 68 | ffi: 69 | dependency: transitive 70 | description: 71 | name: ffi 72 | sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "2.1.0" 76 | file: 77 | dependency: transitive 78 | description: 79 | name: file 80 | sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "6.1.4" 84 | flutter: 85 | dependency: "direct main" 86 | description: flutter 87 | source: sdk 88 | version: "0.0.0" 89 | flutter_lints: 90 | dependency: "direct dev" 91 | description: 92 | name: flutter_lints 93 | sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 94 | url: "https://pub.dev" 95 | source: hosted 96 | version: "2.0.3" 97 | flutter_test: 98 | dependency: "direct dev" 99 | description: flutter 100 | source: sdk 101 | version: "0.0.0" 102 | flutter_web_plugins: 103 | dependency: transitive 104 | description: flutter 105 | source: sdk 106 | version: "0.0.0" 107 | functions_client: 108 | dependency: transitive 109 | description: 110 | name: functions_client 111 | sha256: "3b157b4d3ae9e38614fd80fab76d1ef1e0e39ff3412a45de2651f27cecb9d2d2" 112 | url: "https://pub.dev" 113 | source: hosted 114 | version: "1.3.2" 115 | gotrue: 116 | dependency: transitive 117 | description: 118 | name: gotrue 119 | sha256: "15359f3b3824dbc8feab3b79d06daefe6f7163afb727e83602385e2d4b809902" 120 | url: "https://pub.dev" 121 | source: hosted 122 | version: "1.12.4" 123 | hive: 124 | dependency: transitive 125 | description: 126 | name: hive 127 | sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" 128 | url: "https://pub.dev" 129 | source: hosted 130 | version: "2.2.3" 131 | hive_flutter: 132 | dependency: transitive 133 | description: 134 | name: hive_flutter 135 | sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc 136 | url: "https://pub.dev" 137 | source: hosted 138 | version: "1.1.0" 139 | http: 140 | dependency: transitive 141 | description: 142 | name: http 143 | sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "1.1.0" 147 | http_parser: 148 | dependency: transitive 149 | description: 150 | name: http_parser 151 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "4.0.2" 155 | intl: 156 | dependency: "direct main" 157 | description: 158 | name: intl 159 | sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "0.18.1" 163 | js: 164 | dependency: transitive 165 | description: 166 | name: js 167 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "0.6.7" 171 | jwt_decode: 172 | dependency: transitive 173 | description: 174 | name: jwt_decode 175 | sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "0.3.1" 179 | lints: 180 | dependency: transitive 181 | description: 182 | name: lints 183 | sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "2.1.1" 187 | matcher: 188 | dependency: transitive 189 | description: 190 | name: matcher 191 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "0.12.16" 195 | material_color_utilities: 196 | dependency: transitive 197 | description: 198 | name: material_color_utilities 199 | sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "0.5.0" 203 | meta: 204 | dependency: transitive 205 | description: 206 | name: meta 207 | sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "1.10.0" 211 | mime: 212 | dependency: transitive 213 | description: 214 | name: mime 215 | sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e 216 | url: "https://pub.dev" 217 | source: hosted 218 | version: "1.0.4" 219 | path: 220 | dependency: transitive 221 | description: 222 | name: path 223 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 224 | url: "https://pub.dev" 225 | source: hosted 226 | version: "1.8.3" 227 | path_provider: 228 | dependency: transitive 229 | description: 230 | name: path_provider 231 | sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "2.1.1" 235 | path_provider_android: 236 | dependency: transitive 237 | description: 238 | name: path_provider_android 239 | sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1" 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "2.2.0" 243 | path_provider_foundation: 244 | dependency: transitive 245 | description: 246 | name: path_provider_foundation 247 | sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "2.3.1" 251 | path_provider_linux: 252 | dependency: transitive 253 | description: 254 | name: path_provider_linux 255 | sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "2.2.1" 259 | path_provider_platform_interface: 260 | dependency: transitive 261 | description: 262 | name: path_provider_platform_interface 263 | sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "2.1.1" 267 | path_provider_windows: 268 | dependency: transitive 269 | description: 270 | name: path_provider_windows 271 | sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "2.2.1" 275 | platform: 276 | dependency: transitive 277 | description: 278 | name: platform 279 | sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "3.1.3" 283 | plugin_platform_interface: 284 | dependency: transitive 285 | description: 286 | name: plugin_platform_interface 287 | sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d 288 | url: "https://pub.dev" 289 | source: hosted 290 | version: "2.1.6" 291 | postgrest: 292 | dependency: transitive 293 | description: 294 | name: postgrest 295 | sha256: "87e35d3a59e327188321befbfbfcc5a7a2e71f0d0a13d975cbc7d169387ec712" 296 | url: "https://pub.dev" 297 | source: hosted 298 | version: "1.5.1" 299 | realtime_client: 300 | dependency: transitive 301 | description: 302 | name: realtime_client 303 | sha256: d93f99b6ee42a7b7af3e15ef2965576172ff196426aabca24b91842fb27df116 304 | url: "https://pub.dev" 305 | source: hosted 306 | version: "1.3.0" 307 | retry: 308 | dependency: transitive 309 | description: 310 | name: retry 311 | sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" 312 | url: "https://pub.dev" 313 | source: hosted 314 | version: "3.1.2" 315 | rxdart: 316 | dependency: transitive 317 | description: 318 | name: rxdart 319 | sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" 320 | url: "https://pub.dev" 321 | source: hosted 322 | version: "0.27.7" 323 | shared_preferences: 324 | dependency: transitive 325 | description: 326 | name: shared_preferences 327 | sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac 328 | url: "https://pub.dev" 329 | source: hosted 330 | version: "2.2.1" 331 | shared_preferences_android: 332 | dependency: transitive 333 | description: 334 | name: shared_preferences_android 335 | sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" 336 | url: "https://pub.dev" 337 | source: hosted 338 | version: "2.2.1" 339 | shared_preferences_foundation: 340 | dependency: transitive 341 | description: 342 | name: shared_preferences_foundation 343 | sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" 344 | url: "https://pub.dev" 345 | source: hosted 346 | version: "2.3.4" 347 | shared_preferences_linux: 348 | dependency: transitive 349 | description: 350 | name: shared_preferences_linux 351 | sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a 352 | url: "https://pub.dev" 353 | source: hosted 354 | version: "2.3.1" 355 | shared_preferences_platform_interface: 356 | dependency: transitive 357 | description: 358 | name: shared_preferences_platform_interface 359 | sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a 360 | url: "https://pub.dev" 361 | source: hosted 362 | version: "2.3.1" 363 | shared_preferences_web: 364 | dependency: transitive 365 | description: 366 | name: shared_preferences_web 367 | sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf 368 | url: "https://pub.dev" 369 | source: hosted 370 | version: "2.2.1" 371 | shared_preferences_windows: 372 | dependency: transitive 373 | description: 374 | name: shared_preferences_windows 375 | sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f 376 | url: "https://pub.dev" 377 | source: hosted 378 | version: "2.3.1" 379 | sign_in_with_apple: 380 | dependency: transitive 381 | description: 382 | name: sign_in_with_apple 383 | sha256: "0975c23b9f8b30a80e27d5659a75993a093d4cb5f4eb7d23a9ccc586fea634e0" 384 | url: "https://pub.dev" 385 | source: hosted 386 | version: "5.0.0" 387 | sign_in_with_apple_platform_interface: 388 | dependency: transitive 389 | description: 390 | name: sign_in_with_apple_platform_interface 391 | sha256: a5883edee09ed6be19de19e7d9f618a617fe41a6fa03f76d082dfb787e9ea18d 392 | url: "https://pub.dev" 393 | source: hosted 394 | version: "1.0.0" 395 | sign_in_with_apple_web: 396 | dependency: transitive 397 | description: 398 | name: sign_in_with_apple_web 399 | sha256: "44b66528f576e77847c14999d5e881e17e7223b7b0625a185417829e5306f47a" 400 | url: "https://pub.dev" 401 | source: hosted 402 | version: "1.0.1" 403 | sky_engine: 404 | dependency: transitive 405 | description: flutter 406 | source: sdk 407 | version: "0.0.99" 408 | source_span: 409 | dependency: transitive 410 | description: 411 | name: source_span 412 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 413 | url: "https://pub.dev" 414 | source: hosted 415 | version: "1.10.0" 416 | stack_trace: 417 | dependency: transitive 418 | description: 419 | name: stack_trace 420 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" 421 | url: "https://pub.dev" 422 | source: hosted 423 | version: "1.11.1" 424 | storage_client: 425 | dependency: transitive 426 | description: 427 | name: storage_client 428 | sha256: "7860281c718983a7cd388b2a87b45af495174701a0230cce2111b81a38352422" 429 | url: "https://pub.dev" 430 | source: hosted 431 | version: "1.5.3" 432 | stream_channel: 433 | dependency: transitive 434 | description: 435 | name: stream_channel 436 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 437 | url: "https://pub.dev" 438 | source: hosted 439 | version: "2.1.2" 440 | string_scanner: 441 | dependency: transitive 442 | description: 443 | name: string_scanner 444 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 445 | url: "https://pub.dev" 446 | source: hosted 447 | version: "1.2.0" 448 | supabase: 449 | dependency: transitive 450 | description: 451 | name: supabase 452 | sha256: "3d70f8a5d7a09916e1f8aa85d6bf548f8b674e18378498d79fecbfe09e825372" 453 | url: "https://pub.dev" 454 | source: hosted 455 | version: "1.11.9" 456 | supabase_flutter: 457 | dependency: "direct main" 458 | description: 459 | name: supabase_flutter 460 | sha256: "8794dd3b292ebed40ec920f6ef303cb2d78f927a9cff00eebd776c9fa9862153" 461 | url: "https://pub.dev" 462 | source: hosted 463 | version: "1.10.22" 464 | term_glyph: 465 | dependency: transitive 466 | description: 467 | name: term_glyph 468 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 469 | url: "https://pub.dev" 470 | source: hosted 471 | version: "1.2.1" 472 | test_api: 473 | dependency: transitive 474 | description: 475 | name: test_api 476 | sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" 477 | url: "https://pub.dev" 478 | source: hosted 479 | version: "0.6.1" 480 | typed_data: 481 | dependency: transitive 482 | description: 483 | name: typed_data 484 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c 485 | url: "https://pub.dev" 486 | source: hosted 487 | version: "1.3.2" 488 | url_launcher: 489 | dependency: transitive 490 | description: 491 | name: url_launcher 492 | sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27" 493 | url: "https://pub.dev" 494 | source: hosted 495 | version: "6.1.14" 496 | url_launcher_android: 497 | dependency: transitive 498 | description: 499 | name: url_launcher_android 500 | sha256: b04af59516ab45762b2ca6da40fa830d72d0f6045cd97744450b73493fa76330 501 | url: "https://pub.dev" 502 | source: hosted 503 | version: "6.1.0" 504 | url_launcher_ios: 505 | dependency: transitive 506 | description: 507 | name: url_launcher_ios 508 | sha256: "7c65021d5dee51813d652357bc65b8dd4a6177082a9966bc8ba6ee477baa795f" 509 | url: "https://pub.dev" 510 | source: hosted 511 | version: "6.1.5" 512 | url_launcher_linux: 513 | dependency: transitive 514 | description: 515 | name: url_launcher_linux 516 | sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e 517 | url: "https://pub.dev" 518 | source: hosted 519 | version: "3.0.6" 520 | url_launcher_macos: 521 | dependency: transitive 522 | description: 523 | name: url_launcher_macos 524 | sha256: b55486791f666e62e0e8ff825e58a023fd6b1f71c49926483f1128d3bbd8fe88 525 | url: "https://pub.dev" 526 | source: hosted 527 | version: "3.0.7" 528 | url_launcher_platform_interface: 529 | dependency: transitive 530 | description: 531 | name: url_launcher_platform_interface 532 | sha256: "95465b39f83bfe95fcb9d174829d6476216f2d548b79c38ab2506e0458787618" 533 | url: "https://pub.dev" 534 | source: hosted 535 | version: "2.1.5" 536 | url_launcher_web: 537 | dependency: transitive 538 | description: 539 | name: url_launcher_web 540 | sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5" 541 | url: "https://pub.dev" 542 | source: hosted 543 | version: "2.0.20" 544 | url_launcher_windows: 545 | dependency: transitive 546 | description: 547 | name: url_launcher_windows 548 | sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069" 549 | url: "https://pub.dev" 550 | source: hosted 551 | version: "3.0.8" 552 | vector_math: 553 | dependency: transitive 554 | description: 555 | name: vector_math 556 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 557 | url: "https://pub.dev" 558 | source: hosted 559 | version: "2.1.4" 560 | web: 561 | dependency: transitive 562 | description: 563 | name: web 564 | sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 565 | url: "https://pub.dev" 566 | source: hosted 567 | version: "0.3.0" 568 | web_socket_channel: 569 | dependency: transitive 570 | description: 571 | name: web_socket_channel 572 | sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b 573 | url: "https://pub.dev" 574 | source: hosted 575 | version: "2.4.0" 576 | webview_flutter: 577 | dependency: transitive 578 | description: 579 | name: webview_flutter 580 | sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e 581 | url: "https://pub.dev" 582 | source: hosted 583 | version: "4.4.1" 584 | webview_flutter_android: 585 | dependency: transitive 586 | description: 587 | name: webview_flutter_android 588 | sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff 589 | url: "https://pub.dev" 590 | source: hosted 591 | version: "3.12.0" 592 | webview_flutter_platform_interface: 593 | dependency: transitive 594 | description: 595 | name: webview_flutter_platform_interface 596 | sha256: "6d9213c65f1060116757a7c473247c60f3f7f332cac33dc417c9e362a9a13e4f" 597 | url: "https://pub.dev" 598 | source: hosted 599 | version: "2.6.0" 600 | webview_flutter_wkwebview: 601 | dependency: transitive 602 | description: 603 | name: webview_flutter_wkwebview 604 | sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974" 605 | url: "https://pub.dev" 606 | source: hosted 607 | version: "3.9.1" 608 | win32: 609 | dependency: transitive 610 | description: 611 | name: win32 612 | sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" 613 | url: "https://pub.dev" 614 | source: hosted 615 | version: "5.0.9" 616 | xdg_directories: 617 | dependency: transitive 618 | description: 619 | name: xdg_directories 620 | sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" 621 | url: "https://pub.dev" 622 | source: hosted 623 | version: "1.0.3" 624 | yet_another_json_isolate: 625 | dependency: transitive 626 | description: 627 | name: yet_another_json_isolate 628 | sha256: "86fad76026c4241a32831d6c7febd8f9bded5019e2cd36c5b148499808d8307d" 629 | url: "https://pub.dev" 630 | source: hosted 631 | version: "1.1.1" 632 | sdks: 633 | dart: ">=3.2.0-194.0.dev <4.0.0" 634 | flutter: ">=3.13.0" 635 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 596A036A48A6997C8E94217D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E64CE52026B177EB7F78E6 /* Pods_RunnerTests.framework */; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 16 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 17 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 18 | B9BC0FCB614262211D132FEA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 251FD607894361F4850B0737 /* Pods_Runner.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 97C146E61CF9000F007C117D /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 97C146ED1CF9000F007C117D; 27 | remoteInfo = Runner; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXCopyFilesBuildPhase section */ 32 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 33 | isa = PBXCopyFilesBuildPhase; 34 | buildActionMask = 2147483647; 35 | dstPath = ""; 36 | dstSubfolderSpec = 10; 37 | files = ( 38 | ); 39 | name = "Embed Frameworks"; 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXCopyFilesBuildPhase section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 46 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 47 | 251FD607894361F4850B0737 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 2AFD858E72EFA638155BFCA3 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 49 | 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 50 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 52 | 4CC28FC7BB41D74C4F75398F /* 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 = ""; }; 53 | 51E64CE52026B177EB7F78E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 55 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 56 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 57 | 93ED6E59107A29DBD4AE6300 /* 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 = ""; }; 58 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 59 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 60 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 62 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 63 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 64 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | AFA4B05842E2B3D0C714A915 /* 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 = ""; }; 66 | B29FE14E7FDE63DE0B667466 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 67 | E0B061C0C138B2C5D7BE9ED8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | 87A7F4BA217EEABB3A367B26 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | 596A036A48A6997C8E94217D /* Pods_RunnerTests.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | B9BC0FCB614262211D132FEA /* Pods_Runner.framework in Frameworks */, 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | 125F28E8C129EE10236D5A6D /* Frameworks */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 251FD607894361F4850B0737 /* Pods_Runner.framework */, 94 | 51E64CE52026B177EB7F78E6 /* Pods_RunnerTests.framework */, 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | 197702C966D995A80A5F5055 /* Pods */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 93ED6E59107A29DBD4AE6300 /* Pods-Runner.debug.xcconfig */, 103 | 4CC28FC7BB41D74C4F75398F /* Pods-Runner.release.xcconfig */, 104 | AFA4B05842E2B3D0C714A915 /* Pods-Runner.profile.xcconfig */, 105 | 2AFD858E72EFA638155BFCA3 /* Pods-RunnerTests.debug.xcconfig */, 106 | B29FE14E7FDE63DE0B667466 /* Pods-RunnerTests.release.xcconfig */, 107 | E0B061C0C138B2C5D7BE9ED8 /* Pods-RunnerTests.profile.xcconfig */, 108 | ); 109 | name = Pods; 110 | path = Pods; 111 | sourceTree = ""; 112 | }; 113 | 331C8082294A63A400263BE5 /* RunnerTests */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 331C807B294A618700263BE5 /* RunnerTests.swift */, 117 | ); 118 | path = RunnerTests; 119 | sourceTree = ""; 120 | }; 121 | 9740EEB11CF90186004384FC /* Flutter */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 125 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 126 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 127 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 128 | ); 129 | name = Flutter; 130 | sourceTree = ""; 131 | }; 132 | 97C146E51CF9000F007C117D = { 133 | isa = PBXGroup; 134 | children = ( 135 | 9740EEB11CF90186004384FC /* Flutter */, 136 | 97C146F01CF9000F007C117D /* Runner */, 137 | 97C146EF1CF9000F007C117D /* Products */, 138 | 331C8082294A63A400263BE5 /* RunnerTests */, 139 | 197702C966D995A80A5F5055 /* Pods */, 140 | 125F28E8C129EE10236D5A6D /* Frameworks */, 141 | ); 142 | sourceTree = ""; 143 | }; 144 | 97C146EF1CF9000F007C117D /* Products */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 97C146EE1CF9000F007C117D /* Runner.app */, 148 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */, 149 | ); 150 | name = Products; 151 | sourceTree = ""; 152 | }; 153 | 97C146F01CF9000F007C117D /* Runner */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 157 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 158 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 159 | 97C147021CF9000F007C117D /* Info.plist */, 160 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 161 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 162 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 163 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 164 | ); 165 | path = Runner; 166 | sourceTree = ""; 167 | }; 168 | /* End PBXGroup section */ 169 | 170 | /* Begin PBXNativeTarget section */ 171 | 331C8080294A63A400263BE5 /* RunnerTests */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; 174 | buildPhases = ( 175 | 4F40A14270295F187E483793 /* [CP] Check Pods Manifest.lock */, 176 | 331C807D294A63A400263BE5 /* Sources */, 177 | 331C807F294A63A400263BE5 /* Resources */, 178 | 87A7F4BA217EEABB3A367B26 /* Frameworks */, 179 | ); 180 | buildRules = ( 181 | ); 182 | dependencies = ( 183 | 331C8086294A63A400263BE5 /* PBXTargetDependency */, 184 | ); 185 | name = RunnerTests; 186 | productName = RunnerTests; 187 | productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; 188 | productType = "com.apple.product-type.bundle.unit-test"; 189 | }; 190 | 97C146ED1CF9000F007C117D /* Runner */ = { 191 | isa = PBXNativeTarget; 192 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 193 | buildPhases = ( 194 | B69293B6D517ED45EDF35342 /* [CP] Check Pods Manifest.lock */, 195 | 9740EEB61CF901F6004384FC /* Run Script */, 196 | 97C146EA1CF9000F007C117D /* Sources */, 197 | 97C146EB1CF9000F007C117D /* Frameworks */, 198 | 97C146EC1CF9000F007C117D /* Resources */, 199 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 201 | 25D9142E503E5A16995D7293 /* [CP] Embed Pods Frameworks */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | ); 207 | name = Runner; 208 | productName = Runner; 209 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 210 | productType = "com.apple.product-type.application"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | 97C146E61CF9000F007C117D /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | BuildIndependentTargetsInParallel = YES; 219 | LastUpgradeCheck = 1430; 220 | ORGANIZATIONNAME = ""; 221 | TargetAttributes = { 222 | 331C8080294A63A400263BE5 = { 223 | CreatedOnToolsVersion = 14.0; 224 | TestTargetID = 97C146ED1CF9000F007C117D; 225 | }; 226 | 97C146ED1CF9000F007C117D = { 227 | CreatedOnToolsVersion = 7.3.1; 228 | LastSwiftMigration = 1100; 229 | }; 230 | }; 231 | }; 232 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 233 | compatibilityVersion = "Xcode 9.3"; 234 | developmentRegion = en; 235 | hasScannedForEncodings = 0; 236 | knownRegions = ( 237 | en, 238 | Base, 239 | ); 240 | mainGroup = 97C146E51CF9000F007C117D; 241 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 242 | projectDirPath = ""; 243 | projectRoot = ""; 244 | targets = ( 245 | 97C146ED1CF9000F007C117D /* Runner */, 246 | 331C8080294A63A400263BE5 /* RunnerTests */, 247 | ); 248 | }; 249 | /* End PBXProject section */ 250 | 251 | /* Begin PBXResourcesBuildPhase section */ 252 | 331C807F294A63A400263BE5 /* Resources */ = { 253 | isa = PBXResourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | 97C146EC1CF9000F007C117D /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 264 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 265 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 266 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 267 | ); 268 | runOnlyForDeploymentPostprocessing = 0; 269 | }; 270 | /* End PBXResourcesBuildPhase section */ 271 | 272 | /* Begin PBXShellScriptBuildPhase section */ 273 | 25D9142E503E5A16995D7293 /* [CP] Embed Pods Frameworks */ = { 274 | isa = PBXShellScriptBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | inputFileListPaths = ( 279 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 280 | ); 281 | name = "[CP] Embed Pods Frameworks"; 282 | outputFileListPaths = ( 283 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | shellPath = /bin/sh; 287 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 288 | showEnvVarsInLog = 0; 289 | }; 290 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 291 | isa = PBXShellScriptBuildPhase; 292 | alwaysOutOfDate = 1; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | ); 296 | inputPaths = ( 297 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 298 | ); 299 | name = "Thin Binary"; 300 | outputPaths = ( 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | shellPath = /bin/sh; 304 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 305 | }; 306 | 4F40A14270295F187E483793 /* [CP] Check Pods Manifest.lock */ = { 307 | isa = PBXShellScriptBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | ); 311 | inputFileListPaths = ( 312 | ); 313 | inputPaths = ( 314 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 315 | "${PODS_ROOT}/Manifest.lock", 316 | ); 317 | name = "[CP] Check Pods Manifest.lock"; 318 | outputFileListPaths = ( 319 | ); 320 | outputPaths = ( 321 | "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", 322 | ); 323 | runOnlyForDeploymentPostprocessing = 0; 324 | shellPath = /bin/sh; 325 | 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"; 326 | showEnvVarsInLog = 0; 327 | }; 328 | 9740EEB61CF901F6004384FC /* Run Script */ = { 329 | isa = PBXShellScriptBuildPhase; 330 | alwaysOutOfDate = 1; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | ); 334 | inputPaths = ( 335 | ); 336 | name = "Run Script"; 337 | outputPaths = ( 338 | ); 339 | runOnlyForDeploymentPostprocessing = 0; 340 | shellPath = /bin/sh; 341 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 342 | }; 343 | B69293B6D517ED45EDF35342 /* [CP] Check Pods Manifest.lock */ = { 344 | isa = PBXShellScriptBuildPhase; 345 | buildActionMask = 2147483647; 346 | files = ( 347 | ); 348 | inputFileListPaths = ( 349 | ); 350 | inputPaths = ( 351 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 352 | "${PODS_ROOT}/Manifest.lock", 353 | ); 354 | name = "[CP] Check Pods Manifest.lock"; 355 | outputFileListPaths = ( 356 | ); 357 | outputPaths = ( 358 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | shellPath = /bin/sh; 362 | 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"; 363 | showEnvVarsInLog = 0; 364 | }; 365 | /* End PBXShellScriptBuildPhase section */ 366 | 367 | /* Begin PBXSourcesBuildPhase section */ 368 | 331C807D294A63A400263BE5 /* Sources */ = { 369 | isa = PBXSourcesBuildPhase; 370 | buildActionMask = 2147483647; 371 | files = ( 372 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, 373 | ); 374 | runOnlyForDeploymentPostprocessing = 0; 375 | }; 376 | 97C146EA1CF9000F007C117D /* Sources */ = { 377 | isa = PBXSourcesBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 381 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | }; 385 | /* End PBXSourcesBuildPhase section */ 386 | 387 | /* Begin PBXTargetDependency section */ 388 | 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { 389 | isa = PBXTargetDependency; 390 | target = 97C146ED1CF9000F007C117D /* Runner */; 391 | targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; 392 | }; 393 | /* End PBXTargetDependency section */ 394 | 395 | /* Begin PBXVariantGroup section */ 396 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 397 | isa = PBXVariantGroup; 398 | children = ( 399 | 97C146FB1CF9000F007C117D /* Base */, 400 | ); 401 | name = Main.storyboard; 402 | sourceTree = ""; 403 | }; 404 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 405 | isa = PBXVariantGroup; 406 | children = ( 407 | 97C147001CF9000F007C117D /* Base */, 408 | ); 409 | name = LaunchScreen.storyboard; 410 | sourceTree = ""; 411 | }; 412 | /* End PBXVariantGroup section */ 413 | 414 | /* Begin XCBuildConfiguration section */ 415 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 416 | isa = XCBuildConfiguration; 417 | buildSettings = { 418 | ALWAYS_SEARCH_USER_PATHS = NO; 419 | CLANG_ANALYZER_NONNULL = YES; 420 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 421 | CLANG_CXX_LIBRARY = "libc++"; 422 | CLANG_ENABLE_MODULES = YES; 423 | CLANG_ENABLE_OBJC_ARC = YES; 424 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 425 | CLANG_WARN_BOOL_CONVERSION = YES; 426 | CLANG_WARN_COMMA = YES; 427 | CLANG_WARN_CONSTANT_CONVERSION = YES; 428 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 429 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 430 | CLANG_WARN_EMPTY_BODY = YES; 431 | CLANG_WARN_ENUM_CONVERSION = YES; 432 | CLANG_WARN_INFINITE_RECURSION = YES; 433 | CLANG_WARN_INT_CONVERSION = YES; 434 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 435 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 436 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 437 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 438 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 439 | CLANG_WARN_STRICT_PROTOTYPES = YES; 440 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 441 | CLANG_WARN_UNREACHABLE_CODE = YES; 442 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 443 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 444 | COPY_PHASE_STRIP = NO; 445 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 446 | ENABLE_NS_ASSERTIONS = NO; 447 | ENABLE_STRICT_OBJC_MSGSEND = YES; 448 | GCC_C_LANGUAGE_STANDARD = gnu99; 449 | GCC_NO_COMMON_BLOCKS = YES; 450 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 451 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 452 | GCC_WARN_UNDECLARED_SELECTOR = YES; 453 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 454 | GCC_WARN_UNUSED_FUNCTION = YES; 455 | GCC_WARN_UNUSED_VARIABLE = YES; 456 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 457 | MTL_ENABLE_DEBUG_INFO = NO; 458 | SDKROOT = iphoneos; 459 | SUPPORTED_PLATFORMS = iphoneos; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | VALIDATE_PRODUCT = YES; 462 | }; 463 | name = Profile; 464 | }; 465 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 466 | isa = XCBuildConfiguration; 467 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 468 | buildSettings = { 469 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 470 | CLANG_ENABLE_MODULES = YES; 471 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 472 | DEVELOPMENT_TEAM = Z6UYZY8QU4; 473 | ENABLE_BITCODE = NO; 474 | INFOPLIST_FILE = Runner/Info.plist; 475 | LD_RUNPATH_SEARCH_PATHS = ( 476 | "$(inherited)", 477 | "@executable_path/Frameworks", 478 | ); 479 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch; 480 | PRODUCT_NAME = "$(TARGET_NAME)"; 481 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 482 | SWIFT_VERSION = 5.0; 483 | VERSIONING_SYSTEM = "apple-generic"; 484 | }; 485 | name = Profile; 486 | }; 487 | 331C8088294A63A400263BE5 /* Debug */ = { 488 | isa = XCBuildConfiguration; 489 | baseConfigurationReference = 2AFD858E72EFA638155BFCA3 /* Pods-RunnerTests.debug.xcconfig */; 490 | buildSettings = { 491 | BUNDLE_LOADER = "$(TEST_HOST)"; 492 | CODE_SIGN_STYLE = Automatic; 493 | CURRENT_PROJECT_VERSION = 1; 494 | GENERATE_INFOPLIST_FILE = YES; 495 | MARKETING_VERSION = 1.0; 496 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch.RunnerTests; 497 | PRODUCT_NAME = "$(TARGET_NAME)"; 498 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 499 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 500 | SWIFT_VERSION = 5.0; 501 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 502 | }; 503 | name = Debug; 504 | }; 505 | 331C8089294A63A400263BE5 /* Release */ = { 506 | isa = XCBuildConfiguration; 507 | baseConfigurationReference = B29FE14E7FDE63DE0B667466 /* Pods-RunnerTests.release.xcconfig */; 508 | buildSettings = { 509 | BUNDLE_LOADER = "$(TEST_HOST)"; 510 | CODE_SIGN_STYLE = Automatic; 511 | CURRENT_PROJECT_VERSION = 1; 512 | GENERATE_INFOPLIST_FILE = YES; 513 | MARKETING_VERSION = 1.0; 514 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch.RunnerTests; 515 | PRODUCT_NAME = "$(TARGET_NAME)"; 516 | SWIFT_VERSION = 5.0; 517 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 518 | }; 519 | name = Release; 520 | }; 521 | 331C808A294A63A400263BE5 /* Profile */ = { 522 | isa = XCBuildConfiguration; 523 | baseConfigurationReference = E0B061C0C138B2C5D7BE9ED8 /* Pods-RunnerTests.profile.xcconfig */; 524 | buildSettings = { 525 | BUNDLE_LOADER = "$(TEST_HOST)"; 526 | CODE_SIGN_STYLE = Automatic; 527 | CURRENT_PROJECT_VERSION = 1; 528 | GENERATE_INFOPLIST_FILE = YES; 529 | MARKETING_VERSION = 1.0; 530 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch.RunnerTests; 531 | PRODUCT_NAME = "$(TARGET_NAME)"; 532 | SWIFT_VERSION = 5.0; 533 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 534 | }; 535 | name = Profile; 536 | }; 537 | 97C147031CF9000F007C117D /* Debug */ = { 538 | isa = XCBuildConfiguration; 539 | buildSettings = { 540 | ALWAYS_SEARCH_USER_PATHS = NO; 541 | CLANG_ANALYZER_NONNULL = YES; 542 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 543 | CLANG_CXX_LIBRARY = "libc++"; 544 | CLANG_ENABLE_MODULES = YES; 545 | CLANG_ENABLE_OBJC_ARC = YES; 546 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 547 | CLANG_WARN_BOOL_CONVERSION = YES; 548 | CLANG_WARN_COMMA = YES; 549 | CLANG_WARN_CONSTANT_CONVERSION = YES; 550 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 551 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 552 | CLANG_WARN_EMPTY_BODY = YES; 553 | CLANG_WARN_ENUM_CONVERSION = YES; 554 | CLANG_WARN_INFINITE_RECURSION = YES; 555 | CLANG_WARN_INT_CONVERSION = YES; 556 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 557 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 558 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 559 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 560 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 561 | CLANG_WARN_STRICT_PROTOTYPES = YES; 562 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 563 | CLANG_WARN_UNREACHABLE_CODE = YES; 564 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 565 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 566 | COPY_PHASE_STRIP = NO; 567 | DEBUG_INFORMATION_FORMAT = dwarf; 568 | ENABLE_STRICT_OBJC_MSGSEND = YES; 569 | ENABLE_TESTABILITY = YES; 570 | GCC_C_LANGUAGE_STANDARD = gnu99; 571 | GCC_DYNAMIC_NO_PIC = NO; 572 | GCC_NO_COMMON_BLOCKS = YES; 573 | GCC_OPTIMIZATION_LEVEL = 0; 574 | GCC_PREPROCESSOR_DEFINITIONS = ( 575 | "DEBUG=1", 576 | "$(inherited)", 577 | ); 578 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 579 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 580 | GCC_WARN_UNDECLARED_SELECTOR = YES; 581 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 582 | GCC_WARN_UNUSED_FUNCTION = YES; 583 | GCC_WARN_UNUSED_VARIABLE = YES; 584 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 585 | MTL_ENABLE_DEBUG_INFO = YES; 586 | ONLY_ACTIVE_ARCH = YES; 587 | SDKROOT = iphoneos; 588 | TARGETED_DEVICE_FAMILY = "1,2"; 589 | }; 590 | name = Debug; 591 | }; 592 | 97C147041CF9000F007C117D /* Release */ = { 593 | isa = XCBuildConfiguration; 594 | buildSettings = { 595 | ALWAYS_SEARCH_USER_PATHS = NO; 596 | CLANG_ANALYZER_NONNULL = YES; 597 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 598 | CLANG_CXX_LIBRARY = "libc++"; 599 | CLANG_ENABLE_MODULES = YES; 600 | CLANG_ENABLE_OBJC_ARC = YES; 601 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 602 | CLANG_WARN_BOOL_CONVERSION = YES; 603 | CLANG_WARN_COMMA = YES; 604 | CLANG_WARN_CONSTANT_CONVERSION = YES; 605 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 606 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 607 | CLANG_WARN_EMPTY_BODY = YES; 608 | CLANG_WARN_ENUM_CONVERSION = YES; 609 | CLANG_WARN_INFINITE_RECURSION = YES; 610 | CLANG_WARN_INT_CONVERSION = YES; 611 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 612 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 613 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 614 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 615 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 616 | CLANG_WARN_STRICT_PROTOTYPES = YES; 617 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 618 | CLANG_WARN_UNREACHABLE_CODE = YES; 619 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 620 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 621 | COPY_PHASE_STRIP = NO; 622 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 623 | ENABLE_NS_ASSERTIONS = NO; 624 | ENABLE_STRICT_OBJC_MSGSEND = YES; 625 | GCC_C_LANGUAGE_STANDARD = gnu99; 626 | GCC_NO_COMMON_BLOCKS = YES; 627 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 628 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 629 | GCC_WARN_UNDECLARED_SELECTOR = YES; 630 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 631 | GCC_WARN_UNUSED_FUNCTION = YES; 632 | GCC_WARN_UNUSED_VARIABLE = YES; 633 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 634 | MTL_ENABLE_DEBUG_INFO = NO; 635 | SDKROOT = iphoneos; 636 | SUPPORTED_PLATFORMS = iphoneos; 637 | SWIFT_COMPILATION_MODE = wholemodule; 638 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 639 | TARGETED_DEVICE_FAMILY = "1,2"; 640 | VALIDATE_PRODUCT = YES; 641 | }; 642 | name = Release; 643 | }; 644 | 97C147061CF9000F007C117D /* Debug */ = { 645 | isa = XCBuildConfiguration; 646 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 647 | buildSettings = { 648 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 649 | CLANG_ENABLE_MODULES = YES; 650 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 651 | DEVELOPMENT_TEAM = Z6UYZY8QU4; 652 | ENABLE_BITCODE = NO; 653 | INFOPLIST_FILE = Runner/Info.plist; 654 | LD_RUNPATH_SEARCH_PATHS = ( 655 | "$(inherited)", 656 | "@executable_path/Frameworks", 657 | ); 658 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch; 659 | PRODUCT_NAME = "$(TARGET_NAME)"; 660 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 661 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 662 | SWIFT_VERSION = 5.0; 663 | VERSIONING_SYSTEM = "apple-generic"; 664 | }; 665 | name = Debug; 666 | }; 667 | 97C147071CF9000F007C117D /* Release */ = { 668 | isa = XCBuildConfiguration; 669 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 670 | buildSettings = { 671 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 672 | CLANG_ENABLE_MODULES = YES; 673 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 674 | DEVELOPMENT_TEAM = Z6UYZY8QU4; 675 | ENABLE_BITCODE = NO; 676 | INFOPLIST_FILE = Runner/Info.plist; 677 | LD_RUNPATH_SEARCH_PATHS = ( 678 | "$(inherited)", 679 | "@executable_path/Frameworks", 680 | ); 681 | PRODUCT_BUNDLE_IDENTIFIER = com.supabase.filmsearch; 682 | PRODUCT_NAME = "$(TARGET_NAME)"; 683 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 684 | SWIFT_VERSION = 5.0; 685 | VERSIONING_SYSTEM = "apple-generic"; 686 | }; 687 | name = Release; 688 | }; 689 | /* End XCBuildConfiguration section */ 690 | 691 | /* Begin XCConfigurationList section */ 692 | 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { 693 | isa = XCConfigurationList; 694 | buildConfigurations = ( 695 | 331C8088294A63A400263BE5 /* Debug */, 696 | 331C8089294A63A400263BE5 /* Release */, 697 | 331C808A294A63A400263BE5 /* Profile */, 698 | ); 699 | defaultConfigurationIsVisible = 0; 700 | defaultConfigurationName = Release; 701 | }; 702 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 703 | isa = XCConfigurationList; 704 | buildConfigurations = ( 705 | 97C147031CF9000F007C117D /* Debug */, 706 | 97C147041CF9000F007C117D /* Release */, 707 | 249021D3217E4FDB00AE95B9 /* Profile */, 708 | ); 709 | defaultConfigurationIsVisible = 0; 710 | defaultConfigurationName = Release; 711 | }; 712 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 713 | isa = XCConfigurationList; 714 | buildConfigurations = ( 715 | 97C147061CF9000F007C117D /* Debug */, 716 | 97C147071CF9000F007C117D /* Release */, 717 | 249021D4217E4FDB00AE95B9 /* Profile */, 718 | ); 719 | defaultConfigurationIsVisible = 0; 720 | defaultConfigurationName = Release; 721 | }; 722 | /* End XCConfigurationList section */ 723 | }; 724 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 725 | } 726 | --------------------------------------------------------------------------------