├── .DS_Store ├── .github ├── FUNDING.yml └── workflows │ ├── import-ff-source-code.yml │ └── main.yml ├── .gitignore ├── APIs ├── .DS_Store ├── Firebase │ └── send-push-notification ├── Spotify │ └── revoke-access-token.json └── sample.json ├── Apps ├── .DS_Store ├── General │ ├── cartUsingAppState.dart │ ├── create-json-from-app-state-products.dart │ └── create-json-from-app-state-services.dart └── Mobile provider │ ├── Animations │ ├── 1-2-3-4-5.json │ ├── 1.json │ ├── 2-1-3-4-5.json │ ├── 2-3-4-1-5.json │ ├── 2-3-4-5-1.json │ ├── 2.json │ ├── 3-2-1-4-5.json │ ├── 3.json │ ├── 4.json │ └── 5.json │ └── y-christmas-2022.dart ├── Cloud Functions ├── .DS_Store ├── README.md ├── add-random-doc │ ├── index.js │ └── package.json ├── amazon-find-item │ ├── index.js │ └── package.json ├── cascade-delete │ ├── index.js │ └── package.json ├── combine-video │ ├── index.js │ └── package.json ├── cors-error │ ├── index.js │ └── package.json ├── create-thumbnail │ ├── index.js │ └── package.json ├── del-docs-after-period │ ├── index.js │ └── package.json ├── del-user-as-admin │ ├── index.js │ └── package.json ├── execute-api-update-doc │ ├── index.js │ └── package.json ├── get-users-uids │ ├── index.js │ └── package.json ├── hello-world │ ├── index.js │ └── package.json ├── password-reset │ ├── index.js │ └── package.json ├── schedule-notifications │ ├── 01-send-notification.js │ ├── 02-calculate-server-time.js │ ├── 03-send-schedule-notification.js │ └── package.json ├── shopify │ ├── index.js │ ├── package.json │ └── update.js ├── social-media │ ├── index.js │ └── package.json ├── spotify-oauth │ ├── index.js │ └── package.json ├── spotify-web │ ├── index.js │ └── package.json ├── stripe-sub-webhook │ ├── index.js │ └── package.json ├── thumbnail │ ├── index.js │ └── package.json └── welcome-email │ ├── index.js │ └── package.json ├── CloudFlare ├── Country │ ├── country-worker.js │ └── fetch-country.dart └── R2-upload-files │ ├── README.md │ ├── curl │ └── worker.js ├── Custom Actions ├── .DS_Store ├── close-tab.dart ├── convert-datatype-to-json.dart ├── convert-doc-to-json.dart ├── convert-json-to-datatype.dart ├── convert-json-to-doc.dart ├── count-down-timer.dart ├── custom app state │ ├── custom-app-state.dart │ ├── get-custom-app-state.dart │ └── set-custom-app-state.dart ├── delete-local-file.dart ├── download-to-any-platform.dart ├── download-zip-files.dart ├── feedback.dart ├── firebase │ ├── auth │ │ └── fb-auth-provider.dart │ ├── database │ │ ├── fb-batch-delete-docs.dart │ │ ├── fb-batch-insert-docs.dart │ │ ├── fb-batch-insert-or-update-docs.dart │ │ ├── fb-download-collection-as-csv.dart │ │ ├── fb-duplicate-docs.dart │ │ ├── fb-get-doc-by-uid.dart │ │ ├── fb-get-doc-using-filter.dart │ │ ├── fb-get-doc.dart │ │ ├── fb-get-docs-using-collection.dart │ │ ├── fb-get-docs.dart │ │ ├── fb-get-random-doc.dart │ │ ├── fb-insert-or-update-doc-using-filter.dart │ │ ├── fb-insert-or-update-doc.dart │ │ ├── fb-shuffle-docs.dart │ │ └── fb-update-all-docs-in-collection.dart │ ├── messaging │ │ └── fb-get-fcm-token.dart │ └── storage │ │ ├── fb-save-file-from-url.dart │ │ ├── fb-upload-any-file-type.dart │ │ ├── fb-upload-multi-any-file-type.dart │ │ └── fb-upload-raw-file.dart ├── get-url-params.dart ├── hide-keyboard.dart ├── manage-stripe-subs.dart ├── nav-to-page.dart ├── null-safety.dart ├── supabase │ ├── auth │ │ ├── sb-create-user.dart │ │ ├── sb-login-user.dart │ │ └── sb-user-data.dart │ ├── cloud functions │ │ └── execute-cloud-function.dart │ ├── database │ │ ├── sb-batch-delete-rows.dart │ │ ├── sb-batch-insert-or-update-docs.dart │ │ ├── sb-batch-insert-rows.dart │ │ ├── sb-download-table-as-csv.dart │ │ ├── sb-duplicate-rows.dart │ │ ├── sb-get-random-row.dart │ │ ├── sb-get-row-by-id.dart │ │ ├── sb-get-row.dart │ │ ├── sb-get-rows-using-filter.dart │ │ ├── sb-get-rows-using-table.dart │ │ ├── sb-get-rows.dart │ │ ├── sb-insert-or-update-row-by-id.dart │ │ ├── sb-insert-or-update-row-using-filter.dart │ │ ├── sb-realtime-filter.dart │ │ ├── sb-realtime.dart │ │ ├── sb-shuffle-rows.dart │ │ └── sb-update-all-rows-in-table.dart │ └── storage │ │ ├── sb-save-file-from-url.dart │ │ ├── sb-upload-any-file-type.dart │ │ ├── sb-upload-multi-any-file-type.dart │ │ └── sb-upload-raw-file.dart └── update-data-type.dart ├── Custom Functions ├── add-sub-days-to-datetime.dart ├── add-to-list.dart ├── base64-encode.dart ├── cal-distanse-between-two-locs.dart ├── chatGPTConverted.dart ├── combine-two-lists.dart ├── compare-dates.dart ├── compare-values.dart ├── convert-decimal-to-int.dart ├── convert-double-into-lat-long.dart ├── convert-img-to-str.dart ├── convert-lat-long-into-doubles.dart ├── convert-link.dart ├── convert-list-datetime-to-string.dart ├── convert-string-to-audio.dart ├── convert-string-to-double.dart ├── convert-timestamp-datetime.dart ├── count-items-in-lists.dart ├── count-items.dart ├── country-dial-code.dart ├── create-dynamic-link.dart ├── days-ago.dart ├── encode-decode-url.dart ├── explode-string.dart ├── filter-by-distance.dart ├── filter-by-location.dart ├── filter-by-name.dart ├── filter-duplicate.dart ├── filter-duplicates-random-docs.dart ├── filter-in-docs.dart ├── filter-in-single.dart ├── filter-json.dart ├── find-index-in-list.dart ├── generete-random-string.dart ├── get-avg-from-docs.dart ├── get-user-location.dart ├── if-contains.dart ├── implode-strings.dart ├── increase-num.dart ├── ints-average.dart ├── ints-count.dart ├── ints-max.dart ├── ints-min.dart ├── ints-sum.dart ├── join-list.dart ├── json-to-string-reorder.dart ├── list-does-not-contans.dart ├── one-value-from-two.dart ├── random-img.dart ├── random-item-from-list.dart ├── remove-html-tags.dart ├── reorder-list-v2.dart ├── reorder-list.dart ├── replace-text.dart ├── return-one-of-two.dart ├── shuffle-order.dart ├── sort-date-and-number.dart ├── sort-json.dart ├── sort-words-by-position.dart ├── sort-words.dart ├── split-and-trim.dart ├── split-latlng-into-doubles.dart ├── string-to-img.dart ├── time-between-two-dates.dart ├── to-lower.dart ├── truncate.dart ├── unique-list.dart ├── update-value-in-list.dart ├── valid-input-regex.dart ├── value-not-empty.dart └── word-cloud.dart ├── Custom Widgets ├── byte-to-img.dart ├── did-update-on-change.dart ├── img-local-remote.dart ├── listen-orientation-change.dart ├── local-state-from-custom-code.dart ├── my-audio-player.dart ├── re-order-list.dart └── word-cloud.dart ├── Edge Functions └── cleanup-after-date │ └── cleanup_expired_invites.ts ├── Examples ├── .DS_Store ├── camera-flip-btn.dart ├── cloudflare │ └── user-location.js ├── combine-by-date.dart ├── csv-import-clients.dart ├── filter-results.dart ├── firebase │ ├── database │ │ ├── fb-export-multi-collections-to-csv.dart │ │ ├── fb-filter-results.dart │ │ ├── fb-import-csv-json-file.dart │ │ ├── fb-sort-list.dart │ │ └── fb-update-or-insert-doc-using-filter.dart │ └── storage │ │ └── upload-original-name.dart ├── re-order-list-images.dart ├── reuse_custom_action_advanced.dart ├── reuse_custom_action_easy.dart ├── reuse_custom_widget_advanced.dart └── reuse_custom_widget_easy.dart ├── Firebase ├── Emulator │ ├── index.js │ ├── test-add-notifications.js │ └── trigger.js └── add-new-doc.js ├── Hackaton ├── 2024 │ └── old-newspaper.pdf └── .DS_Store ├── LICENSE ├── Linux App (unofficial) ├── README.md └── ff-run.sh ├── Packages ├── .DS_Store ├── audioplayers │ ├── play-sound.dart │ └── stop-sound.dart ├── call_log │ └── read-phone-log.dart ├── camera │ ├── firebase │ │ ├── fb-camera-pictures.dart │ │ └── fb-camera-videos.dart │ ├── local │ │ ├── camera_player.dart │ │ ├── local-camera-plaer.dart │ │ └── local-camera.dart │ └── supabse │ │ ├── sb-camera-pictures.dart │ │ └── sb-camera-videos.dart ├── connectivity_plus │ └── listen-connection-changes.dart ├── csv │ ├── firebase │ │ └── fb-import-csv-or-json.dart │ ├── resources │ │ ├── import.csv │ │ └── import.json │ └── supabase │ │ └── sb-import-csv-or-json.dart ├── ffmpeg │ ├── combine-videos.dart │ └── other │ │ ├── combine-videos.dart │ │ └── thumbnail.dart ├── flutter_background_service │ ├── main-action.dart │ ├── my-port-message.dart │ └── my-shared-preferences.dart ├── flutter_file_downloader │ └── download-from-url.dart ├── flutter_tts │ └── talk-to-me.dart ├── google_mlkit_barcode_scanning │ └── barcode_scanner.dart ├── html_editor_enhanced │ └── rich-text-editor.dart ├── image_gallery_saver │ ├── copy-to-gallery.dart │ ├── copy-url-to-gallery.dart │ └── save-file-to-gallery.dart ├── mailer │ └── send-email.dart ├── package_info │ └── app-version.dart ├── package_info_plus │ └── version-build.dart ├── path │ ├── copy-file-to-app-dir.dart │ ├── get-full-path.dart │ └── save-file-to-local.dart ├── pdf │ ├── firebase │ │ └── fb-pdf-generate.dart │ └── supabase │ │ └── sb-pdf-generate.dart ├── pedometer │ └── count-steps.dart ├── pusher_channels_flutter │ └── pusher-channels.dart ├── record │ ├── firebase │ │ └── fb-record-upload.dart │ └── supabase │ │ └── sb-record-upload.dart ├── screenshot │ └── widget_to_image.dart ├── sentry │ ├── error.dart │ └── setup.dart ├── speech_to_text │ └── speech-to-text.dart ├── syncfusion_flutter_calendar │ ├── calendar.dart │ └── resources │ │ └── dates.json ├── toastification │ └── notification-toast.dart ├── uni_links │ └── deep-link-ios.dart ├── usb_serial │ └── connection.dart ├── video_player │ └── player-local-remote.dart ├── video_thumbnail │ └── genereteThumbnail.dart └── web_socket_channel │ └── realtime-openai-conversation.dart ├── Paid Members ├── .DS_Store └── extract-members.js ├── Projects ├── flutterflow └── github ├── README.md ├── SQLite ├── bulgarian_football.db ├── read.sql └── update.sql ├── Source-Code ├── .DS_Store ├── cloud functions │ ├── addFcmToken │ │ ├── index.js │ │ └── package.json │ ├── initStripePayment │ │ ├── index.js │ │ └── package.json │ ├── onUserDeleted │ │ ├── index.js │ │ └── package.json │ ├── sendChatNotificationsTrigger │ │ ├── index.js │ │ └── package.json │ ├── sendPushNotificationsTrigger │ │ ├── index.js │ │ └── package.json │ └── sendScheduledPushNotifications │ │ ├── index.js │ │ └── package.json └── ff_source_code │ ├── .gitignore │ ├── .metadata │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ ├── google-services.json │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── my_project │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values-night-v31 │ │ │ │ └── styles.xml │ │ │ │ ├── values-night │ │ │ │ └── styles.xml │ │ │ │ ├── values-v31 │ │ │ │ └── styles.xml │ │ │ │ └── values │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle │ ├── assets │ ├── audios │ │ └── favicon.png │ ├── fonts │ │ └── favicon.png │ ├── images │ │ └── favicon.png │ ├── jsons │ │ └── favicon.png │ ├── lottie_animations │ │ └── favicon.png │ ├── pdfs │ │ └── favicon.png │ ├── rive_animations │ │ └── favicon.png │ └── videos │ │ └── favicon.png │ ├── firebase │ ├── firebase.json │ ├── firestore.indexes.json │ ├── firestore.rules │ ├── functions │ │ ├── api_manager.js │ │ ├── index.js │ │ └── package.json │ └── storage.rules │ ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── ImageNotification │ │ ├── Info.plist │ │ └── NotificationService.swift │ ├── Podfile │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── GoogleService-Info.plist │ │ ├── Info.plist │ │ ├── PrivacyInfo.xcprivacy │ │ ├── Runner-Bridging-Header.h │ │ └── Runner.entitlements │ ├── lib │ ├── app_state.dart │ ├── auth │ │ ├── auth_manager.dart │ │ ├── base_auth_user_provider.dart │ │ └── firebase_auth │ │ │ ├── anonymous_auth.dart │ │ │ ├── apple_auth.dart │ │ │ ├── auth_util.dart │ │ │ ├── email_auth.dart │ │ │ ├── firebase_auth_manager.dart │ │ │ ├── firebase_user_provider.dart │ │ │ ├── github_auth.dart │ │ │ ├── google_auth.dart │ │ │ └── jwt_token_auth.dart │ ├── backend │ │ ├── api_requests │ │ │ ├── api_calls.dart │ │ │ ├── api_manager.dart │ │ │ └── get_streamed_response.dart │ │ ├── backend.dart │ │ ├── cloud_functions │ │ │ └── cloud_functions.dart │ │ ├── firebase │ │ │ └── firebase_config.dart │ │ ├── firebase_storage │ │ │ └── storage.dart │ │ ├── push_notifications │ │ │ ├── push_notifications_handler.dart │ │ │ ├── push_notifications_util.dart │ │ │ └── serialization_util.dart │ │ ├── schema │ │ │ ├── firestore.indexes.json │ │ │ ├── firestore.rules │ │ │ ├── index.dart │ │ │ ├── mycollection_record.dart │ │ │ └── util │ │ │ │ ├── firestore_util.dart │ │ │ │ └── schema_util.dart │ │ └── supabase │ │ │ ├── database │ │ │ ├── database.dart │ │ │ ├── row.dart │ │ │ ├── table.dart │ │ │ └── tables │ │ │ │ └── demo.dart │ │ │ ├── storage │ │ │ └── storage.dart │ │ │ └── supabase.dart │ ├── flutter_flow │ │ ├── flutter_flow_audio_player.dart │ │ ├── flutter_flow_model.dart │ │ ├── flutter_flow_theme.dart │ │ ├── flutter_flow_util.dart │ │ ├── flutter_flow_video_player.dart │ │ ├── flutter_flow_widgets.dart │ │ ├── internationalization.dart │ │ ├── lat_lng.dart │ │ ├── nav │ │ │ ├── nav.dart │ │ │ └── serialization_util.dart │ │ ├── place.dart │ │ ├── upload_data.dart │ │ └── uploaded_file.dart │ ├── index.dart │ ├── main.dart │ └── pages │ │ ├── home_page │ │ ├── home_page_model.dart │ │ └── home_page_widget.dart │ │ └── login │ │ ├── login_model.dart │ │ └── login_widget.dart │ ├── pubspec.lock │ ├── pubspec.yaml │ ├── test │ └── widget_test.dart │ └── web │ ├── favicon.png │ ├── flutter_bootstrap.js │ ├── icons │ ├── Icon-192.png │ └── Icon-512.png │ └── index.html ├── Supabase └── Views │ └── tasks-view.sql ├── Videos ├── 230301-live.dart ├── codex-word.js ├── communityp1.dart ├── customauth.php ├── flutterflow.php ├── notifications.php └── rowy-cloud-function-tutorial.js ├── YT └── replace-desc.py ├── extract-data.py ├── gh-pages ├── .DS_Store ├── css │ └── styles.css ├── data │ └── data.json ├── js │ └── script.js └── web │ ├── index.js │ └── loading.png ├── index.html └── lib └── custom_code ├── actions └── index.dart └── widgets └── index.dart /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/.DS_Store -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: bulgariamitko 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.github/workflows/import-ff-source-code.yml: -------------------------------------------------------------------------------- 1 | name: Automated Code Export 2 | 3 | on: 4 | schedule: 5 | # This will run the job every day at 00:00 UTC 6 | - cron: '0 0 * * *' 7 | workflow_dispatch: 8 | 9 | jobs: 10 | export-code: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout Repository 15 | uses: actions/checkout@v2 16 | 17 | - name: Set up Dart 18 | uses: dart-lang/setup-dart@v1 19 | with: 20 | sdk: stable 21 | 22 | - name: Install FlutterFlow CLI 23 | run: dart pub global activate flutterflow_cli 24 | 25 | - name: Export code 26 | run: flutterflow export-code --project $PROJECT_ID --dest $OUTPUT_FOLDER --[no-]include-assets --token $TOKEN 27 | env: 28 | PROJECT_ID: ${{ secrets.PROJECT_ID }} 29 | OUTPUT_FOLDER: ${{ secrets.OUTPUT_FOLDER }} 30 | TOKEN: ${{ secrets.TOKEN }} 31 | 32 | - name: Set up Git 33 | run: | 34 | git config --global user.email "actions@github.com" 35 | git config --global user.name "GitHub Actions" 36 | 37 | - name: Commit and push 38 | run: | 39 | git add . 40 | if ! git diff --cached --quiet; then 41 | git commit -m "Add ff source code" 42 | git push 43 | else 44 | echo "No changes to commit" 45 | fi 46 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Run Python Script 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | run_script: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Set up Node.js 16 14 | uses: actions/setup-node@v2 15 | with: 16 | node-version: 16 17 | 18 | - name: Check out repository 19 | uses: actions/checkout@v2 20 | 21 | - name: Set up Python 22 | uses: actions/setup-python@v2 23 | with: 24 | python-version: 3.9 25 | 26 | - name: Install dependencies 27 | run: | 28 | python -m pip install --upgrade pip 29 | pip install google-api-python-client 30 | 31 | - name: Run Python script 32 | run: | 33 | python --version 34 | pwd 35 | ls 36 | python extract-data.py 37 | working-directory: ${{ github.workspace }} 38 | env: 39 | YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} 40 | 41 | - name: Commit and push changes 42 | run: | 43 | git config --local user.email "action@github.com" 44 | git config --local user.name "GitHub Action" 45 | git add . 46 | git commit -m "Update data.json from GitHub Action" || echo "No changes to commit" 47 | git push 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS system files 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | ._* 6 | .DocumentRevisions-V100 7 | .fseventsd 8 | .Spotlight-V100 9 | .TemporaryItems 10 | .Trashes 11 | .VolumeIcon.icns 12 | .com.apple.timemachine.donotpresent 13 | 14 | # macOS directories 15 | .AppleDB 16 | .AppleDesktop 17 | Network Trash Folder 18 | Temporary Items 19 | .apdisk 20 | 21 | # IDE - Sublime Text 22 | *.sublime-project 23 | *.sublime-workspace 24 | 25 | # IDE - VS Code 26 | *.code-workspace 27 | .vscode/ 28 | 29 | # Project specific files 30 | /Paid Members/*.csv 31 | /YT/token.json 32 | /YT/credentials.json 33 | 34 | # Node modules and logs 35 | node_modules/ 36 | npm-debug.log* 37 | yarn-debug.log* 38 | yarn-error.log* 39 | 40 | # Environment variables 41 | .env 42 | .env.local 43 | .env.development.local 44 | .env.test.local 45 | .env.production.local 46 | 47 | # Build directories 48 | dist/ 49 | build/ 50 | 51 | # Logs and databases 52 | *.log 53 | *.sqlite 54 | 55 | # Runtime data 56 | pids 57 | *.pid 58 | *.seed 59 | *.pid.lock -------------------------------------------------------------------------------- /APIs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/APIs/.DS_Store -------------------------------------------------------------------------------- /APIs/Firebase/send-push-notification: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=YcnKiZpo8ro 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | curl --request POST \ 11 | --url https://fcm.googleapis.com/fcm/send \ 12 | --header 'Authorization: key=' \ 13 | --header 'Content-Type: application/json' \ 14 | --data '{ 15 | "to":"", 16 | "notification": 17 | { 18 | "title": "", 19 | "body": "<body>", 20 | "badge": 1, 21 | "sound": "Default", 22 | "image": "<image>" 23 | } 24 | }' -------------------------------------------------------------------------------- /Apps/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Apps/.DS_Store -------------------------------------------------------------------------------- /Cloud Functions/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Cloud Functions/.DS_Store -------------------------------------------------------------------------------- /Cloud Functions/README.md: -------------------------------------------------------------------------------- 1 | # FlutterFlow Cloud Functions 2 | 3 | Welcome to the repository containing Cloud Functions codes specifically designed for integration with FlutterFlow. These functions are crafted to be deployed directly from FlutterFlow, enhancing your app's capabilities with server-side functionalities. 4 | 5 | ## Overview 6 | 7 | This repository contains a collection of Cloud Functions that can be directly deployed to Firebase and integrated into your FlutterFlow projects. Each function is standalone and serves a specific purpose, allowing for easy and flexible integration. 8 | 9 | ## Contributing 10 | 11 | Contributions to enhance or add new functions to this repository are welcome. Please follow the standard GitHub Pull Request process to submit your code. 12 | 13 | ## Support 14 | 15 | For any questions or issues, please open an issue on this GitHub repository, and we will try to address it. 16 | 17 | ## Disclaimer 18 | 19 | This code is provided "as is", without warranty of any kind. Use of this code is at your own risk. We are not responsible for any damages or losses arising from the use of this code. 20 | 21 | --- 22 | 23 | This repository is not affiliated with the official FlutterFlow development team but aims to provide community-driven support to FlutterFlow users. 24 | 25 | ## License 26 | 27 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 28 | -------------------------------------------------------------------------------- /Cloud Functions/add-random-doc/index.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | const admin = require('firebase-admin'); 3 | const { v4: uuidv4 } = require('uuid'); 4 | 5 | exports.addARandomUserData = functions.https.onRequest(async (req, res) => { 6 | // Get a random user's document reference from the 'users' collection 7 | const userRef = admin.firestore().collection('users').doc(uuidv4()); 8 | 9 | // Create a new user data object with random data 10 | const newUserData = { 11 | identifier: Math.floor(Math.random() * 1000000), 12 | myBool: Math.random() < 0.5, 13 | myDate: admin.firestore.Timestamp.now(), 14 | myRef: userRef, 15 | username: `user_${uuidv4()}`, 16 | myList: [`item1`, `item2`, `item3`], 17 | location: new admin.firestore.GeoPoint(Math.random() * (90 - (-90)) + (-90), Math.random() * (180 - (-180)) + (-180)) 18 | }; 19 | 20 | // Add the new user data to the 'usersdata' collection 21 | try { 22 | const docRef = await admin.firestore().collection('usersdata').add(newUserData); 23 | res.send(`New user data created with ID: ${docRef.id}`); 24 | } catch (error) { 25 | console.error("Error adding new user data: ", error); 26 | res.status(500).send("Error creating new user data"); 27 | } 28 | }); -------------------------------------------------------------------------------- /Cloud Functions/add-random-doc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "uuid": "^8.3.2" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/amazon-find-item/index.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const functions = require('firebase-functions'); 11 | const admin = require('firebase-admin'); 12 | const amazonPaapi = require('amazon-paapi'); 13 | 14 | exports.amazonFindItem = functions.https.onRequest(async (request, response) => { 15 | // Write your code below! 16 | 17 | // Your credentials and common parameters 18 | const commonParameters = { 19 | AccessKey: '123', 20 | SecretKey: '123', 21 | PartnerTag: '123', 22 | PartnerType: 'Associates', 23 | Marketplace: 'www.amazon.com', 24 | }; 25 | 26 | // Your request parameters 27 | const requestParameters = { 28 | Keywords: '9781491985571', 29 | Resources: ['ItemInfo.ExternalIds', 'Offers.Summaries.LowestPrice'], 30 | SearchIndex: 'All', 31 | }; 32 | 33 | const myData = await amazonPaapi.SearchItems(commonParameters, requestParameters); 34 | res.json({ items: myData.SearchResult.Items }); 35 | // Write your code above! 36 | } 37 | ); -------------------------------------------------------------------------------- /Cloud Functions/amazon-find-item/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "amazon-paapi": "^1.0.7" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/cascade-delete/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1" 11 | }, 12 | "private": true 13 | } -------------------------------------------------------------------------------- /Cloud Functions/combine-video/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@google-cloud/storage": "^5.14.0", 4 | "axios": "^0.21.1", 5 | "firebase-admin": "^9.11.0", 6 | "firebase-functions": "^3.14.1", 7 | "fluent-ffmpeg": "^2.1.2", 8 | "uuid": "^8.3.2" 9 | } 10 | } -------------------------------------------------------------------------------- /Cloud Functions/cors-error/index.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=I5zMJDnJpEU 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const functions = require('firebase-functions'); 11 | const admin = require('firebase-admin'); 12 | // To avoid deployment errors, do not call admin.initializeApp() in your code 13 | const cors = require('cors')({ origin: true }); 14 | 15 | exports.fixCorsError = functions.https.onRequest((data, res) => { 16 | cors(data, res, async () => { 17 | const userId = req.body.userId || (req.body.data && req.body.data.userId); 18 | const authUserId = req.body.authUserId || (req.body.data && req.body.data.authUserId); 19 | 20 | 21 | // add your code here 22 | }); 23 | }); -------------------------------------------------------------------------------- /Cloud Functions/cors-error/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "cors": "^2.8.5" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/create-thumbnail/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "scripts": { 5 | "serve": "firebase emulators:start --only functions", 6 | "shell": "firebase functions:shell", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "engines": { 12 | "node": "18" 13 | }, 14 | "main": "index.js", 15 | "dependencies": { 16 | "firebase-admin": "^11.8.0", 17 | "firebase-functions": "^4.3.1", 18 | "fluent-ffmpeg": "^2.1.2", 19 | "axios": "^1.3.4", 20 | "@google-cloud/storage": "^6.9.0", 21 | }, 22 | "private": true 23 | } -------------------------------------------------------------------------------- /Cloud Functions/del-docs-after-period/index.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // NEED TESTING 11 | 12 | const functions = require('firebase-functions'); 13 | const admin = require('firebase-admin'); 14 | // To avoid deployment errors, do not call admin.initializeApp() in your code 15 | 16 | exports.deleteOldDocuments = functions.pubsub.schedule('every 24 hours').timeZone('Australia/Sydney').onRun(async (context) => { 17 | const now = new Date(); 18 | const sixMonthsAgo = new Date(now.getTime() - 6 * 30 * 24 * 60 * 60 * 1000); 19 | 20 | const snapshot = await firestore.collection(collectionName) 21 | .where('created_time', '<', sixMonthsAgo) 22 | .get(); 23 | 24 | const batch = firestore.batch(); 25 | 26 | snapshot.forEach((doc) => { 27 | batch.delete(doc.ref); 28 | }); 29 | 30 | await batch.commit(); 31 | 32 | console.log(`Deleted ${snapshot.size} documents`); 33 | return null; 34 | }); -------------------------------------------------------------------------------- /Cloud Functions/del-docs-after-period/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/del-user-as-admin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "cors": "^2.8.5" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/execute-api-update-doc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "axios": "^1.6.2" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/get-users-uids/index.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const functions = require('firebase-functions'); 11 | const admin = require('firebase-admin'); 12 | 13 | exports.getUserUIDs = functions.https.onRequest(async (request, response) => { 14 | try { 15 | const allUserUIDs = []; 16 | let nextPageToken; 17 | 18 | do { 19 | const listUsersResult = await admin.auth().listUsers(1000, nextPageToken); 20 | 21 | listUsersResult.users.forEach((userRecord) => { 22 | allUserUIDs.push(userRecord.uid); 23 | }); 24 | 25 | nextPageToken = listUsersResult.pageToken; 26 | } while (nextPageToken); 27 | 28 | response.status(200).send(allUserUIDs); 29 | } catch (error) { 30 | console.error('Error fetching user data:', error); 31 | response.status(500).send('Error fetching user data'); 32 | } 33 | }); 34 | -------------------------------------------------------------------------------- /Cloud Functions/get-users-uids/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/hello-world/index.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=zVc4UuIT6Gk 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const functions = require('firebase-functions'); 11 | const admin = require('firebase-admin'); 12 | // To avoid deployment errors, do not call admin.initializeApp() in your code 13 | 14 | exports.helloWorld = functions.https.onRequest((request, response) => { 15 | response.send("Hello from Firebase!"); 16 | }); -------------------------------------------------------------------------------- /Cloud Functions/hello-world/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/password-reset/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "express": "^4.18.2", 12 | "url": "^0.11.3" 13 | }, 14 | "private": true 15 | } -------------------------------------------------------------------------------- /Cloud Functions/schedule-notifications/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "cron": "^3.1.6", 12 | "cron-parser": "^4.9.0", 13 | "moment": "^2.29.4" 14 | }, 15 | "private": true 16 | } -------------------------------------------------------------------------------- /Cloud Functions/shopify/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "@shopify/shopify-api": "^11.1.0", 12 | "express": "^4.18.2" 13 | }, 14 | "private": true 15 | } -------------------------------------------------------------------------------- /Cloud Functions/social-media/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "node-fetch": "^3.3.2" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/spotify-oauth/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "express": "^4.18.2" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/spotify-web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "axios": "^1.6.7", 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /Cloud Functions/stripe-sub-webhook/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "scripts": { 5 | "serve": "firebase emulators:start --only functions", 6 | "shell": "firebase functions:shell", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "engines": { 12 | "node": "16" 13 | }, 14 | "main": "index.js", 15 | "dependencies": { 16 | "firebase-admin": "^11.10.1", 17 | "firebase-functions": "^4.5.0", 18 | "express": "^4.18.2", 19 | "stripe": "^14.7.0" 20 | }, 21 | "devDependencies": { 22 | "firebase-functions-test": "^3.0.0" 23 | }, 24 | "private": true 25 | } -------------------------------------------------------------------------------- /Cloud Functions/thumbnail/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "fluent-ffmpeg": "^2.1.2", 12 | "axios": "^1.3.4", 13 | "@google-cloud/storage": "^6.9.0", 14 | "cors": "^2.8.5" 15 | }, 16 | "private": true 17 | } -------------------------------------------------------------------------------- /Cloud Functions/welcome-email/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Firebase Custom Cloud Functions", 4 | "engines": { 5 | "node": "18" 6 | }, 7 | "main": "index.js", 8 | "dependencies": { 9 | "firebase-admin": "^11.8.0", 10 | "firebase-functions": "^4.3.1", 11 | "nodemailer": "^6.9.7" 12 | }, 13 | "private": true 14 | } -------------------------------------------------------------------------------- /CloudFlare/Country/fetch-country.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://youtu.be/Y82DsIHiPNI 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:http/http.dart' as http; 11 | 12 | Future<dynamic> fetchCountry() async { 13 | final response = await http 14 | .get(Uri.parse('https://location-country.bulgaria-mitko.workers.dev/')); 15 | 16 | dynamic data = {'country': 'no location'}; 17 | 18 | if (response.statusCode == 200) { 19 | // If server returns an OK response, parse the JSON 20 | data = jsonDecode(response.body); 21 | } 22 | 23 | return data; 24 | } 25 | -------------------------------------------------------------------------------- /CloudFlare/R2-upload-files/curl: -------------------------------------------------------------------------------- 1 | curl --request POST \ 2 | --url https://YOUR_WORKER_URL.workers.dev/ \ 3 | --header 'content-type: multipart/form-data' \ 4 | --form file=@/path/to/your/file.png -------------------------------------------------------------------------------- /Custom Actions/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Custom Actions/.DS_Store -------------------------------------------------------------------------------- /Custom Actions/close-tab.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:flutter/foundation.dart' show kIsWeb; 11 | import 'package:flutter/services.dart' show SystemNavigator; 12 | import 'dart:html' as html; 13 | 14 | Future<void> closeTab() async { 15 | if (Navigator.canPop(context)) { 16 | Navigator.pop(context); 17 | } else { 18 | // For web platform 19 | if (kIsWeb) { 20 | // Using js interop to close browser tab 21 | html.window.close(); 22 | } else { 23 | SystemNavigator.pop(); // For mobile platforms 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Custom Actions/convert-datatype-to-json.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Note: This code can be used as a custom function as well 11 | 12 | Future<List<dynamic>> convertDataToJson(List<UserStruct>? data) async { 13 | // Null safety 14 | data ??= []; 15 | 16 | List<dynamic> users = []; 17 | for (UserStruct userData in data) { 18 | final CompanyStruct company = userData.company; 19 | final double lat = userData.location!.latitude; 20 | final double lng = userData.location!.longitude; 21 | 22 | // Create a Map (JSON format) representing the user 23 | final userJson = { 24 | 'company': {'name': company.name}, 25 | 'email': userData.email, 26 | 'location': {'lat': lat, 'lng': lng}, 27 | 'name': userData.name, 28 | 'phone': userData.phone, 29 | 'username': userData.username, 30 | }; 31 | 32 | users.add(userJson); 33 | } 34 | 35 | return users; 36 | } 37 | -------------------------------------------------------------------------------- /Custom Actions/convert-json-to-datatype.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Note: This code can be used as a custom function as well 11 | 12 | Future<List<UserStruct>> convertJSONtoDT(List<dynamic>? data) async { 13 | // null safety 14 | data ??= []; 15 | 16 | List<UserStruct> users = []; 17 | for (dynamic userData in data) { 18 | final dynamic address = userData['address']; 19 | final double lat = double.parse(address['geo']['lat']); 20 | final double lng = double.parse(address['geo']['lng']); 21 | 22 | final company = CompanyStruct(name: userData['company']['name']); 23 | final user = UserStruct( 24 | company: company, 25 | email: userData['email'], 26 | location: LatLng(lat, lng), 27 | name: userData['name'], 28 | phone: userData['phone'], 29 | username: userData['username'], 30 | ); 31 | 32 | users.add(user); 33 | } 34 | 35 | return users; 36 | } 37 | -------------------------------------------------------------------------------- /Custom Actions/convert-json-to-doc.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=sauJPpZZ1G0 3 | // replace - [{"Collection name": "Cars"}, {"Field name 1": "name"}, {"Field name 2": "brand"}] 4 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 5 | // Support my work - https://github.com/sponsors/bulgariamitko 6 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 7 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 8 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 9 | // Discord channel - https://discord.gg/G69hSUqEeU 10 | 11 | List<CarsRecord> convertJSONToDoc(List<dynamic>? jsonList) { 12 | /// MODIFY CODE ONLY BELOW THIS LINE 13 | 14 | jsonList ??= []; 15 | return jsonList.map((json) { 16 | final data = createCarsRecordData( 17 | name: json['name'] as String?, 18 | brand: json['brand'] as String?, 19 | doors: json['doors'] as int?, 20 | ); 21 | 22 | // Assuming you have a way to get a DocumentReference for a new document 23 | final docRef = FirebaseFirestore.instance.collection('cars').doc(); 24 | 25 | // Create a new CarsRecord with the data and reference 26 | return CarsRecord.getDocumentFromData(data, docRef); 27 | }).toList(); 28 | 29 | /// MODIFY CODE ONLY ABOVE THIS LINE 30 | } 31 | -------------------------------------------------------------------------------- /Custom Actions/custom app state/get-custom-app-state.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=ZmWEXE2DziQ 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:whats_new2/custom_code/actions/custom_app_state.dart'; 11 | 12 | Future<List<UsersRecord>> getCustomAppState() async { 13 | // Use the global instance to set the users list 14 | 15 | return appState.usersList; 16 | } 17 | -------------------------------------------------------------------------------- /Custom Actions/custom app state/set-custom-app-state.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=ZmWEXE2DziQ 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:whats_new2/custom_code/actions/custom_app_state.dart'; 11 | 12 | Future setCustomAppState(List<UsersRecord> data) async { 13 | // Use the global instance to set the users list 14 | appState.usersList = data; 15 | } 16 | -------------------------------------------------------------------------------- /Custom Actions/delete-local-file.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:io'; 11 | 12 | Future<void> deleteFile(String? filePath) async { 13 | filePath ??= ''; 14 | 15 | print('deleteFile'); 16 | 17 | try { 18 | final file = File(filePath); 19 | 20 | if (await file.exists()) { 21 | await file.delete(); 22 | print('File deleted successfully'); 23 | } else { 24 | print('File does not exist'); 25 | } 26 | } catch (e) { 27 | print('Error deleting file: $e'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Custom Actions/firebase/auth/fb-auth-provider.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=IwhSbx1yN1M 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | // source - https://community.flutterflow.io/authentication/post/check-if-user-use-google-auth-F1kIWPgHITtPz9w 10 | 11 | import 'package:firebase_auth/firebase_auth.dart'; 12 | 13 | String? getUserSignInMethod() { 14 | final user = FirebaseAuth.instance.currentUser; 15 | String? signInMethod = null; 16 | for (var info in user!.providerData) { 17 | signInMethod = info.providerId; 18 | } 19 | return signInMethod; 20 | } 21 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-batch-delete-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=IwhSbx1yN1M 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future batchDelete(String? collectionName) async { 11 | collectionName = collectionName ?? ''; 12 | 13 | // Get a reference to the Firestore database 14 | final firestore = FirebaseFirestore.instance; 15 | 16 | // Get a reference to the collection 17 | final collectionRef = firestore.collection(collectionName); 18 | 19 | // Get a list of all the documents in the collection 20 | final QuerySnapshot snapshot = await collectionRef.get(); 21 | 22 | // Delete each document in the collection 23 | snapshot.docs.forEach((document) async { 24 | await document.reference.delete(); 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-duplicate-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=sCS3MfRuEUY 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<void> duplicateDocuments( 11 | String? collectionName, List<DocumentReference>? documentIds) async { 12 | // null safety 13 | collectionName ??= 'users'; 14 | documentIds ??= []; 15 | 16 | final batch = FirebaseFirestore.instance.batch(); 17 | 18 | // Query for the documents to be duplicated 19 | final querySnapshot = await FirebaseFirestore.instance 20 | .collection(collectionName) 21 | .where(FieldPath.documentId, 22 | whereIn: documentIds.map((docRef) => docRef.id).toList()) 23 | .get(); 24 | 25 | // Create a new document for each of the documents to be duplicated 26 | for (final doc in querySnapshot.docs) { 27 | batch.set(FirebaseFirestore.instance.collection(collectionName).doc(), 28 | doc.data()); 29 | } 30 | 31 | // Commit the batch 32 | await batch.commit(); 33 | } 34 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-get-doc.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=HtvtwLmaI0w 3 | // widgets - Cg9Db2x1bW5faTEyYXd6dWESWgoNVGV4dF9iZ2U5cGowOBgCIkUSJwoLSGVsbG8gV29ybGQRAAAAAAAANkBABnoKEgh3NjQxOGtzMagBAJoBFgoCAgEqEAgMQgwiCgoGCgRuYW1lEAH6AwBiABKnAQoNVGV4dF92cDBzZGYxMxgCIlMSHgoLSGVsbG8gV29ybGRABnoKEghxcHhpd3VybqgBAJoBKAoCAgEqIggEEg1UZXh0X3ZwMHNkZjEzQgISAEoLggEICgYKBG5hbWX6AwDyBAIKAFI9CgwQBxoGCgRjYXJzIAAaLQoGCgRjYXJzGiMIAxIRU2NhZmZvbGRfaDA2OGY3YjhCDDIKCggKBmRvY1JlZmIAGAQiBSIA+gMA 4 | // replace - [{"Collection name": "Cars"}] 5 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 6 | // Support my work - https://github.com/sponsors/bulgariamitko 7 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 8 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 9 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 10 | // Discord channel - https://discord.gg/G69hSUqEeU 11 | 12 | // IMPORTANT you no longer need to use this custom code, more info - https://www.youtube.com/watch?v=yGggMqY0peY 13 | 14 | Future<CarsRecord> getDoc(DocumentReference docRef) async { 15 | return CarsRecord.getDocumentOnce(docRef); 16 | } 17 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-get-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=HtvtwLmaI0w 3 | // widgets - Cg9Db2x1bW5fdmZ3aGF4YjgSYQoNVGV4dF94ajhtNTcyMhgCIkwSJwoLSGVsbG8gV29ybGQRAAAAAAAANkBABnoKEghpc2w3eDhtOagBAJoBHQoCAgEqFwgGEg9Db2x1bW5fdmZ3aGF4YjhCAioA+gMAYgAYBCIFIgD6AwBqIQoHCgVicmFuZBIWCAxCEiIQCgwKCmJyYW5kTmFtZXMQAQ== 4 | // replace - [{"Collection name": "Cars"}] 5 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 6 | // Support my work - https://github.com/sponsors/bulgariamitko 7 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 8 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 9 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 10 | // Discord channel - https://discord.gg/G69hSUqEeU 11 | 12 | Future<List<CarsRecord>> getDocs(List<DocumentReference> docRefs) async { 13 | List<CarsRecord> docs = []; 14 | 15 | // Iterate through the list of document references 16 | for (var docRef in docRefs) { 17 | // Get the document from the specified collection 18 | CarsRecord docToAdd = await CarsRecord.getDocumentOnce(docRef); 19 | 20 | // Add the document to the list 21 | docs.add(docToAdd); 22 | 23 | // Add Doc to Local State 24 | // FFAppState().update(() { 25 | // FFAppState().brandNames.add(docToAdd.brand ?? ''); 26 | // }); 27 | } 28 | 29 | return docs; 30 | } 31 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-get-random-doc.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=HtvtwLmaI0w 3 | // widgets - Cg9Db2x1bW5faTEyYXd6dWESWgoNVGV4dF9iZ2U5cGowOBgCIkUSJwoLSGVsbG8gV29ybGQRAAAAAAAANkBABnoKEgh3NjQxOGtzMagBAJoBFgoCAgEqEAgMQgwiCgoGCgRuYW1lEAH6AwBiABKnAQoNVGV4dF92cDBzZGYxMxgCIlMSHgoLSGVsbG8gV29ybGRABnoKEghxcHhpd3VybqgBAJoBKAoCAgEqIggEEg1UZXh0X3ZwMHNkZjEzQgISAEoLggEICgYKBG5hbWX6AwDyBAIKAFI9CgwQBxoGCgRjYXJzIAAaLQoGCgRjYXJzGiMIAxIRU2NhZmZvbGRfaDA2OGY3YjhCDDIKCggKBmRvY1JlZmIAGAQiBSIA+gMA 4 | // replace - [{"Collection name": "Car"}] 5 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 6 | // Support my work - https://github.com/sponsors/bulgariamitko 7 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 8 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 9 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 10 | // Discord channel - https://discord.gg/G69hSUqEeU 11 | 12 | import 'dart:math'; 13 | 14 | Future<CarsRecord> getRandomDoc(List<DocumentReference> docRefs) async { 15 | int randomIndex = Random().nextInt(docRefs.length); 16 | CarsRecord randomDoc = await CarsRecord.getDocumentOnce(docRefs[randomIndex]); 17 | 18 | return randomDoc; 19 | } 20 | -------------------------------------------------------------------------------- /Custom Actions/firebase/database/fb-shuffle-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=f3enSdgZ6oU 3 | // new video - https://www.youtube.com/watch?v=48D3V9JOvlU 4 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 5 | // Support my work - https://github.com/sponsors/bulgariamitko 6 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 7 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 8 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 9 | // Discord channel - https://discord.gg/G69hSUqEeU 10 | 11 | import 'dart:math'; 12 | 13 | Future shuffleNames(List<ShuffingRecord>? users) async { 14 | // null safety 15 | users = users ?? []; 16 | 17 | int randomIndex = Random().nextInt(users.length); 18 | FFAppState().update(() { 19 | FFAppState().shuffleNames = users![randomIndex].name ?? ''; 20 | FFAppState().winnerRef = users[randomIndex].reference; 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /Custom Actions/firebase/messaging/fb-get-fcm-token.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=YcnKiZpo8ro 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:firebase_messaging/firebase_messaging.dart'; 11 | 12 | Future<String?> getFCM() async { 13 | final FirebaseMessaging fcm = FirebaseMessaging.instance; 14 | String token = await fcm.getToken() ?? ''; 15 | 16 | return token; 17 | } 18 | -------------------------------------------------------------------------------- /Custom Actions/get-url-params.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=EwGeOgSjEsM 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:html'; 11 | 12 | Future getPageParamas( 13 | String? param1, 14 | String? param2, 15 | ) async { 16 | // null safety 17 | param1 ??= ''; 18 | param2 ??= ''; 19 | 20 | // Get the current URL 21 | String currentUrl = window.location.href; 22 | 23 | // Parse the URL 24 | Uri uri = Uri.parse(currentUrl); 25 | 26 | // Get individual parameter values 27 | FFAppState().authCode = uri.queryParameters[param1] ?? ''; 28 | FFAppState().score = uri.queryParameters[param2] ?? ''; 29 | } 30 | -------------------------------------------------------------------------------- /Custom Actions/hide-keyboard.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future hideKeyboard() async { 11 | // This will hide the keyboard by removing focus from the current input field 12 | FocusScope.of(context).unfocus(); 13 | } 14 | -------------------------------------------------------------------------------- /Custom Actions/supabase/auth/sb-create-user.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import '../../auth/supabase_auth/auth_util.dart'; 11 | 12 | Future authCreateUser( 13 | BuildContext context, 14 | String? email, 15 | String? password, 16 | ) async { 17 | // null safety 18 | email ??= ''; 19 | password ??= ''; 20 | 21 | final user = await authManager.createAccountWithEmail( 22 | context, 23 | email, 24 | password, 25 | ); 26 | 27 | print(user); 28 | 29 | // return user; 30 | } 31 | -------------------------------------------------------------------------------- /Custom Actions/supabase/auth/sb-login-user.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import '../../auth/supabase_auth/auth_util.dart'; 11 | 12 | Future authLoginUser( 13 | BuildContext context, 14 | String? email, 15 | String? password, 16 | ) async { 17 | // null safety 18 | email ??= ''; 19 | password ??= ''; 20 | 21 | final user = await authManager.signInWithEmail( 22 | context, 23 | email, 24 | password, 25 | ); 26 | 27 | print(user); 28 | 29 | // return user; 30 | } 31 | -------------------------------------------------------------------------------- /Custom Actions/supabase/auth/sb-user-data.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import '../../auth/supabase_auth/auth_util.dart'; 11 | 12 | Future authUserData() async { 13 | FFAppState().update(() { 14 | FFAppState().userId = currentUserUid; 15 | FFAppState().email = currentUserEmail; 16 | FFAppState().jwtToken = currentJwtToken; 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /Custom Actions/supabase/cloud functions/execute-cloud-function.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future executeCloudFunction( 11 | String? paramName1, 12 | String? paramName2, 13 | String? paramValue1, 14 | String? paramValue2, 15 | ) async { 16 | // null safety 17 | paramName1 ??= 'error'; 18 | paramName2 ??= 'error'; 19 | paramValue1 ??= 'error'; 20 | paramValue2 ??= 'error'; 21 | 22 | final supabase = SupaFlow.client; 23 | 24 | final String rpcName = 'function_name'; 25 | final Map<String, dynamic> rpcParams = { 26 | paramName1: paramValue1, 27 | paramName2: paramValue2, 28 | }; 29 | 30 | final response = await supabase.rpc(rpcName, params: rpcParams); 31 | } 32 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-batch-delete-rows.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 5 | // Support my work - https://github.com/sponsors/bulgariamitko 6 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 7 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 8 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 9 | // Discord channel - https://discord.gg/G69hSUqEeU 10 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 11 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 12 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 13 | // Discord channel - https://discord.gg/G69hSUqEeU 14 | 15 | // You don't need any custom code for Supabase you can do it with a build-in action in FF -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-batch-insert-rows.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<VideosRow>> batchInsertRows( 11 | String? fieldName1, 12 | String? fieldName2, 13 | String? fieldName3, 14 | List<String>? fieldValue1, 15 | List<int>? fieldValue2, 16 | List<String>? fieldValue3, 17 | ) async { 18 | // null check 19 | fieldName1 ??= 'error'; 20 | fieldName2 ??= 'error'; 21 | fieldName3 ??= 'error'; 22 | fieldValue1 ??= []; 23 | fieldValue2 ??= []; 24 | fieldValue3 ??= []; 25 | 26 | List<VideosRow> videos = []; 27 | 28 | for (int i = 0; i < fieldValue1.length; i++) { 29 | VideosRow video = await VideosTable().insert({ 30 | fieldName1: fieldValue1[i], 31 | fieldName2: fieldValue2[i], 32 | fieldName3: fieldValue3[i], 33 | }); 34 | 35 | videos.add(video); 36 | } 37 | 38 | return videos; 39 | } 40 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-duplicate-rows.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<VideosRow>> duplicateRows( 11 | String? searchField, 12 | String? searchValue, 13 | ) async { 14 | // null safety 15 | searchField ??= ''; 16 | searchValue ??= ''; 17 | 18 | List<VideosRow> result = []; 19 | 20 | List<VideosRow> videos = await VideosTable().queryRows( 21 | queryFn: (q) => q.eq( 22 | searchField ?? '', 23 | searchValue, 24 | ), 25 | ); 26 | 27 | if (videos.length != 0) { 28 | for (int i = 0; i < videos.length; i++) { 29 | VideosRow createdVideo = await VideosTable().insert({ 30 | 'title': videos[i].title, 31 | 'url': videos[i].url, 32 | 'likes': videos[i].likes, 33 | }); 34 | 35 | result.add(createdVideo); 36 | } 37 | } 38 | 39 | return result; 40 | } 41 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-random-row.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:math'; 11 | 12 | Future<VideosRow> getRandomRow() async { 13 | List<VideosRow> videos = await VideosTable().queryRows(queryFn: (q) => q); 14 | 15 | // Generate a random index within the range of available rows 16 | final random = Random(); 17 | final randomIndex = random.nextInt(videos.length); 18 | 19 | // Retrieve the random row 20 | return videos[randomIndex]; 21 | } 22 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-row-by-id.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // replace - [{"Collection name": "Cars"}] 4 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 5 | // Support my work - https://github.com/sponsors/bulgariamitko 6 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 7 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 8 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 9 | // Discord channel - https://discord.gg/G69hSUqEeU 10 | 11 | Future<VideosRow> getRowById( 12 | String? idValue, 13 | ) async { 14 | // null check 15 | idValue ??= 'error'; 16 | 17 | List<VideosRow> videos = await VideosTable().queryRows( 18 | queryFn: (q) => q.eq( 19 | 'id', 20 | idValue, 21 | )); 22 | 23 | return videos[0]; 24 | } 25 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-row.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<VideosRow> getRow( 11 | String? searchField, 12 | String? searchValue, 13 | ) async { 14 | // null check 15 | searchField ??= 'error'; 16 | searchValue ??= 'error'; 17 | 18 | List<VideosRow> videos = await VideosTable().queryRows( 19 | queryFn: (q) => q.eq( 20 | searchField ?? '', 21 | searchValue, 22 | )); 23 | 24 | return videos[0]; 25 | } 26 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-rows-using-filter.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<VideosRow>> getRowsUsingFilter( 11 | String? searchField, 12 | String? searchValue, 13 | ) async { 14 | // null check 15 | searchField ??= 'error'; 16 | searchValue ??= 'error'; 17 | 18 | List<VideosRow> videos = await VideosTable().queryRows( 19 | queryFn: (q) => q.eq( 20 | searchField ?? '', 21 | searchValue, 22 | )); 23 | 24 | return videos; 25 | } 26 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-rows-using-table.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<VideosRow>> getRowsUsingTable() async { 11 | List<VideosRow> videos = await VideosTable().queryRows(queryFn: (q) => q); 12 | 13 | return videos; 14 | } 15 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-get-rows.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<VideosRow>> getRow( 11 | String? searchField, 12 | String? searchValue, 13 | ) async { 14 | // null check 15 | searchField ??= 'error'; 16 | searchValue ??= 'error'; 17 | 18 | List<VideosRow> videos = await VideosTable().queryRows( 19 | queryFn: (q) => q.eq( 20 | searchField ?? '', 21 | searchValue, 22 | )); 23 | 24 | return videos; 25 | } 26 | -------------------------------------------------------------------------------- /Custom Actions/supabase/database/sb-shuffle-rows.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y 3 | // new video - https://www.youtube.com/watch?v=48D3V9JOvlU 4 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 5 | // Support my work - https://github.com/sponsors/bulgariamitko 6 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 7 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 8 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 9 | // Discord channel - https://discord.gg/G69hSUqEeU 10 | 11 | import 'dart:math'; 12 | 13 | Future<List<VideosRow>> shuffledRows() async { 14 | List<VideosRow> videos = await VideosTable().queryRows(queryFn: (q) => q); 15 | 16 | // Shuffle the list of videos. 17 | final random = Random(); 18 | videos.shuffle(random); 19 | 20 | return videos; 21 | } 22 | -------------------------------------------------------------------------------- /Custom Actions/supabase/storage/sb-upload-any-file-type.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // NOTE! You do not need a custom code for that anymore using FF native actions. Use that code ONLY if you want to restrict your users from uploading a spefici type/s of files -------------------------------------------------------------------------------- /Custom Actions/supabase/storage/sb-upload-raw-file.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=0_TIH7xT5_Y&t=1s 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:convert'; 11 | import '../../flutter_flow/upload_data.dart'; 12 | import '../../backend/supabase/storage/storage.dart'; 13 | 14 | Future uploadRawFileToSB( 15 | String? bytes, String? bucket, String? fullFilePath) async { 16 | // null safety 17 | bytes ??= ''; 18 | bucket ??= 'error'; 19 | fullFilePath ??= 'error'; 20 | 21 | SelectedFile selectedFile = SelectedFile( 22 | storagePath: fullFilePath, bytes: Uint8List.fromList(utf8.encode(bytes))); 23 | 24 | final String downloadUrl = await uploadSupabaseStorageFile( 25 | bucketName: bucket, selectedFile: selectedFile); 26 | 27 | FFAppState().update(() { 28 | FFAppState().filePath = downloadUrl; 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /Custom Functions/add-sub-days-to-datetime.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | DateTime addDaysToDateTime( 11 | int? days, 12 | DateTime? currentDT, 13 | bool? isAddition, 14 | ) { 15 | /// MODIFY CODE ONLY BELOW THIS LINE 16 | 17 | // null safety 18 | 19 | days ??= 0; 20 | currentDT ??= DateTime.now(); 21 | isAddition ??= true; 22 | 23 | // Determine whether to add or subtract days 24 | if (isAddition) { 25 | // Add days 26 | return currentDT.add(Duration(days: days)); 27 | } else { 28 | // Subtract days 29 | return currentDT.subtract(Duration(days: days)); 30 | } 31 | 32 | /// MODIFY CODE ONLY ABOVE THIS LINE 33 | } 34 | -------------------------------------------------------------------------------- /Custom Functions/add-to-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String>? addToList( 11 | String? value, 12 | List<String>? originalList, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | value ??= ''; 18 | originalList ??= []; 19 | 20 | originalList.add(value); 21 | return originalList; 22 | 23 | /// MODIFY CODE ONLY ABOVE THIS LINE 24 | } 25 | -------------------------------------------------------------------------------- /Custom Functions/base64-encode.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? toBase64(String? input) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | input ??= ''; 15 | 16 | var bytes = utf8.encode(input); 17 | return base64.encode(bytes); 18 | 19 | /// MODIFY CODE ONLY ABOVE THIS LINE 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/chatGPTConverted.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=kcqrHDqpmoo 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | dynamic chatGPTConverter(String? message) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | message ??= ''; 15 | 16 | List<dynamic> result = []; 17 | 18 | // add the role 19 | result.add({"role": "user", "content": message}); 20 | print(result); 21 | return result; 22 | 23 | /// MODIFY CODE ONLY ABOVE THIS LINE 24 | } 25 | -------------------------------------------------------------------------------- /Custom Functions/combine-two-lists.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> combineLists(List<String> list1, List<String> list2) { 11 | List<String> combinedList = []; 12 | 13 | // Add all elements from the first list 14 | combinedList.addAll(list1); 15 | 16 | // Add all elements from the second list 17 | combinedList.addAll(list2); 18 | 19 | return combinedList; 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/compare-dates.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool? compareDates( 11 | DateTime? todayDate, 12 | DateTime? expireDate, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | todayDate ??= DateTime.now(); 18 | expireDate ??= DateTime.now(); 19 | 20 | bool subExpired = false; 21 | if (todayDate.isBefore(expireDate)) { 22 | subExpired = true; 23 | } 24 | 25 | return subExpired; 26 | 27 | /// MODIFY CODE ONLY ABOVE THIS LINE 28 | } 29 | -------------------------------------------------------------------------------- /Custom Functions/compare-values.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool compareValues( 11 | String? value1, 12 | String? value2, 13 | ) { 14 | if (value1 == value2) { 15 | return true; 16 | } else { 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/convert-decimal-to-int.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | int convertDecimalToInteger(double? value) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | value ??= 0.0; 15 | 16 | return value.toInt(); 17 | 18 | /// MODIFY CODE ONLY ABOVE THIS LINE 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/convert-double-into-lat-long.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | LatLng converDoubleToLatLong( 11 | double? lat, 12 | double? long, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | lat ??= 0.0; 18 | long ??= 0.0; 19 | 20 | return LatLng(lat, long); 21 | 22 | /// MODIFY CODE ONLY ABOVE THIS LINE 23 | } 24 | -------------------------------------------------------------------------------- /Custom Functions/convert-img-to-str.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String convertImgToStr(String? data) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | data ??= ''; 15 | 16 | return data; 17 | 18 | /// MODIFY CODE ONLY ABOVE THIS LINE 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/convert-lat-long-into-doubles.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<double> convertLatLongToDouble(LatLng? location) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | location ??= LatLng(0.0, 0.0); 15 | 16 | return [location.latitude, location.longitude]; 17 | 18 | /// MODIFY CODE ONLY ABOVE THIS LINE 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/convert-link.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String covertLink(String? link) { 11 | link = link ?? ''; 12 | 13 | String decoded = Uri.decodeFull(link); 14 | decoded = decoded.replaceAll(' ', '%20'); 15 | decoded = decoded.replaceAll('…', '%20'); 16 | decoded = decoded.replaceAll('...', '%20'); 17 | 18 | return decoded; 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/convert-list-datetime-to-string.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String>? convertDateTimesToStrings( 11 | List<DateTime>? dateTimes, 12 | String? format, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | dateTimes ??= []; 18 | format ??= 'yyyy-MM-dd'; 19 | 20 | List<String> dateStrings = []; 21 | 22 | for (DateTime dateTime in dateTimes) { 23 | String dateString = dateTime.toIso8601String().substring(0, format.length); 24 | dateStrings.add(dateString); 25 | } 26 | 27 | return dateStrings; 28 | 29 | /// MODIFY CODE ONLY ABOVE THIS LINE 30 | } 31 | -------------------------------------------------------------------------------- /Custom Functions/convert-string-to-audio.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String convertStrToAudio(String value) { 11 | return value; 12 | } 13 | -------------------------------------------------------------------------------- /Custom Functions/convert-string-to-double.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | double convertStrToDouble(String value) { 11 | var output = double.parse(value); 12 | return output; 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/convert-timestamp-datetime.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=idXHYU0co5Y 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | DateTime convertTimestampIntoDateTime(String timestampDate) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // Parse the timestamp string as milliseconds since epoch 14 | int timestamp = int.parse(timestampDate); 15 | 16 | // Convert milliseconds to DateTime object 17 | return DateTime.fromMillisecondsSinceEpoch(timestamp); 18 | 19 | /// MODIFY CODE ONLY ABOVE THIS LINE 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/count-items-in-lists.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | int? newNoticeCount( 11 | List<String>? recipientList, 12 | List<String>? readerList, 13 | String? uid, 14 | ) { 15 | /// MODIFY CODE ONLY BELOW THIS LINE 16 | 17 | var uidDocumentsInRecipientList = 18 | recipientList?.where((doc) => doc.contains(uid ?? '')); 19 | var uidDocumentsInReaderList = 20 | readerList?.where((doc) => doc.contains(uid ?? '')); 21 | 22 | // count the number of documents in each list and return the sum 23 | var count1 = uidDocumentsInRecipientList?.length ?? 0; 24 | var count2 = uidDocumentsInReaderList?.length ?? 0; 25 | return count1 + count2; 26 | 27 | /// MODIFY CODE ONLY ABOVE THIS LINE 28 | } 29 | -------------------------------------------------------------------------------- /Custom Functions/count-items.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | int countItems(List<dynamic>? data) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | data ??= []; 14 | 15 | return data.length; 16 | 17 | /// MODIFY CODE ONLY ABOVE THIS LINE 18 | } 19 | -------------------------------------------------------------------------------- /Custom Functions/days-ago.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String daysAgo(DateTime? dateValue) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | dateValue ??= DateTime.now(); 14 | 15 | final today = DateTime.now(); 16 | final difference = today.difference(dateValue).inDays; 17 | 18 | if (difference == 0) { 19 | return 'Today'; 20 | } else if (difference == 1) { 21 | return '$difference day'; 22 | } else { 23 | return '$difference days'; 24 | } 25 | 26 | /// MODIFY CODE ONLY ABOVE THIS LINE 27 | } 28 | -------------------------------------------------------------------------------- /Custom Functions/encode-decode-url.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? encodeURL(String? url, bool? encode) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | url ??= ''; 15 | encode ??= true; 16 | 17 | return encode ? Uri.encodeComponent(url) : Uri.decodeComponent(url); 18 | 19 | /// MODIFY CODE ONLY ABOVE THIS LINE 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/explode-string.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> explodeString(String? data, String? delimiter) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | data ??= ''; 15 | delimiter ??= ','; 16 | 17 | final parts = data.split(delimiter); 18 | final trimmedParts = parts.map((part) => part.trim()).toList(); 19 | 20 | return trimmedParts; 21 | 22 | /// MODIFY CODE ONLY ABOVE THIS LINE 23 | } 24 | -------------------------------------------------------------------------------- /Custom Functions/filter-by-name.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<CarsRecord> filterByName( 11 | List<CarsRecord>? data, 12 | String? searchName, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | data ??= []; 18 | // Ensure that the searchName is not null and convert it to lowercase. 19 | final searchNameLower = searchName?.toLowerCase() ?? ''; 20 | 21 | List<CarsRecord> filteredData = []; 22 | 23 | for (var d in data) { 24 | if (d.name.toLowerCase().contains(searchNameLower)) { 25 | filteredData.add(d); 26 | 27 | print(['FILTERED', d.name]); 28 | } 29 | } 30 | 31 | return filteredData; 32 | 33 | /// MODIFY CODE ONLY ABOVE THIS LINE 34 | } 35 | -------------------------------------------------------------------------------- /Custom Functions/filter-duplicate.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> filterDuplicates(List<String>? input) { 11 | input = input ?? []; 12 | 13 | return input.toSet().toList(); 14 | } 15 | -------------------------------------------------------------------------------- /Custom Functions/filter-duplicates-random-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | UsersRecord? shuffleUsers(List<UsersRecord>? allUsers) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // remove docs duplicats based on the email field and retun a random doc 14 | 15 | // null safety 16 | allUsers ??= []; 17 | 18 | // Using a Map to store unique users by their email. 19 | final uniqueUsersMap = <String, UsersRecord>{}; 20 | 21 | for (var user in allUsers) { 22 | if (user.winner == false) { 23 | uniqueUsersMap[user.email] = user; 24 | } 25 | } 26 | 27 | // Convert the Map back to a List. 28 | final uniqueUsers = uniqueUsersMap.values.toList(); 29 | 30 | // random index 31 | int randomIndex = math.Random().nextInt(uniqueUsers.length); 32 | 33 | return uniqueUsers[randomIndex]; 34 | 35 | /// MODIFY CODE ONLY ABOVE THIS LINE 36 | } 37 | -------------------------------------------------------------------------------- /Custom Functions/filter-in-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=I9zSyJccwa0 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<PostsRecord>? filterINdocsFollowing( 11 | List<UsersdataRecord>? users, 12 | List<PostsRecord>? posts, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | users ??= []; 18 | posts ??= []; 19 | 20 | List<PostsRecord> filteredPosts = posts.where((postDoc) { 21 | // TODO change field "following" to your own field 22 | bool hasUserFollowing = postDoc.following!.any((postFollowerRef) { 23 | return users!.any((user) => user.reference == postFollowerRef); 24 | }); 25 | return hasUserFollowing; 26 | }).toList(); 27 | 28 | return filteredPosts; 29 | 30 | /// MODIFY CODE ONLY ABOVE THIS LINE 31 | } 32 | -------------------------------------------------------------------------------- /Custom Functions/filter-in-single.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=I9zSyJccwa0 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<PostsRecord>? filterINdocs( 11 | List<UsersdataRecord>? users, 12 | List<PostsRecord>? posts, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | users ??= []; 18 | posts ??= []; 19 | 20 | List<PostsRecord> filteredPosts = posts.where((postDoc) { 21 | // TODO change field "follow" to your own field 22 | bool hasUserFollowing = 23 | users!.any((user) => user.reference == postDoc.follow); 24 | return hasUserFollowing; 25 | }).toList(); 26 | 27 | return filteredPosts; 28 | 29 | /// MODIFY CODE ONLY ABOVE THIS LINE 30 | } 31 | -------------------------------------------------------------------------------- /Custom Functions/find-index-in-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | int findIndex( 11 | List<PlaylistsStruct> playlistsDT, 12 | String name, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | return playlistsDT.indexWhere((playlist) => playlist.name == name); 17 | 18 | /// MODIFY CODE ONLY ABOVE THIS LINE 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/generete-random-string.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? generateRandomString(int? length) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | length ??= 1; 15 | 16 | final charset = 17 | '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._'; 18 | final random = math.Random.secure(); 19 | return List.generate(length, (_) => charset[random.nextInt(charset.length)]) 20 | .join(); 21 | 22 | /// MODIFY CODE ONLY ABOVE THIS LINE 23 | } 24 | -------------------------------------------------------------------------------- /Custom Functions/get-avg-from-docs.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | double? averageReviewRating(List<ReviewsRecord>? reviews) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // get the average review rating from the list of Reviews of the coachModel 14 | if (reviews == null || reviews.isEmpty) { 15 | return null; 16 | } 17 | double sum = 0.0; 18 | for (ReviewsRecord review in reviews) { 19 | sum += (review.rating?.toDouble() ?? 0.0); 20 | } 21 | return sum / reviews.length; 22 | 23 | /// MODIFY CODE ONLY ABOVE THIS LINE 24 | } 25 | -------------------------------------------------------------------------------- /Custom Functions/get-user-location.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String getUserLocation(LatLng? userLocation) { 11 | if (userLocation == null || 12 | (userLocation.latitude == 0 && userLocation.longitude == 0)) { 13 | return ''; 14 | } 15 | 16 | String location = "${userLocation.latitude},${userLocation.longitude}"; 17 | return location; 18 | } 19 | -------------------------------------------------------------------------------- /Custom Functions/if-contains.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool ifContains( 11 | String? text, 12 | String? word, 13 | ) { 14 | text = text ?? ''; 15 | word = word ?? ''; 16 | 17 | if (text.contains(word)) { 18 | return true; 19 | } 20 | return false; 21 | } 22 | -------------------------------------------------------------------------------- /Custom Functions/implode-strings.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> implodeStrings(String? data, String? delimiter) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | data ??= ''; 15 | delimiter ??= ', '; 16 | 17 | String joinedList = data.join(delimiter); 18 | 19 | return joinedList; 20 | 21 | /// MODIFY CODE ONLY ABOVE THIS LINE 22 | } 23 | -------------------------------------------------------------------------------- /Custom Functions/increase-num.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String increaseNum(String? input) { 11 | input = input ?? ''; 12 | String output = (int.parse(input) + 1).toString(); 13 | 14 | return output; 15 | } 16 | -------------------------------------------------------------------------------- /Custom Functions/ints-average.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Function to calculate the average of a list 11 | double avg(List<int> numbers) { 12 | return sum(numbers) / count(numbers); 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/ints-count.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Function to count the number of elements in a list 11 | int count(List<int> numbers) { 12 | return numbers.length; 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/ints-max.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Function to find the maximum value in a list 11 | num max(List<int> numbers) { 12 | return numbers.reduce((a, b) => a > b ? a : b); 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/ints-min.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Function to find the minimum value in a list 11 | num min(List<int> numbers) { 12 | return numbers.reduce((a, b) => a < b ? a : b); 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/ints-sum.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // Function to sum the elements of a list 11 | num sum(List<int> numbers) { 12 | return numbers.reduce((a, b) => a + b); 13 | } 14 | -------------------------------------------------------------------------------- /Custom Functions/join-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String joinList(List<String>? strings) { 11 | strings = strings ?? []; 12 | String combined = strings.join(','); 13 | 14 | return combined; 15 | } 16 | -------------------------------------------------------------------------------- /Custom Functions/list-does-not-contans.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool listDoesNotContains( 11 | List<String>? input, 12 | String? word, 13 | ) { 14 | input = input ?? []; 15 | word = word ?? ''; 16 | 17 | return !input.contains(word); 18 | } 19 | -------------------------------------------------------------------------------- /Custom Functions/one-value-from-two.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool oneValueIsNotNull( 11 | String value1, 12 | String value2, 13 | ) { 14 | // return true if one of the values in not null 15 | if (value1.isEmpty && value2.isEmpty) { 16 | return false; 17 | } 18 | return true; 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/random-img.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=f3enSdgZ6oU 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? randomInt() { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | final random = math.Random(); 14 | int randomInt = random.nextInt(999) + 1; 15 | String randomImg = "https://picsum.photos/seed/$randomInt/600"; 16 | 17 | return randomImg; 18 | 19 | /// MODIFY CODE ONLY ABOVE THIS LINE 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/random-item-from-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? randomItemFromList(List<String>? texts) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | texts ??= []; 15 | 16 | String text = ''; 17 | final random = math.Random(); 18 | int index = random.nextInt(texts.length); 19 | text = texts[index]; 20 | 21 | return text; 22 | 23 | /// MODIFY CODE ONLY ABOVE THIS LINE 24 | } 25 | -------------------------------------------------------------------------------- /Custom Functions/remove-html-tags.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // live video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? removeHtmlTags(String? htmlString) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | htmlString ??= ''; 15 | 16 | final RegExp removeScripts = RegExp( 17 | r'<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>', 18 | multiLine: true, 19 | caseSensitive: true); 20 | 21 | final RegExp removeTags = 22 | RegExp(r'<[^>]*>', multiLine: true, caseSensitive: true); 23 | 24 | return htmlString.replaceAll(removeScripts, '').replaceAll(removeTags, ''); 25 | 26 | /// MODIFY CODE ONLY ABOVE THIS LINE 27 | } 28 | -------------------------------------------------------------------------------- /Custom Functions/reorder-list-v2.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future<List<String>> reorderItems( 11 | List<String>? list, 12 | int? oldIndex, 13 | int? newIndex, 14 | ) async { 15 | // null safety 16 | list ??= []; 17 | oldIndex ??= 0; 18 | newIndex ??= 0; 19 | 20 | if (oldIndex < newIndex) { 21 | newIndex -= 1; 22 | } 23 | 24 | final item = list.removeAt(oldIndex); 25 | list.insert(newIndex, item); 26 | 27 | return list; 28 | } 29 | -------------------------------------------------------------------------------- /Custom Functions/reorder-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=rrgw84My5tw 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> reorderList( 11 | List<String>? list, 12 | List<int>? order, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | // null safety 17 | list ??= []; 18 | order ??= []; 19 | 20 | if (list.length != order.length) { 21 | throw ArgumentError('List and order list must have the same length.'); 22 | } 23 | 24 | List<String> result = List.filled(list.length, ''); 25 | 26 | for (int i = 0; i < order.length; i++) { 27 | result[order[i]] = list[i]; 28 | } 29 | 30 | return result; 31 | 32 | /// MODIFY CODE ONLY ABOVE THIS LINE 33 | } 34 | -------------------------------------------------------------------------------- /Custom Functions/replace-text.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String? replaceText( 11 | String? text, 12 | String? toReplace, 13 | String? replacement, 14 | ) { 15 | /// MODIFY CODE ONLY BELOW THIS LINE 16 | 17 | // null safety 18 | text ??= ''; 19 | toReplace ??= ''; 20 | replacement ??= ''; 21 | 22 | String newText = text.replaceAll(toReplace, replacement); 23 | 24 | return newText; 25 | 26 | /// MODIFY CODE ONLY ABOVE THIS LINE 27 | } 28 | -------------------------------------------------------------------------------- /Custom Functions/return-one-of-two.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String twoValuesOneReturn( 11 | String value1, 12 | String value2, 13 | ) { 14 | // return the value that is not empty of the two 15 | if (value1.isEmpty) { 16 | return value2; 17 | } else { 18 | return value1; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Custom Functions/shuffle-order.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=kr-OlNuvzQU 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<UpcomingQuestsRow> shuffleOrder(List<UpcomingQuestsRow>? data) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | data ??= []; 14 | 15 | // Shuffle the list 16 | final random = math.Random(); 17 | data.shuffle(random); 18 | 19 | return data; 20 | 21 | /// MODIFY CODE ONLY ABOVE THIS LINE 22 | } 23 | -------------------------------------------------------------------------------- /Custom Functions/sort-date-and-number.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<UsersdataRecord> sortDateAndThenIdentifier( 11 | List<UsersdataRecord> usersdata) { 12 | /// MODIFY CODE ONLY BELOW THIS LINE 13 | 14 | usersdata.sort((a, b) { 15 | int compareDate = DateTime(a.myDate!.year, a.myDate!.month, a.myDate!.day) 16 | .compareTo(DateTime(b.myDate!.year, b.myDate!.month, b.myDate!.day)); 17 | if (compareDate != 0) return compareDate; 18 | return a.identifier.compareTo(b.identifier); 19 | }); 20 | 21 | // print(usersdata); 22 | // List<int> result = []; 23 | // usersdata.forEach((item) { 24 | // result.add(item.identifier); 25 | // print(item.identifier); 26 | // }); 27 | 28 | return usersdata; 29 | 30 | /// MODIFY CODE ONLY ABOVE THIS LINE 31 | } 32 | -------------------------------------------------------------------------------- /Custom Functions/split-and-trim.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String> splitAndTrim(String input) { 11 | if (input.isEmpty) { 12 | return []; 13 | } 14 | 15 | final parts = input.split(','); 16 | final trimmedParts = parts.map((part) => part.trim()).toList(); 17 | 18 | return trimmedParts; 19 | } 20 | -------------------------------------------------------------------------------- /Custom Functions/split-latlng-into-doubles.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<double> splitLongLatIntoTwoDoubles(LatLng? location) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | location ??= LatLng(0.0, 0.0); 14 | 15 | return [location.latitude, location.longitude]; 16 | 17 | /// MODIFY CODE ONLY ABOVE THIS LINE 18 | } 19 | -------------------------------------------------------------------------------- /Custom Functions/string-to-img.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=EwGeOgSjEsM 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String convertStrToImg(String? imagePath) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | imagePath ??= ''; 14 | 15 | return imagePath; 16 | 17 | /// MODIFY CODE ONLY ABOVE THIS LINE 18 | } 19 | -------------------------------------------------------------------------------- /Custom Functions/to-lower.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String toLower(String? input) { 11 | input = input ?? ''; 12 | 13 | return input.toLowerCase(); 14 | } 15 | -------------------------------------------------------------------------------- /Custom Functions/truncate.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | String truncate( 11 | String? input, 12 | int? maxLength, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | input ??= ''; 17 | maxLength ??= 0; 18 | 19 | String truncated = input; 20 | if (input.length > maxLength) { 21 | truncated = input.substring(0, maxLength) + "..."; 22 | } 23 | 24 | return truncated; 25 | 26 | /// MODIFY CODE ONLY ABOVE THIS LINE 27 | } 28 | -------------------------------------------------------------------------------- /Custom Functions/unique-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=yoiVwVOZW74 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String>? uniqueList(List<String>? inputList) { 11 | /// MODIFY CODE ONLY BELOW THIS LINE 12 | 13 | // null safety 14 | inputList ??= []; 15 | 16 | // Create a Set from the input list 17 | Set<String> uniqueSet = Set<String>.from(inputList); 18 | 19 | // Convert the Set back to a List 20 | List<String> uniqueList = uniqueSet.toList(); 21 | 22 | return uniqueList; 23 | 24 | /// MODIFY CODE ONLY ABOVE THIS LINE 25 | } 26 | -------------------------------------------------------------------------------- /Custom Functions/update-value-in-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | List<String>? updateValueInList( 11 | List<String>? list, 12 | int? index, 13 | String? newValue, 14 | ) { 15 | /// MODIFY CODE ONLY BELOW THIS LINE 16 | 17 | // null safety 18 | list ??= []; 19 | index ??= 0; 20 | newValue ??= 'myNewValue'; 21 | 22 | if (index >= 0 && index < list.length) { 23 | List<String> newList = List.from(list); 24 | newList[index] = newValue; 25 | return newList; 26 | } else { 27 | print('Index out of range'); 28 | return list; 29 | } 30 | 31 | /// MODIFY CODE ONLY ABOVE THIS LINE 32 | } 33 | -------------------------------------------------------------------------------- /Custom Functions/valid-input-regex.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool validateInput( 11 | String input, 12 | String regexCode, 13 | ) { 14 | /// MODIFY CODE ONLY BELOW THIS LINE 15 | 16 | RegExp regex = RegExp(regexCode); 17 | 18 | // return regex.pattern; 19 | return regex.hasMatch(input); 20 | 21 | /// MODIFY CODE ONLY ABOVE THIS LINE 22 | } 23 | -------------------------------------------------------------------------------- /Custom Functions/value-not-empty.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | bool valueNotEmpty(String? value) { 11 | // if value not empty return true else return false 12 | return value != '' && 13 | value.toString() != '0' && 14 | value != null && 15 | value.isNotEmpty; 16 | } 17 | -------------------------------------------------------------------------------- /Examples/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Examples/.DS_Store -------------------------------------------------------------------------------- /Examples/cloudflare/user-location.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | async function handleRequest(request) { 11 | const country = request.headers.get('CF-IPCountry'); 12 | 13 | return new Response(JSON.stringify({ country: country }), { 14 | headers: { 'Content-Type': 'application/json' }, 15 | }); 16 | } 17 | 18 | export default { 19 | fetch: handleRequest 20 | }; 21 | -------------------------------------------------------------------------------- /Examples/firebase/database/fb-sort-list.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | // this is a custom function 11 | 12 | List<PropertyRecord> sortListings( 13 | List<PropertyRecord>? data, 14 | String? sortBy, 15 | ) { 16 | /// MODIFY CODE ONLY BELOW THIS LINE 17 | 18 | //null safety 19 | data ??= []; 20 | sortBy ??= 'date'; 21 | 22 | // Sort the filtered data 23 | if (sortBy == 'date') { 24 | data.sort( 25 | (a, b) => a.createdTime!.compareTo(b.createdTime ?? DateTime.now())); 26 | } else if (sortBy == 'status') { 27 | data.sort((a, b) => a.status.compareTo(b.status)); 28 | } else if (sortBy == 'price') { 29 | data.sort((a, b) => a.price.compareTo(b.price)); 30 | } 31 | 32 | return data; 33 | 34 | /// MODIFY CODE ONLY ABOVE THIS LINE 35 | } 36 | -------------------------------------------------------------------------------- /Examples/reuse_custom_action_advanced.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=rrgw84My5tw 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:convert'; 11 | 12 | import 'package:download/download.dart'; 13 | 14 | import '../actions/add_to_num.dart'; 15 | 16 | Future widgetToImage() async { 17 | Uint8List image = base64.decode(FFAppState().widgetToExport); 18 | 19 | final fileName = "widget" + DateTime.now().toString() + ".png"; 20 | 21 | final stream = Stream.fromIterable(image); 22 | download(stream, fileName); 23 | 24 | await addToNum(); 25 | } 26 | -------------------------------------------------------------------------------- /Examples/reuse_custom_action_easy.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=rrgw84My5tw 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future addToNum() async { 11 | FFAppState().update(() { 12 | FFAppState().number = FFAppState().number + 1; 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /Firebase/Emulator/trigger.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://www.youtube.com/watch?v=aBC7A2oFsdM 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const { triggerCheckAndSendNotifications } = require('./index'); 11 | 12 | async function triggerFunction() { 13 | await triggerCheckAndSendNotifications(); 14 | console.log('Function checkAndSendNotifications manually triggered'); 15 | } 16 | 17 | triggerFunction(); -------------------------------------------------------------------------------- /Hackaton/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Hackaton/.DS_Store -------------------------------------------------------------------------------- /Hackaton/2024/old-newspaper.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Hackaton/2024/old-newspaper.pdf -------------------------------------------------------------------------------- /Packages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Packages/.DS_Store -------------------------------------------------------------------------------- /Packages/audioplayers/stop-sound.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | Future stopSound() async { 11 | try { 12 | // Stop and dispose the current audio player if it exists 13 | if (FFAppState().audioPlayerPlayingMsg != null) { 14 | await FFAppState().audioPlayerPlayingMsg?.stop(); 15 | await FFAppState().audioPlayerPlayingMsg?.dispose(); 16 | FFAppState().audioPlayerPlayingMsg = null; 17 | // Set playing state to false when stopped 18 | FFAppState().update(() { 19 | FFAppState().audioPlaying = false; 20 | }); 21 | print('FFAppState().audioPlaying = false;'); 22 | } 23 | 24 | // Clean up the temp file if it exists 25 | // if (_tempFile != null) { 26 | // await _tempFile?.delete(); 27 | // _tempFile = null; 28 | // } 29 | } catch (e) { 30 | print('Error stopping audio: $e'); 31 | FFAppState().update(() { 32 | FFAppState().audioPlaying = false; 33 | }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Packages/connectivity_plus/listen-connection-changes.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:connectivity_plus/connectivity_plus.dart'; 11 | 12 | Future listenConnectivityChanges() async { 13 | Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { 14 | bool isConnected = result != ConnectivityResult.none; 15 | // Use isConnected to update your UI or logic 16 | // true means connected, false means not connected 17 | FFAppState().update(() { 18 | FFAppState().offline = !isConnected; 19 | }); 20 | print(['loop', isConnected]); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /Packages/csv/resources/import.csv: -------------------------------------------------------------------------------- 1 | Username;Identifier;My Bool;My DateTime;My Ref 2 | booker12;9012;FALSE;2023/01/14 12:08:12;users/DRdjyVGi45fyovdrojJHLSb9UWf2 3 | grey07;2070;FALSE;2023/01/17 12:08:12;users/DRdjyVGi45fyovdrojJHLSb9UWf2 4 | johnson81;4081;TRUE;2022/12/02 12:08:12;users/DRdjyVGi45fyovdrojJHLSb9UWf2 5 | jenkins46;9346;FALSE;2023/01/14 12:08:12;users/DRdjyVGi45fyovdrojJHLSb9UWf2 6 | smith79;5079;FALSE;2023/01/14 12:08:12;users/DRdjyVGi45fyovdrojJHLSb9UWf2 -------------------------------------------------------------------------------- /Packages/csv/resources/import.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Username": "booker12", 4 | "Identifier": 9012, 5 | "My Bool": "FALSE", 6 | "My DateTime": "2023/01/14 12:08:12", 7 | "My Ref": "users/DRdjyVGi45fyovdrojJHLSb9UWf2" 8 | }, 9 | { 10 | "Username": "grey07", 11 | "Identifier": 2070, 12 | "My Bool": "FALSE", 13 | "My DateTime": "2023/01/17 12:08:12", 14 | "My Ref": "users/DRdjyVGi45fyovdrojJHLSb9UWf2" 15 | }, 16 | { 17 | "Username": "johnson81", 18 | "Identifier": 4081, 19 | "My Bool": "TRUE", 20 | "My DateTime": "2022/12/02 12:08:12", 21 | "My Ref": "users/DRdjyVGi45fyovdrojJHLSb9UWf2" 22 | }, 23 | { 24 | "Username": "jenkins46", 25 | "Identifier": 9346, 26 | "My Bool": "FALSE", 27 | "My DateTime": "2023/01/14 12:08:12", 28 | "My Ref": "users/DRdjyVGi45fyovdrojJHLSb9UWf2" 29 | }, 30 | { 31 | "Username": "smith79", 32 | "Identifier": 5079, 33 | "My Bool": "FALSE", 34 | "My DateTime": "2023/01/14 12:08:12", 35 | "My Ref": "users/DRdjyVGi45fyovdrojJHLSb9UWf2" 36 | } 37 | ] -------------------------------------------------------------------------------- /Packages/flutter_tts/talk-to-me.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - https://youtube.com/watch?v=kcqrHDqpmoo 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:flutter_tts/flutter_tts.dart'; 11 | 12 | Future talkToMe() async { 13 | FlutterTts flutterTts = FlutterTts(); 14 | flutterTts.setLanguage("en-US"); 15 | // flutterTts.setVoice({"name": "Wavenet-A", "locale": "en-US"}); 16 | String text = FFAppState().tts; 17 | flutterTts.speak(text); 18 | } 19 | -------------------------------------------------------------------------------- /Packages/image_gallery_saver/copy-to-gallery.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=LfAwHZndeWQ 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:io'; 11 | import 'package:image_gallery_saver/image_gallery_saver.dart'; 12 | import 'package:path/path.dart' as path; 13 | 14 | Future<bool> copyToGallery(String filePath) async { 15 | try { 16 | // Read the file as bytes 17 | final File file = File(filePath); 18 | final Uint8List bytes = await file.readAsBytes(); 19 | 20 | // Get the file name 21 | final String fileName = path.basename(filePath); 22 | 23 | // Save the file to the gallery 24 | final result = await ImageGallerySaver.saveFile( 25 | filePath, 26 | name: fileName, 27 | ); 28 | 29 | return result['isSuccess']; 30 | } catch (e) { 31 | print('Error copying file to gallery: $e'); 32 | return false; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Packages/package_info/app-version.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:package_info/package_info.dart'; 11 | 12 | Future<String> getAppVersion() async { 13 | PackageInfo packageInfo = await PackageInfo.fromPlatform(); 14 | String version = packageInfo.version; 15 | 16 | return version; 17 | } 18 | -------------------------------------------------------------------------------- /Packages/package_info_plus/version-build.dart: -------------------------------------------------------------------------------- 1 | // code provided by - Andrew Schox 2 | 3 | import 'package:package_info_plus/package_info_plus.dart'; 4 | 5 | Future<String> appVersion() async { 6 | // Add your function code here! 7 | PackageInfo packageInfo = await PackageInfo.fromPlatform(); 8 | 9 | String version = packageInfo.version; 10 | String build = packageInfo.buildNumber; 11 | 12 | return version + " (" + build + ")"; 13 | } 14 | -------------------------------------------------------------------------------- /Packages/path/get-full-path.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=LfAwHZndeWQ 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'dart:io'; 11 | import 'package:path/path.dart' as p; 12 | import 'package:path_provider/path_provider.dart'; 13 | 14 | Future<String> getFullPath() async { 15 | String documentsPath = ''; 16 | if (Platform.isIOS) { 17 | documentsPath = (await getApplicationDocumentsDirectory()).path; 18 | } else if (Platform.isAndroid) { 19 | documentsPath = (await getExternalStorageDirectory() ?? 20 | await getApplicationDocumentsDirectory()) 21 | .path; 22 | } else { 23 | throw UnsupportedError('Unsupported platform'); 24 | } 25 | 26 | return documentsPath; 27 | // return p.join(documentsPath, fileName); 28 | } 29 | -------------------------------------------------------------------------------- /Packages/sentry/error.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=aZCQwV8cvMw 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:sentry/sentry.dart'; 11 | 12 | Future errorAction() async { 13 | print(['CUSTOM ERROR v1']); 14 | 15 | try { 16 | throw Exception('Testing Sentry Integration'); 17 | } catch (exception, stackTrace) { 18 | await Sentry.captureException( 19 | exception, 20 | stackTrace: stackTrace, 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Packages/sentry/setup.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // paid video - https://www.youtube.com/watch?v=aZCQwV8cvMw 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import '../../main.dart' as main; 11 | import 'package:sentry_flutter/sentry_flutter.dart'; 12 | import 'package:provider/provider.dart'; 13 | 14 | Future sentrySetup() async { 15 | final appState = FFAppState(); // Initialize FFAppState 16 | await appState.initializePersistedState(); 17 | 18 | await SentryFlutter.init( 19 | (options) { 20 | options.dsn = '[YOUR-URL]'; 21 | options.tracesSampleRate = 1.0; 22 | options.profilesSampleRate = 1.0; 23 | }, 24 | appRunner: () => runApp(ChangeNotifierProvider( 25 | create: (context) => appState, 26 | child: main.MyApp(), 27 | )), 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /Packages/syncfusion_flutter_calendar/resources/dates.json: -------------------------------------------------------------------------------- 1 | { 2 | "ID": 0, 3 | "TotalHours": 1.57, 4 | "Notes": "string", 5 | "IsLocked": true, 6 | "RecurringScheduleID": 0, 7 | "Staff": { 8 | "ID": 123, 9 | "Name": "John Smith", 10 | "Type": "employee", 11 | "TypeId": 0 12 | }, 13 | "Date": "2021-04-22", 14 | "Blocks": [ 15 | { 16 | "Hrs": 8, 17 | "StartTime": "08:00", 18 | "ISO8601StartTime": "2018-05-21T19:53:39+10:00", 19 | "EndTime": "16:00", 20 | "ISO8601EndTime": "2018-05-21T19:53:39+10:00", 21 | "ScheduleRate": { 22 | "ID": 12345, 23 | "Name": "Overtime" 24 | } 25 | } 26 | ], 27 | "DateModified": "2018-05-21T19:53:39+10:00" 28 | } -------------------------------------------------------------------------------- /Packages/video_thumbnail/genereteThumbnail.dart: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - no 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | import 'package:video_thumbnail/video_thumbnail.dart'; 11 | import 'dart:io'; 12 | import 'package:path_provider/path_provider.dart'; 13 | 14 | Future<String> generateThumbnail(String videoPath) async { 15 | final directory = await getApplicationDocumentsDirectory(); 16 | final thumbnailPath = 17 | '${directory.path}/${DateTime.now().millisecondsSinceEpoch}.png'; 18 | 19 | final thumbnail = await VideoThumbnail.thumbnailFile( 20 | video: videoPath, 21 | thumbnailPath: thumbnailPath, 22 | imageFormat: ImageFormat.PNG, 23 | maxHeight: 640, 24 | maxWidth: 480, 25 | quality: 100, 26 | ); 27 | 28 | return thumbnail ?? ''; 29 | } 30 | -------------------------------------------------------------------------------- /Paid Members/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Paid Members/.DS_Store -------------------------------------------------------------------------------- /Projects/github: -------------------------------------------------------------------------------- 1 | // list of github repos, if you know of a GH repo that is not in this list, 2 | please add it to the list 3 | https://github.com/MendesCorporation/ZerandoFlutterflow 4 | https://github.com/Kalebe-Nascimento/Ride-Map-WidgetsFunctions-with-Dart 5 | https://github.com/RohitTamkar/sensibleBiz 6 | https://github.com/YatinBajajOP/navigateX 7 | https://github.com/Litesoulo/bb_supplier 8 | https://github.com/cnacha-mfu/aiteach-instructor 9 | https://github.com/usseiin/audio_h 10 | -------------------------------------------------------------------------------- /SQLite/bulgarian_football.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/SQLite/bulgarian_football.db -------------------------------------------------------------------------------- /SQLite/read.sql: -------------------------------------------------------------------------------- 1 | -- // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | -- // paid video - https://youtu.be/yl1rn79KpZo 3 | -- // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | -- // Support my work - https://github.com/sponsors/bulgariamitko 5 | -- // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | -- // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | -- // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | -- // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | SELECT id, name, city, stadium_id AS stadiumid FROM Teams 11 | 12 | SELECT Teams.name AS teamname, Stadiums.name AS stadiumname, Stadiums.capacity, Stadiums.location 13 | FROM Teams 14 | JOIN Stadiums ON Teams.stadium_id = Stadiums.id 15 | 16 | SELECT Players.id, Players.name AS playername, Players.position, Teams.name AS teamname 17 | FROM Players 18 | JOIN Teams ON Players.team_id = Teams.id 19 | 20 | SELECT * FROM Players WHERE name LIKE '%${playerName}%' 21 | 22 | SELECT * FROM Teams WHERE city = '${city}' 23 | 24 | SELECT id, name, position, team_id AS teamid FROM Players -------------------------------------------------------------------------------- /SQLite/update.sql: -------------------------------------------------------------------------------- 1 | -- // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | -- // paid video - https://youtu.be/yl1rn79KpZo 3 | -- // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | -- // Support my work - https://github.com/sponsors/bulgariamitko 5 | -- // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | -- // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | -- // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | -- // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | INSERT INTO Players (name, position, team_id) 11 | VALUES ('${name}', '${position}', ${teamid}) 12 | 13 | 14 | UPDATE Players SET team_id = ${teamid} WHERE id = ${playerid} 15 | 16 | DELETE FROM Players WHERE id = ${id} -------------------------------------------------------------------------------- /Source-Code/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/.DS_Store -------------------------------------------------------------------------------- /Source-Code/cloud functions/addFcmToken/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "@google-cloud/logging": "^7.2.3", 6 | "firebase-admin": "^9.11.0", 7 | "firebase-functions": "^3.14.1", 8 | "braintree": "^3.6.0", 9 | "@mux/mux-node": "^5.0.0-rc.1", 10 | "stripe": "^8.0.1", 11 | "axios": "^0.27.2", 12 | "razorpay": "^2.8.4" 13 | }, 14 | "devDependencies": { 15 | "eslint": "^6.8.0", 16 | "eslint-plugin-promise": "^4.2.1" 17 | }, 18 | "scripts": { 19 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 20 | "serve": "firebase -P nufc-288311 emulators:start --only functions", 21 | "shell": "firebase -P nufc-288311 functions:shell", 22 | "start": "npm run shell", 23 | "deploy": "firebase -P nufc-288311 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 24 | "logs": "firebase -P nufc-288311 functions:log", 25 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 26 | }, 27 | "engines": { 28 | "node": "10" 29 | }, 30 | "private": true 31 | } -------------------------------------------------------------------------------- /Source-Code/cloud functions/initStripePayment/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "@google-cloud/logging": "^7.2.3", 6 | "firebase-admin": "^9.11.0", 7 | "firebase-functions": "^3.14.1", 8 | "braintree": "^3.6.0", 9 | "@mux/mux-node": "^5.0.0-rc.1", 10 | "stripe": "^8.0.1", 11 | "axios": "^0.27.2" 12 | }, 13 | "devDependencies": { 14 | "eslint": "^6.8.0", 15 | "eslint-plugin-promise": "^4.2.1" 16 | }, 17 | "scripts": { 18 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 19 | "serve": "firebase -P nufc-288311 emulators:start --only functions", 20 | "shell": "firebase -P nufc-288311 functions:shell", 21 | "start": "npm run shell", 22 | "deploy": "firebase -P nufc-288311 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 23 | "logs": "firebase -P nufc-288311 functions:log", 24 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 25 | }, 26 | "engines": { 27 | "node": "10" 28 | }, 29 | "private": true 30 | } -------------------------------------------------------------------------------- /Source-Code/cloud functions/onUserDeleted/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "@google-cloud/logging": "^7.2.3", 6 | "firebase-admin": "^9.11.0", 7 | "firebase-functions": "^3.14.1", 8 | "braintree": "^3.6.0", 9 | "@mux/mux-node": "^5.0.0-rc.1", 10 | "stripe": "^8.0.1", 11 | "axios": "^0.27.2", 12 | "razorpay": "^2.8.4" 13 | }, 14 | "devDependencies": { 15 | "eslint": "^6.8.0", 16 | "eslint-plugin-promise": "^4.2.1" 17 | }, 18 | "scripts": { 19 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 20 | "serve": "firebase -P nufc-288311 emulators:start --only functions", 21 | "shell": "firebase -P nufc-288311 functions:shell", 22 | "start": "npm run shell", 23 | "deploy": "firebase -P nufc-288311 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 24 | "logs": "firebase -P nufc-288311 functions:log", 25 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 26 | }, 27 | "engines": { 28 | "node": "10" 29 | }, 30 | "private": true 31 | } -------------------------------------------------------------------------------- /Source-Code/cloud functions/sendChatNotificationsTrigger/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "@google-cloud/logging": "^7.2.3", 6 | "firebase-admin": "^9.11.0", 7 | "firebase-functions": "^3.14.1", 8 | "braintree": "^3.6.0", 9 | "@mux/mux-node": "^5.0.0-rc.1", 10 | "stripe": "^8.0.1", 11 | "axios": "^0.27.2" 12 | }, 13 | "devDependencies": { 14 | "eslint": "^6.8.0", 15 | "eslint-plugin-promise": "^4.2.1" 16 | }, 17 | "scripts": { 18 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 19 | "serve": "firebase -P nufc-288311 emulators:start --only functions", 20 | "shell": "firebase -P nufc-288311 functions:shell", 21 | "start": "npm run shell", 22 | "deploy": "firebase -P nufc-288311 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 23 | "logs": "firebase -P nufc-288311 functions:log", 24 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 25 | }, 26 | "engines": { 27 | "node": "10" 28 | }, 29 | "private": true 30 | } -------------------------------------------------------------------------------- /Source-Code/cloud functions/sendPushNotificationsTrigger/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "firebase-admin": "^11.11.0", 6 | "firebase-functions": "^4.4.1", 7 | "braintree": "^3.6.0", 8 | "@mux/mux-node": "^7.3.3", 9 | "stripe": "^8.0.1", 10 | "axios": "1.6.0", 11 | "razorpay": "^2.8.4", 12 | "qs": "^6.7.0", 13 | "@onesignal/node-onesignal": "^2.0.1-beta2" 14 | }, 15 | "devDependencies": { 16 | "eslint": "^6.8.0", 17 | "eslint-plugin-promise": "^4.2.1" 18 | }, 19 | "scripts": { 20 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 21 | "serve": "firebase -P real-engine-v1-df4d7 emulators:start --only functions", 22 | "shell": "firebase -P real-engine-v1-df4d7 functions:shell", 23 | "start": "npm run shell", 24 | "deploy": "firebase -P real-engine-v1-df4d7 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 25 | "logs": "firebase -P real-engine-v1-df4d7 functions:log", 26 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 27 | }, 28 | "engines": { 29 | "node": "16" 30 | }, 31 | "private": true 32 | } -------------------------------------------------------------------------------- /Source-Code/cloud functions/sendScheduledPushNotifications/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "firebase-admin": "^11.11.0", 6 | "firebase-functions": "^4.4.1", 7 | "braintree": "^3.6.0", 8 | "@mux/mux-node": "^7.3.3", 9 | "stripe": "^8.0.1", 10 | "axios": "1.6.0", 11 | "razorpay": "^2.8.4", 12 | "qs": "^6.7.0", 13 | "@onesignal/node-onesignal": "^2.0.1-beta2" 14 | }, 15 | "devDependencies": { 16 | "eslint": "^6.8.0", 17 | "eslint-plugin-promise": "^4.2.1" 18 | }, 19 | "scripts": { 20 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 21 | "serve": "firebase -P real-engine-v1-df4d7 emulators:start --only functions", 22 | "shell": "firebase -P real-engine-v1-df4d7 functions:shell", 23 | "start": "npm run shell", 24 | "deploy": "firebase -P real-engine-v1-df4d7 deploy --only functions:processBraintreePayment,functions:processBraintreeTestPayment", 25 | "logs": "firebase -P real-engine-v1-df4d7 functions:log", 26 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 27 | }, 28 | "engines": { 29 | "node": "16" 30 | }, 31 | "private": true 32 | } -------------------------------------------------------------------------------- /Source-Code/ff_source_code/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Firebase – this is necessary if you use Firebase since it could otherwise 35 | # lead to leaking of private certificates to your repository, which is no bueno. 36 | .firebase/ 37 | 38 | # Web related 39 | lib/generated_plugin_registrant.dart 40 | 41 | # Symbolication related 42 | app.*.symbols 43 | 44 | # Obfuscation related 45 | app.*.map.json 46 | 47 | # Android Studio will place build artifacts here 48 | /android/app/debug 49 | /android/app/profile 50 | /android/app/release 51 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/.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: 4d7946a68d26794349189cf21b3f68cc6fe61dcb 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/README.md: -------------------------------------------------------------------------------- 1 | # ff-source-code 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | FlutterFlow projects are built to run on the Flutter _stable_ release. 8 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/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 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Please add these rules to your existing keep rules in order to suppress warnings. 2 | # This is generated automatically by the Android Gradle plugin. 3 | -dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue 4 | -dontwarn com.google.errorprone.annotations.CheckReturnValue 5 | -dontwarn com.google.errorprone.annotations.Immutable 6 | -dontwarn com.google.errorprone.annotations.RestrictedApi 7 | -dontwarn javax.annotation.Nullable 8 | -dontwarn javax.annotation.concurrent.GuardedBy 9 | -dontwarn org.bouncycastle.jce.provider.BouncyCastleProvider 10 | -dontwarn org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider 11 | -keep class org.xmlpull.v1.** { *; } 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 | package="com.mycompany.ffsourcecode"> 3 | <!-- Flutter needs it to communicate with the running application 4 | to allow setting breakpoints, to provide hot reload, etc. 5 | --> 6 | <uses-permission android:name="android.permission.INTERNET"/> 7 | </manifest> 8 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.mycompany.ffsourcecode 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Modify this file to customize your launch splash screen --> 3 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 4 | <item android:drawable="?android:colorBackground" /> 5 | 6 | <!-- You can insert your own image assets here --> 7 | <!-- <item> 8 | <bitmap 9 | android:gravity="center" 10 | android:src="@mipmap/launch_image" /> 11 | </item> --> 12 | </layer-list> 13 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/values-night-v31/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | Flutter draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | Flutter draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/values-v31/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | Flutter draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8" ?> 2 | <resources> 3 | <string name="app_name">ff-source-code</string> 4 | 5 | </resources> -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | Flutter draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 | package="com.mycompany.ffsourcecode"> 3 | <!-- Flutter needs it to communicate with the running application 4 | to allow setting breakpoints, to provide hot reload, etc. 5 | --> 6 | <uses-permission android:name="android.permission.INTERNET"/> 7 | </manifest> 8 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | 10 | subprojects { 11 | afterEvaluate { project -> 12 | if (project.hasProperty("kotlin")) { 13 | project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { 14 | kotlinOptions { 15 | jvmTarget = "1.8" 16 | } 17 | } 18 | } 19 | } 20 | } 21 | 22 | subprojects { 23 | afterEvaluate { project -> 24 | if (project.plugins.hasPlugin("com.android.application") || 25 | project.plugins.hasPlugin("com.android.library")) { 26 | project.android { 27 | compileSdkVersion 34 28 | } 29 | } 30 | if (project.hasProperty('android')) { 31 | project.android { 32 | if (namespace == null) { 33 | namespace project.group 34 | } 35 | } 36 | } 37 | } 38 | } 39 | subprojects { 40 | project.buildDir = "${rootProject.buildDir}/${project.name}" 41 | } 42 | subprojects { 43 | project.evaluationDependsOn(':app') 44 | } 45 | 46 | task clean(type: Delete) { 47 | delete rootProject.buildDir 48 | } 49 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx6144m 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | kotlin.jvm.target.validation.mode = IGNORE -------------------------------------------------------------------------------- /Source-Code/ff_source_code/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip 7 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/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 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | 18 | buildscript { 19 | repositories { 20 | mavenCentral() 21 | maven { 22 | url = uri("https://storage.googleapis.com/r8-releases/raw") 23 | } 24 | } 25 | dependencies { 26 | classpath("com.android.tools:r8:8.2.24") 27 | } 28 | } 29 | 30 | } 31 | 32 | plugins { 33 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 34 | id "com.android.application" version "8.1.0" apply false 35 | id "org.jetbrains.kotlin.android" version "1.8.22" apply false 36 | id "com.google.gms.google-services" version "4.3.8" apply false // Google Services plugin 37 | 38 | } 39 | 40 | include ":app" -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/audios/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/audios/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/fonts/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/fonts/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/images/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/jsons/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/jsons/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/lottie_animations/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/lottie_animations/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/pdfs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/pdfs/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/rive_animations/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/rive_animations/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/assets/videos/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/assets/videos/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/firebase/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "firestore": { 3 | "rules": "firestore.rules", 4 | "indexes": "firestore.indexes.json" 5 | }, 6 | "functions": [ 7 | { 8 | "source": "functions", 9 | "codebase": "functions" 10 | } 11 | ], 12 | "storage": { 13 | "rules": "storage.rules" 14 | }, 15 | "hosting": { 16 | "public": "public", 17 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/firebase/firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | "indexes": [], 3 | "fieldOverrides": [ 4 | { 5 | "collectionGroup": "fcm_tokens", 6 | "fieldPath": "fcm_token", 7 | "indexes": [ 8 | { 9 | "order": "ASCENDING", 10 | "queryScope": "COLLECTION_GROUP" 11 | } 12 | ] 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /Source-Code/ff_source_code/firebase/firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | match /mycollection/{document} { 5 | allow create: if true; 6 | allow read: if true; 7 | allow write: if false; 8 | allow delete: if false; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/firebase/functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-functions", 3 | "description": "Firebase Cloud Functions", 4 | "dependencies": { 5 | "firebase-admin": "^11.11.0", 6 | "firebase-functions": "^4.4.1", 7 | "braintree": "^3.6.0", 8 | "@mux/mux-node": "^7.3.3", 9 | "stripe": "^8.0.1", 10 | "axios": "1.8.2", 11 | "razorpay": "^2.8.4", 12 | "qs": "^6.7.0", 13 | "@onesignal/node-onesignal": "^2.0.1-beta2", 14 | "@langchain/core": "^0.3.19", 15 | "@langchain/langgraph": "^0.2.23", 16 | "@langchain/openai": "^0.3.14", 17 | "@langchain/google-genai": "^0.0.8", 18 | "@langchain/anthropic": "^0.1.1" 19 | }, 20 | "devDependencies": { 21 | "eslint": "^6.8.0", 22 | "eslint-plugin-promise": "^4.2.1" 23 | }, 24 | "scripts": { 25 | "lint": "./node_modules/.bin/eslint --max-warnings=0 .", 26 | "serve": "firebase -P ff-source-code emulators:start --only functions", 27 | "shell": "firebase -P ff-source-code functions:shell", 28 | "start": "npm run shell", 29 | "logs": "firebase -P ff-source-code functions:log", 30 | "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" 31 | }, 32 | "engines": { 33 | "node": "20" 34 | }, 35 | "private": true 36 | } 37 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/firebase/storage.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service firebase.storage { 3 | match /b/{bucket}/o { 4 | match /{allPaths=**} { 5 | allow read, write: if false; 6 | } 7 | match /users/{userId}/{allPaths=**} { 8 | allow read: if true; 9 | allow write: if request.auth.uid == userId; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | build/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/app.flx 23 | Flutter/app.zip 24 | Flutter/flutter_assets/ 25 | Flutter/flutter_export_environment.sh 26 | ServiceDefinitions.json 27 | Runner/GeneratedPluginRegistrant.* 28 | 29 | # Exceptions to above rules. 30 | !default.mode1v3 31 | !default.mode2v3 32 | !default.pbxuser 33 | !default.perspectivev3 34 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CFBundleDevelopmentRegion</key> 6 | <string>$(DEVELOPMENT_LANGUAGE)</string> 7 | <key>CFBundleExecutable</key> 8 | <string>App</string> 9 | <key>CFBundleIdentifier</key> 10 | <string>io.flutter.flutter.app</string> 11 | <key>CFBundleInfoDictionaryVersion</key> 12 | <string>6.0</string> 13 | <key>CFBundleName</key> 14 | <string>App</string> 15 | <key>CFBundlePackageType</key> 16 | <string>FMWK</string> 17 | <key>CFBundleShortVersionString</key> 18 | <string>1.0</string> 19 | <key>CFBundleSignature</key> 20 | <string>????</string> 21 | <key>CFBundleVersion</key> 22 | <string>1.0</string> 23 | <key>MinimumOSVersion</key> 24 | <string>14.0.0</string> 25 | </dict> 26 | </plist> 27 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/ImageNotification/Info.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CFBundleDevelopmentRegion</key> 6 | <string>$(DEVELOPMENT_LANGUAGE)</string> 7 | <key>CFBundleDisplayName</key> 8 | <string>ImageNotification</string> 9 | <key>CFBundleExecutable</key> 10 | <string>$(EXECUTABLE_NAME)</string> 11 | <key>CFBundleIdentifier</key> 12 | <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 13 | <key>CFBundleInfoDictionaryVersion</key> 14 | <string>6.0</string> 15 | <key>CFBundleName</key> 16 | <string>$(PRODUCT_NAME)</string> 17 | <key>CFBundlePackageType</key> 18 | <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> 19 | <key>CFBundleShortVersionString</key> 20 | <string>1.0</string> 21 | <key>CFBundleVersion</key> 22 | <string>1</string> 23 | <key>NSExtension</key> 24 | <dict> 25 | <key>NSExtensionPointIdentifier</key> 26 | <string>com.apple.usernotifications.service</string> 27 | <key>NSExtensionPrincipalClass</key> 28 | <string>$(PRODUCT_MODULE_NAME).NotificationService</string> 29 | </dict> 30 | </dict> 31 | </plist> 32 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/ImageNotification/NotificationService.swift: -------------------------------------------------------------------------------- 1 | import FirebaseMessaging 2 | import UserNotifications 3 | 4 | class NotificationService: UNNotificationServiceExtension { 5 | 6 | var contentHandler: ((UNNotificationContent) -> Void)? 7 | var bestAttemptContent: UNMutableNotificationContent? 8 | 9 | override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { 10 | self.contentHandler = contentHandler 11 | bestAttemptContent = request.content 12 | .mutableCopy() as? UNMutableNotificationContent 13 | guard let bestAttemptContent = bestAttemptContent else { return } 14 | FIRMessagingExtensionHelper().populateNotificationContent( 15 | bestAttemptContent, 16 | withContentHandler: contentHandler) 17 | } 18 | 19 | override func serviceExtensionTimeWillExpire() { 20 | // Called just before the extension will be terminated by the system. 21 | // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. 22 | if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { 23 | contentHandler(bestAttemptContent) 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Workspace 3 | version = "1.0"> 4 | <FileRef 5 | location = "group:Runner.xcodeproj"> 6 | </FileRef> 7 | </Workspace> 8 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>PreviewsEnabled</key> 6 | <false/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Workspace 3 | version = "1.0"> 4 | <FileRef 5 | location = "group:Runner.xcodeproj"> 6 | </FileRef> 7 | </Workspace> 8 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>PreviewsEnabled</key> 6 | <false/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | import Flutter 4 | 5 | @main 6 | @objc class AppDelegate: FlutterAppDelegate { 7 | override func application( 8 | _ application: UIApplication, 9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 10 | ) -> Bool { 11 | GeneratedPluginRegistrant.register(with: self) 12 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/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 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/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. -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CLIENT_ID</key> 6 | <string>880136316624-uh92r6han00ovgqn4ljn4qgql0va3plr.apps.googleusercontent.com</string> 7 | <key>REVERSED_CLIENT_ID</key> 8 | <string>com.googleusercontent.apps.880136316624-uh92r6han00ovgqn4ljn4qgql0va3plr</string> 9 | <key>ANDROID_CLIENT_ID</key> 10 | <string>880136316624-5ovp28hs4nk37jg98lrnp0u7ruklm9bn.apps.googleusercontent.com</string> 11 | <key>API_KEY</key> 12 | <string>AIzaSyDsrJYG5cxD7S_7ePwb88aVbpp-IQDVFJk</string> 13 | <key>GCM_SENDER_ID</key> 14 | <string>880136316624</string> 15 | <key>PLIST_VERSION</key> 16 | <string>1</string> 17 | <key>BUNDLE_ID</key> 18 | <string>com.mycompany.ffsourcecode</string> 19 | <key>PROJECT_ID</key> 20 | <string>ff-source-code</string> 21 | <key>STORAGE_BUCKET</key> 22 | <string>ff-source-code.appspot.com</string> 23 | <key>IS_ADS_ENABLED</key> 24 | <false></false> 25 | <key>IS_ANALYTICS_ENABLED</key> 26 | <false></false> 27 | <key>IS_APPINVITE_ENABLED</key> 28 | <true></true> 29 | <key>IS_GCM_ENABLED</key> 30 | <true></true> 31 | <key>IS_SIGNIN_ENABLED</key> 32 | <true></true> 33 | <key>GOOGLE_APP_ID</key> 34 | <string>1:880136316624:ios:08b360a4bd6410cd31e0d5</string> 35 | </dict> 36 | </plist> -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/PrivacyInfo.xcprivacy: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict/> 5 | </plist> 6 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/ios/Runner/Runner.entitlements: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>aps-environment</key> 6 | <string>development</string> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/app_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '/backend/backend.dart'; 3 | import '/backend/api_requests/api_manager.dart'; 4 | import 'backend/supabase/supabase.dart'; 5 | import 'package:shared_preferences/shared_preferences.dart'; 6 | import 'flutter_flow/flutter_flow_util.dart'; 7 | 8 | class FFAppState extends ChangeNotifier { 9 | static FFAppState _instance = FFAppState._internal(); 10 | 11 | factory FFAppState() { 12 | return _instance; 13 | } 14 | 15 | FFAppState._internal(); 16 | 17 | static void reset() { 18 | _instance = FFAppState._internal(); 19 | } 20 | 21 | Future initializePersistedState() async {} 22 | 23 | void update(VoidCallback callback) { 24 | callback(); 25 | notifyListeners(); 26 | } 27 | 28 | String _test = ''; 29 | String get test => _test; 30 | set test(String value) { 31 | _test = value; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/base_auth_user_provider.dart: -------------------------------------------------------------------------------- 1 | class AuthUserInfo { 2 | const AuthUserInfo({ 3 | this.uid, 4 | this.email, 5 | this.displayName, 6 | this.photoUrl, 7 | this.phoneNumber, 8 | }); 9 | 10 | final String? uid; 11 | final String? email; 12 | final String? displayName; 13 | final String? photoUrl; 14 | final String? phoneNumber; 15 | } 16 | 17 | abstract class BaseAuthUser { 18 | bool get loggedIn; 19 | bool get emailVerified; 20 | 21 | AuthUserInfo get authUserInfo; 22 | 23 | Future? delete(); 24 | Future? updateEmail(String email); 25 | Future? updatePassword(String newPassword); 26 | Future? sendEmailVerification(); 27 | Future refreshUser() async {} 28 | 29 | String? get uid => authUserInfo.uid; 30 | String? get email => authUserInfo.email; 31 | String? get displayName => authUserInfo.displayName; 32 | String? get photoUrl => authUserInfo.photoUrl; 33 | String? get phoneNumber => authUserInfo.phoneNumber; 34 | } 35 | 36 | BaseAuthUser? currentUser; 37 | bool get loggedIn => currentUser?.loggedIn ?? false; 38 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/anonymous_auth.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | 3 | Future<UserCredential?> anonymousSignInFunc() => 4 | FirebaseAuth.instance.signInAnonymously(); 5 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/auth_util.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/foundation.dart' show kIsWeb; 4 | import 'package:firebase_auth/firebase_auth.dart'; 5 | import 'package:flutter/material.dart'; 6 | import '../auth_manager.dart'; 7 | import '../base_auth_user_provider.dart'; 8 | import '../../flutter_flow/flutter_flow_util.dart'; 9 | 10 | import 'firebase_auth_manager.dart'; 11 | 12 | export 'firebase_auth_manager.dart'; 13 | 14 | final _authManager = FirebaseAuthManager(); 15 | FirebaseAuthManager get authManager => _authManager; 16 | 17 | String get currentUserEmail => currentUser?.email ?? ''; 18 | 19 | String get currentUserUid => currentUser?.uid ?? ''; 20 | 21 | String get currentUserDisplayName => currentUser?.displayName ?? ''; 22 | 23 | String get currentUserPhoto => currentUser?.photoUrl ?? ''; 24 | 25 | String get currentPhoneNumber => currentUser?.phoneNumber ?? ''; 26 | 27 | String get currentJwtToken => _currentJwtToken ?? ''; 28 | 29 | bool get currentUserEmailVerified => currentUser?.emailVerified ?? false; 30 | 31 | /// Create a Stream that listens to the current user's JWT Token, since Firebase 32 | /// generates a new token every hour. 33 | String? _currentJwtToken; 34 | final jwtTokenStream = FirebaseAuth.instance 35 | .idTokenChanges() 36 | .map((user) async => _currentJwtToken = await user?.getIdToken()) 37 | .asBroadcastStream(); 38 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/email_auth.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | 3 | Future<UserCredential?> emailSignInFunc( 4 | String email, 5 | String password, 6 | ) => 7 | FirebaseAuth.instance 8 | .signInWithEmailAndPassword(email: email.trim(), password: password); 9 | 10 | Future<UserCredential?> emailCreateAccountFunc( 11 | String email, 12 | String password, 13 | ) => 14 | FirebaseAuth.instance.createUserWithEmailAndPassword( 15 | email: email.trim(), 16 | password: password, 17 | ); 18 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/github_auth.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/foundation.dart'; 3 | 4 | // https://firebase.flutter.dev/docs/auth/social/#github 5 | Future<UserCredential?> githubSignInFunc() async { 6 | // Create a new provider 7 | GithubAuthProvider githubProvider = GithubAuthProvider(); 8 | 9 | // Once signed in, return the UserCredential 10 | return await FirebaseAuth.instance.signInWithPopup(githubProvider); 11 | } 12 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/google_auth.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/foundation.dart'; 3 | import 'package:google_sign_in/google_sign_in.dart'; 4 | 5 | final _googleSignIn = GoogleSignIn(scopes: ['profile', 'email']); 6 | 7 | Future<UserCredential?> googleSignInFunc() async { 8 | if (kIsWeb) { 9 | // Once signed in, return the UserCredential 10 | return await FirebaseAuth.instance.signInWithPopup(GoogleAuthProvider()); 11 | } 12 | 13 | await signOutWithGoogle().catchError((_) => null); 14 | final auth = await (await _googleSignIn.signIn())?.authentication; 15 | if (auth == null) { 16 | return null; 17 | } 18 | final credential = GoogleAuthProvider.credential( 19 | idToken: auth.idToken, accessToken: auth.accessToken); 20 | return FirebaseAuth.instance.signInWithCredential(credential); 21 | } 22 | 23 | Future signOutWithGoogle() => _googleSignIn.signOut(); 24 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/auth/firebase_auth/jwt_token_auth.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | 3 | Future<UserCredential?> jwtTokenSignIn(String jwtToken) => 4 | FirebaseAuth.instance.signInWithCustomToken(jwtToken); 5 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/api_requests/get_streamed_response.dart: -------------------------------------------------------------------------------- 1 | import 'package:http/http.dart'; 2 | 3 | Future<StreamedResponse> getStreamedResponse(Request request) => 4 | Client().send(request); 5 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/cloud_functions/cloud_functions.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_functions/cloud_functions.dart'; 2 | 3 | Future<Map<String, dynamic>> makeCloudCall( 4 | String callName, 5 | Map<String, dynamic> input, 6 | ) async { 7 | try { 8 | final response = await FirebaseFunctions.instance 9 | .httpsCallable(callName, options: HttpsCallableOptions()) 10 | .call(input); 11 | return response.data is Map 12 | ? Map<String, dynamic>.from(response.data as Map) 13 | : {}; 14 | } on FirebaseFunctionsException catch (e) { 15 | print( 16 | 'Cloud call error!\n ${callName}' 17 | 'Code: ${e.code}\n' 18 | 'Details: ${e.details}\n' 19 | 'Message: ${e.message}', 20 | ); 21 | } catch (e) { 22 | print('Cloud call error:${callName} $e'); 23 | } 24 | return {}; 25 | } 26 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/firebase/firebase_config.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_core/firebase_core.dart'; 2 | import 'package:flutter/foundation.dart'; 3 | 4 | Future initFirebase() async { 5 | if (kIsWeb) { 6 | await Firebase.initializeApp( 7 | options: FirebaseOptions( 8 | apiKey: "AIzaSyD_oyxrxUGyDsP7lezhQUyx2gqkSyZsLcA", 9 | authDomain: "ff-source-code.firebaseapp.com", 10 | projectId: "ff-source-code", 11 | storageBucket: "ff-source-code.appspot.com", 12 | messagingSenderId: "880136316624", 13 | appId: "1:880136316624:web:adee75899a03af9331e0d5")); 14 | } else { 15 | await Firebase.initializeApp(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/firebase_storage/storage.dart: -------------------------------------------------------------------------------- 1 | import 'dart:typed_data'; 2 | 3 | import 'package:firebase_storage/firebase_storage.dart'; 4 | import 'package:mime_type/mime_type.dart'; 5 | 6 | Future<String?> uploadData(String path, Uint8List data) async { 7 | final storageRef = FirebaseStorage.instance.ref().child(path); 8 | final metadata = SettableMetadata(contentType: mime(path)); 9 | final result = await storageRef.putData(data, metadata); 10 | return result.state == TaskState.success ? result.ref.getDownloadURL() : null; 11 | } 12 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/schema/firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | "indexes": [], 3 | "fieldOverrides": [ 4 | { 5 | "collectionGroup": "fcm_tokens", 6 | "fieldPath": "fcm_token", 7 | "indexes": [ 8 | { 9 | "order": "ASCENDING", 10 | "queryScope": "COLLECTION_GROUP" 11 | } 12 | ] 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/schema/firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | match /mycollection/{document} { 5 | allow create: if true; 6 | allow read: if true; 7 | allow write: if false; 8 | allow delete: if false; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/schema/index.dart: -------------------------------------------------------------------------------- 1 | export 'package:cloud_firestore/cloud_firestore.dart' hide Order; 2 | export 'package:flutter/material.dart' show Color, Colors; 3 | export '/flutter_flow/lat_lng.dart'; 4 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/schema/util/schema_util.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:from_css_color/from_css_color.dart'; 5 | 6 | import '/flutter_flow/flutter_flow_util.dart'; 7 | 8 | export 'package:collection/collection.dart' show ListEquality; 9 | export 'package:flutter/material.dart' show Color, Colors; 10 | export 'package:from_css_color/from_css_color.dart'; 11 | 12 | typedef StructBuilder<T> = T Function(Map<String, dynamic> data); 13 | 14 | abstract class BaseStruct { 15 | Map<String, dynamic> toSerializableMap(); 16 | String serialize() => json.encode(toSerializableMap()); 17 | } 18 | 19 | List<T>? getStructList<T>( 20 | dynamic value, 21 | StructBuilder<T> structBuilder, 22 | ) => 23 | value is! List 24 | ? null 25 | : value 26 | .where((e) => e is Map<String, dynamic>) 27 | .map((e) => structBuilder(e as Map<String, dynamic>)) 28 | .toList(); 29 | 30 | Color? getSchemaColor(dynamic value) => value is String 31 | ? fromCssColor(value) 32 | : value is Color 33 | ? value 34 | : null; 35 | 36 | List<Color>? getColorsList(dynamic value) => 37 | value is! List ? null : value.map(getSchemaColor).withoutNulls; 38 | 39 | List<T>? getDataList<T>(dynamic value) => 40 | value is! List ? null : value.map((e) => castToType<T>(e)!).toList(); 41 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/supabase/database/database.dart: -------------------------------------------------------------------------------- 1 | export '../../../flutter_flow/lat_lng.dart'; 2 | export 'package:supabase_flutter/supabase_flutter.dart' hide Provider; 3 | 4 | export '../supabase.dart'; 5 | export 'row.dart'; 6 | export 'table.dart'; 7 | 8 | export 'tables/demo.dart'; 9 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/supabase/database/tables/demo.dart: -------------------------------------------------------------------------------- 1 | import '../database.dart'; 2 | 3 | class DemoTable extends SupabaseTable<DemoRow> { 4 | @override 5 | String get tableName => 'demo'; 6 | 7 | @override 8 | DemoRow createRow(Map<String, dynamic> data) => DemoRow(data); 9 | } 10 | 11 | class DemoRow extends SupabaseDataRow { 12 | DemoRow(Map<String, dynamic> data) : super(data); 13 | 14 | @override 15 | SupabaseTable get table => DemoTable(); 16 | 17 | int get id => getField<int>('id')!; 18 | set id(int value) => setField<int>('id', value); 19 | 20 | DateTime? get createdAt => getField<DateTime>('created_at'); 21 | set createdAt(DateTime? value) => setField<DateTime>('created_at', value); 22 | } 23 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/backend/supabase/supabase.dart: -------------------------------------------------------------------------------- 1 | import 'package:supabase_flutter/supabase_flutter.dart' hide Provider; 2 | import '/flutter_flow/flutter_flow_util.dart'; 3 | 4 | export 'database/database.dart'; 5 | export 'storage/storage.dart'; 6 | 7 | String _kSupabaseUrl = 'https://flbbrhrhqrffwapxlssu.supabase.co'; 8 | String _kSupabaseAnonKey = 9 | 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImZsYmJyaHJocXJmZndhcHhsc3N1Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODY3MjkyODMsImV4cCI6MjAwMjMwNTI4M30.f4Ba_CEpmViYOQkQHrTN9jg6u_zgL3OKnL0hmhHCW7k'; 10 | 11 | class SupaFlow { 12 | SupaFlow._(); 13 | 14 | static SupaFlow? _instance; 15 | static SupaFlow get instance => _instance ??= SupaFlow._(); 16 | 17 | final _supabase = Supabase.instance.client; 18 | static SupabaseClient get client => instance._supabase; 19 | 20 | static Future initialize() => Supabase.initialize( 21 | url: _kSupabaseUrl, 22 | headers: { 23 | 'X-Client-Info': 'flutterflow', 24 | }, 25 | anonKey: _kSupabaseAnonKey, 26 | debug: false, 27 | authOptions: 28 | FlutterAuthClientOptions(authFlowType: AuthFlowType.implicit), 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/flutter_flow/lat_lng.dart: -------------------------------------------------------------------------------- 1 | class LatLng { 2 | const LatLng(this.latitude, this.longitude); 3 | final double latitude; 4 | final double longitude; 5 | 6 | @override 7 | String toString() => 'LatLng(lat: $latitude, lng: $longitude)'; 8 | 9 | String serialize() => '$latitude,$longitude'; 10 | 11 | @override 12 | int get hashCode => latitude.hashCode + longitude.hashCode; 13 | 14 | @override 15 | bool operator ==(other) => 16 | other is LatLng && 17 | latitude == other.latitude && 18 | longitude == other.longitude; 19 | } 20 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/flutter_flow/place.dart: -------------------------------------------------------------------------------- 1 | import 'lat_lng.dart'; 2 | 3 | class FFPlace { 4 | const FFPlace({ 5 | this.latLng = const LatLng(0.0, 0.0), 6 | this.name = '', 7 | this.address = '', 8 | this.city = '', 9 | this.state = '', 10 | this.country = '', 11 | this.zipCode = '', 12 | }); 13 | 14 | final LatLng latLng; 15 | final String name; 16 | final String address; 17 | final String city; 18 | final String state; 19 | final String country; 20 | final String zipCode; 21 | 22 | @override 23 | String toString() => '''FFPlace( 24 | latLng: $latLng, 25 | name: $name, 26 | address: $address, 27 | city: $city, 28 | state: $state, 29 | country: $country, 30 | zipCode: $zipCode, 31 | )'''; 32 | 33 | @override 34 | int get hashCode => latLng.hashCode; 35 | 36 | @override 37 | bool operator ==(other) => 38 | other is FFPlace && 39 | latLng == other.latLng && 40 | name == other.name && 41 | address == other.address && 42 | city == other.city && 43 | state == other.state && 44 | country == other.country && 45 | zipCode == other.zipCode; 46 | } 47 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/index.dart: -------------------------------------------------------------------------------- 1 | // Export pages 2 | export '/pages/home_page/home_page_widget.dart' show HomePageWidget; 3 | export '/pages/login/login_widget.dart' show LoginWidget; 4 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/pages/home_page/home_page_model.dart: -------------------------------------------------------------------------------- 1 | import '/flutter_flow/flutter_flow_audio_player.dart'; 2 | import '/flutter_flow/flutter_flow_theme.dart'; 3 | import '/flutter_flow/flutter_flow_util.dart'; 4 | import '/flutter_flow/flutter_flow_video_player.dart'; 5 | import '/flutter_flow/flutter_flow_widgets.dart'; 6 | import '/flutter_flow/upload_data.dart'; 7 | import 'dart:ui'; 8 | import 'home_page_widget.dart' show HomePageWidget; 9 | import 'package:flutter/material.dart'; 10 | import 'package:google_fonts/google_fonts.dart'; 11 | import 'package:provider/provider.dart'; 12 | 13 | class HomePageModel extends FlutterFlowModel<HomePageWidget> { 14 | /// State fields for stateful widgets in this page. 15 | 16 | bool isDataUploading_uploadDataYxl = false; 17 | FFUploadedFile uploadedLocalFile_uploadDataYxl = 18 | FFUploadedFile(bytes: Uint8List.fromList([])); 19 | 20 | @override 21 | void initState(BuildContext context) {} 22 | 23 | @override 24 | void dispose() {} 25 | } 26 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/lib/pages/login/login_model.dart: -------------------------------------------------------------------------------- 1 | import '/flutter_flow/flutter_flow_theme.dart'; 2 | import '/flutter_flow/flutter_flow_util.dart'; 3 | import '/flutter_flow/flutter_flow_widgets.dart'; 4 | import 'dart:ui'; 5 | import 'login_widget.dart' show LoginWidget; 6 | import 'package:flutter/material.dart'; 7 | import 'package:google_fonts/google_fonts.dart'; 8 | import 'package:provider/provider.dart'; 9 | 10 | class LoginModel extends FlutterFlowModel<LoginWidget> { 11 | @override 12 | void initState(BuildContext context) {} 13 | 14 | @override 15 | void dispose() {} 16 | } 17 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/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 that Flutter provides. 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_test/flutter_test.dart'; 9 | 10 | import 'package:ff_source_code/main.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(MyApp()); 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/web/favicon.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/web/flutter_bootstrap.js: -------------------------------------------------------------------------------- 1 | {{flutter_js}} 2 | {{flutter_build_config}} 3 | 4 | _flutter.loader.load( 5 | { 6 | onEntrypointLoaded: async function(engineInitializer) { 7 | // Initialize the Flutter engine 8 | let appRunner = await engineInitializer.initializeEngine({}); 9 | // Run the app 10 | await appRunner.runApp(); 11 | } 12 | } 13 | ); 14 | -------------------------------------------------------------------------------- /Source-Code/ff_source_code/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/web/icons/Icon-192.png -------------------------------------------------------------------------------- /Source-Code/ff_source_code/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/Source-Code/ff_source_code/web/icons/Icon-512.png -------------------------------------------------------------------------------- /Supabase/Views/tasks-view.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW public.viewtask AS SELECT * FROM public.tasks; -------------------------------------------------------------------------------- /Videos/rowy-cloud-function-tutorial.js: -------------------------------------------------------------------------------- 1 | // YouTube channel - https://www.youtube.com/@flutterflowexpert 2 | // video - 3 | // Join the Klaturov army - https://www.youtube.com/@flutterflowexpert/join 4 | // Support my work - https://github.com/sponsors/bulgariamitko 5 | // Website - https://bulgariamitko.github.io/flutterflowtutorials/ 6 | // You can book me as FF mentor - https://calendly.com/bulgaria_mitko 7 | // GitHub repo - https://github.com/bulgariamitko/flutterflowtutorials 8 | // Discord channel - https://discord.gg/G69hSUqEeU 9 | 10 | const extensionBody: TaskBody = async({row, db, change, ref}) => { 11 | const { FieldValue } = require ("@google-cloud/firestore"); 12 | var fsCounterCollection = db.collection('fs_counters').doc('ecUzLabKtMqYb7U0MXEj') 13 | const res = await fsCounterCollection.update({ 14 | value: FieldValue.increment(1), 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /gh-pages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/gh-pages/.DS_Store -------------------------------------------------------------------------------- /gh-pages/css/styles.css: -------------------------------------------------------------------------------- 1 | .copied { 2 | background-color: green; 3 | } 4 | 5 | .navbar-custom { 6 | background-color: rgba(255, 255, 255, 0.7); 7 | } 8 | 9 | .bg-dark .navbar-custom { 10 | background-color: rgba(0, 0, 0, 0.7) !important; 11 | } 12 | 13 | .nav-search { 14 | margin-left: auto; 15 | margin-right: auto; 16 | } 17 | 18 | .nav-links { 19 | margin-left: auto; 20 | } 21 | 22 | .search-centered { 23 | display: flex; 24 | justify-content: center; 25 | flex-grow: 1; 26 | } 27 | 28 | .embed-responsive-item { 29 | height: 22rem; 30 | } -------------------------------------------------------------------------------- /gh-pages/web/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/gh-pages/web/loading.png -------------------------------------------------------------------------------- /lib/custom_code/actions/index.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/lib/custom_code/actions/index.dart -------------------------------------------------------------------------------- /lib/custom_code/widgets/index.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bulgariamitko/flutterflowtutorials/7e12df3b73b3c89b217d8339e827ce1d1c9d754c/lib/custom_code/widgets/index.dart --------------------------------------------------------------------------------