bob 1 månad sedan
incheckning
5228928b78
100 ändrade filer med 6340 tillägg och 0 borttagningar
  1. 50 0
      .gitignore
  2. 10 0
      .metadata
  3. 7 0
      README.md
  4. 29 0
      analysis_options.yaml
  5. 11 0
      android/.gitignore
  6. 90 0
      android/app/build.gradle
  7. 19 0
      android/app/proguard-rules.pro
  8. 7 0
      android/app/src/debug/AndroidManifest.xml
  9. 65 0
      android/app/src/main/AndroidManifest.xml
  10. 6 0
      android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
  11. 12 0
      android/app/src/main/res/drawable/launch_background.xml
  12. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  13. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  14. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  15. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  16. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  17. 20 0
      android/app/src/main/res/values-night-v31/styles.xml
  18. 20 0
      android/app/src/main/res/values-night/styles.xml
  19. 20 0
      android/app/src/main/res/values-v31/styles.xml
  20. 5 0
      android/app/src/main/res/values/strings.xml
  21. 20 0
      android/app/src/main/res/values/styles.xml
  22. 7 0
      android/app/src/profile/AndroidManifest.xml
  23. 48 0
      android/build.gradle
  24. 5 0
      android/gradle.properties
  25. 6 0
      android/gradle/wrapper/gradle-wrapper.properties
  26. 27 0
      android/settings.gradle
  27. BIN
      assets/audios/favicon.png
  28. BIN
      assets/fonts/favicon.png
  29. BIN
      assets/images/favicon.png
  30. BIN
      assets/images/logo800px.png
  31. BIN
      assets/jsons/favicon.png
  32. BIN
      assets/pdfs/favicon.png
  33. BIN
      assets/rive_animations/favicon.png
  34. BIN
      assets/videos/favicon.png
  35. 4 0
      devtools_options.yaml
  36. 33 0
      ios/.gitignore
  37. 26 0
      ios/Flutter/AppFrameworkInfo.plist
  38. 2 0
      ios/Flutter/Debug.xcconfig
  39. 2 0
      ios/Flutter/Release.xcconfig
  40. 32 0
      ios/Flutter/ephemeral/flutter_lldb_helper.py
  41. 5 0
      ios/Flutter/ephemeral/flutter_lldbinit
  42. 31 0
      ios/ImageNotification/Info.plist
  43. 27 0
      ios/ImageNotification/NotificationService.swift
  44. 45 0
      ios/Podfile
  45. 517 0
      ios/Runner.xcodeproj/project.pbxproj
  46. 7 0
      ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  47. 8 0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  48. 8 0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  49. 91 0
      ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  50. 7 0
      ios/Runner.xcworkspace/contents.xcworkspacedata
  51. 8 0
      ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  52. 8 0
      ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  53. 13 0
      ios/Runner/AppDelegate.swift
  54. 122 0
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  55. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  56. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  57. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  58. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  59. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  60. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  61. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  62. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  63. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  64. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  65. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  66. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  67. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  68. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  69. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  70. 23 0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  71. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  72. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  73. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  74. 5 0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  75. 37 0
      ios/Runner/Base.lproj/LaunchScreen.storyboard
  76. 26 0
      ios/Runner/Base.lproj/Main.storyboard
  77. 86 0
      ios/Runner/Info.plist
  78. 5 0
      ios/Runner/PrivacyInfo.xcprivacy
  79. 1 0
      ios/Runner/Runner-Bridging-Header.h
  80. 6 0
      ios/Runner/Runner.entitlements
  81. 1 0
      ios/Runner/en.lproj/InfoPlist.strings
  82. 1 0
      ios/Runner/nl.lproj/InfoPlist.strings
  83. 676 0
      lib/app_state.dart
  84. 13 0
      lib/auth/custom_auth/auth_util.dart
  85. 155 0
      lib/auth/custom_auth/custom_auth_manager.dart
  86. 24 0
      lib/auth/custom_auth/custom_auth_user_provider.dart
  87. 1302 0
      lib/backend/api_requests/api_calls.dart
  88. 615 0
      lib/backend/api_requests/api_manager.dart
  89. 29 0
      lib/backend/api_requests/browser_client_stub.dart
  90. 4 0
      lib/backend/api_requests/get_streamed_response.dart
  91. 416 0
      lib/backend/schema/structs/evenement_struct.dart
  92. 116 0
      lib/backend/schema/structs/gemeente_model_struct.dart
  93. 253 0
      lib/backend/schema/structs/horecagelegenheid_struct.dart
  94. 7 0
      lib/backend/schema/structs/index.dart
  95. 147 0
      lib/backend/schema/structs/provincie_model_struct.dart
  96. 142 0
      lib/backend/schema/structs/user_struct.dart
  97. 75 0
      lib/backend/schema/util/schema_util.dart
  98. 131 0
      lib/components/kaart_slider_uitgaan_s_comp_model.dart
  99. 422 0
      lib/components/kaart_slider_uitgaan_s_comp_widget.dart
  100. 142 0
      lib/components/kaart_tabel_uitgaan_comp_model.dart

+ 50 - 0
.gitignore

@@ -0,0 +1,50 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Firebase – this is necessary if you use Firebase since it could otherwise 
+# lead to leaking of private certificates to your repository, which is no bueno.
+.firebase/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release

+ 10 - 0
.metadata

@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: 4d7946a68d26794349189cf21b3f68cc6fe61dcb
+  channel: stable
+
+project_type: app

+ 7 - 0
README.md

@@ -0,0 +1,7 @@
+# Uitgaanskrant
+
+A new Flutter project.
+
+## Getting Started
+
+FlutterFlow projects are built to run on the Flutter _stable_ release.

+ 29 - 0
analysis_options.yaml

@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+  # The lint rules applied to this project can be customized in the
+  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+  # included above or to enable additional rules. A list of all available lints
+  # and their documentation is published at https://dart.dev/lints.
+  #
+  # Instead of disabling a lint rule for the entire project in the
+  # section below, it can also be suppressed for a single line of code
+  # or a specific dart file by using the `// ignore: name_of_lint` and
+  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+  # producing the lint.
+  rules:
+    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
+    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
+    unnecessary_string_escapes: false
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options

+ 11 - 0
android/.gitignore

@@ -0,0 +1,11 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties

+ 90 - 0
android/app/build.gradle

@@ -0,0 +1,90 @@
+plugins {
+   id "com.android.application"
+   id "kotlin-android"
+   id "dev.flutter.flutter-gradle-plugin"
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+    localPropertiesFile.withReader('UTF-8') { reader ->
+        localProperties.load(reader)
+    }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+    flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+    flutterVersionName = '1.0'
+}
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+android {
+    namespace "com.uitgaanskrant.app"
+    compileSdkVersion 36
+    ndkVersion "28.2.13676358"
+
+    compileOptions {
+        coreLibraryDesugaringEnabled true
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
+
+    sourceSets {
+        main.java.srcDirs += 'src/main/kotlin'
+    }
+
+    lintOptions {
+        disable 'InvalidPackage'
+        checkReleaseBuilds false
+    }
+
+    defaultConfig {
+        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+        applicationId "com.uitgaanskrant.app"
+        minSdkVersion flutter.minSdkVersion
+        targetSdkVersion 36
+        versionCode flutterVersionCode.toInteger()
+        versionName flutterVersionName
+    }
+
+   signingConfigs {
+       release {
+           keyAlias keystoreProperties['keyAlias']
+           keyPassword keystoreProperties['keyPassword']
+           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+           storePassword keystoreProperties['storePassword']
+       }
+   }
+
+    buildTypes {
+        release {
+            // TODO: Add your own signing config for the release build.
+            // Signing with the debug keys for now, so `flutter run --release` works.
+            signingConfig signingConfigs.debug
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+flutter {
+    source '../..'
+}
+
+dependencies {
+    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0"
+}

+ 19 - 0
android/app/proguard-rules.pro

@@ -0,0 +1,19 @@
+# Please add these rules to your existing keep rules in order to suppress warnings.
+# This is generated automatically by the Android Gradle plugin.
+-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue
+-dontwarn com.google.errorprone.annotations.CheckReturnValue
+-dontwarn com.google.errorprone.annotations.Immutable
+-dontwarn com.google.errorprone.annotations.RestrictedApi
+-dontwarn javax.annotation.Nullable
+-dontwarn javax.annotation.concurrent.GuardedBy
+-dontwarn org.bouncycastle.jce.provider.BouncyCastleProvider
+-dontwarn org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider
+-dontwarn com.fasterxml.jackson.core.**
+-dontwarn com.fasterxml.jackson.databind.**
+-dontwarn com.google.auto.value.**
+-keep class org.xmlpull.v1.** { *; }
+
+
+
+
+

+ 7 - 0
android/app/src/debug/AndroidManifest.xml

@@ -0,0 +1,7 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.uitgaanskrant.app">
+    <!-- Flutter needs it to communicate with the running application
+         to allow setting breakpoints, to provide hot reload, etc.
+    -->
+    <uses-permission android:name="android.permission.INTERNET"/>
+</manifest>

+ 65 - 0
android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,65 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.uitgaanskrant.app"
+    xmlns:tools="http://schemas.android.com/tools">
+    <uses-permission android:name="android.permission.INTERNET"/>
+
+
+    <application
+        android:label="Uitgaanskrant.com"
+        tools:replace="android:label"
+        android:icon="@mipmap/ic_launcher"
+        android:requestLegacyExternalStorage="true">
+
+        <activity
+            android:name=".MainActivity"
+            android:exported="true"
+            android:launchMode="singleTop"
+            android:theme="@style/LaunchTheme"
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+            android:hardwareAccelerated="true"
+            android:windowSoftInputMode="adjustResize">
+            <!-- Specifies an Android theme to apply to this Activity as soon as
+                 the Android process has started. This theme is visible to the user
+                 while the Flutter UI initializes. After that, this theme continues
+                 to determine the Window background behind the Flutter UI. -->
+            <meta-data
+              android:name="io.flutter.embedding.android.NormalTheme"
+              android:resource="@style/NormalTheme"
+              />
+            <!-- Displays an Android View that continues showing the launch screen
+                 Drawable until Flutter paints its first frame, then this splash
+                 screen fades out. A splash screen is useful to avoid any visual
+                 gap between the end of Android's launch screen and the painting of
+                 Flutter's first frame. -->
+            <meta-data
+              android:name="io.flutter.embedding.android.SplashScreenDrawable"
+              android:resource="@drawable/launch_background"
+              />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+            <!-- Deep linking -->
+            <meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
+            <intent-filter android:autoVerify="true">
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="uitgaanskrant" android:host="uitgaanskrant.com" />
+            </intent-filter>
+
+        </activity>
+
+        <!-- Don't delete the meta-data below.
+             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+        <meta-data
+            android:name="flutterEmbedding"
+            android:value="2" />
+
+        <meta-data
+            android:name="com.google.android.gms.ads.APPLICATION_ID"
+            android:value="ca-app-pub-2431417692812232~9291045893"/>
+
+
+    </application>
+</manifest>

+ 6 - 0
android/app/src/main/kotlin/com/example/my_project/MainActivity.kt

@@ -0,0 +1,6 @@
+package com.uitgaanskrant.app
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}

+ 12 - 0
android/app/src/main/res/drawable/launch_background.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Modify this file to customize your launch splash screen -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="?android:colorBackground" />
+
+    <!-- You can insert your own image assets here -->
+    <!-- <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@mipmap/launch_image" />
+    </item> -->
+</layer-list>

BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


+ 20 - 0
android/app/src/main/res/values-night-v31/styles.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+</resources>

+ 20 - 0
android/app/src/main/res/values-night/styles.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+</resources>

+ 20 - 0
android/app/src/main/res/values-v31/styles.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+</resources>

+ 5 - 0
android/app/src/main/res/values/strings.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+    <string name="app_name">Uitgaanskrant.com</string>
+
+</resources>

+ 20 - 0
android/app/src/main/res/values/styles.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
+</resources>

+ 7 - 0
android/app/src/profile/AndroidManifest.xml

@@ -0,0 +1,7 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.uitgaanskrant.app">
+    <!-- Flutter needs it to communicate with the running application
+         to allow setting breakpoints, to provide hot reload, etc.
+    -->
+    <uses-permission android:name="android.permission.INTERNET"/>
+</manifest>

+ 48 - 0
android/build.gradle

@@ -0,0 +1,48 @@
+allprojects {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+rootProject.buildDir = '../build'
+
+subprojects {
+    afterEvaluate { project ->
+        if (project.hasProperty("kotlin")) {
+            project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
+                kotlinOptions {
+                    jvmTarget = "1.8"
+                }
+            }
+        }
+    }
+}
+
+subprojects {
+    afterEvaluate { project ->
+        if (project.plugins.hasPlugin("com.android.application") ||
+                project.plugins.hasPlugin("com.android.library")) {
+            project.android {
+                compileSdkVersion 36
+            }
+        }
+        if (project.hasProperty('android')) {
+                project.android {
+                    if (namespace == null) {
+                        namespace project.group
+                    }
+                }
+            }
+    }
+}
+subprojects {
+    project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+    project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+    delete rootProject.layout.buildDirectory
+}

+ 5 - 0
android/gradle.properties

@@ -0,0 +1,5 @@
+org.gradle.jvmargs=-Xmx6144m
+android.useAndroidX=true
+android.enableJetifier=true
+android.enableR8=true
+kotlin.jvm.target.validation.mode = IGNORE

+ 6 - 0
android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip

+ 27 - 0
android/settings.gradle

@@ -0,0 +1,27 @@
+pluginManagement {
+    def flutterSdkPath = {
+        def properties = new Properties()
+        file("local.properties").withInputStream { properties.load(it) }
+        def flutterSdkPath = properties.getProperty("flutter.sdk")
+        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+        return flutterSdkPath
+    }()
+
+    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+    repositories {
+        google()
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
+
+plugins {
+    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+    id "com.android.application" version "8.9.1" apply false
+    id "org.jetbrains.kotlin.android" version "2.1.0" apply false
+    
+    
+}
+
+include ":app"

BIN
assets/audios/favicon.png


BIN
assets/fonts/favicon.png


BIN
assets/images/favicon.png


BIN
assets/images/logo800px.png


BIN
assets/jsons/favicon.png


BIN
assets/pdfs/favicon.png


BIN
assets/rive_animations/favicon.png


BIN
assets/videos/favicon.png


+ 4 - 0
devtools_options.yaml

@@ -0,0 +1,4 @@
+description: DevTools extension for FlutterFlow Debug Panel
+documentation: https://docs.flutterflow.io
+extensions:
+  - flutterflow_debug_panel: true

+ 33 - 0
ios/.gitignore

@@ -0,0 +1,33 @@
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+build/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3

+ 26 - 0
ios/Flutter/AppFrameworkInfo.plist

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>$(DEVELOPMENT_LANGUAGE)</string>
+  <key>CFBundleExecutable</key>
+  <string>App</string>
+  <key>CFBundleIdentifier</key>
+  <string>io.flutter.flutter.app</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>App</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1.0</string>
+  <key>MinimumOSVersion</key>
+  <string>14.0.0</string>
+</dict>
+</plist>

+ 2 - 0
ios/Flutter/Debug.xcconfig

@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"

+ 2 - 0
ios/Flutter/Release.xcconfig

@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"

+ 32 - 0
ios/Flutter/ephemeral/flutter_lldb_helper.py

@@ -0,0 +1,32 @@
+#
+# Generated file, do not edit.
+#
+
+import lldb
+
+def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):
+    """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages."""
+    base = frame.register["x0"].GetValueAsAddress()
+    page_len = frame.register["x1"].GetValueAsUnsigned()
+
+    # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the
+    # first page to see if handled it correctly. This makes diagnosing
+    # misconfiguration (e.g. missing breakpoint) easier.
+    data = bytearray(page_len)
+    data[0:8] = b'IHELPED!'
+
+    error = lldb.SBError()
+    frame.GetThread().GetProcess().WriteMemory(base, data, error)
+    if not error.Success():
+        print(f'Failed to write into {base}[+{page_len}]', error)
+        return
+
+def __lldb_init_module(debugger: lldb.SBDebugger, _):
+    target = debugger.GetDummyTarget()
+    # Caveat: must use BreakpointCreateByRegEx here and not
+    # BreakpointCreateByName. For some reasons callback function does not
+    # get carried over from dummy target for the later.
+    bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$")
+    bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))
+    bp.SetAutoContinue(True)
+    print("-- LLDB integration loaded --")

+ 5 - 0
ios/Flutter/ephemeral/flutter_lldbinit

@@ -0,0 +1,5 @@
+#
+# Generated file, do not edit.
+#
+
+command script import --relative-to-command-file flutter_lldb_helper.py

+ 31 - 0
ios/ImageNotification/Info.plist

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleDisplayName</key>
+	<string>ImageNotification</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>NSExtension</key>
+	<dict>
+		<key>NSExtensionPointIdentifier</key>
+		<string>com.apple.usernotifications.service</string>
+		<key>NSExtensionPrincipalClass</key>
+		<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
+	</dict>
+</dict>
+</plist>

+ 27 - 0
ios/ImageNotification/NotificationService.swift

@@ -0,0 +1,27 @@
+import FirebaseMessaging
+import UserNotifications
+
+class NotificationService: UNNotificationServiceExtension {
+
+    var contentHandler: ((UNNotificationContent) -> Void)?
+    var bestAttemptContent: UNMutableNotificationContent?
+
+    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
+        self.contentHandler = contentHandler
+        bestAttemptContent = request.content
+          .mutableCopy() as? UNMutableNotificationContent
+        guard let bestAttemptContent = bestAttemptContent else { return }
+        FIRMessagingExtensionHelper().populateNotificationContent(
+          bestAttemptContent,
+          withContentHandler: contentHandler)
+    }
+    
+    override func serviceExtensionTimeWillExpire() {
+        // Called just before the extension will be terminated by the system.
+        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
+        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
+            contentHandler(bestAttemptContent)
+        }
+    }
+
+}

