Compare commits
	
		
			395 Commits
		
	
	
		
			3.0.0+112
			...
			b0f3b6b5c3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						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 | 
							
								
								
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -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,7 +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-0
 | 
			
		||||
          sudo apt-get install -y libsecret-1-dev
 | 
			
		||||
      - run: flutter pub get
 | 
			
		||||
      - run: flutter build linux
 | 
			
		||||
      - name: Archive production artifacts
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										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,15 +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:4.12.0")
 | 
			
		||||
    implementation("com.google.firebase:firebase-messaging-ktx")
 | 
			
		||||
    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
									
								
							
							
						
						
									
										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" />
 | 
			
		||||
@@ -89,6 +90,13 @@
 | 
			
		||||
            </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"
 | 
			
		||||
@@ -109,14 +117,6 @@
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:exported="true" />
 | 
			
		||||
 | 
			
		||||
        <service
 | 
			
		||||
            android:name=".service.MessagingService"
 | 
			
		||||
            android:exported="false">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </service>
 | 
			
		||||
 | 
			
		||||
        <provider
 | 
			
		||||
            android:name="androidx.core.content.FileProvider"
 | 
			
		||||
            android:authorities="dev.solsynth.solian.provider"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,102 +0,0 @@
 | 
			
		||||
package dev.solsynth.solian.service
 | 
			
		||||
 | 
			
		||||
import android.app.PendingIntent
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.graphics.Bitmap
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationManagerCompat
 | 
			
		||||
import androidx.core.app.RemoteInput
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.bumptech.glide.request.target.CustomTarget
 | 
			
		||||
import com.bumptech.glide.request.transition.Transition
 | 
			
		||||
import com.google.firebase.messaging.FirebaseMessagingService
 | 
			
		||||
import com.google.firebase.messaging.RemoteMessage
 | 
			
		||||
import dev.solsynth.solian.MainActivity
 | 
			
		||||
import dev.solsynth.solian.receiver.ReplyReceiver
 | 
			
		||||
import org.json.JSONObject
 | 
			
		||||
 | 
			
		||||
class MessagingService: FirebaseMessagingService() {
 | 
			
		||||
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
 | 
			
		||||
        val type = remoteMessage.data["type"]
 | 
			
