Compare commits
	
		
			503 Commits
		
	
	
		
			3.0.0+107
			...
			838d18013b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 838d18013b | |||
| 3f7902e463 | |||
| 54560ad5d8 | |||
| 0c729db639 | |||
| 1fbaac8d88 | |||
| b9dc724f0b | |||
| a2cc55696f | |||
| e79f857feb | |||
| affba29c04 | |||
| 756746b144 | |||
| 28b6eade48 | |||
| 1de7ef8c96 | |||
| 67eac5dcf5 | |||
| 7a44bfa075 | |||
| 1c2f25a152 | |||
| be26ea280e | |||
| b4996d069f | |||
| bf4892b34d | |||
| 5f84751fd5 | |||
| 457d1bac60 | |||
| 02ec11845b | |||
| 612f1bf004 | |||
| fd80b713ad | |||
| 508805368c | |||
| 98eb28a4ec | |||
| d1a2f59dd1 | |||
| bb9adb963a | |||
| 83e40cd860 | |||
| c06fb12f6a | |||
| 6600cf4df8 | |||
| 4293daaa2f | |||
| 866674ddde | |||
| 27d478ba4f | |||
| cccade763f | |||
| f760b85186 | |||
| e68c5f4f92 | |||
| b0f3b6b5c3 | |||
| cb2af379fa | |||
| 38f8103265 | |||
| 06bb18bdaa | |||
| 84c38500d0 | |||
| 9529bbf08b | |||
| 8baf77bcf7 | |||
| b2ac5fbef2 | |||
| c79b1d7aab | |||
|  | 4f55a8209c | ||
|  | ace302111a | ||
|  | 1391fa0dde | ||
|  | cbdc7acdcd | ||
|  | b80d91825a | ||
|  | 1a703b7eba | ||
|  | 3621ea7744 | ||
|  | b638343f02 | ||
|  | 269a64cabb | ||
| 406e5187a8 | |||
| 9bdd08d8dd | |||
| d737232dcf | |||
| c9d751479e | |||
| a2c2bfe585 | |||
| c7f9da0dee | |||
|  | a243cda1df | ||
|  | 7b238f32fd | ||
| 313af28d7f | |||
| c64e1e208c | |||
| c9b07a9a2a | |||
| 55c0e355f1 | |||
| be414891ec | |||
| 787876ab6a | |||
| 8578cde620 | |||
| 14d55d45a8 | |||
| 724391584e | |||
| 3a5e45808a | |||
| 488055955c | |||
|  | 313ebc64cc | ||
|  | 1ed8b1d0c1 | ||
| 4af816d931 | |||
| 1c058a4323 | |||
| 461ed1fcda | |||
| 5363afa558 | |||
| f0d2737da8 | |||
| 1f2f80aa3e | |||
| 240a872e65 | |||
| c1ec6f0849 | |||
| ab42686d4d | |||
| c9727e92b8 | |||
| 9b8768061d | |||
| 0949f0da54 | |||
| 215ca705ac | |||
| 03457af04a | |||
| 73c6a1febf | |||
| ba8d30bcde | |||
| 8449658b47 | |||
| c7f417234e | |||
| 6c847ee1e1 | |||
| 18ad4d376e | |||
| c4d5ba5c9d | |||
| 1069669049 | |||
| aa648fec62 | |||
| 541900673a | |||
| 265502ffd0 | |||
| 3bd79350d1 | |||
| 5294d1fb23 | |||
| ec1269dcf1 | |||
| edb0a25f34 | |||
| 7cd10118cc | |||
| fcddc8f345 | |||
| 1cc34240da | |||
| 013f7f02bc | |||
| 4e79e4100f | |||
| feda1f067f | |||
| fe0e192a43 | |||
| 93df294142 | |||
| 78d65c39f3 | |||
| 18b0dbd797 | |||
| 80cc8cbb40 | |||
| 646e95a9fc | |||
| 6f9d51673b | |||
| f8c6887769 | |||
| cd2a507b7f | |||
| 3cafce00a2 | |||
| 837f3fbe98 | |||
| ca7cc5d7ee | |||
| ef2c14daa2 | |||
| 3a17837cc6 | |||
| 2617a64acf | |||
| afe1e12a3b | |||
| be80f5ff85 | |||
| 3281d69eba | |||
| 77b6ce9937 | |||
| 39275f61b5 | |||
| 72193ba8f3 | |||
| 98dd9b6617 | |||
| a22b94a263 | |||
| 9c75eafdb3 | |||
| 28fda3d0c7 | |||
| 187c2ea43e | |||
| ae7d967461 | |||
| 1ce71f1fa1 | |||
| 9b68808c77 | |||
|  | 99b7bf8199 | ||
|  | eb9bb73c31 | ||
|  | a8c3830d67 | ||
|  | 07a5a19141 | ||
| ecc100ac45 | |||
| 573b76d3ff | |||
| f7dad5e419 | |||
| 9f2f1c0848 | |||
| 580d9fd979 | |||
| 3b375abc09 | |||
| c527b5e67c | |||
| e9f09bbe54 | |||
| 3aece9316c | |||
| a61c889c6c | |||
| 0dd3221a56 | |||
| 66918521f8 | |||
| bb1846e462 | |||
| a976a6eaf4 | |||
| 4252f66fd3 | |||
| f2d780b48f | |||
| 300541f9bb | |||
| 43787bb813 | |||
| 3417c51a3b | |||
| f98e603e82 | |||
| c9b71701c8 | |||
| 28e98488f1 | |||
| b4d476613e | |||
| b48a1aac44 | |||
| 596d212593 | |||
| 54f290327e | |||
| 16f248ceab | |||
| 856d811187 | |||
| d07b194c04 | |||
| 2554b58be6 | |||
| a627b5838e | |||
| c479a9f381 | |||
| 02057e663b | |||
| 6501594100 | |||
| c6599edc3d | |||
| 709a0620b6 | |||
| f9b2a96c7c | |||
| 4dca6189cb | |||
| c7f5b63fe5 | |||
| 96c2f45c85 | |||
| 06f04eb3a5 | |||
| 8af97e43b4 | |||
| d1e8234b93 | |||
| a03d6015a6 | |||
| 246ac52d0a | |||
| abf395ff9a | |||
| 4fdc8eb1d0 | |||
| d7dcde898c | |||
| f85484d3ed | |||
| 5060bd30c9 | |||
| 3959f2260b | |||
| 6f4f1216ad | |||
| f401ffbf81 | |||
| 0251697951 | |||
| 178c12b893 | |||
| 4beda9200e | |||
| 7dfe411053 | |||
| 1232318a5d | |||
|  | 56f41b6c0e | ||
|  | 3ea717d25a | ||
| 1fe4889460 | |||
| cdf2722268 | |||
| a127b5bace | |||
| b2097cf044 | |||
| 701f29748d | |||
| 9e40ed4600 | |||
| c90e6fe661 | |||
| 569483300d | |||
| bab602d98b | |||
| b4f2bb803a | |||
| 03bfed6f46 | |||
| f98e5a0aec | |||
| 3d473e2fec | |||
| 0b6efa373a | |||
| 9b60e96cde | |||
| 81cd9b2082 | |||
| 923d5d7514 | |||
| 7169aff841 | |||
| fac3efb50c | |||
| e809aadaea | |||
| f33b569221 | |||
| e5f2e2d146 | |||
| 11368d064f | |||
| 246b163aec | |||
| 10e0d2fe5f | |||
| 99e10cb612 | |||
| 1db6941431 | |||
| 8370da4fe3 | |||
| 2bdf7029e9 | |||
| 86682a3a9a | |||
| c3925e81b5 | |||
| 6f1f488490 | |||
| 31b2de2e46 | |||
| 412dcfa62a | |||
| ffdc7e81ae | |||
| 1d3357803d | |||
| 6c48aa2356 | |||
| 466e354679 | |||
| 5d4b896f70 | |||
| a04dffdfe8 | |||
| ff871943cf | |||
| 1a892ab227 | |||
| af1b303211 | |||
| 6fd702eba8 | |||
| d220d43cd2 | |||
| 6892afb974 | |||
| 007b46b080 | |||
| 67d130dc34 | |||
| 7e923c77fe | |||
| a593b52812 | |||
|  | 520dc80303 | ||
| 001897bbcd | |||
|  | bab29c23e3 | ||
| 76b39f2df3 | |||
| 509b3e145b | |||
| 2b80ebc2d0 | |||
| 0ab908dd2a | |||
| 6007467e7a | |||
| 3745157c42 | |||
| 94481ec7bd | |||
| fbfe8cbdee | |||
| fbbab0a981 | |||
| ae2fb3b303 | |||
| 3d7a4666ed | |||
| 5d3e0fb800 | |||
| 85ff52a661 | |||
| da7fd64a43 | |||
| 3902633217 | |||
| f478ea8b84 | |||
| 0f481aff5b | |||
| 7a31663310 | |||
| 0239c53c04 | |||
| 16987c758e | |||
| 3a36915140 | |||
| 4bde708878 | |||
| 2f0cf560f8 | |||
| cf355a95fd | |||
| 2f43073172 | |||
| 8236d31ecc | |||
| 459a7dade0 | |||
| e6000a660a | |||
| 75abaac205 | |||
| 603d5c3f73 | |||
| 4e4bd99598 | |||
| d1fbe5f15e | |||
| c061ef2132 | |||
| c378309bdd | |||
| b2c5d64fc5 | |||
|  | 5371637b16 | ||
| c5cbf0af37 | |||
| 1a31e22450 | |||
|  | 49db54529d | ||
| 8e0c0c6054 | |||
| f3d1183076 | |||
| a9f7f0cce0 | |||
| f2943f8411 | |||
| 808e7dcffa | |||
| 9bed4fa6fb | |||
| e6255a340b | |||
| 78bf319fb7 | |||
| 36a966d582 | |||
| f72b268d36 | |||
| 44ef31034e | |||
| 229dc2186f | |||
| a2f9a1efb4 | |||
|  | 823e3c5de6 | ||
|  | faac7bac35 | ||
| 1fac1bfe02 | |||
| 9394b1d9c8 | |||
| 43dd13bac4 | |||
| 65bc372103 | |||
| 6558854a7a | |||
| 892035ab27 | |||
| 87ae8d2ff4 | |||
| 15c2dbaa0d | |||
| 6b3338b885 | |||
| bb00b1bc6a | |||
| 5e1a15ada2 | |||
| 9bdf8ba346 | |||
| 204c087f29 | |||
| 1def3e1895 | |||
| 550c74e544 | |||
| a39565f012 | |||
| aa9755e6a7 | |||
| b25e8d661a | |||
| 4b253ac3ec | |||
| 5d1b875d3c | |||
| e2e103fa67 | |||
| 43c90da4e3 | |||
| fa210dd98f | |||
| 43d9ca92bf | |||
| 5e592c143f | |||
| 0c59816f26 | |||
| 19c2457895 | |||
| af8d87857e | |||
| d05f63a36a | |||
| e2dc520012 | |||
| cff9c15e31 | |||
| f00135c4bf | |||
| 30b8a6c30f | |||
| b9c4ee31b1 | |||
| 87870af866 | |||
| b83cb0fb0b | |||
| 7fd1fe34e5 | |||
| 1c18330891 | |||
| d320879ad0 | |||
| 950150e119 | |||
| 3c4a9767e1 | |||
| 5df2445f3f | |||
| 56543d7b4c | |||
| 4c6fea1242 | |||
| fff43de9e3 | |||
| b31a915544 | |||
| 8956723ac5 | |||
| ccc3ac415e | |||
| 8c47a59b80 | |||
| a6d869ebf6 | |||
| f3a8699389 | |||
| d345c00e84 | |||
| a706f127b6 | |||
| 680ece0b6a | |||
| b976c6ed37 | |||
| 6ae6b132de | |||
| 95aec7c95b | |||
| edd760fbcb | |||
| ba269dbbb8 | |||
| 1aa45dd9f1 | |||
| 92685d7410 | |||
| c8e351514d | |||
| f3900825e3 | |||
| 2cc6652f75 | |||
| 4d4409de2e | |||
| e1286c797f | |||
| bec037622f | |||
| a0d8c1a9b3 | |||
| 26135d2116 | |||
| 71b67fd22d | |||
| 855072dfea | |||
| b39e2e2d64 | |||
| 84b1d6a346 | |||
| 28335dd548 | |||
| 7253e2d3ef | |||
| 4d489425fa | |||
| 890a8a44cf | |||
| 8e3583f57a | |||
| d0ff14659f | |||
| 1f7caaeaac | |||
| 9f9f42071a | |||
| 6bd6e994cb | |||
| 02e68d76ee | |||
| d04b06089c | |||
| 9be6fea2e0 | |||
| 6b1214a06f | |||
| 4597373ac9 | |||
| 047c8d93aa | |||
| 715f95ca22 | |||
| ba709012d7 | |||
| fd186f8391 | |||
| 262d36cd2d | |||
| f320855348 | |||
| ed90152462 | |||
| 6e5c5f1690 | |||
| 7c92dee097 | |||
| e4bb031138 | |||
| 97226ae96b | |||
| d8cd33e79a | |||
| 5ecd39b6a9 | |||
| 8854305e99 | |||
| 903cade296 | |||
| e48410a528 | |||
| 170ea4f2c0 | |||
| 19f0e11384 | |||
| 80bf6c3bbe | |||
| 8352ce8b5b | |||
| c06abf6e42 | |||
| 37cc0a5291 | |||
| 25ae18d6a9 | |||
| 18db50d80c | |||
| 903008d397 | |||
| 4499d4ec8e | |||
| 3a4faac8cb | |||
| e6c58b7b63 | |||
| a7454edec0 | |||
| cbf1952eb7 | |||
| 6d06f0a1b4 | |||
| f2d2a9efd8 | |||
| d44c8217b0 | |||
| 446c33d8b0 | |||
| 996462f1fd | |||
| 778f6bb79f | |||
| 8747f948b9 | |||
| 9546d6e4b8 | |||
| f8d1940af6 | |||
| b2b0891d24 | |||
| 274168d4bc | |||
| 2c98b348d5 | |||
| afc7887ddd | |||
| 99ff78a3d5 | |||
| 2ad85addf6 | |||
| 552b4b2572 | |||
| 594ac39e3d | |||
| 23321171f3 | |||
| ee72d79c93 | |||
| a20c2598fc | |||
| 2eba871a6d | |||
| 46919dec31 | |||
| 9dd6cffe0c | |||
| 2ea9f5e907 | |||
| 050750a808 | |||
| f479b9fc8b | |||
| 13ea182707 | |||
| 14183a7316 | |||
| 9fc9b87608 | |||
| 53c2445ba9 | |||
| d414695eb3 | |||
|  | 27bc17079e | ||
|  | 295188459b | ||
|  | 66115258a7 | ||
|  | 2cf2c515b4 | ||
|  | 925cb2b423 | ||
|  | 0a2804a404 | ||
|  | 12bbcbf69c | ||
|  | 52ce490725 | ||
| 82067fb3aa | |||
| 007acedf29 | |||
| 8e903ec6c1 | |||
| b55e56c3c4 | |||
| 6f9de431b1 | |||
| a8efd26262 | |||
| e367fc3f5c | |||
| 8a1af120ea | |||
| f03f0181f8 | |||
| 6c7d42c31a | |||
| d6c829c26a | |||
| 666a2dfbf5 | |||
| fd979c3a35 | |||
| 847fc6e864 | |||
| 356b7bf01a | |||
| 450d5ebc81 | |||
| f04285848f | |||
| c4becb0a05 | |||
| d22619396b | |||
| fe8640a6db | |||
| ff475d43dd | |||
| 9e8f6d57df | |||
| 79227a12e2 | |||
| a23dcfe702 | |||
| 243ecb3f71 | |||
| b8dec9f798 | |||
| 536375729f | |||
| 5939a1dc5b | |||
| 9d115a5712 | |||
| f511612a53 | |||
| 180fbcc558 | |||
| 047cb9dc0d | |||
| 786f851a97 | |||
| 4deff5a920 | |||
| 0361f031db | |||
| e90b35f19f | |||
| f2829b2012 | 
							
								
								
									
										14
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -3,7 +3,7 @@ name: Build Release | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - '*' | ||||
|       - "*" | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
| @@ -41,6 +41,15 @@ jobs: | ||||
|         with: | ||||
|           name: build-output-windows | ||||
|           path: build/windows/x64/runner/Release | ||||
|       - name: Compile Installer | ||||
|         uses: Minionguyjpro/Inno-Setup-Action@v1.2.2 | ||||
|         with: | ||||
|           path: setup.iss | ||||
|       - name: Archive installer artifacts | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: build-output-windows-installer | ||||
|           path: Installer/windows-x86_64-setup.exe | ||||
|   build-linux: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
| @@ -59,6 +68,7 @@ jobs: | ||||
|           sudo apt-get install -y libnotify-dev | ||||
|           sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev | ||||
|           sudo apt-get install -y gstreamer-1.0 | ||||
|           sudo apt-get install -y libsecret-1-dev | ||||
|       - run: flutter pub get | ||||
|       - run: flutter build linux | ||||
|       - name: Archive production artifacts | ||||
| @@ -80,4 +90,4 @@ jobs: | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: build-output-linux-appimage | ||||
|           path: './*.AppImage*' | ||||
|           path: "./*.AppImage*" | ||||
|   | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -12,6 +12,9 @@ | ||||
| .swiftpm/ | ||||
| migrate_working_dir/ | ||||
|  | ||||
| # Inno Setup | ||||
| Installer/ | ||||
|  | ||||
| # IntelliJ related | ||||
| *.iml | ||||
| *.ipr | ||||
|   | ||||
| @@ -8,6 +8,9 @@ | ||||
|  | ||||
| Hello there! Welcome to the main repository of the DysonNetwork (also known as the Solar Network). The code here is mainly about the front-end app (also known as Solian). But you can still post issues here to get help and request new features! | ||||
|  | ||||
| 如果你看得懂这行字,你可以前往我们的文档来了解更多: | ||||
| [Suki - Solar Network](https://kb.solsynth.dev/zh/solar-network) | ||||
|  | ||||
| ## Server | ||||
|  | ||||
| The backend of the Solar Network project is located at [Solsynth/DysonNetwork](https://github.com/Solsynth/DysonNetwork) | ||||
| @@ -25,8 +28,6 @@ The content below will lead you to the world of Solar Network. | ||||
|  | ||||
| ### For Normal Users | ||||
|  | ||||
| **The v3 Release is not ready, yet.** | ||||
|  | ||||
| 1. Go to the Github Releases page, and download the latest release / pre-release according to your platform. | ||||
|    - **What's the difference between stable and pre-release?** The pre-release is untested by the other users and includes the new cutting-edge features, usually the pre-release is the feature drop. At the same time, due to we're not doing the API versioning, some breaking changes may break the stable release, so use the pre-release one instead. | ||||
| 2. Create an account on the Solar Network | ||||
| @@ -61,4 +62,3 @@ If you want to build the release version, use the flutter build command. Learn m | ||||
| ```bash | ||||
| flutter build <platform> | ||||
| ``` | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,7 @@ plugins { | ||||
|     id("com.android.application") | ||||
|     // START: FlutterFire Configuration | ||||
|     id("com.google.gms.google-services") | ||||
|     id("com.google.firebase.crashlytics") | ||||
|     // END: FlutterFire Configuration | ||||
|     id("kotlin-android") | ||||
|     // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. | ||||
| @@ -23,6 +24,8 @@ android { | ||||
|     ndkVersion = "29.0.13113456" | ||||
|  | ||||
|     compileOptions { | ||||
|         isCoreLibraryDesugaringEnabled = true | ||||
|  | ||||
|         sourceCompatibility = JavaVersion.VERSION_17 | ||||
|         targetCompatibility = JavaVersion.VERSION_17 | ||||
|     } | ||||
| @@ -51,12 +54,22 @@ android { | ||||
|     buildTypes { | ||||
|         release { | ||||
|             signingConfig = signingConfigs.getByName("release") | ||||
|  | ||||
|             isMinifyEnabled = true | ||||
|             proguardFiles( | ||||
|                 getDefaultProguardFile("proguard-android-optimize.txt"), | ||||
|                 "proguard-rules.pro" | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") | ||||
|      | ||||
|     implementation("com.google.android.material:material:1.12.0") | ||||
|     implementation("com.github.bumptech.glide:glide:4.16.0") | ||||
|     implementation("com.squareup.okhttp3:okhttp:5.1.0") | ||||
| } | ||||
|  | ||||
| flutter { | ||||
|   | ||||
| @@ -12,7 +12,12 @@ | ||||
|           "package_name": "dev.solsynth.solian" | ||||
|         } | ||||
|       }, | ||||
|       "oauth_client": [], | ||||
|       "oauth_client": [ | ||||
|         { | ||||
|           "client_id": "961776991058-963m1qin2vtp8fv693b5fdrab5hmpl89.apps.googleusercontent.com", | ||||
|           "client_type": 3 | ||||
|         } | ||||
|       ], | ||||
|       "api_key": [ | ||||
|         { | ||||
|           "current_key": "AIzaSyDvFNudXYs29uDtcCv6pFR8h5tXBs90FYk" | ||||
| @@ -20,7 +25,20 @@ | ||||
|       ], | ||||
|       "services": { | ||||
|         "appinvite_service": { | ||||
|           "other_platform_oauth_client": [] | ||||
|           "other_platform_oauth_client": [ | ||||
|             { | ||||
|               "client_id": "961776991058-963m1qin2vtp8fv693b5fdrab5hmpl89.apps.googleusercontent.com", | ||||
|               "client_type": 3 | ||||
|             }, | ||||
|             { | ||||
|               "client_id": "961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com", | ||||
|               "client_type": 2, | ||||
|               "ios_info": { | ||||
|                 "bundle_id": "dev.solsynth.solian", | ||||
|                 "app_store_id": "6499032345" | ||||
|               } | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
							
								
								
									
										5
									
								
								android/app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| # JNI Zero initialization (required for WebRTC native method registration) | ||||
| -keep class livekit.org.jni_zero.JniInit { | ||||
|     # Keep the init method un-obfuscated for native code callback | ||||
|     private static java.lang.Object[] init(); | ||||
| } | ||||
| @@ -4,6 +4,7 @@ | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
|     <uses-permission android:name="android.permission.CAMERA" /> | ||||
|     <uses-permission android:name="android.permission.RECORD_AUDIO" /> | ||||
|     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> | ||||
|     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | ||||
|     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> | ||||
|     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> | ||||
| @@ -41,20 +42,61 @@ | ||||
|                 <action android:name="android.intent.action.MAIN" /> | ||||
|                 <category android:name="android.intent.category.LAUNCHER" /> | ||||
|             </intent-filter> | ||||
|              | ||||
|  | ||||
|             <!-- Deeplinking --> | ||||
|             <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="http" android:host="solian.app" /> | ||||
|                 <data android:scheme="https" /> | ||||
|             </intent-filter> | ||||
|  | ||||
|             <!-- Share Intent Filters --> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="*/*" /> | ||||
|                 <data android:mimeType="image/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND_MULTIPLE" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="*/*" /> | ||||
|                 <data android:mimeType="image/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="video/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND_MULTIPLE" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="video/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="text/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="application/*" /> | ||||
|             </intent-filter> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.SEND_MULTIPLE" /> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|                 <data android:mimeType="application/*" /> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|  | ||||
|         <!-- Livekit Screenshare --> | ||||
|         <service | ||||
|             android:name="de.julianassmann.flutter_background.IsolateHolderService" | ||||
|             android:enabled="true" | ||||
|             android:exported="false" | ||||
|             android:foregroundServiceType="mediaProjection" /> | ||||
|  | ||||
|         <!-- Sign in with Apple --> | ||||
|         <activity | ||||
|             android:name="com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback" | ||||
| @@ -70,6 +112,11 @@ | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|  | ||||
|         <receiver | ||||
|             android:name=".receiver.ReplyReceiver" | ||||
|             android:enabled="true" | ||||
|             android:exported="true" /> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.core.content.FileProvider" | ||||
|             android:authorities="dev.solsynth.solian.provider" | ||||
| @@ -96,4 +143,4 @@ | ||||
|             <data android:mimeType="text/plain" /> | ||||
|         </intent> | ||||
|     </queries> | ||||
| </manifest> | ||||
| </manifest> | ||||
|   | ||||
| @@ -1,14 +0,0 @@ | ||||
| package dev.solsynth.solian | ||||
|  | ||||
| import io.flutter.embedding.android.FlutterActivity | ||||
| import io.flutter.embedding.engine.FlutterEngine | ||||
| import io.flutter.plugins.sharedpreferences.LegacySharedPreferencesPlugin | ||||
|  | ||||
| class MainActivity : FlutterActivity() | ||||
| { | ||||
|     override fun configureFlutterEngine(flutterEngine: FlutterEngine) { | ||||
|         super.configureFlutterEngine(flutterEngine) | ||||
|         // https://github.com/flutter/flutter/issues/153075#issuecomment-2693189362 | ||||
|         flutterEngine.plugins.add(LegacySharedPreferencesPlugin()) | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,39 @@ | ||||
| package dev.solsynth.solian | ||||
|  | ||||
| import android.content.Intent | ||||
| import io.flutter.embedding.android.FlutterActivity | ||||
| import io.flutter.embedding.engine.FlutterEngine | ||||
| import io.flutter.plugin.common.MethodChannel | ||||
| import io.flutter.plugins.sharedpreferences.LegacySharedPreferencesPlugin | ||||
|  | ||||
| class MainActivity : FlutterActivity() | ||||
| { | ||||
|     private val CHANNEL = "dev.solsynth.solian/notifications" | ||||
|  | ||||
|     override fun configureFlutterEngine(flutterEngine: FlutterEngine) { | ||||
|         super.configureFlutterEngine(flutterEngine) | ||||
|         // https://github.com/flutter/flutter/issues/153075#issuecomment-2693189362 | ||||
|         flutterEngine.plugins.add(LegacySharedPreferencesPlugin()) | ||||
|  | ||||
|         MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> | ||||
|             if (call.method == "initialLink") { | ||||
|                 val roomId = intent.getStringExtra("room_id") | ||||
|                 if (roomId != null) { | ||||
|                     result.success("/rooms/$roomId") | ||||
|                 } else { | ||||
|                     result.success(null) | ||||
|                 } | ||||
|             } else { | ||||
|                 result.notImplemented() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onNewIntent(intent: Intent) { | ||||
|         super.onNewIntent(intent) | ||||
|         val roomId = intent.getStringExtra("room_id") | ||||
|         if (roomId != null) { | ||||
|             MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, CHANNEL).invokeMethod("newLink", "/rooms/$roomId") | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,47 @@ | ||||
| package dev.solsynth.solian.network | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.SharedPreferences | ||||
| import okhttp3.Call | ||||
| import okhttp3.Callback | ||||
| import okhttp3.MediaType.Companion.toMediaType | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.RequestBody.Companion.toRequestBody | ||||
| import okhttp3.Response | ||||
| import org.json.JSONObject | ||||
| import java.io.IOException | ||||
|  | ||||
| class ApiClient(private val context: Context) { | ||||
|     private val client = OkHttpClient() | ||||
|     private val sharedPreferences: SharedPreferences = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE) | ||||
|  | ||||
|     fun sendMessage(roomId: String, message: String, replyTo: String, callback: (Boolean) -> Unit) { | ||||
|         val token = sharedPreferences.getString("flutter.token", null) | ||||
|         if (token == null) { | ||||
|             callback(false) | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         val json = JSONObject().apply { | ||||
|             put("content", message) | ||||
|             put("reply_to", replyTo) | ||||
|         } | ||||
|         val body = json.toString().toRequestBody("application/json; charset=utf-8".toMediaType()) | ||||
|         val request = Request.Builder() | ||||
|             .url("https://solian.dev/api/rooms/$roomId/messages") | ||||
|             .header("Authorization", "Bearer $token") | ||||
|             .post(body) | ||||
|             .build() | ||||
|  | ||||
|         client.newCall(request).enqueue(object : Callback { | ||||
|             override fun onFailure(call: Call, e: IOException) { | ||||
|                 callback(false) | ||||
|             } | ||||
|  | ||||
|             override fun onResponse(call: Call, response: Response) { | ||||
|                 callback(response.isSuccessful) | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,27 @@ | ||||
| package dev.solsynth.solian.receiver | ||||
|  | ||||
| import android.app.NotificationManager | ||||
| import android.content.BroadcastReceiver | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import androidx.core.app.RemoteInput | ||||
| import dev.solsynth.solian.network.ApiClient | ||||
|  | ||||
| class ReplyReceiver : BroadcastReceiver() { | ||||
|     override fun onReceive(context: Context, intent: Intent) { | ||||
|         val remoteInput = RemoteInput.getResultsFromIntent(intent) | ||||
|         if (remoteInput != null) { | ||||
|             val replyText = remoteInput.getCharSequence("key_text_reply").toString() | ||||
|             val roomId = intent.getStringExtra("room_id") | ||||
|             val messageId = intent.getStringExtra("message_id") | ||||
|             val notificationId = intent.getIntExtra("notification_id", 0) | ||||
|  | ||||
|             if (roomId != null && messageId != null) { | ||||
|                 ApiClient(context).sendMessage(roomId, replyText, messageId) { | ||||
|                     val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager | ||||
|                     notificationManager.cancel(notificationId) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										41
									
								
								android/app/src/main/res/drawable/ic_notification.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:width="192dp" | ||||
|     android:height="192dp" | ||||
|     android:viewportWidth="192" | ||||
|     android:viewportHeight="192"> | ||||
|   <path | ||||
|       android:pathData="M54,147h86" | ||||
|       android:strokeLineJoin="round" | ||||
|       android:strokeWidth="12" | ||||
|       android:fillColor="#00000000" | ||||
|       android:strokeColor="#000" | ||||
|       android:strokeLineCap="round"/> | ||||
|   <path | ||||
|       android:pathData="M57,111s-2,-4.5 -2,-10m22,22s-4,7 -11,4m9,-22s-2,-4.5 -2,-10" | ||||
|       android:strokeLineJoin="round" | ||||
|       android:strokeWidth="10" | ||||
|       android:fillColor="#00000000" | ||||
|       android:strokeColor="#000" | ||||
|       android:strokeLineCap="round"/> | ||||
|   <path | ||||
|       android:pathData="M54,147a32,32 0,0 1,-12 -61.67A39,39 0,0 1,81 46m59,101a30,30 0,0 0,29.93 -28" | ||||
|       android:strokeLineJoin="round" | ||||
|       android:strokeWidth="12" | ||||
|       android:fillColor="#00000000" | ||||
|       android:strokeColor="#000" | ||||
|       android:strokeLineCap="round"/> | ||||
|   <path | ||||
|       android:pathData="M132,75m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" | ||||
|       android:strokeLineJoin="round" | ||||
|       android:strokeWidth="8" | ||||
|       android:fillColor="#00000000" | ||||
|       android:strokeColor="#000" | ||||
|       android:strokeLineCap="round"/> | ||||
|   <path | ||||
|       android:pathData="M112.5,41.22C100.84,47.96 93,60.56 93,75c0,6.38 1.53,12.39 4.24,17.71m69.51,-35.42A38.84,38.84 0,0 1,171 75c0,14.43 -7.84,27.03 -19.49,33.78m-0.79,-43.32A20.9,20.9 0,0 1,153 75c0,7.77 -4.22,14.56 -10.49,18.19m-21,-36.38C115.22,60.44 111,67.23 111,75a20.9,20.9 0,0 0,2.28 9.53" | ||||
|       android:strokeLineJoin="round" | ||||
|       android:strokeWidth="10" | ||||
|       android:fillColor="#00000000" | ||||
|       android:strokeColor="#000" | ||||
|       android:strokeLineCap="round"/> | ||||
| </vector> | ||||
| @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip | ||||
|   | ||||
| @@ -18,11 +18,12 @@ pluginManagement { | ||||
|  | ||||
| plugins { | ||||
|     id("dev.flutter.flutter-plugin-loader") version "1.0.0" | ||||
|     id("com.android.application") version "8.10.1" apply false | ||||
|     id("com.android.application") version "8.12.0" apply false | ||||
|     // START: FlutterFire Configuration | ||||
|     id("com.google.gms.google-services") version("4.3.15") apply false | ||||
|     id("com.google.firebase.crashlytics") version("2.8.1") apply false | ||||
|     // END: FlutterFire Configuration | ||||
|     id("org.jetbrains.kotlin.android") version "1.8.22" apply false | ||||
|     id("org.jetbrains.kotlin.android") version("2.2.0") apply false | ||||
| } | ||||
|  | ||||
| include(":app") | ||||
|   | ||||
							
								
								
									
										1079
									
								
								assets/i18n/es-ES.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1079
									
								
								assets/i18n/ja-JP.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1079
									
								
								assets/i18n/ko-KR.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1079
									
								
								assets/i18n/zh-OG.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										12
									
								
								assets/icons/icon-outline.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="none"> | ||||
|     <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="12" | ||||
|         d="M54 147h86" /> | ||||
|     <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="10" | ||||
|         d="M57 111s-2-4.5-2-10m22 22s-4 7-11 4m9-22s-2-4.5-2-10" /> | ||||
|     <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="12" | ||||
|         d="M54 147a32 32 0 0 1-11.999-61.665A39 39 0 0 1 81 46m59 101a30 30 0 0 0 29.933-28" /> | ||||
|     <circle cx="132" cy="75" r="4" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" | ||||
|         stroke-width="8" /> | ||||
|     <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="10" | ||||
|         d="M112.5 41.217C100.843 47.961 93 60.564 93 75c0 6.375 1.53 12.393 4.242 17.707m69.513-35.419A38.84 38.84 0 0 1 171 75c0 14.433-7.84 27.034-19.493 33.779m-.793-43.317A20.9 20.9 0 0 1 153 75c0 7.77-4.221 14.556-10.495 18.188m-21.003-36.38C115.224 60.44 111 67.226 111 75a20.9 20.9 0 0 0 2.284 9.533" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 108 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/media-offline.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 461 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/angry.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.0 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/clap.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.0 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/confuse.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 668 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/party.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/pray.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 666 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/stickers/thumb_up.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 623 KiB | 
| @@ -5,3 +5,7 @@ targets: | ||||
|         options: | ||||
|           explicit_to_json: true | ||||
|           field_rename: snake | ||||
|       drift_dev: | ||||
|         options: | ||||
|           databases: | ||||
|             app_database: lib/database/drift_db.dart | ||||
|   | ||||
							
								
								
									
										1
									
								
								drift_schemas/app_database/drift_schema_v6.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -1 +1 @@ | ||||
| {"flutter":{"platforms":{"android":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:android:a8d3f7995b0b8e86f4188b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"solian-0x001","configurations":{"android":"1:961776991058:android:a8d3f7995b0b8e86f4188b","ios":"1:961776991058:ios:727229d368cc47e1f4188b","macos":"1:961776991058:ios:727229d368cc47e1f4188b","web":"1:961776991058:web:b91d12f2892a5609f4188b","windows":"1:961776991058:web:3a912c0eb14028e5f4188b"}}}}}} | ||||
| {"flutter":{"platforms":{"android":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:android:a8d3f7995b0b8e86f4188b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"solian-0x001","configurations":{"android":"1:961776991058:android:a8d3f7995b0b8e86f4188b","ios":"1:961776991058:ios:727229d368cc47e1f4188b","macos":"1:961776991058:ios:727229d368cc47e1f4188b","web":"1:961776991058:web:3a912c0eb14028e5f4188b","windows":"1:961776991058:web:3a912c0eb14028e5f4188b"}}}}}} | ||||
| @@ -21,6 +21,6 @@ | ||||
|   <key>CFBundleVersion</key> | ||||
|   <string>1.0</string> | ||||
|   <key>MinimumOSVersion</key> | ||||
|   <string>12.0</string> | ||||
|   <string>13.0</string> | ||||
| </dict> | ||||
| </plist> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| # Uncomment this line to define a global platform for your project | ||||
| platform :ios, '13.0' | ||||
| platform :ios, '15.0' | ||||
|  | ||||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||
|   | ||||
							
								
								
									
										252
									
								
								ios/Podfile.lock
									
									
									
									
									
								
							
							
						
						| @@ -40,39 +40,93 @@ PODS: | ||||
|   - file_picker (0.0.1): | ||||
|     - DKImagePickerController/PhotoGallery | ||||
|     - Flutter | ||||
|   - Firebase/CoreOnly (11.13.0): | ||||
|     - FirebaseCore (~> 11.13.0) | ||||
|   - Firebase/Messaging (11.13.0): | ||||
|     - Firebase/CoreOnly | ||||
|     - FirebaseMessaging (~> 11.13.0) | ||||
|   - firebase_core (3.14.0): | ||||
|     - Firebase/CoreOnly (= 11.13.0) | ||||
|   - file_saver (0.0.1): | ||||
|     - Flutter | ||||
|   - firebase_messaging (15.2.7): | ||||
|     - Firebase/Messaging (= 11.13.0) | ||||
|   - Firebase/CoreOnly (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|   - Firebase/Crashlytics (12.2.0): | ||||
|     - Firebase/CoreOnly | ||||
|     - FirebaseCrashlytics (~> 12.2.0) | ||||
|   - Firebase/Messaging (12.2.0): | ||||
|     - Firebase/CoreOnly | ||||
|     - FirebaseMessaging (~> 12.2.0) | ||||
|   - firebase_analytics (12.0.2): | ||||
|     - firebase_core | ||||
|     - FirebaseAnalytics (= 12.2.0) | ||||
|     - Flutter | ||||
|   - firebase_core (4.1.1): | ||||
|     - Firebase/CoreOnly (= 12.2.0) | ||||
|     - Flutter | ||||
|   - firebase_crashlytics (5.0.2): | ||||
|     - Firebase/Crashlytics (= 12.2.0) | ||||
|     - firebase_core | ||||
|     - Flutter | ||||
|   - FirebaseCore (11.13.0): | ||||
|     - FirebaseCoreInternal (~> 11.13.0) | ||||
|   - firebase_messaging (16.0.2): | ||||
|     - Firebase/Messaging (= 12.2.0) | ||||
|     - firebase_core | ||||
|     - Flutter | ||||
|   - FirebaseAnalytics (12.2.0): | ||||
|     - FirebaseAnalytics/Default (= 12.2.0) | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - FirebaseInstallations (~> 12.2.0) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/MethodSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - FirebaseAnalytics/Default (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - FirebaseInstallations (~> 12.2.0) | ||||
|     - GoogleAppMeasurement/Default (= 12.2.0) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/MethodSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - FirebaseCore (12.2.0): | ||||
|     - FirebaseCoreInternal (~> 12.2.0) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/Logger (~> 8.1) | ||||
|   - FirebaseCoreInternal (11.13.0): | ||||
|   - FirebaseCoreExtension (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|   - FirebaseCoreInternal (12.2.0): | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|   - FirebaseInstallations (11.13.0): | ||||
|     - FirebaseCore (~> 11.13.0) | ||||
|   - FirebaseCrashlytics (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - FirebaseInstallations (~> 12.2.0) | ||||
|     - FirebaseRemoteConfigInterop (~> 12.2.0) | ||||
|     - FirebaseSessions (~> 12.2.0) | ||||
|     - GoogleDataTransport (~> 10.1) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - nanopb (~> 3.30910.0) | ||||
|     - PromisesObjC (~> 2.4) | ||||
|   - FirebaseInstallations (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/UserDefaults (~> 8.1) | ||||
|     - PromisesObjC (~> 2.4) | ||||
|   - FirebaseMessaging (11.13.0): | ||||
|     - FirebaseCore (~> 11.13.0) | ||||
|     - FirebaseInstallations (~> 11.0) | ||||
|     - GoogleDataTransport (~> 10.0) | ||||
|   - FirebaseMessaging (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - FirebaseInstallations (~> 12.2.0) | ||||
|     - GoogleDataTransport (~> 10.1) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/Reachability (~> 8.1) | ||||
|     - GoogleUtilities/UserDefaults (~> 8.1) | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - FirebaseRemoteConfigInterop (12.2.0) | ||||
|   - FirebaseSessions (12.2.0): | ||||
|     - FirebaseCore (~> 12.2.0) | ||||
|     - FirebaseCoreExtension (~> 12.2.0) | ||||
|     - FirebaseInstallations (~> 12.2.0) | ||||
|     - GoogleDataTransport (~> 10.1) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/UserDefaults (~> 8.1) | ||||
|     - nanopb (~> 3.30910.0) | ||||
|     - PromisesSwift (~> 2.1) | ||||
|   - Flutter (1.0.0) | ||||
|   - flutter_app_update (0.0.1): | ||||
|     - Flutter | ||||
|   - flutter_inappwebview_ios (0.0.1): | ||||
|     - Flutter | ||||
|     - flutter_inappwebview_ios/Core (= 0.0.1) | ||||
| @@ -80,23 +134,53 @@ PODS: | ||||
|   - flutter_inappwebview_ios/Core (0.0.1): | ||||
|     - Flutter | ||||
|     - OrderedSet (~> 6.0.3) | ||||
|   - flutter_keyboard_visibility (0.0.1): | ||||
|     - Flutter | ||||
|   - flutter_local_notifications (0.0.1): | ||||
|     - Flutter | ||||
|   - flutter_native_splash (2.4.3): | ||||
|     - Flutter | ||||
|   - flutter_platform_alert (0.0.1): | ||||
|     - Flutter | ||||
|   - flutter_secure_storage (3.3.1): | ||||
|   - flutter_secure_storage (6.0.0): | ||||
|     - Flutter | ||||
|   - flutter_timezone (0.0.1): | ||||
|     - Flutter | ||||
|   - flutter_udid (0.0.1): | ||||
|     - Flutter | ||||
|     - SAMKeychain | ||||
|   - flutter_webrtc (0.14.0): | ||||
|   - flutter_webrtc (1.2.0): | ||||
|     - Flutter | ||||
|     - WebRTC-SDK (= 125.6422.07) | ||||
|     - WebRTC-SDK (= 137.7151.04) | ||||
|   - gal (1.0.0): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|   - GoogleAdsOnDeviceConversion (2.3.0): | ||||
|     - GoogleUtilities/Logger (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - GoogleAppMeasurement/Core (12.2.0): | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/MethodSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - GoogleAppMeasurement/Default (12.2.0): | ||||
|     - GoogleAdsOnDeviceConversion (= 2.3.0) | ||||
|     - GoogleAppMeasurement/Core (= 12.2.0) | ||||
|     - GoogleAppMeasurement/IdentitySupport (= 12.2.0) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/MethodSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - GoogleAppMeasurement/IdentitySupport (12.2.0): | ||||
|     - GoogleAppMeasurement/Core (= 12.2.0) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/MethodSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Network (~> 8.1) | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|     - nanopb (~> 3.30910.0) | ||||
|   - GoogleDataTransport (10.1.0): | ||||
|     - nanopb (~> 3.30910.0) | ||||
|     - PromisesObjC (~> 2.4) | ||||
| @@ -110,6 +194,9 @@ PODS: | ||||
|   - GoogleUtilities/Logger (8.1.0): | ||||
|     - GoogleUtilities/Environment | ||||
|     - GoogleUtilities/Privacy | ||||
|   - GoogleUtilities/MethodSwizzler (8.1.0): | ||||
|     - GoogleUtilities/Logger | ||||
|     - GoogleUtilities/Privacy | ||||
|   - GoogleUtilities/Network (8.1.0): | ||||
|     - GoogleUtilities/Logger | ||||
|     - "GoogleUtilities/NSData+zlib" | ||||
| @@ -128,11 +215,11 @@ PODS: | ||||
|     - Flutter | ||||
|   - irondash_engine_context (0.0.1): | ||||
|     - Flutter | ||||
|   - Kingfisher (8.3.2) | ||||
|   - livekit_client (2.4.8): | ||||
|   - Kingfisher (8.5.0) | ||||
|   - livekit_client (2.5.0): | ||||
|     - Flutter | ||||
|     - flutter_webrtc | ||||
|     - WebRTC-SDK (= 125.6422.07) | ||||
|     - WebRTC-SDK (= 137.7151.04) | ||||
|   - local_auth_darwin (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
| @@ -155,15 +242,19 @@ PODS: | ||||
|   - path_provider_foundation (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|   - pointer_interceptor_ios (0.0.1): | ||||
|     - Flutter | ||||
|   - PromisesObjC (2.4.0) | ||||
|   - PromisesSwift (2.4.0): | ||||
|     - PromisesObjC (= 2.4.0) | ||||
|   - receive_sharing_intent (1.8.1): | ||||
|     - Flutter | ||||
|   - record_ios (1.0.0): | ||||
|   - record_ios (1.1.0): | ||||
|     - Flutter | ||||
|   - SAMKeychain (1.5.3) | ||||
|   - SDWebImage (5.21.1): | ||||
|     - SDWebImage/Core (= 5.21.1) | ||||
|   - SDWebImage/Core (5.21.1) | ||||
|   - SDWebImage (5.21.2): | ||||
|     - SDWebImage/Core (= 5.21.2) | ||||
|   - SDWebImage/Core (5.21.2) | ||||
|   - share_plus (0.0.1): | ||||
|     - Flutter | ||||
|   - shared_preferences_foundation (0.0.1): | ||||
| @@ -174,28 +265,31 @@ PODS: | ||||
|   - sqflite_darwin (0.0.4): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|   - sqlite3 (3.50.1): | ||||
|     - sqlite3/common (= 3.50.1) | ||||
|   - sqlite3/common (3.50.1) | ||||
|   - sqlite3/dbstatvtab (3.50.1): | ||||
|   - sqlite3 (3.50.4): | ||||
|     - sqlite3/common (= 3.50.4) | ||||
|   - sqlite3/common (3.50.4) | ||||
|   - sqlite3/dbstatvtab (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/fts5 (3.50.1): | ||||
|   - sqlite3/fts5 (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/math (3.50.1): | ||||
|   - sqlite3/math (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/perf-threadsafe (3.50.1): | ||||
|   - sqlite3/perf-threadsafe (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/rtree (3.50.1): | ||||
|   - sqlite3/rtree (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/session (3.50.4): | ||||
|     - sqlite3/common | ||||
|   - sqlite3_flutter_libs (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|     - sqlite3 (~> 3.50.1) | ||||
|     - sqlite3 (~> 3.50.4) | ||||
|     - sqlite3/dbstatvtab | ||||
|     - sqlite3/fts5 | ||||
|     - sqlite3/math | ||||
|     - sqlite3/perf-threadsafe | ||||
|     - sqlite3/rtree | ||||
|     - sqlite3/session | ||||
|   - super_native_extensions (0.0.1): | ||||
|     - Flutter | ||||
|   - SwiftyGif (5.4.5) | ||||
| @@ -205,7 +299,7 @@ PODS: | ||||
|     - Flutter | ||||
|   - wakelock_plus (0.0.1): | ||||
|     - Flutter | ||||
|   - WebRTC-SDK (125.6422.07) | ||||
|   - WebRTC-SDK (137.7151.04) | ||||
|  | ||||
| DEPENDENCIES: | ||||
|   - Alamofire | ||||
| @@ -213,10 +307,16 @@ DEPENDENCIES: | ||||
|   - croppy (from `.symlinks/plugins/croppy/ios`) | ||||
|   - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) | ||||
|   - file_picker (from `.symlinks/plugins/file_picker/ios`) | ||||
|   - file_saver (from `.symlinks/plugins/file_saver/ios`) | ||||
|   - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) | ||||
|   - firebase_core (from `.symlinks/plugins/firebase_core/ios`) | ||||
|   - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) | ||||
|   - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) | ||||
|   - Flutter (from `Flutter`) | ||||
|   - flutter_app_update (from `.symlinks/plugins/flutter_app_update/ios`) | ||||
|   - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) | ||||
|   - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) | ||||
|   - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) | ||||
|   - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) | ||||
|   - flutter_platform_alert (from `.symlinks/plugins/flutter_platform_alert/ios`) | ||||
|   - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) | ||||
| @@ -235,6 +335,7 @@ DEPENDENCIES: | ||||
|   - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) | ||||
|   - pasteboard (from `.symlinks/plugins/pasteboard/ios`) | ||||
|   - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) | ||||
|   - pointer_interceptor_ios (from `.symlinks/plugins/pointer_interceptor_ios/ios`) | ||||
|   - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) | ||||
|   - record_ios (from `.symlinks/plugins/record_ios/ios`) | ||||
|   - share_plus (from `.symlinks/plugins/share_plus/ios`) | ||||
| @@ -253,16 +354,24 @@ SPEC REPOS: | ||||
|     - DKImagePickerController | ||||
|     - DKPhotoGallery | ||||
|     - Firebase | ||||
|     - FirebaseAnalytics | ||||
|     - FirebaseCore | ||||
|     - FirebaseCoreExtension | ||||
|     - FirebaseCoreInternal | ||||
|     - FirebaseCrashlytics | ||||
|     - FirebaseInstallations | ||||
|     - FirebaseMessaging | ||||
|     - FirebaseRemoteConfigInterop | ||||
|     - FirebaseSessions | ||||
|     - GoogleAdsOnDeviceConversion | ||||
|     - GoogleAppMeasurement | ||||
|     - GoogleDataTransport | ||||
|     - GoogleUtilities | ||||
|     - Kingfisher | ||||
|     - nanopb | ||||
|     - OrderedSet | ||||
|     - PromisesObjC | ||||
|     - PromisesSwift | ||||
|     - SAMKeychain | ||||
|     - SDWebImage | ||||
|     - sqlite3 | ||||
| @@ -278,14 +387,26 @@ EXTERNAL SOURCES: | ||||
|     :path: ".symlinks/plugins/device_info_plus/ios" | ||||
|   file_picker: | ||||
|     :path: ".symlinks/plugins/file_picker/ios" | ||||
|   file_saver: | ||||
|     :path: ".symlinks/plugins/file_saver/ios" | ||||
|   firebase_analytics: | ||||
|     :path: ".symlinks/plugins/firebase_analytics/ios" | ||||
|   firebase_core: | ||||
|     :path: ".symlinks/plugins/firebase_core/ios" | ||||
|   firebase_crashlytics: | ||||
|     :path: ".symlinks/plugins/firebase_crashlytics/ios" | ||||
|   firebase_messaging: | ||||
|     :path: ".symlinks/plugins/firebase_messaging/ios" | ||||
|   Flutter: | ||||
|     :path: Flutter | ||||
|   flutter_app_update: | ||||
|     :path: ".symlinks/plugins/flutter_app_update/ios" | ||||
|   flutter_inappwebview_ios: | ||||
|     :path: ".symlinks/plugins/flutter_inappwebview_ios/ios" | ||||
|   flutter_keyboard_visibility: | ||||
|     :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" | ||||
|   flutter_local_notifications: | ||||
|     :path: ".symlinks/plugins/flutter_local_notifications/ios" | ||||
|   flutter_native_splash: | ||||
|     :path: ".symlinks/plugins/flutter_native_splash/ios" | ||||
|   flutter_platform_alert: | ||||
| @@ -320,6 +441,8 @@ EXTERNAL SOURCES: | ||||
|     :path: ".symlinks/plugins/pasteboard/ios" | ||||
|   path_provider_foundation: | ||||
|     :path: ".symlinks/plugins/path_provider_foundation/darwin" | ||||
|   pointer_interceptor_ios: | ||||
|     :path: ".symlinks/plugins/pointer_interceptor_ios/ios" | ||||
|   receive_sharing_intent: | ||||
|     :path: ".symlinks/plugins/receive_sharing_intent/ios" | ||||
|   record_ios: | ||||
| @@ -351,29 +474,42 @@ SPEC CHECKSUMS: | ||||
|   DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c | ||||
|   DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 | ||||
|   file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be | ||||
|   Firebase: 3435bc66b4d494c2f22c79fd3aae4c1db6662327 | ||||
|   firebase_core: 700bac7ed92bb754fd70fbf01d72b36ecdd6d450 | ||||
|   firebase_messaging: 860c017fcfbb5e27c163062d1d3135388f3ef954 | ||||
|   FirebaseCore: c692c7f1c75305ab6aff2b367f25e11d73aa8bd0 | ||||
|   FirebaseCoreInternal: 29d7b3af4aaf0b8f3ed20b568c13df399b06f68c | ||||
|   FirebaseInstallations: 0ee9074f2c1e86561ace168ee1470dc67aabaf02 | ||||
|   FirebaseMessaging: 195bbdb73e6ca1dbc76cd46e73f3552c084ef6e4 | ||||
|   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 | ||||
|   file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6 | ||||
|   Firebase: 26f6f8d460603af3df970ad505b16b15f5e2e9a1 | ||||
|   firebase_analytics: 8c78ce6224e0623152379d6cc7ef3d9098477b7e | ||||
|   firebase_core: dfc4bd142bee4bc53a5d482397ca322c2dd3165d | ||||
|   firebase_crashlytics: e55dcf895eed0dd87c447dd5aff8db7f1bb8bbdb | ||||
|   firebase_messaging: 38c66c1184695b0c87abe51d40fc590718abed1a | ||||
|   FirebaseAnalytics: e04e23bc070e3014aa5cf4980f9df7ce5cd79ec8 | ||||
|   FirebaseCore: 311c48a147ad4a0ab7febbaed89e8025c67510cd | ||||
|   FirebaseCoreExtension: 73af080c22a2f7b44cefa391dc08f7e4ee162cb5 | ||||
|   FirebaseCoreInternal: 56ea29f3dad2894f81b060f706f9d53509b6ed3b | ||||
|   FirebaseCrashlytics: f83cbf176d5c637ade108c0aacf1ccbd5ec499bf | ||||
|   FirebaseInstallations: 3e884b01feabdf67582a80f3250425a00979b4ed | ||||
|   FirebaseMessaging: 43ec73bbfedd0c385a849bb91593ab4ad4b9e48e | ||||
|   FirebaseRemoteConfigInterop: 0896fd52ab72586a355c8f389ff85aaa9e5375e1 | ||||
|   FirebaseSessions: f4692789e770bec66ce17d772c0e9561c4f11737 | ||||
|   Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 | ||||
|   flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9 | ||||
|   flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 | ||||
|   flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 | ||||
|   flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb | ||||
|   flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf | ||||
|   flutter_platform_alert: bf3b5fcd4ac14bd637e20527e9c471633071afd3 | ||||
|   flutter_secure_storage: 50035aef357c5a8bdd67fd6bc81370d46efc4d16 | ||||
|   flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 | ||||
|   flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544 | ||||
|   flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9 | ||||
|   flutter_webrtc: fd0d3bdef8766a0736dbbe2e5b7e85f1f3c52117 | ||||
|   flutter_webrtc: c3e21fc0dcd9d8eb246ae4d5256fcbeb2f5ecd22 | ||||
|   gal: baecd024ebfd13c441269ca7404792a7152fde89 | ||||
|   GoogleAdsOnDeviceConversion: 9090c435cde08903e8dd1ba2c77fbec9e46d9afe | ||||
|   GoogleAppMeasurement: 09f341dfa8527d1612a09cbfe809a242c0b737af | ||||
|   GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 | ||||
|   GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 | ||||
|   image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a | ||||
|   irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486 | ||||
|   Kingfisher: 0621d0ac0c78fecb19f6dc5303bde2b52abaf2f5 | ||||
|   livekit_client: 9e901890552514206e5ff828903ed271531da264 | ||||
|   local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 | ||||
|   Kingfisher: ff0d31a1f07bdff6a1ebb3ba08b8e6e567b6500c | ||||
|   livekit_client: a6f5fa86ac28ccd7ded53626a5379961db311ab4 | ||||
|   local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb | ||||
|   media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854 | ||||
|   media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474 | ||||
|   nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 | ||||
| @@ -382,24 +518,26 @@ SPEC CHECKSUMS: | ||||
|   package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 | ||||
|   pasteboard: 49088aeb6119d51f976a421db60d8e1ab079b63c | ||||
|   path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 | ||||
|   pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed | ||||
|   PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 | ||||
|   PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 | ||||
|   receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00 | ||||
|   record_ios: fee1c924aa4879b882ebca2b4bce6011bcfc3d8b | ||||
|   record_ios: f75fa1d57f840012775c0e93a38a7f3ceea1a374 | ||||
|   SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c | ||||
|   SDWebImage: f29024626962457f3470184232766516dee8dfea | ||||
|   SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a | ||||
|   share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a | ||||
|   shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 | ||||
|   sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 | ||||
|   sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 | ||||
|   sqlite3: 1d85290c3321153511f6e900ede7a1608718bbd5 | ||||
|   sqlite3_flutter_libs: e7fc8c9ea2200ff3271f08f127842131746b70e2 | ||||
|   sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b | ||||
|   sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 | ||||
|   super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4 | ||||
|   SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 | ||||
|   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d | ||||
|   volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 | ||||
|   wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 | ||||
|   WebRTC-SDK: dff00a3892bc570b6014e046297782084071657e | ||||
|   WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e | ||||
|  | ||||
| PODFILE CHECKSUM: f6df17c2a0cbd7af89692fd3877231eaea40230f | ||||
| PODFILE CHECKSUM: c818292390b02fa379036ea099713a332bd7193f | ||||
|  | ||||
| COCOAPODS: 1.16.2 | ||||
|   | ||||
| @@ -10,6 +10,8 @@ | ||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||
| 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; | ||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | ||||
| 		73ACDFAD2E3D0E6100B63535 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */; }; | ||||
| 		73ACDFC32E3D0E6100B63535 /* SolianBroadcastExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73CDD6812DEC00480059D95D /* SolianNotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73D4264B2DEB815D006C0AAE /* NotifyDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */; }; | ||||
| @@ -32,6 +34,13 @@ | ||||
| 			remoteGlobalIDString = 97C146ED1CF9000F007C117D; | ||||
| 			remoteInfo = Runner; | ||||
| 		}; | ||||
| 		73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||
| 			proxyType = 1; | ||||
| 			remoteGlobalIDString = 73ACDFAA2E3D0E6100B63535; | ||||
| 			remoteInfo = SolianBroadcastExtension; | ||||
| 		}; | ||||
| 		73C305D62E0BE878009035B9 /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||
| @@ -55,6 +64,7 @@ | ||||
| 			dstPath = ""; | ||||
| 			dstSubfolderSpec = 13; | ||||
| 			files = ( | ||||
| 				73ACDFC32E3D0E6100B63535 /* SolianBroadcastExtension.appex in Embed Foundation Extensions */, | ||||
| 				73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */, | ||||
| 				73CDD6812DEC00480059D95D /* SolianNotificationService.appex in Embed Foundation Extensions */, | ||||
| 			); | ||||
| @@ -91,6 +101,9 @@ | ||||
| 		3A1C47BD29CC6AC2587D4DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		737E920B2DB6A9FF00BE9CDB /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; }; | ||||
| 		73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianBroadcastExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; }; | ||||
| 		73ACDFB82E3D0E6100B63535 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | ||||
| 		73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyDelegate.swift; sourceTree = "<group>"; }; | ||||
| @@ -117,6 +130,13 @@ | ||||
| /* End PBXFileReference section */ | ||||
|  | ||||
| /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ | ||||
| 		73ACDFCA2E3D0E6100B63535 /* Exceptions for "SolianBroadcastExtension" folder in "SolianBroadcastExtension" target */ = { | ||||
| 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | ||||
| 			membershipExceptions = ( | ||||
| 				Info.plist, | ||||
| 			); | ||||
| 			target = 73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */; | ||||
| 		}; | ||||
| 		73C305DC2E0BE878009035B9 /* Exceptions for "SolianShareExtension" folder in "SolianShareExtension" target */ = { | ||||
| 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | ||||
| 			membershipExceptions = ( | ||||
| @@ -150,6 +170,14 @@ | ||||
| 			path = Services; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */ = { | ||||
| 			isa = PBXFileSystemSynchronizedRootGroup; | ||||
| 			exceptions = ( | ||||
| 				73ACDFCA2E3D0E6100B63535 /* Exceptions for "SolianBroadcastExtension" folder in "SolianBroadcastExtension" target */, | ||||
| 			); | ||||
| 			path = SolianBroadcastExtension; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		73C305CF2E0BE878009035B9 /* SolianShareExtension */ = { | ||||
| 			isa = PBXFileSystemSynchronizedRootGroup; | ||||
| 			exceptions = ( | ||||
| @@ -177,6 +205,14 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA82E3D0E6100B63535 /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				73ACDFAD2E3D0E6100B63535 /* ReplayKit.framework in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CB2E0BE878009035B9 /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -220,6 +256,8 @@ | ||||
| 				AA0CA8A3E15DEE023BB27438 /* Pods_NotificationService.framework */, | ||||
| 				39FE4CC6223F0D3C0E1FFD04 /* Pods_SolianNotificationService.framework */, | ||||
| 				7B40764A2C4CC0E7DC70A0D3 /* Pods_SolianShareExtension.framework */, | ||||
| 				73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */, | ||||
| 				73ACDFB82E3D0E6100B63535 /* UIKit.framework */, | ||||
| 			); | ||||
| 			name = Frameworks; | ||||
| 			sourceTree = "<group>"; | ||||
| @@ -264,6 +302,7 @@ | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				73CDD67B2DEC00480059D95D /* SolianNotificationService */, | ||||
| 				73C305CF2E0BE878009035B9 /* SolianShareExtension */, | ||||
| 				73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 				331C8082294A63A400263BE5 /* RunnerTests */, | ||||
| 				91E124CE95BCB4DCD890160D /* Pods */, | ||||
| @@ -279,6 +318,7 @@ | ||||
| 				331C8081294A63A400263BE5 /* RunnerTests.xctest */, | ||||
| 				73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */, | ||||
| 				73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */, | ||||
| 				73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| @@ -323,6 +363,26 @@ | ||||
| 			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; | ||||
| 			productType = "com.apple.product-type.bundle.unit-test"; | ||||
| 		}; | ||||
| 		73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 73ACDFCB2E3D0E6100B63535 /* Build configuration list for PBXNativeTarget "SolianBroadcastExtension" */; | ||||
| 			buildPhases = ( | ||||
| 				73ACDFA72E3D0E6100B63535 /* Sources */, | ||||
| 				73ACDFA82E3D0E6100B63535 /* Frameworks */, | ||||
| 				73ACDFA92E3D0E6100B63535 /* Resources */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			fileSystemSynchronizedGroups = ( | ||||
| 				73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 			); | ||||
| 			name = SolianBroadcastExtension; | ||||
| 			productName = SolianBroadcastExtension; | ||||
| 			productReference = 73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */; | ||||
| 			productType = "com.apple.product-type.app-extension"; | ||||
| 		}; | ||||
| 		73C305CD2E0BE878009035B9 /* SolianShareExtension */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */; | ||||
| @@ -379,12 +439,14 @@ | ||||
| 				3B06AD1E1E4923F5004D2608 /* Thin Binary */, | ||||
| 				8C0351B03869BBF493808288 /* [CP] Embed Pods Frameworks */, | ||||
| 				5E7D6EF29B671AC7EDBA5649 /* [CP] Copy Pods Resources */, | ||||
| 				E86CDE9D6464F4F52B910856 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 				73CDD6802DEC00480059D95D /* PBXTargetDependency */, | ||||
| 				73C305D72E0BE878009035B9 /* PBXTargetDependency */, | ||||
| 				73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */, | ||||
| 			); | ||||
| 			fileSystemSynchronizedGroups = ( | ||||
| 				73268D272DEB012A0076E970 /* Services */, | ||||
| @@ -409,6 +471,9 @@ | ||||
| 						CreatedOnToolsVersion = 14.0; | ||||
| 						TestTargetID = 97C146ED1CF9000F007C117D; | ||||
| 					}; | ||||
| 					73ACDFAA2E3D0E6100B63535 = { | ||||
| 						CreatedOnToolsVersion = 16.4; | ||||
| 					}; | ||||
| 					73C305CD2E0BE878009035B9 = { | ||||
| 						CreatedOnToolsVersion = 16.4; | ||||
| 					}; | ||||
| @@ -438,6 +503,7 @@ | ||||
| 				331C8080294A63A400263BE5 /* RunnerTests */, | ||||
| 				73CDD6792DEC00480059D95D /* SolianNotificationService */, | ||||
| 				73C305CD2E0BE878009035B9 /* SolianShareExtension */, | ||||
| 				73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| @@ -450,6 +516,13 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA92E3D0E6100B63535 /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CC2E0BE878009035B9 /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -493,7 +566,7 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; | ||||
| 		}; | ||||
| 		4815E0A19398E51078F4160D /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| @@ -610,6 +683,24 @@ | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | ||||
| 		}; | ||||
| 		E86CDE9D6464F4F52B910856 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\""; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:${PUB_CACHE}/bin:$HOME/.pub-cache/bin\"\n\nif [ -z \"$PODS_ROOT\" ] || [ ! -d \"$PODS_ROOT/FirebaseCrashlytics\" ]; then\n  # Cannot use \"BUILD_DIR%/Build/*\" as per Firebase documentation, it points to \"flutter-project/build/ios/*\" path which doesn't have run script\n  DERIVED_DATA_PATH=$(echo \"$BUILD_ROOT\" | sed -E 's|(.*DerivedData/[^/]+).*|\\1|')\n  PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"${DERIVED_DATA_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nelse\n  PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"$PODS_ROOT/FirebaseCrashlytics/run\"\nfi\n\n# Command to upload symbols script used to upload symbols to Firebase server\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; | ||||
| 		}; | ||||
| 		E947029FCA058878F9B63890 /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -643,6 +734,13 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA72E3D0E6100B63535 /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CA2E0BE878009035B9 /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -675,6 +773,11 @@ | ||||
| 			target = 97C146ED1CF9000F007C117D /* Runner */; | ||||
| 			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| 		73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */; | ||||
| 			targetProxy = 73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| 		73C305D72E0BE878009035B9 /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 73C305CD2E0BE878009035B9 /* SolianShareExtension */; | ||||
| @@ -750,7 +853,7 @@ | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| @@ -772,13 +875,15 @@ | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = "$(SWIFT_USE_INTEGRATED_DRIVER)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| @@ -793,6 +898,7 @@ | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| @@ -811,6 +917,7 @@ | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| @@ -827,6 +934,7 @@ | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| @@ -835,6 +943,123 @@ | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		73ACDFC42E3D0E6100B63535 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		73ACDFC52E3D0E6100B63535 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		73ACDFC62E3D0E6100B63535 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		73C305D92E0BE878009035B9 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 17FAB080A9C53193ABD9C15B /* Pods-SolianShareExtension.debug.xcconfig */; | ||||
| @@ -857,7 +1082,7 @@ | ||||
| 				INFOPLIST_FILE = SolianShareExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -872,6 +1097,7 @@ | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = NO; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| @@ -900,7 +1126,7 @@ | ||||
| 				INFOPLIST_FILE = SolianShareExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -913,6 +1139,7 @@ | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = NO; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| @@ -940,7 +1167,7 @@ | ||||
| 				INFOPLIST_FILE = SolianShareExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -953,6 +1180,7 @@ | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = NO; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| @@ -979,7 +1207,7 @@ | ||||
| 				INFOPLIST_FILE = SolianNotificationService/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianNotificationService; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -1021,7 +1249,7 @@ | ||||
| 				INFOPLIST_FILE = SolianNotificationService/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianNotificationService; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -1060,7 +1288,7 @@ | ||||
| 				INFOPLIST_FILE = SolianNotificationService/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianNotificationService; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 18.5; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -1127,7 +1355,7 @@ | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				SDKROOT = iphoneos; | ||||
| @@ -1178,7 +1406,7 @@ | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| @@ -1202,13 +1430,15 @@ | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = "$(SWIFT_USE_INTEGRATED_DRIVER)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| @@ -1229,13 +1459,15 @@ | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_ENABLE_EXPLICIT_MODULES = "$(SWIFT_USE_INTEGRATED_DRIVER)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| @@ -1255,6 +1487,16 @@ | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		73ACDFCB2E3D0E6100B63535 /* Build configuration list for PBXNativeTarget "SolianBroadcastExtension" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				73ACDFC42E3D0E6100B63535 /* Debug */, | ||||
| 				73ACDFC52E3D0E6100B63535 /* Release */, | ||||
| 				73ACDFC62E3D0E6100B63535 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
|   | ||||
| @@ -11,7 +11,23 @@ import UIKit | ||||
|     ) -> Bool { | ||||
|         UNUserNotificationCenter.current().delegate = notifyDelegate | ||||
|          | ||||
|         let replyableMessageCategory = UNNotificationCategory( | ||||
|             identifier: "REPLYABLE_MESSAGE", | ||||
|             actions: [ | ||||
|                 UNTextInputNotificationAction( | ||||
|                     identifier: "reply_action", | ||||
|                     title: "Reply", | ||||
|                     options: [] | ||||
|                 ), | ||||
|             ], | ||||
|             intentIdentifiers: [], | ||||
|             options: [] | ||||
|         ) | ||||
|          | ||||
|         UNUserNotificationCenter.current().setNotificationCategories([replyableMessageCategory]) | ||||
|          | ||||
|         GeneratedPluginRegistrant.register(with: self) | ||||
|          | ||||
|         return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| <?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"> | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> | ||||
|     <device id="retina6_12" orientation="portrait" appearance="light"/> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/> | ||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--Flutter View Controller--> | ||||
| @@ -14,13 +16,14 @@ | ||||
|                         <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"/> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||||
|                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|             <point key="canvasLocation" x="-26" y="-76"/> | ||||
|         </scene> | ||||
|     </scenes> | ||||
| </document> | ||||
|   | ||||
| @@ -2,6 +2,12 @@ | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CLIENT_ID</key> | ||||
| 	<string>961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com</string> | ||||
| 	<key>REVERSED_CLIENT_ID</key> | ||||
| 	<string>com.googleusercontent.apps.961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig</string> | ||||
| 	<key>ANDROID_CLIENT_ID</key> | ||||
| 	<string>961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com</string> | ||||
| 	<key>API_KEY</key> | ||||
| 	<string>AIzaSyCzQIyiYKoYHTpGXhN-IjgMML8z797WVD8</string> | ||||
| 	<key>GCM_SENDER_ID</key> | ||||
|   | ||||
| @@ -2,16 +2,10 @@ | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CLIENT_ID</key> | ||||
| 	<string>961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com</string> | ||||
| 	<key>REVERSED_CLIENT_ID</key> | ||||
| 	<string>com.googleusercontent.apps.961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig</string> | ||||
| 	<key>PLIST_VERSION</key> | ||||
| 	<string>1</string> | ||||
| 	<key>AppGroupId</key> | ||||
| 	<string>$(CUSTOM_GROUP_ID)</string> | ||||
| 	<key>BUNDLE_ID</key> | ||||
| 	<string>dev.solsynth.solian</string> | ||||
| 	<key>ITSAppUsesNonExemptEncryption</key> | ||||
| 	<false/> | ||||
| 	<key>CADisableMinimumFrameDurationOnPhone</key> | ||||
| 	<true/> | ||||
| 	<key>CFBundleDevelopmentRegion</key> | ||||
| @@ -32,31 +26,46 @@ | ||||
| 	<string>$(FLUTTER_BUILD_NAME)</string> | ||||
| 	<key>CFBundleSignature</key> | ||||
| 	<string>????</string> | ||||
| 	<key>CFBundleURLTypes</key> | ||||
| 	<array> | ||||
| 		<dict> | ||||
| 			<key>CFBundleTypeRole</key> | ||||
| 			<string>Editor</string> | ||||
| 			<key>CFBundleURLSchemes</key> | ||||
| 			<array> | ||||
| 				<string>ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||||
| 			</array> | ||||
| 		</dict> | ||||
| 	</array> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
|     <key>CFBundleURLTypes</key> | ||||
|     <array> | ||||
|         <dict> | ||||
|             <key>CFBundleTypeRole</key> | ||||
|             <string>Editor</string> | ||||
|             <key>CFBundleURLSchemes</key> | ||||
|             <array> | ||||
|                 <string>ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||||
|             </array> | ||||
|         </dict> | ||||
|     </array> | ||||
| 	<key>CLIENT_ID</key> | ||||
| 	<string>961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com</string> | ||||
| 	<key>ITSAppUsesNonExemptEncryption</key> | ||||
| 	<false/> | ||||
| 	<key>LSRequiresIPhoneOS</key> | ||||
| 	<true/> | ||||
| 	<key>NSCalendarsUsageDescription</key> | ||||
| 	<string>Grant access to Calander help us to shows Solar Calander with your own events.</string> | ||||
| 	<key>NSCameraUsageDescription</key> | ||||
| 	<string>Grant access to Camera will allow Solian take photo or video for your post.</string> | ||||
| 	<key>NSFaceIDUsageDescription</key> | ||||
| 	<string>Allow the Solar Network verify your ownership of the logged in account and continue your action quickly.</string> | ||||
| 	<key>NSMicrophoneUsageDescription</key> | ||||
| 	<string>Grant access to Microphone will allow Solian record audio for your post.</string> | ||||
| 	<key>NSPhotoLibraryAddUsageDescription</key> | ||||
| 	<string>Grant access to Photo Library will allow Solian download photo to album for you.</string> | ||||
| 	<key>NSPhotoLibraryUsageDescription</key> | ||||
| 	<string>Grant access to Photo Library will allow Solian upload photo or video for your post.</string> | ||||
| 	<key>NSUserActivityTypes</key> | ||||
| 	<array> | ||||
| 		<string>INStartCallIntent</string> | ||||
| 		<string>INSendMessageIntent</string> | ||||
| 	</array> | ||||
| 	<key>PLIST_VERSION</key> | ||||
| 	<string>1</string> | ||||
| 	<key>REVERSED_CLIENT_ID</key> | ||||
| 	<string>com.googleusercontent.apps.961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig</string> | ||||
| 	<key>UIApplicationSupportsIndirectInputEvents</key> | ||||
| 	<true/> | ||||
| 	<key>UIBackgroundModes</key> | ||||
| @@ -74,25 +83,16 @@ | ||||
| 	<false/> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>NSFaceIDUsageDescription</key> | ||||
| 	<string>Allow the Solar Network verify your ownership of the logged in account and continue your action quickly.</string> | ||||
| 	<key>AppGroupId</key> | ||||
| 	<string>$(CUSTOM_GROUP_ID)</string> | ||||
| 	<key>NSUserActivityTypes</key> | ||||
| 	<array> | ||||
| 		<string>INStartCallIntent</string> | ||||
| 		<string>INSendMessageIntent</string> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 	</array> | ||||
| </dict> | ||||
| </plist> | ||||
|   | ||||
| @@ -10,40 +10,51 @@ import Alamofire | ||||
|  | ||||
| class NotifyDelegate: UIResponder, UNUserNotificationCenterDelegate { | ||||
|     func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { | ||||
|         if let textResponse = response as? UNTextInputNotificationResponse { | ||||
|             let content = response.notification.request.content | ||||
|             guard let metadata = content.userInfo["meta"] as? [AnyHashable: Any] else { | ||||
|                 return | ||||
|             } | ||||
|              | ||||
|             var token: String? = UserDefaults.standard.getFlutterToken() | ||||
|             if token == nil { | ||||
|                 return | ||||
|             } | ||||
|              | ||||
|             let serverUrl = UserDefaults.standard.getServerUrl() | ||||
|             let url = "\(serverUrl)/chat/\(metadata["room_id"] ?? "")/messages" | ||||
|              | ||||
|             let parameters: [String: Any?] = [ | ||||
|                 "content": textResponse.userText, | ||||
|                 "replied_message_id": metadata["message_id"] | ||||
|             ] | ||||
|              | ||||
|             AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: HTTPHeaders( | ||||
|                 [HTTPHeader(name: "Authorization", value: "AtField \(token!)")] | ||||
|             )) | ||||
|                 .validate() | ||||
|                 .responseString { response in | ||||
|                     switch response.result { | ||||
|                     case .success(_): | ||||
|                         break | ||||
|                     case .failure(let error): | ||||
|                         print("Failed to send chat reply message: \(error)") | ||||
|                         break | ||||
|                     } | ||||
|                 } | ||||
|         guard let textResponse = response as? UNTextInputNotificationResponse else { | ||||
|             completionHandler() | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         let content = response.notification.request.content | ||||
|          | ||||
|         // Only handle replies for new messages | ||||
|         guard let notificationType = content.userInfo["type"] as? String, notificationType == "messages.new" else { | ||||
|             completionHandler() | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         guard let metadata = content.userInfo["meta"] as? [AnyHashable: Any] else { | ||||
|             completionHandler() | ||||
|             return | ||||
|         } | ||||
|          | ||||
|         completionHandler() | ||||
|         guard let token = UserDefaults.standard.getFlutterToken() else { | ||||
|             completionHandler() | ||||
|             return | ||||
|         } | ||||
|          | ||||
|         let serverUrl = UserDefaults.standard.getServerUrl() | ||||
|         let url = "\(serverUrl)/sphere/chat/\(metadata["room_id"] ?? "")/messages" | ||||
|          | ||||
|         let parameters: [String: Any?] = [ | ||||
|             "content": textResponse.userText, | ||||
|             "replied_message_id": metadata["message_id"] | ||||
|         ] | ||||
|          | ||||
|         AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: HTTPHeaders( | ||||
|             [HTTPHeader(name: "Authorization", value: "AtField \(token)")] | ||||
|         )) | ||||
|             .validate() | ||||
|             .responseString { response in | ||||
|                 switch response.result { | ||||
|                 case .success(_): | ||||
|                     break | ||||
|                 case .failure(let error): | ||||
|                     print("Failed to send chat reply message: \(error)") | ||||
|                     break | ||||
|                 } | ||||
|                 // Call completion handler after network request is finished | ||||
|                 completionHandler() | ||||
|             } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
| import Foundation | ||||
|  | ||||
| func getAttachmentUrl(for identifier: String) -> String { | ||||
|     let serverBaseUrl = "https://nt.solian.app" | ||||
|     let serverBaseUrl = "https://api.solian.app" | ||||
|      | ||||
|     return identifier.starts(with: "http") ? identifier : "\(serverBaseUrl)/files/\(identifier)" | ||||
|     return identifier.starts(with: "http") ? identifier : "\(serverBaseUrl)/drive/files/\(identifier)" | ||||
| } | ||||
|   | ||||
							
								
								
									
										37
									
								
								ios/SolianBroadcastExtension/Atomic.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | ||||
| // | ||||
| //  Atomic.swift | ||||
| //  Broadcast Extension | ||||
| // | ||||
| //  Created by Maksym Shcheglov. | ||||
| //  https://www.onswiftwings.com/posts/atomic-property-wrapper/ | ||||
| // | ||||
|  | ||||
| import Foundation | ||||
|  | ||||
| @propertyWrapper | ||||
| struct Atomic<Value> { | ||||
|  | ||||
|     private var value: Value | ||||
|     private let lock = NSLock() | ||||
|  | ||||
|     init(wrappedValue value: Value) { | ||||
|         self.value = value | ||||
|     } | ||||
|  | ||||
|     var wrappedValue: Value { | ||||
|         get { load() } | ||||
|         set { store(newValue: newValue) } | ||||
|     } | ||||
|  | ||||
|     func load() -> Value { | ||||
|         lock.lock() | ||||
|         defer { lock.unlock() } | ||||
|         return value | ||||
|     } | ||||
|  | ||||
|     mutating func store(newValue: Value) { | ||||
|         lock.lock() | ||||
|         defer { lock.unlock() } | ||||
|         value = newValue | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								ios/SolianBroadcastExtension/DarwinNotification.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| // | ||||
| //  DarwinNotificationCenter.swift | ||||
| //  Broadcast Extension | ||||
| // | ||||
| //  Created by Alex-Dan Bumbu on 23/03/2021. | ||||
| //  Copyright © 2021 8x8, Inc. All rights reserved. | ||||
| // | ||||
|  | ||||
| import Foundation | ||||
|  | ||||
| enum DarwinNotification: String { | ||||
|     case broadcastStarted = "iOS_BroadcastStarted" | ||||
|     case broadcastStopped = "iOS_BroadcastStopped" | ||||
| } | ||||
|  | ||||
| class DarwinNotificationCenter { | ||||
|      | ||||
|     static let shared = DarwinNotificationCenter() | ||||
|      | ||||
|     private let notificationCenter: CFNotificationCenter | ||||
|      | ||||
|     init() { | ||||
|         notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() | ||||
|     } | ||||
|      | ||||
|     func postNotification(_ name: DarwinNotification) { | ||||
|         CFNotificationCenterPostNotification(notificationCenter, CFNotificationName(rawValue: name.rawValue as CFString), nil, nil, true) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										15
									
								
								ios/SolianBroadcastExtension/Info.plist
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| <?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>NSExtension</key> | ||||
| 	<dict> | ||||
| 		<key>NSExtensionPointIdentifier</key> | ||||
| 		<string>com.apple.broadcast-services-upload</string> | ||||
| 		<key>NSExtensionPrincipalClass</key> | ||||
| 		<string>$(PRODUCT_MODULE_NAME).SampleHandler</string> | ||||
| 		<key>RPBroadcastProcessMode</key> | ||||
| 		<string>RPBroadcastProcessModeSampleBuffer</string> | ||||
| 	</dict> | ||||
| </dict> | ||||
| </plist> | ||||
							
								
								
									
										103
									
								
								ios/SolianBroadcastExtension/SampleHandler.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,103 @@ | ||||
| // | ||||
| //  SampleHandler.swift | ||||
| //  Broadcast Extension | ||||
| // | ||||
| //  Created by Alex-Dan Bumbu on 04.06.2021. | ||||
| // | ||||
|  | ||||
| import ReplayKit | ||||
| import OSLog | ||||
|  | ||||
| let broadcastLogger = OSLog(subsystem: "dev.solsynth.solian", category: "Broadcast") | ||||
| private enum Constants { | ||||
|     // the App Group ID value that the app and the broadcast extension targets are setup with. It differs for each app. | ||||
|     static let appGroupIdentifier = "group.solsynth.solian" | ||||
| } | ||||
|  | ||||
| class SampleHandler: RPBroadcastSampleHandler { | ||||
|  | ||||
|     private var clientConnection: SocketConnection? | ||||
|     private var uploader: SampleUploader? | ||||
|  | ||||
|     private var frameCount: Int = 0 | ||||
|  | ||||
|     var socketFilePath: String { | ||||
|       let sharedContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Constants.appGroupIdentifier) | ||||
|         return sharedContainer?.appendingPathComponent("rtc_SSFD").path ?? "" | ||||
|     } | ||||
|  | ||||
|     override init() { | ||||
|       super.init() | ||||
|         if let connection = SocketConnection(filePath: socketFilePath) { | ||||
|           clientConnection = connection | ||||
|           setupConnection() | ||||
|  | ||||
|           uploader = SampleUploader(connection: connection) | ||||
|         } | ||||
|         os_log(.debug, log: broadcastLogger, "%{public}s", socketFilePath) | ||||
|     } | ||||
|  | ||||
|     override func broadcastStarted(withSetupInfo setupInfo: [String: NSObject]?) { | ||||
|         // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional. | ||||
|         frameCount = 0 | ||||
|  | ||||
|         DarwinNotificationCenter.shared.postNotification(.broadcastStarted) | ||||
|         openConnection() | ||||
|     } | ||||
|  | ||||
|     override func broadcastPaused() { | ||||
|         // User has requested to pause the broadcast. Samples will stop being delivered. | ||||
|     } | ||||
|  | ||||
|     override func broadcastResumed() { | ||||
|         // User has requested to resume the broadcast. Samples delivery will resume. | ||||
|     } | ||||
|  | ||||
|     override func broadcastFinished() { | ||||
|         // User has requested to finish the broadcast. | ||||
|         DarwinNotificationCenter.shared.postNotification(.broadcastStopped) | ||||
|         clientConnection?.close() | ||||
|     } | ||||
|  | ||||
|     override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { | ||||
|         switch sampleBufferType { | ||||
|         case RPSampleBufferType.video: | ||||
|             uploader?.send(sample: sampleBuffer) | ||||
|         default: | ||||
|             break | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| private extension SampleHandler { | ||||
|  | ||||
|     func setupConnection() { | ||||
|         clientConnection?.didClose = { [weak self] error in | ||||
|             os_log(.debug, log: broadcastLogger, "client connection did close \(String(describing: error))") | ||||
|  | ||||
|             if let error = error { | ||||
|                 self?.finishBroadcastWithError(error) | ||||
|             } else { | ||||
|                 // the displayed failure message is more user friendly when using NSError instead of Error | ||||
|                 let JMScreenSharingStopped = 10001 | ||||
|                 let customError = NSError(domain: RPRecordingErrorDomain, code: JMScreenSharingStopped, userInfo: [NSLocalizedDescriptionKey: "Screen sharing stopped"]) | ||||
|                 self?.finishBroadcastWithError(customError) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     func openConnection() { | ||||
|         let queue = DispatchQueue(label: "broadcast.connectTimer") | ||||
|         let timer = DispatchSource.makeTimerSource(queue: queue) | ||||
|         timer.schedule(deadline: .now(), repeating: .milliseconds(100), leeway: .milliseconds(500)) | ||||
|         timer.setEventHandler { [weak self] in | ||||
|             guard self?.clientConnection?.open() == true else { | ||||
|                 return | ||||
|             } | ||||
|  | ||||
|             timer.cancel() | ||||
|         } | ||||
|  | ||||
|         timer.resume() | ||||
|     } | ||||
| } | ||||
							
								
								
									
										147
									
								
								ios/SolianBroadcastExtension/SampleUploader.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,147 @@ | ||||
| // | ||||
| //  SampleUploader.swift | ||||
| //  Broadcast Extension | ||||
| // | ||||
| //  Created by Alex-Dan Bumbu on 22/03/2021. | ||||
| //  Copyright © 2021 8x8, Inc. All rights reserved. | ||||
| // | ||||
|  | ||||
| import Foundation | ||||
| import ReplayKit | ||||
| import OSLog | ||||
|  | ||||
| private enum Constants { | ||||
|     static let bufferMaxLength = 10240 | ||||
| } | ||||
|  | ||||
| class SampleUploader { | ||||
|      | ||||
|     private static var imageContext = CIContext(options: nil) | ||||
|      | ||||
|     @Atomic private var isReady = false | ||||
|     private var connection: SocketConnection | ||||
|    | ||||
|     private var dataToSend: Data? | ||||
|     private var byteIndex = 0 | ||||
|    | ||||
|     private let serialQueue: DispatchQueue | ||||
|      | ||||
|     init(connection: SocketConnection) { | ||||
|         self.connection = connection | ||||
|         self.serialQueue = DispatchQueue(label: "org.jitsi.meet.broadcast.sampleUploader") | ||||
|        | ||||
|         setupConnection() | ||||
|     } | ||||
|    | ||||
|     @discardableResult func send(sample buffer: CMSampleBuffer) -> Bool { | ||||
|         guard isReady else { | ||||
|             return false | ||||
|         } | ||||
|          | ||||
|         isReady = false | ||||
|  | ||||
|         dataToSend = prepare(sample: buffer) | ||||
|         byteIndex = 0 | ||||
|  | ||||
|         serialQueue.async { [weak self] in | ||||
|             self?.sendDataChunk() | ||||
|         } | ||||
|          | ||||
|         return true | ||||
|     } | ||||
| } | ||||
|  | ||||
| private extension SampleUploader { | ||||
|      | ||||
|     func setupConnection() { | ||||
|         connection.didOpen = { [weak self] in | ||||
|             self?.isReady = true | ||||
|         } | ||||
|         connection.streamHasSpaceAvailable = { [weak self] in | ||||
|             self?.serialQueue.async { | ||||
|                 if let success = self?.sendDataChunk() { | ||||
|                     self?.isReady = !success | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     @discardableResult func sendDataChunk() -> Bool { | ||||
|         guard let dataToSend = dataToSend else { | ||||
|             return false | ||||
|         } | ||||
|        | ||||
|         var bytesLeft = dataToSend.count - byteIndex | ||||
|         var length = bytesLeft > Constants.bufferMaxLength ? Constants.bufferMaxLength : bytesLeft | ||||
|  | ||||
|         length = dataToSend[byteIndex..<(byteIndex + length)].withUnsafeBytes { | ||||
|             guard let ptr = $0.bindMemory(to: UInt8.self).baseAddress else { | ||||
|                 return 0 | ||||
|             } | ||||
|  | ||||
|             return connection.writeToStream(buffer: ptr, maxLength: length) | ||||
|         } | ||||
|  | ||||
|         if length > 0 { | ||||
|             byteIndex += length | ||||
|             bytesLeft -= length | ||||
|  | ||||
|             if bytesLeft == 0 { | ||||
|                 self.dataToSend = nil | ||||
|                 byteIndex = 0 | ||||
|             } | ||||
|         } else { | ||||
|             os_log(.debug, log: broadcastLogger, "writeBufferToStream failure") | ||||
|         } | ||||
|        | ||||
|         return true | ||||
|     } | ||||
|      | ||||
|     func prepare(sample buffer: CMSampleBuffer) -> Data? { | ||||
|         guard let imageBuffer = CMSampleBufferGetImageBuffer(buffer) else { | ||||
|             os_log(.debug, log: broadcastLogger, "image buffer not available") | ||||
|             return nil | ||||
|         } | ||||
|          | ||||
|         CVPixelBufferLockBaseAddress(imageBuffer, .readOnly) | ||||
|          | ||||
|         let scaleFactor = 1.0 | ||||
|         let width = CVPixelBufferGetWidth(imageBuffer)/Int(scaleFactor) | ||||
|         let height = CVPixelBufferGetHeight(imageBuffer)/Int(scaleFactor) | ||||
|         let orientation = CMGetAttachment(buffer, key: RPVideoSampleOrientationKey as CFString, attachmentModeOut: nil)?.uintValue ?? 0 | ||||
|                                      | ||||
|         let scaleTransform = CGAffineTransform(scaleX: CGFloat(1.0/scaleFactor), y: CGFloat(1.0/scaleFactor)) | ||||
|         let bufferData = self.jpegData(from: imageBuffer, scale: scaleTransform) | ||||
|          | ||||
|         CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly) | ||||
|          | ||||
|         guard let messageData = bufferData else { | ||||
|             os_log(.debug, log: broadcastLogger, "corrupted image buffer") | ||||
|             return nil | ||||
|         } | ||||
|                | ||||
|         let httpResponse = CFHTTPMessageCreateResponse(nil, 200, nil, kCFHTTPVersion1_1).takeRetainedValue() | ||||
|         CFHTTPMessageSetHeaderFieldValue(httpResponse, "Content-Length" as CFString, String(messageData.count) as CFString) | ||||
|         CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Width" as CFString, String(width) as CFString) | ||||
|         CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Height" as CFString, String(height) as CFString) | ||||
|         CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Orientation" as CFString, String(orientation) as CFString) | ||||
|          | ||||
|         CFHTTPMessageSetBody(httpResponse, messageData as CFData) | ||||
|          | ||||
|         let serializedMessage = CFHTTPMessageCopySerializedMessage(httpResponse)?.takeRetainedValue() as Data? | ||||
|        | ||||
|         return serializedMessage | ||||
|     } | ||||
|      | ||||
|     func jpegData(from buffer: CVPixelBuffer, scale scaleTransform: CGAffineTransform) -> Data? { | ||||
|         let image = CIImage(cvPixelBuffer: buffer).transformed(by: scaleTransform) | ||||
|          | ||||
|         guard let colorSpace = image.colorSpace else { | ||||
|             return nil | ||||
|         } | ||||
|        | ||||
|         let options: [CIImageRepresentationOption: Float] = [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1.0] | ||||
|  | ||||
|         return SampleUploader.imageContext.jpegRepresentation(of: image, colorSpace: colorSpace, options: options) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										199
									
								
								ios/SolianBroadcastExtension/SocketConnection.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,199 @@ | ||||
| // | ||||
| //  SocketConnection.swift | ||||
| //  Broadcast Extension | ||||
| // | ||||
| //  Created by Alex-Dan Bumbu on 22/03/2021. | ||||
| //  Copyright © 2021 Atlassian Inc. All rights reserved. | ||||
| // | ||||
|  | ||||
| import Foundation | ||||
| import OSLog | ||||
|  | ||||
| class SocketConnection: NSObject { | ||||
|     var didOpen: (() -> Void)? | ||||
|     var didClose: ((Error?) -> Void)? | ||||
|     var streamHasSpaceAvailable: (() -> Void)? | ||||
|  | ||||
|     private let filePath: String | ||||
|     private var socketHandle: Int32 = -1 | ||||
|     private var address: sockaddr_un? | ||||
|  | ||||
|     private var inputStream: InputStream? | ||||
|     private var outputStream: OutputStream? | ||||
|      | ||||
|     private var networkQueue: DispatchQueue? | ||||
|     private var shouldKeepRunning = false | ||||
|  | ||||
|     init?(filePath path: String) { | ||||
|         filePath = path | ||||
|         socketHandle = Darwin.socket(AF_UNIX, SOCK_STREAM, 0) | ||||
|  | ||||
|         guard socketHandle != -1 else { | ||||
|             os_log(.debug, log: broadcastLogger, "failure: create socket") | ||||
|             return nil | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     func open() -> Bool { | ||||
|         os_log(.debug, log: broadcastLogger, "open socket connection") | ||||
|  | ||||
|         guard FileManager.default.fileExists(atPath: filePath) else { | ||||
|             os_log(.debug, log: broadcastLogger, "failure: socket file missing") | ||||
|             return false | ||||
|         } | ||||
|        | ||||
|         guard setupAddress() == true else { | ||||
|             return false | ||||
|         } | ||||
|          | ||||
|         guard connectSocket() == true else { | ||||
|             return false | ||||
|         } | ||||
|  | ||||
|         setupStreams() | ||||
|          | ||||
|         inputStream?.open() | ||||
|         outputStream?.open() | ||||
|  | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     func close() { | ||||
|         unscheduleStreams() | ||||
|  | ||||
|         inputStream?.delegate = nil | ||||
|         outputStream?.delegate = nil | ||||
|  | ||||
|         inputStream?.close() | ||||
|         outputStream?.close() | ||||
|          | ||||
|         inputStream = nil | ||||
|         outputStream = nil | ||||
|     } | ||||
|  | ||||
|     func writeToStream(buffer: UnsafePointer<UInt8>, maxLength length: Int) -> Int { | ||||
|         outputStream?.write(buffer, maxLength: length) ?? 0 | ||||
|     } | ||||
| } | ||||
|  | ||||
| extension SocketConnection: StreamDelegate { | ||||
|  | ||||
|     func stream(_ aStream: Stream, handle eventCode: Stream.Event) { | ||||
|         switch eventCode { | ||||
|         case .openCompleted: | ||||
|             os_log(.debug, log: broadcastLogger, "client stream open completed") | ||||
|             if aStream == outputStream { | ||||
|                 didOpen?() | ||||
|             } | ||||
|         case .hasBytesAvailable: | ||||
|             if aStream == inputStream { | ||||
|                 var buffer: UInt8 = 0 | ||||
|                 let numberOfBytesRead = inputStream?.read(&buffer, maxLength: 1) | ||||
|                 if numberOfBytesRead == 0 && aStream.streamStatus == .atEnd { | ||||
|                     os_log(.debug, log: broadcastLogger, "server socket closed") | ||||
|                     close() | ||||
|                     notifyDidClose(error: nil) | ||||
|                 } | ||||
|             } | ||||
|         case .hasSpaceAvailable: | ||||
|             if aStream == outputStream { | ||||
|                 streamHasSpaceAvailable?() | ||||
|             } | ||||
|         case .errorOccurred: | ||||
|             os_log(.debug, log: broadcastLogger, "client stream error occured: \(String(describing: aStream.streamError))") | ||||
|             close() | ||||
|             notifyDidClose(error: aStream.streamError) | ||||
|  | ||||
|         default: | ||||
|             break | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| private extension SocketConnection { | ||||
|    | ||||
|     func setupAddress() -> Bool { | ||||
|         var addr = sockaddr_un() | ||||
|         guard filePath.count < MemoryLayout.size(ofValue: addr.sun_path) else { | ||||
|             os_log(.debug, log: broadcastLogger, "failure: fd path is too long") | ||||
|             return false | ||||
|         } | ||||
|  | ||||
|         _ = withUnsafeMutablePointer(to: &addr.sun_path.0) { ptr in | ||||
|             filePath.withCString { | ||||
|                 strncpy(ptr, $0, filePath.count) | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         address = addr | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     func connectSocket() -> Bool { | ||||
|         guard var addr = address else { | ||||
|             return false | ||||
|         } | ||||
|          | ||||
|         let status = withUnsafePointer(to: &addr) { ptr in | ||||
|             ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) { | ||||
|                 Darwin.connect(socketHandle, $0, socklen_t(MemoryLayout<sockaddr_un>.size)) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         guard status == noErr else { | ||||
|             os_log(.debug, log: broadcastLogger, "failure: \(status)") | ||||
|             return false | ||||
|         } | ||||
|          | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     func setupStreams() { | ||||
|         var readStream: Unmanaged<CFReadStream>? | ||||
|         var writeStream: Unmanaged<CFWriteStream>? | ||||
|  | ||||
|         CFStreamCreatePairWithSocket(kCFAllocatorDefault, socketHandle, &readStream, &writeStream) | ||||
|  | ||||
|         inputStream = readStream?.takeRetainedValue() | ||||
|         inputStream?.delegate = self | ||||
|         inputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String)) | ||||
|  | ||||
|         outputStream = writeStream?.takeRetainedValue() | ||||
|         outputStream?.delegate = self | ||||
|         outputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String)) | ||||
|  | ||||
|         scheduleStreams() | ||||
|     } | ||||
|    | ||||
|     func scheduleStreams() { | ||||
|         shouldKeepRunning = true | ||||
|          | ||||
|         networkQueue = DispatchQueue.global(qos: .userInitiated) | ||||
|         networkQueue?.async { [weak self] in | ||||
|             self?.inputStream?.schedule(in: .current, forMode: .common) | ||||
|             self?.outputStream?.schedule(in: .current, forMode: .common) | ||||
|             RunLoop.current.run() | ||||
|              | ||||
|             var isRunning = false | ||||
|                          | ||||
|             repeat { | ||||
|                 isRunning = self?.shouldKeepRunning ?? false && RunLoop.current.run(mode: .default, before: .distantFuture) | ||||
|             } while (isRunning) | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     func unscheduleStreams() { | ||||
|         networkQueue?.sync { [weak self] in | ||||
|             self?.inputStream?.remove(from: .current, forMode: .common) | ||||
|             self?.outputStream?.remove(from: .current, forMode: .common) | ||||
|         } | ||||
|          | ||||
|         shouldKeepRunning = false | ||||
|     } | ||||
|      | ||||
|     func notifyDidClose(error: Error?) { | ||||
|         if didClose != nil { | ||||
|             didClose?(error) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,10 @@ | ||||
| <?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>com.apple.security.application-groups</key> | ||||
| 	<array> | ||||
| 		<string>group.solsynth.solian</string> | ||||
| 	</array> | ||||
| </dict> | ||||
| </plist> | ||||
| @@ -47,6 +47,7 @@ class NotificationService: UNNotificationServiceExtension { | ||||
|     private func processNotification(request: UNNotificationRequest, content: UNMutableNotificationContent) throws { | ||||
|         switch content.userInfo["type"] as? String { | ||||
|         case "messages.new": | ||||
|             content.categoryIdentifier = "REPLYABLE_MESSAGE" | ||||
|             try handleMessagingNotification(request: request, content: content) | ||||
|         default: | ||||
|             try handleDefaultNotification(content: content) | ||||
| @@ -60,22 +61,6 @@ class NotificationService: UNNotificationServiceExtension { | ||||
|          | ||||
|         let pfpIdentifier = meta["pfp"] as? String | ||||
|          | ||||
|         let replyableMessageCategory = UNNotificationCategory( | ||||
|             identifier: content.categoryIdentifier, | ||||
|             actions: [ | ||||
|                 UNTextInputNotificationAction( | ||||
|                     identifier: "reply_action", | ||||
|                     title: "Reply", | ||||
|                     options: [] | ||||
|                 ), | ||||
|             ], | ||||
|             intentIdentifiers: [], | ||||
|             options: [] | ||||
|         ) | ||||
|          | ||||
|         UNUserNotificationCenter.current().setNotificationCategories([replyableMessageCategory]) | ||||
|         content.categoryIdentifier = replyableMessageCategory.identifier | ||||
|          | ||||
|         let metaCopy = meta as? [String: Any] ?? [:] | ||||
|         let pfpUrl = pfpIdentifier != nil ? getAttachmentUrl(for: pfpIdentifier!) : nil | ||||
|          | ||||
|   | ||||
| @@ -2,8 +2,15 @@ import 'package:drift/drift.dart'; | ||||
|  | ||||
| class PostDrafts extends Table { | ||||
|   TextColumn get id => text()(); | ||||
|   TextColumn get post => text()(); // Store SnPost model as JSON string | ||||
|   // Searchable fields stored separately for performance | ||||
|   TextColumn get title => text().nullable()(); | ||||
|   TextColumn get description => text().nullable()(); | ||||
|   TextColumn get content => text().nullable()(); | ||||
|   IntColumn get visibility => integer().withDefault(const Constant(0))(); | ||||
|   IntColumn get type => integer().withDefault(const Constant(0))(); | ||||
|   DateTimeColumn get lastModified => dateTime()(); | ||||
|   // Full post data stored as JSON for complete restoration | ||||
|   TextColumn get postData => text()(); | ||||
|  | ||||
|   @override | ||||
|   Set<Column> get primaryKey => {id}; | ||||
|   | ||||
| @@ -12,7 +12,7 @@ class AppDatabase extends _$AppDatabase { | ||||
|   AppDatabase(super.e); | ||||
|  | ||||
|   @override | ||||
|   int get schemaVersion => 4; | ||||
|   int get schemaVersion => 7; | ||||
|  | ||||
|   @override | ||||
|   MigrationStrategy get migration => MigrationStrategy( | ||||
| @@ -21,16 +21,97 @@ class AppDatabase extends _$AppDatabase { | ||||
|     }, | ||||
|     onUpgrade: (Migrator m, int from, int to) async { | ||||
|       if (from < 2) { | ||||
|         // Add isRead column with default value false | ||||
|         await m.addColumn(chatMessages, chatMessages.isRead); | ||||
|         // Add isDeleted column with default value false | ||||
|         await m.addColumn(chatMessages, chatMessages.isDeleted); | ||||
|       } | ||||
|       if (from < 4) { | ||||
|         // Drop old draft tables if they exist | ||||
|         await m.createTable(postDrafts); | ||||
|       } | ||||
|       if (from < 6) { | ||||
|         // Migrate from old schema to new schema with separate searchable fields | ||||
|         await _migrateToVersion6(m); | ||||
|       } | ||||
|       if (from < 7) { | ||||
|         // Add new columns from SnChatMessage, ignore if they already exist | ||||
|         final columnsToAdd = [ | ||||
|           chatMessages.updatedAt, | ||||
|           chatMessages.deletedAt, | ||||
|           chatMessages.type, | ||||
|           chatMessages.meta, | ||||
|           chatMessages.membersMentioned, | ||||
|           chatMessages.editedAt, | ||||
|           chatMessages.attachments, | ||||
|           chatMessages.reactions, | ||||
|           chatMessages.repliedMessageId, | ||||
|           chatMessages.forwardedMessageId, | ||||
|         ]; | ||||
|  | ||||
|         for (final column in columnsToAdd) { | ||||
|           try { | ||||
|             await m.addColumn(chatMessages, column); | ||||
|           } catch (e) { | ||||
|             // Column already exists, skip | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   ); | ||||
|  | ||||
|   Future<void> _migrateToVersion6(Migrator m) async { | ||||
|     // Rename existing table to old if it exists | ||||
|     try { | ||||
|       await customStatement( | ||||
|         'ALTER TABLE post_drafts RENAME TO post_drafts_old', | ||||
|       ); | ||||
|     } catch (e) { | ||||
|       // Table might not exist | ||||
|     } | ||||
|  | ||||
|     // Drop the table | ||||
|     await customStatement('DROP TABLE IF EXISTS post_drafts'); | ||||
|  | ||||
|     // Create new table | ||||
|     await m.createTable(postDrafts); | ||||
|  | ||||
|     // Migrate existing data if any | ||||
|     try { | ||||
|       final oldDrafts = | ||||
|           await customSelect( | ||||
|             'SELECT id, post, lastModified FROM post_drafts_old', | ||||
|             readsFrom: {postDrafts}, | ||||
|           ).get(); | ||||
|  | ||||
|       for (final row in oldDrafts) { | ||||
|         final postJson = row.read<String>('post'); | ||||
|         final id = row.read<String>('id'); | ||||
|         final lastModified = row.read<DateTime>('lastModified'); | ||||
|  | ||||
|         if (postJson.isNotEmpty) { | ||||
|           final post = SnPost.fromJson(jsonDecode(postJson)); | ||||
|           await into(postDrafts).insert( | ||||
|             PostDraftsCompanion( | ||||
|               id: Value(id), | ||||
|               title: Value(post.title), | ||||
|               description: Value(post.description), | ||||
|               content: Value(post.content), | ||||
|               visibility: Value(post.visibility), | ||||
|               type: Value(post.type), | ||||
|               lastModified: Value(lastModified), | ||||
|               postData: Value(postJson), | ||||
|             ), | ||||
|           ); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       // Drop old table | ||||
|       await customStatement('DROP TABLE IF EXISTS post_drafts_old'); | ||||
|     } catch (e) { | ||||
|       // If migration fails, just recreate the table | ||||
|       await m.createTable(postDrafts); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Methods for chat messages | ||||
|   Future<List<ChatMessage>> getMessagesForRoom( | ||||
|     String roomId, { | ||||
| @@ -49,8 +130,7 @@ class AppDatabase extends _$AppDatabase { | ||||
|   } | ||||
|  | ||||
|   Future<int> updateMessage(ChatMessagesCompanion message) { | ||||
|     return (update(chatMessages) | ||||
|       ..where((m) => m.id.equals(message.id.value))).write(message); | ||||
|     return into(chatMessages).insert(message, mode: InsertMode.insertOrReplace); | ||||
|   } | ||||
|  | ||||
|   Future<int> updateMessageStatus(String id, MessageStatus status) { | ||||
| @@ -59,28 +139,70 @@ class AppDatabase extends _$AppDatabase { | ||||
|     )).write(ChatMessagesCompanion(status: Value(status))); | ||||
|   } | ||||
|  | ||||
|   Future<int> markMessageAsRead(String id) { | ||||
|     return (update(chatMessages)..where( | ||||
|       (m) => m.id.equals(id), | ||||
|     )).write(ChatMessagesCompanion(isRead: const Value(true))); | ||||
|   } | ||||
|  | ||||
|   Future<int> deleteMessage(String id) { | ||||
|     return (delete(chatMessages)..where((m) => m.id.equals(id))).go(); | ||||
|   } | ||||
|  | ||||
|   Future<int> getTotalMessagesForRoom(String roomId) { | ||||
|     return (select( | ||||
|       chatMessages, | ||||
|     )..where((m) => m.roomId.equals(roomId))).get().then((list) => list.length); | ||||
|   } | ||||
|  | ||||
|   Future<List<LocalChatMessage>> searchMessages( | ||||
|     String roomId, | ||||
|     String query, { | ||||
|     bool? withAttachments, | ||||
|   }) async { | ||||
|     var selectStatement = select(chatMessages) | ||||
|       ..where((m) => m.roomId.equals(roomId)); | ||||
|  | ||||
|     if (query.isNotEmpty) { | ||||
|       final searchTerm = '%$query%'; | ||||
|       selectStatement = | ||||
|           selectStatement..where( | ||||
|             (m) => | ||||
|                 m.content.like(searchTerm) | | ||||
|                 m.meta.like(searchTerm) | | ||||
|                 m.attachments.like(searchTerm) | | ||||
|                 m.type.like(searchTerm), | ||||
|           ); | ||||
|     } | ||||
|  | ||||
|     if (withAttachments == true) { | ||||
|       selectStatement = | ||||
|           selectStatement..where((m) => m.attachments.equals('[]').not()); | ||||
|     } | ||||
|  | ||||
|     final messages = | ||||
|         await (selectStatement | ||||
|               ..orderBy([(m) => OrderingTerm.desc(m.createdAt)])) | ||||
|             .get(); | ||||
|     return messages.map((msg) => companionToMessage(msg)).toList(); | ||||
|   } | ||||
|  | ||||
|   // Convert between Drift and model objects | ||||
|   ChatMessagesCompanion messageToCompanion(LocalChatMessage message) { | ||||
|     final remote = message.toRemoteMessage(); | ||||
|     return ChatMessagesCompanion( | ||||
|       id: Value(message.id), | ||||
|       roomId: Value(message.roomId), | ||||
|       senderId: Value(message.senderId), | ||||
|       content: Value(message.toRemoteMessage().content), | ||||
|       content: Value(remote.content), | ||||
|       nonce: Value(message.nonce), | ||||
|       data: Value(jsonEncode(message.data)), | ||||
|       createdAt: Value(message.createdAt), | ||||
|       status: Value(message.status), | ||||
|       isRead: Value(message.isRead), | ||||
|       updatedAt: Value(remote.updatedAt), | ||||
|       deletedAt: Value(remote.deletedAt), | ||||
|       type: Value(remote.type), | ||||
|       meta: Value(remote.meta), | ||||
|       membersMentioned: Value(remote.membersMentioned), | ||||
|       editedAt: Value(remote.editedAt), | ||||
|       attachments: Value(remote.attachments.map((e) => e.toJson()).toList()), | ||||
|       reactions: Value(remote.reactions.map((e) => e.toJson()).toList()), | ||||
|       repliedMessageId: Value(remote.repliedMessageId), | ||||
|       forwardedMessageId: Value(remote.forwardedMessageId), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| @@ -94,7 +216,18 @@ class AppDatabase extends _$AppDatabase { | ||||
|       createdAt: dbMessage.createdAt, | ||||
|       status: dbMessage.status, | ||||
|       nonce: dbMessage.nonce, | ||||
|       isRead: dbMessage.isRead, | ||||
|       content: dbMessage.content, | ||||
|       isDeleted: dbMessage.isDeleted, | ||||
|       updatedAt: dbMessage.updatedAt, | ||||
|       deletedAt: dbMessage.deletedAt, | ||||
|       type: dbMessage.type, | ||||
|       meta: dbMessage.meta, | ||||
|       membersMentioned: dbMessage.membersMentioned, | ||||
|       editedAt: dbMessage.editedAt, | ||||
|       attachments: dbMessage.attachments, | ||||
|       reactions: dbMessage.reactions, | ||||
|       repliedMessageId: dbMessage.repliedMessageId, | ||||
|       forwardedMessageId: dbMessage.forwardedMessageId, | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| @@ -102,10 +235,31 @@ class AppDatabase extends _$AppDatabase { | ||||
|   Future<List<SnPost>> getAllPostDrafts() async { | ||||
|     final drafts = await select(postDrafts).get(); | ||||
|     return drafts | ||||
|         .map((draft) => SnPost.fromJson(jsonDecode(draft.post))) | ||||
|         .map((draft) => SnPost.fromJson(jsonDecode(draft.postData))) | ||||
|         .toList(); | ||||
|   } | ||||
|  | ||||
|   Future<List<PostDraft>> getAllPostDraftRecords() async { | ||||
|     return await select(postDrafts).get(); | ||||
|   } | ||||
|  | ||||
|   Future<List<PostDraft>> searchPostDrafts(String query) async { | ||||
|     if (query.isEmpty) { | ||||
|       return await select(postDrafts).get(); | ||||
|     } | ||||
|  | ||||
|     final searchTerm = '%${query.toLowerCase()}%'; | ||||
|     return await (select(postDrafts) | ||||
|           ..where( | ||||
|             (draft) => | ||||
|                 draft.title.like(searchTerm) | | ||||
|                 draft.description.like(searchTerm) | | ||||
|                 draft.content.like(searchTerm), | ||||
|           ) | ||||
|           ..orderBy([(draft) => OrderingTerm.desc(draft.lastModified)])) | ||||
|         .get(); | ||||
|   } | ||||
|  | ||||
|   Future<void> addPostDraft(PostDraftsCompanion entry) async { | ||||
|     await into(postDrafts).insert(entry, mode: InsertMode.replace); | ||||
|   } | ||||
| @@ -117,4 +271,9 @@ class AppDatabase extends _$AppDatabase { | ||||
|   Future<void> clearAllPostDrafts() async { | ||||
|     await delete(postDrafts).go(); | ||||
|   } | ||||
|  | ||||
|   Future<PostDraft?> getPostDraftById(String id) async { | ||||
|     return await (select(postDrafts) | ||||
|       ..where((tbl) => tbl.id.equals(id))).getSingleOrNull(); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,41 @@ | ||||
| import 'dart:convert'; | ||||
|  | ||||
| import 'package:drift/drift.dart'; | ||||
| import 'package:island/models/chat.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
|  | ||||
| class MapConverter extends TypeConverter<Map<String, dynamic>, String> { | ||||
|   const MapConverter(); | ||||
|  | ||||
|   @override | ||||
|   Map<String, dynamic> fromSql(String fromDb) => json.decode(fromDb); | ||||
|  | ||||
|   @override | ||||
|   String toSql(Map<String, dynamic> value) => json.encode(value); | ||||
| } | ||||
|  | ||||
| class ListStringConverter extends TypeConverter<List<String>, String> { | ||||
|   const ListStringConverter(); | ||||
|  | ||||
|   @override | ||||
|   List<String> fromSql(String fromDb) => List<String>.from(json.decode(fromDb)); | ||||
|  | ||||
|   @override | ||||
|   String toSql(List<String> value) => json.encode(value); | ||||
| } | ||||
|  | ||||
| class ListMapConverter | ||||
|     extends TypeConverter<List<Map<String, dynamic>>, String> { | ||||
|   const ListMapConverter(); | ||||
|  | ||||
|   @override | ||||
|   List<Map<String, dynamic>> fromSql(String fromDb) => | ||||
|       List<Map<String, dynamic>>.from(json.decode(fromDb)); | ||||
|  | ||||
|   @override | ||||
|   String toSql(List<Map<String, dynamic>> value) => json.encode(value); | ||||
| } | ||||
|  | ||||
| class ChatMessages extends Table { | ||||
|   TextColumn get id => text()(); | ||||
|   TextColumn get roomId => text()(); | ||||
| @@ -11,7 +45,24 @@ class ChatMessages extends Table { | ||||
|   TextColumn get data => text()(); | ||||
|   DateTimeColumn get createdAt => dateTime()(); | ||||
|   IntColumn get status => intEnum<MessageStatus>()(); | ||||
|   BoolColumn get isRead => boolean().withDefault(const Constant(false))(); | ||||
|   BoolColumn get isDeleted => | ||||
|       boolean().nullable().withDefault(const Constant(false))(); | ||||
|   DateTimeColumn get updatedAt => dateTime().nullable()(); | ||||
|   DateTimeColumn get deletedAt => dateTime().nullable()(); | ||||
|   TextColumn get type => text().withDefault(const Constant('text'))(); | ||||
|   TextColumn get meta => | ||||
|       text().map(const MapConverter()).withDefault(const Constant('{}'))(); | ||||
|   TextColumn get membersMentioned => | ||||
|       text() | ||||
|           .map(const ListStringConverter()) | ||||
|           .withDefault(const Constant('[]'))(); | ||||
|   DateTimeColumn get editedAt => dateTime().nullable()(); | ||||
|   TextColumn get attachments => | ||||
|       text().map(const ListMapConverter()).withDefault(const Constant('[]'))(); | ||||
|   TextColumn get reactions => | ||||
|       text().map(const ListMapConverter()).withDefault(const Constant('[]'))(); | ||||
|   TextColumn get repliedMessageId => text().nullable()(); | ||||
|   TextColumn get forwardedMessageId => text().nullable()(); | ||||
|  | ||||
|   @override | ||||
|   Set<Column> get primaryKey => {id}; | ||||
| @@ -25,8 +76,19 @@ class LocalChatMessage { | ||||
|   final DateTime createdAt; | ||||
|   MessageStatus status; | ||||
|   final String? nonce; | ||||
|   final String? content; | ||||
|   final bool? isDeleted; | ||||
|   final DateTime? updatedAt; | ||||
|   final DateTime? deletedAt; | ||||
|   final String type; | ||||
|   final Map<String, dynamic> meta; | ||||
|   final List<String> membersMentioned; | ||||
|   final DateTime? editedAt; | ||||
|   final List<Map<String, dynamic>> attachments; | ||||
|   final List<Map<String, dynamic>> reactions; | ||||
|   final String? repliedMessageId; | ||||
|   final String? forwardedMessageId; | ||||
|   List<UniversalFile>? localAttachments; | ||||
|   bool isRead; | ||||
|  | ||||
|   LocalChatMessage({ | ||||
|     required this.id, | ||||
| @@ -36,8 +98,19 @@ class LocalChatMessage { | ||||
|     required this.createdAt, | ||||
|     required this.nonce, | ||||
|     required this.status, | ||||
|     this.content, | ||||
|     this.isDeleted, | ||||
|     this.updatedAt, | ||||
|     this.deletedAt, | ||||
|     required this.type, | ||||
|     required this.meta, | ||||
|     required this.membersMentioned, | ||||
|     this.editedAt, | ||||
|     required this.attachments, | ||||
|     required this.reactions, | ||||
|     this.repliedMessageId, | ||||
|     this.forwardedMessageId, | ||||
|     this.localAttachments, | ||||
|     this.isRead = false, | ||||
|   }); | ||||
|  | ||||
|   SnChatMessage toRemoteMessage() { | ||||
| @@ -48,7 +121,6 @@ class LocalChatMessage { | ||||
|     SnChatMessage message, | ||||
|     MessageStatus status, { | ||||
|     String? nonce, | ||||
|     bool isRead = false, | ||||
|   }) { | ||||
|     return LocalChatMessage( | ||||
|       id: message.id, | ||||
| @@ -58,7 +130,18 @@ class LocalChatMessage { | ||||
|       createdAt: message.createdAt, | ||||
|       status: status, | ||||
|       nonce: nonce ?? message.nonce, | ||||
|       isRead: isRead, | ||||
|       content: message.content, | ||||
|       isDeleted: false, | ||||
|       updatedAt: message.updatedAt, | ||||
|       deletedAt: null, | ||||
|       type: message.type, | ||||
|       meta: message.meta, | ||||
|       membersMentioned: message.membersMentioned, | ||||
|       editedAt: message.editedAt, | ||||
|       attachments: message.attachments.map((e) => e.toJson()).toList(), | ||||
|       reactions: message.reactions.map((e) => e.toJson()).toList(), | ||||
|       repliedMessageId: message.repliedMessageId, | ||||
|       forwardedMessageId: message.forwardedMessageId, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,475 +0,0 @@ | ||||
| import 'package:dio/dio.dart'; | ||||
| import 'package:island/database/drift_db.dart'; | ||||
| import 'package:island/database/message.dart'; | ||||
| import 'package:island/models/chat.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
| import 'package:island/services/file.dart'; | ||||
| import 'package:island/widgets/alert.dart'; | ||||
| import 'package:uuid/uuid.dart'; | ||||
|  | ||||
| class MessageRepository { | ||||
|   final SnChatRoom room; | ||||
|   final SnChatMember identity; | ||||
|   final Dio _apiClient; | ||||
|   final AppDatabase _database; | ||||
|  | ||||
|   final Map<String, LocalChatMessage> pendingMessages = {}; | ||||
|   final Map<String, Map<int, double>> fileUploadProgress = {}; | ||||
|   int? _totalCount; | ||||
|  | ||||
|   MessageRepository(this.room, this.identity, this._apiClient, this._database); | ||||
|  | ||||
|   Future<LocalChatMessage?> getLastMessages() async { | ||||
|     final dbMessages = await _database.getMessagesForRoom( | ||||
|       room.id, | ||||
|       offset: 0, | ||||
|       limit: 1, | ||||
|     ); | ||||
|  | ||||
|     if (dbMessages.isEmpty) { | ||||
|       return null; | ||||
|     } | ||||
|  | ||||
|     return _database.companionToMessage(dbMessages.first); | ||||
|   } | ||||
|  | ||||
|   Future<bool> syncMessages() async { | ||||
|     final lastMessage = await getLastMessages(); | ||||
|     if (lastMessage == null) return false; | ||||
|     try { | ||||
|       final resp = await _apiClient.post( | ||||
|         '/chat/${room.id}/sync', | ||||
|         data: { | ||||
|           'last_sync_timestamp': | ||||
|               lastMessage.toRemoteMessage().updatedAt.millisecondsSinceEpoch, | ||||
|         }, | ||||
|       ); | ||||
|  | ||||
|       final response = MessageSyncResponse.fromJson(resp.data); | ||||
|       for (final change in response.changes) { | ||||
|         switch (change.action) { | ||||
|           case MessageChangeAction.create: | ||||
|             await receiveMessage(change.message!); | ||||
|             break; | ||||
|           case MessageChangeAction.update: | ||||
|             await receiveMessageUpdate(change.message!); | ||||
|             break; | ||||
|           case MessageChangeAction.delete: | ||||
|             await receiveMessageDeletion(change.messageId.toString()); | ||||
|             break; | ||||
|         } | ||||
|       } | ||||
|     } catch (err) { | ||||
|       showErrorAlert(err); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   Future<List<LocalChatMessage>> listMessages({ | ||||
|     int offset = 0, | ||||
|     int take = 20, | ||||
|     bool synced = false, | ||||
|   }) async { | ||||
|     try { | ||||
|       final localMessages = await _getCachedMessages( | ||||
|         room.id, | ||||
|         offset: offset, | ||||
|         take: take, | ||||
|       ); | ||||
|  | ||||
|       // If it already synced with the remote, skip this | ||||
|       if (offset == 0 && !synced) { | ||||
|         // Fetch latest messages | ||||
|         _fetchAndCacheMessages(room.id, offset: offset, take: take); | ||||
|  | ||||
|         if (localMessages.isNotEmpty) { | ||||
|           return localMessages; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       return await _fetchAndCacheMessages(room.id, offset: offset, take: take); | ||||
|     } catch (e) { | ||||
|       // If API fails but we have local messages, return them | ||||
|       final localMessages = await _getCachedMessages( | ||||
|         room.id, | ||||
|         offset: offset, | ||||
|         take: take, | ||||
|       ); | ||||
|  | ||||
|       if (localMessages.isNotEmpty) { | ||||
|         return localMessages; | ||||
|       } | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<List<LocalChatMessage>> _getCachedMessages( | ||||
|     String roomId, { | ||||
|     int offset = 0, | ||||
|     int take = 20, | ||||
|   }) async { | ||||
|     // Get messages from local database | ||||
|     final dbMessages = await _database.getMessagesForRoom( | ||||
|       roomId, | ||||
|       offset: offset, | ||||
|       limit: take, | ||||
|     ); | ||||
|     final dbLocalMessages = | ||||
|         dbMessages.map(_database.companionToMessage).toList(); | ||||
|  | ||||
|     // Combine with pending messages | ||||
|     final pendingForRoom = | ||||
|         pendingMessages.values.where((msg) => msg.roomId == roomId).toList(); | ||||
|  | ||||
|     // Sort by timestamp descending (newest first) | ||||
|     final allMessages = [...pendingForRoom, ...dbLocalMessages]; | ||||
|     allMessages.sort((a, b) => b.createdAt.compareTo(a.createdAt)); | ||||
|  | ||||
|     // Apply pagination | ||||
|     if (offset >= allMessages.length) { | ||||
|       return []; | ||||
|     } | ||||
|  | ||||
|     final end = | ||||
|         (offset + take) > allMessages.length | ||||
|             ? allMessages.length | ||||
|             : (offset + take); | ||||
|     return allMessages.sublist(offset, end); | ||||
|   } | ||||
|  | ||||
|   Future<List<LocalChatMessage>> _fetchAndCacheMessages( | ||||
|     String roomId, { | ||||
|     int offset = 0, | ||||
|     int take = 20, | ||||
|   }) async { | ||||
|     // Use cached total count if available, otherwise fetch it | ||||
|     if (_totalCount == null) { | ||||
|       final response = await _apiClient.get( | ||||
|         '/chat/$roomId/messages', | ||||
|         queryParameters: {'offset': 0, 'take': 1}, | ||||
|       ); | ||||
|       _totalCount = int.parse(response.headers['x-total']?.firstOrNull ?? '0'); | ||||
|     } | ||||
|  | ||||
|     if (offset >= _totalCount!) { | ||||
|       return []; | ||||
|     } | ||||
|  | ||||
|     final response = await _apiClient.get( | ||||
|       '/chat/$roomId/messages', | ||||
|       queryParameters: {'offset': offset, 'take': take}, | ||||
|     ); | ||||
|  | ||||
|     final List<dynamic> data = response.data; | ||||
|     // Update total count from response headers | ||||
|     _totalCount = int.parse(response.headers['x-total']?.firstOrNull ?? '0'); | ||||
|  | ||||
|     final messages = | ||||
|         data.map((json) { | ||||
|           final remoteMessage = SnChatMessage.fromJson(json); | ||||
|           return LocalChatMessage.fromRemoteMessage( | ||||
|             remoteMessage, | ||||
|             MessageStatus.sent, | ||||
|           ); | ||||
|         }).toList(); | ||||
|  | ||||
|     for (final message in messages) { | ||||
|       await _database.saveMessage(_database.messageToCompanion(message)); | ||||
|       if (message.nonce != null) { | ||||
|         pendingMessages.removeWhere( | ||||
|           (_, pendingMsg) => pendingMsg.nonce == message.nonce, | ||||
|         ); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return messages; | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage> sendMessage( | ||||
|     String token, | ||||
|     String baseUrl, | ||||
|     String roomId, | ||||
|     String content, | ||||
|     String nonce, { | ||||
|     required List<UniversalFile> attachments, | ||||
|     Map<String, dynamic>? meta, | ||||
|     SnChatMessage? replyingTo, | ||||
|     SnChatMessage? forwardingTo, | ||||
|     SnChatMessage? editingTo, | ||||
|     Function(LocalChatMessage)? onPending, | ||||
|     Function(String, Map<int, double>)? onProgress, | ||||
|   }) async { | ||||
|     // Generate a unique nonce for this message | ||||
|     final nonce = const Uuid().v4(); | ||||
|  | ||||
|     // Create a local message with pending status | ||||
|     final mockMessage = SnChatMessage( | ||||
|       id: 'pending_$nonce', | ||||
|       chatRoomId: roomId, | ||||
|       senderId: identity.id, | ||||
|       content: content, | ||||
|       createdAt: DateTime.now(), | ||||
|       updatedAt: DateTime.now(), | ||||
|       nonce: nonce, | ||||
|       sender: identity, | ||||
|     ); | ||||
|  | ||||
|     final localMessage = LocalChatMessage.fromRemoteMessage( | ||||
|       mockMessage, | ||||
|       MessageStatus.pending, | ||||
|     ); | ||||
|  | ||||
|     // Store in memory and database | ||||
|     pendingMessages[localMessage.id] = localMessage; | ||||
|     fileUploadProgress[localMessage.id] = {}; | ||||
|     await _database.saveMessage(_database.messageToCompanion(localMessage)); | ||||
|     onPending?.call(localMessage); | ||||
|  | ||||
|     try { | ||||
|       var cloudAttachments = List.empty(growable: true); | ||||
|       // Upload files | ||||
|       for (var idx = 0; idx < attachments.length; idx++) { | ||||
|         final cloudFile = | ||||
|             await putMediaToCloud( | ||||
|               fileData: attachments[idx], | ||||
|               atk: token, | ||||
|               baseUrl: baseUrl, | ||||
|               filename: attachments[idx].data.name ?? 'Post media', | ||||
|               mimetype: | ||||
|                   attachments[idx].data.mimeType ?? | ||||
|                   switch (attachments[idx].type) { | ||||
|                     UniversalFileType.image => 'image/unknown', | ||||
|                     UniversalFileType.video => 'video/unknown', | ||||
|                     UniversalFileType.audio => 'audio/unknown', | ||||
|                     UniversalFileType.file => 'application/octet-stream', | ||||
|                   }, | ||||
|               onProgress: (progress, _) { | ||||
|                 fileUploadProgress[localMessage.id]?[idx] = progress; | ||||
|                 onProgress?.call( | ||||
|                   localMessage.id, | ||||
|                   fileUploadProgress[localMessage.id] ?? {}, | ||||
|                 ); | ||||
|               }, | ||||
|             ).future; | ||||
|         if (cloudFile == null) { | ||||
|           throw ArgumentError('Failed to upload the file...'); | ||||
|         } | ||||
|         cloudAttachments.add(cloudFile); | ||||
|       } | ||||
|  | ||||
|       // Send to server | ||||
|       final response = await _apiClient.request( | ||||
|         editingTo == null | ||||
|             ? '/chat/$roomId/messages' | ||||
|             : '/chat/$roomId/messages/${editingTo.id}', | ||||
|         data: { | ||||
|           'content': content, | ||||
|           'attachments_id': cloudAttachments.map((e) => e.id).toList(), | ||||
|           'replied_message_id': replyingTo?.id, | ||||
|           'forwarded_message_id': forwardingTo?.id, | ||||
|           'meta': meta, | ||||
|           'nonce': nonce, | ||||
|         }, | ||||
|         options: Options(method: editingTo == null ? 'POST' : 'PATCH'), | ||||
|       ); | ||||
|  | ||||
|       // Update with server response | ||||
|       final remoteMessage = SnChatMessage.fromJson(response.data); | ||||
|       final updatedMessage = LocalChatMessage.fromRemoteMessage( | ||||
|         remoteMessage, | ||||
|         MessageStatus.sent, | ||||
|       ); | ||||
|  | ||||
|       // Remove from pending and update in database | ||||
|       pendingMessages.remove(localMessage.id); | ||||
|       await _database.deleteMessage(localMessage.id); | ||||
|       await _database.saveMessage(_database.messageToCompanion(updatedMessage)); | ||||
|  | ||||
|       return updatedMessage; | ||||
|     } catch (e) { | ||||
|       // Update status to failed | ||||
|       localMessage.status = MessageStatus.failed; | ||||
|       pendingMessages[localMessage.id] = localMessage; | ||||
|       await _database.updateMessageStatus( | ||||
|         localMessage.id, | ||||
|         MessageStatus.failed, | ||||
|       ); | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage> retryMessage(String pendingMessageId) async { | ||||
|     final message = await getMessageById(pendingMessageId); | ||||
|     if (message == null) { | ||||
|       throw Exception('Message not found'); | ||||
|     } | ||||
|  | ||||
|     // Update status back to pending | ||||
|     message.status = MessageStatus.pending; | ||||
|     pendingMessages[pendingMessageId] = message; | ||||
|     await _database.updateMessageStatus( | ||||
|       pendingMessageId, | ||||
|       MessageStatus.pending, | ||||
|     ); | ||||
|  | ||||
|     try { | ||||
|       // Send to server | ||||
|       var remoteMessage = message.toRemoteMessage(); | ||||
|       final response = await _apiClient.post( | ||||
|         '/chat/${message.roomId}/messages', | ||||
|         data: { | ||||
|           'content': remoteMessage.content, | ||||
|           'attachments_id': remoteMessage.attachments, | ||||
|           'meta': remoteMessage.meta, | ||||
|           'nonce': message.nonce, | ||||
|         }, | ||||
|       ); | ||||
|  | ||||
|       // Update with server response | ||||
|       remoteMessage = SnChatMessage.fromJson(response.data); | ||||
|       final updatedMessage = LocalChatMessage.fromRemoteMessage( | ||||
|         remoteMessage, | ||||
|         MessageStatus.sent, | ||||
|       ); | ||||
|  | ||||
|       // Remove from pending and update in database | ||||
|       pendingMessages.remove(pendingMessageId); | ||||
|       await _database.deleteMessage(pendingMessageId); | ||||
|       await _database.saveMessage(_database.messageToCompanion(updatedMessage)); | ||||
|  | ||||
|       return updatedMessage; | ||||
|     } catch (e) { | ||||
|       // Update status to failed | ||||
|       message.status = MessageStatus.failed; | ||||
|       pendingMessages[pendingMessageId] = message; | ||||
|       await _database.updateMessageStatus( | ||||
|         pendingMessageId, | ||||
|         MessageStatus.failed, | ||||
|       ); | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage> receiveMessage(SnChatMessage remoteMessage) async { | ||||
|     final localMessage = LocalChatMessage.fromRemoteMessage( | ||||
|       remoteMessage, | ||||
|       MessageStatus.sent, | ||||
|     ); | ||||
|  | ||||
|     if (remoteMessage.nonce != null) { | ||||
|       pendingMessages.removeWhere( | ||||
|         (_, pendingMsg) => pendingMsg.nonce == remoteMessage.nonce, | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     await _database.saveMessage(_database.messageToCompanion(localMessage)); | ||||
|     return localMessage; | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage> receiveMessageUpdate( | ||||
|     SnChatMessage remoteMessage, | ||||
|   ) async { | ||||
|     final localMessage = LocalChatMessage.fromRemoteMessage( | ||||
|       remoteMessage, | ||||
|       MessageStatus.sent, | ||||
|     ); | ||||
|  | ||||
|     await _database.updateMessage(_database.messageToCompanion(localMessage)); | ||||
|     return localMessage; | ||||
|   } | ||||
|  | ||||
|   Future<void> receiveMessageDeletion(String messageId) async { | ||||
|     // Remove from pending messages if exists | ||||
|     pendingMessages.remove(messageId); | ||||
|  | ||||
|     // Delete from local database | ||||
|     await _database.deleteMessage(messageId); | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage> updateMessage( | ||||
|     String messageId, | ||||
|     String content, { | ||||
|     List<SnCloudFile>? attachments, | ||||
|     Map<String, dynamic>? meta, | ||||
|   }) async { | ||||
|     final message = pendingMessages[messageId]; | ||||
|     if (message != null) { | ||||
|       // Update pending message | ||||
|       final rmMessage = message.toRemoteMessage(); | ||||
|       final updatedRemoteMessage = rmMessage.copyWith( | ||||
|         content: content, | ||||
|         meta: meta ?? rmMessage.meta, | ||||
|       ); | ||||
|       final updatedLocalMessage = LocalChatMessage.fromRemoteMessage( | ||||
|         updatedRemoteMessage, | ||||
|         MessageStatus.pending, | ||||
|       ); | ||||
|       pendingMessages[messageId] = updatedLocalMessage; | ||||
|       await _database.updateMessage( | ||||
|         _database.messageToCompanion(updatedLocalMessage), | ||||
|       ); | ||||
|       return message; | ||||
|     } | ||||
|  | ||||
|     try { | ||||
|       // Update on server | ||||
|       final response = await _apiClient.put( | ||||
|         '/chat/${room.id}/messages/$messageId', | ||||
|         data: {'content': content, 'attachments': attachments, 'meta': meta}, | ||||
|       ); | ||||
|  | ||||
|       // Update local copy | ||||
|       final remoteMessage = SnChatMessage.fromJson(response.data); | ||||
|       final updatedMessage = LocalChatMessage.fromRemoteMessage( | ||||
|         remoteMessage, | ||||
|         MessageStatus.sent, | ||||
|       ); | ||||
|       await _database.updateMessage( | ||||
|         _database.messageToCompanion(updatedMessage), | ||||
|       ); | ||||
|       return updatedMessage; | ||||
|     } catch (e) { | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<void> deleteMessage(String messageId) async { | ||||
|     try { | ||||
|       await _apiClient.delete('/chat/${room.id}/messages/$messageId'); | ||||
|       pendingMessages.remove(messageId); | ||||
|       await _database.deleteMessage(messageId); | ||||
|     } catch (e) { | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<LocalChatMessage?> getMessageById(String messageId) async { | ||||
|     try { | ||||
|       // Attempt to get the message from the local database | ||||
|       final localMessage = | ||||
|           await (_database.select(_database.chatMessages) | ||||
|             ..where((tbl) => tbl.id.equals(messageId))).getSingleOrNull(); | ||||
|       if (localMessage != null) { | ||||
|         return _database.companionToMessage(localMessage); | ||||
|       } | ||||
|  | ||||
|       // If not found locally, fetch from the server | ||||
|       final response = await _apiClient.get( | ||||
|         '/chat/${room.id}/messages/$messageId', | ||||
|       ); | ||||
|       final remoteMessage = SnChatMessage.fromJson(response.data); | ||||
|       final message = LocalChatMessage.fromRemoteMessage( | ||||
|         remoteMessage, | ||||
|         MessageStatus.sent, | ||||
|       ); | ||||
|  | ||||
|       // Save the fetched message to the local database | ||||
|       await _database.saveMessage(_database.messageToCompanion(message)); | ||||
|       return message; | ||||
|     } catch (e) { | ||||
|       if (e is DioException) return null; | ||||
|       // Handle errors | ||||
|       rethrow; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -29,10 +29,7 @@ class DefaultFirebaseOptions { | ||||
|       case TargetPlatform.windows: | ||||
|         return windows; | ||||
|       case TargetPlatform.linux: | ||||
|         throw UnsupportedError( | ||||
|           'DefaultFirebaseOptions have not been configured for linux - ' | ||||
|           'you can reconfigure this by running the FlutterFire CLI again.', | ||||
|         ); | ||||
|         return windows; | ||||
|       default: | ||||
|         throw UnsupportedError( | ||||
|           'DefaultFirebaseOptions are not supported for this platform.', | ||||
| @@ -41,13 +38,13 @@ class DefaultFirebaseOptions { | ||||
|   } | ||||
|  | ||||
|   static const FirebaseOptions web = FirebaseOptions( | ||||
|     apiKey: 'AIzaSyBKfIQpTouj5rXnlzkEieSlbAzepm4mgJE', | ||||
|     appId: '1:961776991058:web:b91d12f2892a5609f4188b', | ||||
|     apiKey: 'AIzaSyCfgOdlcr7h8x8j0WKx_S2wXnGkOopq320', | ||||
|     appId: '1:961776991058:web:3a912c0eb14028e5f4188b', | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     authDomain: 'solian-0x001.firebaseapp.com', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     measurementId: 'G-XY3HHKG0PE', | ||||
|     measurementId: 'G-JD1YEG9D6F', | ||||
|   ); | ||||
|  | ||||
|   static const FirebaseOptions android = FirebaseOptions( | ||||
| @@ -64,6 +61,8 @@ class DefaultFirebaseOptions { | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     androidClientId: '961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com', | ||||
|     iosClientId: '961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com', | ||||
|     iosBundleId: 'dev.solsynth.solian', | ||||
|   ); | ||||
|  | ||||
| @@ -73,6 +72,8 @@ class DefaultFirebaseOptions { | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     androidClientId: '961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com', | ||||
|     iosClientId: '961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com', | ||||
|     iosBundleId: 'dev.solsynth.solian', | ||||
|   ); | ||||
|  | ||||
|   | ||||
							
								
								
									
										157
									
								
								lib/main.dart
									
									
									
									
									
								
							
							
						
						| @@ -4,21 +4,22 @@ import 'dart:io'; | ||||
| import 'package:croppy/croppy.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart' hide TextDirection; | ||||
| import 'package:firebase_core/firebase_core.dart'; | ||||
| import 'package:firebase_crashlytics/firebase_crashlytics.dart'; | ||||
| import 'package:firebase_messaging/firebase_messaging.dart'; | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_hooks/flutter_hooks.dart'; | ||||
| import 'package:go_router/go_router.dart'; | ||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||
| import 'package:image_picker_android/image_picker_android.dart'; | ||||
| import 'package:island/firebase_options.dart'; | ||||
| import 'package:island/pods/config.dart'; | ||||
| import 'package:island/pods/network.dart'; | ||||
| import 'package:island/pods/theme.dart'; | ||||
| import 'package:bitsdojo_window/bitsdojo_window.dart'; | ||||
|  | ||||
| import 'package:island/pods/userinfo.dart'; | ||||
| import 'package:island/pods/websocket.dart'; | ||||
| import 'package:island/route.dart'; | ||||
| import 'package:island/screens/tabs.dart'; | ||||
| import 'package:island/services/notify.dart'; | ||||
| import 'package:island/services/timezone.dart'; | ||||
| import 'package:island/widgets/alert.dart'; | ||||
| @@ -28,6 +29,13 @@ import 'package:shared_preferences/shared_preferences.dart'; | ||||
| import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; | ||||
| import 'package:flutter_native_splash/flutter_native_splash.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
| import 'package:window_manager/window_manager.dart'; | ||||
|  | ||||
| @pragma('vm:entry-point') | ||||
| Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { | ||||
|   await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); | ||||
|   log('Handling a background message: ${message.messageId}'); | ||||
| } | ||||
|  | ||||
| void main() async { | ||||
|   final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); | ||||
| @@ -38,11 +46,33 @@ void main() async { | ||||
|     FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); | ||||
|   } | ||||
|  | ||||
|   if (kIsWeb) { | ||||
|     GoRouter.optionURLReflectsImperativeAPIs = true; | ||||
|   } | ||||
|  | ||||
|   try { | ||||
|     await EasyLocalization.ensureInitialized(); | ||||
|     await Firebase.initializeApp( | ||||
|       options: DefaultFirebaseOptions.currentPlatform, | ||||
|     ); | ||||
|  | ||||
|     if (kIsWeb || !Platform.isLinux) { | ||||
|       await Firebase.initializeApp( | ||||
|         options: DefaultFirebaseOptions.currentPlatform, | ||||
|       ); | ||||
|       FirebaseMessaging.onBackgroundMessage( | ||||
|         _firebaseMessagingBackgroundHandler, | ||||
|       ); | ||||
|       // Although previous if case checked this. Still check is web or not | ||||
|       // Otherwise the web platform will broke due to there is no Platform api on the web | ||||
|       // Skip crashlytics setup on debug mode to prevent unexpected report to firebase | ||||
|       if ((kIsWeb || !Platform.isWindows) && !kDebugMode) { | ||||
|         FlutterError.onError = | ||||
|             FirebaseCrashlytics.instance.recordFlutterFatalError; | ||||
|         PlatformDispatcher.instance.onError = (error, stack) { | ||||
|           FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); | ||||
|           return true; | ||||
|         }; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     log("[SplashScreen] Firebase is ready!"); | ||||
|   } catch (err) { | ||||
|     showErrorAlert(err); | ||||
| @@ -59,31 +89,42 @@ void main() async { | ||||
|   final prefs = await SharedPreferences.getInstance(); | ||||
|  | ||||
|   if (!kIsWeb && (Platform.isMacOS || Platform.isLinux || Platform.isWindows)) { | ||||
|     doWhenWindowReady(() { | ||||
|       const defaultSize = Size(360, 640); | ||||
|     await windowManager.ensureInitialized(); | ||||
|  | ||||
|       // Get saved window size from preferences | ||||
|       final savedSizeString = prefs.getString(kAppWindowSize); | ||||
|       Size initialSize = defaultSize; | ||||
|     const defaultSize = Size(360, 640); | ||||
|  | ||||
|       if (savedSizeString != null) { | ||||
|         try { | ||||
|           final parts = savedSizeString.split(','); | ||||
|           if (parts.length == 2) { | ||||
|             final width = double.parse(parts[0]); | ||||
|             final height = double.parse(parts[1]); | ||||
|             initialSize = Size(width, height); | ||||
|           } | ||||
|         } catch (e) { | ||||
|           log("[SplashScreen] Failed to parse saved window size: $e"); | ||||
|           initialSize = defaultSize; | ||||
|     // Get saved window size from preferences | ||||
|     final savedSizeString = prefs.getString(kAppWindowSize); | ||||
|     Size initialSize = defaultSize; | ||||
|  | ||||
|     if (savedSizeString != null) { | ||||
|       try { | ||||
|         final parts = savedSizeString.split(','); | ||||
|         if (parts.length == 2) { | ||||
|           final width = double.parse(parts[0]); | ||||
|           final height = double.parse(parts[1]); | ||||
|           initialSize = Size(width, height); | ||||
|         } | ||||
|       } catch (e) { | ||||
|         log("[SplashScreen] Failed to parse saved window size: $e"); | ||||
|         initialSize = defaultSize; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|       appWindow.minSize = defaultSize; | ||||
|       appWindow.size = initialSize; | ||||
|       appWindow.alignment = Alignment.center; | ||||
|       appWindow.show(); | ||||
|     WindowOptions windowOptions = WindowOptions( | ||||
|       size: initialSize, | ||||
|       center: true, | ||||
|       backgroundColor: Colors.transparent, | ||||
|       skipTaskbar: false, | ||||
|       titleBarStyle: TitleBarStyle.hidden, | ||||
|       windowButtonVisibility: true, | ||||
|     ); | ||||
|     windowManager.waitUntilReadyToShow(windowOptions, () async { | ||||
|       await windowManager.setMinimumSize(defaultSize); | ||||
|       await windowManager.show(); | ||||
|       await windowManager.focus(); | ||||
|       final opacity = prefs.getDouble(kAppWindowOpacity) ?? 1.0; | ||||
|       await windowManager.setOpacity(opacity); | ||||
|       log( | ||||
|         "[SplashScreen] Desktop window is ready with size: ${initialSize.width}x${initialSize.height}", | ||||
|       ); | ||||
| @@ -125,7 +166,7 @@ void main() async { | ||||
|   ); | ||||
| } | ||||
|  | ||||
| final appRouter = AppRouter(); | ||||
| // Router will be provided through Riverpod | ||||
|  | ||||
| final globalOverlay = GlobalKey<OverlayState>(); | ||||
|  | ||||
| @@ -137,11 +178,12 @@ class IslandApp extends HookConsumerWidget { | ||||
|     final theme = ref.watch(themeProvider); | ||||
|  | ||||
|     void handleMessage(RemoteMessage notification) { | ||||
|       if (notification.data['action_uri'] != null) { | ||||
|         var uri = notification.data['action_uri'] as String; | ||||
|       if (notification.data['meta']?['action_uri'] != null) { | ||||
|         var uri = notification.data['meta']['action_uri'] as String; | ||||
|         if (uri.startsWith('/')) { | ||||
|           // In-app routes | ||||
|           appRouter.pushPath(notification.data['action_uri']); | ||||
|           final router = ref.read(routerProvider); | ||||
|           router.push(notification.data['meta']['action_uri']); | ||||
|         } else { | ||||
|           // External links | ||||
|           launchUrlString(uri); | ||||
| @@ -150,17 +192,34 @@ class IslandApp extends HookConsumerWidget { | ||||
|     } | ||||
|  | ||||
|     useEffect(() { | ||||
|       Future(() async { | ||||
|         RemoteMessage? initialMessage = | ||||
|             await FirebaseMessaging.instance.getInitialMessage(); | ||||
|         if (initialMessage != null) { | ||||
|           handleMessage(initialMessage); | ||||
|         } | ||||
|       if (!kIsWeb && (Platform.isLinux || Platform.isWindows)) { | ||||
|         return null; | ||||
|       } | ||||
|  | ||||
|         FirebaseMessaging.onMessageOpenedApp.listen(handleMessage); | ||||
|       // When the app is opened from a terminated state. | ||||
|       FirebaseMessaging.instance.getInitialMessage().then((message) { | ||||
|         if (message != null) { | ||||
|           handleMessage(message); | ||||
|         } | ||||
|       }); | ||||
|  | ||||
|       return null; | ||||
|       // When the app is in the background and opened. | ||||
|       final onMessageOpenedAppSubscription = FirebaseMessaging | ||||
|           .onMessageOpenedApp | ||||
|           .listen(handleMessage); | ||||
|  | ||||
|       // When the app is in the foreground. | ||||
|       final onMessageSubscription = FirebaseMessaging.onMessage.listen(( | ||||
|         message, | ||||
|       ) { | ||||
|         log('Foreground message received: ${message.messageId}'); | ||||
|         handleMessage(message); | ||||
|       }); | ||||
|  | ||||
|       return () { | ||||
|         onMessageOpenedAppSubscription.cancel(); | ||||
|         onMessageSubscription.cancel(); | ||||
|       }; | ||||
|     }, []); | ||||
|  | ||||
|     useEffect(() { | ||||
| @@ -172,9 +231,10 @@ class IslandApp extends HookConsumerWidget { | ||||
|       Future(() { | ||||
|         userNotifier.fetchUser().then((_) { | ||||
|           final user = ref.watch(userInfoProvider); | ||||
|           if (user.hasValue) { | ||||
|           if (user.value != null) { | ||||
|             final apiClient = ref.read(apiClientProvider); | ||||
|             subscribePushNotification(apiClient); | ||||
|             initializeLocalNotifications(); | ||||
|             final wsNotifier = ref.read(websocketStateProvider.notifier); | ||||
|             wsNotifier.connect(); | ||||
|           } | ||||
| @@ -183,21 +243,16 @@ class IslandApp extends HookConsumerWidget { | ||||
|       return null; | ||||
|     }, []); | ||||
|  | ||||
|     final router = ref.watch(routerProvider); | ||||
|  | ||||
|     return MaterialApp.router( | ||||
|       color: Colors.transparent, | ||||
|       theme: theme?.light, | ||||
|       darkTheme: theme?.dark, | ||||
|       themeMode: ThemeMode.system, | ||||
|       routerConfig: appRouter.config( | ||||
|         navigatorObservers: | ||||
|             () => [ | ||||
|               TabNavigationObserver( | ||||
|                 onChange: (route) { | ||||
|                   ref.read(currentRouteProvider.notifier).state = route; | ||||
|                 }, | ||||
|               ), | ||||
|             ], | ||||
|       ), | ||||
|       routerConfig: router, | ||||
|       supportedLocales: context.supportedLocales, | ||||
|       scrollBehavior: AppScrollBehavior(), | ||||
|       localizationsDelegates: [ | ||||
|         ...context.localizationDelegates, | ||||
|         CroppyLocalizations.delegate, | ||||
| @@ -210,10 +265,8 @@ class IslandApp extends HookConsumerWidget { | ||||
|           initialEntries: [ | ||||
|             OverlayEntry( | ||||
|               builder: | ||||
|                   (_) => WindowScaffold( | ||||
|                     router: appRouter, | ||||
|                     child: child ?? const SizedBox.shrink(), | ||||
|                   ), | ||||
|                   (_) => | ||||
|                       WindowScaffold(child: child ?? const SizedBox.shrink()), | ||||
|             ), | ||||
|           ], | ||||
|         ); | ||||
|   | ||||
							
								
								
									
										23
									
								
								lib/models/abuse_report.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
|  | ||||
| part 'abuse_report.freezed.dart'; | ||||
| part 'abuse_report.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnAbuseReport with _$SnAbuseReport { | ||||
|   const factory SnAbuseReport({ | ||||
|     required String id, | ||||
|     required String resourceIdentifier, | ||||
|     required int type, | ||||
|     required String reason, | ||||
|     required DateTime? resolvedAt, | ||||
|     required String? resolution, | ||||
|     required String accountId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
|   }) = _SnAbuseReport; | ||||
|  | ||||
|   factory SnAbuseReport.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnAbuseReportFromJson(json); | ||||
| } | ||||
							
								
								
									
										298
									
								
								lib/models/abuse_report.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,298 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| part of 'abuse_report.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // FreezedGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnAbuseReport { | ||||
|  | ||||
|  String get id; String get resourceIdentifier; int get type; String get reason; DateTime? get resolvedAt; String? get resolution; String get accountId; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
| /// Create a copy of SnAbuseReport | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnAbuseReportCopyWith<SnAbuseReport> get copyWith => _$SnAbuseReportCopyWithImpl<SnAbuseReport>(this as SnAbuseReport, _$identity); | ||||
|  | ||||
|   /// Serializes this SnAbuseReport to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnAbuseReport&&(identical(other.id, id) || other.id == id)&&(identical(other.resourceIdentifier, resourceIdentifier) || other.resourceIdentifier == resourceIdentifier)&&(identical(other.type, type) || other.type == type)&&(identical(other.reason, reason) || other.reason == reason)&&(identical(other.resolvedAt, resolvedAt) || other.resolvedAt == resolvedAt)&&(identical(other.resolution, resolution) || other.resolution == resolution)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,resourceIdentifier,type,reason,resolvedAt,resolution,accountId,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnAbuseReport(id: $id, resourceIdentifier: $resourceIdentifier, type: $type, reason: $reason, resolvedAt: $resolvedAt, resolution: $resolution, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnAbuseReportCopyWith<$Res>  { | ||||
|   factory $SnAbuseReportCopyWith(SnAbuseReport value, $Res Function(SnAbuseReport) _then) = _$SnAbuseReportCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String resourceIdentifier, int type, String reason, DateTime? resolvedAt, String? resolution, String accountId, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnAbuseReportCopyWithImpl<$Res> | ||||
|     implements $SnAbuseReportCopyWith<$Res> { | ||||
|   _$SnAbuseReportCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnAbuseReport _self; | ||||
|   final $Res Function(SnAbuseReport) _then; | ||||
|  | ||||
| /// Create a copy of SnAbuseReport | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? resourceIdentifier = null,Object? type = null,Object? reason = null,Object? resolvedAt = freezed,Object? resolution = freezed,Object? accountId = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,resourceIdentifier: null == resourceIdentifier ? _self.resourceIdentifier : resourceIdentifier // ignore: cast_nullable_to_non_nullable | ||||
| as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as int,reason: null == reason ? _self.reason : reason // ignore: cast_nullable_to_non_nullable | ||||
| as String,resolvedAt: freezed == resolvedAt ? _self.resolvedAt : resolvedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,resolution: freezed == resolution ? _self.resolution : resolution // ignore: cast_nullable_to_non_nullable | ||||
| as String?,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable | ||||
| as String,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnAbuseReport]. | ||||
| extension SnAbuseReportPatterns on SnAbuseReport { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnAbuseReport value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnAbuseReport value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnAbuseReport value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport(): | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnAbuseReport implements SnAbuseReport { | ||||
|   const _SnAbuseReport({required this.id, required this.resourceIdentifier, required this.type, required this.reason, required this.resolvedAt, required this.resolution, required this.accountId, required this.createdAt, required this.updatedAt, required this.deletedAt}); | ||||
|   factory _SnAbuseReport.fromJson(Map<String, dynamic> json) => _$SnAbuseReportFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String resourceIdentifier; | ||||
| @override final  int type; | ||||
| @override final  String reason; | ||||
| @override final  DateTime? resolvedAt; | ||||
| @override final  String? resolution; | ||||
| @override final  String accountId; | ||||
| @override final  DateTime createdAt; | ||||
| @override final  DateTime updatedAt; | ||||
| @override final  DateTime? deletedAt; | ||||
|  | ||||
| /// Create a copy of SnAbuseReport | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnAbuseReportCopyWith<_SnAbuseReport> get copyWith => __$SnAbuseReportCopyWithImpl<_SnAbuseReport>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnAbuseReportToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnAbuseReport&&(identical(other.id, id) || other.id == id)&&(identical(other.resourceIdentifier, resourceIdentifier) || other.resourceIdentifier == resourceIdentifier)&&(identical(other.type, type) || other.type == type)&&(identical(other.reason, reason) || other.reason == reason)&&(identical(other.resolvedAt, resolvedAt) || other.resolvedAt == resolvedAt)&&(identical(other.resolution, resolution) || other.resolution == resolution)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,resourceIdentifier,type,reason,resolvedAt,resolution,accountId,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnAbuseReport(id: $id, resourceIdentifier: $resourceIdentifier, type: $type, reason: $reason, resolvedAt: $resolvedAt, resolution: $resolution, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnAbuseReportCopyWith<$Res> implements $SnAbuseReportCopyWith<$Res> { | ||||
|   factory _$SnAbuseReportCopyWith(_SnAbuseReport value, $Res Function(_SnAbuseReport) _then) = __$SnAbuseReportCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String resourceIdentifier, int type, String reason, DateTime? resolvedAt, String? resolution, String accountId, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnAbuseReportCopyWithImpl<$Res> | ||||
|     implements _$SnAbuseReportCopyWith<$Res> { | ||||
|   __$SnAbuseReportCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnAbuseReport _self; | ||||
|   final $Res Function(_SnAbuseReport) _then; | ||||
|  | ||||
| /// Create a copy of SnAbuseReport | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? resourceIdentifier = null,Object? type = null,Object? reason = null,Object? resolvedAt = freezed,Object? resolution = freezed,Object? accountId = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_SnAbuseReport( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,resourceIdentifier: null == resourceIdentifier ? _self.resourceIdentifier : resourceIdentifier // ignore: cast_nullable_to_non_nullable | ||||
| as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as int,reason: null == reason ? _self.reason : reason // ignore: cast_nullable_to_non_nullable | ||||
| as String,resolvedAt: freezed == resolvedAt ? _self.resolvedAt : resolvedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,resolution: freezed == resolution ? _self.resolution : resolution // ignore: cast_nullable_to_non_nullable | ||||
| as String?,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable | ||||
| as String,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
							
								
								
									
										41
									
								
								lib/models/abuse_report.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'abuse_report.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnAbuseReport _$SnAbuseReportFromJson(Map<String, dynamic> json) => | ||||
|     _SnAbuseReport( | ||||
|       id: json['id'] as String, | ||||
|       resourceIdentifier: json['resource_identifier'] as String, | ||||
|       type: (json['type'] as num).toInt(), | ||||
|       reason: json['reason'] as String, | ||||
|       resolvedAt: | ||||
|           json['resolved_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['resolved_at'] as String), | ||||
|       resolution: json['resolution'] as String?, | ||||
|       accountId: json['account_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
|           json['deleted_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['deleted_at'] as String), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnAbuseReportToJson(_SnAbuseReport instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'resource_identifier': instance.resourceIdentifier, | ||||
|       'type': instance.type, | ||||
|       'reason': instance.reason, | ||||
|       'resolved_at': instance.resolvedAt?.toIso8601String(), | ||||
|       'resolution': instance.resolution, | ||||
|       'account_id': instance.accountId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|     }; | ||||
							
								
								
									
										38
									
								
								lib/models/abuse_report_type.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,38 @@ | ||||
| enum AbuseReportType { | ||||
|   copyright(0), | ||||
|   harassment(1), | ||||
|   impersonation(2), | ||||
|   offensiveContent(3), | ||||
|   spam(4), | ||||
|   privacyViolation(5), | ||||
|   illegalContent(6), | ||||
|   other(7); | ||||
|  | ||||
|   const AbuseReportType(this.value); | ||||
|   final int value; | ||||
|  | ||||
|   static AbuseReportType fromValue(int value) { | ||||
|     return values.firstWhere((e) => e.value == value); | ||||
|   } | ||||
|  | ||||
|   String get displayName { | ||||
|     switch (this) { | ||||
|       case AbuseReportType.copyright: | ||||
|         return 'Copyright'; | ||||
|       case AbuseReportType.harassment: | ||||
|         return 'Harassment'; | ||||
|       case AbuseReportType.impersonation: | ||||
|         return 'Impersonation'; | ||||
|       case AbuseReportType.offensiveContent: | ||||
|         return 'Offensive Content'; | ||||
|       case AbuseReportType.spam: | ||||
|         return 'Spam'; | ||||
|       case AbuseReportType.privacyViolation: | ||||
|         return 'Privacy Violation'; | ||||
|       case AbuseReportType.illegalContent: | ||||
|         return 'Illegal Content'; | ||||
|       case AbuseReportType.other: | ||||
|         return 'Other'; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,9 +1,10 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/auth.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
| import 'package:island/models/wallet.dart'; | ||||
| 
 | ||||
| part 'user.freezed.dart'; | ||||
| part 'user.g.dart'; | ||||
| part 'account.freezed.dart'; | ||||
| part 'account.g.dart'; | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnAccount with _$SnAccount { | ||||
| @@ -12,9 +13,13 @@ sealed class SnAccount with _$SnAccount { | ||||
|     required String name, | ||||
|     required String nick, | ||||
|     required String language, | ||||
|     @Default("") String region, | ||||
|     required bool isSuperuser, | ||||
|     required String? automatedId, | ||||
|     required SnAccountProfile profile, | ||||
|     required SnWalletSubscriptionRef? perkSubscription, | ||||
|     @Default([]) List<SnAccountBadge> badges, | ||||
|     @Default([]) List<SnContactMethod> contacts, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
| @@ -24,6 +29,32 @@ sealed class SnAccount with _$SnAccount { | ||||
|       _$SnAccountFromJson(json); | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class ProfileLink with _$ProfileLink { | ||||
|   const factory ProfileLink({required String name, required String url}) = | ||||
|       _ProfileLink; | ||||
| 
 | ||||
|   factory ProfileLink.fromJson(Map<String, dynamic> json) => | ||||
|       _$ProfileLinkFromJson(json); | ||||
| } | ||||
| 
 | ||||
| class ProfileLinkConverter | ||||
|     implements JsonConverter<List<ProfileLink>, dynamic> { | ||||
|   const ProfileLinkConverter(); | ||||
| 
 | ||||
|   @override | ||||
|   List<ProfileLink> fromJson(dynamic json) { | ||||
|     return json is List<dynamic> | ||||
|         ? json.map((e) => ProfileLink.fromJson(e)).cast<ProfileLink>().toList() | ||||
|         : <ProfileLink>[]; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   List<dynamic> toJson(List<ProfileLink> object) { | ||||
|     return object.map((e) => e.toJson()).toList(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnAccountProfile with _$SnAccountProfile { | ||||
|   const factory SnAccountProfile({ | ||||
| @@ -37,15 +68,17 @@ sealed class SnAccountProfile with _$SnAccountProfile { | ||||
|     @Default('') String location, | ||||
|     @Default('') String timeZone, | ||||
|     DateTime? birthday, | ||||
|     @ProfileLinkConverter() @Default([]) List<ProfileLink> links, | ||||
|     DateTime? lastSeenAt, | ||||
|     SnAccountBadge? activeBadge, | ||||
|     required int experience, | ||||
|     required int level, | ||||
|     @Default(100) double socialCredits, | ||||
|     @Default(0) int socialCreditsLevel, | ||||
|     required double levelingProgress, | ||||
|     required SnCloudFile? picture, | ||||
|     required SnCloudFile? background, | ||||
|     required SnVerificationMark? verification, | ||||
|     required SnWalletSubscriptionRef? stellarMembership, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
| @@ -65,6 +98,7 @@ sealed class SnAccountStatus with _$SnAccountStatus { | ||||
|     required bool isNotDisturb, | ||||
|     required bool isCustomized, | ||||
|     @Default("") String label, | ||||
|     required Map<String, dynamic>? meta, | ||||
|     required DateTime? clearedAt, | ||||
|     required String accountId, | ||||
|     required DateTime createdAt, | ||||
| @@ -103,6 +137,7 @@ sealed class SnContactMethod with _$SnContactMethod { | ||||
|     required int type, | ||||
|     required DateTime? verifiedAt, | ||||
|     required bool isPrimary, | ||||
|     required bool isPublic, | ||||
|     required String content, | ||||
|     required String accountId, | ||||
|     required DateTime createdAt, | ||||
| @@ -147,3 +182,70 @@ sealed class SnVerificationMark with _$SnVerificationMark { | ||||
|   factory SnVerificationMark.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnVerificationMarkFromJson(json); | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnAuthDevice with _$SnAuthDevice { | ||||
|   const factory SnAuthDevice({ | ||||
|     required String id, | ||||
|     required String deviceId, | ||||
|     required String deviceName, | ||||
|     required String? deviceLabel, | ||||
|     required String accountId, | ||||
|     required int platform, | ||||
|     @Default(false) bool isCurrent, | ||||
|   }) = _SnAuthDevice; | ||||
| 
 | ||||
|   factory SnAuthDevice.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnAuthDeviceFromJson(json); | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnAuthDeviceWithChallenge with _$SnAuthDeviceWithChallenge { | ||||
|   const factory SnAuthDeviceWithChallenge({ | ||||
|     required String id, | ||||
|     required String deviceId, | ||||
|     required String deviceName, | ||||
|     required String? deviceLabel, | ||||
|     required String accountId, | ||||
|     required int platform, | ||||
|     required List<SnAuthChallenge> challenges, | ||||
|     @Default(false) bool isCurrent, | ||||
|   }) = _SnAuthDeviceWithChallengee; | ||||
| 
 | ||||
|   factory SnAuthDeviceWithChallenge.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnAuthDeviceWithChallengeFromJson(json); | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnExperienceRecord with _$SnExperienceRecord { | ||||
|   const factory SnExperienceRecord({ | ||||
|     required String id, | ||||
|     required int delta, | ||||
|     required String reasonType, | ||||
|     required String reason, | ||||
|     @Default(1.0) double? bonusMultiplier, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
|   }) = _SnExperienceRecord; | ||||
| 
 | ||||
|   factory SnExperienceRecord.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnExperienceRecordFromJson(json); | ||||
| } | ||||
| 
 | ||||
| @freezed | ||||
| sealed class SnSocialCreditRecord with _$SnSocialCreditRecord { | ||||
|   const factory SnSocialCreditRecord({ | ||||
|     required String id, | ||||
|     required double delta, | ||||
|     required String reasonType, | ||||
|     required String reason, | ||||
|     required DateTime? expiredAt, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
|   }) = _SnSocialCreditRecord; | ||||
| 
 | ||||
|   factory SnSocialCreditRecord.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnSocialCreditRecordFromJson(json); | ||||
| } | ||||
							
								
								
									
										3614
									
								
								lib/models/account.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -1,6 +1,6 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| 
 | ||||
| part of 'user.dart'; | ||||
| part of 'account.dart'; | ||||
| 
 | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| @@ -11,13 +11,26 @@ _SnAccount _$SnAccountFromJson(Map<String, dynamic> json) => _SnAccount( | ||||
|   name: json['name'] as String, | ||||
|   nick: json['nick'] as String, | ||||
|   language: json['language'] as String, | ||||
|   region: json['region'] as String? ?? "", | ||||
|   isSuperuser: json['is_superuser'] as bool, | ||||
|   automatedId: json['automated_id'] as String?, | ||||
|   profile: SnAccountProfile.fromJson(json['profile'] as Map<String, dynamic>), | ||||
|   perkSubscription: | ||||
|       json['perk_subscription'] == null | ||||
|           ? null | ||||
|           : SnWalletSubscriptionRef.fromJson( | ||||
|             json['perk_subscription'] as Map<String, dynamic>, | ||||
|           ), | ||||
|   badges: | ||||
|       (json['badges'] as List<dynamic>?) | ||||
|           ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   contacts: | ||||
|       (json['contacts'] as List<dynamic>?) | ||||
|           ?.map((e) => SnContactMethod.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   createdAt: DateTime.parse(json['created_at'] as String), | ||||
|   updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|   deletedAt: | ||||
| @@ -32,14 +45,24 @@ Map<String, dynamic> _$SnAccountToJson(_SnAccount instance) => | ||||
|       'name': instance.name, | ||||
|       'nick': instance.nick, | ||||
|       'language': instance.language, | ||||
|       'region': instance.region, | ||||
|       'is_superuser': instance.isSuperuser, | ||||
|       'automated_id': instance.automatedId, | ||||
|       'profile': instance.profile.toJson(), | ||||
|       'perk_subscription': instance.perkSubscription?.toJson(), | ||||
|       'badges': instance.badges.map((e) => e.toJson()).toList(), | ||||
|       'contacts': instance.contacts.map((e) => e.toJson()).toList(), | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|     }; | ||||
| 
 | ||||
| _ProfileLink _$ProfileLinkFromJson(Map<String, dynamic> json) => | ||||
|     _ProfileLink(name: json['name'] as String, url: json['url'] as String); | ||||
| 
 | ||||
| Map<String, dynamic> _$ProfileLinkToJson(_ProfileLink instance) => | ||||
|     <String, dynamic>{'name': instance.name, 'url': instance.url}; | ||||
| 
 | ||||
| _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|     _SnAccountProfile( | ||||
|       id: json['id'] as String, | ||||
| @@ -55,6 +78,10 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|           json['birthday'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['birthday'] as String), | ||||
|       links: | ||||
|           json['links'] == null | ||||
|               ? const [] | ||||
|               : const ProfileLinkConverter().fromJson(json['links']), | ||||
|       lastSeenAt: | ||||
|           json['last_seen_at'] == null | ||||
|               ? null | ||||
| @@ -67,6 +94,8 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|               ), | ||||
|       experience: (json['experience'] as num).toInt(), | ||||
|       level: (json['level'] as num).toInt(), | ||||
|       socialCredits: (json['social_credits'] as num?)?.toDouble() ?? 100, | ||||
|       socialCreditsLevel: (json['social_credits_level'] as num?)?.toInt() ?? 0, | ||||
|       levelingProgress: (json['leveling_progress'] as num).toDouble(), | ||||
|       picture: | ||||
|           json['picture'] == null | ||||
| @@ -84,12 +113,6 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|               : SnVerificationMark.fromJson( | ||||
|                 json['verification'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       stellarMembership: | ||||
|           json['stellar_membership'] == null | ||||
|               ? null | ||||
|               : SnWalletSubscriptionRef.fromJson( | ||||
|                 json['stellar_membership'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
| @@ -110,15 +133,17 @@ Map<String, dynamic> _$SnAccountProfileToJson(_SnAccountProfile instance) => | ||||
|       'location': instance.location, | ||||
|       'time_zone': instance.timeZone, | ||||
|       'birthday': instance.birthday?.toIso8601String(), | ||||
|       'links': const ProfileLinkConverter().toJson(instance.links), | ||||
|       'last_seen_at': instance.lastSeenAt?.toIso8601String(), | ||||
|       'active_badge': instance.activeBadge?.toJson(), | ||||
|       'experience': instance.experience, | ||||
|       'level': instance.level, | ||||
|       'social_credits': instance.socialCredits, | ||||
|       'social_credits_level': instance.socialCreditsLevel, | ||||
|       'leveling_progress': instance.levelingProgress, | ||||
|       'picture': instance.picture?.toJson(), | ||||
|       'background': instance.background?.toJson(), | ||||
|       'verification': instance.verification?.toJson(), | ||||
|       'stellar_membership': instance.stellarMembership?.toJson(), | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
| @@ -133,6 +158,7 @@ _SnAccountStatus _$SnAccountStatusFromJson(Map<String, dynamic> json) => | ||||
|       isNotDisturb: json['is_not_disturb'] as bool, | ||||
|       isCustomized: json['is_customized'] as bool, | ||||
|       label: json['label'] as String? ?? "", | ||||
|       meta: json['meta'] as Map<String, dynamic>?, | ||||
|       clearedAt: | ||||
|           json['cleared_at'] == null | ||||
|               ? null | ||||
| @@ -155,6 +181,7 @@ Map<String, dynamic> _$SnAccountStatusToJson(_SnAccountStatus instance) => | ||||
|       'is_not_disturb': instance.isNotDisturb, | ||||
|       'is_customized': instance.isCustomized, | ||||
|       'label': instance.label, | ||||
|       'meta': instance.meta, | ||||
|       'cleared_at': instance.clearedAt?.toIso8601String(), | ||||
|       'account_id': instance.accountId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
| @@ -210,6 +237,7 @@ _SnContactMethod _$SnContactMethodFromJson(Map<String, dynamic> json) => | ||||
|               ? null | ||||
|               : DateTime.parse(json['verified_at'] as String), | ||||
|       isPrimary: json['is_primary'] as bool, | ||||
|       isPublic: json['is_public'] as bool, | ||||
|       content: json['content'] as String, | ||||
|       accountId: json['account_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
| @@ -226,6 +254,7 @@ Map<String, dynamic> _$SnContactMethodToJson(_SnContactMethod instance) => | ||||
|       'type': instance.type, | ||||
|       'verified_at': instance.verifiedAt?.toIso8601String(), | ||||
|       'is_primary': instance.isPrimary, | ||||
|       'is_public': instance.isPublic, | ||||
|       'content': instance.content, | ||||
|       'account_id': instance.accountId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
| @@ -286,3 +315,113 @@ Map<String, dynamic> _$SnVerificationMarkToJson(_SnVerificationMark instance) => | ||||
|       'description': instance.description, | ||||
|       'verified_by': instance.verifiedBy, | ||||
|     }; | ||||
| 
 | ||||
| _SnAuthDevice _$SnAuthDeviceFromJson(Map<String, dynamic> json) => | ||||
|     _SnAuthDevice( | ||||
|       id: json['id'] as String, | ||||
|       deviceId: json['device_id'] as String, | ||||
|       deviceName: json['device_name'] as String, | ||||
|       deviceLabel: json['device_label'] as String?, | ||||
|       accountId: json['account_id'] as String, | ||||
|       platform: (json['platform'] as num).toInt(), | ||||
|       isCurrent: json['is_current'] as bool? ?? false, | ||||
|     ); | ||||
| 
 | ||||
| Map<String, dynamic> _$SnAuthDeviceToJson(_SnAuthDevice instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'device_id': instance.deviceId, | ||||
|       'device_name': instance.deviceName, | ||||
|       'device_label': instance.deviceLabel, | ||||
|       'account_id': instance.accountId, | ||||
|       'platform': instance.platform, | ||||
|       'is_current': instance.isCurrent, | ||||
|     }; | ||||
| 
 | ||||
| _SnAuthDeviceWithChallengee _$SnAuthDeviceWithChallengeeFromJson( | ||||
|   Map<String, dynamic> json, | ||||
| ) => _SnAuthDeviceWithChallengee( | ||||
|   id: json['id'] as String, | ||||
|   deviceId: json['device_id'] as String, | ||||
|   deviceName: json['device_name'] as String, | ||||
|   deviceLabel: json['device_label'] as String?, | ||||
|   accountId: json['account_id'] as String, | ||||
|   platform: (json['platform'] as num).toInt(), | ||||
|   challenges: | ||||
|       (json['challenges'] as List<dynamic>) | ||||
|           .map((e) => SnAuthChallenge.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList(), | ||||
|   isCurrent: json['is_current'] as bool? ?? false, | ||||
| ); | ||||
| 
 | ||||
| Map<String, dynamic> _$SnAuthDeviceWithChallengeeToJson( | ||||
|   _SnAuthDeviceWithChallengee instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'id': instance.id, | ||||
|   'device_id': instance.deviceId, | ||||
|   'device_name': instance.deviceName, | ||||
|   'device_label': instance.deviceLabel, | ||||
|   'account_id': instance.accountId, | ||||
|   'platform': instance.platform, | ||||
|   'challenges': instance.challenges.map((e) => e.toJson()).toList(), | ||||
|   'is_current': instance.isCurrent, | ||||
| }; | ||||
| 
 | ||||
| _SnExperienceRecord _$SnExperienceRecordFromJson(Map<String, dynamic> json) => | ||||
|     _SnExperienceRecord( | ||||
|       id: json['id'] as String, | ||||
|       delta: (json['delta'] as num).toInt(), | ||||
|       reasonType: json['reason_type'] as String, | ||||
|       reason: json['reason'] as String, | ||||
|       bonusMultiplier: (json['bonus_multiplier'] as num?)?.toDouble() ?? 1.0, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
|           json['deleted_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['deleted_at'] as String), | ||||
|     ); | ||||
| 
 | ||||
| Map<String, dynamic> _$SnExperienceRecordToJson(_SnExperienceRecord instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'delta': instance.delta, | ||||
|       'reason_type': instance.reasonType, | ||||
|       'reason': instance.reason, | ||||
|       'bonus_multiplier': instance.bonusMultiplier, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|     }; | ||||
| 
 | ||||
| _SnSocialCreditRecord _$SnSocialCreditRecordFromJson( | ||||
|   Map<String, dynamic> json, | ||||
| ) => _SnSocialCreditRecord( | ||||
|   id: json['id'] as String, | ||||
|   delta: (json['delta'] as num).toDouble(), | ||||
|   reasonType: json['reason_type'] as String, | ||||
|   reason: json['reason'] as String, | ||||
|   expiredAt: | ||||
|       json['expired_at'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['expired_at'] as String), | ||||
|   createdAt: DateTime.parse(json['created_at'] as String), | ||||
|   updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|   deletedAt: | ||||
|       json['deleted_at'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['deleted_at'] as String), | ||||
| ); | ||||
| 
 | ||||
| Map<String, dynamic> _$SnSocialCreditRecordToJson( | ||||
|   _SnSocialCreditRecord instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'id': instance.id, | ||||
|   'delta': instance.delta, | ||||
|   'reason_type': instance.reasonType, | ||||
|   'reason': instance.reason, | ||||
|   'expired_at': instance.expiredAt?.toIso8601String(), | ||||
|   'created_at': instance.createdAt.toIso8601String(), | ||||
|   'updated_at': instance.updatedAt.toIso8601String(), | ||||
|   'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
| }; | ||||
| @@ -1,9 +1,23 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/user.dart'; | ||||
| import 'package:island/models/account.dart'; | ||||
|  | ||||
| part 'activity.freezed.dart'; | ||||
| part 'activity.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnNotableDay with _$SnNotableDay { | ||||
|   const factory SnNotableDay({ | ||||
|     required DateTime date, | ||||
|     required String localName, | ||||
|     required String globalName, | ||||
|     required String countryCode, | ||||
|     required List<int> holidays, | ||||
|   }) = _SnNotableDay; | ||||
|  | ||||
|   factory SnNotableDay.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnNotableDayFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnActivity with _$SnActivity { | ||||
|   const factory SnActivity({ | ||||
| @@ -54,7 +68,7 @@ sealed class SnEventCalendarEntry with _$SnEventCalendarEntry { | ||||
|   const factory SnEventCalendarEntry({ | ||||
|     required DateTime date, | ||||
|     required SnCheckInResult? checkInResult, | ||||
|     required List<dynamic> statuses, | ||||
|     required List<SnAccountStatus> statuses, | ||||
|   }) = _SnEventCalendarEntry; | ||||
|  | ||||
|   factory SnEventCalendarEntry.fromJson(Map<String, dynamic> json) => | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -13,6 +12,281 @@ part of 'activity.dart'; | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnNotableDay { | ||||
|  | ||||
|  DateTime get date; String get localName; String get globalName; String get countryCode; List<int> get holidays; | ||||
| /// Create a copy of SnNotableDay | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnNotableDayCopyWith<SnNotableDay> get copyWith => _$SnNotableDayCopyWithImpl<SnNotableDay>(this as SnNotableDay, _$identity); | ||||
|  | ||||
|   /// Serializes this SnNotableDay to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnNotableDay&&(identical(other.date, date) || other.date == date)&&(identical(other.localName, localName) || other.localName == localName)&&(identical(other.globalName, globalName) || other.globalName == globalName)&&(identical(other.countryCode, countryCode) || other.countryCode == countryCode)&&const DeepCollectionEquality().equals(other.holidays, holidays)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,date,localName,globalName,countryCode,const DeepCollectionEquality().hash(holidays)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnNotableDay(date: $date, localName: $localName, globalName: $globalName, countryCode: $countryCode, holidays: $holidays)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnNotableDayCopyWith<$Res>  { | ||||
|   factory $SnNotableDayCopyWith(SnNotableDay value, $Res Function(SnNotableDay) _then) = _$SnNotableDayCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  DateTime date, String localName, String globalName, String countryCode, List<int> holidays | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnNotableDayCopyWithImpl<$Res> | ||||
|     implements $SnNotableDayCopyWith<$Res> { | ||||
|   _$SnNotableDayCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnNotableDay _self; | ||||
|   final $Res Function(SnNotableDay) _then; | ||||
|  | ||||
| /// Create a copy of SnNotableDay | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? date = null,Object? localName = null,Object? globalName = null,Object? countryCode = null,Object? holidays = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| date: null == date ? _self.date : date // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,localName: null == localName ? _self.localName : localName // ignore: cast_nullable_to_non_nullable | ||||
| as String,globalName: null == globalName ? _self.globalName : globalName // ignore: cast_nullable_to_non_nullable | ||||
| as String,countryCode: null == countryCode ? _self.countryCode : countryCode // ignore: cast_nullable_to_non_nullable | ||||
| as String,holidays: null == holidays ? _self.holidays : holidays // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnNotableDay]. | ||||
| extension SnNotableDayPatterns on SnNotableDay { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnNotableDay value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnNotableDay value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnNotableDay value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( DateTime date,  String localName,  String globalName,  String countryCode,  List<int> holidays)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay() when $default != null: | ||||
| return $default(_that.date,_that.localName,_that.globalName,_that.countryCode,_that.holidays);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( DateTime date,  String localName,  String globalName,  String countryCode,  List<int> holidays)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay(): | ||||
| return $default(_that.date,_that.localName,_that.globalName,_that.countryCode,_that.holidays);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( DateTime date,  String localName,  String globalName,  String countryCode,  List<int> holidays)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnNotableDay() when $default != null: | ||||
| return $default(_that.date,_that.localName,_that.globalName,_that.countryCode,_that.holidays);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnNotableDay implements SnNotableDay { | ||||
|   const _SnNotableDay({required this.date, required this.localName, required this.globalName, required this.countryCode, required final  List<int> holidays}): _holidays = holidays; | ||||
|   factory _SnNotableDay.fromJson(Map<String, dynamic> json) => _$SnNotableDayFromJson(json); | ||||
|  | ||||
| @override final  DateTime date; | ||||
| @override final  String localName; | ||||
| @override final  String globalName; | ||||
| @override final  String countryCode; | ||||
|  final  List<int> _holidays; | ||||
| @override List<int> get holidays { | ||||
|   if (_holidays is EqualUnmodifiableListView) return _holidays; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_holidays); | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Create a copy of SnNotableDay | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnNotableDayCopyWith<_SnNotableDay> get copyWith => __$SnNotableDayCopyWithImpl<_SnNotableDay>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnNotableDayToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnNotableDay&&(identical(other.date, date) || other.date == date)&&(identical(other.localName, localName) || other.localName == localName)&&(identical(other.globalName, globalName) || other.globalName == globalName)&&(identical(other.countryCode, countryCode) || other.countryCode == countryCode)&&const DeepCollectionEquality().equals(other._holidays, _holidays)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,date,localName,globalName,countryCode,const DeepCollectionEquality().hash(_holidays)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnNotableDay(date: $date, localName: $localName, globalName: $globalName, countryCode: $countryCode, holidays: $holidays)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnNotableDayCopyWith<$Res> implements $SnNotableDayCopyWith<$Res> { | ||||
|   factory _$SnNotableDayCopyWith(_SnNotableDay value, $Res Function(_SnNotableDay) _then) = __$SnNotableDayCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  DateTime date, String localName, String globalName, String countryCode, List<int> holidays | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnNotableDayCopyWithImpl<$Res> | ||||
|     implements _$SnNotableDayCopyWith<$Res> { | ||||
|   __$SnNotableDayCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnNotableDay _self; | ||||
|   final $Res Function(_SnNotableDay) _then; | ||||
|  | ||||
| /// Create a copy of SnNotableDay | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? date = null,Object? localName = null,Object? globalName = null,Object? countryCode = null,Object? holidays = null,}) { | ||||
|   return _then(_SnNotableDay( | ||||
| date: null == date ? _self.date : date // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,localName: null == localName ? _self.localName : localName // ignore: cast_nullable_to_non_nullable | ||||
| as String,globalName: null == globalName ? _self.globalName : globalName // ignore: cast_nullable_to_non_nullable | ||||
| as String,countryCode: null == countryCode ? _self.countryCode : countryCode // ignore: cast_nullable_to_non_nullable | ||||
| as String,holidays: null == holidays ? _self._holidays : holidays // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnActivity { | ||||
|  | ||||
| @@ -82,6 +356,130 @@ as DateTime?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnActivity]. | ||||
| extension SnActivityPatterns on SnActivity { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnActivity value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnActivity value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnActivity value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String type,  String resourceIdentifier,  dynamic data,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity() when $default != null: | ||||
| return $default(_that.id,_that.type,_that.resourceIdentifier,_that.data,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String type,  String resourceIdentifier,  dynamic data,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity(): | ||||
| return $default(_that.id,_that.type,_that.resourceIdentifier,_that.data,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String type,  String resourceIdentifier,  dynamic data,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnActivity() when $default != null: | ||||
| return $default(_that.id,_that.type,_that.resourceIdentifier,_that.data,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -246,6 +644,130 @@ $SnAccountCopyWith<$Res>? get account { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnCheckInResult]. | ||||
| extension SnCheckInResultPatterns on SnCheckInResult { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnCheckInResult value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnCheckInResult value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnCheckInResult value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  int level,  List<SnFortuneTip> tips,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult() when $default != null: | ||||
| return $default(_that.id,_that.level,_that.tips,_that.accountId,_that.account,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  int level,  List<SnFortuneTip> tips,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult(): | ||||
| return $default(_that.id,_that.level,_that.tips,_that.accountId,_that.account,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  int level,  List<SnFortuneTip> tips,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCheckInResult() when $default != null: | ||||
| return $default(_that.id,_that.level,_that.tips,_that.accountId,_that.account,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -413,6 +935,130 @@ as String, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnFortuneTip]. | ||||
| extension SnFortuneTipPatterns on SnFortuneTip { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnFortuneTip value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnFortuneTip value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnFortuneTip value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool isPositive,  String title,  String content)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip() when $default != null: | ||||
| return $default(_that.isPositive,_that.title,_that.content);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool isPositive,  String title,  String content)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip(): | ||||
| return $default(_that.isPositive,_that.title,_that.content);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isPositive,  String title,  String content)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnFortuneTip() when $default != null: | ||||
| return $default(_that.isPositive,_that.title,_that.content);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -490,7 +1136,7 @@ as String, | ||||
| /// @nodoc | ||||
| mixin _$SnEventCalendarEntry { | ||||
|  | ||||
|  DateTime get date; SnCheckInResult? get checkInResult; List<dynamic> get statuses; | ||||
|  DateTime get date; SnCheckInResult? get checkInResult; List<SnAccountStatus> get statuses; | ||||
| /// Create a copy of SnEventCalendarEntry | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -523,7 +1169,7 @@ abstract mixin class $SnEventCalendarEntryCopyWith<$Res>  { | ||||
|   factory $SnEventCalendarEntryCopyWith(SnEventCalendarEntry value, $Res Function(SnEventCalendarEntry) _then) = _$SnEventCalendarEntryCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  DateTime date, SnCheckInResult? checkInResult, List<dynamic> statuses | ||||
|  DateTime date, SnCheckInResult? checkInResult, List<SnAccountStatus> statuses | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -545,7 +1191,7 @@ class _$SnEventCalendarEntryCopyWithImpl<$Res> | ||||
| date: null == date ? _self.date : date // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,checkInResult: freezed == checkInResult ? _self.checkInResult : checkInResult // ignore: cast_nullable_to_non_nullable | ||||
| as SnCheckInResult?,statuses: null == statuses ? _self.statuses : statuses // ignore: cast_nullable_to_non_nullable | ||||
| as List<dynamic>, | ||||
| as List<SnAccountStatus>, | ||||
|   )); | ||||
| } | ||||
| /// Create a copy of SnEventCalendarEntry | ||||
| @@ -564,17 +1210,141 @@ $SnCheckInResultCopyWith<$Res>? get checkInResult { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnEventCalendarEntry]. | ||||
| extension SnEventCalendarEntryPatterns on SnEventCalendarEntry { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnEventCalendarEntry value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnEventCalendarEntry value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnEventCalendarEntry value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( DateTime date,  SnCheckInResult? checkInResult,  List<SnAccountStatus> statuses)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry() when $default != null: | ||||
| return $default(_that.date,_that.checkInResult,_that.statuses);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( DateTime date,  SnCheckInResult? checkInResult,  List<SnAccountStatus> statuses)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry(): | ||||
| return $default(_that.date,_that.checkInResult,_that.statuses);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( DateTime date,  SnCheckInResult? checkInResult,  List<SnAccountStatus> statuses)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnEventCalendarEntry() when $default != null: | ||||
| return $default(_that.date,_that.checkInResult,_that.statuses);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnEventCalendarEntry implements SnEventCalendarEntry { | ||||
|   const _SnEventCalendarEntry({required this.date, required this.checkInResult, required final  List<dynamic> statuses}): _statuses = statuses; | ||||
|   const _SnEventCalendarEntry({required this.date, required this.checkInResult, required final  List<SnAccountStatus> statuses}): _statuses = statuses; | ||||
|   factory _SnEventCalendarEntry.fromJson(Map<String, dynamic> json) => _$SnEventCalendarEntryFromJson(json); | ||||
|  | ||||
| @override final  DateTime date; | ||||
| @override final  SnCheckInResult? checkInResult; | ||||
|  final  List<dynamic> _statuses; | ||||
| @override List<dynamic> get statuses { | ||||
|  final  List<SnAccountStatus> _statuses; | ||||
| @override List<SnAccountStatus> get statuses { | ||||
|   if (_statuses is EqualUnmodifiableListView) return _statuses; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_statuses); | ||||
| @@ -614,7 +1384,7 @@ abstract mixin class _$SnEventCalendarEntryCopyWith<$Res> implements $SnEventCal | ||||
|   factory _$SnEventCalendarEntryCopyWith(_SnEventCalendarEntry value, $Res Function(_SnEventCalendarEntry) _then) = __$SnEventCalendarEntryCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  DateTime date, SnCheckInResult? checkInResult, List<dynamic> statuses | ||||
|  DateTime date, SnCheckInResult? checkInResult, List<SnAccountStatus> statuses | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -636,7 +1406,7 @@ class __$SnEventCalendarEntryCopyWithImpl<$Res> | ||||
| date: null == date ? _self.date : date // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,checkInResult: freezed == checkInResult ? _self.checkInResult : checkInResult // ignore: cast_nullable_to_non_nullable | ||||
| as SnCheckInResult?,statuses: null == statuses ? _self._statuses : statuses // ignore: cast_nullable_to_non_nullable | ||||
| as List<dynamic>, | ||||
| as List<SnAccountStatus>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,27 @@ part of 'activity.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnNotableDay _$SnNotableDayFromJson(Map<String, dynamic> json) => | ||||
|     _SnNotableDay( | ||||
|       date: DateTime.parse(json['date'] as String), | ||||
|       localName: json['local_name'] as String, | ||||
|       globalName: json['global_name'] as String, | ||||
|       countryCode: json['country_code'] as String, | ||||
|       holidays: | ||||
|           (json['holidays'] as List<dynamic>) | ||||
|               .map((e) => (e as num).toInt()) | ||||
|               .toList(), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnNotableDayToJson(_SnNotableDay instance) => | ||||
|     <String, dynamic>{ | ||||
|       'date': instance.date.toIso8601String(), | ||||
|       'local_name': instance.localName, | ||||
|       'global_name': instance.globalName, | ||||
|       'country_code': instance.countryCode, | ||||
|       'holidays': instance.holidays, | ||||
|     }; | ||||
|  | ||||
| _SnActivity _$SnActivityFromJson(Map<String, dynamic> json) => _SnActivity( | ||||
|   id: json['id'] as String, | ||||
|   type: json['type'] as String, | ||||
| @@ -87,7 +108,10 @@ _SnEventCalendarEntry _$SnEventCalendarEntryFromJson( | ||||
|           : SnCheckInResult.fromJson( | ||||
|             json['check_in_result'] as Map<String, dynamic>, | ||||
|           ), | ||||
|   statuses: json['statuses'] as List<dynamic>, | ||||
|   statuses: | ||||
|       (json['statuses'] as List<dynamic>) | ||||
|           .map((e) => SnAccountStatus.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList(), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnEventCalendarEntryToJson( | ||||
| @@ -95,5 +119,5 @@ Map<String, dynamic> _$SnEventCalendarEntryToJson( | ||||
| ) => <String, dynamic>{ | ||||
|   'date': instance.date.toIso8601String(), | ||||
|   'check_in_result': instance.checkInResult?.toJson(), | ||||
|   'statuses': instance.statuses, | ||||
|   'statuses': instance.statuses.map((e) => e.toJson()).toList(), | ||||
| }; | ||||
|   | ||||
| @@ -11,24 +11,36 @@ sealed class AppToken with _$AppToken { | ||||
|       _$AppTokenFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class GeoIpLocation with _$GeoIpLocation { | ||||
|   const factory GeoIpLocation({ | ||||
|     required double? latitude, | ||||
|     required double? longitude, | ||||
|     required String? countryCode, | ||||
|     required String? country, | ||||
|     required String? city, | ||||
|   }) = _GeoIpLocation; | ||||
|  | ||||
|   factory GeoIpLocation.fromJson(Map<String, dynamic> json) => | ||||
|       _$GeoIpLocationFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnAuthChallenge with _$SnAuthChallenge { | ||||
|   const factory SnAuthChallenge({ | ||||
|     required String id, | ||||
|     required DateTime expiredAt, | ||||
|     required DateTime? expiredAt, | ||||
|     required int stepRemain, | ||||
|     required int stepTotal, | ||||
|     required int failedAttempts, | ||||
|     required int platform, | ||||
|     required int type, | ||||
|     required List<String> blacklistFactors, | ||||
|     required List<dynamic> audiences, | ||||
|     required List<dynamic> scopes, | ||||
|     required String ipAddress, | ||||
|     required String userAgent, | ||||
|     required String deviceId, | ||||
|     required String? nonce, | ||||
|     required String? location, | ||||
|     required GeoIpLocation? location, | ||||
|     required String accountId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
| @@ -45,7 +57,7 @@ sealed class SnAuthSession with _$SnAuthSession { | ||||
|     required String id, | ||||
|     required String? label, | ||||
|     required DateTime lastGrantedAt, | ||||
|     required DateTime expiredAt, | ||||
|     required DateTime? expiredAt, | ||||
|     required String accountId, | ||||
|     required String challengeId, | ||||
|     required SnAuthChallenge challenge, | ||||
| @@ -76,22 +88,6 @@ sealed class SnAuthFactor with _$SnAuthFactor { | ||||
|       _$SnAuthFactorFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnAuthDevice with _$SnAuthDevice { | ||||
|   const factory SnAuthDevice({ | ||||
|     required dynamic label, | ||||
|     required String userAgent, | ||||
|     required String deviceId, | ||||
|     required int platform, | ||||
|     required List<SnAuthSession> sessions, | ||||
|     // Not from backend, used for UI | ||||
|     @Default(false) bool isCurrent, | ||||
|   }) = _SnAuthDevice; | ||||
|  | ||||
|   factory SnAuthDevice.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnAuthDeviceFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnAccountConnection with _$SnAccountConnection { | ||||
|   const factory SnAccountConnection({ | ||||
|   | ||||
| @@ -13,14 +13,34 @@ Map<String, dynamic> _$AppTokenToJson(_AppToken instance) => <String, dynamic>{ | ||||
|   'token': instance.token, | ||||
| }; | ||||
|  | ||||
| _GeoIpLocation _$GeoIpLocationFromJson(Map<String, dynamic> json) => | ||||
|     _GeoIpLocation( | ||||
|       latitude: (json['latitude'] as num?)?.toDouble(), | ||||
|       longitude: (json['longitude'] as num?)?.toDouble(), | ||||
|       countryCode: json['country_code'] as String?, | ||||
|       country: json['country'] as String?, | ||||
|       city: json['city'] as String?, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$GeoIpLocationToJson(_GeoIpLocation instance) => | ||||
|     <String, dynamic>{ | ||||
|       'latitude': instance.latitude, | ||||
|       'longitude': instance.longitude, | ||||
|       'country_code': instance.countryCode, | ||||
|       'country': instance.country, | ||||
|       'city': instance.city, | ||||
|     }; | ||||
|  | ||||
| _SnAuthChallenge _$SnAuthChallengeFromJson(Map<String, dynamic> json) => | ||||
|     _SnAuthChallenge( | ||||
|       id: json['id'] as String, | ||||
|       expiredAt: DateTime.parse(json['expired_at'] as String), | ||||
|       expiredAt: | ||||
|           json['expired_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['expired_at'] as String), | ||||
|       stepRemain: (json['step_remain'] as num).toInt(), | ||||
|       stepTotal: (json['step_total'] as num).toInt(), | ||||
|       failedAttempts: (json['failed_attempts'] as num).toInt(), | ||||
|       platform: (json['platform'] as num).toInt(), | ||||
|       type: (json['type'] as num).toInt(), | ||||
|       blacklistFactors: | ||||
|           (json['blacklist_factors'] as List<dynamic>) | ||||
| @@ -30,9 +50,13 @@ _SnAuthChallenge _$SnAuthChallengeFromJson(Map<String, dynamic> json) => | ||||
|       scopes: json['scopes'] as List<dynamic>, | ||||
|       ipAddress: json['ip_address'] as String, | ||||
|       userAgent: json['user_agent'] as String, | ||||
|       deviceId: json['device_id'] as String, | ||||
|       nonce: json['nonce'] as String?, | ||||
|       location: json['location'] as String?, | ||||
|       location: | ||||
|           json['location'] == null | ||||
|               ? null | ||||
|               : GeoIpLocation.fromJson( | ||||
|                 json['location'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       accountId: json['account_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
| @@ -45,20 +69,18 @@ _SnAuthChallenge _$SnAuthChallengeFromJson(Map<String, dynamic> json) => | ||||
| Map<String, dynamic> _$SnAuthChallengeToJson(_SnAuthChallenge instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'expired_at': instance.expiredAt.toIso8601String(), | ||||
|       'expired_at': instance.expiredAt?.toIso8601String(), | ||||
|       'step_remain': instance.stepRemain, | ||||
|       'step_total': instance.stepTotal, | ||||
|       'failed_attempts': instance.failedAttempts, | ||||
|       'platform': instance.platform, | ||||
|       'type': instance.type, | ||||
|       'blacklist_factors': instance.blacklistFactors, | ||||
|       'audiences': instance.audiences, | ||||
|       'scopes': instance.scopes, | ||||
|       'ip_address': instance.ipAddress, | ||||
|       'user_agent': instance.userAgent, | ||||
|       'device_id': instance.deviceId, | ||||
|       'nonce': instance.nonce, | ||||
|       'location': instance.location, | ||||
|       'location': instance.location?.toJson(), | ||||
|       'account_id': instance.accountId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
| @@ -70,7 +92,10 @@ _SnAuthSession _$SnAuthSessionFromJson(Map<String, dynamic> json) => | ||||
|       id: json['id'] as String, | ||||
|       label: json['label'] as String?, | ||||
|       lastGrantedAt: DateTime.parse(json['last_granted_at'] as String), | ||||
|       expiredAt: DateTime.parse(json['expired_at'] as String), | ||||
|       expiredAt: | ||||
|           json['expired_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['expired_at'] as String), | ||||
|       accountId: json['account_id'] as String, | ||||
|       challengeId: json['challenge_id'] as String, | ||||
|       challenge: SnAuthChallenge.fromJson( | ||||
| @@ -89,7 +114,7 @@ Map<String, dynamic> _$SnAuthSessionToJson(_SnAuthSession instance) => | ||||
|       'id': instance.id, | ||||
|       'label': instance.label, | ||||
|       'last_granted_at': instance.lastGrantedAt.toIso8601String(), | ||||
|       'expired_at': instance.expiredAt.toIso8601String(), | ||||
|       'expired_at': instance.expiredAt?.toIso8601String(), | ||||
|       'account_id': instance.accountId, | ||||
|       'challenge_id': instance.challengeId, | ||||
|       'challenge': instance.challenge.toJson(), | ||||
| @@ -133,29 +158,6 @@ Map<String, dynamic> _$SnAuthFactorToJson(_SnAuthFactor instance) => | ||||
|       'created_response': instance.createdResponse, | ||||
|     }; | ||||
|  | ||||
| _SnAuthDevice _$SnAuthDeviceFromJson(Map<String, dynamic> json) => | ||||
|     _SnAuthDevice( | ||||
|       label: json['label'], | ||||
|       userAgent: json['user_agent'] as String, | ||||
|       deviceId: json['device_id'] as String, | ||||
|       platform: (json['platform'] as num).toInt(), | ||||
|       sessions: | ||||
|           (json['sessions'] as List<dynamic>) | ||||
|               .map((e) => SnAuthSession.fromJson(e as Map<String, dynamic>)) | ||||
|               .toList(), | ||||
|       isCurrent: json['is_current'] as bool? ?? false, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnAuthDeviceToJson(_SnAuthDevice instance) => | ||||
|     <String, dynamic>{ | ||||
|       'label': instance.label, | ||||
|       'user_agent': instance.userAgent, | ||||
|       'device_id': instance.deviceId, | ||||
|       'platform': instance.platform, | ||||
|       'sessions': instance.sessions.map((e) => e.toJson()).toList(), | ||||
|       'is_current': instance.isCurrent, | ||||
|     }; | ||||
|  | ||||
| _SnAccountConnection _$SnAccountConnectionFromJson(Map<String, dynamic> json) => | ||||
|     _SnAccountConnection( | ||||
|       id: json['id'] as String, | ||||
|   | ||||
							
								
								
									
										34
									
								
								lib/models/auto_completion.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
|  | ||||
| part 'auto_completion.freezed.dart'; | ||||
| part 'auto_completion.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class AutoCompletionResponse with _$AutoCompletionResponse { | ||||
|   const factory AutoCompletionResponse.account({ | ||||
|     required String type, | ||||
|     required List<AutoCompletionItem> items, | ||||
|   }) = AutoCompletionAccountResponse; | ||||
|  | ||||
|   const factory AutoCompletionResponse.sticker({ | ||||
|     required String type, | ||||
|     required List<AutoCompletionItem> items, | ||||
|   }) = AutoCompletionStickerResponse; | ||||
|  | ||||
|   factory AutoCompletionResponse.fromJson(Map<String, dynamic> json) => | ||||
|       _$AutoCompletionResponseFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class AutoCompletionItem with _$AutoCompletionItem { | ||||
|   const factory AutoCompletionItem({ | ||||
|     required String id, | ||||
|     required String displayName, | ||||
|     required String? secondaryText, | ||||
|     required String type, | ||||
|     required dynamic data, | ||||
|   }) = _AutoCompletionItem; | ||||
|  | ||||
|   factory AutoCompletionItem.fromJson(Map<String, dynamic> json) => | ||||
|       _$AutoCompletionItemFromJson(json); | ||||
| } | ||||
							
								
								
									
										663
									
								
								lib/models/auto_completion.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,663 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| part of 'auto_completion.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // FreezedGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
| AutoCompletionResponse _$AutoCompletionResponseFromJson( | ||||
|   Map<String, dynamic> json | ||||
| ) { | ||||
|         switch (json['runtimeType']) { | ||||
|                   case 'account': | ||||
|           return AutoCompletionAccountResponse.fromJson( | ||||
|             json | ||||
|           ); | ||||
|                 case 'sticker': | ||||
|           return AutoCompletionStickerResponse.fromJson( | ||||
|             json | ||||
|           ); | ||||
|          | ||||
|           default: | ||||
|             throw CheckedFromJsonException( | ||||
|   json, | ||||
|   'runtimeType', | ||||
|   'AutoCompletionResponse', | ||||
|   'Invalid union type "${json['runtimeType']}"!' | ||||
| ); | ||||
|         } | ||||
|        | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$AutoCompletionResponse { | ||||
|  | ||||
|  String get type; List<AutoCompletionItem> get items; | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $AutoCompletionResponseCopyWith<AutoCompletionResponse> get copyWith => _$AutoCompletionResponseCopyWithImpl<AutoCompletionResponse>(this as AutoCompletionResponse, _$identity); | ||||
|  | ||||
|   /// Serializes this AutoCompletionResponse to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is AutoCompletionResponse&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.items, items)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(items)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'AutoCompletionResponse(type: $type, items: $items)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $AutoCompletionResponseCopyWith<$Res>  { | ||||
|   factory $AutoCompletionResponseCopyWith(AutoCompletionResponse value, $Res Function(AutoCompletionResponse) _then) = _$AutoCompletionResponseCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String type, List<AutoCompletionItem> items | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$AutoCompletionResponseCopyWithImpl<$Res> | ||||
|     implements $AutoCompletionResponseCopyWith<$Res> { | ||||
|   _$AutoCompletionResponseCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final AutoCompletionResponse _self; | ||||
|   final $Res Function(AutoCompletionResponse) _then; | ||||
|  | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? items = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,items: null == items ? _self.items : items // ignore: cast_nullable_to_non_nullable | ||||
| as List<AutoCompletionItem>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [AutoCompletionResponse]. | ||||
| extension AutoCompletionResponsePatterns on AutoCompletionResponse { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>({TResult Function( AutoCompletionAccountResponse value)?  account,TResult Function( AutoCompletionStickerResponse value)?  sticker,required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>({required TResult Function( AutoCompletionAccountResponse value)  account,required TResult Function( AutoCompletionStickerResponse value)  sticker,}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse(): | ||||
| return account(_that);case AutoCompletionStickerResponse(): | ||||
| return sticker(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>({TResult? Function( AutoCompletionAccountResponse value)?  account,TResult? Function( AutoCompletionStickerResponse value)?  sticker,}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>({TResult Function( String type,  List<AutoCompletionItem> items)?  account,TResult Function( String type,  List<AutoCompletionItem> items)?  sticker,required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that.type,_that.items);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>({required TResult Function( String type,  List<AutoCompletionItem> items)  account,required TResult Function( String type,  List<AutoCompletionItem> items)  sticker,}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse(): | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse(): | ||||
| return sticker(_that.type,_that.items);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>({TResult? Function( String type,  List<AutoCompletionItem> items)?  account,TResult? Function( String type,  List<AutoCompletionItem> items)?  sticker,}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that.type,_that.items);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class AutoCompletionAccountResponse implements AutoCompletionResponse { | ||||
|   const AutoCompletionAccountResponse({required this.type, required final  List<AutoCompletionItem> items, final  String? $type}): _items = items,$type = $type ?? 'account'; | ||||
|   factory AutoCompletionAccountResponse.fromJson(Map<String, dynamic> json) => _$AutoCompletionAccountResponseFromJson(json); | ||||
|  | ||||
| @override final  String type; | ||||
|  final  List<AutoCompletionItem> _items; | ||||
| @override List<AutoCompletionItem> get items { | ||||
|   if (_items is EqualUnmodifiableListView) return _items; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_items); | ||||
| } | ||||
|  | ||||
|  | ||||
| @JsonKey(name: 'runtimeType') | ||||
| final String $type; | ||||
|  | ||||
|  | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $AutoCompletionAccountResponseCopyWith<AutoCompletionAccountResponse> get copyWith => _$AutoCompletionAccountResponseCopyWithImpl<AutoCompletionAccountResponse>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$AutoCompletionAccountResponseToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is AutoCompletionAccountResponse&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._items, _items)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(_items)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'AutoCompletionResponse.account(type: $type, items: $items)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $AutoCompletionAccountResponseCopyWith<$Res> implements $AutoCompletionResponseCopyWith<$Res> { | ||||
|   factory $AutoCompletionAccountResponseCopyWith(AutoCompletionAccountResponse value, $Res Function(AutoCompletionAccountResponse) _then) = _$AutoCompletionAccountResponseCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String type, List<AutoCompletionItem> items | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$AutoCompletionAccountResponseCopyWithImpl<$Res> | ||||
|     implements $AutoCompletionAccountResponseCopyWith<$Res> { | ||||
|   _$AutoCompletionAccountResponseCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final AutoCompletionAccountResponse _self; | ||||
|   final $Res Function(AutoCompletionAccountResponse) _then; | ||||
|  | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? items = null,}) { | ||||
|   return _then(AutoCompletionAccountResponse( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,items: null == items ? _self._items : items // ignore: cast_nullable_to_non_nullable | ||||
| as List<AutoCompletionItem>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class AutoCompletionStickerResponse implements AutoCompletionResponse { | ||||
|   const AutoCompletionStickerResponse({required this.type, required final  List<AutoCompletionItem> items, final  String? $type}): _items = items,$type = $type ?? 'sticker'; | ||||
|   factory AutoCompletionStickerResponse.fromJson(Map<String, dynamic> json) => _$AutoCompletionStickerResponseFromJson(json); | ||||
|  | ||||
| @override final  String type; | ||||
|  final  List<AutoCompletionItem> _items; | ||||
| @override List<AutoCompletionItem> get items { | ||||
|   if (_items is EqualUnmodifiableListView) return _items; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_items); | ||||
| } | ||||
|  | ||||
|  | ||||
| @JsonKey(name: 'runtimeType') | ||||
| final String $type; | ||||
|  | ||||
|  | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $AutoCompletionStickerResponseCopyWith<AutoCompletionStickerResponse> get copyWith => _$AutoCompletionStickerResponseCopyWithImpl<AutoCompletionStickerResponse>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$AutoCompletionStickerResponseToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is AutoCompletionStickerResponse&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._items, _items)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(_items)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'AutoCompletionResponse.sticker(type: $type, items: $items)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $AutoCompletionStickerResponseCopyWith<$Res> implements $AutoCompletionResponseCopyWith<$Res> { | ||||
|   factory $AutoCompletionStickerResponseCopyWith(AutoCompletionStickerResponse value, $Res Function(AutoCompletionStickerResponse) _then) = _$AutoCompletionStickerResponseCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String type, List<AutoCompletionItem> items | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$AutoCompletionStickerResponseCopyWithImpl<$Res> | ||||
|     implements $AutoCompletionStickerResponseCopyWith<$Res> { | ||||
|   _$AutoCompletionStickerResponseCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final AutoCompletionStickerResponse _self; | ||||
|   final $Res Function(AutoCompletionStickerResponse) _then; | ||||
|  | ||||
| /// Create a copy of AutoCompletionResponse | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? items = null,}) { | ||||
|   return _then(AutoCompletionStickerResponse( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,items: null == items ? _self._items : items // ignore: cast_nullable_to_non_nullable | ||||
| as List<AutoCompletionItem>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$AutoCompletionItem { | ||||
|  | ||||
|  String get id; String get displayName; String? get secondaryText; String get type; dynamic get data; | ||||
| /// Create a copy of AutoCompletionItem | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $AutoCompletionItemCopyWith<AutoCompletionItem> get copyWith => _$AutoCompletionItemCopyWithImpl<AutoCompletionItem>(this as AutoCompletionItem, _$identity); | ||||
|  | ||||
|   /// Serializes this AutoCompletionItem to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is AutoCompletionItem&&(identical(other.id, id) || other.id == id)&&(identical(other.displayName, displayName) || other.displayName == displayName)&&(identical(other.secondaryText, secondaryText) || other.secondaryText == secondaryText)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.data, data)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,displayName,secondaryText,type,const DeepCollectionEquality().hash(data)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'AutoCompletionItem(id: $id, displayName: $displayName, secondaryText: $secondaryText, type: $type, data: $data)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $AutoCompletionItemCopyWith<$Res>  { | ||||
|   factory $AutoCompletionItemCopyWith(AutoCompletionItem value, $Res Function(AutoCompletionItem) _then) = _$AutoCompletionItemCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String displayName, String? secondaryText, String type, dynamic data | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$AutoCompletionItemCopyWithImpl<$Res> | ||||
|     implements $AutoCompletionItemCopyWith<$Res> { | ||||
|   _$AutoCompletionItemCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final AutoCompletionItem _self; | ||||
|   final $Res Function(AutoCompletionItem) _then; | ||||
|  | ||||
| /// Create a copy of AutoCompletionItem | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? displayName = null,Object? secondaryText = freezed,Object? type = null,Object? data = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,displayName: null == displayName ? _self.displayName : displayName // ignore: cast_nullable_to_non_nullable | ||||
| as String,secondaryText: freezed == secondaryText ? _self.secondaryText : secondaryText // ignore: cast_nullable_to_non_nullable | ||||
| as String?,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [AutoCompletionItem]. | ||||
| extension AutoCompletionItemPatterns on AutoCompletionItem { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AutoCompletionItem value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AutoCompletionItem value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AutoCompletionItem value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem(): | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _AutoCompletionItem implements AutoCompletionItem { | ||||
|   const _AutoCompletionItem({required this.id, required this.displayName, required this.secondaryText, required this.type, required this.data}); | ||||
|   factory _AutoCompletionItem.fromJson(Map<String, dynamic> json) => _$AutoCompletionItemFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String displayName; | ||||
| @override final  String? secondaryText; | ||||
| @override final  String type; | ||||
| @override final  dynamic data; | ||||
|  | ||||
| /// Create a copy of AutoCompletionItem | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$AutoCompletionItemCopyWith<_AutoCompletionItem> get copyWith => __$AutoCompletionItemCopyWithImpl<_AutoCompletionItem>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$AutoCompletionItemToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _AutoCompletionItem&&(identical(other.id, id) || other.id == id)&&(identical(other.displayName, displayName) || other.displayName == displayName)&&(identical(other.secondaryText, secondaryText) || other.secondaryText == secondaryText)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.data, data)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,displayName,secondaryText,type,const DeepCollectionEquality().hash(data)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'AutoCompletionItem(id: $id, displayName: $displayName, secondaryText: $secondaryText, type: $type, data: $data)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$AutoCompletionItemCopyWith<$Res> implements $AutoCompletionItemCopyWith<$Res> { | ||||
|   factory _$AutoCompletionItemCopyWith(_AutoCompletionItem value, $Res Function(_AutoCompletionItem) _then) = __$AutoCompletionItemCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String displayName, String? secondaryText, String type, dynamic data | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$AutoCompletionItemCopyWithImpl<$Res> | ||||
|     implements _$AutoCompletionItemCopyWith<$Res> { | ||||
|   __$AutoCompletionItemCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _AutoCompletionItem _self; | ||||
|   final $Res Function(_AutoCompletionItem) _then; | ||||
|  | ||||
| /// Create a copy of AutoCompletionItem | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? displayName = null,Object? secondaryText = freezed,Object? type = null,Object? data = freezed,}) { | ||||
|   return _then(_AutoCompletionItem( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,displayName: null == displayName ? _self.displayName : displayName // ignore: cast_nullable_to_non_nullable | ||||
| as String,secondaryText: freezed == secondaryText ? _self.secondaryText : secondaryText // ignore: cast_nullable_to_non_nullable | ||||
| as String?,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
							
								
								
									
										63
									
								
								lib/models/auto_completion.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,63 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'auto_completion.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| AutoCompletionAccountResponse _$AutoCompletionAccountResponseFromJson( | ||||
|   Map<String, dynamic> json, | ||||
| ) => AutoCompletionAccountResponse( | ||||
|   type: json['type'] as String, | ||||
|   items: | ||||
|       (json['items'] as List<dynamic>) | ||||
|           .map((e) => AutoCompletionItem.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList(), | ||||
|   $type: json['runtimeType'] as String?, | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$AutoCompletionAccountResponseToJson( | ||||
|   AutoCompletionAccountResponse instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'type': instance.type, | ||||
|   'items': instance.items.map((e) => e.toJson()).toList(), | ||||
|   'runtimeType': instance.$type, | ||||
| }; | ||||
|  | ||||
| AutoCompletionStickerResponse _$AutoCompletionStickerResponseFromJson( | ||||
|   Map<String, dynamic> json, | ||||
| ) => AutoCompletionStickerResponse( | ||||
|   type: json['type'] as String, | ||||
|   items: | ||||
|       (json['items'] as List<dynamic>) | ||||
|           .map((e) => AutoCompletionItem.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList(), | ||||
|   $type: json['runtimeType'] as String?, | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$AutoCompletionStickerResponseToJson( | ||||
|   AutoCompletionStickerResponse instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'type': instance.type, | ||||
|   'items': instance.items.map((e) => e.toJson()).toList(), | ||||
|   'runtimeType': instance.$type, | ||||
| }; | ||||
|  | ||||
| _AutoCompletionItem _$AutoCompletionItemFromJson(Map<String, dynamic> json) => | ||||
|     _AutoCompletionItem( | ||||
|       id: json['id'] as String, | ||||
|       displayName: json['display_name'] as String, | ||||
|       secondaryText: json['secondary_text'] as String?, | ||||
|       type: json['type'] as String, | ||||
|       data: json['data'], | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$AutoCompletionItemToJson(_AutoCompletionItem instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'display_name': instance.displayName, | ||||
|       'secondary_text': instance.secondaryText, | ||||
|       'type': instance.type, | ||||
|       'data': instance.data, | ||||
|     }; | ||||
							
								
								
									
										63
									
								
								lib/models/bot.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,63 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/account.dart'; | ||||
| import 'package:island/models/developer.dart'; | ||||
|  | ||||
| part 'bot.freezed.dart'; | ||||
| part 'bot.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class Bot with _$Bot { | ||||
|   const factory Bot({ | ||||
|     required String id, | ||||
|     required String slug, | ||||
|     required bool isActive, | ||||
|     required String projectId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required SnAccount account, | ||||
|     SnDeveloper? developer, | ||||
|   }) = _Bot; | ||||
|  | ||||
|   factory Bot.fromJson(Map<String, dynamic> json) => _$BotFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class BotConfig with _$BotConfig { | ||||
|   const factory BotConfig({ | ||||
|     @Default(false) bool isPublic, | ||||
|     @Default(false) bool isInteractive, | ||||
|     @Default([]) List<String> allowedRealms, | ||||
|     @Default([]) List<String> allowedChatTypes, | ||||
|     @Default({}) Map<String, dynamic> metadata, | ||||
|   }) = _BotConfig; | ||||
|  | ||||
|   factory BotConfig.fromJson(Map<String, dynamic> json) => | ||||
|       _$BotConfigFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class BotLinks with _$BotLinks { | ||||
|   const factory BotLinks({ | ||||
|     String? website, | ||||
|     String? documentation, | ||||
|     String? privacyPolicy, | ||||
|     String? termsOfService, | ||||
|   }) = _BotLinks; | ||||
|  | ||||
|   factory BotLinks.fromJson(Map<String, dynamic> json) => | ||||
|       _$BotLinksFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class BotSecret with _$BotSecret { | ||||
|   const factory BotSecret({ | ||||
|     @Default('') String id, | ||||
|     @Default('') String secret, | ||||
|     String? description, | ||||
|     DateTime? expiredAt, | ||||
|     @Default('') String botId, | ||||
|   }) = _BotSecret; | ||||
|  | ||||
|   factory BotSecret.fromJson(Map<String, dynamic> json) => | ||||
|       _$BotSecretFromJson(json); | ||||
| } | ||||
							
								
								
									
										1156
									
								
								lib/models/bot.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										91
									
								
								lib/models/bot.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,91 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'bot.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _Bot _$BotFromJson(Map<String, dynamic> json) => _Bot( | ||||
|   id: json['id'] as String, | ||||
|   slug: json['slug'] as String, | ||||
|   isActive: json['is_active'] as bool, | ||||
|   projectId: json['project_id'] as String, | ||||
|   createdAt: DateTime.parse(json['created_at'] as String), | ||||
|   updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|   account: SnAccount.fromJson(json['account'] as Map<String, dynamic>), | ||||
|   developer: | ||||
|       json['developer'] == null | ||||
|           ? null | ||||
|           : SnDeveloper.fromJson(json['developer'] as Map<String, dynamic>), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$BotToJson(_Bot instance) => <String, dynamic>{ | ||||
|   'id': instance.id, | ||||
|   'slug': instance.slug, | ||||
|   'is_active': instance.isActive, | ||||
|   'project_id': instance.projectId, | ||||
|   'created_at': instance.createdAt.toIso8601String(), | ||||
|   'updated_at': instance.updatedAt.toIso8601String(), | ||||
|   'account': instance.account.toJson(), | ||||
|   'developer': instance.developer?.toJson(), | ||||
| }; | ||||
|  | ||||
| _BotConfig _$BotConfigFromJson(Map<String, dynamic> json) => _BotConfig( | ||||
|   isPublic: json['is_public'] as bool? ?? false, | ||||
|   isInteractive: json['is_interactive'] as bool? ?? false, | ||||
|   allowedRealms: | ||||
|       (json['allowed_realms'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   allowedChatTypes: | ||||
|       (json['allowed_chat_types'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   metadata: json['metadata'] as Map<String, dynamic>? ?? const {}, | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$BotConfigToJson(_BotConfig instance) => | ||||
|     <String, dynamic>{ | ||||
|       'is_public': instance.isPublic, | ||||
|       'is_interactive': instance.isInteractive, | ||||
|       'allowed_realms': instance.allowedRealms, | ||||
|       'allowed_chat_types': instance.allowedChatTypes, | ||||
|       'metadata': instance.metadata, | ||||
|     }; | ||||
|  | ||||
| _BotLinks _$BotLinksFromJson(Map<String, dynamic> json) => _BotLinks( | ||||
|   website: json['website'] as String?, | ||||
|   documentation: json['documentation'] as String?, | ||||
|   privacyPolicy: json['privacy_policy'] as String?, | ||||
|   termsOfService: json['terms_of_service'] as String?, | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$BotLinksToJson(_BotLinks instance) => <String, dynamic>{ | ||||
|   'website': instance.website, | ||||
|   'documentation': instance.documentation, | ||||
|   'privacy_policy': instance.privacyPolicy, | ||||
|   'terms_of_service': instance.termsOfService, | ||||
| }; | ||||
|  | ||||
| _BotSecret _$BotSecretFromJson(Map<String, dynamic> json) => _BotSecret( | ||||
|   id: json['id'] as String? ?? '', | ||||
|   secret: json['secret'] as String? ?? '', | ||||
|   description: json['description'] as String?, | ||||
|   expiredAt: | ||||
|       json['expired_at'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['expired_at'] as String), | ||||
|   botId: json['bot_id'] as String? ?? '', | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$BotSecretToJson(_BotSecret instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'secret': instance.secret, | ||||
|       'description': instance.description, | ||||
|       'expired_at': instance.expiredAt?.toIso8601String(), | ||||
|       'bot_id': instance.botId, | ||||
|     }; | ||||
							
								
								
									
										20
									
								
								lib/models/bot_key.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
|  | ||||
| part 'bot_key.freezed.dart'; | ||||
| part 'bot_key.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnAccountApiKey with _$SnAccountApiKey { | ||||
|   const factory SnAccountApiKey({ | ||||
|     required String id, | ||||
|     required String label, | ||||
|     required String accountId, | ||||
|     required String sessionId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     String? key, | ||||
|   }) = _SnAccountApiKey; | ||||
|  | ||||
|   factory SnAccountApiKey.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnAccountApiKeyFromJson(json); | ||||
| } | ||||
							
								
								
									
										289
									
								
								lib/models/bot_key.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,289 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| part of 'bot_key.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // FreezedGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnAccountApiKey { | ||||
|  | ||||
|  String get id; String get label; String get accountId; String get sessionId; DateTime get createdAt; DateTime get updatedAt; String? get key; | ||||
| /// Create a copy of SnAccountApiKey | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnAccountApiKeyCopyWith<SnAccountApiKey> get copyWith => _$SnAccountApiKeyCopyWithImpl<SnAccountApiKey>(this as SnAccountApiKey, _$identity); | ||||
|  | ||||
|   /// Serializes this SnAccountApiKey to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnAccountApiKey&&(identical(other.id, id) || other.id == id)&&(identical(other.label, label) || other.label == label)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.sessionId, sessionId) || other.sessionId == sessionId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.key, key) || other.key == key)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,label,accountId,sessionId,createdAt,updatedAt,key); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnAccountApiKey(id: $id, label: $label, accountId: $accountId, sessionId: $sessionId, createdAt: $createdAt, updatedAt: $updatedAt, key: $key)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnAccountApiKeyCopyWith<$Res>  { | ||||
|   factory $SnAccountApiKeyCopyWith(SnAccountApiKey value, $Res Function(SnAccountApiKey) _then) = _$SnAccountApiKeyCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String label, String accountId, String sessionId, DateTime createdAt, DateTime updatedAt, String? key | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnAccountApiKeyCopyWithImpl<$Res> | ||||
|     implements $SnAccountApiKeyCopyWith<$Res> { | ||||
|   _$SnAccountApiKeyCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnAccountApiKey _self; | ||||
|   final $Res Function(SnAccountApiKey) _then; | ||||
|  | ||||
| /// Create a copy of SnAccountApiKey | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? label = null,Object? accountId = null,Object? sessionId = null,Object? createdAt = null,Object? updatedAt = null,Object? key = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,label: null == label ? _self.label : label // ignore: cast_nullable_to_non_nullable | ||||
| as String,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable | ||||
| as String,sessionId: null == sessionId ? _self.sessionId : sessionId // ignore: cast_nullable_to_non_nullable | ||||
| as String,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable | ||||
| as String?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnAccountApiKey]. | ||||
| extension SnAccountApiKeyPatterns on SnAccountApiKey { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnAccountApiKey value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnAccountApiKey value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnAccountApiKey value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String label,  String accountId,  String sessionId,  DateTime createdAt,  DateTime updatedAt,  String? key)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey() when $default != null: | ||||
| return $default(_that.id,_that.label,_that.accountId,_that.sessionId,_that.createdAt,_that.updatedAt,_that.key);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String label,  String accountId,  String sessionId,  DateTime createdAt,  DateTime updatedAt,  String? key)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey(): | ||||
| return $default(_that.id,_that.label,_that.accountId,_that.sessionId,_that.createdAt,_that.updatedAt,_that.key);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String label,  String accountId,  String sessionId,  DateTime createdAt,  DateTime updatedAt,  String? key)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAccountApiKey() when $default != null: | ||||
| return $default(_that.id,_that.label,_that.accountId,_that.sessionId,_that.createdAt,_that.updatedAt,_that.key);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnAccountApiKey implements SnAccountApiKey { | ||||
|   const _SnAccountApiKey({required this.id, required this.label, required this.accountId, required this.sessionId, required this.createdAt, required this.updatedAt, this.key}); | ||||
|   factory _SnAccountApiKey.fromJson(Map<String, dynamic> json) => _$SnAccountApiKeyFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String label; | ||||
| @override final  String accountId; | ||||
| @override final  String sessionId; | ||||
| @override final  DateTime createdAt; | ||||
| @override final  DateTime updatedAt; | ||||
| @override final  String? key; | ||||
|  | ||||
| /// Create a copy of SnAccountApiKey | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnAccountApiKeyCopyWith<_SnAccountApiKey> get copyWith => __$SnAccountApiKeyCopyWithImpl<_SnAccountApiKey>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnAccountApiKeyToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnAccountApiKey&&(identical(other.id, id) || other.id == id)&&(identical(other.label, label) || other.label == label)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.sessionId, sessionId) || other.sessionId == sessionId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.key, key) || other.key == key)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,label,accountId,sessionId,createdAt,updatedAt,key); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnAccountApiKey(id: $id, label: $label, accountId: $accountId, sessionId: $sessionId, createdAt: $createdAt, updatedAt: $updatedAt, key: $key)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnAccountApiKeyCopyWith<$Res> implements $SnAccountApiKeyCopyWith<$Res> { | ||||
|   factory _$SnAccountApiKeyCopyWith(_SnAccountApiKey value, $Res Function(_SnAccountApiKey) _then) = __$SnAccountApiKeyCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String label, String accountId, String sessionId, DateTime createdAt, DateTime updatedAt, String? key | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnAccountApiKeyCopyWithImpl<$Res> | ||||
|     implements _$SnAccountApiKeyCopyWith<$Res> { | ||||
|   __$SnAccountApiKeyCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnAccountApiKey _self; | ||||
|   final $Res Function(_SnAccountApiKey) _then; | ||||
|  | ||||
| /// Create a copy of SnAccountApiKey | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? label = null,Object? accountId = null,Object? sessionId = null,Object? createdAt = null,Object? updatedAt = null,Object? key = freezed,}) { | ||||
|   return _then(_SnAccountApiKey( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,label: null == label ? _self.label : label // ignore: cast_nullable_to_non_nullable | ||||
| as String,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable | ||||
| as String,sessionId: null == sessionId ? _self.sessionId : sessionId // ignore: cast_nullable_to_non_nullable | ||||
| as String,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable | ||||
| as String?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
							
								
								
									
										29
									
								
								lib/models/bot_key.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'bot_key.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnAccountApiKey _$SnAccountApiKeyFromJson(Map<String, dynamic> json) => | ||||
|     _SnAccountApiKey( | ||||
|       id: json['id'] as String, | ||||
|       label: json['label'] as String, | ||||
|       accountId: json['account_id'] as String, | ||||
|       sessionId: json['session_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       key: json['key'] as String?, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnAccountApiKeyToJson(_SnAccountApiKey instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'label': instance.label, | ||||
|       'account_id': instance.accountId, | ||||
|       'session_id': instance.sessionId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'key': instance.key, | ||||
|     }; | ||||
| @@ -1,7 +1,7 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
| import 'package:island/models/realm.dart'; | ||||
| import 'package:island/models/user.dart'; | ||||
| import 'package:island/models/account.dart'; | ||||
|  | ||||
| part 'chat.freezed.dart'; | ||||
| part 'chat.g.dart'; | ||||
| @@ -13,7 +13,8 @@ sealed class SnChatRoom with _$SnChatRoom { | ||||
|     required String? name, | ||||
|     required String? description, | ||||
|     required int type, | ||||
|     required bool isPublic, | ||||
|     @Default(false) bool isPublic, | ||||
|     @Default(false) bool isCommunity, | ||||
|     required SnCloudFile? picture, | ||||
|     required SnCloudFile? background, | ||||
|     required String? realmId, | ||||
| @@ -39,7 +40,7 @@ sealed class SnChatMessage with _$SnChatMessage { | ||||
|     String? content, | ||||
|     String? nonce, | ||||
|     @Default({}) Map<String, dynamic> meta, | ||||
|     @Default([]) List<String> membersMetioned, | ||||
|     @Default([]) List<String> membersMentioned, | ||||
|     DateTime? editedAt, | ||||
|     @Default([]) List<SnCloudFile> attachments, | ||||
|     @Default([]) List<SnChatReaction> reactions, | ||||
| @@ -90,6 +91,7 @@ sealed class SnChatMember with _$SnChatMember { | ||||
|     required DateTime? breakUntil, | ||||
|     required DateTime? timeoutUntil, | ||||
|     required bool isBot, | ||||
|     required SnAccountStatus? status, | ||||
|     // Frontend data | ||||
|     DateTime? lastTyped, | ||||
|   }) = _SnChatMember; | ||||
| @@ -102,7 +104,7 @@ sealed class SnChatMember with _$SnChatMember { | ||||
| sealed class SnChatSummary with _$SnChatSummary { | ||||
|   const factory SnChatSummary({ | ||||
|     required int unreadCount, | ||||
|     required SnChatMessage lastMessage, | ||||
|     required SnChatMessage? lastMessage, | ||||
|   }) = _SnChatSummary; | ||||
|  | ||||
|   factory SnChatSummary.fromJson(Map<String, dynamic> json) => | ||||
| @@ -115,23 +117,10 @@ class MessageChangeAction { | ||||
|   static const String delete = "delete"; | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class MessageChange with _$MessageChange { | ||||
|   const factory MessageChange({ | ||||
|     required String messageId, | ||||
|     required String action, | ||||
|     SnChatMessage? message, | ||||
|     required DateTime timestamp, | ||||
|   }) = _MessageChange; | ||||
|  | ||||
|   factory MessageChange.fromJson(Map<String, dynamic> json) => | ||||
|       _$MessageChangeFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class MessageSyncResponse with _$MessageSyncResponse { | ||||
|   const factory MessageSyncResponse({ | ||||
|     @Default([]) List<MessageChange> changes, | ||||
|     @Default([]) List<SnChatMessage> messages, | ||||
|     required DateTime currentTimestamp, | ||||
|   }) = _MessageSyncResponse; | ||||
|  | ||||
| @@ -161,8 +150,6 @@ sealed class CallParticipant with _$CallParticipant { | ||||
|     required String identity, | ||||
|     required String name, | ||||
|     required DateTime joinedAt, | ||||
|     required String? accountId, | ||||
|     required SnChatMember? profile, | ||||
|   }) = _CallParticipant; | ||||
|  | ||||
|   factory CallParticipant.fromJson(Map<String, dynamic> json) => | ||||
|   | ||||
| @@ -11,7 +11,8 @@ _SnChatRoom _$SnChatRoomFromJson(Map<String, dynamic> json) => _SnChatRoom( | ||||
|   name: json['name'] as String?, | ||||
|   description: json['description'] as String?, | ||||
|   type: (json['type'] as num).toInt(), | ||||
|   isPublic: json['is_public'] as bool, | ||||
|   isPublic: json['is_public'] as bool? ?? false, | ||||
|   isCommunity: json['is_community'] as bool? ?? false, | ||||
|   picture: | ||||
|       json['picture'] == null | ||||
|           ? null | ||||
| @@ -44,6 +45,7 @@ Map<String, dynamic> _$SnChatRoomToJson(_SnChatRoom instance) => | ||||
|       'description': instance.description, | ||||
|       'type': instance.type, | ||||
|       'is_public': instance.isPublic, | ||||
|       'is_community': instance.isCommunity, | ||||
|       'picture': instance.picture?.toJson(), | ||||
|       'background': instance.background?.toJson(), | ||||
|       'realm_id': instance.realmId, | ||||
| @@ -67,8 +69,8 @@ _SnChatMessage _$SnChatMessageFromJson(Map<String, dynamic> json) => | ||||
|       content: json['content'] as String?, | ||||
|       nonce: json['nonce'] as String?, | ||||
|       meta: json['meta'] as Map<String, dynamic>? ?? const {}, | ||||
|       membersMetioned: | ||||
|           (json['members_metioned'] as List<dynamic>?) | ||||
|       membersMentioned: | ||||
|           (json['members_mentioned'] as List<dynamic>?) | ||||
|               ?.map((e) => e as String) | ||||
|               .toList() ?? | ||||
|           const [], | ||||
| @@ -103,7 +105,7 @@ Map<String, dynamic> _$SnChatMessageToJson(_SnChatMessage instance) => | ||||
|       'content': instance.content, | ||||
|       'nonce': instance.nonce, | ||||
|       'meta': instance.meta, | ||||
|       'members_metioned': instance.membersMetioned, | ||||
|       'members_mentioned': instance.membersMentioned, | ||||
|       'edited_at': instance.editedAt?.toIso8601String(), | ||||
|       'attachments': instance.attachments.map((e) => e.toJson()).toList(), | ||||
|       'reactions': instance.reactions.map((e) => e.toJson()).toList(), | ||||
| @@ -175,6 +177,12 @@ _SnChatMember _$SnChatMemberFromJson(Map<String, dynamic> json) => | ||||
|               ? null | ||||
|               : DateTime.parse(json['timeout_until'] as String), | ||||
|       isBot: json['is_bot'] as bool, | ||||
|       status: | ||||
|           json['status'] == null | ||||
|               ? null | ||||
|               : SnAccountStatus.fromJson( | ||||
|                 json['status'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       lastTyped: | ||||
|           json['last_typed'] == null | ||||
|               ? null | ||||
| @@ -198,47 +206,32 @@ Map<String, dynamic> _$SnChatMemberToJson(_SnChatMember instance) => | ||||
|       'break_until': instance.breakUntil?.toIso8601String(), | ||||
|       'timeout_until': instance.timeoutUntil?.toIso8601String(), | ||||
|       'is_bot': instance.isBot, | ||||
|       'status': instance.status?.toJson(), | ||||
|       'last_typed': instance.lastTyped?.toIso8601String(), | ||||
|     }; | ||||
|  | ||||
| _SnChatSummary _$SnChatSummaryFromJson(Map<String, dynamic> json) => | ||||
|     _SnChatSummary( | ||||
|       unreadCount: (json['unread_count'] as num).toInt(), | ||||
|       lastMessage: SnChatMessage.fromJson( | ||||
|         json['last_message'] as Map<String, dynamic>, | ||||
|       ), | ||||
|       lastMessage: | ||||
|           json['last_message'] == null | ||||
|               ? null | ||||
|               : SnChatMessage.fromJson( | ||||
|                 json['last_message'] as Map<String, dynamic>, | ||||
|               ), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnChatSummaryToJson(_SnChatSummary instance) => | ||||
|     <String, dynamic>{ | ||||
|       'unread_count': instance.unreadCount, | ||||
|       'last_message': instance.lastMessage.toJson(), | ||||
|     }; | ||||
|  | ||||
| _MessageChange _$MessageChangeFromJson(Map<String, dynamic> json) => | ||||
|     _MessageChange( | ||||
|       messageId: json['message_id'] as String, | ||||
|       action: json['action'] as String, | ||||
|       message: | ||||
|           json['message'] == null | ||||
|               ? null | ||||
|               : SnChatMessage.fromJson(json['message'] as Map<String, dynamic>), | ||||
|       timestamp: DateTime.parse(json['timestamp'] as String), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$MessageChangeToJson(_MessageChange instance) => | ||||
|     <String, dynamic>{ | ||||
|       'message_id': instance.messageId, | ||||
|       'action': instance.action, | ||||
|       'message': instance.message?.toJson(), | ||||
|       'timestamp': instance.timestamp.toIso8601String(), | ||||
|       'last_message': instance.lastMessage?.toJson(), | ||||
|     }; | ||||
|  | ||||
| _MessageSyncResponse _$MessageSyncResponseFromJson(Map<String, dynamic> json) => | ||||
|     _MessageSyncResponse( | ||||
|       changes: | ||||
|           (json['changes'] as List<dynamic>?) | ||||
|               ?.map((e) => MessageChange.fromJson(e as Map<String, dynamic>)) | ||||
|       messages: | ||||
|           (json['messages'] as List<dynamic>?) | ||||
|               ?.map((e) => SnChatMessage.fromJson(e as Map<String, dynamic>)) | ||||
|               .toList() ?? | ||||
|           const [], | ||||
|       currentTimestamp: DateTime.parse(json['current_timestamp'] as String), | ||||
| @@ -247,7 +240,7 @@ _MessageSyncResponse _$MessageSyncResponseFromJson(Map<String, dynamic> json) => | ||||
| Map<String, dynamic> _$MessageSyncResponseToJson( | ||||
|   _MessageSyncResponse instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'changes': instance.changes.map((e) => e.toJson()).toList(), | ||||
|   'messages': instance.messages.map((e) => e.toJson()).toList(), | ||||
|   'current_timestamp': instance.currentTimestamp.toIso8601String(), | ||||
| }; | ||||
|  | ||||
| @@ -283,11 +276,6 @@ _CallParticipant _$CallParticipantFromJson(Map<String, dynamic> json) => | ||||
|       identity: json['identity'] as String, | ||||
|       name: json['name'] as String, | ||||
|       joinedAt: DateTime.parse(json['joined_at'] as String), | ||||
|       accountId: json['account_id'] as String?, | ||||
|       profile: | ||||
|           json['profile'] == null | ||||
|               ? null | ||||
|               : SnChatMember.fromJson(json['profile'] as Map<String, dynamic>), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | ||||
| @@ -295,8 +283,6 @@ Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | ||||
|       'identity': instance.identity, | ||||
|       'name': instance.name, | ||||
|       'joined_at': instance.joinedAt.toIso8601String(), | ||||
|       'account_id': instance.accountId, | ||||
|       'profile': instance.profile?.toJson(), | ||||
|     }; | ||||
|  | ||||
| _SnRealtimeCall _$SnRealtimeCallFromJson(Map<String, dynamic> json) => | ||||
|   | ||||
							
								
								
									
										71
									
								
								lib/models/custom_app.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,71 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
| import 'package:island/models/account.dart'; | ||||
|  | ||||
| part 'custom_app.freezed.dart'; | ||||
| part 'custom_app.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class CustomApp with _$CustomApp { | ||||
|   const factory CustomApp({ | ||||
|     @Default('') String id, | ||||
|     @Default('') String slug, | ||||
|     @Default('') String name, | ||||
|     String? description, | ||||
|     @Default(0) int status, | ||||
|     SnCloudFile? picture, | ||||
|     SnCloudFile? background, | ||||
|     SnVerificationMark? verification, | ||||
|     CustomAppOauthConfig? oauthConfig, | ||||
|     CustomAppLinks? links, | ||||
|     @Default([]) List<CustomAppSecret> secrets, | ||||
|     @Default('') String publisherId, | ||||
|   }) = _CustomApp; | ||||
|  | ||||
|   factory CustomApp.fromJson(Map<String, dynamic> json) => | ||||
|       _$CustomAppFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class CustomAppLinks with _$CustomAppLinks { | ||||
|   const factory CustomAppLinks({ | ||||
|     String? homePage, | ||||
|     String? privacyPolicy, | ||||
|     String? termsOfService, | ||||
|   }) = _CustomAppLinks; | ||||
|  | ||||
|   factory CustomAppLinks.fromJson(Map<String, dynamic> json) => | ||||
|       _$CustomAppLinksFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class CustomAppOauthConfig with _$CustomAppOauthConfig { | ||||
|   const factory CustomAppOauthConfig({ | ||||
|     String? clientUri, | ||||
|     @Default([]) List<String> redirectUris, | ||||
|     List<String>? postLogoutRedirectUris, | ||||
|     @Default(['openid', 'profile', 'email']) List<String> allowedScopes, | ||||
|     @Default(['authorization_code', 'refresh_token']) | ||||
|     List<String> allowedGrantTypes, | ||||
|     @Default(true) bool requirePkce, | ||||
|     @Default(false) bool allowOfflineAccess, | ||||
|   }) = _CustomAppOauthConfig; | ||||
|  | ||||
|   factory CustomAppOauthConfig.fromJson(Map<String, dynamic> json) => | ||||
|       _$CustomAppOauthConfigFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class CustomAppSecret with _$CustomAppSecret { | ||||
|   const factory CustomAppSecret({ | ||||
|     @Default('') String id, | ||||
|     @Default('') String secret, | ||||
|     String? description, | ||||
|     DateTime? expiredAt, | ||||
|     @Default(false) bool isOidc, | ||||
|     @Default('') String appId, | ||||
|   }) = _CustomAppSecret; | ||||
|  | ||||
|   factory CustomAppSecret.fromJson(Map<String, dynamic> json) => | ||||
|       _$CustomAppSecretFromJson(json); | ||||
| } | ||||
							
								
								
									
										1266
									
								
								lib/models/custom_app.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										137
									
								
								lib/models/custom_app.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,137 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'custom_app.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _CustomApp _$CustomAppFromJson(Map<String, dynamic> json) => _CustomApp( | ||||
|   id: json['id'] as String? ?? '', | ||||
|   slug: json['slug'] as String? ?? '', | ||||
|   name: json['name'] as String? ?? '', | ||||
|   description: json['description'] as String?, | ||||
|   status: (json['status'] as num?)?.toInt() ?? 0, | ||||
|   picture: | ||||
|       json['picture'] == null | ||||
|           ? null | ||||
|           : SnCloudFile.fromJson(json['picture'] as Map<String, dynamic>), | ||||
|   background: | ||||
|       json['background'] == null | ||||
|           ? null | ||||
|           : SnCloudFile.fromJson(json['background'] as Map<String, dynamic>), | ||||
|   verification: | ||||
|       json['verification'] == null | ||||
|           ? null | ||||
|           : SnVerificationMark.fromJson( | ||||
|             json['verification'] as Map<String, dynamic>, | ||||
|           ), | ||||
|   oauthConfig: | ||||
|       json['oauth_config'] == null | ||||
|           ? null | ||||
|           : CustomAppOauthConfig.fromJson( | ||||
|             json['oauth_config'] as Map<String, dynamic>, | ||||
|           ), | ||||
|   links: | ||||
|       json['links'] == null | ||||
|           ? null | ||||
|           : CustomAppLinks.fromJson(json['links'] as Map<String, dynamic>), | ||||
|   secrets: | ||||
|       (json['secrets'] as List<dynamic>?) | ||||
|           ?.map((e) => CustomAppSecret.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   publisherId: json['publisher_id'] as String? ?? '', | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$CustomAppToJson(_CustomApp instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'slug': instance.slug, | ||||
|       'name': instance.name, | ||||
|       'description': instance.description, | ||||
|       'status': instance.status, | ||||
|       'picture': instance.picture?.toJson(), | ||||
|       'background': instance.background?.toJson(), | ||||
|       'verification': instance.verification?.toJson(), | ||||
|       'oauth_config': instance.oauthConfig?.toJson(), | ||||
|       'links': instance.links?.toJson(), | ||||
|       'secrets': instance.secrets.map((e) => e.toJson()).toList(), | ||||
|       'publisher_id': instance.publisherId, | ||||
|     }; | ||||
|  | ||||
| _CustomAppLinks _$CustomAppLinksFromJson(Map<String, dynamic> json) => | ||||
|     _CustomAppLinks( | ||||
|       homePage: json['home_page'] as String?, | ||||
|       privacyPolicy: json['privacy_policy'] as String?, | ||||
|       termsOfService: json['terms_of_service'] as String?, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$CustomAppLinksToJson(_CustomAppLinks instance) => | ||||
|     <String, dynamic>{ | ||||
|       'home_page': instance.homePage, | ||||
|       'privacy_policy': instance.privacyPolicy, | ||||
|       'terms_of_service': instance.termsOfService, | ||||
|     }; | ||||
|  | ||||
| _CustomAppOauthConfig _$CustomAppOauthConfigFromJson( | ||||
|   Map<String, dynamic> json, | ||||
| ) => _CustomAppOauthConfig( | ||||
|   clientUri: json['client_uri'] as String?, | ||||
|   redirectUris: | ||||
|       (json['redirect_uris'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   postLogoutRedirectUris: | ||||
|       (json['post_logout_redirect_uris'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList(), | ||||
|   allowedScopes: | ||||
|       (json['allowed_scopes'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList() ?? | ||||
|       const ['openid', 'profile', 'email'], | ||||
|   allowedGrantTypes: | ||||
|       (json['allowed_grant_types'] as List<dynamic>?) | ||||
|           ?.map((e) => e as String) | ||||
|           .toList() ?? | ||||
|       const ['authorization_code', 'refresh_token'], | ||||
|   requirePkce: json['require_pkce'] as bool? ?? true, | ||||
|   allowOfflineAccess: json['allow_offline_access'] as bool? ?? false, | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$CustomAppOauthConfigToJson( | ||||
|   _CustomAppOauthConfig instance, | ||||
| ) => <String, dynamic>{ | ||||
|   'client_uri': instance.clientUri, | ||||
|   'redirect_uris': instance.redirectUris, | ||||
|   'post_logout_redirect_uris': instance.postLogoutRedirectUris, | ||||
|   'allowed_scopes': instance.allowedScopes, | ||||
|   'allowed_grant_types': instance.allowedGrantTypes, | ||||
|   'require_pkce': instance.requirePkce, | ||||
|   'allow_offline_access': instance.allowOfflineAccess, | ||||
| }; | ||||
|  | ||||
| _CustomAppSecret _$CustomAppSecretFromJson(Map<String, dynamic> json) => | ||||
|     _CustomAppSecret( | ||||
|       id: json['id'] as String? ?? '', | ||||
|       secret: json['secret'] as String? ?? '', | ||||
|       description: json['description'] as String?, | ||||
|       expiredAt: | ||||
|           json['expired_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['expired_at'] as String), | ||||
|       isOidc: json['is_oidc'] as bool? ?? false, | ||||
|       appId: json['app_id'] as String? ?? '', | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$CustomAppSecretToJson(_CustomAppSecret instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'secret': instance.secret, | ||||
|       'description': instance.description, | ||||
|       'expired_at': instance.expiredAt?.toIso8601String(), | ||||
|       'is_oidc': instance.isOidc, | ||||
|       'app_id': instance.appId, | ||||
|     }; | ||||
							
								
								
									
										19
									
								
								lib/models/custom_app_secret.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,19 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
|  | ||||
| part 'custom_app_secret.freezed.dart'; | ||||
| part 'custom_app_secret.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class CustomAppSecret with _$CustomAppSecret { | ||||
|   const factory CustomAppSecret({ | ||||
|     required String id, | ||||
|     required String? secret, | ||||
|     required DateTime createdAt, | ||||
|     String? description, | ||||
|     int? expiresIn, | ||||
|     bool? isOidc, | ||||
|   }) = _CustomAppSecret; | ||||
|  | ||||
|   factory CustomAppSecret.fromJson(Map<String, dynamic> json) => | ||||
|       _$CustomAppSecretFromJson(json); | ||||
| } | ||||
							
								
								
									
										286
									
								
								lib/models/custom_app_secret.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,286 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| part of 'custom_app_secret.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // FreezedGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$CustomAppSecret { | ||||
|  | ||||
|  String get id; String? get secret; DateTime get createdAt; String? get description; int? get expiresIn; bool? get isOidc; | ||||
| /// Create a copy of CustomAppSecret | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $CustomAppSecretCopyWith<CustomAppSecret> get copyWith => _$CustomAppSecretCopyWithImpl<CustomAppSecret>(this as CustomAppSecret, _$identity); | ||||
|  | ||||
|   /// Serializes this CustomAppSecret to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is CustomAppSecret&&(identical(other.id, id) || other.id == id)&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.description, description) || other.description == description)&&(identical(other.expiresIn, expiresIn) || other.expiresIn == expiresIn)&&(identical(other.isOidc, isOidc) || other.isOidc == isOidc)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,secret,createdAt,description,expiresIn,isOidc); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'CustomAppSecret(id: $id, secret: $secret, createdAt: $createdAt, description: $description, expiresIn: $expiresIn, isOidc: $isOidc)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $CustomAppSecretCopyWith<$Res>  { | ||||
|   factory $CustomAppSecretCopyWith(CustomAppSecret value, $Res Function(CustomAppSecret) _then) = _$CustomAppSecretCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String? secret, DateTime createdAt, String? description, int? expiresIn, bool? isOidc | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$CustomAppSecretCopyWithImpl<$Res> | ||||
|     implements $CustomAppSecretCopyWith<$Res> { | ||||
|   _$CustomAppSecretCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final CustomAppSecret _self; | ||||
|   final $Res Function(CustomAppSecret) _then; | ||||
|  | ||||
| /// Create a copy of CustomAppSecret | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? secret = freezed,Object? createdAt = null,Object? description = freezed,Object? expiresIn = freezed,Object? isOidc = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,secret: freezed == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable | ||||
| as String?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,expiresIn: freezed == expiresIn ? _self.expiresIn : expiresIn // ignore: cast_nullable_to_non_nullable | ||||
| as int?,isOidc: freezed == isOidc ? _self.isOidc : isOidc // ignore: cast_nullable_to_non_nullable | ||||
| as bool?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [CustomAppSecret]. | ||||
| extension CustomAppSecretPatterns on CustomAppSecret { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _CustomAppSecret value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _CustomAppSecret value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CustomAppSecret value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String? secret,  DateTime createdAt,  String? description,  int? expiresIn,  bool? isOidc)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that.id,_that.secret,_that.createdAt,_that.description,_that.expiresIn,_that.isOidc);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String? secret,  DateTime createdAt,  String? description,  int? expiresIn,  bool? isOidc)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret(): | ||||
| return $default(_that.id,_that.secret,_that.createdAt,_that.description,_that.expiresIn,_that.isOidc);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String? secret,  DateTime createdAt,  String? description,  int? expiresIn,  bool? isOidc)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that.id,_that.secret,_that.createdAt,_that.description,_that.expiresIn,_that.isOidc);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _CustomAppSecret implements CustomAppSecret { | ||||
|   const _CustomAppSecret({required this.id, required this.secret, required this.createdAt, this.description, this.expiresIn, this.isOidc}); | ||||
|   factory _CustomAppSecret.fromJson(Map<String, dynamic> json) => _$CustomAppSecretFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String? secret; | ||||
| @override final  DateTime createdAt; | ||||
| @override final  String? description; | ||||
| @override final  int? expiresIn; | ||||
| @override final  bool? isOidc; | ||||
|  | ||||
| /// Create a copy of CustomAppSecret | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$CustomAppSecretCopyWith<_CustomAppSecret> get copyWith => __$CustomAppSecretCopyWithImpl<_CustomAppSecret>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$CustomAppSecretToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _CustomAppSecret&&(identical(other.id, id) || other.id == id)&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.description, description) || other.description == description)&&(identical(other.expiresIn, expiresIn) || other.expiresIn == expiresIn)&&(identical(other.isOidc, isOidc) || other.isOidc == isOidc)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,secret,createdAt,description,expiresIn,isOidc); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'CustomAppSecret(id: $id, secret: $secret, createdAt: $createdAt, description: $description, expiresIn: $expiresIn, isOidc: $isOidc)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$CustomAppSecretCopyWith<$Res> implements $CustomAppSecretCopyWith<$Res> { | ||||
|   factory _$CustomAppSecretCopyWith(_CustomAppSecret value, $Res Function(_CustomAppSecret) _then) = __$CustomAppSecretCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String? secret, DateTime createdAt, String? description, int? expiresIn, bool? isOidc | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$CustomAppSecretCopyWithImpl<$Res> | ||||
|     implements _$CustomAppSecretCopyWith<$Res> { | ||||
|   __$CustomAppSecretCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _CustomAppSecret _self; | ||||
|   final $Res Function(_CustomAppSecret) _then; | ||||
|  | ||||
| /// Create a copy of CustomAppSecret | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? secret = freezed,Object? createdAt = null,Object? description = freezed,Object? expiresIn = freezed,Object? isOidc = freezed,}) { | ||||
|   return _then(_CustomAppSecret( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,secret: freezed == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable | ||||
| as String?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,expiresIn: freezed == expiresIn ? _self.expiresIn : expiresIn // ignore: cast_nullable_to_non_nullable | ||||
| as int?,isOidc: freezed == isOidc ? _self.isOidc : isOidc // ignore: cast_nullable_to_non_nullable | ||||
| as bool?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
							
								
								
									
										27
									
								
								lib/models/custom_app_secret.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'custom_app_secret.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _CustomAppSecret _$CustomAppSecretFromJson(Map<String, dynamic> json) => | ||||
|     _CustomAppSecret( | ||||
|       id: json['id'] as String, | ||||
|       secret: json['secret'] as String?, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       description: json['description'] as String?, | ||||
|       expiresIn: (json['expires_in'] as num?)?.toInt(), | ||||
|       isOidc: json['is_oidc'] as bool?, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$CustomAppSecretToJson(_CustomAppSecret instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'secret': instance.secret, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'description': instance.description, | ||||
|       'expires_in': instance.expiresIn, | ||||
|       'is_oidc': instance.isOidc, | ||||
|     }; | ||||
							
								
								
									
										23
									
								
								lib/models/dev_project.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
|  | ||||
| class DevProject { | ||||
|   final String id; | ||||
|   final String slug; | ||||
|   final String name; | ||||
|   final String? description; | ||||
|  | ||||
|   DevProject({ | ||||
|     required this.id, | ||||
|     required this.slug, | ||||
|     required this.name, | ||||
|     this.description, | ||||
|   }); | ||||
|  | ||||
|   factory DevProject.fromJson(Map<String, dynamic> json) { | ||||
|     return DevProject( | ||||
|       id: json['id'], | ||||
|       slug: json['slug'], | ||||
|       name: json['name'], | ||||
|       description: json['description'], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								lib/models/developer.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,26 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/publisher.dart'; | ||||
|  | ||||
| part 'developer.freezed.dart'; | ||||
| part 'developer.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnDeveloper with _$SnDeveloper { | ||||
|   const factory SnDeveloper({ | ||||
|     required String id, | ||||
|     required String publisherId, | ||||
|     SnPublisher? publisher, | ||||
|   }) = _SnDeveloper; | ||||
|  | ||||
|   factory SnDeveloper.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnDeveloperFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class DeveloperStats with _$DeveloperStats { | ||||
|   const factory DeveloperStats({@Default(0) int totalCustomApps}) = | ||||
|       _DeveloperStats; | ||||
|  | ||||
|   factory DeveloperStats.fromJson(Map<String, dynamic> json) => | ||||
|       _$DeveloperStatsFromJson(json); | ||||
| } | ||||
							
								
								
									
										558
									
								
								lib/models/developer.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,558 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| part of 'developer.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // FreezedGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnDeveloper { | ||||
|  | ||||
|  String get id; String get publisherId; SnPublisher? get publisher; | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnDeveloperCopyWith<SnDeveloper> get copyWith => _$SnDeveloperCopyWithImpl<SnDeveloper>(this as SnDeveloper, _$identity); | ||||
|  | ||||
|   /// Serializes this SnDeveloper to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnDeveloper&&(identical(other.id, id) || other.id == id)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,publisherId,publisher); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnDeveloper(id: $id, publisherId: $publisherId, publisher: $publisher)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnDeveloperCopyWith<$Res>  { | ||||
|   factory $SnDeveloperCopyWith(SnDeveloper value, $Res Function(SnDeveloper) _then) = _$SnDeveloperCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String publisherId, SnPublisher? publisher | ||||
| }); | ||||
|  | ||||
|  | ||||
| $SnPublisherCopyWith<$Res>? get publisher; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnDeveloperCopyWithImpl<$Res> | ||||
|     implements $SnDeveloperCopyWith<$Res> { | ||||
|   _$SnDeveloperCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnDeveloper _self; | ||||
|   final $Res Function(SnDeveloper) _then; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? publisherId = null,Object? publisher = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||
| as SnPublisher?, | ||||
|   )); | ||||
| } | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnPublisherCopyWith<$Res>? get publisher { | ||||
|     if (_self.publisher == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { | ||||
|     return _then(_self.copyWith(publisher: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnDeveloper]. | ||||
| extension SnDeveloperPatterns on SnDeveloper { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnDeveloper value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnDeveloper value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnDeveloper value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String publisherId,  SnPublisher? publisher)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String publisherId,  SnPublisher? publisher)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper(): | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String publisherId,  SnPublisher? publisher)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnDeveloper implements SnDeveloper { | ||||
|   const _SnDeveloper({required this.id, required this.publisherId, this.publisher}); | ||||
|   factory _SnDeveloper.fromJson(Map<String, dynamic> json) => _$SnDeveloperFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String publisherId; | ||||
| @override final  SnPublisher? publisher; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnDeveloperCopyWith<_SnDeveloper> get copyWith => __$SnDeveloperCopyWithImpl<_SnDeveloper>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnDeveloperToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnDeveloper&&(identical(other.id, id) || other.id == id)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,publisherId,publisher); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnDeveloper(id: $id, publisherId: $publisherId, publisher: $publisher)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnDeveloperCopyWith<$Res> implements $SnDeveloperCopyWith<$Res> { | ||||
|   factory _$SnDeveloperCopyWith(_SnDeveloper value, $Res Function(_SnDeveloper) _then) = __$SnDeveloperCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String publisherId, SnPublisher? publisher | ||||
| }); | ||||
|  | ||||
|  | ||||
| @override $SnPublisherCopyWith<$Res>? get publisher; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnDeveloperCopyWithImpl<$Res> | ||||
|     implements _$SnDeveloperCopyWith<$Res> { | ||||
|   __$SnDeveloperCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnDeveloper _self; | ||||
|   final $Res Function(_SnDeveloper) _then; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? publisherId = null,Object? publisher = freezed,}) { | ||||
|   return _then(_SnDeveloper( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||
| as SnPublisher?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnPublisherCopyWith<$Res>? get publisher { | ||||
|     if (_self.publisher == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { | ||||
|     return _then(_self.copyWith(publisher: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$DeveloperStats { | ||||
|  | ||||
|  int get totalCustomApps; | ||||
| /// Create a copy of DeveloperStats | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $DeveloperStatsCopyWith<DeveloperStats> get copyWith => _$DeveloperStatsCopyWithImpl<DeveloperStats>(this as DeveloperStats, _$identity); | ||||
|  | ||||
|   /// Serializes this DeveloperStats to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is DeveloperStats&&(identical(other.totalCustomApps, totalCustomApps) || other.totalCustomApps == totalCustomApps)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,totalCustomApps); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'DeveloperStats(totalCustomApps: $totalCustomApps)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $DeveloperStatsCopyWith<$Res>  { | ||||
|   factory $DeveloperStatsCopyWith(DeveloperStats value, $Res Function(DeveloperStats) _then) = _$DeveloperStatsCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  int totalCustomApps | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$DeveloperStatsCopyWithImpl<$Res> | ||||
|     implements $DeveloperStatsCopyWith<$Res> { | ||||
|   _$DeveloperStatsCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final DeveloperStats _self; | ||||
|   final $Res Function(DeveloperStats) _then; | ||||
|  | ||||
| /// Create a copy of DeveloperStats | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? totalCustomApps = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| totalCustomApps: null == totalCustomApps ? _self.totalCustomApps : totalCustomApps // ignore: cast_nullable_to_non_nullable | ||||
| as int, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [DeveloperStats]. | ||||
| extension DeveloperStatsPatterns on DeveloperStats { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _DeveloperStats value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _DeveloperStats value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _DeveloperStats value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( int totalCustomApps)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that.totalCustomApps);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( int totalCustomApps)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats(): | ||||
| return $default(_that.totalCustomApps);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( int totalCustomApps)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that.totalCustomApps);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _DeveloperStats implements DeveloperStats { | ||||
|   const _DeveloperStats({this.totalCustomApps = 0}); | ||||
|   factory _DeveloperStats.fromJson(Map<String, dynamic> json) => _$DeveloperStatsFromJson(json); | ||||
|  | ||||
| @override@JsonKey() final  int totalCustomApps; | ||||
|  | ||||
| /// Create a copy of DeveloperStats | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$DeveloperStatsCopyWith<_DeveloperStats> get copyWith => __$DeveloperStatsCopyWithImpl<_DeveloperStats>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$DeveloperStatsToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _DeveloperStats&&(identical(other.totalCustomApps, totalCustomApps) || other.totalCustomApps == totalCustomApps)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,totalCustomApps); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'DeveloperStats(totalCustomApps: $totalCustomApps)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$DeveloperStatsCopyWith<$Res> implements $DeveloperStatsCopyWith<$Res> { | ||||
|   factory _$DeveloperStatsCopyWith(_DeveloperStats value, $Res Function(_DeveloperStats) _then) = __$DeveloperStatsCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  int totalCustomApps | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$DeveloperStatsCopyWithImpl<$Res> | ||||
|     implements _$DeveloperStatsCopyWith<$Res> { | ||||
|   __$DeveloperStatsCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _DeveloperStats _self; | ||||
|   final $Res Function(_DeveloperStats) _then; | ||||
|  | ||||
| /// Create a copy of DeveloperStats | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? totalCustomApps = null,}) { | ||||
|   return _then(_DeveloperStats( | ||||
| totalCustomApps: null == totalCustomApps ? _self.totalCustomApps : totalCustomApps // ignore: cast_nullable_to_non_nullable | ||||
| as int, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
							
								
								
									
										31
									
								
								lib/models/developer.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,31 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'developer.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnDeveloper _$SnDeveloperFromJson(Map<String, dynamic> json) => _SnDeveloper( | ||||
|   id: json['id'] as String, | ||||
|   publisherId: json['publisher_id'] as String, | ||||
|   publisher: | ||||
|       json['publisher'] == null | ||||
|           ? null | ||||
|           : SnPublisher.fromJson(json['publisher'] as Map<String, dynamic>), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnDeveloperToJson(_SnDeveloper instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'publisher_id': instance.publisherId, | ||||
|       'publisher': instance.publisher?.toJson(), | ||||
|     }; | ||||
|  | ||||
| _DeveloperStats _$DeveloperStatsFromJson(Map<String, dynamic> json) => | ||||
|     _DeveloperStats( | ||||
|       totalCustomApps: (json['total_custom_apps'] as num?)?.toInt() ?? 0, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$DeveloperStatsToJson(_DeveloperStats instance) => | ||||
|     <String, dynamic>{'total_custom_apps': instance.totalCustomApps}; | ||||
| @@ -3,25 +3,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| part 'embed.freezed.dart'; | ||||
| part 'embed.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnEmbedLink with _$SnEmbedLink { | ||||
|   const factory SnEmbedLink({ | ||||
|     @JsonKey(name: 'Type') required String type, | ||||
|     @JsonKey(name: 'Url') required String url, | ||||
|     @JsonKey(name: 'Title') required String title, | ||||
|     @JsonKey(name: 'Description') required String? description, | ||||
|     @JsonKey(name: 'ImageUrl') required String? imageUrl, | ||||
|     @JsonKey(name: 'FaviconUrl') required String faviconUrl, | ||||
|     @JsonKey(name: 'SiteName') required String siteName, | ||||
|     @JsonKey(name: 'ContentType') required String? contentType, | ||||
|     @JsonKey(name: 'Author') required String? author, | ||||
|     @JsonKey(name: 'PublishedDate') required DateTime? publishedDate, | ||||
|   }) = _SnEmbedLink; | ||||
|  | ||||
|   factory SnEmbedLink.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnEmbedLinkFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnScrappedLink with _$SnScrappedLink { | ||||
|   const factory SnScrappedLink({ | ||||
| @@ -30,8 +11,8 @@ sealed class SnScrappedLink with _$SnScrappedLink { | ||||
|     required String title, | ||||
|     required String? description, | ||||
|     required String? imageUrl, | ||||
|     required String faviconUrl, | ||||
|     required String siteName, | ||||
|     required String? faviconUrl, | ||||
|     required String? siteName, | ||||
|     required String? contentType, | ||||
|     required String? author, | ||||
|     required DateTime? publishedDate, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -13,170 +12,10 @@ part of 'embed.dart'; | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnEmbedLink { | ||||
|  | ||||
| @JsonKey(name: 'Type') String get type;@JsonKey(name: 'Url') String get url;@JsonKey(name: 'Title') String get title;@JsonKey(name: 'Description') String? get description;@JsonKey(name: 'ImageUrl') String? get imageUrl;@JsonKey(name: 'FaviconUrl') String get faviconUrl;@JsonKey(name: 'SiteName') String get siteName;@JsonKey(name: 'ContentType') String? get contentType;@JsonKey(name: 'Author') String? get author;@JsonKey(name: 'PublishedDate') DateTime? get publishedDate; | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnEmbedLinkCopyWith<SnEmbedLink> get copyWith => _$SnEmbedLinkCopyWithImpl<SnEmbedLink>(this as SnEmbedLink, _$identity); | ||||
|  | ||||
|   /// Serializes this SnEmbedLink to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnEmbedLink&&(identical(other.type, type) || other.type == type)&&(identical(other.url, url) || other.url == url)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.imageUrl, imageUrl) || other.imageUrl == imageUrl)&&(identical(other.faviconUrl, faviconUrl) || other.faviconUrl == faviconUrl)&&(identical(other.siteName, siteName) || other.siteName == siteName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.author, author) || other.author == author)&&(identical(other.publishedDate, publishedDate) || other.publishedDate == publishedDate)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,url,title,description,imageUrl,faviconUrl,siteName,contentType,author,publishedDate); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnEmbedLink(type: $type, url: $url, title: $title, description: $description, imageUrl: $imageUrl, faviconUrl: $faviconUrl, siteName: $siteName, contentType: $contentType, author: $author, publishedDate: $publishedDate)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnEmbedLinkCopyWith<$Res>  { | ||||
|   factory $SnEmbedLinkCopyWith(SnEmbedLink value, $Res Function(SnEmbedLink) _then) = _$SnEmbedLinkCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
| @JsonKey(name: 'Type') String type,@JsonKey(name: 'Url') String url,@JsonKey(name: 'Title') String title,@JsonKey(name: 'Description') String? description,@JsonKey(name: 'ImageUrl') String? imageUrl,@JsonKey(name: 'FaviconUrl') String faviconUrl,@JsonKey(name: 'SiteName') String siteName,@JsonKey(name: 'ContentType') String? contentType,@JsonKey(name: 'Author') String? author,@JsonKey(name: 'PublishedDate') DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnEmbedLinkCopyWithImpl<$Res> | ||||
|     implements $SnEmbedLinkCopyWith<$Res> { | ||||
|   _$SnEmbedLinkCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnEmbedLink _self; | ||||
|   final $Res Function(SnEmbedLink) _then; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnEmbedLink implements SnEmbedLink { | ||||
|   const _SnEmbedLink({@JsonKey(name: 'Type') required this.type, @JsonKey(name: 'Url') required this.url, @JsonKey(name: 'Title') required this.title, @JsonKey(name: 'Description') required this.description, @JsonKey(name: 'ImageUrl') required this.imageUrl, @JsonKey(name: 'FaviconUrl') required this.faviconUrl, @JsonKey(name: 'SiteName') required this.siteName, @JsonKey(name: 'ContentType') required this.contentType, @JsonKey(name: 'Author') required this.author, @JsonKey(name: 'PublishedDate') required this.publishedDate}); | ||||
|   factory _SnEmbedLink.fromJson(Map<String, dynamic> json) => _$SnEmbedLinkFromJson(json); | ||||
|  | ||||
| @override@JsonKey(name: 'Type') final  String type; | ||||
| @override@JsonKey(name: 'Url') final  String url; | ||||
| @override@JsonKey(name: 'Title') final  String title; | ||||
| @override@JsonKey(name: 'Description') final  String? description; | ||||
| @override@JsonKey(name: 'ImageUrl') final  String? imageUrl; | ||||
| @override@JsonKey(name: 'FaviconUrl') final  String faviconUrl; | ||||
| @override@JsonKey(name: 'SiteName') final  String siteName; | ||||
| @override@JsonKey(name: 'ContentType') final  String? contentType; | ||||
| @override@JsonKey(name: 'Author') final  String? author; | ||||
| @override@JsonKey(name: 'PublishedDate') final  DateTime? publishedDate; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnEmbedLinkCopyWith<_SnEmbedLink> get copyWith => __$SnEmbedLinkCopyWithImpl<_SnEmbedLink>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnEmbedLinkToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnEmbedLink&&(identical(other.type, type) || other.type == type)&&(identical(other.url, url) || other.url == url)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.imageUrl, imageUrl) || other.imageUrl == imageUrl)&&(identical(other.faviconUrl, faviconUrl) || other.faviconUrl == faviconUrl)&&(identical(other.siteName, siteName) || other.siteName == siteName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.author, author) || other.author == author)&&(identical(other.publishedDate, publishedDate) || other.publishedDate == publishedDate)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,url,title,description,imageUrl,faviconUrl,siteName,contentType,author,publishedDate); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnEmbedLink(type: $type, url: $url, title: $title, description: $description, imageUrl: $imageUrl, faviconUrl: $faviconUrl, siteName: $siteName, contentType: $contentType, author: $author, publishedDate: $publishedDate)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnEmbedLinkCopyWith<$Res> implements $SnEmbedLinkCopyWith<$Res> { | ||||
|   factory _$SnEmbedLinkCopyWith(_SnEmbedLink value, $Res Function(_SnEmbedLink) _then) = __$SnEmbedLinkCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
| @JsonKey(name: 'Type') String type,@JsonKey(name: 'Url') String url,@JsonKey(name: 'Title') String title,@JsonKey(name: 'Description') String? description,@JsonKey(name: 'ImageUrl') String? imageUrl,@JsonKey(name: 'FaviconUrl') String faviconUrl,@JsonKey(name: 'SiteName') String siteName,@JsonKey(name: 'ContentType') String? contentType,@JsonKey(name: 'Author') String? author,@JsonKey(name: 'PublishedDate') DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnEmbedLinkCopyWithImpl<$Res> | ||||
|     implements _$SnEmbedLinkCopyWith<$Res> { | ||||
|   __$SnEmbedLinkCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnEmbedLink _self; | ||||
|   final $Res Function(_SnEmbedLink) _then; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_SnEmbedLink( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnScrappedLink { | ||||
|  | ||||
|  String get type; String get url; String get title; String? get description; String? get imageUrl; String get faviconUrl; String get siteName; String? get contentType; String? get author; DateTime? get publishedDate; | ||||
|  String get type; String get url; String get title; String? get description; String? get imageUrl; String? get faviconUrl; String? get siteName; String? get contentType; String? get author; DateTime? get publishedDate; | ||||
| /// Create a copy of SnScrappedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -209,7 +48,7 @@ abstract mixin class $SnScrappedLinkCopyWith<$Res>  { | ||||
|   factory $SnScrappedLinkCopyWith(SnScrappedLink value, $Res Function(SnScrappedLink) _then) = _$SnScrappedLinkCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String type, String url, String title, String? description, String? imageUrl, String faviconUrl, String siteName, String? contentType, String? author, DateTime? publishedDate | ||||
|  String type, String url, String title, String? description, String? imageUrl, String? faviconUrl, String? siteName, String? contentType, String? author, DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -226,16 +65,16 @@ class _$SnScrappedLinkCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnScrappedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = freezed,Object? siteName = freezed,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: freezed == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,siteName: freezed == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String?,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
| @@ -245,6 +84,130 @@ as DateTime?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnScrappedLink]. | ||||
| extension SnScrappedLinkPatterns on SnScrappedLink { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnScrappedLink value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnScrappedLink value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnScrappedLink value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String? faviconUrl,  String? siteName,  String? contentType,  String? author,  DateTime? publishedDate)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String? faviconUrl,  String? siteName,  String? contentType,  String? author,  DateTime? publishedDate)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink(): | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String? faviconUrl,  String? siteName,  String? contentType,  String? author,  DateTime? publishedDate)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -257,8 +220,8 @@ class _SnScrappedLink implements SnScrappedLink { | ||||
| @override final  String title; | ||||
| @override final  String? description; | ||||
| @override final  String? imageUrl; | ||||
| @override final  String faviconUrl; | ||||
| @override final  String siteName; | ||||
| @override final  String? faviconUrl; | ||||
| @override final  String? siteName; | ||||
| @override final  String? contentType; | ||||
| @override final  String? author; | ||||
| @override final  DateTime? publishedDate; | ||||
| @@ -296,7 +259,7 @@ abstract mixin class _$SnScrappedLinkCopyWith<$Res> implements $SnScrappedLinkCo | ||||
|   factory _$SnScrappedLinkCopyWith(_SnScrappedLink value, $Res Function(_SnScrappedLink) _then) = __$SnScrappedLinkCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String type, String url, String title, String? description, String? imageUrl, String faviconUrl, String siteName, String? contentType, String? author, DateTime? publishedDate | ||||
|  String type, String url, String title, String? description, String? imageUrl, String? faviconUrl, String? siteName, String? contentType, String? author, DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -313,16 +276,16 @@ class __$SnScrappedLinkCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnScrappedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = freezed,Object? siteName = freezed,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_SnScrappedLink( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: freezed == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,siteName: freezed == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String?,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   | ||||
| @@ -6,36 +6,6 @@ part of 'embed.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnEmbedLink _$SnEmbedLinkFromJson(Map<String, dynamic> json) => _SnEmbedLink( | ||||
|   type: json['Type'] as String, | ||||
|   url: json['Url'] as String, | ||||
|   title: json['Title'] as String, | ||||
|   description: json['Description'] as String?, | ||||
|   imageUrl: json['ImageUrl'] as String?, | ||||
|   faviconUrl: json['FaviconUrl'] as String, | ||||
|   siteName: json['SiteName'] as String, | ||||
|   contentType: json['ContentType'] as String?, | ||||
|   author: json['Author'] as String?, | ||||
|   publishedDate: | ||||
|       json['PublishedDate'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['PublishedDate'] as String), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnEmbedLinkToJson(_SnEmbedLink instance) => | ||||
|     <String, dynamic>{ | ||||
|       'Type': instance.type, | ||||
|       'Url': instance.url, | ||||
|       'Title': instance.title, | ||||
|       'Description': instance.description, | ||||
|       'ImageUrl': instance.imageUrl, | ||||
|       'FaviconUrl': instance.faviconUrl, | ||||
|       'SiteName': instance.siteName, | ||||
|       'ContentType': instance.contentType, | ||||
|       'Author': instance.author, | ||||
|       'PublishedDate': instance.publishedDate?.toIso8601String(), | ||||
|     }; | ||||
|  | ||||
| _SnScrappedLink _$SnScrappedLinkFromJson(Map<String, dynamic> json) => | ||||
|     _SnScrappedLink( | ||||
|       type: json['type'] as String, | ||||
| @@ -43,8 +13,8 @@ _SnScrappedLink _$SnScrappedLinkFromJson(Map<String, dynamic> json) => | ||||
|       title: json['title'] as String, | ||||
|       description: json['description'] as String?, | ||||
|       imageUrl: json['image_url'] as String?, | ||||
|       faviconUrl: json['favicon_url'] as String, | ||||
|       siteName: json['site_name'] as String, | ||||
|       faviconUrl: json['favicon_url'] as String?, | ||||
|       siteName: json['site_name'] as String?, | ||||
|       contentType: json['content_type'] as String?, | ||||
|       author: json['author'] as String?, | ||||
|       publishedDate: | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/file_pool.dart'; | ||||
|  | ||||
| part 'file.freezed.dart'; | ||||
| part 'file.g.dart'; | ||||
| @@ -12,6 +13,7 @@ sealed class UniversalFile with _$UniversalFile { | ||||
|   const factory UniversalFile({ | ||||
|     required dynamic data, | ||||
|     required UniversalFileType type, | ||||
|     @Default(false) bool isLink, | ||||
|   }) = _UniversalFile; | ||||
|  | ||||
|   factory UniversalFile.fromJson(Map<String, dynamic> json) => | ||||
| @@ -41,6 +43,8 @@ sealed class SnCloudFile with _$SnCloudFile { | ||||
|     required String? description, | ||||
|     required Map<String, dynamic>? fileMeta, | ||||
|     required Map<String, dynamic>? userMeta, | ||||
|     required SnFilePool? pool, | ||||
|     @Default([]) List<int> sensitiveMarks, | ||||
|     required String? mimeType, | ||||
|     required String? hash, | ||||
|     required int size, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -16,7 +15,7 @@ T _$identity<T>(T value) => value; | ||||
| /// @nodoc | ||||
| mixin _$UniversalFile { | ||||
|  | ||||
|  dynamic get data; UniversalFileType get type; | ||||
|  dynamic get data; UniversalFileType get type; bool get isLink; | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -29,16 +28,16 @@ $UniversalFileCopyWith<UniversalFile> get copyWith => _$UniversalFileCopyWithImp | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)&&(identical(other.isLink, isLink) || other.isLink == isLink)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type,isLink); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'UniversalFile(data: $data, type: $type)'; | ||||
|   return 'UniversalFile(data: $data, type: $type, isLink: $isLink)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -49,7 +48,7 @@ abstract mixin class $UniversalFileCopyWith<$Res>  { | ||||
|   factory $UniversalFileCopyWith(UniversalFile value, $Res Function(UniversalFile) _then) = _$UniversalFileCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  dynamic data, UniversalFileType type | ||||
|  dynamic data, UniversalFileType type, bool isLink | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -66,26 +65,152 @@ class _$UniversalFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? data = freezed,Object? type = null,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? data = freezed,Object? type = null,Object? isLink = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as UniversalFileType, | ||||
| as UniversalFileType,isLink: null == isLink ? _self.isLink : isLink // ignore: cast_nullable_to_non_nullable | ||||
| as bool, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [UniversalFile]. | ||||
| extension UniversalFilePatterns on UniversalFile { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _UniversalFile value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _UniversalFile value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _UniversalFile value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( dynamic data,  UniversalFileType type,  bool isLink)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that.data,_that.type,_that.isLink);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( dynamic data,  UniversalFileType type,  bool isLink)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile(): | ||||
| return $default(_that.data,_that.type,_that.isLink);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( dynamic data,  UniversalFileType type,  bool isLink)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that.data,_that.type,_that.isLink);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _UniversalFile extends UniversalFile { | ||||
|   const _UniversalFile({required this.data, required this.type}): super._(); | ||||
|   const _UniversalFile({required this.data, required this.type, this.isLink = false}): super._(); | ||||
|   factory _UniversalFile.fromJson(Map<String, dynamic> json) => _$UniversalFileFromJson(json); | ||||
|  | ||||
| @override final  dynamic data; | ||||
| @override final  UniversalFileType type; | ||||
| @override@JsonKey() final  bool isLink; | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @@ -100,16 +225,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)&&(identical(other.isLink, isLink) || other.isLink == isLink)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type,isLink); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'UniversalFile(data: $data, type: $type)'; | ||||
|   return 'UniversalFile(data: $data, type: $type, isLink: $isLink)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -120,7 +245,7 @@ abstract mixin class _$UniversalFileCopyWith<$Res> implements $UniversalFileCopy | ||||
|   factory _$UniversalFileCopyWith(_UniversalFile value, $Res Function(_UniversalFile) _then) = __$UniversalFileCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  dynamic data, UniversalFileType type | ||||
|  dynamic data, UniversalFileType type, bool isLink | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -137,11 +262,12 @@ class __$UniversalFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? data = freezed,Object? type = null,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? data = freezed,Object? type = null,Object? isLink = null,}) { | ||||
|   return _then(_UniversalFile( | ||||
| data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as UniversalFileType, | ||||
| as UniversalFileType,isLink: null == isLink ? _self.isLink : isLink // ignore: cast_nullable_to_non_nullable | ||||
| as bool, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| @@ -152,7 +278,7 @@ as UniversalFileType, | ||||
| /// @nodoc | ||||
| mixin _$SnCloudFile { | ||||
|  | ||||
|  String get id; String get name; String? get description; Map<String, dynamic>? get fileMeta; Map<String, dynamic>? get userMeta; String? get mimeType; String? get hash; int get size; DateTime? get uploadedAt; String? get uploadedTo; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
|  String get id; String get name; String? get description; Map<String, dynamic>? get fileMeta; Map<String, dynamic>? get userMeta; SnFilePool? get pool; List<int> get sensitiveMarks; String? get mimeType; String? get hash; int get size; DateTime? get uploadedAt; String? get uploadedTo; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -165,16 +291,16 @@ $SnCloudFileCopyWith<SnCloudFile> get copyWith => _$SnCloudFileCopyWithImpl<SnCl | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other.fileMeta, fileMeta)&&const DeepCollectionEquality().equals(other.userMeta, userMeta)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other.fileMeta, fileMeta)&&const DeepCollectionEquality().equals(other.userMeta, userMeta)&&(identical(other.pool, pool) || other.pool == pool)&&const DeepCollectionEquality().equals(other.sensitiveMarks, sensitiveMarks)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(fileMeta),const DeepCollectionEquality().hash(userMeta),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(fileMeta),const DeepCollectionEquality().hash(userMeta),pool,const DeepCollectionEquality().hash(sensitiveMarks),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, pool: $pool, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -185,11 +311,11 @@ abstract mixin class $SnCloudFileCopyWith<$Res>  { | ||||
|   factory $SnCloudFileCopyWith(SnCloudFile value, $Res Function(SnCloudFile) _then) = _$SnCloudFileCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, SnFilePool? pool, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
| $SnFilePoolCopyWith<$Res>? get pool; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| @@ -202,14 +328,16 @@ class _$SnCloudFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? pool = freezed,Object? sensitiveMarks = null,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,fileMeta: freezed == fileMeta ? _self.fileMeta : fileMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,userMeta: freezed == userMeta ? _self.userMeta : userMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,pool: freezed == pool ? _self.pool : pool // ignore: cast_nullable_to_non_nullable | ||||
| as SnFilePool?,sensitiveMarks: null == sensitiveMarks ? _self.sensitiveMarks : sensitiveMarks // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,hash: freezed == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable | ||||
| as String?,size: null == size ? _self.size : size // ignore: cast_nullable_to_non_nullable | ||||
| as int,uploadedAt: freezed == uploadedAt ? _self.uploadedAt : uploadedAt // ignore: cast_nullable_to_non_nullable | ||||
| @@ -220,15 +348,151 @@ as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ign | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnFilePoolCopyWith<$Res>? get pool { | ||||
|     if (_self.pool == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnFilePoolCopyWith<$Res>(_self.pool!, (value) { | ||||
|     return _then(_self.copyWith(pool: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnCloudFile]. | ||||
| extension SnCloudFilePatterns on SnCloudFile { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnCloudFile value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnCloudFile value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnCloudFile value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  SnFilePool? pool,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.pool,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  SnFilePool? pool,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile(): | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.pool,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  SnFilePool? pool,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.pool,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnCloudFile implements SnCloudFile { | ||||
|   const _SnCloudFile({required this.id, required this.name, required this.description, required final  Map<String, dynamic>? fileMeta, required final  Map<String, dynamic>? userMeta, required this.mimeType, required this.hash, required this.size, required this.uploadedAt, required this.uploadedTo, required this.createdAt, required this.updatedAt, required this.deletedAt}): _fileMeta = fileMeta,_userMeta = userMeta; | ||||
|   const _SnCloudFile({required this.id, required this.name, required this.description, required final  Map<String, dynamic>? fileMeta, required final  Map<String, dynamic>? userMeta, required this.pool, final  List<int> sensitiveMarks = const [], required this.mimeType, required this.hash, required this.size, required this.uploadedAt, required this.uploadedTo, required this.createdAt, required this.updatedAt, required this.deletedAt}): _fileMeta = fileMeta,_userMeta = userMeta,_sensitiveMarks = sensitiveMarks; | ||||
|   factory _SnCloudFile.fromJson(Map<String, dynamic> json) => _$SnCloudFileFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @@ -252,6 +516,14 @@ class _SnCloudFile implements SnCloudFile { | ||||
|   return EqualUnmodifiableMapView(value); | ||||
| } | ||||
|  | ||||
| @override final  SnFilePool? pool; | ||||
|  final  List<int> _sensitiveMarks; | ||||
| @override@JsonKey() List<int> get sensitiveMarks { | ||||
|   if (_sensitiveMarks is EqualUnmodifiableListView) return _sensitiveMarks; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_sensitiveMarks); | ||||
| } | ||||
|  | ||||
| @override final  String? mimeType; | ||||
| @override final  String? hash; | ||||
| @override final  int size; | ||||
| @@ -274,16 +546,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other._fileMeta, _fileMeta)&&const DeepCollectionEquality().equals(other._userMeta, _userMeta)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other._fileMeta, _fileMeta)&&const DeepCollectionEquality().equals(other._userMeta, _userMeta)&&(identical(other.pool, pool) || other.pool == pool)&&const DeepCollectionEquality().equals(other._sensitiveMarks, _sensitiveMarks)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(_fileMeta),const DeepCollectionEquality().hash(_userMeta),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(_fileMeta),const DeepCollectionEquality().hash(_userMeta),pool,const DeepCollectionEquality().hash(_sensitiveMarks),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, pool: $pool, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -294,11 +566,11 @@ abstract mixin class _$SnCloudFileCopyWith<$Res> implements $SnCloudFileCopyWith | ||||
|   factory _$SnCloudFileCopyWith(_SnCloudFile value, $Res Function(_SnCloudFile) _then) = __$SnCloudFileCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, SnFilePool? pool, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
| @override $SnFilePoolCopyWith<$Res>? get pool; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| @@ -311,14 +583,16 @@ class __$SnCloudFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? pool = freezed,Object? sensitiveMarks = null,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_SnCloudFile( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,fileMeta: freezed == fileMeta ? _self._fileMeta : fileMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,userMeta: freezed == userMeta ? _self._userMeta : userMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,pool: freezed == pool ? _self.pool : pool // ignore: cast_nullable_to_non_nullable | ||||
| as SnFilePool?,sensitiveMarks: null == sensitiveMarks ? _self._sensitiveMarks : sensitiveMarks // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,hash: freezed == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable | ||||
| as String?,size: null == size ? _self.size : size // ignore: cast_nullable_to_non_nullable | ||||
| as int,uploadedAt: freezed == uploadedAt ? _self.uploadedAt : uploadedAt // ignore: cast_nullable_to_non_nullable | ||||
| @@ -330,7 +604,19 @@ as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnFilePoolCopyWith<$Res>? get pool { | ||||
|     if (_self.pool == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnFilePoolCopyWith<$Res>(_self.pool!, (value) { | ||||
|     return _then(_self.copyWith(pool: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
| // dart format on | ||||
|   | ||||
| @@ -10,12 +10,14 @@ _UniversalFile _$UniversalFileFromJson(Map<String, dynamic> json) => | ||||
|     _UniversalFile( | ||||
|       data: json['data'], | ||||
|       type: $enumDecode(_$UniversalFileTypeEnumMap, json['type']), | ||||
|       isLink: json['is_link'] as bool? ?? false, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$UniversalFileToJson(_UniversalFile instance) => | ||||
|     <String, dynamic>{ | ||||
|       'data': instance.data, | ||||
|       'type': _$UniversalFileTypeEnumMap[instance.type]!, | ||||
|       'is_link': instance.isLink, | ||||
|     }; | ||||
|  | ||||
| const _$UniversalFileTypeEnumMap = { | ||||
| @@ -31,6 +33,15 @@ _SnCloudFile _$SnCloudFileFromJson(Map<String, dynamic> json) => _SnCloudFile( | ||||
|   description: json['description'] as String?, | ||||
|   fileMeta: json['file_meta'] as Map<String, dynamic>?, | ||||
|   userMeta: json['user_meta'] as Map<String, dynamic>?, | ||||
|   pool: | ||||
|       json['pool'] == null | ||||
|           ? null | ||||
|           : SnFilePool.fromJson(json['pool'] as Map<String, dynamic>), | ||||
|   sensitiveMarks: | ||||
|       (json['sensitive_marks'] as List<dynamic>?) | ||||
|           ?.map((e) => (e as num).toInt()) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   mimeType: json['mime_type'] as String?, | ||||
|   hash: json['hash'] as String?, | ||||
|   size: (json['size'] as num).toInt(), | ||||
| @@ -54,6 +65,8 @@ Map<String, dynamic> _$SnCloudFileToJson(_SnCloudFile instance) => | ||||
|       'description': instance.description, | ||||
|       'file_meta': instance.fileMeta, | ||||
|       'user_meta': instance.userMeta, | ||||
|       'pool': instance.pool?.toJson(), | ||||
|       'sensitive_marks': instance.sensitiveMarks, | ||||
|       'mime_type': instance.mimeType, | ||||
|       'hash': instance.hash, | ||||
|       'size': instance.size, | ||||
|   | ||||
							
								
								
									
										25
									
								
								lib/models/file_pool.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
|  | ||||
| part 'file_pool.freezed.dart'; | ||||
| part 'file_pool.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnFilePool with _$SnFilePool { | ||||
|   const factory SnFilePool({ | ||||
|     required String id, | ||||
|     required String name, | ||||
|     String? description, | ||||
|     Map<String, dynamic>? storageConfig, | ||||
|     Map<String, dynamic>? billingConfig, | ||||
|     Map<String, dynamic>? policyConfig, | ||||
|     bool? isHidden, | ||||
|     String? accountId, | ||||
|     String? resourceIdentifier, | ||||
|     DateTime? createdAt, | ||||
|     DateTime? updatedAt, | ||||
|     DateTime? deletedAt, | ||||
|   }) = _SnFilePool; | ||||
|  | ||||
|   factory SnFilePool.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnFilePoolFromJson(json); | ||||
| } | ||||