+ 45 - 0
ios/Podfile

@@ -0,0 +1,45 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '14.0.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+  use_frameworks! :linkage => :static
+  use_modular_headers!
+
+  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_ios_build_settings(target)
+    target.build_configurations.each do |config|
+      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
+      
+    end
+  end
+end

+ 517 - 0
ios/Runner.xcodeproj/project.pbxproj

@@ -0,0 +1,517 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+		44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */; };
+		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+		6436409A27A31CD800820AF7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6436409C27A31CD800820AF7 /* InfoPlist.strings */; };
+		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+			);
+			name = "Embed Frameworks";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
+		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
+		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
+		44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
+		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
+		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
+		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		6436409727A31CD400820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409727A31CD200820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		97C146EB1CF9000F007C117D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		9740EEB11CF90186004384FC /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				9740EEB31CF90195004384FC /* Generated.xcconfig */,
+			);
+			name = Flutter;
+			sourceTree = "<group>";
+		};
+		97C146E51CF9000F007C117D = {
+			isa = PBXGroup;
+			children = (
+				9740EEB11CF90186004384FC /* Flutter */,
+				97C146F01CF9000F007C117D /* Runner */,
+				97C146EF1CF9000F007C117D /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		97C146EF1CF9000F007C117D /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				97C146EE1CF9000F007C117D /* Runner.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		97C146F01CF9000F007C117D /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				97C146FA1CF9000F007C117D /* Main.storyboard */,
+				97C146FD1CF9000F007C117D /* Assets.xcassets */,
+				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+				97C147021CF9000F007C117D /* Info.plist */,
+				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+				74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+				6436409C27A31CD800820AF7 /* InfoPlist.strings */,
+				44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		97C146ED1CF9000F007C117D /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				9740EEB61CF901F6004384FC /* Run Script */,
+				97C146EA1CF9000F007C117D /* Sources */,
+				97C146EB1CF9000F007C117D /* Frameworks */,
+				97C146EC1CF9000F007C117D /* Resources */,
+				9705A1C41CF9048500538489 /* Embed Frameworks */,
+				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		97C146E61CF9000F007C117D /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1020;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					97C146ED1CF9000F007C117D = {
+						CreatedOnToolsVersion = 7.3.1;
+						LastSwiftMigration = 1100;
+					};
+				};
+			};
+			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = nl;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				nl,
+				en,
+				Base,
+			);
+			mainGroup = 97C146E51CF9000F007C117D;
+			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				97C146ED1CF9000F007C117D /* Runner */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		97C146EC1CF9000F007C117D /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+				44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */,
+				6436409A27A31CD800820AF7 /* InfoPlist.strings in Resources */,
+				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Thin Binary";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+		};
+		9740EEB61CF901F6004384FC /* Run Script */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Run Script";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		97C146EA1CF9000F007C117D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				6436409727A31CD400820AF7 /* nl */,
+				6436409727A31CD200820AF7 /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C146FB1CF9000F007C117D /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C147001CF9000F007C117D /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		249021D3217E4FDB00AE95B9 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				SUPPORTED_PLATFORMS = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Profile;
+		};
+		249021D4217E4FDB00AE95B9 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.uitgaanskrant.app;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Profile;
+		};
+		97C147031CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		97C147041CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				SUPPORTED_PLATFORMS = iphoneos;
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		97C147061CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.uitgaanskrant.app;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		97C147071CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/Flutter",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.uitgaanskrant.app;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147031CF9000F007C117D /* Debug */,
+				97C147041CF9000F007C117D /* Release */,
+				249021D3217E4FDB00AE95B9 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147061CF9000F007C117D /* Debug */,
+				97C147071CF9000F007C117D /* Release */,
+				249021D4217E4FDB00AE95B9 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}

+ 7 - 0
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 8 - 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreviewsEnabled</key>
+	<false/>
+</dict>
+</plist>

+ 91 - 0
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1020"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+               BuildableName = "Runner.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 7 - 0
ios/Runner.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 8 - 0
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreviewsEnabled</key>
+	<false/>
+</dict>
+</plist>

+ 13 - 0
ios/Runner/AppDelegate.swift

@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@main
+@objc class AppDelegate: FlutterAppDelegate {
+  override func application(
+    _ application: UIApplication,
+    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+  ) -> Bool {
+    GeneratedPluginRegistrant.register(with: self)
+    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+  }
+}