		||||
        if (type == "messages.new") {
 | 
			
		||||
            handleMessageNotification(remoteMessage)
 | 
			
		||||
        } else {
 | 
			
		||||
            // Handle other notification types
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun handleMessageNotification(remoteMessage: RemoteMessage) {
 | 
			
		||||
        val data = remoteMessage.data
 | 
			
		||||
        val metaString = data["meta"] ?: return
 | 
			
		||||
        val meta = JSONObject(metaString)
 | 
			
		||||
 | 
			
		||||
        val pfp = meta.optString("pfp", null)
 | 
			
		||||
        val roomId = meta.optString("room_id", null)
 | 
			
		||||
        val messageId = meta.optString("message_id", null)
 | 
			
		||||
 | 
			
		||||
        val notificationId = System.currentTimeMillis().toInt()
 | 
			
		||||
 | 
			
		||||
        val replyLabel = "Reply"
 | 
			
		||||
        val remoteInput = RemoteInput.Builder("key_text_reply")
 | 
			
		||||
            .setLabel(replyLabel)
 | 
			
		||||
            .build()
 | 
			
		||||
 | 
			
		||||
        val replyIntent = Intent(this, ReplyReceiver::class.java).apply {
 | 
			
		||||
            putExtra("room_id", roomId)
 | 
			
		||||
            putExtra("message_id", messageId)
 | 
			
		||||
            putExtra("notification_id", notificationId)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val pendingIntentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
 | 
			
		||||
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
 | 
			
		||||
        } else {
 | 
			
		||||
            PendingIntent.FLAG_UPDATE_CURRENT
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val replyPendingIntent = PendingIntent.getBroadcast(
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            notificationId,
 | 
			
		||||
            replyIntent,
 | 
			
		||||
            pendingIntentFlags
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        val action = NotificationCompat.Action.Builder(
 | 
			
		||||
            android.R.drawable.ic_menu_send,
 | 
			
		||||
            replyLabel,
 | 
			
		||||
            replyPendingIntent
 | 
			
		||||
        )
 | 
			
		||||
            .addRemoteInput(remoteInput)
 | 
			
		||||
            .build()
 | 
			
		||||
 | 
			
		||||
        val intent = Intent(this, MainActivity::class.java)
 | 
			
		||||
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
 | 
			
		||||
        intent.putExtra("room_id", roomId)
 | 
			
		||||
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, pendingIntentFlags)
 | 
			
		||||
 | 
			
		||||
        val notificationBuilder = NotificationCompat.Builder(this, "messages")
 | 
			
		||||
            .setSmallIcon(android.R.drawable.ic_dialog_info)
 | 
			
		||||
            .setContentTitle(remoteMessage.notification?.title)
 | 
			
		||||
            .setContentText(remoteMessage.notification?.body)
 | 
			
		||||
            .setPriority(NotificationCompat.PRIORITY_HIGH)
 | 
			
		||||
            .setContentIntent(pendingIntent)
 | 
			
		||||
            .addAction(action)
 | 
			
		||||
 | 
			
		||||
        if (pfp != null) {
 | 
			
		||||
            Glide.with(applicationContext)
 | 
			
		||||
                .asBitmap()
 | 
			
		||||
                .load(pfp)
 | 
			
		||||
                .into(object : CustomTarget<Bitmap>() {
 | 
			
		||||
                    override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
 | 
			
		||||
                        notificationBuilder.setLargeIcon(resource)
 | 
			
		||||
                        NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build())
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    override fun onLoadCleared(placeholder: Drawable?) {}
 | 
			
		||||
                })
 | 
			
		||||
        } else {
 | 
			
		||||
            NotificationManagerCompat.from(this).notify(notificationId, notificationBuilder.build())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								android/app/src/main/res/drawable/ic_notification.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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")
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,8 @@
 | 
			
		||||
  "fieldEmailAddressMustBeValid": "The email address must be valid.",
 | 
			
		||||
  "logout": "Logout",
 | 
			
		||||
  "updateYourProfile": "Profile Settings",
 | 
			
		||||
  "settingsDefaultPool": "Default file pool",
 | 
			
		||||
  "settingsDefaultPoolHelper": "Select the default storage pool for file uploads",
 | 
			
		||||
  "accountBasicInfo": "Basic Info",
 | 
			
		||||
  "accountProfile": "Your Profile",
 | 
			
		||||
  "saveChanges": "Save Changes",
 | 
			
		||||
@@ -133,6 +135,25 @@
 | 
			
		||||
    "other": "{} replies"
 | 
			
		||||
  },
 | 
			
		||||
  "forward": "Forward",
 | 
			
		||||
  "award": "Award",
 | 
			
		||||
  "awardPost": "Award Post",
 | 
			
		||||
  "awardMessage": "Message",
 | 
			
		||||
  "awardMessageHint": "Enter your award message...",
 | 
			
		||||
  "awardAttitude": "Attitude",
 | 
			
		||||
  "awardAttitudePositive": "Positive",
 | 
			
		||||
  "awardAttitudeNegative": "Negative",
 | 
			
		||||
  "awardAmount": "Amount",
 | 
			
		||||
  "awardAmountHint": "Enter amount...",
 | 
			
		||||
  "awardAmountRequired": "Amount is required",
 | 
			
		||||
  "awardAmountInvalid": "Please enter a valid amount",
 | 
			
		||||
  "awardMessageTooLong": "Message is too long (max 4096 characters)",
 | 
			
		||||
  "awardSuccess": "Award sent successfully!",
 | 
			
		||||
  "awardSubmit": "Award",
 | 
			
		||||
  "awardPostPreview": "Post Preview",
 | 
			
		||||
  "awardNoContent": "No content available",
 | 
			
		||||
  "awardByPublisher": "By {}",
 | 
			
		||||
  "awardBenefits": "Award Benefits",
 | 
			
		||||
  "awardBenefitsDescription": "Awarding this post increases its value and visibility. Higher valued posts have a better chance of being featured and highlighted in the community.",
 | 
			
		||||
  "repliedTo": "Replied to",
 | 
			
		||||
  "forwarded": "Forwarded",
 | 
			
		||||
  "hasAttachments": {
 | 
			
		||||
@@ -144,9 +165,17 @@
 | 
			
		||||
    "other": "{} attachments"
 | 
			
		||||
  },
 | 
			
		||||
  "edited": "Edited",
 | 
			
		||||
  "editedAt": "Edited at {}",
 | 
			
		||||
  "addVideo": "Add video",
 | 
			
		||||
  "addPhoto": "Add photo",
 | 
			
		||||
  "addAudio": "Add audio",
 | 
			
		||||
  "addFile": "Add file",
 | 
			
		||||
  "uploadFile": "Upload File",
 | 
			
		||||
  "recordAudio": "Record Audio",
 | 
			
		||||
  "linkAttachment": "Link Attachment",
 | 
			
		||||
  "fileIdCannotBeEmpty": "File ID cannot be empty",
 | 
			
		||||
  "fileIdLinkHint": "Haven't upload to the Solar Network? Tap here to open Solar Network Drive to customize your uploads.",
 | 
			
		||||
  "failedToFetchFile": "Failed to fetch file: {}",
 | 
			
		||||
  "createDirectMessage": "Send new DM",
 | 
			
		||||
  "gotoDirectMessage": "Go to DM",
 | 
			
		||||
  "react": "React",
 | 
			
		||||
@@ -188,6 +217,7 @@
 | 
			
		||||
  "checkInResultLevel2": "A Normal Day",
 | 
			
		||||
  "checkInResultLevel3": "Good Luck",
 | 
			
		||||
  "checkInResultLevel4": "Best Luck",
 | 
			
		||||
  "checkInResultLevel5": "Happy Birthday 🥳",
 | 
			
		||||
  "checkInActivityTitle": "{} checked in on {} and got a {}",
 | 
			
		||||
  "eventCalander": "Event Calander",
 | 
			
		||||
  "eventCalanderEmpty": "No events on that day.",
 | 
			
		||||
@@ -221,6 +251,8 @@
 | 
			
		||||
  "settings": "Settings",
 | 
			
		||||
  "language": "Language",
 | 
			
		||||
  "accountLanguageHint": "This language will be used for email and push notifications.",
 | 
			
		||||
  "region": "Region",
 | 
			
		||||
  "accountRegionHint": "This region will be used for content delivery and localization.",
 | 
			
		||||
  "settingsDisplayLanguage": "Display Language",
 | 
			
		||||
  "languageFollowSystem": "Follow System",
 | 
			
		||||
  "postsCreatedCount": "Posts",
 | 
			
		||||
@@ -327,9 +359,11 @@
 | 
			
		||||
  "walletCreate": "Create a Wallet",
 | 
			
		||||
  "settingsServerUrl": "Server URL",
 | 
			
		||||
  "settingsApplied": "The settings has been applied.",
 | 
			
		||||
  "settingsCustomFontsHelper": "Use comma to seprate.",
 | 
			
		||||
  "notifications": "Notifications",
 | 
			
		||||
  "posts": "Posts",
 | 
			
		||||
  "settingsBackgroundImage": "Background Image",
 | 
			
		||||
  "settingsBackgroundImageEnable": "Show Background Image",
 | 
			
		||||
  "settingsBackgroundImageClear": "Clear Background Image",
 | 
			
		||||
  "settingsBackgroundGenerateColor": "Generate color scheme from Bacground Image",
 | 
			
		||||
  "messageNone": "No content to display",
 | 
			
		||||
@@ -340,6 +374,8 @@
 | 
			
		||||
  "chatBreakNone": "None",
 | 
			
		||||
  "settingsRealmCompactView": "Compact Realm View",
 | 
			
		||||
  "settingsMixedFeed": "Mixed Feed",
 | 
			
		||||
  "settingsDataSavingMode": "Data Saving Mode",
 | 
			
		||||
  "dataSavingHint": "Data Saving Mode",
 | 
			
		||||
  "settingsAutoTranslate": "Auto Translate",
 | 
			
		||||
  "settingsHideBottomNav": "Hide Bottom Navigation",
 | 
			
		||||
  "settingsSoundEffects": "Sound Effects",
 | 
			
		||||
@@ -352,6 +388,8 @@
 | 
			
		||||
  "postTitle": "Title",
 | 
			
		||||
  "postDescription": "Description",
 | 
			
		||||
  "call": "Call",
 | 
			
		||||
  "callLeave": "Leave",
 | 
			
		||||
  "callEnd": "End this call",
 | 
			
		||||
  "done": "Done",
 | 
			
		||||
  "loginResetPasswordSent": "Password reset link sent, please check your email inbox.",
 | 
			
		||||
  "accountDeletion": "Delete Account",
 | 
			
		||||
@@ -376,6 +414,7 @@
 | 
			
		||||
  "postSettings": "Settings",
 | 
			
		||||
  "postPublisherUnselected": "Publisher Unspecified",
 | 
			
		||||
  "postType": "Post Type",
 | 
			
		||||
  "postTypePost": "Post",
 | 
			
		||||
  "articleAttachmentHint": "Attachments must be uploaded and inserted into the article body to be visible.",
 | 
			
		||||
  "postVisibility": "Post Visibility",
 | 
			
		||||
  "postVisibilityPublic": "Public",
 | 
			
		||||
@@ -411,6 +450,8 @@
 | 
			
		||||
  "lastActiveAt": "Last active at {}",
 | 
			
		||||
  "authDeviceLogout": "Logout",
 | 
			
		||||
  "authDeviceLogoutHint": "Are you sure you want to logout this device? This will also disable the push notification to this device.",
 | 
			
		||||
  "authDeviceChallenges": "Device Usage",
 | 
			
		||||
  "authDeviceHint": "Swipe left to edit label, swipe right to logout device.",
 | 
			
		||||
  "typingHint": {
 | 
			
		||||
    "one": "{} is typing...",
 | 
			
		||||
    "other": "{} are typing..."
 | 
			
		||||
@@ -432,9 +473,12 @@
 | 
			
		||||
  "settingsKeyboardShortcutSettings": "Settings",
 | 
			
		||||
  "settingsKeyboardShortcutNewMessage": "New Message",
 | 
			
		||||
  "settingsKeyboardShortcutCloseDialog": "Close Dialog",
 | 
			
		||||
  "settingsMessageDisplayStyle": "Message Display Style",
 | 
			
		||||
  "close": "Close",
 | 
			
		||||
  "drafts": "Drafts",
 | 
			
		||||
  "noDrafts": "No drafts yet",
 | 
			
		||||
  "searchDrafts": "Search drafts...",
 | 
			
		||||
  "noSearchResults": "No search results",
 | 
			
		||||
  "articleDrafts": "Article drafts",
 | 
			
		||||
  "postDrafts": "Post drafts",
 | 
			
		||||
  "saveDraft": "Save draft",
 | 
			
		||||
@@ -481,6 +525,10 @@
 | 
			
		||||
  "contactMethodSetPrimary": "Set as Primary",
 | 
			
		||||
  "contactMethodSetPrimaryHint": "Set this contact method as your primary contact method for account recovery and notifications",
 | 
			
		||||
  "contactMethodDeleteHint": "Are you sure to delete this contact method? This action cannot be undone.",
 | 
			
		||||
  "contactMethodMakePublic": "Make Public",
 | 
			
		||||
  "contactMethodMakePrivate": "Make Private",
 | 
			
		||||
  "contactMethodPublic": "Public",
 | 
			
		||||
  "contactMethodPrivate": "Private",
 | 
			
		||||
  "chatNotifyLevel": "Notify Level",
 | 
			
		||||
  "chatNotifyLevelDescription": "Decide how many notifications you will receive.",
 | 
			
		||||
  "chatNotifyLevelAll": "All",
 | 
			
		||||
@@ -564,6 +612,7 @@
 | 
			
		||||
  "keyboardShortcuts": "Keyboard Shortcuts",
 | 
			
		||||
  "share": "Share",
 | 
			
		||||
  "sharePost": "Share Post",
 | 
			
		||||
  "sharePostPhoto": "Share Post as Photo",
 | 
			
		||||
  "quickActions": "Quick Actions",
 | 
			
		||||
  "post": "Post",
 | 
			
		||||
  "copy": "Copy",
 | 
			
		||||
@@ -622,8 +671,9 @@
 | 
			
		||||
  "chatJoin": "Join the Chat",
 | 
			
		||||
  "realmJoin": "Join the Realm",
 | 
			
		||||
  "realmJoinSuccess": "Successfully joined the realm.",
 | 
			
		||||
  "discoverRealms": "Discover Realms",
 | 
			
		||||
  "discoverPublishers": "Discover Publishers",
 | 
			
		||||
  "discoverRealms": "Realms",
 | 
			
		||||
  "discoverPublishers": "Publishers",
 | 
			
		||||
  "discoverShuffledPost": "Random Posts",
 | 
			
		||||
  "search": "Search",
 | 
			
		||||
  "publisherMembers": "Collaborators",
 | 
			
		||||
  "developerHub": "Developer Hub",
 | 
			
		||||
@@ -632,6 +682,18 @@
 | 
			
		||||
  "enrollDeveloperHint": "Enroll one of your publishers to become a developer.",
 | 
			
		||||
  "noPublishersToEnroll": "You don't have any publishers that can be enrolled as a developer.",
 | 
			
		||||
  "totalCustomApps": "Total Custom Apps",
 | 
			
		||||
  "projects": "Projects",
 | 
			
		||||
  "noProjects": "No projects found.",
 | 
			
		||||
  "deleteProject": "Delete Project",
 | 
			
		||||
  "deleteProjectHint": "Are you sure you want to delete this project? This action cannot be undone.",
 | 
			
		||||
  "createProject": "Create Project",
 | 
			
		||||
  "editProject": "Edit Project",
 | 
			
		||||
  "projectDetails": "Project Details",
 | 
			
		||||
  "createBot": "Create Bot",
 | 
			
		||||
  "bots": "Bots",
 | 
			
		||||
  "noBots": "No bots yet.",
 | 
			
		||||
  "deleteBotHint": "Are you sure you want to delete this bot? This action cannot be undone.",
 | 
			
		||||
  "deleteBot": "Delete Bot",
 | 
			
		||||
  "customApps": "Custom Apps",
 | 
			
		||||
  "noCustomApps": "No custom apps yet.",
 | 
			
		||||
  "createCustomApp": "Create Custom App",
 | 
			
		||||
@@ -669,7 +731,7 @@
 | 
			
		||||
  "publisherFeatureDevelopDescription": "Unlock development abilities for your publisher, including custom apps, API keys, and more.",
 | 
			
		||||
  "publisherFeatureDevelopHint": "Currently, this feature is under active development, you need send a request to unlock this feature.",
 | 
			
		||||
  "learnMore": "Learn More",
 | 
			
		||||
  "discoverWebArticles": "Articles from external sites",
 | 
			
		||||
  "discoverWebArticles": "Web Feed Articles",
 | 
			
		||||
  "webArticlesStand": "Article Stand",
 | 
			
		||||
  "about": "About",
 | 
			
		||||
  "membershipCancel": "Cancel Membership",
 | 
			
		||||
@@ -697,6 +759,269 @@
 | 
			
		||||
  "copyToClipboardTooltip": "Copy to clipboard",
 | 
			
		||||
  "postForwardingTo": "Forwarding to",
 | 
			
		||||
  "postReplyingTo": "Replying to",
 | 
			
		||||
  "postReplyPlaceholder": "Post your reply",
 | 
			
		||||
  "postEditing": "You are editing an existing post",
 | 
			
		||||
  "postArticle": "Article"
 | 
			
		||||
  "postArticle": "Article",
 | 
			
		||||
  "aboutDeviceName": "Device Name",
 | 
			
		||||
  "aboutDeviceIdentifier": "Device Identifier",
 | 
			
		||||
  "donate": "Donate",
 | 
			
		||||
  "donateDescription": "Support us to continue developing the Solar Network and keep the server up and running.",
 | 
			
		||||
  "fileId": "File ID",
 | 
			
		||||
  "fileIdHint": "The file ID is the ID you get after upload the file via the Solar Network Drive.",
 | 
			
		||||
  "translate": "Translate",
 | 
			
		||||
  "translating": "Translating",
 | 
			
		||||
  "translated": "Translated",
 | 
			
		||||
  "reactionThumbUp": "Thumbs Up",
 | 
			
		||||
  "reactionThumbDown": "Thumbs Down",
 | 
			
		||||
  "reactionJustOkay": "Just Okay",
 | 
			
		||||
  "reactionCry": "Cry",
 | 
			
		||||
  "reactionConfuse": "Confused",
 | 
			
		||||
  "reactionClap": "Clap",
 | 
			
		||||
  "reactionLaugh": "Laugh",
 | 
			
		||||
  "reactionAngry": "Angry",
 | 
			
		||||
  "reactionParty": "Party",
 | 
			
		||||
  "reactionPray": "Pray",
 | 
			
		||||
  "reactionHeart": "Heart",
 | 
			
		||||
  "selectMicrophone": "Select Microphone",
 | 
			
		||||
  "selectCamera": "Select Camera",
 | 
			
		||||
  "switchedTo": "Switched to {}",
 | 
			
		||||
  "connecting": "Connecting",
 | 
			
		||||
  "reconnecting": "Reconnecting",
 | 
			
		||||
  "disconnected": "Disconnected",
 | 
			
		||||
  "connected": "Connected",
 | 
			
		||||
  "repliesLoadMore": "Load more replies",
 | 
			
		||||
  "attachmentsRecentUploads": "Recent Uploads",
 | 
			
		||||
  "attachmentsManualInput": "Manual Input",
 | 
			
		||||
  "crop": "Crop",
 | 
			
		||||
  "rename": "Rename",
 | 
			
		||||
  "markAsSensitive": "Mark as Sensitive",
 | 
			
		||||
  "fileName": "File name",
 | 
			
		||||
  "sensitiveCategories.language": "Language",
 | 
			
		||||
  "sensitiveCategories.sexualContent": "Sexual Content",
 | 
			
		||||
  "sensitiveCategories.violence": "Violence",
 | 
			
		||||
  "sensitiveCategories.profanity": "Profanity",
 | 
			
		||||
  "sensitiveCategories.hateSpeech": "Hate Speech",
 | 
			
		||||
  "sensitiveCategories.racism": "Racism",
 | 
			
		||||
  "sensitiveCategories.adultContent": "Adult Content",
 | 
			
		||||
  "sensitiveCategories.drugAbuse": "Drug Abuse",
 | 
			
		||||
  "sensitiveCategories.alcoholAbuse": "Alcohol Abuse",
 | 
			
		||||
  "sensitiveCategories.gambling": "Gambling",
 | 
			
		||||
  "sensitiveCategories.selfHarm": "Self-harm",
 | 
			
		||||
  "sensitiveCategories.childAbuse": "Child Abuse",
 | 
			
		||||
  "sensitiveCategories.other": "Other",
 | 
			
		||||
  "poll": "Poll",
 | 
			
		||||
  "pollsRecent": "Recent Polls",
 | 
			
		||||
  "pollCreateNew": "Create New",
 | 
			
		||||
  "pollCreateNewHint": "Create a new poll for your post. Pick a publisher and continue.",
 | 
			
		||||
  "pollQuestions": "Questions",
 | 
			
		||||
  "publisher": "Publisher",
 | 
			
		||||
  "publisherHint": "Enter the publisher name",
 | 
			
		||||
  "publisherCannotBeEmpty": "Publisher cannot be empty",
 | 
			
		||||
  "operationFailed": "Operation failed: {}",
 | 
			
		||||
  "stickerMarketplace": "Sticker Marketplace",
 | 
			
		||||
  "stickerPackAdded": "Sticker pack added to your collection",
 | 
			
		||||
  "stickerPackRemoved": "Sticker pack removed from your collection",
 | 
			
		||||
  "addPack": "Add Pack",
 | 
			
		||||
  "removePack": "Remove Pack",
 | 
			
		||||
  "browseAndAddStickers": "Browse and add sticker packs",
 | 
			
		||||
  "stickerPack": "Sticker Pack",
 | 
			
		||||
  "postCategoryTechnology": "Technology",
 | 
			
		||||
  "postCategoryTravel": "Travel",
 | 
			
		||||
  "postCategoryFood": "Food",
 | 
			
		||||
  "postCategoryHealth": "Health",
 | 
			
		||||
  "postCategoryScience": "Science",
 | 
			
		||||
  "postCategorySports": "Sports",
 | 
			
		||||
  "postCategoryFinance": "Finance",
 | 
			
		||||
  "postCategoryLife": "Life",
 | 
			
		||||
  "postCategoryArt": "Art",
 | 
			
		||||
  "postCategoryStudy": "Study",
 | 
			
		||||
  "postCategoryGaming": "Gaming",
 | 
			
		||||
  "postCategoryProgramming": "Programming",
 | 
			
		||||
  "postCategoryMusic": "Music",
 | 
			
		||||
  "links": "Links",
 | 
			
		||||
  "addLink": "Add link",
 | 
			
		||||
  "linkKey": "Link Name",
 | 
			
		||||
  "linkValue": "URL",
 | 
			
		||||
  "debugOptions": "Debug Options",
 | 
			
		||||
  "joinedAt": "Joined at {}",
 | 
			
		||||
  "searchAccounts": "Search accounts...",
 | 
			
		||||
  "webFeeds": "Web Feeds",
 | 
			
		||||
  "polls": "Polls",
 | 
			
		||||
  "sharePostSlogan": "Explore more on the Solar Network",
 | 
			
		||||
  "filesListAdditional": {
 | 
			
		||||
    "one": "+{} file remaining",
 | 
			
		||||
    "other": "+{} files remaining"
 | 
			
		||||
  },
 | 
			
		||||
  "pollAnswerSubmitted": "Poll answer has been submitted.",
 | 
			
		||||
  "modifyAnswers": "Modify Answers",
 | 
			
		||||
  "back": "Back",
 | 
			
		||||
  "submit": "Submit",
 | 
			
		||||
  "pollOptionDefaultLabel": "Option 1",
 | 
			
		||||
  "pollUpdated": "Poll updated.",
 | 
			
		||||
  "pollCreated": "Poll created.",
 | 
			
		||||
  "pollCreate": "Create Poll",
 | 
			
		||||
  "pollEdit": "Edit Poll",
 | 
			
		||||
  "pollPreviewJsonDebug": "Debug Preview",
 | 
			
		||||
  "pollTitleRequired": "Title is required",
 | 
			
		||||
  "pollEndDateOptional": "End date & time (optional)",
 | 
			
		||||
  "notSet": "Not set",
 | 
			
		||||
  "pick": "Pick",
 | 
			
		||||
  "clear": "Clear",
 | 
			
		||||
  "questions": "Questions",
 | 
			
		||||
  "pollAddQuestion": "Add question",
 | 
			
		||||
  "pollQuestionTypeSingleChoice": "Single choice",
 | 
			
		||||
  "pollQuestionTypeMultipleChoice": "Multiple choice",
 | 
			
		||||
  "pollQuestionTypeFreeText": "Free text",
 | 
			
		||||
  "pollQuestionTypeYesNo": "Yes / No",
 | 
			
		||||
  "pollQuestionTypeRating": "Rating",
 | 
			
		||||
  "pollNoQuestionsYet": "No questions yet",
 | 
			
		||||
  "pollNoQuestionsHint": "Use \"Add question\" to start building your poll.",
 | 
			
		||||
  "pollDebugPreview": "Debug Preview",
 | 
			
		||||
  "pollUntitledQuestion": "Untitled question",
 | 
			
		||||
  "moveUp": "Move up",
 | 
			
		||||
  "moveDown": "Move down",
 | 
			
		||||
  "required": "Required",
 | 
			
		||||
  "pollQuestionTitle": "Question title",
 | 
			
		||||
  "pollQuestionTitleRequired": "Question title is required",
 | 
			
		||||
  "pollQuestionDescriptionOptional": "Question description (optional)",
 | 
			
		||||
  "options": "Options",
 | 
			
		||||
  "pollAddOption": "Add option",
 | 
			
		||||
  "pollOptionLabel": "Option label",
 | 
			
		||||
  "pollLongTextAnswerPreview": "Long text answer (preview)",
 | 
			
		||||
  "pollShortTextAnswerPreview": "Short text answer (preview)",
 | 
			
		||||
  "messageJumpNotLoaded": "The referenced message was not loaded, unable to jump to it.",
 | 
			
		||||
  "postUnlinkRealm": "No linked realm",
 | 
			
		||||
  "postSlug": "Slug",
 | 
			
		||||
  "postSlugHint": "The slug can be used to access your post via URL in the webpage, it should be publisher-wide unique.",
 | 
			
		||||
  "attachmentOnDevice": "On-device",
 | 
			
		||||
  "attachmentOnCloud": "On-cloud",
 | 
			
		||||
  "attachments": "Attachments",
 | 
			
		||||
  "publisherCollabInvitation": "Collabration invitations",
 | 
			
		||||
  "publisherCollabInvitationCount": {
 | 
			
		||||
    "zero": "No invitation",
 | 
			
		||||
    "one": "{} available invitation",
 | 
			
		||||
    "other": "{} available invitations"
 | 
			
		||||
  },
 | 
			
		||||
  "failedToLoadUserInfo": "Failed to load user info",
 | 
			
		||||
  "failedToLoadUserInfoNetwork": "It seems be network issue, you can tap the button below to try again.",
 | 
			
		||||
  "failedToLoadUserInfoUnauthorized": "It seems your session has been logged out or not available anymore, you can still try agian to fetch the user info if you want.",
 | 
			
		||||
  "okay": "Okay",
 | 
			
		||||
  "postDetail": "Post Detail",
 | 
			
		||||
  "postCount": {
 | 
			
		||||
    "zero": "No posts",
 | 
			
		||||
    "one": "{} post",
 | 
			
		||||
    "other": "{} posts"
 | 
			
		||||
  },
 | 
			
		||||
  "mimeType": "MIME Type",
 | 
			
		||||
  "fileSize": "File Size",
 | 
			
		||||
  "fileHash": "File Hash",
 | 
			
		||||
  "exifData": "EXIF Data",
 | 
			
		||||
  "postShuffle": "Shuffle Posts",
 | 
			
		||||
  "leveling": "Leveling",
 | 
			
		||||
  "levelingHistory": "Leveling History",
 | 
			
		||||
  "stellarProgram": "Stellar Program",
 | 
			
		||||
  "socialCredits": "Social Credits",
 | 
			
		||||
  "credits": "Credits",
 | 
			
		||||
  "creditsStatus": "Credits Status",
 | 
			
		||||
  "socialCreditsDescription": "Social Credit is a way for Solar Network to evaluate users. It is calculated based on their behavior and interactions. With a base score of 100, higher scores indicate a user's credibility within the community. Scores change over time to reflect a user's recent behavior. Users with higher credit ratings enjoy more benefits, while users with lower credit ratings may have some functionality restricted.",
 | 
			
		||||
  "socialCreditsLevelPoor": "Poor",
 | 
			
		||||
  "socialCreditsLevelNormal": "Normal",
 | 
			
		||||
  "socialCreditsLevelGood": "Good",
 | 
			
		||||
  "socialCreditsLevelExcellent": "Excellent",
 | 
			
		||||
  "orderByPopularity": "Sort by popularity",
 | 
			
		||||
  "orderByReleaseDate": "Sort by release date",
 | 
			
		||||
  "editBot": "Edit Bot",
 | 
			
		||||
  "botAutomatedBy": "Automated by {}",
 | 
			
		||||
  "botDetails": "Bot Details",
 | 
			
		||||
  "overview": "Overview",
 | 
			
		||||
  "keys": "Keys",
 | 
			
		||||
  "botNotFound": "Bot not found.",
 | 
			
		||||
  "newBotKey": "New Bot Key",
 | 
			
		||||
  "newBotKeyHint": "Enter a name for your new key. The key will be shown only once.",
 | 
			
		||||
  "revokeBotKey": "Revoke Bot Key",
 | 
			
		||||
  "revokeBotKeyHint": "Are you sure you want to revoke this key? This action cannot be undone and any application using this key will stop working.",
 | 
			
		||||
  "noBotKeys": "No bot keys yet.",
 | 
			
		||||
  "revoke": "Revoke",
 | 
			
		||||
  "keyName": "Key Name",
 | 
			
		||||
  "newKeyGenerated": "New Key Generated",
 | 
			
		||||
  "copyKeyHint": "Please copy this key and store it somewhere safe. You will not be able to see it again.",
 | 
			
		||||
  "rotateKey": "Rotate Key",
 | 
			
		||||
  "rotateBotKey": "Rotate Bot Key",
 | 
			
		||||
  "rotateBotKeyHint": "Are you sure you want to rotate this key? The old key will become invalid immediately. This action cannot be undone.",
 | 
			
		||||
  "webFeedArticleCount": {
 | 
			
		||||
    "zero": "No articles",
 | 
			
		||||
    "one": "{} article",
 | 
			
		||||
    "other": "{} articles"
 | 
			
		||||
  },
 | 
			
		||||
  "webFeedSubscribed": "The feed has been subscribed",
 | 
			
		||||
  "webFeedUnsubscribed": "The feed has been unsubscribed",
 | 
			
		||||
  "appDetails": "App Details",
 | 
			
		||||
  "secrets": "Secrets",
 | 
			
		||||
  "appNotFound": "App not found.",
 | 
			
		||||
  "secretCopied": "Secret copied to clipboard.",
 | 
			
		||||
  "deleteSecret": "Delete Secret",
 | 
			
		||||
  "deleteSecretHint": "Are you sure you want to delete this secret? This action cannot be undone.",
 | 
			
		||||
  "generateSecret": "Generate New Secret",
 | 
			
		||||
  "createdAt": "Created at {}",
 | 
			
		||||
  "newSecretGenerated": "New Secret Generated",
 | 
			
		||||
  "copySecretHint": "Please copy this secret and store it somewhere safe. You will not be able to see it again.",
 | 
			
		||||
  "expiresIn": "Expires In (seconds)",
 | 
			
		||||
  "isOidc": "OIDC Compliant",
 | 
			
		||||
  "pinPost": "Pin Post",
 | 
			
		||||
  "unpinPost": "Unpin Post",
 | 
			
		||||
  "pinnedPost": "Pinned",
 | 
			
		||||
  "publisherPage": "Publisher Page",
 | 
			
		||||
  "realmPage": "Realm Page",
 | 
			
		||||
  "replyPage": "Reply Page",
 | 
			
		||||
  "pinPostPublisherHint": "Pin this post to your publisher page",
 | 
			
		||||
  "pinPostRealmHint": "Pin this post to the realm page",
 | 
			
		||||
  "pinPostRealmDisabledHint": "This post doesn't belong to any realm",
 | 
			
		||||
  "pinPostReplyHint": "Pin this post to the reply page",
 | 
			
		||||
  "pinPostReplyDisabledHint": "This post is not a reply",
 | 
			
		||||
  "pin": "Pin",
 | 
			
		||||
  "unpinPostHint": "Are you sure you want to unpin this post?",
 | 
			
		||||
  "all": "All",
 | 
			
		||||
  "statusPresent": "Present",
 | 
			
		||||
  "accountAutomated": "Automated",
 | 
			
		||||
  "chatBreakClearButton": "Clear",
 | 
			
		||||
  "chatBreak5m": "5m",
 | 
			
		||||
  "chatBreak10m": "10m",
 | 
			
		||||
  "chatBreak15m": "15m",
 | 
			
		||||
  "chatBreak30m": "30m",
 | 
			
		||||
  "chatBreakCustomMinutes": "Custom (minutes)",
 | 
			
		||||
  "errorGeneric": "Error: {}",
 | 
			
		||||
  "searchMessages": "Search Messages",
 | 
			
		||||
  "messagesCount": "{} messages",
 | 
			
		||||
  "dotSeparator": "·",
 | 
			
		||||
  "roleValidationHint": "Role must be between 0 and 100",
 | 
			
		||||
  "searchMessagesHint": "Search messages...",
 | 
			
		||||
  "searchLinks": "Links",
 | 
			
		||||
  "searchAttachments": "Attachments",
 | 
			
		||||
  "noMessagesFound": "No messages found",
 | 
			
		||||
  "openInBrowser": "Open in Browser",
 | 
			
		||||
  "highlightPost": "Highlight Post",
 | 
			
		||||
  "filters": "Filters",
 | 
			
		||||
  "apply": "Apply",
 | 
			
		||||
  "pubName": "Pub Name",
 | 
			
		||||
  "realm": "Realm",
 | 
			
		||||
  "shuffle": "Shuffle",
 | 
			
		||||
  "pinned": "Pinned",
 | 
			
		||||
  "noResultsFound": "No results found",
 | 
			
		||||
  "toggleFilters": "Toggle filters",
 | 
			
		||||
  "notableDayNext": "{} is in",
 | 
			
		||||
  "expandPoll": "Expand Poll",
 | 
			
		||||
  "collapsePoll": "Collapse Poll",
 | 
			
		||||
  "embedView": "Embed View",
 | 
			
		||||
  "embedUri": "Embed URI",
 | 
			
		||||
  "aspectRatio": "Aspect Ratio",
 | 
			
		||||
  "renderer": "Renderer",
 | 
			
		||||
  "addEmbed": "Add Embed",
 | 
			
		||||
  "editEmbed": "Edit Embed",
 | 
			
		||||
  "deleteEmbed": "Delete Embed",
 | 
			
		||||
  "deleteEmbedConfirm": "Are you sure you want to delete this embed?",
 | 
			
		||||
  "currentEmbed": "Current Embed",
 | 
			
		||||
  "noEmbed": "No embed yet",
 | 
			
		||||
  "save": "Save",
 | 
			
		||||
  "webView": "Web View",
 | 
			
		||||
  "messageActions": "Message Actions"
 | 
			
		||||
}
 | 
			
		||||
@@ -46,7 +46,6 @@
 | 
			
		||||
  "delete": "删除",
 | 
			
		||||
  "deletePublisher": "删除发布者",
 | 
			
		||||
  "deletePublisherHint": "确定要删除此发布者吗?这也会删除此发布者下的所有帖子和收藏。",
 | 
			
		||||
  "somethingWentWrong": "发生了一些错误",
 | 
			
		||||
  "deletePost": "删除帖子",
 | 
			
		||||
  "deletePostHint": "确定要删除这篇帖子吗?",
 | 
			
		||||
  "copyLink": "复制链接",
 | 
			
		||||
@@ -123,6 +122,9 @@
 | 
			
		||||
  "addVideo": "添加视频",
 | 
			
		||||
  "addPhoto": "添加照片",
 | 
			
		||||
  "addFile": "添加文件",
 | 
			
		||||
  "uploadFile": "上传文件",
 | 
			
		||||
  "settingsDefaultPool": "选择文件池",
 | 
			
		||||
  "settingsDefaultPoolHelper": "为文件上传选择一个默认池",
 | 
			
		||||
  "createDirectMessage": "创建新私人消息",
 | 
			
		||||
  "gotoDirectMessage": "前往私信",
 | 
			
		||||
  "react": "反应",
 | 
			
		||||
@@ -159,11 +161,12 @@
 | 
			
		||||
  "checkIn": "签到",
 | 
			
		||||
  "checkInNone": "尚未签到",
 | 
			
		||||
  "checkInNoneHint": "通过签到获取您的财富提示和每日奖励。",
 | 
			
		||||
  "checkInResultLevel0": "最差运气",
 | 
			
		||||
  "checkInResultLevel1": "坏运气",
 | 
			
		||||
  "checkInResultLevel2": "一个普通的日常",
 | 
			
		||||
  "checkInResultLevel3": "好运",
 | 
			
		||||
  "checkInResultLevel4": "最佳运气",
 | 
			
		||||
  "checkInResultLevel0": "大凶",
 | 
			
		||||
  "checkInResultLevel1": "凶",
 | 
			
		||||
  "checkInResultLevel2": "中平",
 | 
			
		||||
  "checkInResultLevel3": "吉",
 | 
			
		||||
  "checkInResultLevel4": "大吉",
 | 
			
		||||
  "checkInResultLevel5": "生日快乐 🥳",
 | 
			
		||||
  "checkInActivityTitle": "{} 在 {} 签到并获得了 {}",
 | 
			
		||||
  "eventCalander": "活动日历",
 | 
			
		||||
  "eventCalanderEmpty": "该日无活动。",
 | 
			
		||||
@@ -301,9 +304,11 @@
 | 
			
		||||
  "walletCreate": "创建钱包",
 | 
			
		||||
  "settingsServerUrl": "服务器 URL",
 | 
			
		||||
  "settingsApplied": "设置已应用。",
 | 
			
		||||
  "settingsCustomFontsHelper": "用逗号分隔。",
 | 
			
		||||
  "notifications": "通知",
 | 
			
		||||
  "posts": "帖子",
 | 
			
		||||
  "settingsBackgroundImage": "背景图片",
 | 
			
		||||
  "settingsBackgroundImageEnable": "显示背景图片",
 | 
			
		||||
  "settingsBackgroundImageClear": "清除背景图片",
 | 
			
		||||
  "settingsBackgroundGenerateColor": "从背景图像生成主题色",
 | 
			
		||||
  "messageNone": "没有内容可显示",
 | 
			
		||||
@@ -314,6 +319,8 @@
 | 
			
		||||
  "chatBreakNone": "无",
 | 
			
		||||
  "settingsRealmCompactView": "紧凑领域视图",
 | 
			
		||||
  "settingsMixedFeed": "混合动态",
 | 
			
		||||
  "settingsDataSavingMode": "流量节省模式",
 | 
			
		||||
  "dataSavingHint": "流量节省模式",
 | 
			
		||||
  "settingsAutoTranslate": "自动翻译",
 | 
			
		||||
  "settingsHideBottomNav": "隐藏底部导航",
 | 
			
		||||
  "settingsSoundEffects": "音效",
 | 
			
		||||
@@ -349,7 +356,6 @@
 | 
			
		||||
  "postContent": "内容",
 | 
			
		||||
  "postSettings": "设置",
 | 
			
		||||
  "postPublisherUnselected": "未指定发布者",
 | 
			
		||||
  "postVisibility": "可见性",
 | 
			
		||||
  "postVisibilityPublic": "公开",
 | 
			
		||||
  "postVisibilityFriends": "仅好友可见",
 | 
			
		||||
  "postVisibilityUnlisted": "不公开",
 | 
			
		||||
@@ -490,20 +496,26 @@
 | 
			
		||||
  "paymentError": "付款失败: {error}",
 | 
			
		||||
  "usePinInstead": "使用 PIN 码",
 | 
			
		||||
  "levelProgress": "等级进度",
 | 
			
		||||
  "unlockedFeatures": "已解锁的功能",
 | 
			
		||||
  "unlockedFeaturesDescription": "在您当前级别上解锁的功能将显示在这里。",
 | 
			
		||||
  "stellarMembership": "恒星计划",
 | 
			
		||||
  "upgradeYourPlan": "升级您的计划",
 | 
			
		||||
  "chooseYourPlan": "选择你的方案",
 | 
			
		||||
  "currentMembership": "当前:{}",
 | 
			
		||||
  "currentMembershipMember": "恒星计划「{}」级会员",
 | 
			
		||||
  "membershipExpires": "过期于:{}",
 | 
			
		||||
  "membershipTierStellar": "恒星",
 | 
			
		||||
  "membershipTierNova": "新星",
 | 
			
		||||
  "membershipTierSupernova": "超新星",
 | 
			
		||||
  "membershipTierUnknown": "未知",
 | 
			
		||||
  "membershipPriceStellar": "每月 1200 源点,至少需要 3 级",
 | 
			
		||||
  "membershipPriceNova": "每月 2400 源点,至少需要 6 级",
 | 
			
		||||
  "membershipPriceSupernova": "每月 3600 源点,至少需要 9 级",
 | 
			
		||||
  "membershipFeatureBasic": "基础功能",
 | 
			
		||||
  "membershipFeaturePrioritySupport": "优先支持",
 | 
			
		||||
  "membershipFeatureAdFree": "无广告",
 | 
			
		||||
  "membershipFeatureAllPrimary": "所有主要功能",
 | 
			
		||||
  "membershipFeatureAdvancedCustomization": "高级自定义",
 | 
			
		||||
  "membershipFeatureEarlyAccess": "抢先体验",
 | 
			
		||||
  "membershipFeatureAllNova": "所有「新星」功能",
 | 
			
		||||
  "membershipFeatureExclusiveContent": "限定内容",
 | 
			
		||||
  "membershipFeatureVipSupport": "VIP 支持",
 | 
			
		||||
  "membershipCurrentBadge": "当前",
 | 
			
		||||
  "restorePurchase": "恢复购买",
 | 
			
		||||
  "restorePurchaseDescription": "输入您付款的提供商和订单 ID 以恢复您的购买。",
 | 
			
		||||
@@ -513,11 +525,186 @@
 | 
			
		||||
  "enterOrderId": "输入您的订单 ID",
 | 
			
		||||
  "restore": "恢复",
 | 
			
		||||
  "keyboardShortcuts": "键盘快捷键",
 | 
			
		||||
  "safetyReport": "举报",
 | 
			
		||||
  "safetyReportTitle": "举报",
 | 
			
		||||
  "safetyReportDescription": "通过举报不合适的内容和行为来维护我们社区的稳定。",
 | 
			
		||||
  "safetyReportType": "举报类型",
 | 
			
		||||
  "safetyReportReason": "更多证据",
 | 
			
		||||
  "safetyReportReasonHint": "请提供更多证据……",
 | 
			
		||||
  "safetyReportSubmit": "提交举报",
 | 
			
		||||
  "safetyReportSubmitting": "提交中……",
 | 
			
		||||
  "safetyReportSuccess": "举报成功,感谢您参与维护社区健康发展。",
 | 
			
		||||
  "safetyReportError": "举报失败,请稍后重试。",
 | 
			
		||||
  "safetyReportReasonRequired": "请提供举报证据",
 | 
			
		||||
  "safetyReportTypeSpam": "垃圾或导向错误",
 | 
			
		||||
  "safetyReportTypeHarassment": "骚扰或暴力行为",
 | 
			
		||||
  "safetyReportTypeHateSpeech": "歧视言论",
 | 
			
		||||
  "safetyReportTypeViolence": "威胁或暴力内容",
 | 
			
		||||
  "safetyReportTypeAdultContent": "成人内容",
 | 
			
		||||
  "safetyReportTypeIntellectualProperty": "抄袭",
 | 
			
		||||
  "safetyReportTypeOther": "其它",
 | 
			
		||||
  "safetyReportTypeInappropriate": "不良内容",
 | 
			
		||||
  "safetyReportTypeCopyright": "版权侵害",
 | 
			
		||||
  "safetyReportSuccessTitle": "举报成功",
 | 
			
		||||
  "safetyReportErrorTitle": "错误",
 | 
			
		||||
  "discover": "发现",
 | 
			
		||||
  "joinRealm": "加入领域",
 | 
			
		||||
  "removePublisherMember": "移除发布者",
 | 
			
		||||
  "removePublisherMemberHint": "你确定要将这个成员从发布者中移除?",
 | 
			
		||||
  "drafts": "草稿箱",
 | 
			
		||||
  "noDrafts": "无草稿",
 | 
			
		||||
  "articleDrafts": "文章草稿",
 | 
			
		||||
  "postDrafts": "帖子草稿",
 | 
			
		||||
  "saveDraft": "保存草稿",
 | 
			
		||||
  "draftSaved": "草稿已保存",
 | 
			
		||||
  "draftSaveFailed": "保存草稿失败",
 | 
			
		||||
  "clearAllDrafts": "清除全部草稿",
 | 
			
		||||
  "clearAllDraftsConfirm": "你确定要清除全部草稿?这一操作无法撤销。",
 | 
			
		||||
  "clearAll": "清除所有",
 | 
			
		||||
  "untitled": "未命名",
 | 
			
		||||
  "noContent": "内容为空",
 | 
			
		||||
  "justNow": "刚刚",
 | 
			
		||||
  "minutesAgo": "{} 分钟以前",
 | 
			
		||||
  "hoursAgo": "{} 小时以前",
 | 
			
		||||
  "daysAgo": "{} 天以前",
 | 
			
		||||
  "public": "公开的",
 | 
			
		||||
  "unlisted": "不列出",
 | 
			
		||||
  "friends": "朋友",
 | 
			
		||||
  "selected": "选择的",
 | 
			
		||||
  "private": "私密的",
 | 
			
		||||
  "postContentEmpty": "发布的内容不能为空",
 | 
			
		||||
  "share": "分享",
 | 
			
		||||
  "sharePost": "分享帖子",
 | 
			
		||||
  "quickActions": "快捷操作",
 | 
			
		||||
  "post": "发帖",
 | 
			
		||||
  "copy": "复制",
 | 
			
		||||
  "sendToChat": "发送到聊天",
 | 
			
		||||
  "failedToShareToPost": "分享到帖子失败:{}",
 | 
			
		||||
  "shareToChatComingSoon": "分享到聊天功能即将推出",
 | 
			
		||||
  "failedToShareToChat": "分享到聊天失败:{}",
 | 
			
		||||
  "shareToSpecificChatComingSoon": "分享到 {} 功能即将推出",
 | 
			
		||||
  "directChat": "私信",
 | 
			
		||||
  "systemShareComingSoon": "系统分享功能即将推出",
 | 
			
		||||
  "failedToShareToSystem": "分享到系统失败:{}",
 | 
			
		||||
  "failedToCopy": "复制失败:{}",
 | 
			
		||||
  "noChatRoomsAvailable": "无可用聊天室",
 | 
			
		||||
  "failedToLoadChats": "加载聊天失败",
 | 
			
		||||
  "contentToShare": "分享内容:",
 | 
			
		||||
  "unknownChat": "未知聊天",
 | 
			
		||||
  "addAdditionalMessage": "添加附加消息……",
 | 
			
		||||
  "uploadingFiles": "上传文件中……",
 | 
			
		||||
  "sharedSuccessfully": "分享成功!",
 | 
			
		||||
  "shareSuccess": "分享成功!",
 | 
			
		||||
  "shareToSpecificChatSuccess": "成功分享至 {}!",
 | 
			
		||||
  "wouldYouLikeToGoToChat": "是否前往该聊天?",
 | 
			
		||||
  "no": "否",
 | 
			
		||||
  "yes": "是",
 | 
			
		||||
  "navigateToChat": "前往聊天",
 | 
			
		||||
  "abuseReport": "举报",
 | 
			
		||||
  "abuseReportTitle": "举报内容",
 | 
			
		||||
  "abuseReportDescription": "举报不当内容或行为,协助维护社区安全。",
 | 
			
		||||
  "abuseReportType": "举报类型",
 | 
			
		||||
  "abuseReportReason": "补充详情",
 | 
			
		||||
  "abuseReportReasonHint": "请提供更多详情……",
 | 
			
		||||
  "abuseReportSubmit": "提交举报",
 | 
			
		||||
  "abuseReportSuccess": "举报提交成功,感谢你为社区维护作出贡献。",
 | 
			
		||||
  "abuseReportError": "无法提交举报,请稍后再试。",
 | 
			
		||||
  "abuseReportReasonRequired": "请提供关于此事件的细节",
 | 
			
		||||
  "abuseReportSuccessTitle": "举报已提交",
 | 
			
		||||
  "abuseReportErrorTitle": "错误",
 | 
			
		||||
  "abuseReportTypeSpam": "垃圾或错误信息",
 | 
			
		||||
  "abuseReportTypeHarassment": "骚扰或滥用",
 | 
			
		||||
  "abuseReportTypeInappropriate": "不合适的内容",
 | 
			
		||||
  "abuseReportTypeViolence": "暴力或人身威胁",
 | 
			
		||||
  "abuseReportTypeCopyright": "版权侵犯",
 | 
			
		||||
  "abuseReportTypeImpersonation": "冒充",
 | 
			
		||||
  "abuseReportTypeOffensiveContent": "冒犯性内容",
 | 
			
		||||
  "abuseReportTypePrivacyViolation": "隐私侵犯",
 | 
			
		||||
  "abuseReportTypeIllegalContent": "违法内容",
 | 
			
		||||
  "abuseReportTypeOther": "其他",
 | 
			
		||||
  "tags": "标签",
 | 
			
		||||
  "tagsHint": "输入标签,用英文逗号分隔",
 | 
			
		||||
  "categories": "分类",
 | 
			
		||||
  "categoriesHint": "输入分类,由逗号隔开",
 | 
			
		||||
  "chatNotJoined": "你还没有加入这个聊天。",
 | 
			
		||||
  "chatUnableJoin": "由于该聊天的访问设置使你无法加入。",
 | 
			
		||||
  "chatJoin": "加入聊天",
 | 
			
		||||
  "realmJoin": "加入领域",
 | 
			
		||||
  "realmJoinSuccess": "成功加入领域。",
 | 
			
		||||
  "search": "搜索",
 | 
			
		||||
  "publisherMembers": "合作者",
 | 
			
		||||
  "developerHub": "开发者中心",
 | 
			
		||||
  "developerHubUnselectedHint": "选择一名开发者查看总结数据或成为一名。",
 | 
			
		||||
  "enrollDeveloper": "成为一名开发者",
 | 
			
		||||
  "enrollDeveloperHint": "让你的一个发布者成为开发者。",
 | 
			
		||||
  "noPublishersToEnroll": "你没有可以成为开发者的发布者。",
 | 
			
		||||
  "totalCustomApps": "所有应用套件",
 | 
			
		||||
  "customApps": "应用套件",
 | 
			
		||||
  "noCustomApps": "还没有应用套件。",
 | 
			
		||||
  "createCustomApp": "创建应用套件",
 | 
			
		||||
  "editCustomApp": "编辑应用套件",
 | 
			
		||||
  "deleteCustomApp": "删除应用套件",
 | 
			
		||||
  "deleteCustomAppHint": "你确定要删除这个应用套件吗?这一步无法撤销。",
 | 
			
		||||
  "publicRealm": "公开领域",
 | 
			
		||||
  "publicRealmDescription": "所有人都可以预览这个领域的内容。",
 | 
			
		||||
  "communityRealm": "领域",
 | 
			
		||||
  "communityRealmDescription": "所有人都可以加入该领域并参与讨论,并将在发现和反馈页面显示。",
 | 
			
		||||
  "publicChat": "公开聊天",
 | 
			
		||||
  "publicChatDescription": "任何人都可以预览此聊天的内容。包括未加入的机器人。",
 | 
			
		||||
  "communityChat": "社区聊天",
 | 
			
		||||
  "communityChatDescription": "所有人都可以加入该聊天并参与参与讨论。",
 | 
			
		||||
  "appLinks": "应用链接",
 | 
			
		||||
  "homePageUrl": "主页链接",
 | 
			
		||||
  "privacyPolicyUrl": "隐私政策链接",
 | 
			
		||||
  "termsOfServiceUrl": "用户协议链接",
 | 
			
		||||
  "oauthConfig": "OAuth 配置",
 | 
			
		||||
  "clientUri": "客户端 URI",
 | 
			
		||||
  "redirectUris": "重定向 URIs",
 | 
			
		||||
  "addRedirectUri": "添加重定向 URI",
 | 
			
		||||
  "allowedScopes": "允许的范围",
 | 
			
		||||
  "requirePkce": "需要 PKCE",
 | 
			
		||||
  "allowOfflineAccess": "允许离线访问",
 | 
			
		||||
  "redirectUri": "重定向 URI",
 | 
			
		||||
  "redirectUriHint": "重定向 URI 用于 OAuth 认证,但您的项目状态转为线上时我们会验证请求中的重定向 URI 是否符合此配置。",
 | 
			
		||||
  "uriRequired": "这个 URI 是必须填写的。",
 | 
			
		||||
  "uriInvalid": "无效 URI。",
 | 
			
		||||
  "add": "添加",
 | 
			
		||||
  "addScope": "添加范围",
 | 
			
		||||
  "scope": "范围",
 | 
			
		||||
  "publisherFeatures": "功能",
 | 
			
		||||
  "publisherFeatureDevelop": "开发者计划",
 | 
			
		||||
  "publisherFeatureDevelopDescription": "为你的开发者解锁包括应用套件,API 及更多开发功能。",
 | 
			
		||||
  "publisherFeatureDevelopHint": "目前该功能还在开发中,你需要邀请才可解锁。",
 | 
			
		||||
  "learnMore": "了解更多",
 | 
			
		||||
  "discoverWebArticles": "来自站外的文章",
 | 
			
		||||
  "webArticlesStand": "文章亭",
 | 
			
		||||
  "about": "关于",
 | 
			
		||||
  "somethingWentWrong": "发生了一些错误",
 | 
			
		||||
  "editedAt": "编辑于 {}",
 | 
			
		||||
  "addAudio": "添加音频",
 | 
			
		||||
  "recordAudio": "录制音频",
 | 
			
		||||
  "linkAttachment": "链接附件",
 | 
			
		||||
  "fileIdCannotBeEmpty": "文件 ID 不能为空",
 | 
			
		||||
  "fileIdLinkHint": "还没有上传到 Solar Network?点击此处打开 Solar Network Drive,自定义您的上传内容。",
 | 
			
		||||
  "failedToFetchFile": "获取文件失败:{}",
 | 
			
		||||
  "callLeave": "离开",
 | 
			
		||||
  "callEnd": "挂断通话",
 | 
			
		||||
  "postType": "帖子类型",
 | 
			
		||||
  "articleAttachmentHint": "附件必须上传并插入到文章主体中才能显示出来。",
 | 
			
		||||
  "postVisibility": "可见性",
 | 
			
		||||
  "currentMembershipMember": "恒星计划成员 · {}",
 | 
			
		||||
  "membershipPriceStellar": "需要用户等级 3+,每月价格 1200 NSP",
 | 
			
		||||
  "membershipPriceNova": "需要用户等级 6+,每月价格 2400 NSP",
 | 
			
		||||
  "membershipPriceSupernova": "需要用户等级 9+,每月价格 3600 NSP",
 | 
			
		||||
  "sharePostPhoto": "通过图片分享帖子",
 | 
			
		||||
  "wouldYouLikeToNavigateToChat": "你想要前往聊天页面吗?",
 | 
			
		||||
  "abuseReports": "举报",
 | 
			
		||||
  "discoverRealms": "发现领域",
 | 
			
		||||
  "discoverPublishers": "发现发布者",
 | 
			
		||||
  "membershipCancel": "取消会员订阅",
 | 
			
		||||
  "membershipCancelConfirm": "您确定要取消您的会员订阅?",
 | 
			
		||||
  "membershipCancelHint": "您确定要取消您的会员订阅吗?您将不会再被收费。您的会员资格将在当前计费周期结束前保持有效。并且您在当前订阅结束之前无法重新订阅。",
 | 
			
		||||
  "membershipCancelSuccess": "您的会员订阅已成功取消。",
 | 
			
		||||
  "membershipCancelConfirm": "你确定要取消会员订阅吗?",
 | 
			
		||||
  "membershipCancelHint": "你确定要取消会员订阅吗?你将不会再次被扣费。你的会员资格将在当前计费周期结束前保持有效。并且你将无法重新订阅,直到当前订阅结束。",
 | 
			
		||||
  "membershipCancelSuccess": "你的会员订阅已成功取消。",
 | 
			
		||||
  "aboutScreenTitle": "关于",
 | 
			
		||||
  "aboutScreenVersionInfo": "版本 {} ({})",
 | 
			
		||||
  "aboutScreenAppInfoSectionTitle": "应用信息",
 | 
			
		||||
@@ -527,18 +714,158 @@
 | 
			
		||||
  "aboutScreenLinksSectionTitle": "链接",
 | 
			
		||||
  "aboutScreenPrivacyPolicyTitle": "隐私政策",
 | 
			
		||||
  "aboutScreenTermsOfServiceTitle": "服务条款",
 | 
			
		||||
  "aboutScreenOpenSourceLicensesTitle": "开源许可证",
 | 
			
		||||
  "aboutScreenOpenSourceLicensesTitle": "开源许可",
 | 
			
		||||
  "aboutScreenDeveloperSectionTitle": "开发者",
 | 
			
		||||
  "aboutScreenContactUsTitle": "联系我们",
 | 
			
		||||
  "aboutScreenLicenseTitle": "许可证",
 | 
			
		||||
  "aboutScreenLicenseContent": "GNU Affero General Public License v3.0",
 | 
			
		||||
  "aboutScreenCopyright": "版权所有 © 索尔辛茨 {}",
 | 
			
		||||
  "aboutScreenMadeWith": "由 Solar Network Team 用 ❤︎️ 制作",
 | 
			
		||||
  "aboutScreenFailedToLoadPackageInfo": "加载包信息失败:{error}",
 | 
			
		||||
  "aboutScreenLicenseTitle": "许可",
 | 
			
		||||
  "aboutScreenLicenseContent": "无法翻译",
 | 
			
		||||
  "aboutScreenCopyright": "版权所有 © Solsynth {}",
 | 
			
		||||
  "aboutScreenMadeWith": "由 Solar Network 团队用 ❤︎️ 制作",
 | 
			
		||||
  "aboutScreenFailedToLoadPackageInfo": "无法加载包信息:{error}",
 | 
			
		||||
  "copiedToClipboard": "已复制到剪贴板",
 | 
			
		||||
  "copyToClipboardTooltip": "复制到剪贴板",
 | 
			
		||||
  "postForwardingTo": "转发给",
 | 
			
		||||
  "postReplyingTo": "回复给",
 | 
			
		||||
  "postEditing": "您正在编辑现有帖子",
 | 
			
		||||
  "postArticle": "文章"
 | 
			
		||||
  "postForwardingTo": "正在转发到",
 | 
			
		||||
  "postReplyingTo": "正在回复",
 | 
			
		||||
  "postReplyPlaceholder": "发表你的回复",
 | 
			
		||||
  "postEditing": "你正在编辑一个现有的帖子",
 | 
			
		||||
  "postArticle": "文章",
 | 
			
		||||
  "aboutDeviceName": "设备名称",
 | 
			
		||||
  "aboutDeviceIdentifier": "设备标识符",
 | 
			
		||||
  "donate": "捐赠",
 | 
			
		||||
  "donateDescription": "支持我们继续开发 Solar Network,并维持服务器运行。",
 | 
			
		||||
  "fileId": "文件 ID",
 | 
			
		||||
  "fileIdHint": "文件 ID 是你通过 Solar Network Drive 上传文件后获得的 ID。",
 | 
			
		||||
  "translate": "翻译",
 | 
			
		||||
  "translating": "正在翻译",
 | 
			
		||||
  "translated": "已翻译",
 | 
			
		||||
  "reactionThumbUp": "赞",
 | 
			
		||||
  "reactionThumbDown": "踩",
 | 
			
		||||
  "reactionJustOkay": "还行",
 | 
			
		||||
  "reactionCry": "哭",
 | 
			
		||||
  "reactionConfuse": "困惑",
 | 
			
		||||
  "reactionClap": "鼓掌",
 | 
			
		||||
  "reactionLaugh": "笑",
 | 
			
		||||
  "reactionAngry": "生气",
 | 
			
		||||
  "reactionParty": "派对",
 | 
			
		||||
  "reactionPray": "祈祷",
 | 
			
		||||
  "reactionHeart": "爱心",
 | 
			
		||||
  "selectMicrophone": "选择麦克风",
 | 
			
		||||
  "selectCamera": "选择摄像头",
 | 
			
		||||
  "switchedTo": "已切换到 {}",
 | 
			
		||||
  "connecting": "正在连接",
 | 
			
		||||
  "reconnecting": "正在重新连接",
 | 
			
		||||
  "disconnected": "已断开连接",
 | 
			
		||||
  "connected": "已连接",
 | 
			
		||||
  "repliesLoadMore": "加载更多回复",
 | 
			
		||||
  "attachmentsRecentUploads": "最近上传",
 | 
			
		||||
  "attachmentsManualInput": "手动输入",
 | 
			
		||||
  "crop": "裁剪",
 | 
			
		||||
  "rename": "重命名",
 | 
			
		||||
  "markAsSensitive": "标记为敏感",
 | 
			
		||||
  "fileName": "文件名",
 | 
			
		||||
  "sensitiveCategories": {
 | 
			
		||||
    "language": "语言",
 | 
			
		||||
    "sexualContent": "色情内容",
 | 
			
		||||
    "violence": "暴力",
 | 
			
		||||
    "profanity": "亵渎",
 | 
			
		||||
    "hateSpeech": "仇恨言论",
 | 
			
		||||
    "racism": "种族主义",
 | 
			
		||||
    "adultContent": "成人内容",
 | 
			
		||||
    "drugAbuse": "药物滥用",
 | 
			
		||||
    "alcoholAbuse": "酗酒",
 | 
			
		||||
    "gambling": "赌博",
 | 
			
		||||
    "selfHarm": "自残",
 | 
			
		||||
    "childAbuse": "虐待儿童",
 | 
			
		||||
    "other": "其他"
 | 
			
		||||
  },
 | 
			
		||||
  "poll": "投票",
 | 
			
		||||
  "pollsRecent": "最近投票",
 | 
			
		||||
  "pollCreateNew": "创建新投票",
 | 
			
		||||
  "pollCreateNewHint": "为你的帖子创建一个新投票。选择一个发布者然后继续。",
 | 
			
		||||
  "publisher": "发布者",
 | 
			
		||||
  "publisherHint": "输入发布者名称",
 | 
			
		||||
  "publisherCannotBeEmpty": "发布者不能为空",
 | 
			
		||||
  "operationFailed": "操作失败:{}",
 | 
			
		||||
  "stickerMarketplace": "贴纸市场",
 | 
			
		||||
  "stickerPackAdded": "贴纸包已添加到你的收藏",
 | 
			
		||||
  "stickerPackRemoved": "贴纸包已从你的收藏中移除",
 | 
			
		||||
  "addPack": "添加贴纸包",
 | 
			
		||||
  "removePack": "移除贴纸包",
 | 
			
		||||
  "browseAndAddStickers": "浏览并添加贴纸包",
 | 
			
		||||
  "stickerPack": "贴纸包",
 | 
			
		||||
  "postCategoryTechnology": "科技",
 | 
			
		||||
  "postCategoryTravel": "旅行",
 | 
			
		||||
  "postCategoryFood": "美食",
 | 
			
		||||
  "postCategoryHealth": "健康",
 | 
			
		||||
  "postCategoryScience": "科学",
 | 
			
		||||
  "postCategorySports": "体育",
 | 
			
		||||
  "postCategoryFinance": "金融",
 | 
			
		||||
  "postCategoryLife": "生活",
 | 
			
		||||
  "postCategoryArt": "艺术",
 | 
			
		||||
  "postCategoryStudy": "学习",
 | 
			
		||||
  "postCategoryGaming": "游戏",
 | 
			
		||||
  "postCategoryProgramming": "编程",
 | 
			
		||||
  "postCategoryMusic": "音乐",
 | 
			
		||||
  "links": "链接",
 | 
			
		||||
  "addLink": "添加链接",
 | 
			
		||||
  "linkKey": "链接名称",
 | 
			
		||||
  "linkValue": "链接",
 | 
			
		||||
  "debugOptions": "调试选项",
 | 
			
		||||
  "joinedAt": "加入于 {}",
 | 
			
		||||
  "searchAccounts": "搜索帐号……",
 | 
			
		||||
  "webFeeds": "订阅源",
 | 
			
		||||
  "polls": "投票",
 | 
			
		||||
  "sharePostSlogan": "加入 Solar Network 以便探索更多",
 | 
			
		||||
  "filesListAdditional": {
 | 
			
		||||
    "one": "+{} 个文件被折叠",
 | 
			
		||||
    "other": "+{} 个文件被折叠"
 | 
			
		||||
  },
 | 
			
		||||
  "messageJumpNotLoaded": "引用的消息没有被加载,无法跳转。",
 | 
			
		||||
  "postUnlinkRealm": "不关联领域",
 | 
			
		||||
  "postSlug": "别名",
 | 
			
		||||
  "postSlugHint": "这个别名可以用于在网页通过 URL 浏览到你的帖子,它应该在同一发布者中是唯一。",
 | 
			
		||||
  "attachmentOnDevice": "离线",
 | 
			
		||||
  "attachmentOnCloud": "在线",
 | 
			
		||||
  "publisherCollabInvitation": "协作邀请",
 | 
			
		||||
  "publisherCollabInvitationCount": {
 | 
			
		||||
    "zero": "无邀请",
 | 
			
		||||
    "one": "{} 个可用邀请",
 | 
			
		||||
    "other": "{} 个可用邀请"
 | 
			
		||||
  },
 | 
			
		||||
  "failedToLoadUserInfo": "加载用户信息失败",
 | 
			
		||||
  "failedToLoadUserInfoNetwork": "这看起来是个网络问题,你可以按下面的按钮来重试",
 | 
			
		||||
  "failedToLoadUserInfoUnauthorized": "看来您的会话已被注销或不再可用,如果您愿意,您仍然可以再次尝试获取用户信息。",
 | 
			
		||||
  "okay": "了解",
 | 
			
		||||
  "postDetail": "帖子详情",
 | 
			
		||||
  "mimeType": "类型",
 | 
			
		||||
  "fileSize": "大小",
 | 
			
		||||
  "fileHash": "哈希",
 | 
			
		||||
  "exifData": "EXIF 数据",
 | 
			
		||||
  "leveling": "等级",
 | 
			
		||||
  "levelingHistory": "经验记录",
 | 
			
		||||
  "stellarProgram": "恒星计划",
 | 
			
		||||
  "socialCredits": "社会信用点",
 | 
			
		||||
  "credits": "信用",
 | 
			
		||||
  "socialCreditsDescription": "社会信用是 Solar Network 评价用户的一种方式。它基于用户的行为和互动来计算。以 100 分为基准,分数越高表示用户在社区中的信誉越好。分数会随着时间的推移而变化,反映用户的最新行为。信用等级高的用户可以享受到更多的福利,反之的用户部份功能可能受到限制。",
 | 
			
		||||
  "socialCreditsLevelPoor": "糟糕",
 | 
			
		||||
  "socialCreditsLevelNormal": "正常",
 | 
			
		||||
  "socialCreditsLevelGood": "良好",
 | 
			
		||||
  "socialCreditsLevelExcellent": "优秀",
 | 
			
		||||
  "appDetails": "应用详情",
 | 
			
		||||
  "secrets": "密钥",
 | 
			
		||||
  "appNotFound": "应用未找到。",
 | 
			
		||||
  "secretCopied": "密钥已复制到剪贴板。",
 | 
			
		||||
  "deleteSecret": "删除密钥",
 | 
			
		||||
  "deleteSecretHint": "您确定要删除此密钥吗?此操作无法撤销。",
 | 
			
		||||
  "generateSecret": "生成新密钥",
 | 
			
		||||
  "createdAt": "创建于 {}",
 | 
			
		||||
  "newSecretGenerated": "已生成新密钥",
 | 
			
		||||
  "copySecretHint": "请复制此密钥并将其存放在安全的地方。您将无法再次看到它。",
 | 
			
		||||
  "expiresIn": "过期时间(秒)",
 | 
			
		||||
  "isOidc": "OIDC 兼容",
 | 
			
		||||
  "statusPresent": "至今",
 | 
			
		||||
  "accountAutomated": "机器人",
 | 
			
		||||
  "openInBrowser": "在浏览器中打开",
 | 
			
		||||
  "highlightPost": "精选帖子",
 | 
			
		||||
  "notableDayNext": "距离 {} 还有"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								assets/icons/icon-outline.svg
									
									
									
									
									
										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
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 108 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/media-offline.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/images/media-offline.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 461 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
									
								
								drift_schemas/app_database/drift_schema_v6.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -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'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										236
									
								
								ios/Podfile.lock
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								ios/Podfile.lock
									
									
									
									
									
								
							@@ -40,39 +40,93 @@ PODS:
 | 
			
		||||
  - file_picker (0.0.1):
 | 
			
		||||
    - DKImagePickerController/PhotoGallery
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - Firebase/CoreOnly (11.15.0):
 | 
			
		||||
    - FirebaseCore (~> 11.15.0)
 | 
			
		||||
  - Firebase/Messaging (11.15.0):
 | 
			
		||||
    - Firebase/CoreOnly
 | 
			
		||||
    - FirebaseMessaging (~> 11.15.0)
 | 
			
		||||
  - firebase_core (3.15.0):
 | 
			
		||||
    - Firebase/CoreOnly (= 11.15.0)
 | 
			
		||||
  - file_saver (0.0.1):
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - firebase_messaging (15.2.8):
 | 
			
		||||
    - Firebase/Messaging (= 11.15.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.1):
 | 
			
		||||
    - firebase_core
 | 
			
		||||
    - FirebaseAnalytics (= 12.2.0)
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - firebase_core (4.1.0):
 | 
			
		||||
    - Firebase/CoreOnly (= 12.2.0)
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - firebase_crashlytics (5.0.1):
 | 
			
		||||
    - Firebase/Crashlytics (= 12.2.0)
 | 
			
		||||
    - firebase_core
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - FirebaseCore (11.15.0):
 | 
			
		||||
    - FirebaseCoreInternal (~> 11.15.0)
 | 
			
		||||
  - firebase_messaging (16.0.1):
 | 
			
		||||
    - 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.15.0):
 | 
			
		||||
  - FirebaseCoreExtension (12.2.0):
 | 
			
		||||
    - FirebaseCore (~> 12.2.0)
 | 
			
		||||
  - FirebaseCoreInternal (12.2.0):
 | 
			
		||||
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
 | 
			
		||||
  - FirebaseInstallations (11.15.0):
 | 
			
		||||
    - FirebaseCore (~> 11.15.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.15.0):
 | 
			
		||||
    - FirebaseCore (~> 11.15.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)
 | 
			
		||||
@@ -82,6 +136,8 @@ PODS:
 | 
			
		||||
    - 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):
 | 
			