+ 122 - 0
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,122 @@
+{
+  "images" : [
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-83.5x83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "Icon-App-1024x1024@1x.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png


+ 23 - 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png


BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png


BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png


+ 5 - 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md

@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

+ 37 - 0
ios/Runner/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
+                        <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
+                        </constraints>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="LaunchImage" width="168" height="185"/>
+    </resources>
+</document>

+ 26 - 0
ios/Runner/Base.lproj/Main.storyboard

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
+    </dependencies>
+    <scenes>
+        <!--Flutter View Controller-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
+                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+        </scene>
+    </scenes>
+</document>

+ 86 - 0
ios/Runner/Info.plist

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleDisplayName</key>
+	<string>Uitgaanskrant.com</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>Uitgaanskrant</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleLocalizations</key>
+	<array>
+		<string>nl</string>
+		<string>en</string>
+	</array>
+
+	<key>CFBundleShortVersionString</key>
+	<string>$(FLUTTER_BUILD_NAME)</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleURLTypes</key>
+	<array>        <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Editor</string>
+        <key>CFBundleURLName</key>
+        <string>uitgaanskrant.com</string>
+        <key>CFBundleURLSchemes</key>
+        <array>
+        <string>uitgaanskrant</string>
+        </array>
+        </dict>
+    </array>
+    <key>FlutterDeepLinkingEnabled</key>
+    <true/>
+
+
+	<key>CFBundleVersion</key>
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+
+
+
+
+
+
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIMainStoryboardFile</key>
+	<string>Main</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+  <key>GADApplicationIdentifier</key>
+	<string>ca-app-pub-2431417692812232~6937163535</string>
+	<key>SKAdNetworkItems</key>
+		<array>
+			<dict>
+				<key>SKAdNetworkIdentifier</key>
+				<string>cstr6suwn9.skadnetwork</string>
+			</dict>
+		</array>
+	<key>io.flutter.embedded_views_preview</key>
+	<true/>
+</dict>
+</plist>

+ 5 - 0
ios/Runner/PrivacyInfo.xcprivacy

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict/>
+</plist>

+ 1 - 0
ios/Runner/Runner-Bridging-Header.h

@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"

+ 6 - 0
ios/Runner/Runner.entitlements

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+</dict>
+</plist>

+ 1 - 0
ios/Runner/en.lproj/InfoPlist.strings

@@ -0,0 +1 @@
+

+ 1 - 0
ios/Runner/nl.lproj/InfoPlist.strings

@@ -0,0 +1 @@
+

+ 676 - 0
lib/app_state.dart

@@ -0,0 +1,676 @@
+import 'package:flutter/material.dart';
+import '/backend/schema/structs/index.dart';
+import '/backend/api_requests/api_manager.dart';
+import 'package:flutter_secure_storage/flutter_secure_storage.dart';
+import 'package:csv/csv.dart';
+import 'package:synchronized/synchronized.dart';
+import 'flutter_flow/flutter_flow_util.dart';
+
+class FFAppState extends ChangeNotifier {
+  static FFAppState _instance = FFAppState._internal();
+
+  factory FFAppState() {
+    return _instance;
+  }
+
+  FFAppState._internal();
+
+  static void reset() {
+    _instance = FFAppState._internal();
+  }
+
+  Future initializePersistedState() async {
+    secureStorage = FlutterSecureStorage();
+    await _safeInitAsync(() async {
+      _userCsrftoken =
+          await secureStorage.getString('ff_userCsrftoken') ?? _userCsrftoken;
+    });
+    await _safeInitAsync(() async {
+      _userSessionid =
+          await secureStorage.getString('ff_userSessionid') ?? _userSessionid;
+    });
+    await _safeInitAsync(() async {
+      _userSessionname = await secureStorage.getString('ff_userSessionname') ??
+          _userSessionname;
+    });
+    await _safeInitAsync(() async {
+      _userName = await secureStorage.getString('ff_userName') ?? _userName;
+    });
+    await _safeInitAsync(() async {
+      _userUid = await secureStorage.getInt('ff_userUid') ?? _userUid;
+    });
+    await _safeInitAsync(() async {
+      _provincielijst = LoggableList(
+        (await secureStorage.getStringList('ff_provincielijst'))
+                ?.map((x) {
+                  try {
+                    return ProvincieModelStruct.fromSerializableMap(
+                        jsonDecode(x));
+                  } catch (e) {
+                    print("Can't decode persisted data type. Error: $e.");
+                    return null;
+                  }
+                })
+                .withoutNulls
+                .toList() ??
+            _provincielijst,
+      );
+    });
+    await _safeInitAsync(() async {
+      _provincieSelectId =
+          await secureStorage.getString('ff_provincieSelectId') ??
+              _provincieSelectId;
+    });
+    await _safeInitAsync(() async {
+      _gemeentelijst = LoggableList(
+        (await secureStorage.getStringList('ff_gemeentelijst'))
+                ?.map((x) {
+                  try {
+                    return GemeenteModelStruct.fromSerializableMap(
+                        jsonDecode(x));
+                  } catch (e) {
+                    print("Can't decode persisted data type. Error: $e.");
+                    return null;
+                  }
+                })
+                .withoutNulls
+                .toList() ??
+            _gemeentelijst,
+      );
+    });
+    await _safeInitAsync(() async {
+      _gemeenteSelectId =
+          await secureStorage.getString('ff_gemeenteSelectId') ??
+              _gemeenteSelectId;
+    });
+    await _safeInitAsync(() async {
+      _provincieSelectNaam =
+          await secureStorage.getString('ff_provincieSelectNaam') ??
+              _provincieSelectNaam;
+    });
+    await _safeInitAsync(() async {
+      _gemeenteSelectNaam =
+          await secureStorage.getString('ff_gemeenteSelectNaam') ??
+              _gemeenteSelectNaam;
+    });
+  }
+
+  void update(VoidCallback callback) {
+    callback();
+    notifyListeners();
+  }
+
+  late FlutterSecureStorage secureStorage;
+
+  /// csrftoken
+  String _userCsrftoken = '';
+  String get userCsrftoken => _userCsrftoken;
+  set userCsrftoken(String value) {
+    _userCsrftoken = value;
+    secureStorage.setString('ff_userCsrftoken', value);
+    debugLogAppState(this);
+  }
+
+  void deleteUserCsrftoken() {
+    secureStorage.delete(key: 'ff_userCsrftoken');
+  }
+
+  String _userSessionid = '';
+  String get userSessionid => _userSessionid;
+  set userSessionid(String value) {
+    _userSessionid = value;
+    secureStorage.setString('ff_userSessionid', value);
+    debugLogAppState(this);
+  }
+
+  void deleteUserSessionid() {
+    secureStorage.delete(key: 'ff_userSessionid');
+  }
+
+  String _userSessionname = '';
+  String get userSessionname => _userSessionname;
+  set userSessionname(String value) {
+    _userSessionname = value;
+    secureStorage.setString('ff_userSessionname', value);
+    debugLogAppState(this);
+  }
+
+  void deleteUserSessionname() {
+    secureStorage.delete(key: 'ff_userSessionname');
+  }
+
+  String _userName = '';
+  String get userName => _userName;
+  set userName(String value) {
+    _userName = value;
+    secureStorage.setString('ff_userName', value);
+    debugLogAppState(this);
+  }
+
+  void deleteUserName() {
+    secureStorage.delete(key: 'ff_userName');
+  }
+
+  int _userUid = 0;
+  int get userUid => _userUid;
+  set userUid(int value) {
+    _userUid = value;
+    secureStorage.setInt('ff_userUid', value);
+    debugLogAppState(this);
+  }
+
+  void deleteUserUid() {
+    secureStorage.delete(key: 'ff_userUid');
+  }
+
+  late LoggableList<ProvincieModelStruct> _provincielijst = LoggableList([
+    ProvincieModelStruct.fromSerializableMap(jsonDecode(
+        '{\"provinciename\":\"Hello World\",\"provincieid\":\"Hello World\",\"municipality\":\"[\\\"{\\\\\\\"municipalityname\\\\\\\":\\\\\\\"Hello World\\\\\\\",\\\\\\\"municipalityid\\\\\\\":\\\\\\\"Hello World\\\\\\\"}\\\"]\"}'))
+  ]);
+  List<ProvincieModelStruct> get provincielijst =>
+      _provincielijst?..logger = () => debugLogAppState(this);
+  set provincielijst(List<ProvincieModelStruct> value) {
+    if (value != null) {
+      _provincielijst = LoggableList(value);
+    }
+
+    secureStorage.setStringList(
+        'ff_provincielijst', value.map((x) => x.serialize()).toList());
+    debugLogAppState(this);
+  }
+
+  void deleteProvincielijst() {
+    secureStorage.delete(key: 'ff_provincielijst');
+  }
+
+  void addToProvincielijst(ProvincieModelStruct value) {
+    provincielijst.add(value);
+    secureStorage.setStringList('ff_provincielijst',
+        _provincielijst.map((x) => x.serialize()).toList());
+  }
+
+  void removeFromProvincielijst(ProvincieModelStruct value) {
+    provincielijst.remove(value);
+    secureStorage.setStringList('ff_provincielijst',
+        _provincielijst.map((x) => x.serialize()).toList());
+  }
+
+  void removeAtIndexFromProvincielijst(int index) {
+    provincielijst.removeAt(index);
+    secureStorage.setStringList('ff_provincielijst',
+        _provincielijst.map((x) => x.serialize()).toList());
+  }
+
+  void updateProvincielijstAtIndex(
+    int index,
+    ProvincieModelStruct Function(ProvincieModelStruct) updateFn,
+  ) {
+    provincielijst[index] = updateFn(_provincielijst[index]);
+    secureStorage.setStringList('ff_provincielijst',
+        _provincielijst.map((x) => x.serialize()).toList());
+  }
+
+  void insertAtIndexInProvincielijst(int index, ProvincieModelStruct value) {
+    provincielijst.insert(index, value);
+    secureStorage.setStringList('ff_provincielijst',
+        _provincielijst.map((x) => x.serialize()).toList());
+  }
+
+  String _provincieSelectId = '28666';
+  String get provincieSelectId => _provincieSelectId;
+  set provincieSelectId(String value) {
+    _provincieSelectId = value;
+    secureStorage.setString('ff_provincieSelectId', value);
+    debugLogAppState(this);
+  }
+
+  void deleteProvincieSelectId() {
+    secureStorage.delete(key: 'ff_provincieSelectId');
+  }
+
+  late LoggableList<GemeenteModelStruct> _gemeentelijst = LoggableList([]);
+  List<GemeenteModelStruct> get gemeentelijst =>
+      _gemeentelijst?..logger = () => debugLogAppState(this);
+  set gemeentelijst(List<GemeenteModelStruct> value) {
+    if (value != null) {
+      _gemeentelijst = LoggableList(value);
+    }
+
+    secureStorage.setStringList(
+        'ff_gemeentelijst', value.map((x) => x.serialize()).toList());
+    debugLogAppState(this);
+  }
+
+  void deleteGemeentelijst() {
+    secureStorage.delete(key: 'ff_gemeentelijst');
+  }
+
+  void addToGemeentelijst(GemeenteModelStruct value) {
+    gemeentelijst.add(value);
+    secureStorage.setStringList(
+        'ff_gemeentelijst', _gemeentelijst.map((x) => x.serialize()).toList());
+  }
+
+  void removeFromGemeentelijst(GemeenteModelStruct value) {
+    gemeentelijst.remove(value);
+    secureStorage.setStringList(
+        'ff_gemeentelijst', _gemeentelijst.map((x) => x.serialize()).toList());
+  }
+
+  void removeAtIndexFromGemeentelijst(int index) {
+    gemeentelijst.removeAt(index);
+    secureStorage.setStringList(
+        'ff_gemeentelijst', _gemeentelijst.map((x) => x.serialize()).toList());
+  }
+
+  void updateGemeentelijstAtIndex(
+    int index,
+    GemeenteModelStruct Function(GemeenteModelStruct) updateFn,
+  ) {
+    gemeentelijst[index] = updateFn(_gemeentelijst[index]);
+    secureStorage.setStringList(
+        'ff_gemeentelijst', _gemeentelijst.map((x) => x.serialize()).toList());
+  }
+
+  void insertAtIndexInGemeentelijst(int index, GemeenteModelStruct value) {
+    gemeentelijst.insert(index, value);
+    secureStorage.setStringList(
+        'ff_gemeentelijst', _gemeentelijst.map((x) => x.serialize()).toList());
+  }
+
+  String _gemeenteSelectId = '28694';
+  String get gemeenteSelectId => _gemeenteSelectId;
+  set gemeenteSelectId(String value) {
+    _gemeenteSelectId = value;
+    secureStorage.setString('ff_gemeenteSelectId', value);
+    debugLogAppState(this);
+  }
+
+  void deleteGemeenteSelectId() {
+    secureStorage.delete(key: 'ff_gemeenteSelectId');
+  }
+
+  String _provincieSelectNaam = '';
+  String get provincieSelectNaam => _provincieSelectNaam;
+  set provincieSelectNaam(String value) {
+    _provincieSelectNaam = value;
+    secureStorage.setString('ff_provincieSelectNaam', value);
+    debugLogAppState(this);
+  }
+
+  void deleteProvincieSelectNaam() {
+    secureStorage.delete(key: 'ff_provincieSelectNaam');
+  }
+
+  String _gemeenteSelectNaam = '';
+  String get gemeenteSelectNaam => _gemeenteSelectNaam;
+  set gemeenteSelectNaam(String value) {
+    _gemeenteSelectNaam = value;
+    secureStorage.setString('ff_gemeenteSelectNaam', value);
+    debugLogAppState(this);
+  }
+
+  void deleteGemeenteSelectNaam() {
+    secureStorage.delete(key: 'ff_gemeenteSelectNaam');
+  }
+
+  String _currentHorcat = '';
+  String get currentHorcat => _currentHorcat;
+  set currentHorcat(String value) {
+    _currentHorcat = value;
+
+    debugLogAppState(this);
+  }
+
+  late LoggableList<String> _currentOriginalLijst = LoggableList([]);
+  List<String> get currentOriginalLijst =>
+      _currentOriginalLijst?..logger = () => debugLogAppState(this);
+  set currentOriginalLijst(List<String> value) {
+    if (value != null) {
+      _currentOriginalLijst = LoggableList(value);
+    }
+
+    debugLogAppState(this);
+  }
+
+  void addToCurrentOriginalLijst(String value) {
+    currentOriginalLijst.add(value);
+  }
+
+  void removeFromCurrentOriginalLijst(String value) {
+    currentOriginalLijst.remove(value);
+  }
+
+  void removeAtIndexFromCurrentOriginalLijst(int index) {
+    currentOriginalLijst.removeAt(index);
+  }
+
+  void updateCurrentOriginalLijstAtIndex(
+    int index,
+    String Function(String) updateFn,
+  ) {
+    currentOriginalLijst[index] = updateFn(_currentOriginalLijst[index]);
+  }
+
+  void insertAtIndexInCurrentOriginalLijst(int index, String value) {
+    currentOriginalLijst.insert(index, value);
+  }
+
+  late LoggableList<String> _currentFilteredLijst = LoggableList([]);
+  List<String> get currentFilteredLijst =>
+      _currentFilteredLijst?..logger = () => debugLogAppState(this);
+  set currentFilteredLijst(List<String> value) {
+    if (value != null) {
+      _currentFilteredLijst = LoggableList(value);
+    }
+
+    debugLogAppState(this);
+  }
+
+  void addToCurrentFilteredLijst(String value) {
+    currentFilteredLijst.add(value);
+  }
+
+  void removeFromCurrentFilteredLijst(String value) {
+    currentFilteredLijst.remove(value);
+  }
+
+  void removeAtIndexFromCurrentFilteredLijst(int index) {
+    currentFilteredLijst.removeAt(index);
+  }
+
+  void updateCurrentFilteredLijstAtIndex(
+    int index,
+    String Function(String) updateFn,
+  ) {
+    currentFilteredLijst[index] = updateFn(_currentFilteredLijst[index]);
+  }
+
+  void insertAtIndexInCurrentFilteredLijst(int index, String value) {
+    currentFilteredLijst.insert(index, value);
+  }
+
+  late LoggableList<String> _currentUniqueCategorieen = LoggableList([]);
+  List<String> get currentUniqueCategorieen =>
+      _currentUniqueCategorieen?..logger = () => debugLogAppState(this);
+  set currentUniqueCategorieen(List<String> value) {
+    if (value != null) {
+      _currentUniqueCategorieen = LoggableList(value);
+    }
+
+    debugLogAppState(this);
+  }
+
+  void addToCurrentUniqueCategorieen(String value) {
+    currentUniqueCategorieen.add(value);
+  }
+
+  void removeFromCurrentUniqueCategorieen(String value) {
+    currentUniqueCategorieen.remove(value);
+  }
+
+  void removeAtIndexFromCurrentUniqueCategorieen(int index) {
+    currentUniqueCategorieen.removeAt(index);
+  }
+
+  void updateCurrentUniqueCategorieenAtIndex(
+    int index,
+    String Function(String) updateFn,
+  ) {
+    currentUniqueCategorieen[index] =
+        updateFn(_currentUniqueCategorieen[index]);
+  }
+
+  void insertAtIndexInCurrentUniqueCategorieen(int index, String value) {
+    currentUniqueCategorieen.insert(index, value);
+  }
+
+  String _currentSelectedCategorie = '';
+  String get currentSelectedCategorie => _currentSelectedCategorie;
+  set currentSelectedCategorie(String value) {
+    _currentSelectedCategorie = value;
+
+    debugLogAppState(this);
+  }
+
+  bool _isLoading = false;
+  bool get isLoading => _isLoading;
+  set isLoading(bool value) {
+    _isLoading = value;
+
+    debugLogAppState(this);
+  }
+
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'userCsrftoken': debugSerializeParam(
+          userCsrftoken,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CioKGQoNdXNlckNzcmZ0b2tlbhIIcm1vaGxvcWpyAggDegljc3JmdG9rZW5aDXVzZXJDc3JmdG9rZW4=',
+          name: 'String',
+          nullable: false,
+        ),
+        'userSessionid': debugSerializeParam(
+          userSessionid,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiEKGQoNdXNlclNlc3Npb25pZBIIZHBuYzVmYXdyAggDegBaDXVzZXJTZXNzaW9uaWQ=',
+          name: 'String',
+          nullable: false,
+        ),
+        'userSessionname': debugSerializeParam(
+          userSessionname,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiMKGwoPdXNlclNlc3Npb25uYW1lEgg5ZHp5cG1sMXICCAN6AFoPdXNlclNlc3Npb25uYW1l',
+          name: 'String',
+          nullable: false,
+        ),
+        'userName': debugSerializeParam(
+          userName,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=ChwKFAoIdXNlck5hbWUSCGF6MHRqNTkycgIIA3oAWgh1c2VyTmFtZQ==',
+          name: 'String',
+          nullable: false,
+        ),
+        'userUid': debugSerializeParam(
+          userUid,
+          ParamType.int,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=ChsKEwoHdXNlclVpZBIIcHFhcTJlNG9yAggBegBaB3VzZXJVaWQ=',
+          name: 'int',
+          nullable: false,
+        ),
+        'provincielijst': debugSerializeParam(
+          provincielijst,
+          ParamType.DataStruct,
+          isList: true,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CjoKGgoOcHJvdmluY2llbGlqc3QSCHlza2E1Z3o2choSAggUKhQSEgoJUHJvdmluY2llEgVnY3l5anoAWg5wcm92aW5jaWVsaWpzdA==',
+          name: 'ProvincieModel',
+          nullable: false,
+        ),
+        'provincieSelectId': debugSerializeParam(
+          provincieSelectId,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiUKHQoRcHJvdmluY2llU2VsZWN0SWQSCGl0amt2azNrcgIIA3oAWhFwcm92aW5jaWVTZWxlY3RJZA==',
+          name: 'String',
+          nullable: false,
+        ),
+        'gemeentelijst': debugSerializeParam(
+          gemeentelijst,
+          ParamType.DataStruct,
+          isList: true,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=Cj0KGQoNZ2VtZWVudGVsaWpzdBIIeTlnaDFnYTRyHhICCBQqGBIWCg1HZW1lZW50ZU1vZGVsEgU4MnU3dXoAWg1nZW1lZW50ZWxpanN0',
+          name: 'GemeenteModel',
+          nullable: false,
+        ),
+        'gemeenteSelectId': debugSerializeParam(
+          gemeenteSelectId,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiQKHAoQZ2VtZWVudGVTZWxlY3RJZBIIandnYjA5Z25yAggDegBaEGdlbWVlbnRlU2VsZWN0SWQ=',
+          name: 'String',
+          nullable: false,
+        ),
+        'provincieSelectNaam': debugSerializeParam(
+          provincieSelectNaam,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CicKHwoTcHJvdmluY2llU2VsZWN0TmFhbRIIaGdrOWFiMGVyAggDegBaE3Byb3ZpbmNpZVNlbGVjdE5hYW0=',
+          name: 'String',
+          nullable: false,
+        ),
+        'gemeenteSelectNaam': debugSerializeParam(
+          gemeenteSelectNaam,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiYKHgoSZ2VtZWVudGVTZWxlY3ROYWFtEgh3MXprNXNmYXICCAN6AFoSZ2VtZWVudGVTZWxlY3ROYWFt',
+          name: 'String',
+          nullable: false,
+        ),
+        'currentHorcat': debugSerializeParam(
+          currentHorcat,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiEKGQoNY3VycmVudEhvcmNhdBIIeHJ1M29kNmFyAggDegBaDWN1cnJlbnRIb3JjYXQ=',
+          name: 'String',
+          nullable: false,
+        ),
+        'currentOriginalLijst': debugSerializeParam(
+          currentOriginalLijst,
+          ParamType.String,
+          isList: true,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CioKIAoUY3VycmVudE9yaWdpbmFsTGlqc3QSCGlmaGd6ODZpcgQSAggDegBaFGN1cnJlbnRPcmlnaW5hbExpanN0',
+          name: 'String',
+          nullable: false,
+        ),
+        'currentFilteredLijst': debugSerializeParam(
+          currentFilteredLijst,
+          ParamType.String,
+          isList: true,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CioKIAoUY3VycmVudEZpbHRlcmVkTGlqc3QSCDRjZTkycnFkcgQSAggDegBaFGN1cnJlbnRGaWx0ZXJlZExpanN0',
+          name: 'String',
+          nullable: false,
+        ),
+        'currentUniqueCategorieen': debugSerializeParam(
+          currentUniqueCategorieen,
+          ParamType.String,
+          isList: true,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=Ci4KJAoYY3VycmVudFVuaXF1ZUNhdGVnb3JpZWVuEghrcGdlejEyOXIEEgIIA3oAWhhjdXJyZW50VW5pcXVlQ2F0ZWdvcmllZW4=',
+          name: 'String',
+          nullable: false,
+        ),
+        'currentSelectedCategorie': debugSerializeParam(
+          currentSelectedCategorie,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CiwKJAoYY3VycmVudFNlbGVjdGVkQ2F0ZWdvcmllEgh0MXl3dDNydnICCAN6AFoYY3VycmVudFNlbGVjdGVkQ2F0ZWdvcmll',
+          name: 'String',
+          nullable: false,
+        ),
+        'isLoading': debugSerializeParam(
+          isLoading,
+          ParamType.bool,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=Ch0KFQoJaXNMb2FkaW5nEgg4eWlsMnFua3ICCAV6AFoJaXNMb2FkaW5n',
+          name: 'bool',
+          nullable: false,
+        )
+      };
+}
+
+void _safeInit(Function() initializeField) {
+  try {
+    initializeField();
+  } catch (_) {}
+}
+
+Future _safeInitAsync(Function() initializeField) async {
+  try {
+    await initializeField();
+  } catch (_) {}
+}
+
+extension FlutterSecureStorageExtensions on FlutterSecureStorage {
+  static final _lock = Lock();
+
+  Future<void> writeSync({required String key, String? value}) async =>
+      await _lock.synchronized(() async {
+        await write(key: key, value: value);
+      });
+
+  void remove(String key) => delete(key: key);
+
+  Future<String?> getString(String key) async => await read(key: key);
+  Future<void> setString(String key, String value) async =>
+      await writeSync(key: key, value: value);
+
+  Future<bool?> getBool(String key) async => (await read(key: key)) == 'true';
+  Future<void> setBool(String key, bool value) async =>
+      await writeSync(key: key, value: value.toString());
+
+  Future<int?> getInt(String key) async =>
+      int.tryParse(await read(key: key) ?? '');
+  Future<void> setInt(String key, int value) async =>
+      await writeSync(key: key, value: value.toString());
+
+  Future<double?> getDouble(String key) async =>
+      double.tryParse(await read(key: key) ?? '');
+  Future<void> setDouble(String key, double value) async =>
+      await writeSync(key: key, value: value.toString());
+
+  Future<List<String>?> getStringList(String key) async =>
+      await read(key: key).then((result) {
+        if (result == null || result.isEmpty) {
+          return null;
+        }
+        return CsvToListConverter()
+            .convert(result)
+            .first
+            .map((e) => e.toString())
+            .toList();
+      });
+  Future<void> setStringList(String key, List<String> value) async =>
+      await writeSync(key: key, value: ListToCsvConverter().convert([value]));
+}

+ 13 - 0
lib/auth/custom_auth/auth_util.dart

@@ -0,0 +1,13 @@
+import '/backend/schema/structs/index.dart';
+import 'custom_auth_manager.dart';
+
+export 'custom_auth_manager.dart';
+
+final _authManager = CustomAuthManager();
+CustomAuthManager get authManager => _authManager;
+
+String get currentUserUid => currentUser?.uid ?? '';
+String? get currentAuthenticationToken => authManager.authenticationToken;
+String? get currentAuthRefreshToken => authManager.refreshToken;
+DateTime? get currentAuthTokenExpiration => authManager.tokenExpiration;
+UserStruct? get currentUserData => currentUser?.userData;

+ 155 - 0
lib/auth/custom_auth/custom_auth_manager.dart

@@ -0,0 +1,155 @@
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:flutter/foundation.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+import '/backend/schema/structs/index.dart';
+import 'custom_auth_user_provider.dart';
+
+export 'custom_auth_manager.dart';
+
+const _kAuthTokenKey = '_auth_authentication_token_';
+const _kRefreshTokenKey = '_auth_refresh_token_';
+const _kTokenExpirationKey = '_auth_token_expiration_';
+const _kUidKey = '_auth_uid_';
+const _kUserDataKey = '_auth_user_data_';
+
+class CustomAuthManager {
+  // Auth session attributes
+  String? authenticationToken;
+  String? refreshToken;
+  DateTime? tokenExpiration;
+  // User attributes
+  String? uid;
+  UserStruct? userData;
+
+  Future signOut() async {
+    authenticationToken = null;
+    refreshToken = null;
+    tokenExpiration = null;
+    uid = null;
+    userData = null;
+    // Update the current user.
+    uitgaanskrantAuthUserSubject.add(
+      UitgaanskrantAuthUser(loggedIn: false),
+    );
+    persistAuthData();
+  }
+
+  Future<UitgaanskrantAuthUser?> signIn({
+    String? authenticationToken,
+    String? refreshToken,
+    DateTime? tokenExpiration,
+    String? authUid,
+    UserStruct? userData,
+  }) async =>
+      _updateCurrentUser(
+        authenticationToken: authenticationToken,
+        refreshToken: refreshToken,
+        tokenExpiration: tokenExpiration,
+        authUid: authUid,
+        userData: userData,
+      );
+
+  void updateAuthUserData({
+    String? authenticationToken,
+    String? refreshToken,
+    DateTime? tokenExpiration,
+    String? authUid,
+    UserStruct? userData,
+  }) {
+    assert(
+      currentUser?.loggedIn ?? false,
+      'User must be logged in to update auth user data.',
+    );
+
+    _updateCurrentUser(
+      authenticationToken: authenticationToken,
+      refreshToken: refreshToken,
+      tokenExpiration: tokenExpiration,
+      authUid: authUid,
+      userData: userData,
+    );
+  }
+
+  UitgaanskrantAuthUser? _updateCurrentUser({
+    String? authenticationToken,
+    String? refreshToken,
+    DateTime? tokenExpiration,
+    String? authUid,
+    UserStruct? userData,
+  }) {
+    this.authenticationToken = authenticationToken;
+    this.refreshToken = refreshToken;
+    this.tokenExpiration = tokenExpiration;
+    this.uid = authUid;
+    this.userData = userData;
+    // Update the current user stream.
+    final updatedUser = UitgaanskrantAuthUser(
+      loggedIn: true,
+      uid: authUid,
+      userData: userData,
+    );
+    uitgaanskrantAuthUserSubject.add(updatedUser);
+    persistAuthData();
+    return updatedUser;
+  }
+
+  late SharedPreferences _prefs;
+  Future initialize() async {
+    _prefs = await SharedPreferences.getInstance();
+
+    try {
+      authenticationToken = _prefs.getString(_kAuthTokenKey);
+      refreshToken = _prefs.getString(_kRefreshTokenKey);
+      tokenExpiration = _prefs.getInt(_kTokenExpirationKey) != null
+          ? DateTime.fromMillisecondsSinceEpoch(
+              _prefs.getInt(_kTokenExpirationKey)!)
+          : null;
+      uid = _prefs.getString(_kUidKey);
+      userData = _prefs.getString(_kUserDataKey) != null
+          ? UserStruct.fromSerializableMap(
+              (jsonDecode(_prefs.getString(_kUserDataKey)!) as Map)
+                  .cast<String, dynamic>(),
+            )
+          : null;
+    } catch (e) {
+      if (kDebugMode) {
+        print('Error initializing auth: $e');
+      }
+      return;
+    }
+
+    final authTokenExists = authenticationToken != null;
+    final tokenExpired =
+        tokenExpiration != null && tokenExpiration!.isBefore(DateTime.now());
+    final updatedUser = UitgaanskrantAuthUser(
+      loggedIn: authTokenExists && !tokenExpired,
+      uid: uid,
+      userData: userData,
+    );
+    uitgaanskrantAuthUserSubject.add(updatedUser);
+  }
+
+  void persistAuthData() {
+    authenticationToken != null
+        ? _prefs.setString(_kAuthTokenKey, authenticationToken!)
+        : _prefs.remove(_kAuthTokenKey);
+    refreshToken != null
+        ? _prefs.setString(_kRefreshTokenKey, refreshToken!)
+        : _prefs.remove(_kRefreshTokenKey);
+    tokenExpiration != null
+        ? _prefs.setInt(
+            _kTokenExpirationKey, tokenExpiration!.millisecondsSinceEpoch)
+        : _prefs.remove(_kTokenExpirationKey);
+    uid != null ? _prefs.setString(_kUidKey, uid!) : _prefs.remove(_kUidKey);
+    userData != null
+        ? _prefs.setString(
+            _kUserDataKey, jsonEncode(userData!.toSerializableMap()))
+        : _prefs.remove(_kUserDataKey);
+  }
+}
+
+UitgaanskrantAuthUser? currentUser;
+bool get loggedIn => currentUser?.loggedIn ?? false;

+ 24 - 0
lib/auth/custom_auth/custom_auth_user_provider.dart

@@ -0,0 +1,24 @@
+import 'package:rxdart/rxdart.dart';
+
+import '/backend/schema/structs/index.dart';
+import 'custom_auth_manager.dart';
+
+class UitgaanskrantAuthUser {
+  UitgaanskrantAuthUser({
+    required this.loggedIn,
+    this.uid,
+    this.userData,
+  });
+
+  bool loggedIn;
+  String? uid;
+  UserStruct? userData;
+}
+
+/// Generates a stream of the authenticated user.
+BehaviorSubject<UitgaanskrantAuthUser> uitgaanskrantAuthUserSubject =
+    BehaviorSubject.seeded(UitgaanskrantAuthUser(loggedIn: false));
+Stream<UitgaanskrantAuthUser> uitgaanskrantAuthUserStream() =>
+    uitgaanskrantAuthUserSubject
+        .asBroadcastStream()
+        .map((user) => currentUser = user);

+ 1302 - 0
lib/backend/api_requests/api_calls.dart

@@ -0,0 +1,1302 @@
+import 'dart:convert';
+import 'dart:typed_data';
+import '../schema/structs/index.dart';
+
+import 'package:flutter/foundation.dart';
+
+import '/flutter_flow/flutter_flow_util.dart';
+import 'api_manager.dart';
+
+export 'api_manager.dart' show ApiCallResponse;
+
+const _kPrivateApiFunctionName = 'ffPrivateApiCall';
+
+class LoginCall {
+  static Future<ApiCallResponse> call({
+    String? username = '',
+    String? password = '',
+  }) async {
+    final ffApiRequestBody = '''
+{
+  "username": "${escapeStringForJson(username)}",
+  "password": "${escapeStringForJson(password)}"
+}''';
+    return ApiManager.instance.makeApiCall(
+      callName: 'login',
+      apiUrl: 'https://uitgaanskrant.com/en/flutterdrup/user/login.json',
+      callType: ApiCallType.POST,
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      params: {},
+      body: ffApiRequestBody,
+      bodyType: BodyType.JSON,
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? loginSessionid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.sessid''',
+      ));
+  static String? loginSessionsname(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.session_name''',
+      ));
+  static String? loginToken(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.token''',
+      ));
+  static String? loginUseruid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.user.uid''',
+      ));
+  static String? loginUsername(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.user.name''',
+      ));
+  static String? loginEmail(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.user.mail''',
+      ));
+}
+
+class ZZUserEstablishmentsTESTCall {
+  static Future<ApiCallResponse> call({
+    String? sessionname = '',
+    String? sessionid = '',
+    String? token = '',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'ZZ userEstablishments TEST',
+      apiUrl:
+          'https://uitgaanskrant.com/en/flutterdrup/views/flutterflow_user_establishment.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Content-Type': 'application/json',
+        'Cookie': '${sessionname}=${sessionid}',
+      },
+      params: {},
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? sessionid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$.sessid''',
+      ));
+  static String? sessionname(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.session_name''',
+      ));
+  static String? token(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$.token''',
+      ));
+  static String? drupaluserid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.user.uid''',
+      ));
+  static List<String>? establishmentTitle(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].node_title''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static List<String>? establishmentLogo(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].logohoreca''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static List<String>? establishmentNid(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].nid''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+}
+
+class GetcsrfCall {
+  static Future<ApiCallResponse> call() async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'getcsrf',
+      apiUrl: 'https://uitgaanskrant.com/en/flutterdrup/user/token.json',
+      callType: ApiCallType.POST,
+      headers: {},
+      params: {},
+      bodyType: BodyType.JSON,
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? getCsrfToken(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$.token''',
+      ));
+}
+
+class HomeSliderCall {
+  static Future<ApiCallResponse> call({
+    String? displayId = 'services_1',
+    String? townid = '1212',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'homeSlider',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'display_id': displayId,
+        'townid': townid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? homesNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? homesAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? homesHoreca(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheid''',
+      ));
+  static String? homesTown(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static String? homesDatum(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static List<String>? homesCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? homesTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? homesLogo(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? homesInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? homesUrl(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+  static String? homesHorecaID(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheidid''',
+      ));
+}
+
+class HomeSlidershortDateCall {
+  static Future<ApiCallResponse> call() async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'homeSlidershortDate',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {},
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? homesNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? homesAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? homesEstablishment(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheid''',
+      ));
+  static String? homesTown(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static String? homesDatum(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static List<String>? homesCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? homesTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? homesLogo(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? homesInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? homesUrl(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+}
+
+class HomeTabelCall {
+  static Future<ApiCallResponse> call({
+    int? page = 0,
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'homeTabel',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json?display_id=services_2',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'page': page,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? homeNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? homeAdres(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? homeEstablishment(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheid''',
+      ));
+  static String? homeDatum(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static String? homePlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static List<String>? homeCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? homeTitel(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? homoLogo(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? homeInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? homeUrl(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+}
+
+class HomeUitgaanCall {
+  static Future<ApiCallResponse> call({
+    int? page = 0,
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'home uitgaan',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json?display_id=services_3',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'page': page,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? homeNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? homeAdres(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? homeEstablishment(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheid''',
+      ));
+  static String? homeDatum(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static String? homePlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static String? homeCategorie(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].categorie''',
+      ));
+  static String? homeTitel(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? homoLogo(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? homeInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? homeUrl(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+}
+
+class UitgaanstabelCall {
+  static Future<ApiCallResponse> call({
+    int? page = 0,
+    String? townid = '0',
+    String? displayId,
+  }) async {
+    displayId ??= '';
+
+    return ApiManager.instance.makeApiCall(
+      callName: 'Uitgaanstabel',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json?display_id=services_3',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'page': page,
+        'townid': townid,
+        'display_id': displayId,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? homeNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? homeAdres(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? tabelHorecagelegenheid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheid''',
+      ));
+  static String? homeDatum(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static String? homePlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static List<String>? homeCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? homeTitel(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? homoLogo(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? homeInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? homeUrl(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+  static String? tabelHorecagelegenheidID(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].horecagelegenheidid''',
+      ));
+}
+
+class EstablishmentsNewCall {
+  static Future<ApiCallResponse> call({
+    int? townid = 28695,
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'EstablishmentsNew',
+      apiUrl:
+          'https://uitgaanskrant.com/en/flutterdrup/views/_flutterflowmobiel_establishment_new.json?display_id=services_1&townid=28695',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'townid': townid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? establishmentNid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? establishmentAddress(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? establishmentTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? establishmentPlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static String? establishmentLogo(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? establishmentCategorie(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].categorie''',
+      ));
+}
+
+class EstablishmentInfoCall {
+  static Future<ApiCallResponse> call({
+    String? nid = '',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'EstablishmentInfo',
+      apiUrl:
+          'https://uitgaanskrant.com/en/flutterdrup/views/flutterflowmobiel_establishment_info.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'nid': nid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: true,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? establismentNid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? establishmentBezorgkosten(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].bezorgkosten''',
+      ));
+  static String? establishmentEmail(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].email''',
+      ));
+  static String? establishmentFacebook(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].facebook''',
+      ));
+  static String? establishmentInstagram(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].instagram''',
+      ));
+  static String? establishmentMenukaart(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].menukaart''',
+      ));
+  static String? establishmentOpeningstijden(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].openingstijden''',
+      ));
+  static String? establishmentTelefoonnummer(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].telefoonnummer''',
+      ));
+  static String? establishmentTwitter(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].twitter''',
+      ));
+  static String? establishmentWebsite(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].website''',
+      ));
+  static List<String>? establishmentbezorgbetaalopties(dynamic response) =>
+      (getJsonField(
+        response,
+        r'''$[:].thuisbezorgtbetaalopties''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? establishmentAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static List<String>? establishmentAfhaalopties(dynamic response) =>
+      (getJsonField(
+        response,
+        r'''$[:].afhaalopties''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? establishmentPlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static List<String>? establishmentFotoos(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].fotoos''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static List<String>? establishmentCryptocoins(dynamic response) =>
+      (getJsonField(
+        response,
+        r'''$[:].cryptocoins''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? establishmentbezorgtijden(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].bezorgtijden''',
+      ));
+  static String? establishmentMinimaleorder(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].minimaleorder''',
+      ));
+  static String? establshmentTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static List<String>? establshmentBezorgtin(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].bezorgtin''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? establshmentKvk(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].kvk''',
+      ));
+  static String? establshmentBestellink(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].bestellink''',
+      ));
+  static String? establshmentInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static String? establshmentOpeningUitzondering(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].openingstijdenuitzondering''',
+      ));
+  static String? establshmentLogo(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? establishmentEntreeprijs(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].entreeprijs''',
+      ));
+  static List<String>? establishmentCategorie(dynamic response) =>
+      (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? establishmentEntreeToelichting(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].toelichtingentree''',
+      ));
+  static String? establishmentURL(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].url''',
+      ));
+}
+
+class HorecagelegenheidEventsCall {
+  static Future<ApiCallResponse> call({
+    String? horecanid,
+  }) async {
+    horecanid ??= '';
+
+    return ApiManager.instance.makeApiCall(
+      callName: 'HorecagelegenheidEvents',
+      apiUrl:
+          'https://uitgaanskrant.com/en/flutterdrup/views/flutterflowmobiel_establishment_events.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'horecanid': horecanid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? horecaEventNid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? horecaEventBody(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].body''',
+      ));
+  static String? horecaEventLogo(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static String? horecaEventDatum(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+  static String? horecaEventTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? horecaEventInhoud(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].inhoud''',
+      ));
+  static List<String>? horecaEventCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+}
+
+class ZzEstablishmentEventsCopyCall {
+  static Future<ApiCallResponse> call({
+    int? horecanid = 75411,
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'zzEstablishmentEvents Copy',
+      apiUrl:
+          'https://devbob.uitgaanskrant.com/en/flutterdrup/views/flutterflowmobiel_establishment_events.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'horecanid': horecanid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? estEventNid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? estEventTitle(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].title''',
+      ));
+  static String? estEventAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static dynamic estEventEntreeselect(dynamic response) => getJsonField(
+        response,
+        r'''$[:].entreeselect''',
+      );
+  static String? estEventBody(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].body''',
+      ));
+  static String? estEventEntreeToelichting(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].entreetoelichting''',
+      ));
+  static String? estEventTickets(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].tickets''',
+      ));
+  static String? estEventWebsite(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].website''',
+      ));
+  static String? estEventLogo(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static List<String>? estEventFotoos(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].fotoos''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? estEventCategory(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].category''',
+      ));
+  static String? estEventDatum(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].datum''',
+      ));
+}
+
+class GemeentenCall {
+  static Future<ApiCallResponse> call({
+    String? provincieid = '',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'gemeenten',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/plaatsen.json?limit_levels=2',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'provincieid': provincieid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? gemeenteId(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].gemeenteid''',
+      ));
+  static String? gemeenteName(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].gemeentename''',
+      ));
+}
+
+class ProvinciesCall {
+  static Future<ApiCallResponse> call() async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'provincies',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/plaatsen.json?limit_levels=2',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {},
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? provincieId(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].provincieid''',
+      ));
+  static String? provincieName(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].provinciename''',
+      ));
+  static List<String>? provinciedescription(dynamic response) => (getJsonField(
+        response,
+        r'''$[:].provinciedescription''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+}
+
+class EvenementCall {
+  static Future<ApiCallResponse> call({
+    String? nid = '0',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'Evenement',
+      apiUrl:
+          'https://uitgaanskrant.com/en/flutterdrup/views/flutterflow_events.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'nid': nid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: false,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? eventNid(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[0].nid''',
+      ));
+  static String? eventTitle(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].title''',
+      ));
+  static String? eventDate(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[0].datum''',
+      ));
+  static String? eventLogog(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].logo''',
+      ));
+  static String? eventAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].adres''',
+      ));
+  static String? eventPlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].plaats''',
+      ));
+  static List<String>? eventCategorie(dynamic response) => (getJsonField(
+        response,
+        r'''$[0].categorie''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? eventBody(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[0].body''',
+      ));
+  static String? eventWebsiteg(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].website''',
+      ));
+  static List<String>? eventFotoos(dynamic response) => (getJsonField(
+        response,
+        r'''$[0].fotos''',
+        true,
+      ) as List?)
+          ?.withoutNulls
+          .map((x) => castToType<String>(x))
+          .withoutNulls
+          .toList();
+  static String? eventEntreeprijs(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].entreeprijs''',
+      ));
+  static String? eventEntreeToelichting(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].entreetoelichting''',
+      ));
+  static String? eventContact(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].contact''',
+      ));
+  static String? eventHorecagelegenheidnid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[0].horecagelegenheidnid''',
+      ));
+}
+
+class EstablishmentsCall {
+  static Future<ApiCallResponse> call({
+    String? horcat,
+    String? townid = '',
+    String? displayId = 'services_1',
+  }) async {
+    horcat ??= null!;
+
+    return ApiManager.instance.makeApiCall(
+      callName: 'Establishments',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel_establishments.json',
+      callType: ApiCallType.GET,
+      headers: {
+        'Authorization': 'Basic Ym9iOnNlcmhpaQ==',
+      },
+      params: {
+        'horcat': horcat,
+        'townid': townid,
+        'display_id': displayId,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: true,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? establishmentNid(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].nid''',
+      ));
+  static String? establishmentTitel(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].titel''',
+      ));
+  static String? establishmentAdres(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].adres''',
+      ));
+  static String? establishmentPlaats(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].plaats''',
+      ));
+  static String? establishmentLogo(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].logo''',
+      ));
+  static List? establishmentCategorie(dynamic response) => getJsonField(
+        response,
+        r'''$[:].categorie''',
+        true,
+      ) as List?;
+}
+
+class QueryCityIdCall {
+  static Future<ApiCallResponse> call({
+    String? townid = '',
+  }) async {
+    return ApiManager.instance.makeApiCall(
+      callName: 'QueryCityId',
+      apiUrl:
+          'https://uitgaanskrant.com/nl/flutterdrup/views/flutterflow_querytownid.json?display_id=services_1',
+      callType: ApiCallType.GET,
+      headers: {},
+      params: {
+        'townid': townid,
+      },
+      returnBody: true,
+      encodeBodyUtf8: false,
+      decodeUtf8: false,
+      cache: true,
+      isStreamingApi: false,
+      alwaysAllowBody: false,
+    );
+  }
+
+  static String? stadId(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].id''',
+      ));
+  static String? stadNaam(dynamic response) => castToType<String>(getJsonField(
+        response,
+        r'''$[:].name''',
+      ));
+  static String? provincieId(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].parentid''',
+      ));
+  static String? provincieNaam(dynamic response) =>
+      castToType<String>(getJsonField(
+        response,
+        r'''$[:].parentname''',
+      ));
+}
+
+class ApiPagingParams {
+  int nextPageNumber = 0;
+  int numItems = 0;
+  dynamic lastResponse;
+
+  ApiPagingParams({
+    required this.nextPageNumber,
+    required this.numItems,
+    required this.lastResponse,
+  });
+
+  @override
+  String toString() =>
+      'PagingParams(nextPageNumber: $nextPageNumber, numItems: $numItems, lastResponse: $lastResponse,)';
+}
+
+String _toEncodable(dynamic item) {
+  return item;
+}
+
+String _serializeList(List? list) {
+  list ??= <String>[];
+  try {
+    return json.encode(list, toEncodable: _toEncodable);
+  } catch (_) {
+    if (kDebugMode) {
+      print("List serialization failed. Returning empty list.");
+    }
+    return '[]';
+  }
+}
+
+String _serializeJson(dynamic jsonVar, [bool isList = false]) {
+  jsonVar ??= (isList ? [] : {});
+  try {
+    return json.encode(jsonVar, toEncodable: _toEncodable);
+  } catch (_) {
+    if (kDebugMode) {
+      print("Json serialization failed. Returning empty json.");
+    }
+    return isList ? '[]' : '{}';
+  }
+}
+
+String? escapeStringForJson(String? input) {
+  if (input == null) {
+    return null;
+  }
+  return input
+      .replaceAll('\\', '\\\\')
+      .replaceAll('"', '\\"')
+      .replaceAll('\n', '\\n')
+      .replaceAll('\t', '\\t');
+}

+ 615 - 0
lib/backend/api_requests/api_manager.dart

@@ -0,0 +1,615 @@
+// ignore_for_file: constant_identifier_names, depend_on_referenced_packages, prefer_final_fields
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:core';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:collection/collection.dart';
+import 'package:http/http.dart' as http;
+import 'package:equatable/equatable.dart';
+import 'package:http_parser/http_parser.dart';
+import 'package:mime_type/mime_type.dart';
+import 'package:flutter/foundation.dart';
+import 'package:http/browser_client.dart'
+    if (dart.library.io) 'browser_client_stub.dart';
+
+import '/flutter_flow/uploaded_file.dart';
+
+import 'get_streamed_response.dart';
+
+enum ApiCallType {
+  GET,
+  POST,
+  DELETE,
+  PUT,
+  PATCH,
+}
+
+enum BodyType {
+  NONE,
+  JSON,
+  TEXT,
+  X_WWW_FORM_URL_ENCODED,
+  MULTIPART,
+}
+
+class ApiCallOptions extends Equatable {
+  const ApiCallOptions({
+    this.callName = '',
+    required this.callType,
+    required this.apiUrl,
+    required this.headers,
+    required this.params,
+    this.bodyType,
+    this.body,
+    this.returnBody = true,
+    this.encodeBodyUtf8 = false,
+    this.decodeUtf8 = false,
+    this.alwaysAllowBody = false,
+    this.cache = false,
+    this.isStreamingApi = false,
+  });
+
+  final String callName;
+  final ApiCallType callType;
+  final String apiUrl;
+  final Map<String, dynamic> headers;
+  final Map<String, dynamic> params;
+  final BodyType? bodyType;
+  final String? body;
+  final bool returnBody;
+  final bool encodeBodyUtf8;
+  final bool decodeUtf8;
+  final bool alwaysAllowBody;
+  final bool cache;
+  final bool isStreamingApi;
+
+  /// Creates a new [ApiCallOptions] with optionally updated parameters.
+  ///
+  /// This helper function allows creating a copy of the current options while
+  /// selectively modifying specific fields. Any parameter that is not provided
+  /// will retain its original value from the current instance.
+  ApiCallOptions copyWith({
+    String? callName,
+    ApiCallType? callType,
+    String? apiUrl,
+    Map<String, dynamic>? headers,
+    Map<String, dynamic>? params,
+    BodyType? bodyType,
+    String? body,
+    bool? returnBody,
+    bool? encodeBodyUtf8,
+    bool? decodeUtf8,
+    bool? alwaysAllowBody,
+    bool? cache,
+    bool? isStreamingApi,
+  }) {
+    return ApiCallOptions(
+      callName: callName ?? this.callName,
+      callType: callType ?? this.callType,
+      apiUrl: apiUrl ?? this.apiUrl,
+      headers: headers ?? _cloneMap(this.headers),
+      params: params ?? _cloneMap(this.params),
+      bodyType: bodyType ?? this.bodyType,
+      body: body ?? this.body,
+      returnBody: returnBody ?? this.returnBody,
+      encodeBodyUtf8: encodeBodyUtf8 ?? this.encodeBodyUtf8,
+      decodeUtf8: decodeUtf8 ?? this.decodeUtf8,
+      alwaysAllowBody: alwaysAllowBody ?? this.alwaysAllowBody,
+      cache: cache ?? this.cache,
+      isStreamingApi: isStreamingApi ?? this.isStreamingApi,
+    );
+  }
+
+  ApiCallOptions clone() => ApiCallOptions(
+        callName: callName,
+        callType: callType,
+        apiUrl: apiUrl,
+        headers: _cloneMap(headers),
+        params: _cloneMap(params),
+        bodyType: bodyType,
+        body: body,
+        returnBody: returnBody,
+        encodeBodyUtf8: encodeBodyUtf8,
+        decodeUtf8: decodeUtf8,
+        alwaysAllowBody: alwaysAllowBody,
+        cache: cache,
+        isStreamingApi: isStreamingApi,
+      );
+
+  @override
+  List<Object?> get props => [
+        callName,
+        callType.name,
+        apiUrl,
+        headers,
+        params,
+        bodyType,
+        body,
+        returnBody,
+        encodeBodyUtf8,
+        decodeUtf8,
+        alwaysAllowBody,
+        cache,
+        isStreamingApi,
+      ];
+
+  static Map<String, dynamic> _cloneMap(Map<String, dynamic> map) {
+    try {
+      return json.decode(json.encode(map)) as Map<String, dynamic>;
+    } catch (_) {
+      return Map.from(map);
+    }
+  }
+}
+
+class ApiCallResponse {
+  const ApiCallResponse(
+    this.jsonBody,
+    this.headers,
+    this.statusCode, {
+    this.response,
+    this.streamedResponse,
+    this.exception,
+    this.requestOptions,
+  });
+  final dynamic jsonBody;
+  final Map<String, String> headers;
+  final int statusCode;
+  final http.Response? response;
+  final http.StreamedResponse? streamedResponse;
+  final Object? exception;
+
+  /// The original request options used to make the API call.
+  /// Available in interceptor's onResponse callback to access request details
+  /// like URL, HTTP method, headers, params, and request body.
+  final ApiCallOptions? requestOptions;
+  // Whether we received a 2xx status (which generally marks success).
+  bool get succeeded => statusCode >= 200 && statusCode < 300;
+  String getHeader(String headerName) => headers[headerName] ?? '';
+  // Return the raw body from the response, or if this came from a cloud call
+  // and the body is not a string, then the json encoded body.
+  String get bodyText =>
+      response?.body ??
+      (jsonBody is String ? jsonBody as String : jsonEncode(jsonBody));
+  String get exceptionMessage => exception.toString();
+
+  /// Creates a new [ApiCallResponse] with optionally updated parameters.
+  ///
+  /// This helper function allows creating a copy of the current response while
+  /// selectively modifying specific fields. Any parameter that is not provided
+  /// will retain its original value from the current instance.
+  ApiCallResponse copyWith({
+    dynamic jsonBody,
+    Map<String, String>? headers,
+    int? statusCode,
+    http.Response? response,
+    http.StreamedResponse? streamedResponse,
+    Object? exception,
+    ApiCallOptions? requestOptions,
+  }) {
+    return ApiCallResponse(
+      jsonBody ?? this.jsonBody,
+      headers ?? this.headers,
+      statusCode ?? this.statusCode,
+      response: response ?? this.response,
+      streamedResponse: streamedResponse ?? this.streamedResponse,
+      exception: exception ?? this.exception,
+      requestOptions: requestOptions ?? this.requestOptions,
+    );
+  }
+
+  static ApiCallResponse fromHttpResponse(
+    http.Response response,
+    bool returnBody,
+    bool decodeUtf8,
+  ) {
+    dynamic jsonBody;
+    try {
+      final responseBody = decodeUtf8 && returnBody
+          ? const Utf8Decoder().convert(response.bodyBytes)
+          : response.body;
+      jsonBody = returnBody ? json.decode(responseBody) : null;
+    } catch (_) {}
+    return ApiCallResponse(
+      jsonBody,
+      response.headers,
+      response.statusCode,
+      response: response,
+    );
+  }
+
+  static ApiCallResponse fromCloudCallResponse(Map<String, dynamic> response) =>
+      ApiCallResponse(
+        response['body'],
+        ApiManager.toStringMap(response['headers'] ?? {}),
+        response['statusCode'] ?? 400,
+      );
+}
+
+class ApiManager {
+  ApiManager._();
+
+  // Cache that will ensure identical calls are not repeatedly made.
+  static Map<ApiCallOptions, ApiCallResponse> _apiCache = {};
+
+  static ApiManager? _instance;
+  static ApiManager get instance => _instance ??= ApiManager._();
+
+  /// Get HTTP client with optional credentials support for web
+  ///
+  /// Parameters:
+  ///   - withCredentials: Whether to include credentials (cookies) with requests
+  ///     Only applies to web platform (BrowserClient)
+  ///     Default: false
+  ///
+  /// Returns a platform-specific HTTP client:
+  ///   - Web: BrowserClient with credentials setting applied
+  ///   - Mobile/Desktop: Standard http.Client
+  static http.Client getClient({bool withCredentials = false}) {
+    // For web platform, return BrowserClient with appropriate settings
+    if (kIsWeb) {
+      return BrowserClient()..withCredentials = withCredentials;
+    }
+
+    // For mobile/desktop, return standard http.Client
+    // (credentials are handled differently on these platforms)
+    return http.Client();
+  }
+
+  // If your API calls need authentication, populate this field once
+  // the user has authenticated. Alter this as needed.
+  static String? _accessToken;
+  // You may want to call this if, for example, you make a change to the
+  // database and no longer want the cached result of a call that may
+  // have changed.
+  static void clearCache(String callName) => _apiCache.keys
+      .toSet()
+      .forEach((k) => k.callName == callName ? _apiCache.remove(k) : null);
+
+  static Map<String, String> toStringMap(Map map) =>
+      map.map((key, value) => MapEntry(key.toString(), value.toString()));
+
+  static String asQueryParams(Map<String, dynamic> map) => map.entries
+      .map((e) =>
+          "${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value.toString())}")
+      .join('&');
+
+  static Future<ApiCallResponse> urlRequest(
+    ApiCallType callType,
+    String apiUrl,
+    Map<String, dynamic> headers,
+    Map<String, dynamic> params,
+    bool returnBody,
+    bool decodeUtf8,
+    bool isStreamingApi, {
+    http.Client? client,
+  }) async {
+    if (params.isNotEmpty) {
+      final specifier =
+          Uri.parse(apiUrl).queryParameters.isNotEmpty ? '&' : '?';
+      apiUrl = '$apiUrl$specifier${asQueryParams(params)}';
+    }
+    if (isStreamingApi) {
+      client ??= http.Client();
+      final request =
+          http.Request(callType.toString().split('.').last, Uri.parse(apiUrl))
+            ..headers.addAll(toStringMap(headers));
+      final streamedResponse = await getStreamedResponse(request);
+      return ApiCallResponse(
+        null,
+        streamedResponse.headers,
+        streamedResponse.statusCode,
+        streamedResponse: streamedResponse,
+      );
+    }
+
+    final makeRequest = callType == ApiCallType.GET
+        ? (client != null ? client.get : http.get)
+        : (client != null ? client.delete : http.delete);
+    final response =
+        await makeRequest(Uri.parse(apiUrl), headers: toStringMap(headers));
+    return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
+  }
+
+  static Future<ApiCallResponse> requestWithBody(
+    ApiCallType type,
+    String apiUrl,
+    Map<String, dynamic> headers,
+    Map<String, dynamic> params,
+    String? body,
+    BodyType? bodyType,
+    bool returnBody,
+    bool encodeBodyUtf8,
+    bool decodeUtf8,
+    bool alwaysAllowBody,
+    bool isStreamingApi, {
+    http.Client? client,
+  }) async {
+    assert(
+      {ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type) ||
+          (alwaysAllowBody && type == ApiCallType.DELETE),
+      'Invalid ApiCallType $type for request with body',
+    );
+    final postBody =
+        createBody(headers, params, body, bodyType, encodeBodyUtf8);
+    if (isStreamingApi) {
+      client ??= http.Client();
+      final request =
+          http.Request(type.toString().split('.').last, Uri.parse(apiUrl))
+            ..headers.addAll(toStringMap(headers));
+      request.body = postBody;
+      final streamedResponse = await getStreamedResponse(request);
+      return ApiCallResponse(
+        null,
+        streamedResponse.headers,
+        streamedResponse.statusCode,
+        streamedResponse: streamedResponse,
+      );
+    }
+
+    if (bodyType == BodyType.MULTIPART) {
+      return multipartRequest(type, apiUrl, headers, params, returnBody,
+          decodeUtf8, alwaysAllowBody, client);
+    }
+
+    final requestFn = {
+      ApiCallType.POST: client != null ? client.post : http.post,
+      ApiCallType.PUT: client != null ? client.put : http.put,
+      ApiCallType.PATCH: client != null ? client.patch : http.patch,
+      ApiCallType.DELETE: client != null ? client.delete : http.delete,
+    }[type]!;
+    final response = await requestFn(Uri.parse(apiUrl),
+        headers: toStringMap(headers), body: postBody);
+    return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
+  }
+
+  static Future<ApiCallResponse> multipartRequest(
+    ApiCallType? type,
+    String apiUrl,
+    Map<String, dynamic> headers,
+    Map<String, dynamic> params,
+    bool returnBody,
+    bool decodeUtf8,
+    bool alwaysAllowBody,
+    http.Client? client,
+  ) async {
+    assert(
+      {ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type) ||
+          (alwaysAllowBody && type == ApiCallType.DELETE),
+      'Invalid ApiCallType $type for request with body',
+    );
+
+    bool isFile(dynamic e) =>
+        e is FFUploadedFile ||
+        e is List<FFUploadedFile> ||
+        (e is List && e.firstOrNull is FFUploadedFile);
+
+    final nonFileParams = toStringMap(
+        Map.fromEntries(params.entries.where((e) => !isFile(e.value))));
+
+    List<http.MultipartFile> files = [];
+    params.entries.where((e) => isFile(e.value)).forEach((e) {
+      final param = e.value;
+      final uploadedFiles = param is List
+          ? param as List<FFUploadedFile>
+          : [param as FFUploadedFile];
+      for (var uploadedFile in uploadedFiles) {
+        files.add(
+          http.MultipartFile.fromBytes(
+            e.key,
+            uploadedFile.bytes ?? Uint8List.fromList([]),
+            filename: uploadedFile.name,
+            contentType: _getMediaType(uploadedFile.name),
+          ),
+        );
+      }
+    });
+
+    final request = http.MultipartRequest(
+        type.toString().split('.').last, Uri.parse(apiUrl))
+      ..headers.addAll(toStringMap(headers))
+      ..files.addAll(files);
+    nonFileParams.forEach((key, value) => request.fields[key] = value);
+
+    final response = await http.Response.fromStream(
+        await (client != null ? client.send(request) : request.send()));
+    return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
+  }
+
+  static MediaType? _getMediaType(String? filename) {
+    final contentType = mime(filename);
+    if (contentType == null) {
+      return null;
+    }
+    final parts = contentType.split('/');
+    if (parts.length != 2) {
+      return null;
+    }
+    return MediaType(parts.first, parts.last);
+  }
+
+  static dynamic createBody(
+    Map<String, dynamic> headers,
+    Map<String, dynamic>? params,
+    String? body,
+    BodyType? bodyType,
+    bool encodeBodyUtf8,
+  ) {
+    String? contentType;
+    dynamic postBody;
+    switch (bodyType) {
+      case BodyType.JSON:
+        contentType = 'application/json';
+        postBody = body ?? json.encode(params ?? {});
+        break;
+      case BodyType.TEXT:
+        contentType = 'text/plain';
+        postBody = body ?? json.encode(params ?? {});
+        break;
+      case BodyType.X_WWW_FORM_URL_ENCODED:
+        contentType = 'application/x-www-form-urlencoded';
+        postBody = toStringMap(params ?? {});
+        break;
+      case BodyType.MULTIPART:
+        contentType = 'multipart/form-data';
+        postBody = params;
+        break;
+      case BodyType.NONE:
+      case null:
+        break;
+    }
+    // Set "Content-Type" header if it was previously unset.
+    if (contentType != null &&
+        !headers.keys.any((h) => h.toLowerCase() == 'content-type')) {
+      headers['Content-Type'] = contentType;
+    }
+    return encodeBodyUtf8 && postBody is String
+        ? utf8.encode(postBody)
+        : postBody;
+  }
+
+  Future<ApiCallResponse> call(
+    ApiCallOptions options, {
+    http.Client? client,
+  }) =>
+      makeApiCall(
+        callName: options.callName,
+        apiUrl: options.apiUrl,
+        callType: options.callType,
+        headers: options.headers,
+        params: options.params,
+        body: options.body,
+        bodyType: options.bodyType,
+        returnBody: options.returnBody,
+        encodeBodyUtf8: options.encodeBodyUtf8,
+        decodeUtf8: options.decodeUtf8,
+        alwaysAllowBody: options.alwaysAllowBody,
+        cache: options.cache,
+        isStreamingApi: options.isStreamingApi,
+        options: options,
+        client: client,
+      );
+
+  Future<ApiCallResponse> makeApiCall({
+    required String callName,
+    required String apiUrl,
+    required ApiCallType callType,
+    Map<String, dynamic> headers = const {},
+    Map<String, dynamic> params = const {},
+    String? body,
+    BodyType? bodyType,
+    bool returnBody = true,
+    bool encodeBodyUtf8 = false,
+    bool decodeUtf8 = false,
+    bool alwaysAllowBody = false,
+    bool cache = false,
+    bool isStreamingApi = false,
+    ApiCallOptions? options,
+    http.Client? client,
+  }) async {
+    final callOptions = options ??
+        ApiCallOptions(
+          callName: callName,
+          callType: callType,
+          apiUrl: apiUrl,
+          headers: headers,
+          params: params,
+          bodyType: bodyType,
+          body: body,
+          returnBody: returnBody,
+          encodeBodyUtf8: encodeBodyUtf8,
+          decodeUtf8: decodeUtf8,
+          alwaysAllowBody: alwaysAllowBody,
+          cache: cache,
+          isStreamingApi: isStreamingApi,
+        );
+    // Modify for your specific needs if this differs from your API.
+    if (_accessToken != null) {
+      headers[HttpHeaders.authorizationHeader] = 'Bearer $_accessToken';
+    }
+    if (!apiUrl.startsWith('http')) {
+      apiUrl = 'https://$apiUrl';
+    }
+
+    // If we've already made this exact call before and caching is on,
+    // return the cached result.
+    if (cache && _apiCache.containsKey(callOptions)) {
+      return _apiCache[callOptions]!;
+    }
+
+    ApiCallResponse result;
+    try {
+      switch (callType) {
+        case ApiCallType.GET:
+          result = await urlRequest(
+            callType,
+            apiUrl,
+            headers,
+            params,
+            returnBody,
+            decodeUtf8,
+            isStreamingApi,
+            client: client,
+          );
+          break;
+        case ApiCallType.DELETE:
+          result = alwaysAllowBody
+              ? await requestWithBody(
+                  callType,
+                  apiUrl,
+                  headers,
+                  params,
+                  body,
+                  bodyType,
+                  returnBody,
+                  encodeBodyUtf8,
+                  decodeUtf8,
+                  alwaysAllowBody,
+                  isStreamingApi,
+                  client: client,
+                )
+              : await urlRequest(
+                  callType,
+                  apiUrl,
+                  headers,
+                  params,
+                  returnBody,
+                  decodeUtf8,
+                  isStreamingApi,
+                  client: client,
+                );
+          break;
+        case ApiCallType.POST:
+        case ApiCallType.PUT:
+        case ApiCallType.PATCH:
+          result = await requestWithBody(
+            callType,
+            apiUrl,
+            headers,
+            params,
+            body,
+            bodyType,
+            returnBody,
+            encodeBodyUtf8,
+            decodeUtf8,
+            alwaysAllowBody,
+            isStreamingApi,
+            client: client,
+          );
+          break;
+      }
+
+      // If caching is on, cache the result (if present).
+      if (cache) {
+        _apiCache[callOptions] = result;
+      }
+    } catch (e) {
+      result = ApiCallResponse(null, {}, -1, exception: e);
+    }
+
+    return result;
+  }
+}

+ 29 - 0
lib/backend/api_requests/browser_client_stub.dart

@@ -0,0 +1,29 @@
+// Stub file for BrowserClient on non-web platforms
+// This file is used when dart.library.io is available (mobile/desktop)
+import 'package:http/http.dart' as http;
+
+/// Stub implementation of BrowserClient for non-web platforms.
+/// This class provides the same interface as the real BrowserClient
+/// but withCredentials is a no-op on non-web platforms.
+///
+/// Note: This stub is never actually instantiated on non-web platforms
+/// (the code uses http.Client() instead), but it's needed for type compatibility.
+class BrowserClient extends http.BaseClient {
+  bool _withCredentials = false;
+
+  /// Controls whether credentials are sent with cross-site requests.
+  /// This is a no-op on non-web platforms (mobile/desktop).
+  bool get withCredentials => _withCredentials;
+  set withCredentials(bool value) {
+    _withCredentials = value;
+  }
+
+  // REQUIRED: BaseClient is abstract and requires send() to be implemented
+  @override
+  Future<http.StreamedResponse> send(http.BaseRequest request) {
+    // Delegate to a standard client (this should never be called on non-web)
+    return http.Client().send(request);
+  }
+  // OPTIONAL: close() has a default empty implementation in BaseClient
+  // We can omit it since BaseClient provides a default
+}

+ 4 - 0
lib/backend/api_requests/get_streamed_response.dart

@@ -0,0 +1,4 @@
+import 'package:http/http.dart';
+
+Future<StreamedResponse> getStreamedResponse(Request request) =>
+    Client().send(request);

+ 416 - 0
lib/backend/schema/structs/evenement_struct.dart

@@ -0,0 +1,416 @@
+// ignore_for_file: unnecessary_getters_setters
+
+import '/backend/schema/util/schema_util.dart';
+
+import 'index.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+
+class EvenementStruct extends BaseStruct {
+  EvenementStruct({
+    int? nid,
+    String? titel,
+    DateTime? datum,
+    String? logo,
+    String? adres,
+    String? plaats,
+    String? categorie,
+    String? horecagelegenheid,
+    int? horecagelegenheidid,
+    String? inhoud,
+    String? url,
+  })  : _nid = nid,
+        _titel = titel,
+        _datum = datum,
+        _logo = logo,
+        _adres = adres,
+        _plaats = plaats,
+        _categorie = categorie,
+        _horecagelegenheid = horecagelegenheid,
+        _horecagelegenheidid = horecagelegenheidid,
+        _inhoud = inhoud,
+        _url = url;
+
+  // "nid" field.
+  int? _nid;
+  int get nid => _nid ?? 0;
+  set nid(int? val) {
+    _nid = val;
+    debugLog();
+  }
+
+  void incrementNid(int amount) => nid = nid + amount;
+
+  bool hasNid() => _nid != null;
+
+  // "titel" field.
+  String? _titel;
+  String get titel => _titel ?? '';
+  set titel(String? val) {
+    _titel = val;
+    debugLog();
+  }
+
+  bool hasTitel() => _titel != null;
+
+  // "datum" field.
+  DateTime? _datum;
+  DateTime? get datum => _datum;
+  set datum(DateTime? val) {
+    _datum = val;
+    debugLog();
+  }
+
+  bool hasDatum() => _datum != null;
+
+  // "logo" field.
+  String? _logo;
+  String get logo => _logo ?? '';
+  set logo(String? val) {
+    _logo = val;
+    debugLog();
+  }
+
+  bool hasLogo() => _logo != null;
+
+  // "adres" field.
+  String? _adres;
+  String get adres => _adres ?? '';
+  set adres(String? val) {
+    _adres = val;
+    debugLog();
+  }
+
+  bool hasAdres() => _adres != null;
+
+  // "plaats" field.
+  String? _plaats;
+  String get plaats => _plaats ?? '';
+  set plaats(String? val) {
+    _plaats = val;
+    debugLog();
+  }
+
+  bool hasPlaats() => _plaats != null;
+
+  // "categorie" field.
+  String? _categorie;
+  String get categorie => _categorie ?? '';
+  set categorie(String? val) {
+    _categorie = val;
+    debugLog();
+  }
+
+  bool hasCategorie() => _categorie != null;
+
+  // "horecagelegenheid" field.
+  String? _horecagelegenheid;
+  String get horecagelegenheid => _horecagelegenheid ?? '';
+  set horecagelegenheid(String? val) {
+    _horecagelegenheid = val;
+    debugLog();
+  }
+
+  bool hasHorecagelegenheid() => _horecagelegenheid != null;
+
+  // "horecagelegenheidid" field.
+  int? _horecagelegenheidid;
+  int get horecagelegenheidid => _horecagelegenheidid ?? 0;
+  set horecagelegenheidid(int? val) {
+    _horecagelegenheidid = val;
+    debugLog();
+  }
+
+  void incrementHorecagelegenheidid(int amount) =>
+      horecagelegenheidid = horecagelegenheidid + amount;
+
+  bool hasHorecagelegenheidid() => _horecagelegenheidid != null;
+
+  // "inhoud" field.
+  String? _inhoud;
+  String get inhoud => _inhoud ?? '';
+  set inhoud(String? val) {
+    _inhoud = val;
+    debugLog();
+  }
+
+  bool hasInhoud() => _inhoud != null;
+
+  // "url" field.
+  String? _url;
+  String get url => _url ?? '';
+  set url(String? val) {
+    _url = val;
+    debugLog();
+  }
+
+  bool hasUrl() => _url != null;
+
+  static EvenementStruct fromMap(Map<String, dynamic> data) => EvenementStruct(
+        nid: castToType<int>(data['nid']),
+        titel: data['titel'] as String?,
+        datum: data['datum'] as DateTime?,
+        logo: data['logo'] as String?,
+        adres: data['adres'] as String?,
+        plaats: data['plaats'] as String?,
+        categorie: data['categorie'] as String?,
+        horecagelegenheid: data['horecagelegenheid'] as String?,
+        horecagelegenheidid: castToType<int>(data['horecagelegenheidid']),
+        inhoud: data['inhoud'] as String?,
+        url: data['url'] as String?,
+      );
+
+  static EvenementStruct? maybeFromMap(dynamic data) => data is Map
+      ? EvenementStruct.fromMap(data.cast<String, dynamic>())
+      : null;
+
+  Map<String, dynamic> toMap() => {
+        'nid': _nid,
+        'titel': _titel,
+        'datum': _datum,
+        'logo': _logo,
+        'adres': _adres,
+        'plaats': _plaats,
+        'categorie': _categorie,
+        'horecagelegenheid': _horecagelegenheid,
+        'horecagelegenheidid': _horecagelegenheidid,
+        'inhoud': _inhoud,
+        'url': _url,
+      }.withoutNulls;
+
+  @override
+  Map<String, dynamic> toSerializableMap() => {
+        'nid': serializeParam(
+          _nid,
+          ParamType.int,
+        ),
+        'titel': serializeParam(
+          _titel,
+          ParamType.String,
+        ),
+        'datum': serializeParam(
+          _datum,
+          ParamType.DateTime,
+        ),
+        'logo': serializeParam(
+          _logo,
+          ParamType.String,
+        ),
+        'adres': serializeParam(
+          _adres,
+          ParamType.String,
+        ),
+        'plaats': serializeParam(
+          _plaats,
+          ParamType.String,
+        ),
+        'categorie': serializeParam(
+          _categorie,
+          ParamType.String,
+        ),
+        'horecagelegenheid': serializeParam(
+          _horecagelegenheid,
+          ParamType.String,
+        ),
+        'horecagelegenheidid': serializeParam(
+          _horecagelegenheidid,
+          ParamType.int,
+        ),
+        'inhoud': serializeParam(
+          _inhoud,
+          ParamType.String,
+        ),
+        'url': serializeParam(
+          _url,
+          ParamType.String,
+        ),
+      }.withoutNulls;
+
+  static EvenementStruct fromSerializableMap(Map<String, dynamic> data) =>
+      EvenementStruct(
+        nid: deserializeParam(
+          data['nid'],
+          ParamType.int,
+          false,
+        ),
+        titel: deserializeParam(
+          data['titel'],
+          ParamType.String,
+          false,
+        ),
+        datum: deserializeParam(
+          data['datum'],
+          ParamType.DateTime,
+          false,
+        ),
+        logo: deserializeParam(
+          data['logo'],
+          ParamType.String,
+          false,
+        ),
+        adres: deserializeParam(
+          data['adres'],
+          ParamType.String,
+          false,
+        ),
+        plaats: deserializeParam(
+          data['plaats'],
+          ParamType.String,
+          false,
+        ),
+        categorie: deserializeParam(
+          data['categorie'],
+          ParamType.String,
+          false,
+        ),
+        horecagelegenheid: deserializeParam(
+          data['horecagelegenheid'],
+          ParamType.String,
+          false,
+        ),
+        horecagelegenheidid: deserializeParam(
+          data['horecagelegenheidid'],
+          ParamType.int,
+          false,
+        ),
+        inhoud: deserializeParam(
+          data['inhoud'],
+          ParamType.String,
+          false,
+        ),
+        url: deserializeParam(
+          data['url'],
+          ParamType.String,
+          false,
+        ),
+      );
+  @override
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'nid': debugSerializeParam(
+          nid,
+          ParamType.int,
+          name: 'int',
+          nullable: false,
+        ),
+        'titel': debugSerializeParam(
+          titel,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'datum': debugSerializeParam(
+          _datum,
+          ParamType.DateTime,
+          name: 'DateTime',
+          nullable: true,
+        ),
+        'logo': debugSerializeParam(
+          logo,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'adres': debugSerializeParam(
+          adres,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'plaats': debugSerializeParam(
+          plaats,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'categorie': debugSerializeParam(
+          categorie,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'horecagelegenheid': debugSerializeParam(
+          horecagelegenheid,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'horecagelegenheidid': debugSerializeParam(
+          horecagelegenheidid,
+          ParamType.int,
+          name: 'int',
+          nullable: false,
+        ),
+        'inhoud': debugSerializeParam(
+          inhoud,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'url': debugSerializeParam(
+          url,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+      };
+
+  @override
+  String toString() => 'EvenementStruct(${toMap()})';
+
+  @override
+  bool operator ==(Object other) {
+    return other is EvenementStruct &&
+        nid == other.nid &&
+        titel == other.titel &&
+        datum == other.datum &&
+        logo == other.logo &&
+        adres == other.adres &&
+        plaats == other.plaats &&
+        categorie == other.categorie &&
+        horecagelegenheid == other.horecagelegenheid &&
+        horecagelegenheidid == other.horecagelegenheidid &&
+        inhoud == other.inhoud &&
+        url == other.url;
+  }
+
+  @override
+  int get hashCode => const ListEquality().hash([
+        nid,
+        titel,
+        datum,
+        logo,
+        adres,
+        plaats,
+        categorie,
+        horecagelegenheid,
+        horecagelegenheidid,
+        inhoud,
+        url
+      ]);
+}
+
+EvenementStruct createEvenementStruct({
+  int? nid,
+  String? titel,
+  DateTime? datum,
+  String? logo,
+  String? adres,
+  String? plaats,
+  String? categorie,
+  String? horecagelegenheid,
+  int? horecagelegenheidid,
+  String? inhoud,
+  String? url,
+}) =>
+    EvenementStruct(
+      nid: nid,
+      titel: titel,
+      datum: datum,
+      logo: logo,
+      adres: adres,
+      plaats: plaats,
+      categorie: categorie,
+      horecagelegenheid: horecagelegenheid,
+      horecagelegenheidid: horecagelegenheidid,
+      inhoud: inhoud,
+      url: url,
+    );

+ 116 - 0
lib/backend/schema/structs/gemeente_model_struct.dart

@@ -0,0 +1,116 @@
+// ignore_for_file: unnecessary_getters_setters
+
+import '/backend/schema/util/schema_util.dart';
+
+import 'index.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+
+/// Municipality
+class GemeenteModelStruct extends BaseStruct {
+  GemeenteModelStruct({
+    /// municipalityname
+    String? gemeentename,
+
+    /// municipalityid
+    String? gemeenteid,
+  })  : _gemeentename = gemeentename,
+        _gemeenteid = gemeenteid;
+
+  // "gemeentename" field.
+  String? _gemeentename;
+  String get gemeentename => _gemeentename ?? '';
+  set gemeentename(String? val) {
+    _gemeentename = val;
+    debugLog();
+  }
+
+  bool hasGemeentename() => _gemeentename != null;
+
+  // "gemeenteid" field.
+  String? _gemeenteid;
+  String get gemeenteid => _gemeenteid ?? '';
+  set gemeenteid(String? val) {
+    _gemeenteid = val;
+    debugLog();
+  }
+
+  bool hasGemeenteid() => _gemeenteid != null;
+
+  static GemeenteModelStruct fromMap(Map<String, dynamic> data) =>
+      GemeenteModelStruct(
+        gemeentename: data['gemeentename'] as String?,
+        gemeenteid: data['gemeenteid'] as String?,
+      );
+
+  static GemeenteModelStruct? maybeFromMap(dynamic data) => data is Map
+      ? GemeenteModelStruct.fromMap(data.cast<String, dynamic>())
+      : null;
+
+  Map<String, dynamic> toMap() => {
+        'gemeentename': _gemeentename,
+        'gemeenteid': _gemeenteid,
+      }.withoutNulls;
+
+  @override
+  Map<String, dynamic> toSerializableMap() => {
+        'gemeentename': serializeParam(
+          _gemeentename,
+          ParamType.String,
+        ),
+        'gemeenteid': serializeParam(
+          _gemeenteid,
+          ParamType.String,
+        ),
+      }.withoutNulls;
+
+  static GemeenteModelStruct fromSerializableMap(Map<String, dynamic> data) =>
+      GemeenteModelStruct(
+        gemeentename: deserializeParam(
+          data['gemeentename'],
+          ParamType.String,
+          false,
+        ),
+        gemeenteid: deserializeParam(
+          data['gemeenteid'],
+          ParamType.String,
+          false,
+        ),
+      );
+  @override
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'gemeentename': debugSerializeParam(
+          gemeentename,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'gemeenteid': debugSerializeParam(
+          gemeenteid,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+      };
+
+  @override
+  String toString() => 'GemeenteModelStruct(${toMap()})';
+
+  @override
+  bool operator ==(Object other) {
+    return other is GemeenteModelStruct &&
+        gemeentename == other.gemeentename &&
+        gemeenteid == other.gemeenteid;
+  }
+
+  @override
+  int get hashCode => const ListEquality().hash([gemeentename, gemeenteid]);
+}
+
+GemeenteModelStruct createGemeenteModelStruct({
+  String? gemeentename,
+  String? gemeenteid,
+}) =>
+    GemeenteModelStruct(
+      gemeentename: gemeentename,
+      gemeenteid: gemeenteid,
+    );

+ 253 - 0
lib/backend/schema/structs/horecagelegenheid_struct.dart

@@ -0,0 +1,253 @@
+// ignore_for_file: unnecessary_getters_setters
+
+import '/backend/schema/util/schema_util.dart';
+
+import 'index.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+
+class HorecagelegenheidStruct extends BaseStruct {
+  HorecagelegenheidStruct({
+    String? nid,
+    String? titel,
+    String? adres,
+    String? plaats,
+    String? logo,
+    List<String>? categorie,
+  })  : _nid = nid,
+        _titel = titel,
+        _adres = adres,
+        _plaats = plaats,
+        _logo = logo,
+        _categorie = categorie != null ? LoggableList(categorie) : null;
+
+  // "nid" field.
+  String? _nid;
+  String get nid => _nid ?? '';
+  set nid(String? val) {
+    _nid = val;
+    debugLog();
+  }
+
+  bool hasNid() => _nid != null;
+
+  // "titel" field.
+  String? _titel;
+  String get titel => _titel ?? '';
+  set titel(String? val) {
+    _titel = val;
+    debugLog();
+  }
+
+  bool hasTitel() => _titel != null;
+
+  // "adres" field.
+  String? _adres;
+  String get adres => _adres ?? '';
+  set adres(String? val) {
+    _adres = val;
+    debugLog();
+  }
+
+  bool hasAdres() => _adres != null;
+
+  // "plaats" field.
+  String? _plaats;
+  String get plaats => _plaats ?? '';
+  set plaats(String? val) {
+    _plaats = val;
+    debugLog();
+  }
+
+  bool hasPlaats() => _plaats != null;
+
+  // "logo" field.
+  String? _logo;
+  String get logo => _logo ?? '';
+  set logo(String? val) {
+    _logo = val;
+    debugLog();
+  }
+
+  bool hasLogo() => _logo != null;
+
+  // "categorie" field.
+  LoggableList<String>? _categorie;
+  List<String> get categorie =>
+      (_categorie ?? LoggableList(const []))..logger = logger;
+  set categorie(List<String>? val) {
+    if (val != null) {
+      _categorie = LoggableList(val);
+    } else {
+      _categorie = null;
+    }
+    debugLog();
+  }
+
+  void updateCategorie(Function(List<String>) updateFn) {
+    updateFn(_categorie ??= LoggableList([]));
+    debugLog();
+  }
+
+  bool hasCategorie() => _categorie != null;
+
+  static HorecagelegenheidStruct fromMap(Map<String, dynamic> data) =>
+      HorecagelegenheidStruct(
+        nid: data['nid'] as String?,
+        titel: data['titel'] as String?,
+        adres: data['adres'] as String?,
+        plaats: data['plaats'] as String?,
+        logo: data['logo'] as String?,
+        categorie: getDataList(data['categorie']),
+      );
+
+  static HorecagelegenheidStruct? maybeFromMap(dynamic data) => data is Map
+      ? HorecagelegenheidStruct.fromMap(data.cast<String, dynamic>())
+      : null;
+
+  Map<String, dynamic> toMap() => {
+        'nid': _nid,
+        'titel': _titel,
+        'adres': _adres,
+        'plaats': _plaats,
+        'logo': _logo,
+        'categorie': _categorie,
+      }.withoutNulls;
+
+  @override
+  Map<String, dynamic> toSerializableMap() => {
+        'nid': serializeParam(
+          _nid,
+          ParamType.String,
+        ),
+        'titel': serializeParam(
+          _titel,
+          ParamType.String,
+        ),
+        'adres': serializeParam(
+          _adres,
+          ParamType.String,
+        ),
+        'plaats': serializeParam(
+          _plaats,
+          ParamType.String,
+        ),
+        'logo': serializeParam(
+          _logo,
+          ParamType.String,
+        ),
+        'categorie': serializeParam(
+          _categorie,
+          ParamType.String,
+          isList: true,
+        ),
+      }.withoutNulls;
+
+  static HorecagelegenheidStruct fromSerializableMap(
+          Map<String, dynamic> data) =>
+      HorecagelegenheidStruct(
+        nid: deserializeParam(
+          data['nid'],
+          ParamType.String,
+          false,
+        ),
+        titel: deserializeParam(
+          data['titel'],
+          ParamType.String,
+          false,
+        ),
+        adres: deserializeParam(
+          data['adres'],
+          ParamType.String,
+          false,
+        ),
+        plaats: deserializeParam(
+          data['plaats'],
+          ParamType.String,
+          false,
+        ),
+        logo: deserializeParam(
+          data['logo'],
+          ParamType.String,
+          false,
+        ),
+        categorie: deserializeParam<String>(
+          data['categorie'],
+          ParamType.String,
+          true,
+        ),
+      );
+  @override
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'nid': debugSerializeParam(
+          nid,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'titel': debugSerializeParam(
+          titel,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'adres': debugSerializeParam(
+          adres,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'plaats': debugSerializeParam(
+          plaats,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'logo': debugSerializeParam(
+          logo,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'categorie': debugSerializeParam(
+          _categorie,
+          ParamType.String,
+          isList: true,
+          name: 'String',
+          nullable: false,
+        ),
+      };
+
+  @override
+  String toString() => 'HorecagelegenheidStruct(${toMap()})';
+
+  @override
+  bool operator ==(Object other) {
+    const listEquality = ListEquality();
+    return other is HorecagelegenheidStruct &&
+        nid == other.nid &&
+        titel == other.titel &&
+        adres == other.adres &&
+        plaats == other.plaats &&
+        logo == other.logo &&
+        listEquality.equals(categorie, other.categorie);
+  }
+
+  @override
+  int get hashCode =>
+      const ListEquality().hash([nid, titel, adres, plaats, logo, categorie]);
+}
+
+HorecagelegenheidStruct createHorecagelegenheidStruct({
+  String? nid,
+  String? titel,
+  String? adres,
+  String? plaats,
+  String? logo,
+}) =>
+    HorecagelegenheidStruct(
+      nid: nid,
+      titel: titel,
+      adres: adres,
+      plaats: plaats,
+      logo: logo,
+    );

+ 7 - 0
lib/backend/schema/structs/index.dart

@@ -0,0 +1,7 @@
+export '/backend/schema/util/schema_util.dart';
+
+export 'evenement_struct.dart';
+export 'gemeente_model_struct.dart';
+export 'horecagelegenheid_struct.dart';
+export 'provincie_model_struct.dart';
+export 'user_struct.dart';

+ 147 - 0
lib/backend/schema/structs/provincie_model_struct.dart

@@ -0,0 +1,147 @@
+// ignore_for_file: unnecessary_getters_setters
+
+import '/backend/schema/util/schema_util.dart';
+
+import 'index.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+
+class ProvincieModelStruct extends BaseStruct {
+  ProvincieModelStruct({
+    String? provincieid,
+    String? provinciename,
+
+    /// provinciedescription
+    String? provinciedescription,
+  })  : _provincieid = provincieid,
+        _provinciename = provinciename,
+        _provinciedescription = provinciedescription;
+
+  // "provincieid" field.
+  String? _provincieid;
+  String get provincieid => _provincieid ?? '';
+  set provincieid(String? val) {
+    _provincieid = val;
+    debugLog();
+  }
+
+  bool hasProvincieid() => _provincieid != null;
+
+  // "provinciename" field.
+  String? _provinciename;
+  String get provinciename => _provinciename ?? '';
+  set provinciename(String? val) {
+    _provinciename = val;
+    debugLog();
+  }
+
+  bool hasProvinciename() => _provinciename != null;
+
+  // "provinciedescription" field.
+  String? _provinciedescription;
+  String get provinciedescription => _provinciedescription ?? '';
+  set provinciedescription(String? val) {
+    _provinciedescription = val;
+    debugLog();
+  }
+
+  bool hasProvinciedescription() => _provinciedescription != null;
+
+  static ProvincieModelStruct fromMap(Map<String, dynamic> data) =>
+      ProvincieModelStruct(
+        provincieid: data['provincieid'] as String?,
+        provinciename: data['provinciename'] as String?,
+        provinciedescription: data['provinciedescription'] as String?,
+      );
+
+  static ProvincieModelStruct? maybeFromMap(dynamic data) => data is Map
+      ? ProvincieModelStruct.fromMap(data.cast<String, dynamic>())
+      : null;
+
+  Map<String, dynamic> toMap() => {
+        'provincieid': _provincieid,
+        'provinciename': _provinciename,
+        'provinciedescription': _provinciedescription,
+      }.withoutNulls;
+
+  @override
+  Map<String, dynamic> toSerializableMap() => {
+        'provincieid': serializeParam(
+          _provincieid,
+          ParamType.String,
+        ),
+        'provinciename': serializeParam(
+          _provinciename,
+          ParamType.String,
+        ),
+        'provinciedescription': serializeParam(
+          _provinciedescription,
+          ParamType.String,
+        ),
+      }.withoutNulls;
+
+  static ProvincieModelStruct fromSerializableMap(Map<String, dynamic> data) =>
+      ProvincieModelStruct(
+        provincieid: deserializeParam(
+          data['provincieid'],
+          ParamType.String,
+          false,
+        ),
+        provinciename: deserializeParam(
+          data['provinciename'],
+          ParamType.String,
+          false,
+        ),
+        provinciedescription: deserializeParam(
+          data['provinciedescription'],
+          ParamType.String,
+          false,
+        ),
+      );
+  @override
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'provincieid': debugSerializeParam(
+          provincieid,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'provinciename': debugSerializeParam(
+          provinciename,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'provinciedescription': debugSerializeParam(
+          provinciedescription,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+      };
+
+  @override
+  String toString() => 'ProvincieModelStruct(${toMap()})';
+
+  @override
+  bool operator ==(Object other) {
+    return other is ProvincieModelStruct &&
+        provincieid == other.provincieid &&
+        provinciename == other.provinciename &&
+        provinciedescription == other.provinciedescription;
+  }
+
+  @override
+  int get hashCode => const ListEquality()
+      .hash([provincieid, provinciename, provinciedescription]);
+}
+
+ProvincieModelStruct createProvincieModelStruct({
+  String? provincieid,
+  String? provinciename,
+  String? provinciedescription,
+}) =>
+    ProvincieModelStruct(
+      provincieid: provincieid,
+      provinciename: provinciename,
+      provinciedescription: provinciedescription,
+    );

+ 142 - 0
lib/backend/schema/structs/user_struct.dart

@@ -0,0 +1,142 @@
+// ignore_for_file: unnecessary_getters_setters
+
+import '/backend/schema/util/schema_util.dart';
+
+import 'index.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+
+class UserStruct extends BaseStruct {
+  UserStruct({
+    String? uid,
+    String? displayName,
+    String? username,
+  })  : _uid = uid,
+        _displayName = displayName,
+        _username = username;
+
+  // "uid" field.
+  String? _uid;
+  String get uid => _uid ?? '';
+  set uid(String? val) {
+    _uid = val;
+    debugLog();
+  }
+
+  bool hasUid() => _uid != null;
+
+  // "display_name" field.
+  String? _displayName;
+  String get displayName => _displayName ?? '';
+  set displayName(String? val) {
+    _displayName = val;
+    debugLog();
+  }
+
+  bool hasDisplayName() => _displayName != null;
+
+  // "username" field.
+  String? _username;
+  String get username => _username ?? '';
+  set username(String? val) {
+    _username = val;
+    debugLog();
+  }
+
+  bool hasUsername() => _username != null;
+
+  static UserStruct fromMap(Map<String, dynamic> data) => UserStruct(
+        uid: data['uid'] as String?,
+        displayName: data['display_name'] as String?,
+        username: data['username'] as String?,
+      );
+
+  static UserStruct? maybeFromMap(dynamic data) =>
+      data is Map ? UserStruct.fromMap(data.cast<String, dynamic>()) : null;
+
+  Map<String, dynamic> toMap() => {
+        'uid': _uid,
+        'display_name': _displayName,
+        'username': _username,
+      }.withoutNulls;
+
+  @override
+  Map<String, dynamic> toSerializableMap() => {
+        'uid': serializeParam(
+          _uid,
+          ParamType.String,
+        ),
+        'display_name': serializeParam(
+          _displayName,
+          ParamType.String,
+        ),
+        'username': serializeParam(
+          _username,
+          ParamType.String,
+        ),
+      }.withoutNulls;
+
+  static UserStruct fromSerializableMap(Map<String, dynamic> data) =>
+      UserStruct(
+        uid: deserializeParam(
+          data['uid'],
+          ParamType.String,
+          false,
+        ),
+        displayName: deserializeParam(
+          data['display_name'],
+          ParamType.String,
+          false,
+        ),
+        username: deserializeParam(
+          data['username'],
+          ParamType.String,
+          false,
+        ),
+      );
+  @override
+  Map<String, DebugDataField> toDebugSerializableMap() => {
+        'uid': debugSerializeParam(
+          uid,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'display_name': debugSerializeParam(
+          displayName,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+        'username': debugSerializeParam(
+          username,
+          ParamType.String,
+          name: 'String',
+          nullable: false,
+        ),
+      };
+
+  @override
+  String toString() => 'UserStruct(${toMap()})';
+
+  @override
+  bool operator ==(Object other) {
+    return other is UserStruct &&
+        uid == other.uid &&
+        displayName == other.displayName &&
+        username == other.username;
+  }
+
+  @override
+  int get hashCode => const ListEquality().hash([uid, displayName, username]);
+}
+
+UserStruct createUserStruct({
+  String? uid,
+  String? displayName,
+  String? username,
+}) =>
+    UserStruct(
+      uid: uid,
+      displayName: displayName,
+      username: username,
+    );

+ 75 - 0
lib/backend/schema/util/schema_util.dart

@@ -0,0 +1,75 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:from_css_color/from_css_color.dart';
+
+import '/flutter_flow/flutter_flow_util.dart';
+
+export 'package:collection/collection.dart' show ListEquality;
+export 'package:flutter/material.dart' show Color, Colors;
+export 'package:from_css_color/from_css_color.dart';
+
+typedef StructBuilder<T> = T Function(Map<String, dynamic> data);
+
+abstract class BaseStruct with DebugLoggable {
+  Map<String, dynamic> toSerializableMap();
+  String serialize() => json.encode(toSerializableMap());
+  Map<String, DebugDataField> toDebugSerializableMap();
+}
+
+dynamic deserializeStructParam<T>(
+  dynamic param,
+  ParamType paramType,
+  bool isList, {
+  required StructBuilder<T> structBuilder,
+}) {
+  if (param == null) {
+    return null;
+  } else if (isList) {
+    final paramValues;
+    try {
+      paramValues = param is Iterable ? param : json.decode(param);
+    } catch (e) {
+      return null;
+    }
+    if (paramValues is! Iterable) {
+      return null;
+    }
+    return paramValues
+        .map<T>((e) => deserializeStructParam<T>(e, paramType, false,
+            structBuilder: structBuilder))
+        .toList();
+  } else if (param is Map<String, dynamic>) {
+    return structBuilder(param);
+  } else {
+    return deserializeParam<T>(
+      param,
+      paramType,
+      isList,
+      structBuilder: structBuilder,
+    );
+  }
+}
+
+List<T>? getStructList<T>(
+  dynamic value,
+  StructBuilder<T> structBuilder,
+) =>
+    value is! List
+        ? null
+        : value
+            .where((e) => e is Map<String, dynamic>)
+            .map((e) => structBuilder(e as Map<String, dynamic>))
+            .toList();
+
+Color? getSchemaColor(dynamic value) => value is String
+    ? fromCssColor(value)
+    : value is Color
+        ? value
+        : null;
+
+List<Color>? getColorsList(dynamic value) =>
+    value is! List ? null : value.map(getSchemaColor).withoutNulls;
+
+List<T>? getDataList<T>(dynamic value) =>
+    value is! List ? null : value.map((e) => castToType<T>(e)!).toList();

+ 131 - 0
lib/components/kaart_slider_uitgaan_s_comp_model.dart

@@ -0,0 +1,131 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/shared/tag_categorie_component/tag_categorie_component_widget.dart';
+import 'dart:ui';
+import 'kaart_slider_uitgaan_s_comp_widget.dart'
+    show KaartSliderUitgaanSCompWidget;
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class KaartSliderUitgaanSCompModel
+    extends FlutterFlowModel<KaartSliderUitgaanSCompWidget> {
+  ///  State fields for stateful widgets in this component.
+
+  // Models for tagCategorieComponent dynamic component.
+  Map<String, FlutterFlowModel> tagCategorieComponentModels = {};
+
+  final Map<String, DebugDataField> debugGeneratorVariables = {};
+  final Map<String, DebugDataField> debugBackendQueries = {};
+  final Map<String, FlutterFlowModel> widgetBuilderComponents = {};
+  @override
+  void initState(BuildContext context) {}
+
+  @override
+  void dispose() {}
+
+  @override
+  WidgetClassDebugData toWidgetClassDebugData() => WidgetClassDebugData(
+        widgetParameters: {
+          'titel': debugSerializeParam(
+            widget?.titel,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShUKDwoFdGl0ZWwSBm9jbW02eXICCANQAFoFdGl0ZWw=',
+            name: 'String',
+            nullable: true,
+          ),
+          'datum': debugSerializeParam(
+            widget?.datum,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShUKDwoFZGF0dW0SBm5rdG5xbXICCANQAFoFZGF0dW0=',
+            name: 'String',
+            nullable: true,
+          ),
+          'logo': debugSerializeParam(
+            widget?.logo,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShQKDgoEbG9nbxIGZnpoZTNucgIIBFAAWgRsb2dv',
+            name: 'String',
+            nullable: true,
+          ),
+          'categorie': debugSerializeParam(
+            widget?.categorie,
+            ParamType.String,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShsKEwoJY2F0ZWdvcmllEgZ6bTZicm9yBBICCANQAFoJY2F0ZWdvcmll',
+            name: 'String',
+            nullable: true,
+          ),
+          'horecagelegenheid': debugSerializeParam(
+            widget?.horecagelegenheid,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=SiEKGwoRaG9yZWNhZ2VsZWdlbmhlaWQSBnZqZTdhYXICCANQAFoRaG9yZWNhZ2VsZWdlbmhlaWQ=',
+            name: 'String',
+            nullable: true,
+          ),
+          'adres': debugSerializeParam(
+            widget?.adres,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShUKDwoFYWRyZXMSBnl0NGdkOXICCANQAFoFYWRyZXM=',
+            name: 'String',
+            nullable: true,
+          ),
+          'plaats': debugSerializeParam(
+            widget?.plaats,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+            searchReference:
+                'reference=ShYKEAoGcGxhYXRzEgY4dmE3amtyAggDUABaBnBsYWF0cw==',
+            name: 'String',
+            nullable: true,
+          )
+        }.withoutNulls.entries,
+        generatorVariables: debugGeneratorVariables.entries,
+        backendQueries: debugBackendQueries.entries,
+        componentStates: {
+          ...widgetBuilderComponents.map(
+            (key, value) => MapEntry(
+              key,
+              value.toWidgetClassDebugData(),
+            ),
+          ),
+        }.withoutNulls.entries,
+        dynamicComponentStates: {
+          'tagCategorieComponentModels (List<tagCategorieComponent>)':
+              DynamicWidgetClassDebugData(
+            componentStates: Map.fromIterables(
+              List.generate(
+                  tagCategorieComponentModels.length, (index) => '[$index]'),
+              tagCategorieComponentModels.values
+                  .map((e) => e.toWidgetClassDebugData()),
+            ).entries,
+          ),
+        }.withoutNulls.entries,
+        link:
+            'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd/tab=uiBuilder&page=kaartSliderUitgaanSComp',
+        searchReference:
+            'reference=OhdrYWFydFNsaWRlclVpdGdhYW5TQ29tcFAAWhdrYWFydFNsaWRlclVpdGdhYW5TQ29tcA==',
+        widgetClassName: 'kaartSliderUitgaanSComp',
+      );
+}

+ 422 - 0
lib/components/kaart_slider_uitgaan_s_comp_widget.dart

@@ -0,0 +1,422 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/shared/tag_categorie_component/tag_categorie_component_widget.dart';
+import 'dart:ui';
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'kaart_slider_uitgaan_s_comp_model.dart';
+export 'kaart_slider_uitgaan_s_comp_model.dart';
+
+class KaartSliderUitgaanSCompWidget extends StatefulWidget {
+  const KaartSliderUitgaanSCompWidget({
+    super.key,
+    this.titel,
+    this.datum,
+    this.logo,
+    this.categorie,
+    this.horecagelegenheid,
+    this.adres,
+    this.plaats,
+  });
+
+  final String? titel;
+  final String? datum;
+  final String? logo;
+  final List<String>? categorie;
+  final String? horecagelegenheid;
+  final String? adres;
+  final String? plaats;
+
+  @override
+  State<KaartSliderUitgaanSCompWidget> createState() =>
+      _KaartSliderUitgaanSCompWidgetState();
+}
+
+class _KaartSliderUitgaanSCompWidgetState
+    extends State<KaartSliderUitgaanSCompWidget> with RouteAware {
+  late KaartSliderUitgaanSCompModel _model;
+
+  @override
+  void setState(VoidCallback callback) {
+    super.setState(callback);
+    _model.onUpdate();
+  }
+
+  @override
+  void initState() {
+    super.initState();
+    _model = createModel(context, () => KaartSliderUitgaanSCompModel());
+  }
+
+  @override
+  void dispose() {
+    routeObserver.unsubscribe(this);
+
+    _model.maybeDispose();
+
+    super.dispose();
+  }
+
+  @override
+  void didUpdateWidget(KaartSliderUitgaanSCompWidget oldWidget) {
+    super.didUpdateWidget(oldWidget);
+    _model.widget = widget;
+  }
+
+  @override
+  void didChangeDependencies() {
+    super.didChangeDependencies();
+    final route = DebugModalRoute.of(context);
+    if (route != null) {
+      routeObserver.subscribe(this, route);
+    }
+    debugLogGlobalProperty(context);
+  }
+
+  @override
+  void didPopNext() {
+    if (mounted && DebugFlutterFlowModelContext.maybeOf(context) == null) {
+      setState(() => _model.isRouteVisible = true);
+      debugLogWidgetClass(_model);
+    }
+  }
+
+  @override
+  void didPush() {
+    if (mounted && DebugFlutterFlowModelContext.maybeOf(context) == null) {
+      setState(() => _model.isRouteVisible = true);
+      debugLogWidgetClass(_model);
+    }
+  }
+
+  @override
+  void didPop() {
+    _model.isRouteVisible = false;
+  }
+
+  @override
+  void didPushNext() {
+    _model.isRouteVisible = false;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    DebugFlutterFlowModelContext.maybeOf(context)
+        ?.parentModelCallback
+        ?.call(_model);
+    _model.tagCategorieComponentModels.clear();
+
+    return Column(
+      mainAxisSize: MainAxisSize.max,
+      children: [
+        Align(
+          alignment: AlignmentDirectional(0.0, -1.0),
+          child: Padding(
+            padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 8.0),
+            child: Container(
+              decoration: BoxDecoration(),
+              child: Column(
+                mainAxisSize: MainAxisSize.max,
+                children: [
+                  Text(
+                    widget!.titel!,
+                    style: FlutterFlowTheme.of(context).titleLarge.override(
+                      font: GoogleFonts.interTight(
+                        fontWeight:
+                            FlutterFlowTheme.of(context).titleLarge.fontWeight,
+                        fontStyle:
+                            FlutterFlowTheme.of(context).titleLarge.fontStyle,
+                      ),
+                      letterSpacing: 0.0,
+                      fontWeight:
+                          FlutterFlowTheme.of(context).titleLarge.fontWeight,
+                      fontStyle:
+                          FlutterFlowTheme.of(context).titleLarge.fontStyle,
+                      shadows: [
+                        Shadow(
+                          color: FlutterFlowTheme.of(context).secondaryText,
+                          offset: Offset(2.0, 2.0),
+                          blurRadius: 2.0,
+                        )
+                      ],
+                    ),
+                  ),
+                  Wrap(
+                    spacing: 0.0,
+                    runSpacing: 0.0,
+                    alignment: WrapAlignment.start,
+                    crossAxisAlignment: WrapCrossAlignment.start,
+                    direction: Axis.horizontal,
+                    runAlignment: WrapAlignment.start,
+                    verticalDirection: VerticalDirection.down,
+                    clipBehavior: Clip.none,
+                    children: [
+                      Icon(
+                        Icons.calendar_month,
+                        color: FlutterFlowTheme.of(context).primaryText,
+                        size: 24.0,
+                      ),
+                      Text(
+                        widget!.datum!,
+                        style:
+                            FlutterFlowTheme.of(context).titleMedium.override(
+                                  font: GoogleFonts.interTight(
+                                    fontWeight: FlutterFlowTheme.of(context)
+                                        .titleMedium
+                                        .fontWeight,
+                                    fontStyle: FlutterFlowTheme.of(context)
+                                        .titleMedium
+                                        .fontStyle,
+                                  ),
+                                  letterSpacing: 0.0,
+                                  fontWeight: FlutterFlowTheme.of(context)
+                                      .titleMedium
+                                      .fontWeight,
+                                  fontStyle: FlutterFlowTheme.of(context)
+                                      .titleMedium
+                                      .fontStyle,
+                                ),
+                      ),
+                    ],
+                  ),
+                ],
+              ),
+            ),
+          ),
+        ),
+        Align(
+          alignment: AlignmentDirectional(0.0, -1.0),
+          child: Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Expanded(
+                child: Align(
+                  alignment: AlignmentDirectional(1.0, -1.0),
+                  child: Container(
+                    decoration: BoxDecoration(
+                      borderRadius: BorderRadius.only(
+                        topLeft: Radius.circular(25.0),
+                        bottomLeft: Radius.circular(25.0),
+                      ),
+                    ),
+                    child: Align(
+                      alignment: AlignmentDirectional(1.0, -1.0),
+                      child: Stack(
+                        alignment: AlignmentDirectional(1.0, 0.0),
+                        children: [
+                          ClipRRect(
+                            borderRadius: BorderRadius.circular(8.0),
+                            child: Image.network(
+                              widget!.logo!,
+                              fit: BoxFit.cover,
+                              alignment: Alignment(0.0, 0.0),
+                            ),
+                          ),
+                          Align(
+                            alignment: AlignmentDirectional(1.0, 1.0),
+                            child: Padding(
+                              padding: EdgeInsetsDirectional.fromSTEB(
+                                  0.0, 0.0, 15.0, 0.0),
+                              child: Builder(
+                                builder: (context) {
+                                  final categorie =
+                                      widget!.categorie?.toList() ?? [];
+                                  _model.debugGeneratorVariables[
+                                          'categorie${categorie.length > 100 ? ' (first 100)' : ''}'] =
+                                      debugSerializeParam(
+                                    categorie.take(100),
+                                    ParamType.String,
+                                    isList: true,
+                                    link:
+                                        'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartSliderUitgaanSComp',
+                                    name: 'String',
+                                    nullable: false,
+                                  );
+                                  debugLogWidgetClass(_model);
+
+                                  return Row(
+                                    mainAxisSize: MainAxisSize.max,
+                                    mainAxisAlignment: MainAxisAlignment.end,
+                                    crossAxisAlignment:
+                                        CrossAxisAlignment.start,
+                                    children: List.generate(categorie.length,
+                                        (categorieIndex) {
+                                      final categorieItem =
+                                          categorie[categorieIndex];
+                                      return Align(
+                                        alignment:
+                                            AlignmentDirectional(1.0, 1.0),
+                                        child: Builder(builder: (_) {
+                                          return DebugFlutterFlowModelContext(
+                                            rootModel: _model.rootModel,
+                                            parentModelCallback: (m) {
+                                              _model.tagCategorieComponentModels[
+                                                  'Keygj0_${categorieIndex}_of_${categorie.length}'] = m;
+                                            },
+                                            child: TagCategorieComponentWidget(
+                                              key: Key(
+                                                  'Keygj0_${categorieIndex}_of_${categorie.length}'),
+                                              categorieTag: categorieItem,
+                                            ),
+                                          );
+                                        }),
+                                      );
+                                    }),
+                                  );
+                                },
+                              ),
+                            ),
+                          ),
+                        ],
+                      ),
+                    ),
+                  ),
+                ),
+              ),
+              Expanded(
+                child: Container(
+                  decoration: BoxDecoration(
+                    borderRadius: BorderRadius.only(
+                      topRight: Radius.circular(20.0),
+                      bottomRight: Radius.circular(20.0),
+                    ),
+                  ),
+                  alignment: AlignmentDirectional(0.0, 0.0),
+                  child: Padding(
+                    padding: EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 2.0),
+                    child: Column(
+                      mainAxisSize: MainAxisSize.min,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        Padding(
+                          padding: EdgeInsetsDirectional.fromSTEB(
+                              0.0, 2.0, 0.0, 2.0),
+                          child: Row(
+                            mainAxisSize: MainAxisSize.max,
+                            children: [
+                              Icon(
+                                Icons.add_business_sharp,
+                                color: FlutterFlowTheme.of(context).primaryText,
+                                size: 24.0,
+                              ),
+                              Align(
+                                alignment: AlignmentDirectional(-0.98, -0.42),
+                                child: Text(
+                                  widget!.horecagelegenheid!,
+                                  style: FlutterFlowTheme.of(context)
+                                      .bodyMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .bodyMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .bodyMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontStyle,
+                                      ),
+                                  overflow: TextOverflow.ellipsis,
+                                ),
+                              ),
+                            ],
+                          ),
+                        ),
+                        Padding(
+                          padding: EdgeInsetsDirectional.fromSTEB(
+                              0.0, 2.0, 0.0, 2.0),
+                          child: Wrap(
+                            spacing: 0.0,
+                            runSpacing: 0.0,
+                            alignment: WrapAlignment.start,
+                            crossAxisAlignment: WrapCrossAlignment.start,
+                            direction: Axis.horizontal,
+                            runAlignment: WrapAlignment.start,
+                            verticalDirection: VerticalDirection.down,
+                            clipBehavior: Clip.none,
+                            children: [
+                              Icon(
+                                Icons.location_on,
+                                color: FlutterFlowTheme.of(context).primaryText,
+                                size: 24.0,
+                              ),
+                              Padding(
+                                padding: EdgeInsetsDirectional.fromSTEB(
+                                    0.0, 0.0, 6.0, 0.0),
+                                child: Text(
+                                  widget!.adres!,
+                                  style: FlutterFlowTheme.of(context)
+                                      .bodyMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .bodyMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .bodyMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontStyle,
+                                      ),
+                                  overflow: TextOverflow.visible,
+                                ),
+                              ),
+                              Text(
+                                widget!.plaats!,
+                                style: FlutterFlowTheme.of(context)
+                                    .bodyMedium
+                                    .override(
+                                      font: GoogleFonts.inter(
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontStyle,
+                                      ),
+                                      letterSpacing: 0.0,
+                                      fontWeight: FlutterFlowTheme.of(context)
+                                          .bodyMedium
+                                          .fontWeight,
+                                      fontStyle: FlutterFlowTheme.of(context)
+                                          .bodyMedium
+                                          .fontStyle,
+                                    ),
+                                overflow: TextOverflow.visible,
+                              ),
+                            ],
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 142 - 0
lib/components/kaart_tabel_uitgaan_comp_model.dart

@@ -0,0 +1,142 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/shared/tag_categorie_component/tag_categorie_component_widget.dart';
+import 'dart:ui';
+import '/custom_code/widgets/index.dart' as custom_widgets;
+import 'kaart_tabel_uitgaan_comp_widget.dart' show KaartTabelUitgaanCompWidget;
+import 'package:auto_size_text/auto_size_text.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class KaartTabelUitgaanCompModel
+    extends FlutterFlowModel<KaartTabelUitgaanCompWidget> {
+  ///  State fields for stateful widgets in this component.
+
+  // Models for tagCategorieComponent dynamic component.
+  Map<String, FlutterFlowModel> tagCategorieComponentModels = {};
+
+  final Map<String, DebugDataField> debugGeneratorVariables = {};
+  final Map<String, DebugDataField> debugBackendQueries = {};
+  final Map<String, FlutterFlowModel> widgetBuilderComponents = {};
+  @override
+  void initState(BuildContext context) {}
+
+  @override
+  void dispose() {}
+
+  @override
+  WidgetClassDebugData toWidgetClassDebugData() => WidgetClassDebugData(
+        widgetParameters: {
+          'logo': debugSerializeParam(
+            widget?.logo,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShQKDgoEbG9nbxIGOTY2ZzA0cgIIBFAAWgRsb2dv',
+            name: 'String',
+            nullable: true,
+          ),
+          'categorie': debugSerializeParam(
+            widget?.categorie,
+            ParamType.String,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShsKEwoJY2F0ZWdvcmllEgY0bmhyazdyBBICCANQAFoJY2F0ZWdvcmll',
+            name: 'String',
+            nullable: true,
+          ),
+          'titel': debugSerializeParam(
+            widget?.titel,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShUKDwoFdGl0ZWwSBnJzZDN5anICCANQAFoFdGl0ZWw=',
+            name: 'String',
+            nullable: true,
+          ),
+          'datum': debugSerializeParam(
+            widget?.datum,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShUKDwoFZGF0dW0SBnJqdWduZnICCANQAFoFZGF0dW0=',
+            name: 'String',
+            nullable: true,
+          ),
+          'horecagelegenheid': debugSerializeParam(
+            widget?.horecagelegenheid,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=SiEKGwoRaG9yZWNhZ2VsZWdlbmhlaWQSBmh4ZXh2dXICCANQAFoRaG9yZWNhZ2VsZWdlbmhlaWQ=',
+            name: 'String',
+            nullable: true,
+          ),
+          'adres': debugSerializeParam(
+            widget?.adres,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShUKDwoFYWRyZXMSBmFlOG9ueXICCANQAFoFYWRyZXM=',
+            name: 'String',
+            nullable: true,
+          ),
+          'plaats': debugSerializeParam(
+            widget?.plaats,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShYKEAoGcGxhYXRzEgY3ZW85emRyAggDUABaBnBsYWF0cw==',
+            name: 'String',
+            nullable: true,
+          ),
+          'inhoud': debugSerializeParam(
+            widget?.inhoud,
+            ParamType.String,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kaartTabelUitgaanComp',
+            searchReference:
+                'reference=ShYKEAoGaW5ob3VkEgZrYTNjMTRyAggDUABaBmluaG91ZA==',
+            name: 'String',
+            nullable: true,
+          )
+        }.withoutNulls.entries,
+        generatorVariables: debugGeneratorVariables.entries,
+        backendQueries: debugBackendQueries.entries,
+        componentStates: {
+          ...widgetBuilderComponents.map(
+            (key, value) => MapEntry(
+              key,
+              value.toWidgetClassDebugData(),
+            ),
+          ),
+        }.withoutNulls.entries,
+        dynamicComponentStates: {
+          'tagCategorieComponentModels (List<tagCategorieComponent>)':
+              DynamicWidgetClassDebugData(
+            componentStates: Map.fromIterables(
+              List.generate(
+                  tagCategorieComponentModels.length, (index) => '[$index]'),
+              tagCategorieComponentModels.values
+                  .map((e) => e.toWidgetClassDebugData()),
+            ).entries,
+          ),
+        }.withoutNulls.entries,
+        link:
+            'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd/tab=uiBuilder&page=kaartTabelUitgaanComp',
+        searchReference:
+            'reference=OhVrYWFydFRhYmVsVWl0Z2FhbkNvbXBQAFoVa2FhcnRUYWJlbFVpdGdhYW5Db21w',
+        widgetClassName: 'kaartTabelUitgaanComp',
+      );
+}

Vissa filer visades inte eftersom för många filer har ändrats