		||||
@@ -93,12 +149,38 @@ PODS:
 | 
			
		||||
  - 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)
 | 
			
		||||
@@ -112,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"
 | 
			
		||||
@@ -130,11 +215,11 @@ PODS:
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - irondash_engine_context (0.0.1):
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - Kingfisher (8.3.3)
 | 
			
		||||
  - livekit_client (2.4.9):
 | 
			
		||||
  - 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
 | 
			
		||||
@@ -160,14 +245,16 @@ PODS:
 | 
			
		||||
  - 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):
 | 
			
		||||
@@ -178,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)
 | 
			
		||||
@@ -209,7 +299,7 @@ PODS:
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - wakelock_plus (0.0.1):
 | 
			
		||||
    - Flutter
 | 
			
		||||
  - WebRTC-SDK (125.6422.07)
 | 
			
		||||
  - WebRTC-SDK (137.7151.04)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES:
 | 
			
		||||
  - Alamofire
 | 
			
		||||
@@ -217,11 +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`)
 | 
			
		||||
@@ -259,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
 | 
			
		||||
@@ -284,16 +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:
 | 
			
		||||
@@ -361,30 +474,42 @@ SPEC CHECKSUMS:
 | 
			
		||||
  DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
 | 
			
		||||
  DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
 | 
			
		||||
  file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
 | 
			
		||||
  Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e
 | 
			
		||||
  firebase_core: c727a02c560a53f1f1e56e18f16515eb5753c492
 | 
			
		||||
  firebase_messaging: 4158969b04b667f5435731ec9d6e453bb58b0c4c
 | 
			
		||||
  FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e
 | 
			
		||||
  FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4
 | 
			
		||||
  FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843
 | 
			
		||||
  FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09
 | 
			
		||||
  Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
 | 
			
		||||
  file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
 | 
			
		||||
  Firebase: 26f6f8d460603af3df970ad505b16b15f5e2e9a1
 | 
			
		||||
  firebase_analytics: 111ff65791a430356bd6c7e4d7339537fc6a15ae
 | 
			
		||||
  firebase_core: 3ff52146406557dddd01d570e807e203ec7e1302
 | 
			
		||||
  firebase_crashlytics: 3637078b718a52dc9fb4d64e37c969e86b87ff6f
 | 
			
		||||
  firebase_messaging: 3dcc998dd98e1e54af75d0cccae8606eba43553c
 | 
			
		||||
  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: 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: ff82cb91d9266ddb56cbb2f72d32c26f00d3e5be
 | 
			
		||||
  livekit_client: 3f79d79233a5bd13d5b541732624ef959d7c538e
 | 
			
		||||
  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
 | 
			
		||||
@@ -395,23 +520,24 @@ SPEC CHECKSUMS:
 | 
			
		||||
  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;
 | 
			
		||||
@@ -773,13 +876,14 @@
 | 
			
		||||
				INFOPLIST_FILE = Runner/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = Solian;
 | 
			
		||||
				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				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";
 | 
			
		||||
@@ -794,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)";
 | 
			
		||||
@@ -812,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)";
 | 
			
		||||
@@ -828,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)";
 | 
			
		||||
@@ -836,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 */;
 | 
			
		||||
@@ -858,7 +1082,7 @@
 | 
			
		||||
				INFOPLIST_FILE = SolianShareExtension/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension;
 | 
			
		||||
				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
 | 
			
		||||
				LD_RUNPATH_SEARCH_PATHS = (
 | 
			
		||||
					"$(inherited)",
 | 
			
		||||
					"@executable_path/Frameworks",
 | 
			
		||||
@@ -873,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";
 | 
			
		||||
@@ -901,7 +1126,7 @@
 | 
			
		||||
				INFOPLIST_FILE = SolianShareExtension/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension;
 | 
			
		||||
				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
 | 
			
		||||
				LD_RUNPATH_SEARCH_PATHS = (
 | 
			
		||||
					"$(inherited)",
 | 
			
		||||
					"@executable_path/Frameworks",
 | 
			
		||||
@@ -914,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";
 | 
			
		||||
			};
 | 
			
		||||
@@ -941,7 +1167,7 @@
 | 
			
		||||
				INFOPLIST_FILE = SolianShareExtension/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = SolianShareExtension;
 | 
			
		||||
				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
 | 
			
		||||
				LD_RUNPATH_SEARCH_PATHS = (
 | 
			
		||||
					"$(inherited)",
 | 
			
		||||
					"@executable_path/Frameworks",
 | 
			
		||||
@@ -954,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";
 | 
			
		||||
			};
 | 
			
		||||
@@ -1128,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;
 | 
			
		||||
@@ -1179,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;
 | 
			
		||||
@@ -1204,13 +1431,14 @@
 | 
			
		||||
				INFOPLIST_FILE = Runner/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = Solian;
 | 
			
		||||
				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				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;
 | 
			
		||||
@@ -1232,13 +1460,14 @@
 | 
			
		||||
				INFOPLIST_FILE = Runner/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_CFBundleDisplayName = Solian;
 | 
			
		||||
				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
 | 
			
		||||
				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 | 
			
		||||
				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";
 | 
			
		||||
@@ -1258,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 = (
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import UIKit
 | 
			
		||||
        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>
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,8 @@
 | 
			
		||||
	<false/>
 | 
			
		||||
	<key>UISupportedInterfaceOrientations</key>
 | 
			
		||||
	<array>
 | 
			
		||||
		<string>UIInterfaceOrientationLandscapeLeft</string>
 | 
			
		||||
		<string>UIInterfaceOrientationLandscapeRight</string>
 | 
			
		||||
		<string>UIInterfaceOrientationPortrait</string>
 | 
			
		||||
	</array>
 | 
			
		||||
	<key>UISupportedInterfaceOrientations~ipad</key>
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ class NotifyDelegate: UIResponder, UNUserNotificationCenterDelegate {
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        let serverUrl = UserDefaults.standard.getServerUrl()
 | 
			
		||||
        let url = "\(serverUrl)/chat/\(metadata["room_id"] ?? "")/messages"
 | 
			
		||||
        let url = "\(serverUrl)/sphere/chat/\(metadata["room_id"] ?? "")/messages"
 | 
			
		||||
        
 | 
			
		||||
        let parameters: [String: Any?] = [
 | 
			
		||||
            "content": textResponse.userText,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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,8 +61,6 @@ class NotificationService: UNNotificationServiceExtension {
 | 
			
		||||
        
 | 
			
		||||
        let pfpIdentifier = meta["pfp"] as? String
 | 
			
		||||
        
 | 
			
		||||
        content.categoryIdentifier = "REPLYABLE_MESSAGE"
 | 
			
		||||
        
 | 
			
		||||
        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,87 @@ 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
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.updatedAt);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.deletedAt);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.type);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.meta);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.membersMentioned);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.editedAt);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.attachments);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.reactions);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.repliedMessageId);
 | 
			
		||||
        await m.addColumn(chatMessages, chatMessages.forwardedMessageId);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  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 +120,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 +129,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 +206,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 +225,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 +261,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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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,484 +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 {
 | 
			
		||||
      // For initial load, fetch latest messages in the background to sync.
 | 
			
		||||
      if (offset == 0 && !synced) {
 | 
			
		||||
        // Not awaiting this is intentional, for a quicker UI response.
 | 
			
		||||
        // The UI should rely on a stream from the database to get updates.
 | 
			
		||||
        _fetchAndCacheMessages(room.id, offset: 0, take: take).catchError((_) {
 | 
			
		||||
          // Best effort, errors will be handled by later fetches.
 | 
			
		||||
          return <LocalChatMessage>[];
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      final localMessages = await _getCachedMessages(
 | 
			
		||||
        room.id,
 | 
			
		||||
        offset: offset,
 | 
			
		||||
        take: take,
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      // If local cache has messages, return them. This is the common case for scrolling up.
 | 
			
		||||
      if (localMessages.isNotEmpty) {
 | 
			
		||||
        return localMessages;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // If local cache is empty, we've probably reached the end of cached history.
 | 
			
		||||
      // Fetch from remote. This will also be hit on first load if cache is empty.
 | 
			
		||||
      return await _fetchAndCacheMessages(room.id, offset: offset, take: take);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      // Final fallback to cache in case of network errors during fetch.
 | 
			
		||||
      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 for the first page
 | 
			
		||||
    if (offset == 0) {
 | 
			
		||||
      final pendingForRoom =
 | 
			
		||||
          pendingMessages.values.where((msg) => msg.roomId == roomId).toList();
 | 
			
		||||
 | 
			
		||||
      final allMessages = [...pendingForRoom, ...dbLocalMessages];
 | 
			
		||||
      allMessages.sort((a, b) => b.createdAt.compareTo(a.createdAt));
 | 
			
		||||
 | 
			
		||||
      // Remove duplicates by ID, preserving the order
 | 
			
		||||
      final uniqueMessages = <LocalChatMessage>[];
 | 
			
		||||
      final seenIds = <String>{};
 | 
			
		||||
      for (final message in allMessages) {
 | 
			
		||||
        if (seenIds.add(message.id)) {
 | 
			
		||||
          uniqueMessages.add(message);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return uniqueMessages;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return dbLocalMessages;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,11 @@ 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/services.dart';
 | 
			
		||||
 | 
			
		||||
import 'package:flutter_hooks/flutter_hooks.dart';
 | 
			
		||||
import 'package:go_router/go_router.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
@@ -20,7 +21,6 @@ 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/services/notify.dart';
 | 
			
		||||
import 'package:island/services/timezone.dart';
 | 
			
		||||
import 'package:island/widgets/alert.dart';
 | 
			
		||||
@@ -52,10 +52,27 @@ void main() async {
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    await EasyLocalization.ensureInitialized();
 | 
			
		||||
 | 
			
		||||
    if (kIsWeb || !Platform.isLinux) {
 | 
			
		||||
      await Firebase.initializeApp(
 | 
			
		||||
        options: DefaultFirebaseOptions.currentPlatform,
 | 
			
		||||
      );
 | 
			
		||||
    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
 | 
			
		||||
      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);
 | 
			
		||||
@@ -150,12 +167,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
 | 
			
		||||
          final router = ref.read(routerProvider);
 | 
			
		||||
          router.go(notification.data['action_uri']);
 | 
			
		||||
          router.push(notification.data['meta']['action_uri']);
 | 
			
		||||
        } else {
 | 
			
		||||
          // External links
 | 
			
		||||
          launchUrlString(uri);
 | 
			
		||||
@@ -164,27 +181,9 @@ class IslandApp extends HookConsumerWidget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    useEffect(() {
 | 
			
		||||
      const channel = MethodChannel('dev.solsynth.solian/notifications');
 | 
			
		||||
 | 
			
		||||
      Future<void> handleInitialLink() async {
 | 
			
		||||
        final String? link = await channel.invokeMethod('initialLink');
 | 
			
		||||
        if (link != null) {
 | 
			
		||||
          final router = ref.read(routerProvider);
 | 
			
		||||
          router.go(link);
 | 
			
		||||
      if (!kIsWeb && (Platform.isLinux || Platform.isWindows)) {
 | 
			
		||||
        return null;
 | 
			
		||||
      }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!kIsWeb && Platform.isAndroid) {
 | 
			
		||||
        handleInitialLink();
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      channel.setMethodCallHandler((call) async {
 | 
			
		||||
        if (call.method == 'newLink') {
 | 
			
		||||
          final String link = call.arguments;
 | 
			
		||||
          final router = ref.read(routerProvider);
 | 
			
		||||
          router.go(link);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // When the app is opened from a terminated state.
 | 
			
		||||
      FirebaseMessaging.instance.getInitialMessage().then((message) {
 | 
			
		||||
@@ -224,6 +223,7 @@ class IslandApp extends HookConsumerWidget {
 | 
			
		||||
          if (user.value != null) {
 | 
			
		||||
            final apiClient = ref.read(apiClientProvider);
 | 
			
		||||
            subscribePushNotification(apiClient);
 | 
			
		||||
            initializeLocalNotifications();
 | 
			
		||||
            final wsNotifier = ref.read(websocketStateProvider.notifier);
 | 
			
		||||
            wsNotifier.connect();
 | 
			
		||||
          }
 | 
			
		||||
@@ -240,6 +240,7 @@ class IslandApp extends HookConsumerWidget {
 | 
			
		||||
      themeMode: ThemeMode.system,
 | 
			
		||||
      routerConfig: router,
 | 
			
		||||
      supportedLocales: context.supportedLocales,
 | 
			
		||||
      scrollBehavior: AppScrollBehavior(),
 | 
			
		||||
      localizationsDelegates: [
 | 
			
		||||
        ...context.localizationDelegates,
 | 
			
		||||
        CroppyLocalizations.delegate,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -85,6 +84,130 @@ 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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -103,6 +136,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 +181,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);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3603
									
								
								lib/models/account.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3603
									
								
								lib/models/account.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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(),
 | 
			
		||||
@@ -210,6 +235,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 +252,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 +313,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({
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -100,6 +99,136 @@ 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()
 | 
			
		||||
 | 
			
		||||
@@ -330,6 +459,130 @@ 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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										63
									
								
								lib/models/bot.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										1156
									
								
								lib/models/bot.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										91
									
								
								lib/models/bot.g.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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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';
 | 
			
		||||
@@ -40,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,
 | 
			
		||||
@@ -91,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;
 | 
			
		||||
@@ -103,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) =>
 | 
			
		||||
@@ -116,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;
 | 
			
		||||
 | 
			
		||||
@@ -162,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) =>
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -69,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 [],
 | 
			
		||||
@@ -105,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(),
 | 
			
		||||
@@ -177,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
 | 
			
		||||
@@ -200,13 +206,17 @@ 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(
 | 
			
		||||
      lastMessage:
 | 
			
		||||
          json['last_message'] == null
 | 
			
		||||
              ? null
 | 
			
		||||
              : SnChatMessage.fromJson(
 | 
			
		||||
                json['last_message'] as Map<String, dynamic>,
 | 
			
		||||
              ),
 | 
			
		||||
    );
 | 
			
		||||
@@ -214,33 +224,14 @@ _SnChatSummary _$SnChatSummaryFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
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),
 | 
			
		||||
@@ -249,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(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -285,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) =>
 | 
			
		||||
@@ -297,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) =>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/file.dart';
 | 
			
		||||
import 'package:island/models/user.dart';
 | 
			
		||||
import 'package:island/models/account.dart';
 | 
			
		||||
 | 
			
		||||
part 'custom_app.freezed.dart';
 | 
			
		||||
part 'custom_app.g.dart';
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -147,6 +146,130 @@ $CustomAppLinksCopyWith<$Res>? get links {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [CustomApp].
 | 
			
		||||
extension CustomAppPatterns on CustomApp {
 | 
			
		||||
/// 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( _CustomApp value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp() 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( _CustomApp value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp():
 | 
			
		||||
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( _CustomApp value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp() 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 slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);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 slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp():
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);}
 | 
			
		||||
}
 | 
			
		||||
/// 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 slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomApp() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
@@ -370,6 +493,130 @@ as String?,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [CustomAppLinks].
 | 
			
		||||
extension CustomAppLinksPatterns on CustomAppLinks {
 | 
			
		||||
/// 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( _CustomAppLinks value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks() 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( _CustomAppLinks value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks():
 | 
			
		||||
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( _CustomAppLinks value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks() 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? homePage,  String? privacyPolicy,  String? termsOfService)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks() when $default != null:
 | 
			
		||||
return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);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? homePage,  String? privacyPolicy,  String? termsOfService)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks():
 | 
			
		||||
return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);}
 | 
			
		||||
}
 | 
			
		||||
/// 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? homePage,  String? privacyPolicy,  String? termsOfService)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppLinks() when $default != null:
 | 
			
		||||
return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
@@ -513,6 +760,130 @@ as bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [CustomAppOauthConfig].
 | 
			
		||||
extension CustomAppOauthConfigPatterns on CustomAppOauthConfig {
 | 
			
		||||
/// 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( _CustomAppOauthConfig value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig() 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( _CustomAppOauthConfig value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig():
 | 
			
		||||
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( _CustomAppOauthConfig value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig() 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? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig() when $default != null:
 | 
			
		||||
return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);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? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig():
 | 
			
		||||
return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);}
 | 
			
		||||
}
 | 
			
		||||
/// 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? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppOauthConfig() when $default != null:
 | 
			
		||||
return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
@@ -689,6 +1060,130 @@ as String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// 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,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppSecret() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);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,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppSecret():
 | 
			
		||||
return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);}
 | 
			
		||||
}
 | 
			
		||||
/// 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,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _CustomAppSecret() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								lib/models/custom_app_secret.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										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'],
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,13 +1,25 @@
 | 
			
		||||
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;
 | 
			
		||||
  const factory DeveloperStats({@Default(0) int totalCustomApps}) =
 | 
			
		||||
      _DeveloperStats;
 | 
			
		||||
 | 
			
		||||
  factory DeveloperStats.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$DeveloperStatsFromJson(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,293 @@ part of 'developer.dart';
 | 
			
		||||
// 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 {
 | 
			
		||||
 | 
			
		||||
@@ -76,6 +362,130 @@ 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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,22 @@ 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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,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 +42,7 @@ sealed class SnCloudFile with _$SnCloudFile {
 | 
			
		||||
    required String? description,
 | 
			
		||||
    required Map<String, dynamic>? fileMeta,
 | 
			
		||||
    required Map<String, dynamic>? userMeta,
 | 
			
		||||
    @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; 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)&&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),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, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -185,7 +311,7 @@ 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, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -202,14 +328,15 @@ 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? 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>?,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
 | 
			
		||||
@@ -224,11 +351,135 @@ as DateTime?,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// 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,  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.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,  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.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,  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.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, 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 +503,13 @@ class _SnCloudFile implements SnCloudFile {
 | 
			
		||||
  return EqualUnmodifiableMapView(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 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 +532,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)&&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),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, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -294,7 +552,7 @@ 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, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -311,14 +569,15 @@ 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? 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>?,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
 | 
			
		||||
 
 | 
			
		||||
@@ -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,11 @@ _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>?,
 | 
			
		||||
  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 +61,7 @@ Map<String, dynamic> _$SnCloudFileToJson(_SnCloudFile instance) =>
 | 
			
		||||
      'description': instance.description,
 | 
			
		||||
      'file_meta': instance.fileMeta,
 | 
			
		||||
      'user_meta': instance.userMeta,
 | 
			
		||||
      'sensitive_marks': instance.sensitiveMarks,
 | 
			
		||||
      'mime_type': instance.mimeType,
 | 
			
		||||
      'hash': instance.hash,
 | 
			
		||||
      'size': instance.size,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								lib/models/file_pool.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lib/models/file_pool.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extension SnFilePoolList on List<SnFilePool> {
 | 
			
		||||
  static List<SnFilePool> listFromResponse(dynamic data) {
 | 
			
		||||
    if (data is List) {
 | 
			
		||||
      return data
 | 
			
		||||
          .whereType<Map<String, dynamic>>()
 | 
			
		||||
          .map(SnFilePool.fromJson)
 | 
			
		||||
          .toList();
 | 
			
		||||
    }
 | 
			
		||||
    throw ArgumentError('Unexpected response format: $data');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  List<SnFilePool> filterValid() {
 | 
			
		||||
    return where((p) {
 | 
			
		||||
      final accept = p.policyConfig?['accept_types'];
 | 
			
		||||
 | 
			
		||||
      if (accept is List) {
 | 
			
		||||
        final acceptsOnlyMedia = accept.every((t) =>
 | 
			
		||||
            t is String &&
 | 
			
		||||
            (t.startsWith('image/') ||
 | 
			
		||||
                t.startsWith('video/') ||
 | 
			
		||||
                t.startsWith('audio/')));
 | 
			
		||||
        if (acceptsOnlyMedia) return false;
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    }).toList();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										328
									
								
								lib/models/file_pool.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								lib/models/file_pool.freezed.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,328 @@
 | 
			
		||||
// 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 'file_pool.dart';
 | 
			
		||||
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
// FreezedGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
// dart format off
 | 
			
		||||
T _$identity<T>(T value) => value;
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
mixin _$SnFilePool {
 | 
			
		||||
 | 
			
		||||
 String get id; String get name; String? get description; Map<String, dynamic>? get storageConfig; Map<String, dynamic>? get billingConfig; Map<String, dynamic>? get policyConfig; bool? get isHidden; String? get accountId; String? get resourceIdentifier; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt;
 | 
			
		||||
/// Create a copy of SnFilePool
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
$SnFilePoolCopyWith<SnFilePool> get copyWith => _$SnFilePoolCopyWithImpl<SnFilePool>(this as SnFilePool, _$identity);
 | 
			
		||||
 | 
			
		||||
  /// Serializes this SnFilePool to a JSON map.
 | 
			
		||||
  Map<String, dynamic> toJson();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is SnFilePool&&(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.storageConfig, storageConfig)&&const DeepCollectionEquality().equals(other.billingConfig, billingConfig)&&const DeepCollectionEquality().equals(other.policyConfig, policyConfig)&&(identical(other.isHidden, isHidden) || other.isHidden == isHidden)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.resourceIdentifier, resourceIdentifier) || other.resourceIdentifier == resourceIdentifier)&&(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(storageConfig),const DeepCollectionEquality().hash(billingConfig),const DeepCollectionEquality().hash(policyConfig),isHidden,accountId,resourceIdentifier,createdAt,updatedAt,deletedAt);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'SnFilePool(id: $id, name: $name, description: $description, storageConfig: $storageConfig, billingConfig: $billingConfig, policyConfig: $policyConfig, isHidden: $isHidden, accountId: $accountId, resourceIdentifier: $resourceIdentifier, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class $SnFilePoolCopyWith<$Res>  {
 | 
			
		||||
  factory $SnFilePoolCopyWith(SnFilePool value, $Res Function(SnFilePool) _then) = _$SnFilePoolCopyWithImpl;
 | 
			
		||||
@useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, 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
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class _$SnFilePoolCopyWithImpl<$Res>
 | 
			
		||||
    implements $SnFilePoolCopyWith<$Res> {
 | 
			
		||||
  _$SnFilePoolCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final SnFilePool _self;
 | 
			
		||||
  final $Res Function(SnFilePool) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnFilePool
 | 
			
		||||
/// 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? storageConfig = freezed,Object? billingConfig = freezed,Object? policyConfig = freezed,Object? isHidden = freezed,Object? accountId = freezed,Object? resourceIdentifier = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,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?,storageConfig: freezed == storageConfig ? _self.storageConfig : storageConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,billingConfig: freezed == billingConfig ? _self.billingConfig : billingConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,policyConfig: freezed == policyConfig ? _self.policyConfig : policyConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,isHidden: freezed == isHidden ? _self.isHidden : isHidden // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as bool?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,resourceIdentifier: freezed == resourceIdentifier ? _self.resourceIdentifier : resourceIdentifier // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as DateTime?,updatedAt: freezed == 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 [SnFilePool].
 | 
			
		||||
extension SnFilePoolPatterns on SnFilePool {
 | 
			
		||||
/// 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( _SnFilePool value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool() 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( _SnFilePool value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool():
 | 
			
		||||
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( _SnFilePool value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool() 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>? storageConfig,  Map<String, dynamic>? billingConfig,  Map<String, dynamic>? policyConfig,  bool? isHidden,  String? accountId,  String? resourceIdentifier,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.name,_that.description,_that.storageConfig,_that.billingConfig,_that.policyConfig,_that.isHidden,_that.accountId,_that.resourceIdentifier,_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>? storageConfig,  Map<String, dynamic>? billingConfig,  Map<String, dynamic>? policyConfig,  bool? isHidden,  String? accountId,  String? resourceIdentifier,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool():
 | 
			
		||||
return $default(_that.id,_that.name,_that.description,_that.storageConfig,_that.billingConfig,_that.policyConfig,_that.isHidden,_that.accountId,_that.resourceIdentifier,_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>? storageConfig,  Map<String, dynamic>? billingConfig,  Map<String, dynamic>? policyConfig,  bool? isHidden,  String? accountId,  String? resourceIdentifier,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnFilePool() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.name,_that.description,_that.storageConfig,_that.billingConfig,_that.policyConfig,_that.isHidden,_that.accountId,_that.resourceIdentifier,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
class _SnFilePool implements SnFilePool {
 | 
			
		||||
  const _SnFilePool({required this.id, required this.name, this.description, final  Map<String, dynamic>? storageConfig, final  Map<String, dynamic>? billingConfig, final  Map<String, dynamic>? policyConfig, this.isHidden, this.accountId, this.resourceIdentifier, this.createdAt, this.updatedAt, this.deletedAt}): _storageConfig = storageConfig,_billingConfig = billingConfig,_policyConfig = policyConfig;
 | 
			
		||||
  factory _SnFilePool.fromJson(Map<String, dynamic> json) => _$SnFilePoolFromJson(json);
 | 
			
		||||
 | 
			
		||||
@override final  String id;
 | 
			
		||||
@override final  String name;
 | 
			
		||||
@override final  String? description;
 | 
			
		||||
 final  Map<String, dynamic>? _storageConfig;
 | 
			
		||||
@override Map<String, dynamic>? get storageConfig {
 | 
			
		||||
  final value = _storageConfig;
 | 
			
		||||
  if (value == null) return null;
 | 
			
		||||
  if (_storageConfig is EqualUnmodifiableMapView) return _storageConfig;
 | 
			
		||||
  // ignore: implicit_dynamic_type
 | 
			
		||||
  return EqualUnmodifiableMapView(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 final  Map<String, dynamic>? _billingConfig;
 | 
			
		||||
@override Map<String, dynamic>? get billingConfig {
 | 
			
		||||
  final value = _billingConfig;
 | 
			
		||||
  if (value == null) return null;
 | 
			
		||||
  if (_billingConfig is EqualUnmodifiableMapView) return _billingConfig;
 | 
			
		||||
  // ignore: implicit_dynamic_type
 | 
			
		||||
  return EqualUnmodifiableMapView(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 final  Map<String, dynamic>? _policyConfig;
 | 
			
		||||
@override Map<String, dynamic>? get policyConfig {
 | 
			
		||||
  final value = _policyConfig;
 | 
			
		||||
  if (value == null) return null;
 | 
			
		||||
  if (_policyConfig is EqualUnmodifiableMapView) return _policyConfig;
 | 
			
		||||
  // ignore: implicit_dynamic_type
 | 
			
		||||
  return EqualUnmodifiableMapView(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override final  bool? isHidden;
 | 
			
		||||
@override final  String? accountId;
 | 
			
		||||
@override final  String? resourceIdentifier;
 | 
			
		||||
@override final  DateTime? createdAt;
 | 
			
		||||
@override final  DateTime? updatedAt;
 | 
			
		||||
@override final  DateTime? deletedAt;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnFilePool
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
_$SnFilePoolCopyWith<_SnFilePool> get copyWith => __$SnFilePoolCopyWithImpl<_SnFilePool>(this, _$identity);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
Map<String, dynamic> toJson() {
 | 
			
		||||
  return _$SnFilePoolToJson(this, );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnFilePool&&(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._storageConfig, _storageConfig)&&const DeepCollectionEquality().equals(other._billingConfig, _billingConfig)&&const DeepCollectionEquality().equals(other._policyConfig, _policyConfig)&&(identical(other.isHidden, isHidden) || other.isHidden == isHidden)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.resourceIdentifier, resourceIdentifier) || other.resourceIdentifier == resourceIdentifier)&&(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(_storageConfig),const DeepCollectionEquality().hash(_billingConfig),const DeepCollectionEquality().hash(_policyConfig),isHidden,accountId,resourceIdentifier,createdAt,updatedAt,deletedAt);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'SnFilePool(id: $id, name: $name, description: $description, storageConfig: $storageConfig, billingConfig: $billingConfig, policyConfig: $policyConfig, isHidden: $isHidden, accountId: $accountId, resourceIdentifier: $resourceIdentifier, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class _$SnFilePoolCopyWith<$Res> implements $SnFilePoolCopyWith<$Res> {
 | 
			
		||||
  factory _$SnFilePoolCopyWith(_SnFilePool value, $Res Function(_SnFilePool) _then) = __$SnFilePoolCopyWithImpl;
 | 
			
		||||
@override @useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, 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
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class __$SnFilePoolCopyWithImpl<$Res>
 | 
			
		||||
    implements _$SnFilePoolCopyWith<$Res> {
 | 
			
		||||
  __$SnFilePoolCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final _SnFilePool _self;
 | 
			
		||||
  final $Res Function(_SnFilePool) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnFilePool
 | 
			
		||||
/// 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? storageConfig = freezed,Object? billingConfig = freezed,Object? policyConfig = freezed,Object? isHidden = freezed,Object? accountId = freezed,Object? resourceIdentifier = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,}) {
 | 
			
		||||
  return _then(_SnFilePool(
 | 
			
		||||
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?,storageConfig: freezed == storageConfig ? _self._storageConfig : storageConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,billingConfig: freezed == billingConfig ? _self._billingConfig : billingConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,policyConfig: freezed == policyConfig ? _self._policyConfig : policyConfig // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as Map<String, dynamic>?,isHidden: freezed == isHidden ? _self.isHidden : isHidden // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as bool?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,resourceIdentifier: freezed == resourceIdentifier ? _self.resourceIdentifier : resourceIdentifier // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as DateTime?,updatedAt: freezed == 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
 | 
			
		||||
							
								
								
									
										47
									
								
								lib/models/file_pool.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								lib/models/file_pool.g.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
// GENERATED CODE - DO NOT MODIFY BY HAND
 | 
			
		||||
 | 
			
		||||
part of 'file_pool.dart';
 | 
			
		||||
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
// JsonSerializableGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
_SnFilePool _$SnFilePoolFromJson(Map<String, dynamic> json) => _SnFilePool(
 | 
			
		||||
  id: json['id'] as String,
 | 
			
		||||
  name: json['name'] as String,
 | 
			
		||||
  description: json['description'] as String?,
 | 
			
		||||
  storageConfig: json['storage_config'] as Map<String, dynamic>?,
 | 
			
		||||
  billingConfig: json['billing_config'] as Map<String, dynamic>?,
 | 
			
		||||
  policyConfig: json['policy_config'] as Map<String, dynamic>?,
 | 
			
		||||
  isHidden: json['is_hidden'] as bool?,
 | 
			
		||||
  accountId: json['account_id'] as String?,
 | 
			
		||||
  resourceIdentifier: json['resource_identifier'] as String?,
 | 
			
		||||
  createdAt:
 | 
			
		||||
      json['created_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['created_at'] as String),
 | 
			
		||||
  updatedAt:
 | 
			
		||||
      json['updated_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['updated_at'] as String),
 | 
			
		||||
  deletedAt:
 | 
			
		||||
      json['deleted_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['deleted_at'] as String),
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnFilePoolToJson(_SnFilePool instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'name': instance.name,
 | 
			
		||||
      'description': instance.description,
 | 
			
		||||
      'storage_config': instance.storageConfig,
 | 
			
		||||
      'billing_config': instance.billingConfig,
 | 
			
		||||
      'policy_config': instance.policyConfig,
 | 
			
		||||
      'is_hidden': instance.isHidden,
 | 
			
		||||
      'account_id': instance.accountId,
 | 
			
		||||
      'resource_identifier': instance.resourceIdentifier,
 | 
			
		||||
      'created_at': instance.createdAt?.toIso8601String(),
 | 
			
		||||
      'updated_at': instance.updatedAt?.toIso8601String(),
 | 
			
		||||
      'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
    };
 | 
			
		||||
							
								
								
									
										110
									
								
								lib/models/poll.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								lib/models/poll.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/account.dart';
 | 
			
		||||
import 'package:island/models/publisher.dart';
 | 
			
		||||
 | 
			
		||||
part 'poll.freezed.dart';
 | 
			
		||||
part 'poll.g.dart';
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPollWithStats with _$SnPollWithStats {
 | 
			
		||||
  const factory SnPollWithStats({
 | 
			
		||||
    required Map<String, dynamic>? userAnswer,
 | 
			
		||||
    @Default({}) Map<String, dynamic> stats,
 | 
			
		||||
    required String id,
 | 
			
		||||
    required List<SnPollQuestion> questions,
 | 
			
		||||
    String? title,
 | 
			
		||||
    String? description,
 | 
			
		||||
    DateTime? endedAt,
 | 
			
		||||
    required String publisherId,
 | 
			
		||||
    required DateTime createdAt,
 | 
			
		||||
    required DateTime updatedAt,
 | 
			
		||||
    DateTime? deletedAt,
 | 
			
		||||
  }) = _SnPollWithStats;
 | 
			
		||||
 | 
			
		||||
  factory SnPollWithStats.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPollWithStatsFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPoll with _$SnPoll {
 | 
			
		||||
  const factory SnPoll({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required List<SnPollQuestion> questions,
 | 
			
		||||
 | 
			
		||||
    String? title,
 | 
			
		||||
    String? description,
 | 
			
		||||
 | 
			
		||||
    DateTime? endedAt,
 | 
			
		||||
 | 
			
		||||
    required String publisherId,
 | 
			
		||||
    SnPublisher? publisher,
 | 
			
		||||
 | 
			
		||||
    // ModelBase fields
 | 
			
		||||
    required DateTime createdAt,
 | 
			
		||||
    required DateTime updatedAt,
 | 
			
		||||
    DateTime? deletedAt,
 | 
			
		||||
  }) = _SnPoll;
 | 
			
		||||
 | 
			
		||||
  factory SnPoll.fromJson(Map<String, dynamic> json) => _$SnPollFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPollQuestion with _$SnPollQuestion {
 | 
			
		||||
  const factory SnPollQuestion({
 | 
			
		||||
    required String id,
 | 
			
		||||
 | 
			
		||||
    required SnPollQuestionType type,
 | 
			
		||||
    List<SnPollOption>? options,
 | 
			
		||||
 | 
			
		||||
    required String title,
 | 
			
		||||
    String? description,
 | 
			
		||||
    required int order,
 | 
			
		||||
    required bool isRequired,
 | 
			
		||||
  }) = _SnPollQuestion;
 | 
			
		||||
 | 
			
		||||
  factory SnPollQuestion.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPollQuestionFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPollOption with _$SnPollOption {
 | 
			
		||||
  const factory SnPollOption({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required String label,
 | 
			
		||||
    String? description,
 | 
			
		||||
    required int order,
 | 
			
		||||
  }) = _SnPollOption;
 | 
			
		||||
 | 
			
		||||
  factory SnPollOption.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPollOptionFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum SnPollQuestionType {
 | 
			
		||||
  @JsonValue(0)
 | 
			
		||||
  singleChoice,
 | 
			
		||||
  @JsonValue(1)
 | 
			
		||||
  multipleChoice,
 | 
			
		||||
  @JsonValue(2)
 | 
			
		||||
  yesNo,
 | 
			
		||||
  @JsonValue(3)
 | 
			
		||||
  rating,
 | 
			
		||||
  @JsonValue(4)
 | 
			
		||||
  freeText,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPollAnswer with _$SnPollAnswer {
 | 
			
		||||
  const factory SnPollAnswer({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required Map<String, dynamic> answer,
 | 
			
		||||
    required String accountId,
 | 
			
		||||
    required String pollId,
 | 
			
		||||
    required DateTime createdAt,
 | 
			
		||||
    required DateTime updatedAt,
 | 
			
		||||
    required DateTime? deletedAt,
 | 
			
		||||
    SnAccount? account,
 | 
			
		||||
  }) = _SnPollAnswer;
 | 
			
		||||
 | 
			
		||||
  factory SnPollAnswer.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPollAnswerFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1494
									
								
								lib/models/poll.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1494
									
								
								lib/models/poll.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										163
									
								
								lib/models/poll.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								lib/models/poll.g.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,163 @@
 | 
			
		||||
// GENERATED CODE - DO NOT MODIFY BY HAND
 | 
			
		||||
 | 
			
		||||
part of 'poll.dart';
 | 
			
		||||
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
// JsonSerializableGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
_SnPollWithStats _$SnPollWithStatsFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPollWithStats(
 | 
			
		||||
      userAnswer: json['user_answer'] as Map<String, dynamic>?,
 | 
			
		||||
      stats: json['stats'] as Map<String, dynamic>? ?? const {},
 | 
			
		||||
      id: json['id'] as String,
 | 
			
		||||
      questions:
 | 
			
		||||
          (json['questions'] as List<dynamic>)
 | 
			
		||||
              .map((e) => SnPollQuestion.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
              .toList(),
 | 
			
		||||
      title: json['title'] as String?,
 | 
			
		||||
      description: json['description'] as String?,
 | 
			
		||||
      endedAt:
 | 
			
		||||
          json['ended_at'] == null
 | 
			
		||||
              ? null
 | 
			
		||||
              : DateTime.parse(json['ended_at'] as String),
 | 
			
		||||
      publisherId: json['publisher_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> _$SnPollWithStatsToJson(_SnPollWithStats instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'user_answer': instance.userAnswer,
 | 
			
		||||
      'stats': instance.stats,
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'questions': instance.questions.map((e) => e.toJson()).toList(),
 | 
			
		||||
      'title': instance.title,
 | 
			
		||||
      'description': instance.description,
 | 
			
		||||
      'ended_at': instance.endedAt?.toIso8601String(),
 | 
			
		||||
      'publisher_id': instance.publisherId,
 | 
			
		||||
      'created_at': instance.createdAt.toIso8601String(),
 | 
			
		||||
      'updated_at': instance.updatedAt.toIso8601String(),
 | 
			
		||||
      'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
_SnPoll _$SnPollFromJson(Map<String, dynamic> json) => _SnPoll(
 | 
			
		||||
  id: json['id'] as String,
 | 
			
		||||
  questions:
 | 
			
		||||
      (json['questions'] as List<dynamic>)
 | 
			
		||||
          .map((e) => SnPollQuestion.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          .toList(),
 | 
			
		||||
  title: json['title'] as String?,
 | 
			
		||||
  description: json['description'] as String?,
 | 
			
		||||
  endedAt:
 | 
			
		||||
      json['ended_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['ended_at'] as String),
 | 
			
		||||
  publisherId: json['publisher_id'] as String,
 | 
			
		||||
  publisher:
 | 
			
		||||
      json['publisher'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : SnPublisher.fromJson(json['publisher'] as Map<String, dynamic>),
 | 
			
		||||
  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> _$SnPollToJson(_SnPoll instance) => <String, dynamic>{
 | 
			
		||||
  'id': instance.id,
 | 
			
		||||
  'questions': instance.questions.map((e) => e.toJson()).toList(),
 | 
			
		||||
  'title': instance.title,
 | 
			
		||||
  'description': instance.description,
 | 
			
		||||
  'ended_at': instance.endedAt?.toIso8601String(),
 | 
			
		||||
  'publisher_id': instance.publisherId,
 | 
			
		||||
  'publisher': instance.publisher?.toJson(),
 | 
			
		||||
  'created_at': instance.createdAt.toIso8601String(),
 | 
			
		||||
  'updated_at': instance.updatedAt.toIso8601String(),
 | 
			
		||||
  'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
_SnPollQuestion _$SnPollQuestionFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPollQuestion(
 | 
			
		||||
      id: json['id'] as String,
 | 
			
		||||
      type: $enumDecode(_$SnPollQuestionTypeEnumMap, json['type']),
 | 
			
		||||
      options:
 | 
			
		||||
          (json['options'] as List<dynamic>?)
 | 
			
		||||
              ?.map((e) => SnPollOption.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
              .toList(),
 | 
			
		||||
      title: json['title'] as String,
 | 
			
		||||
      description: json['description'] as String?,
 | 
			
		||||
      order: (json['order'] as num).toInt(),
 | 
			
		||||
      isRequired: json['is_required'] as bool,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnPollQuestionToJson(_SnPollQuestion instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'type': _$SnPollQuestionTypeEnumMap[instance.type]!,
 | 
			
		||||
      'options': instance.options?.map((e) => e.toJson()).toList(),
 | 
			
		||||
      'title': instance.title,
 | 
			
		||||
      'description': instance.description,
 | 
			
		||||
      'order': instance.order,
 | 
			
		||||
      'is_required': instance.isRequired,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
const _$SnPollQuestionTypeEnumMap = {
 | 
			
		||||
  SnPollQuestionType.singleChoice: 0,
 | 
			
		||||
  SnPollQuestionType.multipleChoice: 1,
 | 
			
		||||
  SnPollQuestionType.yesNo: 2,
 | 
			
		||||
  SnPollQuestionType.rating: 3,
 | 
			
		||||
  SnPollQuestionType.freeText: 4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
_SnPollOption _$SnPollOptionFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPollOption(
 | 
			
		||||
      id: json['id'] as String,
 | 
			
		||||
      label: json['label'] as String,
 | 
			
		||||
      description: json['description'] as String?,
 | 
			
		||||
      order: (json['order'] as num).toInt(),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnPollOptionToJson(_SnPollOption instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'label': instance.label,
 | 
			
		||||
      'description': instance.description,
 | 
			
		||||
      'order': instance.order,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
_SnPollAnswer _$SnPollAnswerFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPollAnswer(
 | 
			
		||||
      id: json['id'] as String,
 | 
			
		||||
      answer: json['answer'] as Map<String, dynamic>,
 | 
			
		||||
      accountId: json['account_id'] as String,
 | 
			
		||||
      pollId: json['poll_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),
 | 
			
		||||
      account:
 | 
			
		||||
          json['account'] == null
 | 
			
		||||
              ? null
 | 
			
		||||
              : SnAccount.fromJson(json['account'] as Map<String, dynamic>),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnPollAnswerToJson(_SnPollAnswer instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'answer': instance.answer,
 | 
			
		||||
      'account_id': instance.accountId,
 | 
			
		||||
      'poll_id': instance.pollId,
 | 
			
		||||
      'created_at': instance.createdAt.toIso8601String(),
 | 
			
		||||
      'updated_at': instance.updatedAt.toIso8601String(),
 | 
			
		||||
      'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
      'account': instance.account?.toJson(),
 | 
			
		||||
    };
 | 
			
		||||
@@ -3,6 +3,7 @@ import 'package:island/models/file.dart';
 | 
			
		||||
import 'package:island/models/post_category.dart';
 | 
			
		||||
import 'package:island/models/post_tag.dart';
 | 
			
		||||
import 'package:island/models/publisher.dart';
 | 
			
		||||
import 'package:island/models/realm.dart';
 | 
			
		||||
 | 
			
		||||
part 'post.freezed.dart';
 | 
			
		||||
part 'post.g.dart';
 | 
			
		||||
@@ -18,25 +19,32 @@ sealed class SnPost with _$SnPost {
 | 
			
		||||
    @Default(null) DateTime? publishedAt,
 | 
			
		||||
    @Default(0) int visibility,
 | 
			
		||||
    String? content,
 | 
			
		||||
    String? slug,
 | 
			
		||||
    @Default(0) int type,
 | 
			
		||||
    Map<String, dynamic>? meta,
 | 
			
		||||
    SnPostEmbedView? embedView,
 | 
			
		||||
    @Default(0) int viewsUnique,
 | 
			
		||||
    @Default(0) int viewsTotal,
 | 
			
		||||
    @Default(0) int upvotes,
 | 
			
		||||
    @Default(0) int downvotes,
 | 
			
		||||
    @Default(0) int repliesCount,
 | 
			
		||||
    @Default(0) int awardedScore,
 | 
			
		||||
    int? pinMode,
 | 
			
		||||
    String? threadedPostId,
 | 
			
		||||
    SnPost? threadedPost,
 | 
			
		||||
    String? repliedPostId,
 | 
			
		||||
    SnPost? repliedPost,
 | 
			
		||||
    String? forwardedPostId,
 | 
			
		||||
    SnPost? forwardedPost,
 | 
			
		||||
    String? realmId,
 | 
			
		||||
    SnRealm? realm,
 | 
			
		||||
    @Default([]) List<SnCloudFile> attachments,
 | 
			
		||||
    required SnPublisher publisher,
 | 
			
		||||
    @Default({}) Map<String, int> reactionsCount,
 | 
			
		||||
    @Default({}) Map<String, bool> reactionsMade,
 | 
			
		||||
    @Default([]) List<dynamic> reactions,
 | 
			
		||||
    @Default([]) List<PostTag> tags,
 | 
			
		||||
    @Default([]) List<PostCategory> categories,
 | 
			
		||||
    @Default([]) List<SnPostTag> tags,
 | 
			
		||||
    @Default([]) List<SnPostCategory> categories,
 | 
			
		||||
    @Default([]) List<dynamic> collections,
 | 
			
		||||
    @Default(null) DateTime? createdAt,
 | 
			
		||||
    @Default(null) DateTime? updatedAt,
 | 
			
		||||
@@ -77,6 +85,13 @@ sealed class SnSubscriptionStatus with _$SnSubscriptionStatus {
 | 
			
		||||
sealed class ReactInfo with _$ReactInfo {
 | 
			
		||||
  const factory ReactInfo({required String icon, required int attitude}) =
 | 
			
		||||
      _ReactInfo;
 | 
			
		||||
 | 
			
		||||
  static String getTranslationKey(String templateKey) {
 | 
			
		||||
    final parts = templateKey.split('_');
 | 
			
		||||
    final camelCase =
 | 
			
		||||
        parts.map((p) => p[0].toUpperCase() + p.substring(1)).join();
 | 
			
		||||
    return 'reaction$camelCase';
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Map<String, ReactInfo> kReactionTemplates = {
 | 
			
		||||
@@ -92,3 +107,38 @@ const Map<String, ReactInfo> kReactionTemplates = {
 | 
			
		||||
  'pray': ReactInfo(icon: '🙏', attitude: 0),
 | 
			
		||||
  'heart': ReactInfo(icon: '❤️', attitude: 0),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum PostEmbedViewRenderer {
 | 
			
		||||
  @JsonValue(0)
 | 
			
		||||
  webView,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPostEmbedView with _$SnPostEmbedView {
 | 
			
		||||
  const factory SnPostEmbedView({
 | 
			
		||||
    required String uri,
 | 
			
		||||
    double? aspectRatio,
 | 
			
		||||
    @Default(PostEmbedViewRenderer.webView) PostEmbedViewRenderer renderer,
 | 
			
		||||
  }) = _SnPostEmbedView;
 | 
			
		||||
 | 
			
		||||
  factory SnPostEmbedView.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPostEmbedViewFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class SnPostAward with _$SnPostAward {
 | 
			
		||||
  const factory SnPostAward({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required double amount,
 | 
			
		||||
    required int attitude,
 | 
			
		||||
    String? message,
 | 
			
		||||
    required String postId,
 | 
			
		||||
    required String accountId,
 | 
			
		||||
    @Default(null) DateTime? createdAt,
 | 
			
		||||
    @Default(null) DateTime? updatedAt,
 | 
			
		||||
    DateTime? deletedAt,
 | 
			
		||||
  }) = _SnPostAward;
 | 
			
		||||
 | 
			
		||||
  factory SnPostAward.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPostAwardFromJson(json);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -21,13 +21,22 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost(
 | 
			
		||||
          : DateTime.parse(json['published_at'] as String),
 | 
			
		||||
  visibility: (json['visibility'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  content: json['content'] as String?,
 | 
			
		||||
  slug: json['slug'] as String?,
 | 
			
		||||
  type: (json['type'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  meta: json['meta'] as Map<String, dynamic>?,
 | 
			
		||||
  embedView:
 | 
			
		||||
      json['embed_view'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : SnPostEmbedView.fromJson(
 | 
			
		||||
            json['embed_view'] as Map<String, dynamic>,
 | 
			
		||||
          ),
 | 
			
		||||
  viewsUnique: (json['views_unique'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  viewsTotal: (json['views_total'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  upvotes: (json['upvotes'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  downvotes: (json['downvotes'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  repliesCount: (json['replies_count'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  awardedScore: (json['awarded_score'] as num?)?.toInt() ?? 0,
 | 
			
		||||
  pinMode: (json['pin_mode'] as num?)?.toInt(),
 | 
			
		||||
  threadedPostId: json['threaded_post_id'] as String?,
 | 
			
		||||
  threadedPost:
 | 
			
		||||
      json['threaded_post'] == null
 | 
			
		||||
@@ -43,6 +52,11 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost(
 | 
			
		||||
      json['forwarded_post'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : SnPost.fromJson(json['forwarded_post'] as Map<String, dynamic>),
 | 
			
		||||
  realmId: json['realm_id'] as String?,
 | 
			
		||||
  realm:
 | 
			
		||||
      json['realm'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : SnRealm.fromJson(json['realm'] as Map<String, dynamic>),
 | 
			
		||||
  attachments:
 | 
			
		||||
      (json['attachments'] as List<dynamic>?)
 | 
			
		||||
          ?.map((e) => SnCloudFile.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
@@ -54,15 +68,20 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost(
 | 
			
		||||
        (k, e) => MapEntry(k, (e as num).toInt()),
 | 
			
		||||
      ) ??
 | 
			
		||||
      const {},
 | 
			
		||||
  reactionsMade:
 | 
			
		||||
      (json['reactions_made'] as Map<String, dynamic>?)?.map(
 | 
			
		||||
        (k, e) => MapEntry(k, e as bool),
 | 
			
		||||
      ) ??
 | 
			
		||||
      const {},
 | 
			
		||||
  reactions: json['reactions'] as List<dynamic>? ?? const [],
 | 
			
		||||
  tags:
 | 
			
		||||
      (json['tags'] as List<dynamic>?)
 | 
			
		||||
          ?.map((e) => PostTag.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          ?.map((e) => SnPostTag.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          .toList() ??
 | 
			
		||||
      const [],
 | 
			
		||||
  categories:
 | 
			
		||||
      (json['categories'] as List<dynamic>?)
 | 
			
		||||
          ?.map((e) => PostCategory.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          ?.map((e) => SnPostCategory.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          .toList() ??
 | 
			
		||||
      const [],
 | 
			
		||||
  collections: json['collections'] as List<dynamic>? ?? const [],
 | 
			
		||||
@@ -90,22 +109,29 @@ Map<String, dynamic> _$SnPostToJson(_SnPost instance) => <String, dynamic>{
 | 
			
		||||
  'published_at': instance.publishedAt?.toIso8601String(),
 | 
			
		||||
  'visibility': instance.visibility,
 | 
			
		||||
  'content': instance.content,
 | 
			
		||||
  'slug': instance.slug,
 | 
			
		||||
  'type': instance.type,
 | 
			
		||||
  'meta': instance.meta,
 | 
			
		||||
  'embed_view': instance.embedView?.toJson(),
 | 
			
		||||
  'views_unique': instance.viewsUnique,
 | 
			
		||||
  'views_total': instance.viewsTotal,
 | 
			
		||||
  'upvotes': instance.upvotes,
 | 
			
		||||
  'downvotes': instance.downvotes,
 | 
			
		||||
  'replies_count': instance.repliesCount,
 | 
			
		||||
  'awarded_score': instance.awardedScore,
 | 
			
		||||
  'pin_mode': instance.pinMode,
 | 
			
		||||
  'threaded_post_id': instance.threadedPostId,
 | 
			
		||||
  'threaded_post': instance.threadedPost?.toJson(),
 | 
			
		||||
  'replied_post_id': instance.repliedPostId,
 | 
			
		||||
  'replied_post': instance.repliedPost?.toJson(),
 | 
			
		||||
  'forwarded_post_id': instance.forwardedPostId,
 | 
			
		||||
  'forwarded_post': instance.forwardedPost?.toJson(),
 | 
			
		||||
  'realm_id': instance.realmId,
 | 
			
		||||
  'realm': instance.realm?.toJson(),
 | 
			
		||||
  'attachments': instance.attachments.map((e) => e.toJson()).toList(),
 | 
			
		||||
  'publisher': instance.publisher.toJson(),
 | 
			
		||||
  'reactions_count': instance.reactionsCount,
 | 
			
		||||
  'reactions_made': instance.reactionsMade,
 | 
			
		||||
  'reactions': instance.reactions,
 | 
			
		||||
  'tags': instance.tags.map((e) => e.toJson()).toList(),
 | 
			
		||||
  'categories': instance.categories.map((e) => e.toJson()).toList(),
 | 
			
		||||
@@ -149,3 +175,58 @@ Map<String, dynamic> _$SnSubscriptionStatusToJson(
 | 
			
		||||
  'publisher_id': instance.publisherId,
 | 
			
		||||
  'publisher_name': instance.publisherName,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
_SnPostEmbedView _$SnPostEmbedViewFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPostEmbedView(
 | 
			
		||||
      uri: json['uri'] as String,
 | 
			
		||||
      aspectRatio: (json['aspect_ratio'] as num?)?.toDouble(),
 | 
			
		||||
      renderer:
 | 
			
		||||
          $enumDecodeNullable(
 | 
			
		||||
            _$PostEmbedViewRendererEnumMap,
 | 
			
		||||
            json['renderer'],
 | 
			
		||||
          ) ??
 | 
			
		||||
          PostEmbedViewRenderer.webView,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnPostEmbedViewToJson(_SnPostEmbedView instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'uri': instance.uri,
 | 
			
		||||
      'aspect_ratio': instance.aspectRatio,
 | 
			
		||||
      'renderer': _$PostEmbedViewRendererEnumMap[instance.renderer]!,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
const _$PostEmbedViewRendererEnumMap = {PostEmbedViewRenderer.webView: 0};
 | 
			
		||||
 | 
			
		||||
_SnPostAward _$SnPostAwardFromJson(Map<String, dynamic> json) => _SnPostAward(
 | 
			
		||||
  id: json['id'] as String,
 | 
			
		||||
  amount: (json['amount'] as num).toDouble(),
 | 
			
		||||
  attitude: (json['attitude'] as num).toInt(),
 | 
			
		||||
  message: json['message'] as String?,
 | 
			
		||||
  postId: json['post_id'] as String,
 | 
			
		||||
  accountId: json['account_id'] as String,
 | 
			
		||||
  createdAt:
 | 
			
		||||
      json['created_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['created_at'] as String),
 | 
			
		||||
  updatedAt:
 | 
			
		||||
      json['updated_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['updated_at'] as String),
 | 
			
		||||
  deletedAt:
 | 
			
		||||
      json['deleted_at'] == null
 | 
			
		||||
          ? null
 | 
			
		||||
          : DateTime.parse(json['deleted_at'] as String),
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnPostAwardToJson(_SnPostAward instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'amount': instance.amount,
 | 
			
		||||
      'attitude': instance.attitude,
 | 
			
		||||
      'message': instance.message,
 | 
			
		||||
      'post_id': instance.postId,
 | 
			
		||||
      'account_id': instance.accountId,
 | 
			
		||||
      'created_at': instance.createdAt?.toIso8601String(),
 | 
			
		||||
      'updated_at': instance.updatedAt?.toIso8601String(),
 | 
			
		||||
      'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,31 @@
 | 
			
		||||
 | 
			
		||||
import 'package:easy_localization/easy_localization.dart';
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/post.dart';
 | 
			
		||||
import 'package:island/utils/text.dart';
 | 
			
		||||
 | 
			
		||||
part 'post_category.freezed.dart';
 | 
			
		||||
part 'post_category.g.dart';
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class PostCategory with _$PostCategory {
 | 
			
		||||
  const factory PostCategory({
 | 
			
		||||
sealed class SnPostCategory with _$SnPostCategory {
 | 
			
		||||
  const SnPostCategory._();
 | 
			
		||||
 | 
			
		||||
  const factory SnPostCategory({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required String slug,
 | 
			
		||||
    String? name,
 | 
			
		||||
    @Default([]) List<SnPost> posts,
 | 
			
		||||
  }) = _PostCategory;
 | 
			
		||||
    @Default(0) int usage,
 | 
			
		||||
  }) = _SnPostCategory;
 | 
			
		||||
 | 
			
		||||
  factory PostCategory.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$PostCategoryFromJson(json);
 | 
			
		||||
  factory SnPostCategory.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPostCategoryFromJson(json);
 | 
			
		||||
 | 
			
		||||
  String get categoryDisplayTitle {
 | 
			
		||||
    final capitalizedSlug = slug.capitalizeEachWord();
 | 
			
		||||
    if ('postCategory$capitalizedSlug'.trExists()) {
 | 
			
		||||
      return 'postCategory$capitalizedSlug'.tr();
 | 
			
		||||
    }
 | 
			
		||||
    return name ?? slug;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -14,42 +13,42 @@ part of 'post_category.dart';
 | 
			
		||||
T _$identity<T>(T value) => value;
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
mixin _$PostCategory {
 | 
			
		||||
mixin _$SnPostCategory {
 | 
			
		||||
 | 
			
		||||
 String get id; String get slug; String? get name; List<SnPost> get posts;
 | 
			
		||||
/// Create a copy of PostCategory
 | 
			
		||||
 String get id; String get slug; String? get name; List<SnPost> get posts; int get usage;
 | 
			
		||||
/// Create a copy of SnPostCategory
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
$PostCategoryCopyWith<PostCategory> get copyWith => _$PostCategoryCopyWithImpl<PostCategory>(this as PostCategory, _$identity);
 | 
			
		||||
$SnPostCategoryCopyWith<SnPostCategory> get copyWith => _$SnPostCategoryCopyWithImpl<SnPostCategory>(this as SnPostCategory, _$identity);
 | 
			
		||||
 | 
			
		||||
  /// Serializes this PostCategory to a JSON map.
 | 
			
		||||
  /// Serializes this SnPostCategory to a JSON map.
 | 
			
		||||
  Map<String, dynamic> toJson();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is PostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts));
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)&&(identical(other.usage, usage) || other.usage == usage));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(posts));
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(posts),usage);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'PostCategory(id: $id, slug: $slug, name: $name, posts: $posts)';
 | 
			
		||||
  return 'SnPostCategory(id: $id, slug: $slug, name: $name, posts: $posts, usage: $usage)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class $PostCategoryCopyWith<$Res>  {
 | 
			
		||||
  factory $PostCategoryCopyWith(PostCategory value, $Res Function(PostCategory) _then) = _$PostCategoryCopyWithImpl;
 | 
			
		||||
abstract mixin class $SnPostCategoryCopyWith<$Res>  {
 | 
			
		||||
  factory $SnPostCategoryCopyWith(SnPostCategory value, $Res Function(SnPostCategory) _then) = _$SnPostCategoryCopyWithImpl;
 | 
			
		||||
@useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts, int usage
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -57,34 +56,159 @@ $Res call({
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class _$PostCategoryCopyWithImpl<$Res>
 | 
			
		||||
    implements $PostCategoryCopyWith<$Res> {
 | 
			
		||||
  _$PostCategoryCopyWithImpl(this._self, this._then);
 | 
			
		||||
class _$SnPostCategoryCopyWithImpl<$Res>
 | 
			
		||||
    implements $SnPostCategoryCopyWith<$Res> {
 | 
			
		||||
  _$SnPostCategoryCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final PostCategory _self;
 | 
			
		||||
  final $Res Function(PostCategory) _then;
 | 
			
		||||
  final SnPostCategory _self;
 | 
			
		||||
  final $Res Function(SnPostCategory) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostCategory
 | 
			
		||||
/// Create a copy of SnPostCategory
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) {
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,Object? usage = null,}) {
 | 
			
		||||
  return _then(_self.copyWith(
 | 
			
		||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,posts: null == posts ? _self.posts : posts // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as List<SnPost>,
 | 
			
		||||
as List<SnPost>,usage: null == usage ? _self.usage : usage // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as int,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnPostCategory].
 | 
			
		||||
extension SnPostCategoryPatterns on SnPostCategory {
 | 
			
		||||
/// 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( _SnPostCategory value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory() 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( _SnPostCategory value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory():
 | 
			
		||||
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( _SnPostCategory value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory() 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 slug,  String? name,  List<SnPost> posts,  int usage)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);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 slug,  String? name,  List<SnPost> posts,  int usage)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory():
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);}
 | 
			
		||||
}
 | 
			
		||||
/// 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 slug,  String? name,  List<SnPost> posts,  int usage)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostCategory() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
class _PostCategory implements PostCategory {
 | 
			
		||||
  const _PostCategory({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts;
 | 
			
		||||
  factory _PostCategory.fromJson(Map<String, dynamic> json) => _$PostCategoryFromJson(json);
 | 
			
		||||
class _SnPostCategory extends SnPostCategory {
 | 
			
		||||
  const _SnPostCategory({required this.id, required this.slug, this.name, final  List<SnPost> posts = const [], this.usage = 0}): _posts = posts,super._();
 | 
			
		||||
  factory _SnPostCategory.fromJson(Map<String, dynamic> json) => _$SnPostCategoryFromJson(json);
 | 
			
		||||
 | 
			
		||||
@override final  String id;
 | 
			
		||||
@override final  String slug;
 | 
			
		||||
@@ -96,41 +220,42 @@ class _PostCategory implements PostCategory {
 | 
			
		||||
  return EqualUnmodifiableListView(_posts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override@JsonKey() final  int usage;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostCategory
 | 
			
		||||
/// Create a copy of SnPostCategory
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
_$PostCategoryCopyWith<_PostCategory> get copyWith => __$PostCategoryCopyWithImpl<_PostCategory>(this, _$identity);
 | 
			
		||||
_$SnPostCategoryCopyWith<_SnPostCategory> get copyWith => __$SnPostCategoryCopyWithImpl<_SnPostCategory>(this, _$identity);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
Map<String, dynamic> toJson() {
 | 
			
		||||
  return _$PostCategoryToJson(this, );
 | 
			
		||||
  return _$SnPostCategoryToJson(this, );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _PostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts));
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)&&(identical(other.usage, usage) || other.usage == usage));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(_posts));
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(_posts),usage);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'PostCategory(id: $id, slug: $slug, name: $name, posts: $posts)';
 | 
			
		||||
  return 'SnPostCategory(id: $id, slug: $slug, name: $name, posts: $posts, usage: $usage)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class _$PostCategoryCopyWith<$Res> implements $PostCategoryCopyWith<$Res> {
 | 
			
		||||
  factory _$PostCategoryCopyWith(_PostCategory value, $Res Function(_PostCategory) _then) = __$PostCategoryCopyWithImpl;
 | 
			
		||||
abstract mixin class _$SnPostCategoryCopyWith<$Res> implements $SnPostCategoryCopyWith<$Res> {
 | 
			
		||||
  factory _$SnPostCategoryCopyWith(_SnPostCategory value, $Res Function(_SnPostCategory) _then) = __$SnPostCategoryCopyWithImpl;
 | 
			
		||||
@override @useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts, int usage
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -138,22 +263,23 @@ $Res call({
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class __$PostCategoryCopyWithImpl<$Res>
 | 
			
		||||
    implements _$PostCategoryCopyWith<$Res> {
 | 
			
		||||
  __$PostCategoryCopyWithImpl(this._self, this._then);
 | 
			
		||||
class __$SnPostCategoryCopyWithImpl<$Res>
 | 
			
		||||
    implements _$SnPostCategoryCopyWith<$Res> {
 | 
			
		||||
  __$SnPostCategoryCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final _PostCategory _self;
 | 
			
		||||
  final $Res Function(_PostCategory) _then;
 | 
			
		||||
  final _SnPostCategory _self;
 | 
			
		||||
  final $Res Function(_SnPostCategory) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostCategory
 | 
			
		||||
/// Create a copy of SnPostCategory
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) {
 | 
			
		||||
  return _then(_PostCategory(
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,Object? usage = null,}) {
 | 
			
		||||
  return _then(_SnPostCategory(
 | 
			
		||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,posts: null == posts ? _self._posts : posts // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as List<SnPost>,
 | 
			
		||||
as List<SnPost>,usage: null == usage ? _self.usage : usage // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as int,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ part of 'post_category.dart';
 | 
			
		||||
// JsonSerializableGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
_PostCategory _$PostCategoryFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _PostCategory(
 | 
			
		||||
_SnPostCategory _$SnPostCategoryFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
    _SnPostCategory(
 | 
			
		||||
      id: json['id'] as String,
 | 
			
		||||
      slug: json['slug'] as String,
 | 
			
		||||
      name: json['name'] as String?,
 | 
			
		||||
@@ -16,12 +16,14 @@ _PostCategory _$PostCategoryFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
              ?.map((e) => SnPost.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
              .toList() ??
 | 
			
		||||
          const [],
 | 
			
		||||
      usage: (json['usage'] as num?)?.toInt() ?? 0,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$PostCategoryToJson(_PostCategory instance) =>
 | 
			
		||||
Map<String, dynamic> _$SnPostCategoryToJson(_SnPostCategory instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'slug': instance.slug,
 | 
			
		||||
      'name': instance.name,
 | 
			
		||||
      'posts': instance.posts.map((e) => e.toJson()).toList(),
 | 
			
		||||
      'usage': instance.usage,
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/post.dart';
 | 
			
		||||
 | 
			
		||||
@@ -6,14 +5,15 @@ part 'post_tag.freezed.dart';
 | 
			
		||||
part 'post_tag.g.dart';
 | 
			
		||||
 | 
			
		||||
@freezed
 | 
			
		||||
sealed class PostTag with _$PostTag {
 | 
			
		||||
  const factory PostTag({
 | 
			
		||||
sealed class SnPostTag with _$SnPostTag {
 | 
			
		||||
  const factory SnPostTag({
 | 
			
		||||
    required String id,
 | 
			
		||||
    required String slug,
 | 
			
		||||
    String? name,
 | 
			
		||||
    @Default([]) List<SnPost> posts,
 | 
			
		||||
  }) = _PostTag;
 | 
			
		||||
    @Default(0) int usage,
 | 
			
		||||
  }) = _SnPostTag;
 | 
			
		||||
 | 
			
		||||
  factory PostTag.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$PostTagFromJson(json);
 | 
			
		||||
  factory SnPostTag.fromJson(Map<String, dynamic> json) =>
 | 
			
		||||
      _$SnPostTagFromJson(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
 | 
			
		||||
 | 
			
		||||
@@ -14,42 +13,42 @@ part of 'post_tag.dart';
 | 
			
		||||
T _$identity<T>(T value) => value;
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
mixin _$PostTag {
 | 
			
		||||
mixin _$SnPostTag {
 | 
			
		||||
 | 
			
		||||
 String get id; String get slug; String? get name; List<SnPost> get posts;
 | 
			
		||||
/// Create a copy of PostTag
 | 
			
		||||
 String get id; String get slug; String? get name; List<SnPost> get posts; int get usage;
 | 
			
		||||
/// Create a copy of SnPostTag
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
$PostTagCopyWith<PostTag> get copyWith => _$PostTagCopyWithImpl<PostTag>(this as PostTag, _$identity);
 | 
			
		||||
$SnPostTagCopyWith<SnPostTag> get copyWith => _$SnPostTagCopyWithImpl<SnPostTag>(this as SnPostTag, _$identity);
 | 
			
		||||
 | 
			
		||||
  /// Serializes this PostTag to a JSON map.
 | 
			
		||||
  /// Serializes this SnPostTag to a JSON map.
 | 
			
		||||
  Map<String, dynamic> toJson();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is PostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts));
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)&&(identical(other.usage, usage) || other.usage == usage));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(posts));
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(posts),usage);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'PostTag(id: $id, slug: $slug, name: $name, posts: $posts)';
 | 
			
		||||
  return 'SnPostTag(id: $id, slug: $slug, name: $name, posts: $posts, usage: $usage)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class $PostTagCopyWith<$Res>  {
 | 
			
		||||
  factory $PostTagCopyWith(PostTag value, $Res Function(PostTag) _then) = _$PostTagCopyWithImpl;
 | 
			
		||||
abstract mixin class $SnPostTagCopyWith<$Res>  {
 | 
			
		||||
  factory $SnPostTagCopyWith(SnPostTag value, $Res Function(SnPostTag) _then) = _$SnPostTagCopyWithImpl;
 | 
			
		||||
@useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts, int usage
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -57,34 +56,159 @@ $Res call({
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class _$PostTagCopyWithImpl<$Res>
 | 
			
		||||
    implements $PostTagCopyWith<$Res> {
 | 
			
		||||
  _$PostTagCopyWithImpl(this._self, this._then);
 | 
			
		||||
class _$SnPostTagCopyWithImpl<$Res>
 | 
			
		||||
    implements $SnPostTagCopyWith<$Res> {
 | 
			
		||||
  _$SnPostTagCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final PostTag _self;
 | 
			
		||||
  final $Res Function(PostTag) _then;
 | 
			
		||||
  final SnPostTag _self;
 | 
			
		||||
  final $Res Function(SnPostTag) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostTag
 | 
			
		||||
/// Create a copy of SnPostTag
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) {
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,Object? usage = null,}) {
 | 
			
		||||
  return _then(_self.copyWith(
 | 
			
		||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,posts: null == posts ? _self.posts : posts // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as List<SnPost>,
 | 
			
		||||
as List<SnPost>,usage: null == usage ? _self.usage : usage // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as int,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnPostTag].
 | 
			
		||||
extension SnPostTagPatterns on SnPostTag {
 | 
			
		||||
/// 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( _SnPostTag value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag() 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( _SnPostTag value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag():
 | 
			
		||||
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( _SnPostTag value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag() 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 slug,  String? name,  List<SnPost> posts,  int usage)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);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 slug,  String? name,  List<SnPost> posts,  int usage)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag():
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);}
 | 
			
		||||
}
 | 
			
		||||
/// 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 slug,  String? name,  List<SnPost> posts,  int usage)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPostTag() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.posts,_that.usage);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
class _PostTag implements PostTag {
 | 
			
		||||
  const _PostTag({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts;
 | 
			
		||||
  factory _PostTag.fromJson(Map<String, dynamic> json) => _$PostTagFromJson(json);
 | 
			
		||||
class _SnPostTag implements SnPostTag {
 | 
			
		||||
  const _SnPostTag({required this.id, required this.slug, this.name, final  List<SnPost> posts = const [], this.usage = 0}): _posts = posts;
 | 
			
		||||
  factory _SnPostTag.fromJson(Map<String, dynamic> json) => _$SnPostTagFromJson(json);
 | 
			
		||||
 | 
			
		||||
@override final  String id;
 | 
			
		||||
@override final  String slug;
 | 
			
		||||
@@ -96,41 +220,42 @@ class _PostTag implements PostTag {
 | 
			
		||||
  return EqualUnmodifiableListView(_posts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override@JsonKey() final  int usage;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostTag
 | 
			
		||||
/// Create a copy of SnPostTag
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
_$PostTagCopyWith<_PostTag> get copyWith => __$PostTagCopyWithImpl<_PostTag>(this, _$identity);
 | 
			
		||||
_$SnPostTagCopyWith<_SnPostTag> get copyWith => __$SnPostTagCopyWithImpl<_SnPostTag>(this, _$identity);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
Map<String, dynamic> toJson() {
 | 
			
		||||
  return _$PostTagToJson(this, );
 | 
			
		||||
  return _$SnPostTagToJson(this, );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _PostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts));
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)&&(identical(other.usage, usage) || other.usage == usage));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(_posts));
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEquality().hash(_posts),usage);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'PostTag(id: $id, slug: $slug, name: $name, posts: $posts)';
 | 
			
		||||
  return 'SnPostTag(id: $id, slug: $slug, name: $name, posts: $posts, usage: $usage)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
abstract mixin class _$PostTagCopyWith<$Res> implements $PostTagCopyWith<$Res> {
 | 
			
		||||
  factory _$PostTagCopyWith(_PostTag value, $Res Function(_PostTag) _then) = __$PostTagCopyWithImpl;
 | 
			
		||||
abstract mixin class _$SnPostTagCopyWith<$Res> implements $SnPostTagCopyWith<$Res> {
 | 
			
		||||
  factory _$SnPostTagCopyWith(_SnPostTag value, $Res Function(_SnPostTag) _then) = __$SnPostTagCopyWithImpl;
 | 
			
		||||
@override @useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts
 | 
			
		||||
 String id, String slug, String? name, List<SnPost> posts, int usage
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -138,22 +263,23 @@ $Res call({
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
class __$PostTagCopyWithImpl<$Res>
 | 
			
		||||
    implements _$PostTagCopyWith<$Res> {
 | 
			
		||||
  __$PostTagCopyWithImpl(this._self, this._then);
 | 
			
		||||
class __$SnPostTagCopyWithImpl<$Res>
 | 
			
		||||
    implements _$SnPostTagCopyWith<$Res> {
 | 
			
		||||
  __$SnPostTagCopyWithImpl(this._self, this._then);
 | 
			
		||||
 | 
			
		||||
  final _PostTag _self;
 | 
			
		||||
  final $Res Function(_PostTag) _then;
 | 
			
		||||
  final _SnPostTag _self;
 | 
			
		||||
  final $Res Function(_SnPostTag) _then;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of PostTag
 | 
			
		||||
/// Create a copy of SnPostTag
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) {
 | 
			
		||||
  return _then(_PostTag(
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,Object? usage = null,}) {
 | 
			
		||||
  return _then(_SnPostTag(
 | 
			
		||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String?,posts: null == posts ? _self._posts : posts // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as List<SnPost>,
 | 
			
		||||
as List<SnPost>,usage: null == usage ? _self.usage : usage // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as int,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ part of 'post_tag.dart';
 | 
			
		||||
// JsonSerializableGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
_PostTag _$PostTagFromJson(Map<String, dynamic> json) => _PostTag(
 | 
			
		||||
_SnPostTag _$SnPostTagFromJson(Map<String, dynamic> json) => _SnPostTag(
 | 
			
		||||
  id: json['id'] as String,
 | 
			
		||||
  slug: json['slug'] as String,
 | 
			
		||||
  name: json['name'] as String?,
 | 
			
		||||
@@ -15,11 +15,14 @@ _PostTag _$PostTagFromJson(Map<String, dynamic> json) => _PostTag(
 | 
			
		||||
          ?.map((e) => SnPost.fromJson(e as Map<String, dynamic>))
 | 
			
		||||
          .toList() ??
 | 
			
		||||
      const [],
 | 
			
		||||
  usage: (json['usage'] as num?)?.toInt() ?? 0,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$PostTagToJson(_PostTag instance) => <String, dynamic>{
 | 
			
		||||
Map<String, dynamic> _$SnPostTagToJson(_SnPostTag instance) =>
 | 
			
		||||
    <String, dynamic>{
 | 
			
		||||
      'id': instance.id,
 | 
			
		||||
      'slug': instance.slug,
 | 
			
		||||
      'name': instance.name,
 | 
			
		||||
      'posts': instance.posts.map((e) => e.toJson()).toList(),
 | 
			
		||||
      'usage': instance.usage,
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/file.dart';
 | 
			
		||||
import 'package:island/models/user.dart';
 | 
			
		||||
import 'package:island/models/account.dart';
 | 
			
		||||
 | 
			
		||||
part 'publisher.freezed.dart';
 | 
			
		||||
part 'publisher.g.dart';
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -137,6 +136,130 @@ $SnVerificationMarkCopyWith<$Res>? get verification {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnPublisher].
 | 
			
		||||
extension SnPublisherPatterns on SnPublisher {
 | 
			
		||||
/// 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( _SnPublisher value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher() 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( _SnPublisher value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher():
 | 
			
		||||
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( _SnPublisher value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher() 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 type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);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 type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher():
 | 
			
		||||
return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);}
 | 
			
		||||
}
 | 
			
		||||
/// 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 type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisher() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
@@ -376,6 +499,130 @@ $SnAccountCopyWith<$Res>? get account {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnPublisherMember].
 | 
			
		||||
extension SnPublisherMemberPatterns on SnPublisherMember {
 | 
			
		||||
/// 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( _SnPublisherMember value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember() 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( _SnPublisherMember value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember():
 | 
			
		||||
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( _SnPublisherMember value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember() 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 publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember() when $default != null:
 | 
			
		||||
return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_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 publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember():
 | 
			
		||||
return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_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 publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnPublisherMember() when $default != null:
 | 
			
		||||
return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import 'package:freezed_annotation/freezed_annotation.dart';
 | 
			
		||||
import 'package:island/models/file.dart';
 | 
			
		||||
import 'package:island/models/user.dart';
 | 
			
		||||
import 'package:island/models/account.dart';
 | 
			
		||||
 | 
			
		||||
part 'realm.freezed.dart';
 | 
			
		||||
part 'realm.g.dart';
 | 
			
		||||
@@ -40,6 +40,7 @@ sealed class SnRealmMember with _$SnRealmMember {
 | 
			
		||||
    required DateTime createdAt,
 | 
			
		||||
    required DateTime updatedAt,
 | 
			
		||||
    required DateTime? deletedAt,
 | 
			
		||||
    required SnAccountStatus? status,
 | 
			
		||||
  }) = _SnRealmMember;
 | 
			
		||||
 | 
			
		||||
  factory SnRealmMember.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
 | 
			
		||||
 | 
			
		||||
@@ -113,6 +112,130 @@ $SnCloudFileCopyWith<$Res>? get background {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnRealm].
 | 
			
		||||
extension SnRealmPatterns on SnRealm {
 | 
			
		||||
/// 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( _SnRealm value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm() 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( _SnRealm value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm():
 | 
			
		||||
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( _SnRealm value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm() 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 slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_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 slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm():
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_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 slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealm() when $default != null:
 | 
			
		||||
return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
@@ -236,7 +359,7 @@ $SnCloudFileCopyWith<$Res>? get background {
 | 
			
		||||
/// @nodoc
 | 
			
		||||
mixin _$SnRealmMember {
 | 
			
		||||
 | 
			
		||||
 String get realmId; SnRealm? get realm; String get accountId; SnAccount? get account; int get role; DateTime? get joinedAt; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
 | 
			
		||||
 String get realmId; SnRealm? get realm; String get accountId; SnAccount? get account; int get role; DateTime? get joinedAt; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; SnAccountStatus? get status;
 | 
			
		||||
/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@@ -249,16 +372,16 @@ $SnRealmMemberCopyWith<SnRealmMember> get copyWith => _$SnRealmMemberCopyWithImp
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is SnRealmMember&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(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 SnRealmMember&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.status, status) || other.status == status));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,realmId,realm,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt);
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,realmId,realm,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt,status);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'SnRealmMember(realmId: $realmId, realm: $realm, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
  return 'SnRealmMember(realmId: $realmId, realm: $realm, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, status: $status)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -269,11 +392,11 @@ abstract mixin class $SnRealmMemberCopyWith<$Res>  {
 | 
			
		||||
  factory $SnRealmMemberCopyWith(SnRealmMember value, $Res Function(SnRealmMember) _then) = _$SnRealmMemberCopyWithImpl;
 | 
			
		||||
@useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String realmId, SnRealm? realm, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
 | 
			
		||||
 String realmId, SnRealm? realm, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, SnAccountStatus? status
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$SnRealmCopyWith<$Res>? get realm;$SnAccountCopyWith<$Res>? get account;
 | 
			
		||||
$SnRealmCopyWith<$Res>? get realm;$SnAccountCopyWith<$Res>? get account;$SnAccountStatusCopyWith<$Res>? get status;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@@ -286,7 +409,7 @@ class _$SnRealmMemberCopyWithImpl<$Res>
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? realmId = null,Object? realm = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
 | 
			
		||||
@pragma('vm:prefer-inline') @override $Res call({Object? realmId = null,Object? realm = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? status = freezed,}) {
 | 
			
		||||
  return _then(_self.copyWith(
 | 
			
		||||
realmId: null == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,realm: freezed == realm ? _self.realm : realm // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
@@ -297,7 +420,8 @@ as int,joinedAt: freezed == joinedAt ? _self.joinedAt : joinedAt // ignore: cast
 | 
			
		||||
as DateTime?,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?,
 | 
			
		||||
as DateTime?,status: freezed == status ? _self.status : status // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as SnAccountStatus?,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
/// Create a copy of SnRealmMember
 | 
			
		||||
@@ -324,15 +448,151 @@ $SnAccountCopyWith<$Res>? get account {
 | 
			
		||||
  return $SnAccountCopyWith<$Res>(_self.account!, (value) {
 | 
			
		||||
    return _then(_self.copyWith(account: value));
 | 
			
		||||
  });
 | 
			
		||||
}/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
$SnAccountStatusCopyWith<$Res>? get status {
 | 
			
		||||
    if (_self.status == null) {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $SnAccountStatusCopyWith<$Res>(_self.status!, (value) {
 | 
			
		||||
    return _then(_self.copyWith(status: value));
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Adds pattern-matching-related methods to [SnRealmMember].
 | 
			
		||||
extension SnRealmMemberPatterns on SnRealmMember {
 | 
			
		||||
/// 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( _SnRealmMember value)?  $default,{required TResult orElse(),}){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember() 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( _SnRealmMember value)  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember():
 | 
			
		||||
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( _SnRealmMember value)?  $default,){
 | 
			
		||||
final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember() 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 realmId,  SnRealm? realm,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  SnAccountStatus? status)?  $default,{required TResult orElse(),}) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember() when $default != null:
 | 
			
		||||
return $default(_that.realmId,_that.realm,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.status);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 realmId,  SnRealm? realm,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  SnAccountStatus? status)  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember():
 | 
			
		||||
return $default(_that.realmId,_that.realm,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.status);}
 | 
			
		||||
}
 | 
			
		||||
/// 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 realmId,  SnRealm? realm,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  SnAccountStatus? status)?  $default,) {final _that = this;
 | 
			
		||||
switch (_that) {
 | 
			
		||||
case _SnRealmMember() when $default != null:
 | 
			
		||||
return $default(_that.realmId,_that.realm,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.status);case _:
 | 
			
		||||
  return null;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@JsonSerializable()
 | 
			
		||||
 | 
			
		||||
class _SnRealmMember implements SnRealmMember {
 | 
			
		||||
  const _SnRealmMember({required this.realmId, required this.realm, required this.accountId, required this.account, required this.role, required this.joinedAt, required this.createdAt, required this.updatedAt, required this.deletedAt});
 | 
			
		||||
  const _SnRealmMember({required this.realmId, required this.realm, required this.accountId, required this.account, required this.role, required this.joinedAt, required this.createdAt, required this.updatedAt, required this.deletedAt, required this.status});
 | 
			
		||||
  factory _SnRealmMember.fromJson(Map<String, dynamic> json) => _$SnRealmMemberFromJson(json);
 | 
			
		||||
 | 
			
		||||
@override final  String realmId;
 | 
			
		||||
@@ -344,6 +604,7 @@ class _SnRealmMember implements SnRealmMember {
 | 
			
		||||
@override final  DateTime createdAt;
 | 
			
		||||
@override final  DateTime updatedAt;
 | 
			
		||||
@override final  DateTime? deletedAt;
 | 
			
		||||
@override final  SnAccountStatus? status;
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@@ -358,16 +619,16 @@ Map<String, dynamic> toJson() {
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
bool operator ==(Object other) {
 | 
			
		||||
  return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnRealmMember&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(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 _SnRealmMember&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.status, status) || other.status == status));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@JsonKey(includeFromJson: false, includeToJson: false)
 | 
			
		||||
@override
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,realmId,realm,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt);
 | 
			
		||||
int get hashCode => Object.hash(runtimeType,realmId,realm,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt,status);
 | 
			
		||||
 | 
			
		||||
@override
 | 
			
		||||
String toString() {
 | 
			
		||||
  return 'SnRealmMember(realmId: $realmId, realm: $realm, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
 | 
			
		||||
  return 'SnRealmMember(realmId: $realmId, realm: $realm, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, status: $status)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -378,11 +639,11 @@ abstract mixin class _$SnRealmMemberCopyWith<$Res> implements $SnRealmMemberCopy
 | 
			
		||||
  factory _$SnRealmMemberCopyWith(_SnRealmMember value, $Res Function(_SnRealmMember) _then) = __$SnRealmMemberCopyWithImpl;
 | 
			
		||||
@override @useResult
 | 
			
		||||
$Res call({
 | 
			
		||||
 String realmId, SnRealm? realm, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
 | 
			
		||||
 String realmId, SnRealm? realm, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, SnAccountStatus? status
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@override $SnRealmCopyWith<$Res>? get realm;@override $SnAccountCopyWith<$Res>? get account;
 | 
			
		||||
@override $SnRealmCopyWith<$Res>? get realm;@override $SnAccountCopyWith<$Res>? get account;@override $SnAccountStatusCopyWith<$Res>? get status;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/// @nodoc
 | 
			
		||||
@@ -395,7 +656,7 @@ class __$SnRealmMemberCopyWithImpl<$Res>
 | 
			
		||||
 | 
			
		||||
/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? realmId = null,Object? realm = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
 | 
			
		||||
@override @pragma('vm:prefer-inline') $Res call({Object? realmId = null,Object? realm = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? status = freezed,}) {
 | 
			
		||||
  return _then(_SnRealmMember(
 | 
			
		||||
realmId: null == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as String,realm: freezed == realm ? _self.realm : realm // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
@@ -406,7 +667,8 @@ as int,joinedAt: freezed == joinedAt ? _self.joinedAt : joinedAt // ignore: cast
 | 
			
		||||
as DateTime?,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?,
 | 
			
		||||
as DateTime?,status: freezed == status ? _self.status : status // ignore: cast_nullable_to_non_nullable
 | 
			
		||||
as SnAccountStatus?,
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -434,6 +696,18 @@ $SnAccountCopyWith<$Res>? get account {
 | 
			
		||||
  return $SnAccountCopyWith<$Res>(_self.account!, (value) {
 | 
			
		||||
    return _then(_self.copyWith(account: value));
 | 
			
		||||
  });
 | 
			
		||||
}/// Create a copy of SnRealmMember
 | 
			
		||||
/// with the given fields replaced by the non-null parameter values.
 | 
			
		||||
@override
 | 
			
		||||
@pragma('vm:prefer-inline')
 | 
			
		||||
$SnAccountStatusCopyWith<$Res>? get status {
 | 
			
		||||
    if (_self.status == null) {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $SnAccountStatusCopyWith<$Res>(_self.status!, (value) {
 | 
			
		||||
    return _then(_self.copyWith(status: value));
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,12 @@ _SnRealmMember _$SnRealmMemberFromJson(Map<String, dynamic> json) =>
 | 
			
		||||
          json['deleted_at'] == null
 | 
			
		||||
              ? null
 | 
			
		||||
              : DateTime.parse(json['deleted_at'] as String),
 | 
			
		||||
      status:
 | 
			
		||||
          json['status'] == null
 | 
			
		||||
              ? null
 | 
			
		||||
              : SnAccountStatus.fromJson(
 | 
			
		||||
                json['status'] as Map<String, dynamic>,
 | 
			
		||||
              ),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
Map<String, dynamic> _$SnRealmMemberToJson(_SnRealmMember instance) =>
 | 
			
		||||
@@ -88,4 +94,5 @@ Map<String, dynamic> _$SnRealmMemberToJson(_SnRealmMember instance) =>
 | 
			
		||||
      'created_at': instance.createdAt.toIso8601String(),
 | 
			
		||||
      'updated_at': instance.updatedAt.toIso8601String(),
 | 
			
		||||
      'deleted_at': instance.deletedAt?.toIso8601String(),
 | 
			
		||||
      'status': instance.status?.toJson(),
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user