Compare commits
	
		
			48 Commits
		
	
	
		
			3.1.0+113
			...
			a0d8c1a9b3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | 
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -59,7 +59,7 @@ jobs: | |||||||
|           sudo apt-get install -y libnotify-dev |           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 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev | ||||||
|           sudo apt-get install -y gstreamer-1.0 |           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 pub get | ||||||
|       - run: flutter build linux |       - run: flutter build linux | ||||||
|       - name: Archive production artifacts |       - name: Archive production artifacts | ||||||
|   | |||||||
| @@ -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! | 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 | ## Server | ||||||
|  |  | ||||||
| The backend of the Solar Network project is located at [Solsynth/DysonNetwork](https://github.com/Solsynth/DysonNetwork) | 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 | ### 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. | 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. |    - **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 | 2. Create an account on the Solar Network | ||||||
|   | |||||||
| @@ -89,6 +89,13 @@ | |||||||
|             </intent-filter> |             </intent-filter> | ||||||
|         </activity> |         </activity> | ||||||
|  |  | ||||||
|  |         <!-- Livekit Screenshare --> | ||||||
|  |         <service | ||||||
|  |             android:name="de.julianassmann.flutter_background.IsolateHolderService" | ||||||
|  |             android:enabled="true" | ||||||
|  |             android:exported="false" | ||||||
|  |             android:foregroundServiceType="mediaProjection" /> | ||||||
|  |  | ||||||
|         <!-- Sign in with Apple --> |         <!-- Sign in with Apple --> | ||||||
|         <activity |         <activity | ||||||
|             android:name="com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback" |             android:name="com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback" | ||||||
|   | |||||||
| @@ -147,6 +147,9 @@ | |||||||
|   "addVideo": "Add video", |   "addVideo": "Add video", | ||||||
|   "addPhoto": "Add photo", |   "addPhoto": "Add photo", | ||||||
|   "addFile": "Add file", |   "addFile": "Add file", | ||||||
|  |   "linkAttachment": "Link Attachment", | ||||||
|  |   "fileIdCannotBeEmpty": "File ID cannot be empty", | ||||||
|  |   "failedToFetchFile": "Failed to fetch file: {}", | ||||||
|   "createDirectMessage": "Send new DM", |   "createDirectMessage": "Send new DM", | ||||||
|   "gotoDirectMessage": "Go to DM", |   "gotoDirectMessage": "Go to DM", | ||||||
|   "react": "React", |   "react": "React", | ||||||
| @@ -352,6 +355,8 @@ | |||||||
|   "postTitle": "Title", |   "postTitle": "Title", | ||||||
|   "postDescription": "Description", |   "postDescription": "Description", | ||||||
|   "call": "Call", |   "call": "Call", | ||||||
|  |   "callLeave": "Leave", | ||||||
|  |   "callEnd": "End this call", | ||||||
|   "done": "Done", |   "done": "Done", | ||||||
|   "loginResetPasswordSent": "Password reset link sent, please check your email inbox.", |   "loginResetPasswordSent": "Password reset link sent, please check your email inbox.", | ||||||
|   "accountDeletion": "Delete Account", |   "accountDeletion": "Delete Account", | ||||||
| @@ -622,8 +627,8 @@ | |||||||
|   "chatJoin": "Join the Chat", |   "chatJoin": "Join the Chat", | ||||||
|   "realmJoin": "Join the Realm", |   "realmJoin": "Join the Realm", | ||||||
|   "realmJoinSuccess": "Successfully joined the realm.", |   "realmJoinSuccess": "Successfully joined the realm.", | ||||||
|   "discoverRealms": "Discover Realms", |   "discoverRealms": "Discover realms", | ||||||
|   "discoverPublishers": "Discover Publishers", |   "discoverPublishers": "Discover publishers", | ||||||
|   "search": "Search", |   "search": "Search", | ||||||
|   "publisherMembers": "Collaborators", |   "publisherMembers": "Collaborators", | ||||||
|   "developerHub": "Developer Hub", |   "developerHub": "Developer Hub", | ||||||
| @@ -698,5 +703,33 @@ | |||||||
|   "postForwardingTo": "Forwarding to", |   "postForwardingTo": "Forwarding to", | ||||||
|   "postReplyingTo": "Replying to", |   "postReplyingTo": "Replying to", | ||||||
|   "postEditing": "You are editing an existing post", |   "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" | ||||||
| } | } | ||||||
| @@ -123,6 +123,10 @@ | |||||||
|   "addVideo": "添加视频", |   "addVideo": "添加视频", | ||||||
|   "addPhoto": "添加照片", |   "addPhoto": "添加照片", | ||||||
|   "addFile": "添加文件", |   "addFile": "添加文件", | ||||||
|  |   "addAttachmentById": "通过 ID 添加附件", | ||||||
|  |   "enterFileId": "输入文件 ID", | ||||||
|  |   "fileIdCannotBeEmpty": "文件 ID 不能为空", | ||||||
|  |   "failedToFetchFile": "获取文件失败: {}", | ||||||
|   "createDirectMessage": "创建新私人消息", |   "createDirectMessage": "创建新私人消息", | ||||||
|   "gotoDirectMessage": "前往私信", |   "gotoDirectMessage": "前往私信", | ||||||
|   "react": "反应", |   "react": "反应", | ||||||
|   | |||||||
| @@ -123,6 +123,10 @@ | |||||||
|     "addVideo": "新增影片", |     "addVideo": "新增影片", | ||||||
|     "addPhoto": "新增照片", |     "addPhoto": "新增照片", | ||||||
|     "addFile": "新增檔案", |     "addFile": "新增檔案", | ||||||
|  |     "addAttachmentById": "透過 ID 新增附件", | ||||||
|  |     "enterFileId": "輸入檔案 ID", | ||||||
|  |     "fileIdCannotBeEmpty": "檔案 ID 不能為空", | ||||||
|  |     "failedToFetchFile": "無法取得檔案: {}", | ||||||
|     "createDirectMessage": "建立新私人訊息", |     "createDirectMessage": "建立新私人訊息", | ||||||
|     "gotoDirectMessage": "Go to DM", |     "gotoDirectMessage": "Go to DM", | ||||||
|     "react": "反應", |     "react": "反應", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| # Uncomment this line to define a global platform for your project | # 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. | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||||
|   | |||||||
| @@ -40,33 +40,33 @@ PODS: | |||||||
|   - file_picker (0.0.1): |   - file_picker (0.0.1): | ||||||
|     - DKImagePickerController/PhotoGallery |     - DKImagePickerController/PhotoGallery | ||||||
|     - Flutter |     - Flutter | ||||||
|   - Firebase/CoreOnly (11.15.0): |   - Firebase/CoreOnly (12.0.0): | ||||||
|     - FirebaseCore (~> 11.15.0) |     - FirebaseCore (~> 12.0.0) | ||||||
|   - Firebase/Messaging (11.15.0): |   - Firebase/Messaging (12.0.0): | ||||||
|     - Firebase/CoreOnly |     - Firebase/CoreOnly | ||||||
|     - FirebaseMessaging (~> 11.15.0) |     - FirebaseMessaging (~> 12.0.0) | ||||||
|   - firebase_core (3.15.1): |   - firebase_core (4.0.0): | ||||||
|     - Firebase/CoreOnly (= 11.15.0) |     - Firebase/CoreOnly (= 12.0.0) | ||||||
|     - Flutter |     - Flutter | ||||||
|   - firebase_messaging (15.2.9): |   - firebase_messaging (16.0.0): | ||||||
|     - Firebase/Messaging (= 11.15.0) |     - Firebase/Messaging (= 12.0.0) | ||||||
|     - firebase_core |     - firebase_core | ||||||
|     - Flutter |     - Flutter | ||||||
|   - FirebaseCore (11.15.0): |   - FirebaseCore (12.0.0): | ||||||
|     - FirebaseCoreInternal (~> 11.15.0) |     - FirebaseCoreInternal (~> 12.0.0) | ||||||
|     - GoogleUtilities/Environment (~> 8.1) |     - GoogleUtilities/Environment (~> 8.1) | ||||||
|     - GoogleUtilities/Logger (~> 8.1) |     - GoogleUtilities/Logger (~> 8.1) | ||||||
|   - FirebaseCoreInternal (11.15.0): |   - FirebaseCoreInternal (12.0.0): | ||||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" |     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||||
|   - FirebaseInstallations (11.15.0): |   - FirebaseInstallations (12.0.0): | ||||||
|     - FirebaseCore (~> 11.15.0) |     - FirebaseCore (~> 12.0.0) | ||||||
|     - GoogleUtilities/Environment (~> 8.1) |     - GoogleUtilities/Environment (~> 8.1) | ||||||
|     - GoogleUtilities/UserDefaults (~> 8.1) |     - GoogleUtilities/UserDefaults (~> 8.1) | ||||||
|     - PromisesObjC (~> 2.4) |     - PromisesObjC (~> 2.4) | ||||||
|   - FirebaseMessaging (11.15.0): |   - FirebaseMessaging (12.0.0): | ||||||
|     - FirebaseCore (~> 11.15.0) |     - FirebaseCore (~> 12.0.0) | ||||||
|     - FirebaseInstallations (~> 11.0) |     - FirebaseInstallations (~> 12.0.0) | ||||||
|     - GoogleDataTransport (~> 10.0) |     - GoogleDataTransport (~> 10.1) | ||||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) |     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||||
|     - GoogleUtilities/Environment (~> 8.1) |     - GoogleUtilities/Environment (~> 8.1) | ||||||
|     - GoogleUtilities/Reachability (~> 8.1) |     - GoogleUtilities/Reachability (~> 8.1) | ||||||
| @@ -93,9 +93,9 @@ PODS: | |||||||
|   - flutter_udid (0.0.1): |   - flutter_udid (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - SAMKeychain |     - SAMKeychain | ||||||
|   - flutter_webrtc (0.14.0): |   - flutter_webrtc (1.0.0): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - WebRTC-SDK (= 125.6422.07) |     - WebRTC-SDK (= 137.7151.02) | ||||||
|   - gal (1.0.0): |   - gal (1.0.0): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - FlutterMacOS |     - FlutterMacOS | ||||||
| @@ -130,11 +130,11 @@ PODS: | |||||||
|     - Flutter |     - Flutter | ||||||
|   - irondash_engine_context (0.0.1): |   - irondash_engine_context (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|   - Kingfisher (8.4.0) |   - Kingfisher (8.5.0) | ||||||
|   - livekit_client (2.4.9): |   - livekit_client (2.5.0): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - flutter_webrtc |     - flutter_webrtc | ||||||
|     - WebRTC-SDK (= 125.6422.07) |     - WebRTC-SDK (= 137.7151.02) | ||||||
|   - local_auth_darwin (0.0.1): |   - local_auth_darwin (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - FlutterMacOS |     - FlutterMacOS | ||||||
| @@ -178,28 +178,31 @@ PODS: | |||||||
|   - sqflite_darwin (0.0.4): |   - sqflite_darwin (0.0.4): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - FlutterMacOS |     - FlutterMacOS | ||||||
|   - sqlite3 (3.50.2): |   - sqlite3 (3.50.3): | ||||||
|     - sqlite3/common (= 3.50.2) |     - sqlite3/common (= 3.50.3) | ||||||
|   - sqlite3/common (3.50.2) |   - sqlite3/common (3.50.3) | ||||||
|   - sqlite3/dbstatvtab (3.50.2): |   - sqlite3/dbstatvtab (3.50.3): | ||||||
|     - sqlite3/common |     - sqlite3/common | ||||||
|   - sqlite3/fts5 (3.50.2): |   - sqlite3/fts5 (3.50.3): | ||||||
|     - sqlite3/common |     - sqlite3/common | ||||||
|   - sqlite3/math (3.50.2): |   - sqlite3/math (3.50.3): | ||||||
|     - sqlite3/common |     - sqlite3/common | ||||||
|   - sqlite3/perf-threadsafe (3.50.2): |   - sqlite3/perf-threadsafe (3.50.3): | ||||||
|     - sqlite3/common |     - sqlite3/common | ||||||
|   - sqlite3/rtree (3.50.2): |   - sqlite3/rtree (3.50.3): | ||||||
|  |     - sqlite3/common | ||||||
|  |   - sqlite3/session (3.50.3): | ||||||
|     - sqlite3/common |     - sqlite3/common | ||||||
|   - sqlite3_flutter_libs (0.0.1): |   - sqlite3_flutter_libs (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - FlutterMacOS |     - FlutterMacOS | ||||||
|     - sqlite3 (~> 3.50.1) |     - sqlite3 (~> 3.50.3) | ||||||
|     - sqlite3/dbstatvtab |     - sqlite3/dbstatvtab | ||||||
|     - sqlite3/fts5 |     - sqlite3/fts5 | ||||||
|     - sqlite3/math |     - sqlite3/math | ||||||
|     - sqlite3/perf-threadsafe |     - sqlite3/perf-threadsafe | ||||||
|     - sqlite3/rtree |     - sqlite3/rtree | ||||||
|  |     - sqlite3/session | ||||||
|   - super_native_extensions (0.0.1): |   - super_native_extensions (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|   - SwiftyGif (5.4.5) |   - SwiftyGif (5.4.5) | ||||||
| @@ -209,7 +212,7 @@ PODS: | |||||||
|     - Flutter |     - Flutter | ||||||
|   - wakelock_plus (0.0.1): |   - wakelock_plus (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|   - WebRTC-SDK (125.6422.07) |   - WebRTC-SDK (137.7151.02) | ||||||
|  |  | ||||||
| DEPENDENCIES: | DEPENDENCIES: | ||||||
|   - Alamofire |   - Alamofire | ||||||
| @@ -361,13 +364,13 @@ SPEC CHECKSUMS: | |||||||
|   DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c |   DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c | ||||||
|   DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 |   DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 | ||||||
|   file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be |   file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be | ||||||
|   Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e |   Firebase: 800d487043c0557d9faed71477a38d9aafb08a41 | ||||||
|   firebase_core: ece862f94b2bc72ee0edbeec7ab5c7cb09fe1ab5 |   firebase_core: 633e1851ffe1b9ab875f6467a4f574c79cef02e4 | ||||||
|   firebase_messaging: e1a5fae495603115be1d0183bc849da748734e2b |   firebase_messaging: d17feef781edc84ebefe62624fb384358ad96361 | ||||||
|   FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e |   FirebaseCore: 055f4ab117d5964158c833f3d5e7ec6d91648d4a | ||||||
|   FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 |   FirebaseCoreInternal: dedc28e569a4be85f38f3d6af1070a2e12018d55 | ||||||
|   FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 |   FirebaseInstallations: d4c7c958f99c8860d7fcece786314ae790e2f988 | ||||||
|   FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 |   FirebaseMessaging: af49f8d7c0a3d2a017d9302c80946f45a7777dde | ||||||
|   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 |   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 | ||||||
|   flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 |   flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 | ||||||
|   flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 |   flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 | ||||||
| @@ -376,14 +379,14 @@ SPEC CHECKSUMS: | |||||||
|   flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 |   flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 | ||||||
|   flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544 |   flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544 | ||||||
|   flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9 |   flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9 | ||||||
|   flutter_webrtc: fd0d3bdef8766a0736dbbe2e5b7e85f1f3c52117 |   flutter_webrtc: 6f7da106613d52ade777d5b4875a43f48c28b457 | ||||||
|   gal: baecd024ebfd13c441269ca7404792a7152fde89 |   gal: baecd024ebfd13c441269ca7404792a7152fde89 | ||||||
|   GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 |   GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 | ||||||
|   GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 |   GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 | ||||||
|   image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a |   image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a | ||||||
|   irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486 |   irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486 | ||||||
|   Kingfisher: b14cc47bbfa7a3c150dd12962ee9c86338545629 |   Kingfisher: ff0d31a1f07bdff6a1ebb3ba08b8e6e567b6500c | ||||||
|   livekit_client: 3f79d79233a5bd13d5b541732624ef959d7c538e |   livekit_client: e3b79b99405428aac439b6b76a254cd9a11dbbfb | ||||||
|   local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 |   local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 | ||||||
|   media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854 |   media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854 | ||||||
|   media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474 |   media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474 | ||||||
| @@ -403,15 +406,15 @@ SPEC CHECKSUMS: | |||||||
|   shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 |   shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 | ||||||
|   sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 |   sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 | ||||||
|   sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 |   sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 | ||||||
|   sqlite3: 3e82a2daae39ba3b41ae6ee84a130494585460fc |   sqlite3: 83105acd294c9137c026e2da1931c30b4588ab81 | ||||||
|   sqlite3_flutter_libs: e7fc8c9ea2200ff3271f08f127842131746b70e2 |   sqlite3_flutter_libs: 616267f2fca40e9c6af8c5d82324e05667040b6e | ||||||
|   super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4 |   super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4 | ||||||
|   SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 |   SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 | ||||||
|   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d |   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d | ||||||
|   volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 |   volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 | ||||||
|   wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 |   wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 | ||||||
|   WebRTC-SDK: dff00a3892bc570b6014e046297782084071657e |   WebRTC-SDK: d20de357dcbf7c9696b124b39f3ff62125107e4b | ||||||
|  |  | ||||||
| PODFILE CHECKSUM: f6df17c2a0cbd7af89692fd3877231eaea40230f | PODFILE CHECKSUM: c818292390b02fa379036ea099713a332bd7193f | ||||||
|  |  | ||||||
| COCOAPODS: 1.16.2 | COCOAPODS: 1.16.2 | ||||||
|   | |||||||
| @@ -10,6 +10,8 @@ | |||||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||||
| 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; | 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; | ||||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | 		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, ); }; }; | 		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, ); }; }; | 		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 */; }; | 		73D4264B2DEB815D006C0AAE /* NotifyDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */; }; | ||||||
| @@ -32,6 +34,13 @@ | |||||||
| 			remoteGlobalIDString = 97C146ED1CF9000F007C117D; | 			remoteGlobalIDString = 97C146ED1CF9000F007C117D; | ||||||
| 			remoteInfo = Runner; | 			remoteInfo = Runner; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */ = { | ||||||
|  | 			isa = PBXContainerItemProxy; | ||||||
|  | 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||||
|  | 			proxyType = 1; | ||||||
|  | 			remoteGlobalIDString = 73ACDFAA2E3D0E6100B63535; | ||||||
|  | 			remoteInfo = SolianBroadcastExtension; | ||||||
|  | 		}; | ||||||
| 		73C305D62E0BE878009035B9 /* PBXContainerItemProxy */ = { | 		73C305D62E0BE878009035B9 /* PBXContainerItemProxy */ = { | ||||||
| 			isa = PBXContainerItemProxy; | 			isa = PBXContainerItemProxy; | ||||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||||
| @@ -55,6 +64,7 @@ | |||||||
| 			dstPath = ""; | 			dstPath = ""; | ||||||
| 			dstSubfolderSpec = 13; | 			dstSubfolderSpec = 13; | ||||||
| 			files = ( | 			files = ( | ||||||
|  | 				73ACDFC32E3D0E6100B63535 /* SolianBroadcastExtension.appex in Embed Foundation Extensions */, | ||||||
| 				73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */, | 				73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */, | ||||||
| 				73CDD6812DEC00480059D95D /* SolianNotificationService.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>"; }; | 		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>"; }; | 		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>"; }; | 		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; }; | 		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; }; | 		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>"; }; | 		73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyDelegate.swift; sourceTree = "<group>"; }; | ||||||
| @@ -117,6 +130,13 @@ | |||||||
| /* End PBXFileReference section */ | /* End PBXFileReference section */ | ||||||
|  |  | ||||||
| /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet 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 */ = { | 		73C305DC2E0BE878009035B9 /* Exceptions for "SolianShareExtension" folder in "SolianShareExtension" target */ = { | ||||||
| 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | ||||||
| 			membershipExceptions = ( | 			membershipExceptions = ( | ||||||
| @@ -150,6 +170,14 @@ | |||||||
| 			path = Services; | 			path = Services; | ||||||
| 			sourceTree = "<group>"; | 			sourceTree = "<group>"; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */ = { | ||||||
|  | 			isa = PBXFileSystemSynchronizedRootGroup; | ||||||
|  | 			exceptions = ( | ||||||
|  | 				73ACDFCA2E3D0E6100B63535 /* Exceptions for "SolianBroadcastExtension" folder in "SolianBroadcastExtension" target */, | ||||||
|  | 			); | ||||||
|  | 			path = SolianBroadcastExtension; | ||||||
|  | 			sourceTree = "<group>"; | ||||||
|  | 		}; | ||||||
| 		73C305CF2E0BE878009035B9 /* SolianShareExtension */ = { | 		73C305CF2E0BE878009035B9 /* SolianShareExtension */ = { | ||||||
| 			isa = PBXFileSystemSynchronizedRootGroup; | 			isa = PBXFileSystemSynchronizedRootGroup; | ||||||
| 			exceptions = ( | 			exceptions = ( | ||||||
| @@ -177,6 +205,14 @@ | |||||||
| 			); | 			); | ||||||
| 			runOnlyForDeploymentPostprocessing = 0; | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFA82E3D0E6100B63535 /* Frameworks */ = { | ||||||
|  | 			isa = PBXFrameworksBuildPhase; | ||||||
|  | 			buildActionMask = 2147483647; | ||||||
|  | 			files = ( | ||||||
|  | 				73ACDFAD2E3D0E6100B63535 /* ReplayKit.framework in Frameworks */, | ||||||
|  | 			); | ||||||
|  | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
|  | 		}; | ||||||
| 		73C305CB2E0BE878009035B9 /* Frameworks */ = { | 		73C305CB2E0BE878009035B9 /* Frameworks */ = { | ||||||
| 			isa = PBXFrameworksBuildPhase; | 			isa = PBXFrameworksBuildPhase; | ||||||
| 			buildActionMask = 2147483647; | 			buildActionMask = 2147483647; | ||||||
| @@ -220,6 +256,8 @@ | |||||||
| 				AA0CA8A3E15DEE023BB27438 /* Pods_NotificationService.framework */, | 				AA0CA8A3E15DEE023BB27438 /* Pods_NotificationService.framework */, | ||||||
| 				39FE4CC6223F0D3C0E1FFD04 /* Pods_SolianNotificationService.framework */, | 				39FE4CC6223F0D3C0E1FFD04 /* Pods_SolianNotificationService.framework */, | ||||||
| 				7B40764A2C4CC0E7DC70A0D3 /* Pods_SolianShareExtension.framework */, | 				7B40764A2C4CC0E7DC70A0D3 /* Pods_SolianShareExtension.framework */, | ||||||
|  | 				73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */, | ||||||
|  | 				73ACDFB82E3D0E6100B63535 /* UIKit.framework */, | ||||||
| 			); | 			); | ||||||
| 			name = Frameworks; | 			name = Frameworks; | ||||||
| 			sourceTree = "<group>"; | 			sourceTree = "<group>"; | ||||||
| @@ -264,6 +302,7 @@ | |||||||
| 				97C146F01CF9000F007C117D /* Runner */, | 				97C146F01CF9000F007C117D /* Runner */, | ||||||
| 				73CDD67B2DEC00480059D95D /* SolianNotificationService */, | 				73CDD67B2DEC00480059D95D /* SolianNotificationService */, | ||||||
| 				73C305CF2E0BE878009035B9 /* SolianShareExtension */, | 				73C305CF2E0BE878009035B9 /* SolianShareExtension */, | ||||||
|  | 				73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||||
| 				97C146EF1CF9000F007C117D /* Products */, | 				97C146EF1CF9000F007C117D /* Products */, | ||||||
| 				331C8082294A63A400263BE5 /* RunnerTests */, | 				331C8082294A63A400263BE5 /* RunnerTests */, | ||||||
| 				91E124CE95BCB4DCD890160D /* Pods */, | 				91E124CE95BCB4DCD890160D /* Pods */, | ||||||
| @@ -279,6 +318,7 @@ | |||||||
| 				331C8081294A63A400263BE5 /* RunnerTests.xctest */, | 				331C8081294A63A400263BE5 /* RunnerTests.xctest */, | ||||||
| 				73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */, | 				73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */, | ||||||
| 				73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */, | 				73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */, | ||||||
|  | 				73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */, | ||||||
| 			); | 			); | ||||||
| 			name = Products; | 			name = Products; | ||||||
| 			sourceTree = "<group>"; | 			sourceTree = "<group>"; | ||||||
| @@ -323,6 +363,28 @@ | |||||||
| 			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; | 			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; | ||||||
| 			productType = "com.apple.product-type.bundle.unit-test"; | 			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; | ||||||
|  | 			packageProductDependencies = ( | ||||||
|  | 			); | ||||||
|  | 			productName = SolianBroadcastExtension; | ||||||
|  | 			productReference = 73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */; | ||||||
|  | 			productType = "com.apple.product-type.app-extension"; | ||||||
|  | 		}; | ||||||
| 		73C305CD2E0BE878009035B9 /* SolianShareExtension */ = { | 		73C305CD2E0BE878009035B9 /* SolianShareExtension */ = { | ||||||
| 			isa = PBXNativeTarget; | 			isa = PBXNativeTarget; | ||||||
| 			buildConfigurationList = 73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */; | 			buildConfigurationList = 73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */; | ||||||
| @@ -385,6 +447,7 @@ | |||||||
| 			dependencies = ( | 			dependencies = ( | ||||||
| 				73CDD6802DEC00480059D95D /* PBXTargetDependency */, | 				73CDD6802DEC00480059D95D /* PBXTargetDependency */, | ||||||
| 				73C305D72E0BE878009035B9 /* PBXTargetDependency */, | 				73C305D72E0BE878009035B9 /* PBXTargetDependency */, | ||||||
|  | 				73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */, | ||||||
| 			); | 			); | ||||||
| 			fileSystemSynchronizedGroups = ( | 			fileSystemSynchronizedGroups = ( | ||||||
| 				73268D272DEB012A0076E970 /* Services */, | 				73268D272DEB012A0076E970 /* Services */, | ||||||
| @@ -409,6 +472,9 @@ | |||||||
| 						CreatedOnToolsVersion = 14.0; | 						CreatedOnToolsVersion = 14.0; | ||||||
| 						TestTargetID = 97C146ED1CF9000F007C117D; | 						TestTargetID = 97C146ED1CF9000F007C117D; | ||||||
| 					}; | 					}; | ||||||
|  | 					73ACDFAA2E3D0E6100B63535 = { | ||||||
|  | 						CreatedOnToolsVersion = 16.4; | ||||||
|  | 					}; | ||||||
| 					73C305CD2E0BE878009035B9 = { | 					73C305CD2E0BE878009035B9 = { | ||||||
| 						CreatedOnToolsVersion = 16.4; | 						CreatedOnToolsVersion = 16.4; | ||||||
| 					}; | 					}; | ||||||
| @@ -438,6 +504,7 @@ | |||||||
| 				331C8080294A63A400263BE5 /* RunnerTests */, | 				331C8080294A63A400263BE5 /* RunnerTests */, | ||||||
| 				73CDD6792DEC00480059D95D /* SolianNotificationService */, | 				73CDD6792DEC00480059D95D /* SolianNotificationService */, | ||||||
| 				73C305CD2E0BE878009035B9 /* SolianShareExtension */, | 				73C305CD2E0BE878009035B9 /* SolianShareExtension */, | ||||||
|  | 				73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||||
| 			); | 			); | ||||||
| 		}; | 		}; | ||||||
| /* End PBXProject section */ | /* End PBXProject section */ | ||||||
| @@ -450,6 +517,13 @@ | |||||||
| 			); | 			); | ||||||
| 			runOnlyForDeploymentPostprocessing = 0; | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFA92E3D0E6100B63535 /* Resources */ = { | ||||||
|  | 			isa = PBXResourcesBuildPhase; | ||||||
|  | 			buildActionMask = 2147483647; | ||||||
|  | 			files = ( | ||||||
|  | 			); | ||||||
|  | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
|  | 		}; | ||||||
| 		73C305CC2E0BE878009035B9 /* Resources */ = { | 		73C305CC2E0BE878009035B9 /* Resources */ = { | ||||||
| 			isa = PBXResourcesBuildPhase; | 			isa = PBXResourcesBuildPhase; | ||||||
| 			buildActionMask = 2147483647; | 			buildActionMask = 2147483647; | ||||||
| @@ -651,6 +725,13 @@ | |||||||
| 			); | 			); | ||||||
| 			runOnlyForDeploymentPostprocessing = 0; | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFA72E3D0E6100B63535 /* Sources */ = { | ||||||
|  | 			isa = PBXSourcesBuildPhase; | ||||||
|  | 			buildActionMask = 2147483647; | ||||||
|  | 			files = ( | ||||||
|  | 			); | ||||||
|  | 			runOnlyForDeploymentPostprocessing = 0; | ||||||
|  | 		}; | ||||||
| 		73C305CA2E0BE878009035B9 /* Sources */ = { | 		73C305CA2E0BE878009035B9 /* Sources */ = { | ||||||
| 			isa = PBXSourcesBuildPhase; | 			isa = PBXSourcesBuildPhase; | ||||||
| 			buildActionMask = 2147483647; | 			buildActionMask = 2147483647; | ||||||
| @@ -683,6 +764,11 @@ | |||||||
| 			target = 97C146ED1CF9000F007C117D /* Runner */; | 			target = 97C146ED1CF9000F007C117D /* Runner */; | ||||||
| 			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; | 			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; | ||||||
| 		}; | 		}; | ||||||
|  | 		73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */ = { | ||||||
|  | 			isa = PBXTargetDependency; | ||||||
|  | 			target = 73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */; | ||||||
|  | 			targetProxy = 73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */; | ||||||
|  | 		}; | ||||||
| 		73C305D72E0BE878009035B9 /* PBXTargetDependency */ = { | 		73C305D72E0BE878009035B9 /* PBXTargetDependency */ = { | ||||||
| 			isa = PBXTargetDependency; | 			isa = PBXTargetDependency; | ||||||
| 			target = 73C305CD2E0BE878009035B9 /* SolianShareExtension */; | 			target = 73C305CD2E0BE878009035B9 /* SolianShareExtension */; | ||||||
| @@ -781,7 +867,7 @@ | |||||||
| 				INFOPLIST_FILE = Runner/Info.plist; | 				INFOPLIST_FILE = Runner/Info.plist; | ||||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | 				LD_RUNPATH_SEARCH_PATHS = ( | ||||||
| 					"$(inherited)", | 					"$(inherited)", | ||||||
| 					"@executable_path/Frameworks", | 					"@executable_path/Frameworks", | ||||||
| @@ -844,6 +930,123 @@ | |||||||
| 			}; | 			}; | ||||||
| 			name = Profile; | 			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 */ = { | 		73C305D92E0BE878009035B9 /* Debug */ = { | ||||||
| 			isa = XCBuildConfiguration; | 			isa = XCBuildConfiguration; | ||||||
| 			baseConfigurationReference = 17FAB080A9C53193ABD9C15B /* Pods-SolianShareExtension.debug.xcconfig */; | 			baseConfigurationReference = 17FAB080A9C53193ABD9C15B /* Pods-SolianShareExtension.debug.xcconfig */; | ||||||
| @@ -1212,7 +1415,7 @@ | |||||||
| 				INFOPLIST_FILE = Runner/Info.plist; | 				INFOPLIST_FILE = Runner/Info.plist; | ||||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | 				LD_RUNPATH_SEARCH_PATHS = ( | ||||||
| 					"$(inherited)", | 					"$(inherited)", | ||||||
| 					"@executable_path/Frameworks", | 					"@executable_path/Frameworks", | ||||||
| @@ -1240,7 +1443,7 @@ | |||||||
| 				INFOPLIST_FILE = Runner/Info.plist; | 				INFOPLIST_FILE = Runner/Info.plist; | ||||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | 				LD_RUNPATH_SEARCH_PATHS = ( | ||||||
| 					"$(inherited)", | 					"$(inherited)", | ||||||
| 					"@executable_path/Frameworks", | 					"@executable_path/Frameworks", | ||||||
| @@ -1266,6 +1469,16 @@ | |||||||
| 			defaultConfigurationIsVisible = 0; | 			defaultConfigurationIsVisible = 0; | ||||||
| 			defaultConfigurationName = Release; | 			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" */ = { | 		73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */ = { | ||||||
| 			isa = XCConfigurationList; | 			isa = XCConfigurationList; | ||||||
| 			buildConfigurations = ( | 			buildConfigurations = ( | ||||||
|   | |||||||
							
								
								
									
										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> | ||||||
| @@ -49,8 +49,7 @@ class AppDatabase extends _$AppDatabase { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   Future<int> updateMessage(ChatMessagesCompanion message) { |   Future<int> updateMessage(ChatMessagesCompanion message) { | ||||||
|     return (update(chatMessages) |     return into(chatMessages).insert(message, mode: InsertMode.insertOrReplace); | ||||||
|       ..where((m) => m.id.equals(message.id.value))).write(message); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Future<int> updateMessageStatus(String id, MessageStatus status) { |   Future<int> updateMessageStatus(String id, MessageStatus status) { | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ class MessageRepository { | |||||||
|     if (lastMessage == null) return false; |     if (lastMessage == null) return false; | ||||||
|     try { |     try { | ||||||
|       final resp = await _apiClient.post( |       final resp = await _apiClient.post( | ||||||
|         '/chat/${room.id}/sync', |         '/sphere/chat/${room.id}/sync', | ||||||
|         data: { |         data: { | ||||||
|           'last_sync_timestamp': |           'last_sync_timestamp': | ||||||
|               lastMessage.toRemoteMessage().updatedAt.millisecondsSinceEpoch, |               lastMessage.toRemoteMessage().updatedAt.millisecondsSinceEpoch, | ||||||
| @@ -154,7 +154,7 @@ class MessageRepository { | |||||||
|     // Use cached total count if available, otherwise fetch it |     // Use cached total count if available, otherwise fetch it | ||||||
|     if (_totalCount == null) { |     if (_totalCount == null) { | ||||||
|       final response = await _apiClient.get( |       final response = await _apiClient.get( | ||||||
|         '/chat/$roomId/messages', |         '/sphere/chat/$roomId/messages', | ||||||
|         queryParameters: {'offset': 0, 'take': 1}, |         queryParameters: {'offset': 0, 'take': 1}, | ||||||
|       ); |       ); | ||||||
|       _totalCount = int.parse(response.headers['x-total']?.firstOrNull ?? '0'); |       _totalCount = int.parse(response.headers['x-total']?.firstOrNull ?? '0'); | ||||||
| @@ -165,7 +165,7 @@ class MessageRepository { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     final response = await _apiClient.get( |     final response = await _apiClient.get( | ||||||
|       '/chat/$roomId/messages', |       '/sphere/chat/$roomId/messages', | ||||||
|       queryParameters: {'offset': offset, 'take': take}, |       queryParameters: {'offset': offset, 'take': take}, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| @@ -269,8 +269,8 @@ class MessageRepository { | |||||||
|       // Send to server |       // Send to server | ||||||
|       final response = await _apiClient.request( |       final response = await _apiClient.request( | ||||||
|         editingTo == null |         editingTo == null | ||||||
|             ? '/chat/$roomId/messages' |             ? '/sphere/chat/$roomId/messages' | ||||||
|             : '/chat/$roomId/messages/${editingTo.id}', |             : '/sphere/chat/$roomId/messages/${editingTo.id}', | ||||||
|         data: { |         data: { | ||||||
|           'content': content, |           'content': content, | ||||||
|           'attachments_id': cloudAttachments.map((e) => e.id).toList(), |           'attachments_id': cloudAttachments.map((e) => e.id).toList(), | ||||||
| @@ -325,7 +325,7 @@ class MessageRepository { | |||||||
|       // Send to server |       // Send to server | ||||||
|       var remoteMessage = message.toRemoteMessage(); |       var remoteMessage = message.toRemoteMessage(); | ||||||
|       final response = await _apiClient.post( |       final response = await _apiClient.post( | ||||||
|         '/chat/${message.roomId}/messages', |         '/sphere/chat/${message.roomId}/messages', | ||||||
|         data: { |         data: { | ||||||
|           'content': remoteMessage.content, |           'content': remoteMessage.content, | ||||||
|           'attachments_id': remoteMessage.attachments, |           'attachments_id': remoteMessage.attachments, | ||||||
| @@ -423,7 +423,7 @@ class MessageRepository { | |||||||
|     try { |     try { | ||||||
|       // Update on server |       // Update on server | ||||||
|       final response = await _apiClient.put( |       final response = await _apiClient.put( | ||||||
|         '/chat/${room.id}/messages/$messageId', |         '/sphere/chat/${room.id}/messages/$messageId', | ||||||
|         data: {'content': content, 'attachments': attachments, 'meta': meta}, |         data: {'content': content, 'attachments': attachments, 'meta': meta}, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
| @@ -444,7 +444,7 @@ class MessageRepository { | |||||||
|  |  | ||||||
|   Future<void> deleteMessage(String messageId) async { |   Future<void> deleteMessage(String messageId) async { | ||||||
|     try { |     try { | ||||||
|       await _apiClient.delete('/chat/${room.id}/messages/$messageId'); |       await _apiClient.delete('/sphere/chat/${room.id}/messages/$messageId'); | ||||||
|       pendingMessages.remove(messageId); |       pendingMessages.remove(messageId); | ||||||
|       await _database.deleteMessage(messageId); |       await _database.deleteMessage(messageId); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
| @@ -464,7 +464,7 @@ class MessageRepository { | |||||||
|  |  | ||||||
|       // If not found locally, fetch from the server |       // If not found locally, fetch from the server | ||||||
|       final response = await _apiClient.get( |       final response = await _apiClient.get( | ||||||
|         '/chat/${room.id}/messages/$messageId', |         '/sphere/chat/${room.id}/messages/$messageId', | ||||||
|       ); |       ); | ||||||
|       final remoteMessage = SnChatMessage.fromJson(response.data); |       final remoteMessage = SnChatMessage.fromJson(response.data); | ||||||
|       final message = LocalChatMessage.fromRemoteMessage( |       final message = LocalChatMessage.fromRemoteMessage( | ||||||
|   | |||||||
| @@ -20,7 +20,6 @@ import 'package:bitsdojo_window/bitsdojo_window.dart'; | |||||||
| import 'package:island/pods/userinfo.dart'; | import 'package:island/pods/userinfo.dart'; | ||||||
| import 'package:island/pods/websocket.dart'; | import 'package:island/pods/websocket.dart'; | ||||||
| import 'package:island/route.dart'; | import 'package:island/route.dart'; | ||||||
|  |  | ||||||
| import 'package:island/services/notify.dart'; | import 'package:island/services/notify.dart'; | ||||||
| import 'package:island/services/timezone.dart'; | import 'package:island/services/timezone.dart'; | ||||||
| import 'package:island/widgets/alert.dart'; | import 'package:island/widgets/alert.dart'; | ||||||
| @@ -30,6 +29,7 @@ import 'package:shared_preferences/shared_preferences.dart'; | |||||||
| import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; | import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; | ||||||
| import 'package:flutter_native_splash/flutter_native_splash.dart'; | import 'package:flutter_native_splash/flutter_native_splash.dart'; | ||||||
| import 'package:url_launcher/url_launcher_string.dart'; | import 'package:url_launcher/url_launcher_string.dart'; | ||||||
|  | import 'package:flutter_langdetect/flutter_langdetect.dart' as langdetect; | ||||||
|  |  | ||||||
| @pragma('vm:entry-point') | @pragma('vm:entry-point') | ||||||
| Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { | Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { | ||||||
| @@ -51,6 +51,7 @@ void main() async { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   try { |   try { | ||||||
|  |     await langdetect.initLangDetect(); | ||||||
|     await EasyLocalization.ensureInitialized(); |     await EasyLocalization.ensureInitialized(); | ||||||
|     await Firebase.initializeApp( |     await Firebase.initializeApp( | ||||||
|       options: DefaultFirebaseOptions.currentPlatform, |       options: DefaultFirebaseOptions.currentPlatform, | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -82,6 +81,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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -246,6 +369,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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -413,6 +660,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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -564,6 +935,130 @@ $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<dynamic> 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<dynamic> 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<dynamic> statuses)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEventCalendarEntry() when $default != null: | ||||||
|  | return $default(_that.date,_that.checkInResult,_that.statuses);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -76,6 +75,130 @@ as String, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [AppToken]. | ||||||
|  | extension AppTokenPatterns on AppToken { | ||||||
|  | /// 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( _AppToken value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken() 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( _AppToken value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken(): | ||||||
|  | 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( _AppToken value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken() 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 token)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken() when $default != null: | ||||||
|  | return $default(_that.token);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 token)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken(): | ||||||
|  | return $default(_that.token);} | ||||||
|  | } | ||||||
|  | /// 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 token)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppToken() when $default != null: | ||||||
|  | return $default(_that.token);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -227,6 +350,130 @@ as DateTime?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnAuthChallenge]. | ||||||
|  | extension SnAuthChallengePatterns on SnAuthChallenge { | ||||||
|  | /// 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( _SnAuthChallenge value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge() 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( _SnAuthChallenge value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge(): | ||||||
|  | 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( _SnAuthChallenge value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge() 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,  DateTime expiredAt,  int stepRemain,  int stepTotal,  int failedAttempts,  int platform,  int type,  List<String> blacklistFactors,  List<dynamic> audiences,  List<dynamic> scopes,  String ipAddress,  String userAgent,  String deviceId,  String? nonce,  String? location,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge() when $default != null: | ||||||
|  | return $default(_that.id,_that.expiredAt,_that.stepRemain,_that.stepTotal,_that.failedAttempts,_that.platform,_that.type,_that.blacklistFactors,_that.audiences,_that.scopes,_that.ipAddress,_that.userAgent,_that.deviceId,_that.nonce,_that.location,_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,  DateTime expiredAt,  int stepRemain,  int stepTotal,  int failedAttempts,  int platform,  int type,  List<String> blacklistFactors,  List<dynamic> audiences,  List<dynamic> scopes,  String ipAddress,  String userAgent,  String deviceId,  String? nonce,  String? location,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge(): | ||||||
|  | return $default(_that.id,_that.expiredAt,_that.stepRemain,_that.stepTotal,_that.failedAttempts,_that.platform,_that.type,_that.blacklistFactors,_that.audiences,_that.scopes,_that.ipAddress,_that.userAgent,_that.deviceId,_that.nonce,_that.location,_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,  DateTime expiredAt,  int stepRemain,  int stepTotal,  int failedAttempts,  int platform,  int type,  List<String> blacklistFactors,  List<dynamic> audiences,  List<dynamic> scopes,  String ipAddress,  String userAgent,  String deviceId,  String? nonce,  String? location,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthChallenge() when $default != null: | ||||||
|  | return $default(_that.id,_that.expiredAt,_that.stepRemain,_that.stepTotal,_that.failedAttempts,_that.platform,_that.type,_that.blacklistFactors,_that.audiences,_that.scopes,_that.ipAddress,_that.userAgent,_that.deviceId,_that.nonce,_that.location,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -432,6 +679,130 @@ $SnAuthChallengeCopyWith<$Res> get challenge { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnAuthSession]. | ||||||
|  | extension SnAuthSessionPatterns on SnAuthSession { | ||||||
|  | /// 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( _SnAuthSession value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession() 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( _SnAuthSession value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession(): | ||||||
|  | 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( _SnAuthSession value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession() 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,  DateTime lastGrantedAt,  DateTime expiredAt,  String accountId,  String challengeId,  SnAuthChallenge challenge,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession() when $default != null: | ||||||
|  | return $default(_that.id,_that.label,_that.lastGrantedAt,_that.expiredAt,_that.accountId,_that.challengeId,_that.challenge,_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? label,  DateTime lastGrantedAt,  DateTime expiredAt,  String accountId,  String challengeId,  SnAuthChallenge challenge,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession(): | ||||||
|  | return $default(_that.id,_that.label,_that.lastGrantedAt,_that.expiredAt,_that.accountId,_that.challengeId,_that.challenge,_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? label,  DateTime lastGrantedAt,  DateTime expiredAt,  String accountId,  String challengeId,  SnAuthChallenge challenge,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthSession() when $default != null: | ||||||
|  | return $default(_that.id,_that.label,_that.lastGrantedAt,_that.expiredAt,_that.accountId,_that.challengeId,_that.challenge,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -600,6 +971,130 @@ as Map<String, dynamic>?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnAuthFactor]. | ||||||
|  | extension SnAuthFactorPatterns on SnAuthFactor { | ||||||
|  | /// 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( _SnAuthFactor value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor() 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( _SnAuthFactor value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor(): | ||||||
|  | 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( _SnAuthFactor value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor() 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,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  DateTime? expiredAt,  DateTime? enabledAt,  int trustworthy,  Map<String, dynamic>? createdResponse)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor() when $default != null: | ||||||
|  | return $default(_that.id,_that.type,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.expiredAt,_that.enabledAt,_that.trustworthy,_that.createdResponse);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,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  DateTime? expiredAt,  DateTime? enabledAt,  int trustworthy,  Map<String, dynamic>? createdResponse)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor(): | ||||||
|  | return $default(_that.id,_that.type,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.expiredAt,_that.enabledAt,_that.trustworthy,_that.createdResponse);} | ||||||
|  | } | ||||||
|  | /// 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,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt,  DateTime? expiredAt,  DateTime? enabledAt,  int trustworthy,  Map<String, dynamic>? createdResponse)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthFactor() when $default != null: | ||||||
|  | return $default(_that.id,_that.type,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.expiredAt,_that.enabledAt,_that.trustworthy,_that.createdResponse);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -763,6 +1258,130 @@ as bool, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnAuthDevice]. | ||||||
|  | extension SnAuthDevicePatterns on SnAuthDevice { | ||||||
|  | /// 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( _SnAuthDevice value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice() 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( _SnAuthDevice value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice(): | ||||||
|  | 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( _SnAuthDevice value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice() 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 label,  String userAgent,  String deviceId,  int platform,  List<SnAuthSession> sessions,  bool isCurrent)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice() when $default != null: | ||||||
|  | return $default(_that.label,_that.userAgent,_that.deviceId,_that.platform,_that.sessions,_that.isCurrent);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 label,  String userAgent,  String deviceId,  int platform,  List<SnAuthSession> sessions,  bool isCurrent)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice(): | ||||||
|  | return $default(_that.label,_that.userAgent,_that.deviceId,_that.platform,_that.sessions,_that.isCurrent);} | ||||||
|  | } | ||||||
|  | /// 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 label,  String userAgent,  String deviceId,  int platform,  List<SnAuthSession> sessions,  bool isCurrent)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAuthDevice() when $default != null: | ||||||
|  | return $default(_that.label,_that.userAgent,_that.deviceId,_that.platform,_that.sessions,_that.isCurrent);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -921,6 +1540,130 @@ as DateTime?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnAccountConnection]. | ||||||
|  | extension SnAccountConnectionPatterns on SnAccountConnection { | ||||||
|  | /// 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( _SnAccountConnection value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection() 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( _SnAccountConnection value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection(): | ||||||
|  | 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( _SnAccountConnection value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection() 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 accountId,  String provider,  String providedIdentifier,  Map<String, dynamic> meta,  DateTime lastUsedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection() when $default != null: | ||||||
|  | return $default(_that.id,_that.accountId,_that.provider,_that.providedIdentifier,_that.meta,_that.lastUsedAt,_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 accountId,  String provider,  String providedIdentifier,  Map<String, dynamic> meta,  DateTime lastUsedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection(): | ||||||
|  | return $default(_that.id,_that.accountId,_that.provider,_that.providedIdentifier,_that.meta,_that.lastUsedAt,_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 accountId,  String provider,  String providedIdentifier,  Map<String, dynamic> meta,  DateTime lastUsedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnAccountConnection() when $default != null: | ||||||
|  | return $default(_that.id,_that.accountId,_that.provider,_that.providedIdentifier,_that.meta,_that.lastUsedAt,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| @JsonSerializable() | @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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -162,8 +162,6 @@ sealed class CallParticipant with _$CallParticipant { | |||||||
|     required String identity, |     required String identity, | ||||||
|     required String name, |     required String name, | ||||||
|     required DateTime joinedAt, |     required DateTime joinedAt, | ||||||
|     required String? accountId, |  | ||||||
|     required SnChatMember? profile, |  | ||||||
|   }) = _CallParticipant; |   }) = _CallParticipant; | ||||||
|  |  | ||||||
|   factory CallParticipant.fromJson(Map<String, dynamic> json) => |   factory CallParticipant.fromJson(Map<String, dynamic> json) => | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -285,11 +285,6 @@ _CallParticipant _$CallParticipantFromJson(Map<String, dynamic> json) => | |||||||
|       identity: json['identity'] as String, |       identity: json['identity'] as String, | ||||||
|       name: json['name'] as String, |       name: json['name'] as String, | ||||||
|       joinedAt: DateTime.parse(json['joined_at'] 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) => | Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | ||||||
| @@ -297,8 +292,6 @@ Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | |||||||
|       'identity': instance.identity, |       'identity': instance.identity, | ||||||
|       'name': instance.name, |       'name': instance.name, | ||||||
|       'joined_at': instance.joinedAt.toIso8601String(), |       'joined_at': instance.joinedAt.toIso8601String(), | ||||||
|       'account_id': instance.accountId, |  | ||||||
|       'profile': instance.profile?.toJson(), |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| _SnRealtimeCall _$SnRealtimeCallFromJson(Map<String, dynamic> json) => | _SnRealtimeCall _$SnRealtimeCallFromJson(Map<String, dynamic> json) => | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| @JsonSerializable() | @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 | /// @nodoc | ||||||
| @JsonSerializable() | @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 | /// @nodoc | ||||||
| @JsonSerializable() | @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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -76,6 +75,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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,8 +11,8 @@ sealed class SnEmbedLink with _$SnEmbedLink { | |||||||
|     @JsonKey(name: 'Title') required String title, |     @JsonKey(name: 'Title') required String title, | ||||||
|     @JsonKey(name: 'Description') required String? description, |     @JsonKey(name: 'Description') required String? description, | ||||||
|     @JsonKey(name: 'ImageUrl') required String? imageUrl, |     @JsonKey(name: 'ImageUrl') required String? imageUrl, | ||||||
|     @JsonKey(name: 'FaviconUrl') required String faviconUrl, |     @JsonKey(name: 'FaviconUrl') @Default("") String faviconUrl, | ||||||
|     @JsonKey(name: 'SiteName') required String siteName, |     @JsonKey(name: 'SiteName') @Default("") String siteName, | ||||||
|     @JsonKey(name: 'ContentType') required String? contentType, |     @JsonKey(name: 'ContentType') required String? contentType, | ||||||
|     @JsonKey(name: 'Author') required String? author, |     @JsonKey(name: 'Author') required String? author, | ||||||
|     @JsonKey(name: 'PublishedDate') required DateTime? publishedDate, |     @JsonKey(name: 'PublishedDate') required DateTime? publishedDate, | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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,11 +84,135 @@ as DateTime?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnEmbedLink]. | ||||||
|  | extension SnEmbedLinkPatterns on SnEmbedLink { | ||||||
|  | /// 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( _SnEmbedLink value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink() 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( _SnEmbedLink value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink(): | ||||||
|  | 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( _SnEmbedLink value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink() 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(@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)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink() 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(@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)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink(): | ||||||
|  | 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(@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)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnEmbedLink() 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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| class _SnEmbedLink implements SnEmbedLink { | 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}); |   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') this.faviconUrl = "", @JsonKey(name: 'SiteName') 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); |   factory _SnEmbedLink.fromJson(Map<String, dynamic> json) => _$SnEmbedLinkFromJson(json); | ||||||
|  |  | ||||||
| @override@JsonKey(name: 'Type') final  String type; | @override@JsonKey(name: 'Type') final  String type; | ||||||
| @@ -245,6 +368,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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ _SnEmbedLink _$SnEmbedLinkFromJson(Map<String, dynamic> json) => _SnEmbedLink( | |||||||
|   title: json['Title'] as String, |   title: json['Title'] as String, | ||||||
|   description: json['Description'] as String?, |   description: json['Description'] as String?, | ||||||
|   imageUrl: json['ImageUrl'] as String?, |   imageUrl: json['ImageUrl'] as String?, | ||||||
|   faviconUrl: json['FaviconUrl'] as String, |   faviconUrl: json['FaviconUrl'] as String? ?? "", | ||||||
|   siteName: json['SiteName'] as String, |   siteName: json['SiteName'] as String? ?? "", | ||||||
|   contentType: json['ContentType'] as String?, |   contentType: json['ContentType'] as String?, | ||||||
|   author: json['Author'] as String?, |   author: json['Author'] as String?, | ||||||
|   publishedDate: |   publishedDate: | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -77,6 +76,130 @@ as UniversalFileType, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// 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)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _UniversalFile() when $default != null: | ||||||
|  | return $default(_that.data,_that.type);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)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _UniversalFile(): | ||||||
|  | return $default(_that.data,_that.type);} | ||||||
|  | } | ||||||
|  | /// 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)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _UniversalFile() when $default != null: | ||||||
|  | return $default(_that.data,_that.type);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -224,6 +347,130 @@ 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,  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.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,  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.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,  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.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ sealed class SnPost with _$SnPost { | |||||||
|     @Default([]) List<SnCloudFile> attachments, |     @Default([]) List<SnCloudFile> attachments, | ||||||
|     required SnPublisher publisher, |     required SnPublisher publisher, | ||||||
|     @Default({}) Map<String, int> reactionsCount, |     @Default({}) Map<String, int> reactionsCount, | ||||||
|  |     @Default({}) Map<String, bool> reactionsMade, | ||||||
|     @Default([]) List<dynamic> reactions, |     @Default([]) List<dynamic> reactions, | ||||||
|     @Default([]) List<PostTag> tags, |     @Default([]) List<PostTag> tags, | ||||||
|     @Default([]) List<PostCategory> categories, |     @Default([]) List<PostCategory> categories, | ||||||
| @@ -77,6 +78,13 @@ sealed class SnSubscriptionStatus with _$SnSubscriptionStatus { | |||||||
| sealed class ReactInfo with _$ReactInfo { | sealed class ReactInfo with _$ReactInfo { | ||||||
|   const factory ReactInfo({required String icon, required int attitude}) = |   const factory ReactInfo({required String icon, required int attitude}) = | ||||||
|       _ReactInfo; |       _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 = { | const Map<String, ReactInfo> kReactionTemplates = { | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| mixin _$SnPost { | mixin _$SnPost { | ||||||
|  |  | ||||||
|  String get id; String? get title; String? get description; String? get language; DateTime? get editedAt; DateTime? get publishedAt; int get visibility; String? get content; int get type; Map<String, dynamic>? get meta; int get viewsUnique; int get viewsTotal; int get upvotes; int get downvotes; int get repliesCount; String? get threadedPostId; SnPost? get threadedPost; String? get repliedPostId; SnPost? get repliedPost; String? get forwardedPostId; SnPost? get forwardedPost; List<SnCloudFile> get attachments; SnPublisher get publisher; Map<String, int> get reactionsCount; List<dynamic> get reactions; List<PostTag> get tags; List<PostCategory> get categories; List<dynamic> get collections; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; bool get isTruncated; |  String get id; String? get title; String? get description; String? get language; DateTime? get editedAt; DateTime? get publishedAt; int get visibility; String? get content; int get type; Map<String, dynamic>? get meta; int get viewsUnique; int get viewsTotal; int get upvotes; int get downvotes; int get repliesCount; String? get threadedPostId; SnPost? get threadedPost; String? get repliedPostId; SnPost? get repliedPost; String? get forwardedPostId; SnPost? get forwardedPost; List<SnCloudFile> get attachments; SnPublisher get publisher; Map<String, int> get reactionsCount; Map<String, bool> get reactionsMade; List<dynamic> get reactions; List<PostTag> get tags; List<PostCategory> get categories; List<dynamic> get collections; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; bool get isTruncated; | ||||||
| /// Create a copy of SnPost | /// Create a copy of SnPost | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @@ -29,16 +28,16 @@ $SnPostCopyWith<SnPost> get copyWith => _$SnPostCopyWithImpl<SnPost>(this as SnP | |||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.meta, meta)&&(identical(other.viewsUnique, viewsUnique) || other.viewsUnique == viewsUnique)&&(identical(other.viewsTotal, viewsTotal) || other.viewsTotal == viewsTotal)&&(identical(other.upvotes, upvotes) || other.upvotes == upvotes)&&(identical(other.downvotes, downvotes) || other.downvotes == downvotes)&&(identical(other.repliesCount, repliesCount) || other.repliesCount == repliesCount)&&(identical(other.threadedPostId, threadedPostId) || other.threadedPostId == threadedPostId)&&(identical(other.threadedPost, threadedPost) || other.threadedPost == threadedPost)&&(identical(other.repliedPostId, repliedPostId) || other.repliedPostId == repliedPostId)&&(identical(other.repliedPost, repliedPost) || other.repliedPost == repliedPost)&&(identical(other.forwardedPostId, forwardedPostId) || other.forwardedPostId == forwardedPostId)&&(identical(other.forwardedPost, forwardedPost) || other.forwardedPost == forwardedPost)&&const DeepCollectionEquality().equals(other.attachments, attachments)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&const DeepCollectionEquality().equals(other.reactionsCount, reactionsCount)&&const DeepCollectionEquality().equals(other.reactions, reactions)&&const DeepCollectionEquality().equals(other.tags, tags)&&const DeepCollectionEquality().equals(other.categories, categories)&&const DeepCollectionEquality().equals(other.collections, collections)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.meta, meta)&&(identical(other.viewsUnique, viewsUnique) || other.viewsUnique == viewsUnique)&&(identical(other.viewsTotal, viewsTotal) || other.viewsTotal == viewsTotal)&&(identical(other.upvotes, upvotes) || other.upvotes == upvotes)&&(identical(other.downvotes, downvotes) || other.downvotes == downvotes)&&(identical(other.repliesCount, repliesCount) || other.repliesCount == repliesCount)&&(identical(other.threadedPostId, threadedPostId) || other.threadedPostId == threadedPostId)&&(identical(other.threadedPost, threadedPost) || other.threadedPost == threadedPost)&&(identical(other.repliedPostId, repliedPostId) || other.repliedPostId == repliedPostId)&&(identical(other.repliedPost, repliedPost) || other.repliedPost == repliedPost)&&(identical(other.forwardedPostId, forwardedPostId) || other.forwardedPostId == forwardedPostId)&&(identical(other.forwardedPost, forwardedPost) || other.forwardedPost == forwardedPost)&&const DeepCollectionEquality().equals(other.attachments, attachments)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&const DeepCollectionEquality().equals(other.reactionsCount, reactionsCount)&&const DeepCollectionEquality().equals(other.reactionsMade, reactionsMade)&&const DeepCollectionEquality().equals(other.reactions, reactions)&&const DeepCollectionEquality().equals(other.tags, tags)&&const DeepCollectionEquality().equals(other.categories, categories)&&const DeepCollectionEquality().equals(other.collections, collections)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,type,const DeepCollectionEquality().hash(meta),viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,const DeepCollectionEquality().hash(attachments),publisher,const DeepCollectionEquality().hash(reactionsCount),const DeepCollectionEquality().hash(reactions),const DeepCollectionEquality().hash(tags),const DeepCollectionEquality().hash(categories),const DeepCollectionEquality().hash(collections),createdAt,updatedAt,deletedAt,isTruncated]); | int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,type,const DeepCollectionEquality().hash(meta),viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,const DeepCollectionEquality().hash(attachments),publisher,const DeepCollectionEquality().hash(reactionsCount),const DeepCollectionEquality().hash(reactionsMade),const DeepCollectionEquality().hash(reactions),const DeepCollectionEquality().hash(tags),const DeepCollectionEquality().hash(categories),const DeepCollectionEquality().hash(collections),createdAt,updatedAt,deletedAt,isTruncated]); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString() { | ||||||
|   return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, type: $type, meta: $meta, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)'; |   return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, type: $type, meta: $meta, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -49,7 +48,7 @@ abstract mixin class $SnPostCopyWith<$Res>  { | |||||||
|   factory $SnPostCopyWith(SnPost value, $Res Function(SnPost) _then) = _$SnPostCopyWithImpl; |   factory $SnPostCopyWith(SnPost value, $Res Function(SnPost) _then) = _$SnPostCopyWithImpl; | ||||||
| @useResult | @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, int type, Map<String, dynamic>? meta, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, List<SnCloudFile> attachments, SnPublisher publisher, Map<String, int> reactionsCount, List<dynamic> reactions, List<PostTag> tags, List<PostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated |  String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, int type, Map<String, dynamic>? meta, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, List<SnCloudFile> attachments, SnPublisher publisher, Map<String, int> reactionsCount, Map<String, bool> reactionsMade, List<dynamic> reactions, List<PostTag> tags, List<PostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -66,7 +65,7 @@ class _$SnPostCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of SnPost | /// Create a copy of SnPost | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? type = null,Object? meta = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? attachments = null,Object? publisher = null,Object? reactionsCount = null,Object? reactions = null,Object? tags = null,Object? categories = null,Object? collections = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) { | @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? type = null,Object? meta = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? attachments = null,Object? publisher = null,Object? reactionsCount = null,Object? reactionsMade = null,Object? reactions = null,Object? tags = null,Object? categories = null,Object? collections = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) { | ||||||
|   return _then(_self.copyWith( |   return _then(_self.copyWith( | ||||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||||
| as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||||
| @@ -92,7 +91,8 @@ as String?,forwardedPost: freezed == forwardedPost ? _self.forwardedPost : forwa | |||||||
| as SnPost?,attachments: null == attachments ? _self.attachments : attachments // ignore: cast_nullable_to_non_nullable | as SnPost?,attachments: null == attachments ? _self.attachments : attachments // ignore: cast_nullable_to_non_nullable | ||||||
| as List<SnCloudFile>,publisher: null == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | as List<SnCloudFile>,publisher: null == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||||
| as SnPublisher,reactionsCount: null == reactionsCount ? _self.reactionsCount : reactionsCount // ignore: cast_nullable_to_non_nullable | as SnPublisher,reactionsCount: null == reactionsCount ? _self.reactionsCount : reactionsCount // ignore: cast_nullable_to_non_nullable | ||||||
| as Map<String, int>,reactions: null == reactions ? _self.reactions : reactions // ignore: cast_nullable_to_non_nullable | as Map<String, int>,reactionsMade: null == reactionsMade ? _self.reactionsMade : reactionsMade // ignore: cast_nullable_to_non_nullable | ||||||
|  | as Map<String, bool>,reactions: null == reactions ? _self.reactions : reactions // ignore: cast_nullable_to_non_nullable | ||||||
| as List<dynamic>,tags: null == tags ? _self.tags : tags // ignore: cast_nullable_to_non_nullable | as List<dynamic>,tags: null == tags ? _self.tags : tags // ignore: cast_nullable_to_non_nullable | ||||||
| as List<PostTag>,categories: null == categories ? _self.categories : categories // ignore: cast_nullable_to_non_nullable | as List<PostTag>,categories: null == categories ? _self.categories : categories // ignore: cast_nullable_to_non_nullable | ||||||
| as List<PostCategory>,collections: null == collections ? _self.collections : collections // ignore: cast_nullable_to_non_nullable | as List<PostCategory>,collections: null == collections ? _self.collections : collections // ignore: cast_nullable_to_non_nullable | ||||||
| @@ -152,11 +152,135 @@ $SnPublisherCopyWith<$Res> get publisher { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnPost]. | ||||||
|  | extension SnPostPatterns on SnPost { | ||||||
|  | /// 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( _SnPost value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost() 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( _SnPost value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost(): | ||||||
|  | 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( _SnPost value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost() 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? title,  String? description,  String? language,  DateTime? editedAt,  DateTime? publishedAt,  int visibility,  String? content,  int type,  Map<String, dynamic>? meta,  int viewsUnique,  int viewsTotal,  int upvotes,  int downvotes,  int repliesCount,  String? threadedPostId,  SnPost? threadedPost,  String? repliedPostId,  SnPost? repliedPost,  String? forwardedPostId,  SnPost? forwardedPost,  List<SnCloudFile> attachments,  SnPublisher publisher,  Map<String, int> reactionsCount,  Map<String, bool> reactionsMade,  List<dynamic> reactions,  List<PostTag> tags,  List<PostCategory> categories,  List<dynamic> collections,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  bool isTruncated)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost() when $default != null: | ||||||
|  | return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.type,_that.meta,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);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? title,  String? description,  String? language,  DateTime? editedAt,  DateTime? publishedAt,  int visibility,  String? content,  int type,  Map<String, dynamic>? meta,  int viewsUnique,  int viewsTotal,  int upvotes,  int downvotes,  int repliesCount,  String? threadedPostId,  SnPost? threadedPost,  String? repliedPostId,  SnPost? repliedPost,  String? forwardedPostId,  SnPost? forwardedPost,  List<SnCloudFile> attachments,  SnPublisher publisher,  Map<String, int> reactionsCount,  Map<String, bool> reactionsMade,  List<dynamic> reactions,  List<PostTag> tags,  List<PostCategory> categories,  List<dynamic> collections,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  bool isTruncated)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost(): | ||||||
|  | return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.type,_that.meta,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);} | ||||||
|  | } | ||||||
|  | /// 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? title,  String? description,  String? language,  DateTime? editedAt,  DateTime? publishedAt,  int visibility,  String? content,  int type,  Map<String, dynamic>? meta,  int viewsUnique,  int viewsTotal,  int upvotes,  int downvotes,  int repliesCount,  String? threadedPostId,  SnPost? threadedPost,  String? repliedPostId,  SnPost? repliedPost,  String? forwardedPostId,  SnPost? forwardedPost,  List<SnCloudFile> attachments,  SnPublisher publisher,  Map<String, int> reactionsCount,  Map<String, bool> reactionsMade,  List<dynamic> reactions,  List<PostTag> tags,  List<PostCategory> categories,  List<dynamic> collections,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  bool isTruncated)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPost() when $default != null: | ||||||
|  | return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.type,_that.meta,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| class _SnPost implements SnPost { | class _SnPost implements SnPost { | ||||||
|   const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.type = 0, final  Map<String, dynamic>? meta, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, final  List<SnCloudFile> attachments = const [], required this.publisher, final  Map<String, int> reactionsCount = const {}, final  List<dynamic> reactions = const [], final  List<PostTag> tags = const [], final  List<PostCategory> categories = const [], final  List<dynamic> collections = const [], this.createdAt = null, this.updatedAt = null, this.deletedAt, this.isTruncated = false}): _meta = meta,_attachments = attachments,_reactionsCount = reactionsCount,_reactions = reactions,_tags = tags,_categories = categories,_collections = collections; |   const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.type = 0, final  Map<String, dynamic>? meta, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, final  List<SnCloudFile> attachments = const [], required this.publisher, final  Map<String, int> reactionsCount = const {}, final  Map<String, bool> reactionsMade = const {}, final  List<dynamic> reactions = const [], final  List<PostTag> tags = const [], final  List<PostCategory> categories = const [], final  List<dynamic> collections = const [], this.createdAt = null, this.updatedAt = null, this.deletedAt, this.isTruncated = false}): _meta = meta,_attachments = attachments,_reactionsCount = reactionsCount,_reactionsMade = reactionsMade,_reactions = reactions,_tags = tags,_categories = categories,_collections = collections; | ||||||
|   factory _SnPost.fromJson(Map<String, dynamic> json) => _$SnPostFromJson(json); |   factory _SnPost.fromJson(Map<String, dynamic> json) => _$SnPostFromJson(json); | ||||||
|  |  | ||||||
| @override final  String id; | @override final  String id; | ||||||
| @@ -203,6 +327,13 @@ class _SnPost implements SnPost { | |||||||
|   return EqualUnmodifiableMapView(_reactionsCount); |   return EqualUnmodifiableMapView(_reactionsCount); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  final  Map<String, bool> _reactionsMade; | ||||||
|  | @override@JsonKey() Map<String, bool> get reactionsMade { | ||||||
|  |   if (_reactionsMade is EqualUnmodifiableMapView) return _reactionsMade; | ||||||
|  |   // ignore: implicit_dynamic_type | ||||||
|  |   return EqualUnmodifiableMapView(_reactionsMade); | ||||||
|  | } | ||||||
|  |  | ||||||
|  final  List<dynamic> _reactions; |  final  List<dynamic> _reactions; | ||||||
| @override@JsonKey() List<dynamic> get reactions { | @override@JsonKey() List<dynamic> get reactions { | ||||||
|   if (_reactions is EqualUnmodifiableListView) return _reactions; |   if (_reactions is EqualUnmodifiableListView) return _reactions; | ||||||
| @@ -249,16 +380,16 @@ Map<String, dynamic> toJson() { | |||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._meta, _meta)&&(identical(other.viewsUnique, viewsUnique) || other.viewsUnique == viewsUnique)&&(identical(other.viewsTotal, viewsTotal) || other.viewsTotal == viewsTotal)&&(identical(other.upvotes, upvotes) || other.upvotes == upvotes)&&(identical(other.downvotes, downvotes) || other.downvotes == downvotes)&&(identical(other.repliesCount, repliesCount) || other.repliesCount == repliesCount)&&(identical(other.threadedPostId, threadedPostId) || other.threadedPostId == threadedPostId)&&(identical(other.threadedPost, threadedPost) || other.threadedPost == threadedPost)&&(identical(other.repliedPostId, repliedPostId) || other.repliedPostId == repliedPostId)&&(identical(other.repliedPost, repliedPost) || other.repliedPost == repliedPost)&&(identical(other.forwardedPostId, forwardedPostId) || other.forwardedPostId == forwardedPostId)&&(identical(other.forwardedPost, forwardedPost) || other.forwardedPost == forwardedPost)&&const DeepCollectionEquality().equals(other._attachments, _attachments)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&const DeepCollectionEquality().equals(other._reactionsCount, _reactionsCount)&&const DeepCollectionEquality().equals(other._reactions, _reactions)&&const DeepCollectionEquality().equals(other._tags, _tags)&&const DeepCollectionEquality().equals(other._categories, _categories)&&const DeepCollectionEquality().equals(other._collections, _collections)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._meta, _meta)&&(identical(other.viewsUnique, viewsUnique) || other.viewsUnique == viewsUnique)&&(identical(other.viewsTotal, viewsTotal) || other.viewsTotal == viewsTotal)&&(identical(other.upvotes, upvotes) || other.upvotes == upvotes)&&(identical(other.downvotes, downvotes) || other.downvotes == downvotes)&&(identical(other.repliesCount, repliesCount) || other.repliesCount == repliesCount)&&(identical(other.threadedPostId, threadedPostId) || other.threadedPostId == threadedPostId)&&(identical(other.threadedPost, threadedPost) || other.threadedPost == threadedPost)&&(identical(other.repliedPostId, repliedPostId) || other.repliedPostId == repliedPostId)&&(identical(other.repliedPost, repliedPost) || other.repliedPost == repliedPost)&&(identical(other.forwardedPostId, forwardedPostId) || other.forwardedPostId == forwardedPostId)&&(identical(other.forwardedPost, forwardedPost) || other.forwardedPost == forwardedPost)&&const DeepCollectionEquality().equals(other._attachments, _attachments)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&const DeepCollectionEquality().equals(other._reactionsCount, _reactionsCount)&&const DeepCollectionEquality().equals(other._reactionsMade, _reactionsMade)&&const DeepCollectionEquality().equals(other._reactions, _reactions)&&const DeepCollectionEquality().equals(other._tags, _tags)&&const DeepCollectionEquality().equals(other._categories, _categories)&&const DeepCollectionEquality().equals(other._collections, _collections)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,type,const DeepCollectionEquality().hash(_meta),viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,const DeepCollectionEquality().hash(_attachments),publisher,const DeepCollectionEquality().hash(_reactionsCount),const DeepCollectionEquality().hash(_reactions),const DeepCollectionEquality().hash(_tags),const DeepCollectionEquality().hash(_categories),const DeepCollectionEquality().hash(_collections),createdAt,updatedAt,deletedAt,isTruncated]); | int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,type,const DeepCollectionEquality().hash(_meta),viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,const DeepCollectionEquality().hash(_attachments),publisher,const DeepCollectionEquality().hash(_reactionsCount),const DeepCollectionEquality().hash(_reactionsMade),const DeepCollectionEquality().hash(_reactions),const DeepCollectionEquality().hash(_tags),const DeepCollectionEquality().hash(_categories),const DeepCollectionEquality().hash(_collections),createdAt,updatedAt,deletedAt,isTruncated]); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString() { | ||||||
|   return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, type: $type, meta: $meta, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)'; |   return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, type: $type, meta: $meta, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -269,7 +400,7 @@ abstract mixin class _$SnPostCopyWith<$Res> implements $SnPostCopyWith<$Res> { | |||||||
|   factory _$SnPostCopyWith(_SnPost value, $Res Function(_SnPost) _then) = __$SnPostCopyWithImpl; |   factory _$SnPostCopyWith(_SnPost value, $Res Function(_SnPost) _then) = __$SnPostCopyWithImpl; | ||||||
| @override @useResult | @override @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, int type, Map<String, dynamic>? meta, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, List<SnCloudFile> attachments, SnPublisher publisher, Map<String, int> reactionsCount, List<dynamic> reactions, List<PostTag> tags, List<PostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated |  String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, int type, Map<String, dynamic>? meta, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, List<SnCloudFile> attachments, SnPublisher publisher, Map<String, int> reactionsCount, Map<String, bool> reactionsMade, List<dynamic> reactions, List<PostTag> tags, List<PostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -286,7 +417,7 @@ class __$SnPostCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of SnPost | /// Create a copy of SnPost | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? type = null,Object? meta = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? attachments = null,Object? publisher = null,Object? reactionsCount = null,Object? reactions = null,Object? tags = null,Object? categories = null,Object? collections = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) { | @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? type = null,Object? meta = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? attachments = null,Object? publisher = null,Object? reactionsCount = null,Object? reactionsMade = null,Object? reactions = null,Object? tags = null,Object? categories = null,Object? collections = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) { | ||||||
|   return _then(_SnPost( |   return _then(_SnPost( | ||||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||||
| as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||||
| @@ -312,7 +443,8 @@ as String?,forwardedPost: freezed == forwardedPost ? _self.forwardedPost : forwa | |||||||
| as SnPost?,attachments: null == attachments ? _self._attachments : attachments // ignore: cast_nullable_to_non_nullable | as SnPost?,attachments: null == attachments ? _self._attachments : attachments // ignore: cast_nullable_to_non_nullable | ||||||
| as List<SnCloudFile>,publisher: null == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | as List<SnCloudFile>,publisher: null == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||||
| as SnPublisher,reactionsCount: null == reactionsCount ? _self._reactionsCount : reactionsCount // ignore: cast_nullable_to_non_nullable | as SnPublisher,reactionsCount: null == reactionsCount ? _self._reactionsCount : reactionsCount // ignore: cast_nullable_to_non_nullable | ||||||
| as Map<String, int>,reactions: null == reactions ? _self._reactions : reactions // ignore: cast_nullable_to_non_nullable | as Map<String, int>,reactionsMade: null == reactionsMade ? _self._reactionsMade : reactionsMade // ignore: cast_nullable_to_non_nullable | ||||||
|  | as Map<String, bool>,reactions: null == reactions ? _self._reactions : reactions // ignore: cast_nullable_to_non_nullable | ||||||
| as List<dynamic>,tags: null == tags ? _self._tags : tags // ignore: cast_nullable_to_non_nullable | as List<dynamic>,tags: null == tags ? _self._tags : tags // ignore: cast_nullable_to_non_nullable | ||||||
| as List<PostTag>,categories: null == categories ? _self._categories : categories // ignore: cast_nullable_to_non_nullable | as List<PostTag>,categories: null == categories ? _self._categories : categories // ignore: cast_nullable_to_non_nullable | ||||||
| as List<PostCategory>,collections: null == collections ? _self._collections : collections // ignore: cast_nullable_to_non_nullable | as List<PostCategory>,collections: null == collections ? _self._collections : collections // ignore: cast_nullable_to_non_nullable | ||||||
| @@ -440,6 +572,130 @@ as int, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnPublisherStats]. | ||||||
|  | extension SnPublisherStatsPatterns on SnPublisherStats { | ||||||
|  | /// 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( _SnPublisherStats value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats() 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( _SnPublisherStats value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats(): | ||||||
|  | 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( _SnPublisherStats value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats() 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 postsCreated,  int stickerPacksCreated,  int stickersCreated,  int upvoteReceived,  int downvoteReceived)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats() when $default != null: | ||||||
|  | return $default(_that.postsCreated,_that.stickerPacksCreated,_that.stickersCreated,_that.upvoteReceived,_that.downvoteReceived);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 postsCreated,  int stickerPacksCreated,  int stickersCreated,  int upvoteReceived,  int downvoteReceived)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats(): | ||||||
|  | return $default(_that.postsCreated,_that.stickerPacksCreated,_that.stickersCreated,_that.upvoteReceived,_that.downvoteReceived);} | ||||||
|  | } | ||||||
|  | /// 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 postsCreated,  int stickerPacksCreated,  int stickersCreated,  int upvoteReceived,  int downvoteReceived)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnPublisherStats() when $default != null: | ||||||
|  | return $default(_that.postsCreated,_that.stickerPacksCreated,_that.stickersCreated,_that.upvoteReceived,_that.downvoteReceived);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -583,6 +839,130 @@ as String, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnSubscriptionStatus]. | ||||||
|  | extension SnSubscriptionStatusPatterns on SnSubscriptionStatus { | ||||||
|  | /// 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( _SnSubscriptionStatus value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus() 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( _SnSubscriptionStatus value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus(): | ||||||
|  | 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( _SnSubscriptionStatus value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus() 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 isSubscribed,  String publisherId,  String publisherName)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus() when $default != null: | ||||||
|  | return $default(_that.isSubscribed,_that.publisherId,_that.publisherName);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 isSubscribed,  String publisherId,  String publisherName)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus(): | ||||||
|  | return $default(_that.isSubscribed,_that.publisherId,_that.publisherName);} | ||||||
|  | } | ||||||
|  | /// 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 isSubscribed,  String publisherId,  String publisherName)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSubscriptionStatus() when $default != null: | ||||||
|  | return $default(_that.isSubscribed,_that.publisherId,_that.publisherName);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -718,6 +1098,130 @@ as int, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [ReactInfo]. | ||||||
|  | extension ReactInfoPatterns on ReactInfo { | ||||||
|  | /// 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( _ReactInfo value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo() 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( _ReactInfo value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo(): | ||||||
|  | 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( _ReactInfo value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo() 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 icon,  int attitude)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo() when $default != null: | ||||||
|  | return $default(_that.icon,_that.attitude);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 icon,  int attitude)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo(): | ||||||
|  | return $default(_that.icon,_that.attitude);} | ||||||
|  | } | ||||||
|  | /// 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 icon,  int attitude)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ReactInfo() when $default != null: | ||||||
|  | return $default(_that.icon,_that.attitude);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -54,6 +54,11 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost( | |||||||
|         (k, e) => MapEntry(k, (e as num).toInt()), |         (k, e) => MapEntry(k, (e as num).toInt()), | ||||||
|       ) ?? |       ) ?? | ||||||
|       const {}, |       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 [], |   reactions: json['reactions'] as List<dynamic>? ?? const [], | ||||||
|   tags: |   tags: | ||||||
|       (json['tags'] as List<dynamic>?) |       (json['tags'] as List<dynamic>?) | ||||||
| @@ -106,6 +111,7 @@ Map<String, dynamic> _$SnPostToJson(_SnPost instance) => <String, dynamic>{ | |||||||
|   'attachments': instance.attachments.map((e) => e.toJson()).toList(), |   'attachments': instance.attachments.map((e) => e.toJson()).toList(), | ||||||
|   'publisher': instance.publisher.toJson(), |   'publisher': instance.publisher.toJson(), | ||||||
|   'reactions_count': instance.reactionsCount, |   'reactions_count': instance.reactionsCount, | ||||||
|  |   'reactions_made': instance.reactionsMade, | ||||||
|   'reactions': instance.reactions, |   'reactions': instance.reactions, | ||||||
|   'tags': instance.tags.map((e) => e.toJson()).toList(), |   'tags': instance.tags.map((e) => e.toJson()).toList(), | ||||||
|   'categories': instance.categories.map((e) => e.toJson()).toList(), |   'categories': instance.categories.map((e) => e.toJson()).toList(), | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -79,6 +78,130 @@ as List<SnPost>, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [PostCategory]. | ||||||
|  | extension PostCategoryPatterns on PostCategory { | ||||||
|  | /// 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( _PostCategory value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory() 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( _PostCategory value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory(): | ||||||
|  | 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( _PostCategory value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory() 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)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);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)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory(): | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);} | ||||||
|  | } | ||||||
|  | /// 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)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostCategory() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -79,6 +78,130 @@ as List<SnPost>, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [PostTag]. | ||||||
|  | extension PostTagPatterns on PostTag { | ||||||
|  | /// 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( _PostTag value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag() 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( _PostTag value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag(): | ||||||
|  | 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( _PostTag value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag() 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)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);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)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag(): | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);} | ||||||
|  | } | ||||||
|  | /// 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)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _PostTag() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.name,_that.posts);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| @JsonSerializable() | @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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -328,6 +451,130 @@ $SnAccountCopyWith<$Res>? get account { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// 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)?  $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);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)  $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);} | ||||||
|  | } | ||||||
|  | /// 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)?  $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);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -102,6 +101,130 @@ $SnAccountCopyWith<$Res> get related { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnRelationship]. | ||||||
|  | extension SnRelationshipPatterns on SnRelationship { | ||||||
|  | /// 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( _SnRelationship value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship() 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( _SnRelationship value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship(): | ||||||
|  | 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( _SnRelationship value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship() 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? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String accountId,  SnAccount account,  String relatedId,  SnAccount related,  DateTime? expiredAt,  int status)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship() when $default != null: | ||||||
|  | return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.accountId,_that.account,_that.relatedId,_that.related,_that.expiredAt,_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( DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String accountId,  SnAccount account,  String relatedId,  SnAccount related,  DateTime? expiredAt,  int status)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship(): | ||||||
|  | return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.accountId,_that.account,_that.relatedId,_that.related,_that.expiredAt,_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( DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String accountId,  SnAccount account,  String relatedId,  SnAccount related,  DateTime? expiredAt,  int status)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnRelationship() when $default != null: | ||||||
|  | return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.accountId,_that.account,_that.relatedId,_that.related,_that.expiredAt,_that.status);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -105,6 +104,130 @@ $SnStickerPackCopyWith<$Res>? get pack { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnSticker]. | ||||||
|  | extension SnStickerPatterns on SnSticker { | ||||||
|  | /// 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( _SnSticker value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker() 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( _SnSticker value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker(): | ||||||
|  | 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( _SnSticker value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker() 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 imageId,  SnCloudFile image,  String packId,  SnStickerPack? pack,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.imageId,_that.image,_that.packId,_that.pack,_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 imageId,  SnCloudFile image,  String packId,  SnStickerPack? pack,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker(): | ||||||
|  | return $default(_that.id,_that.slug,_that.imageId,_that.image,_that.packId,_that.pack,_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 imageId,  SnCloudFile image,  String packId,  SnStickerPack? pack,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnSticker() when $default != null: | ||||||
|  | return $default(_that.id,_that.slug,_that.imageId,_that.image,_that.packId,_that.pack,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -295,6 +418,130 @@ $SnPublisherCopyWith<$Res>? get publisher { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnStickerPack]. | ||||||
|  | extension SnStickerPackPatterns on SnStickerPack { | ||||||
|  | /// 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( _SnStickerPack value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack() 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( _SnStickerPack value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack(): | ||||||
|  | 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( _SnStickerPack value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack() 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,  String prefix,  String publisherId,  SnPublisher? publisher,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack() when $default != null: | ||||||
|  | return $default(_that.id,_that.name,_that.description,_that.prefix,_that.publisherId,_that.publisher,_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,  String prefix,  String publisherId,  SnPublisher? publisher,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack(): | ||||||
|  | return $default(_that.id,_that.name,_that.description,_that.prefix,_that.publisherId,_that.publisher,_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,  String prefix,  String publisherId,  SnPublisher? publisher,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnStickerPack() when $default != null: | ||||||
|  | return $default(_that.id,_that.name,_that.description,_that.prefix,_that.publisherId,_that.publisher,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ sealed class SnAccount with _$SnAccount { | |||||||
|     required String language, |     required String language, | ||||||
|     required bool isSuperuser, |     required bool isSuperuser, | ||||||
|     required SnAccountProfile profile, |     required SnAccountProfile profile, | ||||||
|  |     required SnWalletSubscriptionRef? perkSubscription, | ||||||
|     @Default([]) List<SnAccountBadge> badges, |     @Default([]) List<SnAccountBadge> badges, | ||||||
|     required DateTime createdAt, |     required DateTime createdAt, | ||||||
|     required DateTime updatedAt, |     required DateTime updatedAt, | ||||||
| @@ -45,7 +46,6 @@ sealed class SnAccountProfile with _$SnAccountProfile { | |||||||
|     required SnCloudFile? picture, |     required SnCloudFile? picture, | ||||||
|     required SnCloudFile? background, |     required SnCloudFile? background, | ||||||
|     required SnVerificationMark? verification, |     required SnVerificationMark? verification, | ||||||
|     required SnWalletSubscriptionRef? stellarMembership, |  | ||||||
|     required DateTime createdAt, |     required DateTime createdAt, | ||||||
|     required DateTime updatedAt, |     required DateTime updatedAt, | ||||||
|     required DateTime? deletedAt, |     required DateTime? deletedAt, | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -13,6 +13,12 @@ _SnAccount _$SnAccountFromJson(Map<String, dynamic> json) => _SnAccount( | |||||||
|   language: json['language'] as String, |   language: json['language'] as String, | ||||||
|   isSuperuser: json['is_superuser'] as bool, |   isSuperuser: json['is_superuser'] as bool, | ||||||
|   profile: SnAccountProfile.fromJson(json['profile'] as Map<String, dynamic>), |   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: |   badges: | ||||||
|       (json['badges'] as List<dynamic>?) |       (json['badges'] as List<dynamic>?) | ||||||
|           ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) |           ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) | ||||||
| @@ -34,6 +40,7 @@ Map<String, dynamic> _$SnAccountToJson(_SnAccount instance) => | |||||||
|       'language': instance.language, |       'language': instance.language, | ||||||
|       'is_superuser': instance.isSuperuser, |       'is_superuser': instance.isSuperuser, | ||||||
|       'profile': instance.profile.toJson(), |       'profile': instance.profile.toJson(), | ||||||
|  |       'perk_subscription': instance.perkSubscription?.toJson(), | ||||||
|       'badges': instance.badges.map((e) => e.toJson()).toList(), |       'badges': instance.badges.map((e) => e.toJson()).toList(), | ||||||
|       'created_at': instance.createdAt.toIso8601String(), |       'created_at': instance.createdAt.toIso8601String(), | ||||||
|       'updated_at': instance.updatedAt.toIso8601String(), |       'updated_at': instance.updatedAt.toIso8601String(), | ||||||
| @@ -84,12 +91,6 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | |||||||
|               : SnVerificationMark.fromJson( |               : SnVerificationMark.fromJson( | ||||||
|                 json['verification'] as Map<String, dynamic>, |                 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), |       createdAt: DateTime.parse(json['created_at'] as String), | ||||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), |       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||||
|       deletedAt: |       deletedAt: | ||||||
| @@ -118,7 +119,6 @@ Map<String, dynamic> _$SnAccountProfileToJson(_SnAccountProfile instance) => | |||||||
|       'picture': instance.picture?.toJson(), |       'picture': instance.picture?.toJson(), | ||||||
|       'background': instance.background?.toJson(), |       'background': instance.background?.toJson(), | ||||||
|       'verification': instance.verification?.toJson(), |       'verification': instance.verification?.toJson(), | ||||||
|       'stellar_membership': instance.stellarMembership?.toJson(), |  | ||||||
|       'created_at': instance.createdAt.toIso8601String(), |       'created_at': instance.createdAt.toIso8601String(), | ||||||
|       'updated_at': instance.updatedAt.toIso8601String(), |       'updated_at': instance.updatedAt.toIso8601String(), | ||||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), |       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -94,6 +93,130 @@ $SnAccountCopyWith<$Res>? get account { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWallet]. | ||||||
|  | extension SnWalletPatterns on SnWallet { | ||||||
|  | /// 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( _SnWallet value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet() 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( _SnWallet value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet(): | ||||||
|  | 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( _SnWallet value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet() 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,  List<SnWalletPocket> pockets,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet() when $default != null: | ||||||
|  | return $default(_that.id,_that.pockets,_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,  List<SnWalletPocket> pockets,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet(): | ||||||
|  | return $default(_that.id,_that.pockets,_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,  List<SnWalletPocket> pockets,  String accountId,  SnAccount? account,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWallet() when $default != null: | ||||||
|  | return $default(_that.id,_that.pockets,_that.accountId,_that.account,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -263,6 +386,130 @@ as DateTime?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWalletPocket]. | ||||||
|  | extension SnWalletPocketPatterns on SnWalletPocket { | ||||||
|  | /// 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( _SnWalletPocket value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket() 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( _SnWalletPocket value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket(): | ||||||
|  | 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( _SnWalletPocket value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket() 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 currency,  double amount,  String walletId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket() when $default != null: | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.walletId,_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 currency,  double amount,  String walletId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket(): | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.walletId,_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 currency,  double amount,  String walletId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletPocket() when $default != null: | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.walletId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -443,6 +690,130 @@ $SnWalletCopyWith<$Res>? get payeeWallet { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnTransaction]. | ||||||
|  | extension SnTransactionPatterns on SnTransaction { | ||||||
|  | /// 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( _SnTransaction value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction() 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( _SnTransaction value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction(): | ||||||
|  | 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( _SnTransaction value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction() 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 currency,  double amount,  String? remarks,  int type,  String? payerWalletId,  SnWallet? payerWallet,  String? payeeWalletId,  SnWallet? payeeWallet,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction() when $default != null: | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.remarks,_that.type,_that.payerWalletId,_that.payerWallet,_that.payeeWalletId,_that.payeeWallet,_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 currency,  double amount,  String? remarks,  int type,  String? payerWalletId,  SnWallet? payerWallet,  String? payeeWalletId,  SnWallet? payeeWallet,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction(): | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.remarks,_that.type,_that.payerWalletId,_that.payerWallet,_that.payeeWalletId,_that.payeeWallet,_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 currency,  double amount,  String? remarks,  int type,  String? payerWalletId,  SnWallet? payerWallet,  String? payeeWalletId,  SnWallet? payeeWallet,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnTransaction() when $default != null: | ||||||
|  | return $default(_that.id,_that.currency,_that.amount,_that.remarks,_that.type,_that.payerWalletId,_that.payerWallet,_that.payeeWalletId,_that.payeeWallet,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -653,6 +1024,130 @@ $SnAccountCopyWith<$Res>? get account { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWalletSubscription]. | ||||||
|  | extension SnWalletSubscriptionPatterns on SnWalletSubscription { | ||||||
|  | /// 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( _SnWalletSubscription value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription() 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( _SnWalletSubscription value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription(): | ||||||
|  | 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( _SnWalletSubscription value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription() 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,  DateTime begunAt,  DateTime? endedAt,  String identifier,  bool isActive,  bool isFreeTrial,  int status,  String? paymentMethod,  Map<String, dynamic>? paymentDetails,  double? basePrice,  String? couponId,  dynamic coupon,  DateTime? renewalAt,  String accountId,  SnAccount? account,  bool isAvailable,  double? finalPrice,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription() when $default != null: | ||||||
|  | return $default(_that.id,_that.begunAt,_that.endedAt,_that.identifier,_that.isActive,_that.isFreeTrial,_that.status,_that.paymentMethod,_that.paymentDetails,_that.basePrice,_that.couponId,_that.coupon,_that.renewalAt,_that.accountId,_that.account,_that.isAvailable,_that.finalPrice,_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,  DateTime begunAt,  DateTime? endedAt,  String identifier,  bool isActive,  bool isFreeTrial,  int status,  String? paymentMethod,  Map<String, dynamic>? paymentDetails,  double? basePrice,  String? couponId,  dynamic coupon,  DateTime? renewalAt,  String accountId,  SnAccount? account,  bool isAvailable,  double? finalPrice,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription(): | ||||||
|  | return $default(_that.id,_that.begunAt,_that.endedAt,_that.identifier,_that.isActive,_that.isFreeTrial,_that.status,_that.paymentMethod,_that.paymentDetails,_that.basePrice,_that.couponId,_that.coupon,_that.renewalAt,_that.accountId,_that.account,_that.isAvailable,_that.finalPrice,_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,  DateTime begunAt,  DateTime? endedAt,  String identifier,  bool isActive,  bool isFreeTrial,  int status,  String? paymentMethod,  Map<String, dynamic>? paymentDetails,  double? basePrice,  String? couponId,  dynamic coupon,  DateTime? renewalAt,  String accountId,  SnAccount? account,  bool isAvailable,  double? finalPrice,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscription() when $default != null: | ||||||
|  | return $default(_that.id,_that.begunAt,_that.endedAt,_that.identifier,_that.isActive,_that.isFreeTrial,_that.status,_that.paymentMethod,_that.paymentDetails,_that.basePrice,_that.couponId,_that.coupon,_that.renewalAt,_that.accountId,_that.account,_that.isAvailable,_that.finalPrice,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -850,6 +1345,130 @@ as String, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWalletSubscriptionRef]. | ||||||
|  | extension SnWalletSubscriptionRefPatterns on SnWalletSubscriptionRef { | ||||||
|  | /// 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( _SnWalletSubscriptionRef value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef() 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( _SnWalletSubscriptionRef value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef(): | ||||||
|  | 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( _SnWalletSubscriptionRef value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef() 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,  bool isActive,  String accountId,  DateTime createdAt,  DateTime? deletedAt,  DateTime updatedAt,  String identifier)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef() when $default != null: | ||||||
|  | return $default(_that.id,_that.isActive,_that.accountId,_that.createdAt,_that.deletedAt,_that.updatedAt,_that.identifier);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,  bool isActive,  String accountId,  DateTime createdAt,  DateTime? deletedAt,  DateTime updatedAt,  String identifier)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef(): | ||||||
|  | return $default(_that.id,_that.isActive,_that.accountId,_that.createdAt,_that.deletedAt,_that.updatedAt,_that.identifier);} | ||||||
|  | } | ||||||
|  | /// 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,  bool isActive,  String accountId,  DateTime createdAt,  DateTime? deletedAt,  DateTime updatedAt,  String identifier)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletSubscriptionRef() when $default != null: | ||||||
|  | return $default(_that.id,_that.isActive,_that.accountId,_that.createdAt,_that.deletedAt,_that.updatedAt,_that.identifier);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -1035,6 +1654,130 @@ $SnTransactionCopyWith<$Res>? get transaction { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWalletOrder]. | ||||||
|  | extension SnWalletOrderPatterns on SnWalletOrder { | ||||||
|  | /// 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( _SnWalletOrder value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder() 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( _SnWalletOrder value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder(): | ||||||
|  | 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( _SnWalletOrder value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder() 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 status,  String currency,  dynamic remarks,  String appIdentifier,  Map<String, dynamic> meta,  int amount,  DateTime expiredAt,  String? payeeWalletId,  SnWallet? payeeWallet,  String? transactionId,  SnTransaction? transaction,  String? issuerAppId,  dynamic issuerApp,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder() when $default != null: | ||||||
|  | return $default(_that.id,_that.status,_that.currency,_that.remarks,_that.appIdentifier,_that.meta,_that.amount,_that.expiredAt,_that.payeeWalletId,_that.payeeWallet,_that.transactionId,_that.transaction,_that.issuerAppId,_that.issuerApp,_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 status,  String currency,  dynamic remarks,  String appIdentifier,  Map<String, dynamic> meta,  int amount,  DateTime expiredAt,  String? payeeWalletId,  SnWallet? payeeWallet,  String? transactionId,  SnTransaction? transaction,  String? issuerAppId,  dynamic issuerApp,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder(): | ||||||
|  | return $default(_that.id,_that.status,_that.currency,_that.remarks,_that.appIdentifier,_that.meta,_that.amount,_that.expiredAt,_that.payeeWalletId,_that.payeeWallet,_that.transactionId,_that.transaction,_that.issuerAppId,_that.issuerApp,_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 status,  String currency,  dynamic remarks,  String appIdentifier,  Map<String, dynamic> meta,  int amount,  DateTime expiredAt,  String? payeeWalletId,  SnWallet? payeeWallet,  String? transactionId,  SnTransaction? transaction,  String? issuerAppId,  dynamic issuerApp,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWalletOrder() when $default != null: | ||||||
|  | return $default(_that.id,_that.status,_that.currency,_that.remarks,_that.appIdentifier,_that.meta,_that.amount,_that.expiredAt,_that.payeeWalletId,_that.payeeWallet,_that.transactionId,_that.transaction,_that.issuerAppId,_that.issuerApp,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -76,6 +75,130 @@ as bool, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWebFeedConfig]. | ||||||
|  | extension SnWebFeedConfigPatterns on SnWebFeedConfig { | ||||||
|  | /// 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( _SnWebFeedConfig value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig() 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( _SnWebFeedConfig value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig(): | ||||||
|  | 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( _SnWebFeedConfig value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig() 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 scrapPage)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig() when $default != null: | ||||||
|  | return $default(_that.scrapPage);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 scrapPage)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig(): | ||||||
|  | return $default(_that.scrapPage);} | ||||||
|  | } | ||||||
|  | /// 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 scrapPage)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeedConfig() when $default != null: | ||||||
|  | return $default(_that.scrapPage);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -240,6 +363,130 @@ $SnWebFeedConfigCopyWith<$Res> get config { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWebFeed]. | ||||||
|  | extension SnWebFeedPatterns on SnWebFeed { | ||||||
|  | /// 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( _SnWebFeed value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed() 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( _SnWebFeed value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed(): | ||||||
|  | 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( _SnWebFeed value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed() 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 url,  String title,  String? description,  SnScrappedLink? preview,  SnWebFeedConfig config,  String publisherId,  List<SnWebArticle> articles,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed() when $default != null: | ||||||
|  | return $default(_that.id,_that.url,_that.title,_that.description,_that.preview,_that.config,_that.publisherId,_that.articles,_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 url,  String title,  String? description,  SnScrappedLink? preview,  SnWebFeedConfig config,  String publisherId,  List<SnWebArticle> articles,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed(): | ||||||
|  | return $default(_that.id,_that.url,_that.title,_that.description,_that.preview,_that.config,_that.publisherId,_that.articles,_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 url,  String title,  String? description,  SnScrappedLink? preview,  SnWebFeedConfig config,  String publisherId,  List<SnWebArticle> articles,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebFeed() when $default != null: | ||||||
|  | return $default(_that.id,_that.url,_that.title,_that.description,_that.preview,_that.config,_that.publisherId,_that.articles,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| @@ -456,6 +703,130 @@ $SnWebFeedCopyWith<$Res>? get feed { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [SnWebArticle]. | ||||||
|  | extension SnWebArticlePatterns on SnWebArticle { | ||||||
|  | /// 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( _SnWebArticle value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle() 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( _SnWebArticle value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle(): | ||||||
|  | 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( _SnWebArticle value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle() 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 title,  String url,  String? author,  Map<String, dynamic>? meta,  SnScrappedLink? preview,  SnWebFeed? feed,  String? content,  DateTime? publishedAt,  String feedId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle() when $default != null: | ||||||
|  | return $default(_that.id,_that.title,_that.url,_that.author,_that.meta,_that.preview,_that.feed,_that.content,_that.publishedAt,_that.feedId,_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 title,  String url,  String? author,  Map<String, dynamic>? meta,  SnScrappedLink? preview,  SnWebFeed? feed,  String? content,  DateTime? publishedAt,  String feedId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle(): | ||||||
|  | return $default(_that.id,_that.title,_that.url,_that.author,_that.meta,_that.preview,_that.feed,_that.content,_that.publishedAt,_that.feedId,_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 title,  String url,  String? author,  Map<String, dynamic>? meta,  SnScrappedLink? preview,  SnWebFeed? feed,  String? content,  DateTime? publishedAt,  String feedId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _SnWebArticle() when $default != null: | ||||||
|  | return $default(_that.id,_that.title,_that.url,_that.author,_that.meta,_that.preview,_that.feed,_that.content,_that.publishedAt,_that.feedId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,13 +4,13 @@ import 'package:island/models/webfeed.dart'; | |||||||
| import 'package:island/pods/network.dart'; | import 'package:island/pods/network.dart'; | ||||||
|  |  | ||||||
| /// Provider that fetches a single article by its ID | /// Provider that fetches a single article by its ID | ||||||
| final articleDetailProvider = FutureProvider.autoDispose.family<SnWebArticle, String>( | final articleDetailProvider = FutureProvider.autoDispose | ||||||
|   (ref, articleId) async { |     .family<SnWebArticle, String>((ref, articleId) async { | ||||||
|       final dio = ref.watch(apiClientProvider); |       final dio = ref.watch(apiClientProvider); | ||||||
|  |  | ||||||
|       try { |       try { | ||||||
|         final response = await dio.get<Map<String, dynamic>>( |         final response = await dio.get<Map<String, dynamic>>( | ||||||
|         '/feeds/articles/$articleId', |           '/sphere/feeds/articles/$articleId', | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         if (response.statusCode == 200 && response.data != null) { |         if (response.statusCode == 200 && response.data != null) { | ||||||
| @@ -27,5 +27,4 @@ final articleDetailProvider = FutureProvider.autoDispose.family<SnWebArticle, St | |||||||
|       } catch (e) { |       } catch (e) { | ||||||
|         throw Exception('Failed to load article: $e'); |         throw Exception('Failed to load article: $e'); | ||||||
|       } |       } | ||||||
|   }, |     }); | ||||||
| ); |  | ||||||
|   | |||||||
| @@ -1,13 +1,14 @@ | |||||||
| import 'package:island/pods/userinfo.dart'; | import 'dart:async'; | ||||||
| import 'package:island/screens/chat/chat.dart'; | import 'dart:developer'; | ||||||
|  | import 'dart:io'; | ||||||
|  | import 'package:flutter/foundation.dart'; | ||||||
|  | import 'package:flutter_webrtc/flutter_webrtc.dart'; | ||||||
| import 'package:island/widgets/chat/call_button.dart'; | import 'package:island/widgets/chat/call_button.dart'; | ||||||
| import 'package:livekit_client/livekit_client.dart'; | import 'package:livekit_client/livekit_client.dart'; | ||||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | import 'package:freezed_annotation/freezed_annotation.dart'; | ||||||
| import 'dart:async'; |  | ||||||
| import 'package:riverpod_annotation/riverpod_annotation.dart'; | import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||||||
| import 'package:island/pods/network.dart'; | import 'package:island/pods/network.dart'; | ||||||
| import 'package:island/models/chat.dart'; | import 'package:island/models/chat.dart'; | ||||||
| import 'package:island/pods/websocket.dart'; |  | ||||||
|  |  | ||||||
| part 'call.g.dart'; | part 'call.g.dart'; | ||||||
| part 'call.freezed.dart'; | part 'call.freezed.dart'; | ||||||
| @@ -27,6 +28,7 @@ sealed class CallState with _$CallState { | |||||||
|     required bool isMicrophoneEnabled, |     required bool isMicrophoneEnabled, | ||||||
|     required bool isCameraEnabled, |     required bool isCameraEnabled, | ||||||
|     required bool isScreenSharing, |     required bool isScreenSharing, | ||||||
|  |     required bool isSpeakerphone, | ||||||
|     @Default(Duration(seconds: 0)) Duration duration, |     @Default(Duration(seconds: 0)) Duration duration, | ||||||
|     String? error, |     String? error, | ||||||
|   }) = _CallState; |   }) = _CallState; | ||||||
| @@ -42,7 +44,8 @@ sealed class CallParticipantLive with _$CallParticipantLive { | |||||||
|   }) = _CallParticipantLive; |   }) = _CallParticipantLive; | ||||||
|  |  | ||||||
|   bool get isSpeaking => remoteParticipant.isSpeaking; |   bool get isSpeaking => remoteParticipant.isSpeaking; | ||||||
|   bool get isMuted => remoteParticipant.isMuted; |   bool get isMuted => | ||||||
|  |       remoteParticipant.isMuted || !remoteParticipant.isMicrophoneEnabled(); | ||||||
|   bool get isScreenSharing => remoteParticipant.isScreenShareEnabled(); |   bool get isScreenSharing => remoteParticipant.isScreenShareEnabled(); | ||||||
|   bool get isScreenSharingWithAudio => |   bool get isScreenSharingWithAudio => | ||||||
|       remoteParticipant.isScreenShareAudioEnabled(); |       remoteParticipant.isScreenShareAudioEnabled(); | ||||||
| @@ -57,13 +60,14 @@ class CallNotifier extends _$CallNotifier { | |||||||
|   LocalParticipant? _localParticipant; |   LocalParticipant? _localParticipant; | ||||||
|   List<CallParticipantLive> _participants = []; |   List<CallParticipantLive> _participants = []; | ||||||
|   final Map<String, CallParticipant> _participantInfoByIdentity = {}; |   final Map<String, CallParticipant> _participantInfoByIdentity = {}; | ||||||
|   StreamSubscription? _wsSubscription; |  | ||||||
|   EventsListener? _roomListener; |   EventsListener? _roomListener; | ||||||
|  |  | ||||||
|   List<CallParticipantLive> get participants => |   List<CallParticipantLive> get participants => | ||||||
|       List.unmodifiable(_participants); |       List.unmodifiable(_participants); | ||||||
|   LocalParticipant? get localParticipant => _localParticipant; |   LocalParticipant? get localParticipant => _localParticipant; | ||||||
|  |  | ||||||
|  |   Map<String, double> participantsVolumes = {}; | ||||||
|  |  | ||||||
|   Timer? _durationTimer; |   Timer? _durationTimer; | ||||||
|  |  | ||||||
|   Room? get room => _room; |   Room? get room => _room; | ||||||
| @@ -71,36 +75,15 @@ class CallNotifier extends _$CallNotifier { | |||||||
|   @override |   @override | ||||||
|   CallState build() { |   CallState build() { | ||||||
|     // Subscribe to websocket updates |     // Subscribe to websocket updates | ||||||
|     _subscribeToParticipantsUpdate(); |  | ||||||
|     return const CallState( |     return const CallState( | ||||||
|       isConnected: false, |       isConnected: false, | ||||||
|       isMicrophoneEnabled: true, |       isMicrophoneEnabled: true, | ||||||
|       isCameraEnabled: false, |       isCameraEnabled: false, | ||||||
|       isScreenSharing: false, |       isScreenSharing: false, | ||||||
|  |       isSpeakerphone: true, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   void _subscribeToParticipantsUpdate() { |  | ||||||
|     // Only subscribe once |  | ||||||
|     if (_wsSubscription != null) return; |  | ||||||
|     final ws = ref.read(websocketProvider); |  | ||||||
|     _wsSubscription = ws.dataStream.listen((packet) { |  | ||||||
|       if (packet.type == 'call.participants.update' && packet.data != null) { |  | ||||||
|         final participantsData = packet.data!["participants"]; |  | ||||||
|         if (participantsData is List) { |  | ||||||
|           final parsed = |  | ||||||
|               participantsData |  | ||||||
|                   .map( |  | ||||||
|                     (e) => |  | ||||||
|                         CallParticipant.fromJson(Map<String, dynamic>.from(e)), |  | ||||||
|                   ) |  | ||||||
|                   .toList(); |  | ||||||
|           _updateLiveParticipants(parsed); |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   void _initRoomListeners() { |   void _initRoomListeners() { | ||||||
|     if (_room == null) return; |     if (_room == null) return; | ||||||
|     _roomListener?.dispose(); |     _roomListener?.dispose(); | ||||||
| @@ -143,8 +126,6 @@ class CallNotifier extends _$CallNotifier { | |||||||
|               identity: remote.identity, |               identity: remote.identity, | ||||||
|               name: remote.identity, |               name: remote.identity, | ||||||
|               joinedAt: DateTime.now(), |               joinedAt: DateTime.now(), | ||||||
|               accountId: null, |  | ||||||
|               profile: null, |  | ||||||
|             ); |             ); | ||||||
|         return CallParticipantLive( |         return CallParticipantLive( | ||||||
|           participant: match, |           participant: match, | ||||||
| @@ -169,16 +150,12 @@ class CallNotifier extends _$CallNotifier { | |||||||
|       if (idx != -1) return participants[idx]; |       if (idx != -1) return participants[idx]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     final userInfo = ref.read(userInfoProvider); |  | ||||||
|     final roomIdentity = ref.read(chatroomIdentityProvider(_roomId)); |  | ||||||
|     // Otherwise, use info from the identity map or fallback to minimal |     // Otherwise, use info from the identity map or fallback to minimal | ||||||
|     return _participantInfoByIdentity[_localParticipant!.identity] ?? |     return _participantInfoByIdentity[_localParticipant!.identity] ?? | ||||||
|         CallParticipant( |         CallParticipant( | ||||||
|           identity: _localParticipant!.identity, |           identity: _localParticipant!.identity, | ||||||
|           name: _localParticipant!.identity, |           name: _localParticipant!.identity, | ||||||
|           joinedAt: DateTime.now(), |           joinedAt: DateTime.now(), | ||||||
|           accountId: userInfo.value?.id, |  | ||||||
|           profile: roomIdentity.value, |  | ||||||
|         ); |         ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -205,6 +182,7 @@ class CallNotifier extends _$CallNotifier { | |||||||
|           remoteParticipant: _localParticipant!, |           remoteParticipant: _localParticipant!, | ||||||
|         ), |         ), | ||||||
|       ); |       ); | ||||||
|  |       state = state.copyWith(); | ||||||
|     } |     } | ||||||
|     // Add remote participants |     // Add remote participants | ||||||
|     _participants.addAll( |     _participants.addAll( | ||||||
| @@ -233,7 +211,13 @@ class CallNotifier extends _$CallNotifier { | |||||||
|  |  | ||||||
|   Future<void> joinRoom(String roomId) async { |   Future<void> joinRoom(String roomId) async { | ||||||
|     if (_roomId == roomId && _room != null) { |     if (_roomId == roomId && _room != null) { | ||||||
|  |       log('[Call] Call skipped. Already has data'); | ||||||
|       return; |       return; | ||||||
|  |     } else if (_room != null) { | ||||||
|  |       if (!_room!.isDisposed && | ||||||
|  |           _room!.connectionState != ConnectionState.disconnected) { | ||||||
|  |         throw Exception('Call already connected'); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     _roomId = roomId; |     _roomId = roomId; | ||||||
|     if (_room != null) { |     if (_room != null) { | ||||||
| @@ -246,7 +230,9 @@ class CallNotifier extends _$CallNotifier { | |||||||
|     try { |     try { | ||||||
|       final apiClient = ref.read(apiClientProvider); |       final apiClient = ref.read(apiClientProvider); | ||||||
|       final ongoingCall = await ref.read(ongoingCallProvider(roomId).future); |       final ongoingCall = await ref.read(ongoingCallProvider(roomId).future); | ||||||
|       final response = await apiClient.get('/chat/realtime/$roomId/join'); |       final response = await apiClient.get( | ||||||
|  |         '/sphere/chat/realtime/$roomId/join', | ||||||
|  |       ); | ||||||
|       if (response.statusCode == 200 && response.data != null) { |       if (response.statusCode == 200 && response.data != null) { | ||||||
|         final data = response.data; |         final data = response.data; | ||||||
|         // Parse join response |         // Parse join response | ||||||
| @@ -262,7 +248,8 @@ class CallNotifier extends _$CallNotifier { | |||||||
|             duration: Duration( |             duration: Duration( | ||||||
|               milliseconds: |               milliseconds: | ||||||
|                   (DateTime.now().millisecondsSinceEpoch - |                   (DateTime.now().millisecondsSinceEpoch - | ||||||
|                       (ongoingCall?.createdAt.millisecondsSinceEpoch ?? 0)), |                       (ongoingCall?.createdAt.millisecondsSinceEpoch ?? | ||||||
|  |                           DateTime.now().millisecondsSinceEpoch)), | ||||||
|             ), |             ), | ||||||
|           ); |           ); | ||||||
|         }); |         }); | ||||||
| @@ -284,6 +271,10 @@ class CallNotifier extends _$CallNotifier { | |||||||
|         _initRoomListeners(); |         _initRoomListeners(); | ||||||
|         _updateLiveParticipants(participants); |         _updateLiveParticipants(participants); | ||||||
|  |  | ||||||
|  |         if (!kIsWeb && (Platform.isIOS || Platform.isAndroid)) { | ||||||
|  |           Hardware.instance.setSpeakerphoneOn(true); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // Listen for connection updates |         // Listen for connection updates | ||||||
|         _room!.addListener(() { |         _room!.addListener(() { | ||||||
|           state = state.copyWith( |           state = state.copyWith( | ||||||
| @@ -316,6 +307,7 @@ class CallNotifier extends _$CallNotifier { | |||||||
|           stopOnMute: autostop, |           stopOnMute: autostop, | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
|  |       state = state.copyWith(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -324,6 +316,7 @@ class CallNotifier extends _$CallNotifier { | |||||||
|       final target = !_localParticipant!.isCameraEnabled(); |       final target = !_localParticipant!.isCameraEnabled(); | ||||||
|       state = state.copyWith(isCameraEnabled: target); |       state = state.copyWith(isCameraEnabled: target); | ||||||
|       await _localParticipant!.setCameraEnabled(target); |       await _localParticipant!.setCameraEnabled(target); | ||||||
|  |       state = state.copyWith(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -332,9 +325,16 @@ class CallNotifier extends _$CallNotifier { | |||||||
|       final target = !_localParticipant!.isScreenShareEnabled(); |       final target = !_localParticipant!.isScreenShareEnabled(); | ||||||
|       state = state.copyWith(isScreenSharing: target); |       state = state.copyWith(isScreenSharing: target); | ||||||
|       await _localParticipant!.setScreenShareEnabled(target); |       await _localParticipant!.setScreenShareEnabled(target); | ||||||
|  |       state = state.copyWith(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   Future<void> toggleSpeakerphone() async { | ||||||
|  |     state = state.copyWith(isSpeakerphone: !state.isSpeakerphone); | ||||||
|  |     await Hardware.instance.setSpeakerphoneOn(state.isSpeakerphone); | ||||||
|  |     state = state.copyWith(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   Future<void> disconnect() async { |   Future<void> disconnect() async { | ||||||
|     if (_room != null) { |     if (_room != null) { | ||||||
|       await _room!.disconnect(); |       await _room!.disconnect(); | ||||||
| @@ -347,11 +347,39 @@ class CallNotifier extends _$CallNotifier { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   void setParticipantVolume(CallParticipantLive live, double volume) { | ||||||
|  |     if (participantsVolumes[live.remoteParticipant.sid] == null) { | ||||||
|  |       participantsVolumes[live.remoteParticipant.sid] = 1; | ||||||
|  |     } | ||||||
|  |     Helper.setVolume( | ||||||
|  |       volume, | ||||||
|  |       live | ||||||
|  |           .remoteParticipant | ||||||
|  |           .audioTrackPublications | ||||||
|  |           .first | ||||||
|  |           .track! | ||||||
|  |           .mediaStreamTrack, | ||||||
|  |     ); | ||||||
|  |     participantsVolumes[live.remoteParticipant.sid] = volume; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   double getParticipantVolume(CallParticipantLive live) { | ||||||
|  |     return participantsVolumes[live.remoteParticipant.sid] ?? 1; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   void dispose() { |   void dispose() { | ||||||
|     _wsSubscription?.cancel(); |     state = state.copyWith( | ||||||
|  |       error: null, | ||||||
|  |       isConnected: false, | ||||||
|  |       isMicrophoneEnabled: false, | ||||||
|  |       isCameraEnabled: false, | ||||||
|  |       isScreenSharing: false, | ||||||
|  |     ); | ||||||
|     _roomListener?.dispose(); |     _roomListener?.dispose(); | ||||||
|     _room?.removeListener(_onRoomChange); |     _room?.removeListener(_onRoomChange); | ||||||
|     _room?.dispose(); |     _room?.dispose(); | ||||||
|     _durationTimer?.cancel(); |     _durationTimer?.cancel(); | ||||||
|  |     _roomId = null; | ||||||
|  |     participantsVolumes = {}; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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,9 +12,9 @@ part of 'call.dart'; | |||||||
| // dart format off | // dart format off | ||||||
| T _$identity<T>(T value) => value; | T _$identity<T>(T value) => value; | ||||||
| /// @nodoc | /// @nodoc | ||||||
| mixin _$CallState { | mixin _$CallState implements DiagnosticableTreeMixin { | ||||||
|  |  | ||||||
|  bool get isConnected; bool get isMicrophoneEnabled; bool get isCameraEnabled; bool get isScreenSharing; Duration get duration; String? get error; |  bool get isConnected; bool get isMicrophoneEnabled; bool get isCameraEnabled; bool get isScreenSharing; bool get isSpeakerphone; Duration get duration; String? get error; | ||||||
| /// Create a copy of CallState | /// Create a copy of CallState | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @@ -23,19 +22,25 @@ mixin _$CallState { | |||||||
| $CallStateCopyWith<CallState> get copyWith => _$CallStateCopyWithImpl<CallState>(this as CallState, _$identity); | $CallStateCopyWith<CallState> get copyWith => _$CallStateCopyWithImpl<CallState>(this as CallState, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|  |   properties | ||||||
|  |     ..add(DiagnosticsProperty('type', 'CallState')) | ||||||
|  |     ..add(DiagnosticsProperty('isConnected', isConnected))..add(DiagnosticsProperty('isMicrophoneEnabled', isMicrophoneEnabled))..add(DiagnosticsProperty('isCameraEnabled', isCameraEnabled))..add(DiagnosticsProperty('isScreenSharing', isScreenSharing))..add(DiagnosticsProperty('isSpeakerphone', isSpeakerphone))..add(DiagnosticsProperty('duration', duration))..add(DiagnosticsProperty('error', error)); | ||||||
|  | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is CallState&&(identical(other.isConnected, isConnected) || other.isConnected == isConnected)&&(identical(other.isMicrophoneEnabled, isMicrophoneEnabled) || other.isMicrophoneEnabled == isMicrophoneEnabled)&&(identical(other.isCameraEnabled, isCameraEnabled) || other.isCameraEnabled == isCameraEnabled)&&(identical(other.isScreenSharing, isScreenSharing) || other.isScreenSharing == isScreenSharing)&&(identical(other.duration, duration) || other.duration == duration)&&(identical(other.error, error) || other.error == error)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is CallState&&(identical(other.isConnected, isConnected) || other.isConnected == isConnected)&&(identical(other.isMicrophoneEnabled, isMicrophoneEnabled) || other.isMicrophoneEnabled == isMicrophoneEnabled)&&(identical(other.isCameraEnabled, isCameraEnabled) || other.isCameraEnabled == isCameraEnabled)&&(identical(other.isScreenSharing, isScreenSharing) || other.isScreenSharing == isScreenSharing)&&(identical(other.isSpeakerphone, isSpeakerphone) || other.isSpeakerphone == isSpeakerphone)&&(identical(other.duration, duration) || other.duration == duration)&&(identical(other.error, error) || other.error == error)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hash(runtimeType,isConnected,isMicrophoneEnabled,isCameraEnabled,isScreenSharing,duration,error); | int get hashCode => Object.hash(runtimeType,isConnected,isMicrophoneEnabled,isCameraEnabled,isScreenSharing,isSpeakerphone,duration,error); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, duration: $duration, error: $error)'; |   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, isSpeakerphone: $isSpeakerphone, duration: $duration, error: $error)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -46,7 +51,7 @@ abstract mixin class $CallStateCopyWith<$Res>  { | |||||||
|   factory $CallStateCopyWith(CallState value, $Res Function(CallState) _then) = _$CallStateCopyWithImpl; |   factory $CallStateCopyWith(CallState value, $Res Function(CallState) _then) = _$CallStateCopyWithImpl; | ||||||
| @useResult | @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  bool isConnected, bool isMicrophoneEnabled, bool isCameraEnabled, bool isScreenSharing, Duration duration, String? error |  bool isConnected, bool isMicrophoneEnabled, bool isCameraEnabled, bool isScreenSharing, bool isSpeakerphone, Duration duration, String? error | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -63,12 +68,13 @@ class _$CallStateCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of CallState | /// Create a copy of CallState | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @pragma('vm:prefer-inline') @override $Res call({Object? isConnected = null,Object? isMicrophoneEnabled = null,Object? isCameraEnabled = null,Object? isScreenSharing = null,Object? duration = null,Object? error = freezed,}) { | @pragma('vm:prefer-inline') @override $Res call({Object? isConnected = null,Object? isMicrophoneEnabled = null,Object? isCameraEnabled = null,Object? isScreenSharing = null,Object? isSpeakerphone = null,Object? duration = null,Object? error = freezed,}) { | ||||||
|   return _then(_self.copyWith( |   return _then(_self.copyWith( | ||||||
| isConnected: null == isConnected ? _self.isConnected : isConnected // ignore: cast_nullable_to_non_nullable | isConnected: null == isConnected ? _self.isConnected : isConnected // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isMicrophoneEnabled: null == isMicrophoneEnabled ? _self.isMicrophoneEnabled : isMicrophoneEnabled // ignore: cast_nullable_to_non_nullable | as bool,isMicrophoneEnabled: null == isMicrophoneEnabled ? _self.isMicrophoneEnabled : isMicrophoneEnabled // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isCameraEnabled: null == isCameraEnabled ? _self.isCameraEnabled : isCameraEnabled // ignore: cast_nullable_to_non_nullable | as bool,isCameraEnabled: null == isCameraEnabled ? _self.isCameraEnabled : isCameraEnabled // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isScreenSharing: null == isScreenSharing ? _self.isScreenSharing : isScreenSharing // ignore: cast_nullable_to_non_nullable | as bool,isScreenSharing: null == isScreenSharing ? _self.isScreenSharing : isScreenSharing // ignore: cast_nullable_to_non_nullable | ||||||
|  | as bool,isSpeakerphone: null == isSpeakerphone ? _self.isSpeakerphone : isSpeakerphone // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,duration: null == duration ? _self.duration : duration // ignore: cast_nullable_to_non_nullable | as bool,duration: null == duration ? _self.duration : duration // ignore: cast_nullable_to_non_nullable | ||||||
| as Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | as Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | ||||||
| as String?, | as String?, | ||||||
| @@ -78,17 +84,142 @@ as String?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [CallState]. | ||||||
|  | extension CallStatePatterns on CallState { | ||||||
|  | /// 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( _CallState value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState() 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( _CallState value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState(): | ||||||
|  | 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( _CallState value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState() 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 isConnected,  bool isMicrophoneEnabled,  bool isCameraEnabled,  bool isScreenSharing,  bool isSpeakerphone,  Duration duration,  String? error)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState() when $default != null: | ||||||
|  | return $default(_that.isConnected,_that.isMicrophoneEnabled,_that.isCameraEnabled,_that.isScreenSharing,_that.isSpeakerphone,_that.duration,_that.error);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 isConnected,  bool isMicrophoneEnabled,  bool isCameraEnabled,  bool isScreenSharing,  bool isSpeakerphone,  Duration duration,  String? error)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState(): | ||||||
|  | return $default(_that.isConnected,_that.isMicrophoneEnabled,_that.isCameraEnabled,_that.isScreenSharing,_that.isSpeakerphone,_that.duration,_that.error);} | ||||||
|  | } | ||||||
|  | /// 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 isConnected,  bool isMicrophoneEnabled,  bool isCameraEnabled,  bool isScreenSharing,  bool isSpeakerphone,  Duration duration,  String? error)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallState() when $default != null: | ||||||
|  | return $default(_that.isConnected,_that.isMicrophoneEnabled,_that.isCameraEnabled,_that.isScreenSharing,_that.isSpeakerphone,_that.duration,_that.error);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
| class _CallState implements CallState { | class _CallState with DiagnosticableTreeMixin implements CallState { | ||||||
|   const _CallState({required this.isConnected, required this.isMicrophoneEnabled, required this.isCameraEnabled, required this.isScreenSharing, this.duration = const Duration(seconds: 0), this.error}); |   const _CallState({required this.isConnected, required this.isMicrophoneEnabled, required this.isCameraEnabled, required this.isScreenSharing, required this.isSpeakerphone, this.duration = const Duration(seconds: 0), this.error}); | ||||||
|    |    | ||||||
|  |  | ||||||
| @override final  bool isConnected; | @override final  bool isConnected; | ||||||
| @override final  bool isMicrophoneEnabled; | @override final  bool isMicrophoneEnabled; | ||||||
| @override final  bool isCameraEnabled; | @override final  bool isCameraEnabled; | ||||||
| @override final  bool isScreenSharing; | @override final  bool isScreenSharing; | ||||||
|  | @override final  bool isSpeakerphone; | ||||||
| @override@JsonKey() final  Duration duration; | @override@JsonKey() final  Duration duration; | ||||||
| @override final  String? error; | @override final  String? error; | ||||||
|  |  | ||||||
| @@ -99,19 +230,25 @@ class _CallState implements CallState { | |||||||
| _$CallStateCopyWith<_CallState> get copyWith => __$CallStateCopyWithImpl<_CallState>(this, _$identity); | _$CallStateCopyWith<_CallState> get copyWith => __$CallStateCopyWithImpl<_CallState>(this, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|  |   properties | ||||||
|  |     ..add(DiagnosticsProperty('type', 'CallState')) | ||||||
|  |     ..add(DiagnosticsProperty('isConnected', isConnected))..add(DiagnosticsProperty('isMicrophoneEnabled', isMicrophoneEnabled))..add(DiagnosticsProperty('isCameraEnabled', isCameraEnabled))..add(DiagnosticsProperty('isScreenSharing', isScreenSharing))..add(DiagnosticsProperty('isSpeakerphone', isSpeakerphone))..add(DiagnosticsProperty('duration', duration))..add(DiagnosticsProperty('error', error)); | ||||||
|  | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _CallState&&(identical(other.isConnected, isConnected) || other.isConnected == isConnected)&&(identical(other.isMicrophoneEnabled, isMicrophoneEnabled) || other.isMicrophoneEnabled == isMicrophoneEnabled)&&(identical(other.isCameraEnabled, isCameraEnabled) || other.isCameraEnabled == isCameraEnabled)&&(identical(other.isScreenSharing, isScreenSharing) || other.isScreenSharing == isScreenSharing)&&(identical(other.duration, duration) || other.duration == duration)&&(identical(other.error, error) || other.error == error)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is _CallState&&(identical(other.isConnected, isConnected) || other.isConnected == isConnected)&&(identical(other.isMicrophoneEnabled, isMicrophoneEnabled) || other.isMicrophoneEnabled == isMicrophoneEnabled)&&(identical(other.isCameraEnabled, isCameraEnabled) || other.isCameraEnabled == isCameraEnabled)&&(identical(other.isScreenSharing, isScreenSharing) || other.isScreenSharing == isScreenSharing)&&(identical(other.isSpeakerphone, isSpeakerphone) || other.isSpeakerphone == isSpeakerphone)&&(identical(other.duration, duration) || other.duration == duration)&&(identical(other.error, error) || other.error == error)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hash(runtimeType,isConnected,isMicrophoneEnabled,isCameraEnabled,isScreenSharing,duration,error); | int get hashCode => Object.hash(runtimeType,isConnected,isMicrophoneEnabled,isCameraEnabled,isScreenSharing,isSpeakerphone,duration,error); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, duration: $duration, error: $error)'; |   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, isSpeakerphone: $isSpeakerphone, duration: $duration, error: $error)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -122,7 +259,7 @@ abstract mixin class _$CallStateCopyWith<$Res> implements $CallStateCopyWith<$Re | |||||||
|   factory _$CallStateCopyWith(_CallState value, $Res Function(_CallState) _then) = __$CallStateCopyWithImpl; |   factory _$CallStateCopyWith(_CallState value, $Res Function(_CallState) _then) = __$CallStateCopyWithImpl; | ||||||
| @override @useResult | @override @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  bool isConnected, bool isMicrophoneEnabled, bool isCameraEnabled, bool isScreenSharing, Duration duration, String? error |  bool isConnected, bool isMicrophoneEnabled, bool isCameraEnabled, bool isScreenSharing, bool isSpeakerphone, Duration duration, String? error | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -139,12 +276,13 @@ class __$CallStateCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of CallState | /// Create a copy of CallState | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @override @pragma('vm:prefer-inline') $Res call({Object? isConnected = null,Object? isMicrophoneEnabled = null,Object? isCameraEnabled = null,Object? isScreenSharing = null,Object? duration = null,Object? error = freezed,}) { | @override @pragma('vm:prefer-inline') $Res call({Object? isConnected = null,Object? isMicrophoneEnabled = null,Object? isCameraEnabled = null,Object? isScreenSharing = null,Object? isSpeakerphone = null,Object? duration = null,Object? error = freezed,}) { | ||||||
|   return _then(_CallState( |   return _then(_CallState( | ||||||
| isConnected: null == isConnected ? _self.isConnected : isConnected // ignore: cast_nullable_to_non_nullable | isConnected: null == isConnected ? _self.isConnected : isConnected // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isMicrophoneEnabled: null == isMicrophoneEnabled ? _self.isMicrophoneEnabled : isMicrophoneEnabled // ignore: cast_nullable_to_non_nullable | as bool,isMicrophoneEnabled: null == isMicrophoneEnabled ? _self.isMicrophoneEnabled : isMicrophoneEnabled // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isCameraEnabled: null == isCameraEnabled ? _self.isCameraEnabled : isCameraEnabled // ignore: cast_nullable_to_non_nullable | as bool,isCameraEnabled: null == isCameraEnabled ? _self.isCameraEnabled : isCameraEnabled // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,isScreenSharing: null == isScreenSharing ? _self.isScreenSharing : isScreenSharing // ignore: cast_nullable_to_non_nullable | as bool,isScreenSharing: null == isScreenSharing ? _self.isScreenSharing : isScreenSharing // ignore: cast_nullable_to_non_nullable | ||||||
|  | as bool,isSpeakerphone: null == isSpeakerphone ? _self.isSpeakerphone : isSpeakerphone // ignore: cast_nullable_to_non_nullable | ||||||
| as bool,duration: null == duration ? _self.duration : duration // ignore: cast_nullable_to_non_nullable | as bool,duration: null == duration ? _self.duration : duration // ignore: cast_nullable_to_non_nullable | ||||||
| as Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | as Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | ||||||
| as String?, | as String?, | ||||||
| @@ -155,7 +293,7 @@ as String?, | |||||||
| } | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| mixin _$CallParticipantLive { | mixin _$CallParticipantLive implements DiagnosticableTreeMixin { | ||||||
|  |  | ||||||
|  CallParticipant get participant; Participant get remoteParticipant; |  CallParticipant get participant; Participant get remoteParticipant; | ||||||
| /// Create a copy of CallParticipantLive | /// Create a copy of CallParticipantLive | ||||||
| @@ -165,6 +303,12 @@ mixin _$CallParticipantLive { | |||||||
| $CallParticipantLiveCopyWith<CallParticipantLive> get copyWith => _$CallParticipantLiveCopyWithImpl<CallParticipantLive>(this as CallParticipantLive, _$identity); | $CallParticipantLiveCopyWith<CallParticipantLive> get copyWith => _$CallParticipantLiveCopyWithImpl<CallParticipantLive>(this as CallParticipantLive, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|  |   properties | ||||||
|  |     ..add(DiagnosticsProperty('type', 'CallParticipantLive')) | ||||||
|  |     ..add(DiagnosticsProperty('participant', participant))..add(DiagnosticsProperty('remoteParticipant', remoteParticipant)); | ||||||
|  | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
| @@ -176,7 +320,7 @@ bool operator ==(Object other) { | |||||||
| int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'CallParticipantLive(participant: $participant, remoteParticipant: $remoteParticipant)'; |   return 'CallParticipantLive(participant: $participant, remoteParticipant: $remoteParticipant)'; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -225,10 +369,134 @@ $CallParticipantCopyWith<$Res> get participant { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [CallParticipantLive]. | ||||||
|  | extension CallParticipantLivePatterns on CallParticipantLive { | ||||||
|  | /// 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( _CallParticipantLive value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive() 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( _CallParticipantLive value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive(): | ||||||
|  | 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( _CallParticipantLive value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive() 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( CallParticipant participant,  Participant remoteParticipant)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive() when $default != null: | ||||||
|  | return $default(_that.participant,_that.remoteParticipant);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( CallParticipant participant,  Participant remoteParticipant)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive(): | ||||||
|  | return $default(_that.participant,_that.remoteParticipant);} | ||||||
|  | } | ||||||
|  | /// 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( CallParticipant participant,  Participant remoteParticipant)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _CallParticipantLive() when $default != null: | ||||||
|  | return $default(_that.participant,_that.remoteParticipant);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
| class _CallParticipantLive extends CallParticipantLive { | class _CallParticipantLive extends CallParticipantLive with DiagnosticableTreeMixin { | ||||||
|   const _CallParticipantLive({required this.participant, required this.remoteParticipant}): super._(); |   const _CallParticipantLive({required this.participant, required this.remoteParticipant}): super._(); | ||||||
|    |    | ||||||
|  |  | ||||||
| @@ -242,6 +510,12 @@ class _CallParticipantLive extends CallParticipantLive { | |||||||
| _$CallParticipantLiveCopyWith<_CallParticipantLive> get copyWith => __$CallParticipantLiveCopyWithImpl<_CallParticipantLive>(this, _$identity); | _$CallParticipantLiveCopyWith<_CallParticipantLive> get copyWith => __$CallParticipantLiveCopyWithImpl<_CallParticipantLive>(this, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|  |   properties | ||||||
|  |     ..add(DiagnosticsProperty('type', 'CallParticipantLive')) | ||||||
|  |     ..add(DiagnosticsProperty('participant', participant))..add(DiagnosticsProperty('remoteParticipant', remoteParticipant)); | ||||||
|  | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
| @@ -253,7 +527,7 @@ bool operator ==(Object other) { | |||||||
| int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString() { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'CallParticipantLive(participant: $participant, remoteParticipant: $remoteParticipant)'; |   return 'CallParticipantLive(participant: $participant, remoteParticipant: $remoteParticipant)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'call.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$callNotifierHash() => r'47eaba43aa2af1a107725998f4a34af2c94fbc55'; | String _$callNotifierHash() => r'333a1cd566a339644c83932e15dae03f1c5cc24b'; | ||||||
|  |  | ||||||
| /// See also [CallNotifier]. | /// See also [CallNotifier]. | ||||||
| @ProviderFor(CallNotifier) | @ProviderFor(CallNotifier) | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ class ChatSummary extends _$ChatSummary { | |||||||
|   @override |   @override | ||||||
|   Future<Map<String, SnChatSummary>> build() async { |   Future<Map<String, SnChatSummary>> build() async { | ||||||
|     final client = ref.watch(apiClientProvider); |     final client = ref.watch(apiClientProvider); | ||||||
|     final resp = await client.get('/chat/summary'); |     final resp = await client.get('/sphere/chat/summary'); | ||||||
|  |  | ||||||
|     final Map<String, dynamic> data = resp.data; |     final Map<String, dynamic> data = resp.data; | ||||||
|     return data.map( |     return data.map( | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'chat_summary.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$chatSummaryHash() => r'19aad48b5fabb33a76b742400d3b738ceb81c40c'; | String _$chatSummaryHash() => r'87a10e4cefa37dc5fa8eadb175ef1b2bed6070bf'; | ||||||
|  |  | ||||||
| /// See also [ChatSummary]. | /// See also [ChatSummary]. | ||||||
| @ProviderFor(ChatSummary) | @ProviderFor(ChatSummary) | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ part 'config.g.dart'; | |||||||
|  |  | ||||||
| const kTokenPairStoreKey = 'dyn_user_tk'; | const kTokenPairStoreKey = 'dyn_user_tk'; | ||||||
|  |  | ||||||
| const kNetworkServerDefault = 'https://nt.solian.app'; | const kNetworkServerDefault = 'https://api.solian.app'; | ||||||
| const kNetworkServerStoreKey = 'app_server_url'; | const kNetworkServerStoreKey = 'app_server_url'; | ||||||
|  |  | ||||||
| const kAppbarTransparentStoreKey = 'app_bar_transparent'; | const kAppbarTransparentStoreKey = 'app_bar_transparent'; | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -81,6 +80,130 @@ as Size?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [AppSettings]. | ||||||
|  | extension AppSettingsPatterns on AppSettings { | ||||||
|  | /// 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( _AppSettings value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings() 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( _AppSettings value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings(): | ||||||
|  | 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( _AppSettings value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings() 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 autoTranslate,  bool soundEffects,  bool aprilFoolFeatures,  bool enterToSend,  bool appBarTransparent,  String? customFonts,  int? appColorScheme,  Size? windowSize)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings() when $default != null: | ||||||
|  | return $default(_that.autoTranslate,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.customFonts,_that.appColorScheme,_that.windowSize);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 autoTranslate,  bool soundEffects,  bool aprilFoolFeatures,  bool enterToSend,  bool appBarTransparent,  String? customFonts,  int? appColorScheme,  Size? windowSize)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings(): | ||||||
|  | return $default(_that.autoTranslate,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.customFonts,_that.appColorScheme,_that.windowSize);} | ||||||
|  | } | ||||||
|  | /// 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 autoTranslate,  bool soundEffects,  bool aprilFoolFeatures,  bool enterToSend,  bool appBarTransparent,  String? customFonts,  int? appColorScheme,  Size? windowSize)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _AppSettings() when $default != null: | ||||||
|  | return $default(_that.autoTranslate,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.customFonts,_that.appColorScheme,_that.windowSize);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -43,11 +43,9 @@ Future<List<SnEventCalendarEntry>> eventCalendar( | |||||||
|   EventCalendarQuery query, |   EventCalendarQuery query, | ||||||
| ) async { | ) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/accounts/${query.uname ?? 'me'}/calendar',  |   final resp = await client.get( | ||||||
|     queryParameters: { |     '/id/accounts/${query.uname ?? 'me'}/calendar', | ||||||
|       'year': query.year, |     queryParameters: {'year': query.year, 'month': query.month}, | ||||||
|       'month': query.month, |  | ||||||
|     }, |  | ||||||
|   ); |   ); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnEventCalendarEntry.fromJson(e)) |       .map((e) => SnEventCalendarEntry.fromJson(e)) | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'event_calendar.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$eventCalendarHash() => r'6f2454404fa8660b96334d654490e1a40ee53e10'; | String _$eventCalendarHash() => r'72232fc044ac3c99b855dca37ff2f06a64be0afb'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
|   | |||||||
| @@ -65,13 +65,12 @@ final apiClientProvider = Provider<Dio>((ref) { | |||||||
|   final serverUrl = ref.watch(serverUrlProvider); |   final serverUrl = ref.watch(serverUrlProvider); | ||||||
|   final dio = Dio( |   final dio = Dio( | ||||||
|     BaseOptions( |     BaseOptions( | ||||||
|       baseUrl: '$serverUrl/api', |       baseUrl: serverUrl, | ||||||
|       connectTimeout: const Duration(seconds: 10), |       connectTimeout: const Duration(seconds: 10), | ||||||
|       receiveTimeout: const Duration(seconds: 10), |       receiveTimeout: const Duration(seconds: 10), | ||||||
|       headers: { |       headers: { | ||||||
|         'Accept': 'application/json', |         'Accept': 'application/json', | ||||||
|         'Content-Type': 'application/json', |         'Content-Type': 'application/json', | ||||||
|         'X-Client': 'Solian', |  | ||||||
|       }, |       }, | ||||||
|     ), |     ), | ||||||
|   ); |   ); | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								lib/pods/translate.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								lib/pods/translate.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | import 'dart:convert'; | ||||||
|  | import 'dart:developer'; | ||||||
|  |  | ||||||
|  | import 'package:freezed_annotation/freezed_annotation.dart'; | ||||||
|  | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
|  | import 'package:island/pods/network.dart'; | ||||||
|  | import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||||||
|  | import 'package:flutter_langdetect/flutter_langdetect.dart' as langdetect; | ||||||
|  |  | ||||||
|  | part 'translate.freezed.dart'; | ||||||
|  | part 'translate.g.dart'; | ||||||
|  |  | ||||||
|  | @freezed | ||||||
|  | sealed class TranslateQuery with _$TranslateQuery { | ||||||
|  |   const factory TranslateQuery({required String text, required String lang}) = | ||||||
|  |       _TranslateQuery; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @riverpod | ||||||
|  | Future<String> translateString(Ref ref, TranslateQuery query) async { | ||||||
|  |   final client = ref.watch(apiClientProvider); | ||||||
|  |   final response = await client.post( | ||||||
|  |     '/sphere/translate', | ||||||
|  |     queryParameters: {'to': query.lang}, | ||||||
|  |     data: jsonEncode(query.text), | ||||||
|  |   ); | ||||||
|  |   return response.data as String; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @riverpod | ||||||
|  | String? detectStringLanguage(Ref ref, String text) { | ||||||
|  |   try { | ||||||
|  |     return langdetect.detectLangs(text).firstOrNull?.lang; | ||||||
|  |   } catch (err) { | ||||||
|  |     log('[Language] Unable to detect text\'s language: $text'); | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										268
									
								
								lib/pods/translate.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								lib/pods/translate.freezed.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | |||||||
|  | // 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 'translate.dart'; | ||||||
|  |  | ||||||
|  | // ************************************************************************** | ||||||
|  | // FreezedGenerator | ||||||
|  | // ************************************************************************** | ||||||
|  |  | ||||||
|  | // dart format off | ||||||
|  | T _$identity<T>(T value) => value; | ||||||
|  | /// @nodoc | ||||||
|  | mixin _$TranslateQuery { | ||||||
|  |  | ||||||
|  |  String get text; String get lang; | ||||||
|  | /// Create a copy of TranslateQuery | ||||||
|  | /// with the given fields replaced by the non-null parameter values. | ||||||
|  | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
|  | @pragma('vm:prefer-inline') | ||||||
|  | $TranslateQueryCopyWith<TranslateQuery> get copyWith => _$TranslateQueryCopyWithImpl<TranslateQuery>(this as TranslateQuery, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | bool operator ==(Object other) { | ||||||
|  |   return identical(this, other) || (other.runtimeType == runtimeType&&other is TranslateQuery&&(identical(other.text, text) || other.text == text)&&(identical(other.lang, lang) || other.lang == lang)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | int get hashCode => Object.hash(runtimeType,text,lang); | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | String toString() { | ||||||
|  |   return 'TranslateQuery(text: $text, lang: $lang)'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// @nodoc | ||||||
|  | abstract mixin class $TranslateQueryCopyWith<$Res>  { | ||||||
|  |   factory $TranslateQueryCopyWith(TranslateQuery value, $Res Function(TranslateQuery) _then) = _$TranslateQueryCopyWithImpl; | ||||||
|  | @useResult | ||||||
|  | $Res call({ | ||||||
|  |  String text, String lang | ||||||
|  | }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  | /// @nodoc | ||||||
|  | class _$TranslateQueryCopyWithImpl<$Res> | ||||||
|  |     implements $TranslateQueryCopyWith<$Res> { | ||||||
|  |   _$TranslateQueryCopyWithImpl(this._self, this._then); | ||||||
|  |  | ||||||
|  |   final TranslateQuery _self; | ||||||
|  |   final $Res Function(TranslateQuery) _then; | ||||||
|  |  | ||||||
|  | /// Create a copy of TranslateQuery | ||||||
|  | /// with the given fields replaced by the non-null parameter values. | ||||||
|  | @pragma('vm:prefer-inline') @override $Res call({Object? text = null,Object? lang = null,}) { | ||||||
|  |   return _then(_self.copyWith( | ||||||
|  | text: null == text ? _self.text : text // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String,lang: null == lang ? _self.lang : lang // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String, | ||||||
|  |   )); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [TranslateQuery]. | ||||||
|  | extension TranslateQueryPatterns on TranslateQuery { | ||||||
|  | /// 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( _TranslateQuery value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery() 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( _TranslateQuery value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery(): | ||||||
|  | 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( _TranslateQuery value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery() 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 text,  String lang)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery() when $default != null: | ||||||
|  | return $default(_that.text,_that.lang);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 text,  String lang)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery(): | ||||||
|  | return $default(_that.text,_that.lang);} | ||||||
|  | } | ||||||
|  | /// 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 text,  String lang)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _TranslateQuery() when $default != null: | ||||||
|  | return $default(_that.text,_that.lang);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class _TranslateQuery implements TranslateQuery { | ||||||
|  |   const _TranslateQuery({required this.text, required this.lang}); | ||||||
|  |    | ||||||
|  |  | ||||||
|  | @override final  String text; | ||||||
|  | @override final  String lang; | ||||||
|  |  | ||||||
|  | /// Create a copy of TranslateQuery | ||||||
|  | /// with the given fields replaced by the non-null parameter values. | ||||||
|  | @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
|  | @pragma('vm:prefer-inline') | ||||||
|  | _$TranslateQueryCopyWith<_TranslateQuery> get copyWith => __$TranslateQueryCopyWithImpl<_TranslateQuery>(this, _$identity); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | bool operator ==(Object other) { | ||||||
|  |   return identical(this, other) || (other.runtimeType == runtimeType&&other is _TranslateQuery&&(identical(other.text, text) || other.text == text)&&(identical(other.lang, lang) || other.lang == lang)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | int get hashCode => Object.hash(runtimeType,text,lang); | ||||||
|  |  | ||||||
|  | @override | ||||||
|  | String toString() { | ||||||
|  |   return 'TranslateQuery(text: $text, lang: $lang)'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// @nodoc | ||||||
|  | abstract mixin class _$TranslateQueryCopyWith<$Res> implements $TranslateQueryCopyWith<$Res> { | ||||||
|  |   factory _$TranslateQueryCopyWith(_TranslateQuery value, $Res Function(_TranslateQuery) _then) = __$TranslateQueryCopyWithImpl; | ||||||
|  | @override @useResult | ||||||
|  | $Res call({ | ||||||
|  |  String text, String lang | ||||||
|  | }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  | /// @nodoc | ||||||
|  | class __$TranslateQueryCopyWithImpl<$Res> | ||||||
|  |     implements _$TranslateQueryCopyWith<$Res> { | ||||||
|  |   __$TranslateQueryCopyWithImpl(this._self, this._then); | ||||||
|  |  | ||||||
|  |   final _TranslateQuery _self; | ||||||
|  |   final $Res Function(_TranslateQuery) _then; | ||||||
|  |  | ||||||
|  | /// Create a copy of TranslateQuery | ||||||
|  | /// with the given fields replaced by the non-null parameter values. | ||||||
|  | @override @pragma('vm:prefer-inline') $Res call({Object? text = null,Object? lang = null,}) { | ||||||
|  |   return _then(_TranslateQuery( | ||||||
|  | text: null == text ? _self.text : text // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String,lang: null == lang ? _self.lang : lang // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String, | ||||||
|  |   )); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // dart format on | ||||||
							
								
								
									
										274
									
								
								lib/pods/translate.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								lib/pods/translate.g.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,274 @@ | |||||||
|  | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  |  | ||||||
|  | part of 'translate.dart'; | ||||||
|  |  | ||||||
|  | // ************************************************************************** | ||||||
|  | // RiverpodGenerator | ||||||
|  | // ************************************************************************** | ||||||
|  |  | ||||||
|  | String _$translateStringHash() => r'51d638cf07cbf3ffa9469298f5bd9c667bc0ccb7'; | ||||||
|  |  | ||||||
|  | /// Copied from Dart SDK | ||||||
|  | class _SystemHash { | ||||||
|  |   _SystemHash._(); | ||||||
|  |  | ||||||
|  |   static int combine(int hash, int value) { | ||||||
|  |     // ignore: parameter_assignments | ||||||
|  |     hash = 0x1fffffff & (hash + value); | ||||||
|  |     // ignore: parameter_assignments | ||||||
|  |     hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); | ||||||
|  |     return hash ^ (hash >> 6); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static int finish(int hash) { | ||||||
|  |     // ignore: parameter_assignments | ||||||
|  |     hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); | ||||||
|  |     // ignore: parameter_assignments | ||||||
|  |     hash = hash ^ (hash >> 11); | ||||||
|  |     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// See also [translateString]. | ||||||
|  | @ProviderFor(translateString) | ||||||
|  | const translateStringProvider = TranslateStringFamily(); | ||||||
|  |  | ||||||
|  | /// See also [translateString]. | ||||||
|  | class TranslateStringFamily extends Family<AsyncValue<String>> { | ||||||
|  |   /// See also [translateString]. | ||||||
|  |   const TranslateStringFamily(); | ||||||
|  |  | ||||||
|  |   /// See also [translateString]. | ||||||
|  |   TranslateStringProvider call(TranslateQuery query) { | ||||||
|  |     return TranslateStringProvider(query); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   TranslateStringProvider getProviderOverride( | ||||||
|  |     covariant TranslateStringProvider provider, | ||||||
|  |   ) { | ||||||
|  |     return call(provider.query); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static const Iterable<ProviderOrFamily>? _dependencies = null; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Iterable<ProviderOrFamily>? get dependencies => _dependencies; | ||||||
|  |  | ||||||
|  |   static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Iterable<ProviderOrFamily>? get allTransitiveDependencies => | ||||||
|  |       _allTransitiveDependencies; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String? get name => r'translateStringProvider'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// See also [translateString]. | ||||||
|  | class TranslateStringProvider extends AutoDisposeFutureProvider<String> { | ||||||
|  |   /// See also [translateString]. | ||||||
|  |   TranslateStringProvider(TranslateQuery query) | ||||||
|  |     : this._internal( | ||||||
|  |         (ref) => translateString(ref as TranslateStringRef, query), | ||||||
|  |         from: translateStringProvider, | ||||||
|  |         name: r'translateStringProvider', | ||||||
|  |         debugGetCreateSourceHash: | ||||||
|  |             const bool.fromEnvironment('dart.vm.product') | ||||||
|  |                 ? null | ||||||
|  |                 : _$translateStringHash, | ||||||
|  |         dependencies: TranslateStringFamily._dependencies, | ||||||
|  |         allTransitiveDependencies: | ||||||
|  |             TranslateStringFamily._allTransitiveDependencies, | ||||||
|  |         query: query, | ||||||
|  |       ); | ||||||
|  |  | ||||||
|  |   TranslateStringProvider._internal( | ||||||
|  |     super._createNotifier, { | ||||||
|  |     required super.name, | ||||||
|  |     required super.dependencies, | ||||||
|  |     required super.allTransitiveDependencies, | ||||||
|  |     required super.debugGetCreateSourceHash, | ||||||
|  |     required super.from, | ||||||
|  |     required this.query, | ||||||
|  |   }) : super.internal(); | ||||||
|  |  | ||||||
|  |   final TranslateQuery query; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Override overrideWith( | ||||||
|  |     FutureOr<String> Function(TranslateStringRef provider) create, | ||||||
|  |   ) { | ||||||
|  |     return ProviderOverride( | ||||||
|  |       origin: this, | ||||||
|  |       override: TranslateStringProvider._internal( | ||||||
|  |         (ref) => create(ref as TranslateStringRef), | ||||||
|  |         from: from, | ||||||
|  |         name: null, | ||||||
|  |         dependencies: null, | ||||||
|  |         allTransitiveDependencies: null, | ||||||
|  |         debugGetCreateSourceHash: null, | ||||||
|  |         query: query, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   AutoDisposeFutureProviderElement<String> createElement() { | ||||||
|  |     return _TranslateStringProviderElement(this); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   bool operator ==(Object other) { | ||||||
|  |     return other is TranslateStringProvider && other.query == query; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   int get hashCode { | ||||||
|  |     var hash = _SystemHash.combine(0, runtimeType.hashCode); | ||||||
|  |     hash = _SystemHash.combine(hash, query.hashCode); | ||||||
|  |  | ||||||
|  |     return _SystemHash.finish(hash); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
|  | // ignore: unused_element | ||||||
|  | mixin TranslateStringRef on AutoDisposeFutureProviderRef<String> { | ||||||
|  |   /// The parameter `query` of this provider. | ||||||
|  |   TranslateQuery get query; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _TranslateStringProviderElement | ||||||
|  |     extends AutoDisposeFutureProviderElement<String> | ||||||
|  |     with TranslateStringRef { | ||||||
|  |   _TranslateStringProviderElement(super.provider); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   TranslateQuery get query => (origin as TranslateStringProvider).query; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | String _$detectStringLanguageHash() => | ||||||
|  |     r'697b68464b3d00927cc43ccc1ba8ba93f2a470ed'; | ||||||
|  |  | ||||||
|  | /// See also [detectStringLanguage]. | ||||||
|  | @ProviderFor(detectStringLanguage) | ||||||
|  | const detectStringLanguageProvider = DetectStringLanguageFamily(); | ||||||
|  |  | ||||||
|  | /// See also [detectStringLanguage]. | ||||||
|  | class DetectStringLanguageFamily extends Family<String?> { | ||||||
|  |   /// See also [detectStringLanguage]. | ||||||
|  |   const DetectStringLanguageFamily(); | ||||||
|  |  | ||||||
|  |   /// See also [detectStringLanguage]. | ||||||
|  |   DetectStringLanguageProvider call(String text) { | ||||||
|  |     return DetectStringLanguageProvider(text); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   DetectStringLanguageProvider getProviderOverride( | ||||||
|  |     covariant DetectStringLanguageProvider provider, | ||||||
|  |   ) { | ||||||
|  |     return call(provider.text); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static const Iterable<ProviderOrFamily>? _dependencies = null; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Iterable<ProviderOrFamily>? get dependencies => _dependencies; | ||||||
|  |  | ||||||
|  |   static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Iterable<ProviderOrFamily>? get allTransitiveDependencies => | ||||||
|  |       _allTransitiveDependencies; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String? get name => r'detectStringLanguageProvider'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// See also [detectStringLanguage]. | ||||||
|  | class DetectStringLanguageProvider extends AutoDisposeProvider<String?> { | ||||||
|  |   /// See also [detectStringLanguage]. | ||||||
|  |   DetectStringLanguageProvider(String text) | ||||||
|  |     : this._internal( | ||||||
|  |         (ref) => detectStringLanguage(ref as DetectStringLanguageRef, text), | ||||||
|  |         from: detectStringLanguageProvider, | ||||||
|  |         name: r'detectStringLanguageProvider', | ||||||
|  |         debugGetCreateSourceHash: | ||||||
|  |             const bool.fromEnvironment('dart.vm.product') | ||||||
|  |                 ? null | ||||||
|  |                 : _$detectStringLanguageHash, | ||||||
|  |         dependencies: DetectStringLanguageFamily._dependencies, | ||||||
|  |         allTransitiveDependencies: | ||||||
|  |             DetectStringLanguageFamily._allTransitiveDependencies, | ||||||
|  |         text: text, | ||||||
|  |       ); | ||||||
|  |  | ||||||
|  |   DetectStringLanguageProvider._internal( | ||||||
|  |     super._createNotifier, { | ||||||
|  |     required super.name, | ||||||
|  |     required super.dependencies, | ||||||
|  |     required super.allTransitiveDependencies, | ||||||
|  |     required super.debugGetCreateSourceHash, | ||||||
|  |     required super.from, | ||||||
|  |     required this.text, | ||||||
|  |   }) : super.internal(); | ||||||
|  |  | ||||||
|  |   final String text; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Override overrideWith( | ||||||
|  |     String? Function(DetectStringLanguageRef provider) create, | ||||||
|  |   ) { | ||||||
|  |     return ProviderOverride( | ||||||
|  |       origin: this, | ||||||
|  |       override: DetectStringLanguageProvider._internal( | ||||||
|  |         (ref) => create(ref as DetectStringLanguageRef), | ||||||
|  |         from: from, | ||||||
|  |         name: null, | ||||||
|  |         dependencies: null, | ||||||
|  |         allTransitiveDependencies: null, | ||||||
|  |         debugGetCreateSourceHash: null, | ||||||
|  |         text: text, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   AutoDisposeProviderElement<String?> createElement() { | ||||||
|  |     return _DetectStringLanguageProviderElement(this); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   bool operator ==(Object other) { | ||||||
|  |     return other is DetectStringLanguageProvider && other.text == text; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   int get hashCode { | ||||||
|  |     var hash = _SystemHash.combine(0, runtimeType.hashCode); | ||||||
|  |     hash = _SystemHash.combine(hash, text.hashCode); | ||||||
|  |  | ||||||
|  |     return _SystemHash.finish(hash); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
|  | // ignore: unused_element | ||||||
|  | mixin DetectStringLanguageRef on AutoDisposeProviderRef<String?> { | ||||||
|  |   /// The parameter `text` of this provider. | ||||||
|  |   String get text; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _DetectStringLanguageProviderElement | ||||||
|  |     extends AutoDisposeProviderElement<String?> | ||||||
|  |     with DetectStringLanguageRef { | ||||||
|  |   _DetectStringLanguageProviderElement(super.provider); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String get text => (origin as DetectStringLanguageProvider).text; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ignore_for_file: type=lint | ||||||
|  | // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package | ||||||
| @@ -14,7 +14,7 @@ class UserInfoNotifier extends StateNotifier<AsyncValue<SnAccount?>> { | |||||||
|   Future<void> fetchUser() async { |   Future<void> fetchUser() async { | ||||||
|     try { |     try { | ||||||
|       final client = _ref.read(apiClientProvider); |       final client = _ref.read(apiClientProvider); | ||||||
|       final response = await client.get('/accounts/me'); |       final response = await client.get('/id/accounts/me'); | ||||||
|       final user = SnAccount.fromJson(response.data); |       final user = SnAccount.fromJson(response.data); | ||||||
|       state = AsyncValue.data(user); |       state = AsyncValue.data(user); | ||||||
|     } catch (error, stackTrace) { |     } catch (error, stackTrace) { | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ final webFeedListProvider = FutureProvider.family<List<SnWebFeed>, String>(( | |||||||
|   pubName, |   pubName, | ||||||
| ) async { | ) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final response = await client.get('/publishers/$pubName/feeds'); |   final response = await client.get('/sphere/publishers/$pubName/feeds'); | ||||||
|   return (response.data as List) |   return (response.data as List) | ||||||
|       .map((json) => SnWebFeed.fromJson(json)) |       .map((json) => SnWebFeed.fromJson(json)) | ||||||
|       .toList(); |       .toList(); | ||||||
| @@ -39,7 +39,7 @@ class WebFeedNotifier | |||||||
|     try { |     try { | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       final response = await client.get( |       final response = await client.get( | ||||||
|         '/publishers/${arg.pubName}/feeds/${arg.feedId}', |         '/sphere/publishers/${arg.pubName}/feeds/${arg.feedId}', | ||||||
|       ); |       ); | ||||||
|       return SnWebFeed.fromJson(response.data); |       return SnWebFeed.fromJson(response.data); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
| @@ -51,7 +51,7 @@ class WebFeedNotifier | |||||||
|     state = const AsyncValue.loading(); |     state = const AsyncValue.loading(); | ||||||
|     try { |     try { | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       final url = '/publishers/${feed.publisherId}/feeds'; |       final url = '/sphere/publishers/${feed.publisherId}/feeds'; | ||||||
|  |  | ||||||
|       final response = |       final response = | ||||||
|           feed.id.isEmpty |           feed.id.isEmpty | ||||||
| @@ -72,7 +72,7 @@ class WebFeedNotifier | |||||||
|     state = const AsyncValue.loading(); |     state = const AsyncValue.loading(); | ||||||
|     try { |     try { | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       await client.delete('/publishers/${arg.pubName}/feeds/$feedId'); |       await client.delete('/sphere/publishers/${arg.pubName}/feeds/$feedId'); | ||||||
|       state = AsyncValue.data( |       state = AsyncValue.data( | ||||||
|         SnWebFeed( |         SnWebFeed( | ||||||
|           id: '', |           id: '', | ||||||
| @@ -98,7 +98,7 @@ class WebFeedNotifier | |||||||
|     try { |     try { | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       await client.post( |       await client.post( | ||||||
|         '/publishers/${arg.pubName}/feeds/$feedId/scrap', |         '/sphere/publishers/${arg.pubName}/feeds/$feedId/scrap', | ||||||
|         options: Options( |         options: Options( | ||||||
|           sendTimeout: const Duration(seconds: 60), |           sendTimeout: const Duration(seconds: 60), | ||||||
|           receiveTimeout: const Duration(seconds: 180), |           receiveTimeout: const Duration(seconds: 180), | ||||||
| @@ -107,7 +107,7 @@ class WebFeedNotifier | |||||||
|  |  | ||||||
|       // Reload the feed |       // Reload the feed | ||||||
|       final response = await client.get( |       final response = await client.get( | ||||||
|         '/publishers/${arg.pubName}/feeds/$feedId', |         '/sphere/publishers/${arg.pubName}/feeds/$feedId', | ||||||
|       ); |       ); | ||||||
|       state = AsyncValue.data(SnWebFeed.fromJson(response.data)); |       state = AsyncValue.data(SnWebFeed.fromJson(response.data)); | ||||||
|     } catch (error, stackTrace) { |     } catch (error, stackTrace) { | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ sealed class WebSocketPacket with _$WebSocketPacket { | |||||||
|   const factory WebSocketPacket({ |   const factory WebSocketPacket({ | ||||||
|     required String type, |     required String type, | ||||||
|     required Map<String, dynamic>? data, |     required Map<String, dynamic>? data, | ||||||
|  |     String? endpoint, | ||||||
|     String? errorMessage, |     String? errorMessage, | ||||||
|   }) = _WebSocketPacket; |   }) = _WebSocketPacket; | ||||||
|  |  | ||||||
| @@ -45,6 +46,10 @@ class WebSocketService { | |||||||
|   final StreamController<WebSocketState> _statusStreamController = |   final StreamController<WebSocketState> _statusStreamController = | ||||||
|       StreamController<WebSocketState>.broadcast(); |       StreamController<WebSocketState>.broadcast(); | ||||||
|   Timer? _reconnectTimer; |   Timer? _reconnectTimer; | ||||||
|  |   Timer? _heartbeatTimer; | ||||||
|  |  | ||||||
|  |   DateTime? _heartbeatAt; | ||||||
|  |   Duration? _heartbeatDelay; | ||||||
|  |  | ||||||
|   Stream<WebSocketPacket> get dataStream => _streamController.stream; |   Stream<WebSocketPacket> get dataStream => _streamController.stream; | ||||||
|   Stream<WebSocketState> get statusStream => _statusStreamController.stream; |   Stream<WebSocketState> get statusStream => _statusStreamController.stream; | ||||||
| @@ -65,11 +70,12 @@ class WebSocketService { | |||||||
|       } else { |       } else { | ||||||
|         _channel = IOWebSocketChannel.connect( |         _channel = IOWebSocketChannel.connect( | ||||||
|           Uri.parse(url), |           Uri.parse(url), | ||||||
|           headers: {'Authorization': 'Bearer $token'}, |           headers: {'Authorization': 'AtField $token'}, | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
|       await _channel!.ready; |       await _channel!.ready; | ||||||
|       _statusStreamController.sink.add(WebSocketState.connected()); |       _statusStreamController.sink.add(WebSocketState.connected()); | ||||||
|  |       _scheduleHeartbeat(); | ||||||
|       _channel!.stream.listen( |       _channel!.stream.listen( | ||||||
|         (data) { |         (data) { | ||||||
|           final dataStr = |           final dataStr = | ||||||
| @@ -79,6 +85,13 @@ class WebSocketService { | |||||||
|           log( |           log( | ||||||
|             "[WebSocket] Received packet: ${packet.type} ${packet.errorMessage}", |             "[WebSocket] Received packet: ${packet.type} ${packet.errorMessage}", | ||||||
|           ); |           ); | ||||||
|  |           if (packet.type == 'pong' && _heartbeatAt != null) { | ||||||
|  |             var now = DateTime.now(); | ||||||
|  |             _heartbeatDelay = now.difference(_heartbeatAt!); | ||||||
|  |             log( | ||||||
|  |               "[WebSocket] Server respond last heartbeat for ${_heartbeatDelay!.inMilliseconds} ms", | ||||||
|  |             ); | ||||||
|  |           } | ||||||
|         }, |         }, | ||||||
|         onDone: () { |         onDone: () { | ||||||
|           log('[WebSocket] Connection closed, attempting to reconnect...'); |           log('[WebSocket] Connection closed, attempting to reconnect...'); | ||||||
| @@ -107,6 +120,19 @@ class WebSocketService { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   void _scheduleHeartbeat() { | ||||||
|  |     _heartbeatTimer?.cancel(); | ||||||
|  |     _heartbeatTimer = Timer.periodic(const Duration(seconds: 60), (_) { | ||||||
|  |       _beatTheHeart(); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void _beatTheHeart() { | ||||||
|  |     _heartbeatAt = DateTime.now(); | ||||||
|  |     log('[WebSocket] We\'re beating the heart! $_heartbeatAt'); | ||||||
|  |     sendMessage(jsonEncode(WebSocketPacket(type: 'ping', data: null))); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   WebSocketChannel? get ws => _channel; |   WebSocketChannel? get ws => _channel; | ||||||
|  |  | ||||||
|   void sendMessage(String message) { |   void sendMessage(String message) { | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -48,6 +47,148 @@ $WebSocketStateCopyWith(WebSocketState _, $Res Function(WebSocketState) __); | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [WebSocketState]. | ||||||
|  | extension WebSocketStatePatterns on WebSocketState { | ||||||
|  | /// 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( _Connected value)?  connected,TResult Function( _Connecting value)?  connecting,TResult Function( _Disconnected value)?  disconnected,TResult Function( _Error value)?  error,required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected() when connected != null: | ||||||
|  | return connected(_that);case _Connecting() when connecting != null: | ||||||
|  | return connecting(_that);case _Disconnected() when disconnected != null: | ||||||
|  | return disconnected(_that);case _Error() when error != null: | ||||||
|  | return error(_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( _Connected value)  connected,required TResult Function( _Connecting value)  connecting,required TResult Function( _Disconnected value)  disconnected,required TResult Function( _Error value)  error,}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected(): | ||||||
|  | return connected(_that);case _Connecting(): | ||||||
|  | return connecting(_that);case _Disconnected(): | ||||||
|  | return disconnected(_that);case _Error(): | ||||||
|  | return error(_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( _Connected value)?  connected,TResult? Function( _Connecting value)?  connecting,TResult? Function( _Disconnected value)?  disconnected,TResult? Function( _Error value)?  error,}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected() when connected != null: | ||||||
|  | return connected(_that);case _Connecting() when connecting != null: | ||||||
|  | return connecting(_that);case _Disconnected() when disconnected != null: | ||||||
|  | return disconnected(_that);case _Error() when error != null: | ||||||
|  | return error(_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()?  connected,TResult Function()?  connecting,TResult Function()?  disconnected,TResult Function( String message)?  error,required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected() when connected != null: | ||||||
|  | return connected();case _Connecting() when connecting != null: | ||||||
|  | return connecting();case _Disconnected() when disconnected != null: | ||||||
|  | return disconnected();case _Error() when error != null: | ||||||
|  | return error(_that.message);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()  connected,required TResult Function()  connecting,required TResult Function()  disconnected,required TResult Function( String message)  error,}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected(): | ||||||
|  | return connected();case _Connecting(): | ||||||
|  | return connecting();case _Disconnected(): | ||||||
|  | return disconnected();case _Error(): | ||||||
|  | return error(_that.message);} | ||||||
|  | } | ||||||
|  | /// 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()?  connected,TResult? Function()?  connecting,TResult? Function()?  disconnected,TResult? Function( String message)?  error,}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _Connected() when connected != null: | ||||||
|  | return connected();case _Connecting() when connecting != null: | ||||||
|  | return connecting();case _Disconnected() when disconnected != null: | ||||||
|  | return disconnected();case _Error() when error != null: | ||||||
|  | return error(_that.message);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -238,7 +379,7 @@ as String, | |||||||
| /// @nodoc | /// @nodoc | ||||||
| mixin _$WebSocketPacket implements DiagnosticableTreeMixin { | mixin _$WebSocketPacket implements DiagnosticableTreeMixin { | ||||||
|  |  | ||||||
|  String get type; Map<String, dynamic>? get data; String? get errorMessage; |  String get type; Map<String, dynamic>? get data; String? get endpoint; String? get errorMessage; | ||||||
| /// Create a copy of WebSocketPacket | /// Create a copy of WebSocketPacket | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @@ -252,21 +393,21 @@ $WebSocketPacketCopyWith<WebSocketPacket> get copyWith => _$WebSocketPacketCopyW | |||||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|   properties |   properties | ||||||
|     ..add(DiagnosticsProperty('type', 'WebSocketPacket')) |     ..add(DiagnosticsProperty('type', 'WebSocketPacket')) | ||||||
|     ..add(DiagnosticsProperty('type', type))..add(DiagnosticsProperty('data', data))..add(DiagnosticsProperty('errorMessage', errorMessage)); |     ..add(DiagnosticsProperty('type', type))..add(DiagnosticsProperty('data', data))..add(DiagnosticsProperty('endpoint', endpoint))..add(DiagnosticsProperty('errorMessage', errorMessage)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is WebSocketPacket&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is WebSocketPacket&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.endpoint, endpoint) || other.endpoint == endpoint)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(data),errorMessage); | int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(data),endpoint,errorMessage); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'WebSocketPacket(type: $type, data: $data, errorMessage: $errorMessage)'; |   return 'WebSocketPacket(type: $type, data: $data, endpoint: $endpoint, errorMessage: $errorMessage)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -277,7 +418,7 @@ abstract mixin class $WebSocketPacketCopyWith<$Res>  { | |||||||
|   factory $WebSocketPacketCopyWith(WebSocketPacket value, $Res Function(WebSocketPacket) _then) = _$WebSocketPacketCopyWithImpl; |   factory $WebSocketPacketCopyWith(WebSocketPacket value, $Res Function(WebSocketPacket) _then) = _$WebSocketPacketCopyWithImpl; | ||||||
| @useResult | @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  String type, Map<String, dynamic>? data, String? errorMessage |  String type, Map<String, dynamic>? data, String? endpoint, String? errorMessage | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -294,11 +435,12 @@ class _$WebSocketPacketCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of WebSocketPacket | /// Create a copy of WebSocketPacket | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? data = freezed,Object? errorMessage = freezed,}) { | @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? data = freezed,Object? endpoint = freezed,Object? errorMessage = freezed,}) { | ||||||
|   return _then(_self.copyWith( |   return _then(_self.copyWith( | ||||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||||
| as String,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | as String,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||||
| as Map<String, dynamic>?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable | as Map<String, dynamic>?,endpoint: freezed == endpoint ? _self.endpoint : endpoint // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable | ||||||
| as String?, | as String?, | ||||||
|   )); |   )); | ||||||
| } | } | ||||||
| @@ -306,11 +448,135 @@ as String?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [WebSocketPacket]. | ||||||
|  | extension WebSocketPacketPatterns on WebSocketPacket { | ||||||
|  | /// 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( _WebSocketPacket value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket() 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( _WebSocketPacket value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket(): | ||||||
|  | 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( _WebSocketPacket value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket() 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,  Map<String, dynamic>? data,  String? endpoint,  String? errorMessage)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket() when $default != null: | ||||||
|  | return $default(_that.type,_that.data,_that.endpoint,_that.errorMessage);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,  Map<String, dynamic>? data,  String? endpoint,  String? errorMessage)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket(): | ||||||
|  | return $default(_that.type,_that.data,_that.endpoint,_that.errorMessage);} | ||||||
|  | } | ||||||
|  | /// 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,  Map<String, dynamic>? data,  String? endpoint,  String? errorMessage)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _WebSocketPacket() when $default != null: | ||||||
|  | return $default(_that.type,_that.data,_that.endpoint,_that.errorMessage);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
| @JsonSerializable() | @JsonSerializable() | ||||||
|  |  | ||||||
| class _WebSocketPacket with DiagnosticableTreeMixin implements WebSocketPacket { | class _WebSocketPacket with DiagnosticableTreeMixin implements WebSocketPacket { | ||||||
|   const _WebSocketPacket({required this.type, required final  Map<String, dynamic>? data, this.errorMessage}): _data = data; |   const _WebSocketPacket({required this.type, required final  Map<String, dynamic>? data, this.endpoint, this.errorMessage}): _data = data; | ||||||
|   factory _WebSocketPacket.fromJson(Map<String, dynamic> json) => _$WebSocketPacketFromJson(json); |   factory _WebSocketPacket.fromJson(Map<String, dynamic> json) => _$WebSocketPacketFromJson(json); | ||||||
|  |  | ||||||
| @override final  String type; | @override final  String type; | ||||||
| @@ -323,6 +589,7 @@ class _WebSocketPacket with DiagnosticableTreeMixin implements WebSocketPacket { | |||||||
|   return EqualUnmodifiableMapView(value); |   return EqualUnmodifiableMapView(value); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @override final  String? endpoint; | ||||||
| @override final  String? errorMessage; | @override final  String? errorMessage; | ||||||
|  |  | ||||||
| /// Create a copy of WebSocketPacket | /// Create a copy of WebSocketPacket | ||||||
| @@ -339,21 +606,21 @@ Map<String, dynamic> toJson() { | |||||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||||
|   properties |   properties | ||||||
|     ..add(DiagnosticsProperty('type', 'WebSocketPacket')) |     ..add(DiagnosticsProperty('type', 'WebSocketPacket')) | ||||||
|     ..add(DiagnosticsProperty('type', type))..add(DiagnosticsProperty('data', data))..add(DiagnosticsProperty('errorMessage', errorMessage)); |     ..add(DiagnosticsProperty('type', type))..add(DiagnosticsProperty('data', data))..add(DiagnosticsProperty('endpoint', endpoint))..add(DiagnosticsProperty('errorMessage', errorMessage)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @override | @override | ||||||
| bool operator ==(Object other) { | bool operator ==(Object other) { | ||||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _WebSocketPacket&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._data, _data)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)); |   return identical(this, other) || (other.runtimeType == runtimeType&&other is _WebSocketPacket&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._data, _data)&&(identical(other.endpoint, endpoint) || other.endpoint == endpoint)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @JsonKey(includeFromJson: false, includeToJson: false) | @JsonKey(includeFromJson: false, includeToJson: false) | ||||||
| @override | @override | ||||||
| int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(_data),errorMessage); | int get hashCode => Object.hash(runtimeType,type,const DeepCollectionEquality().hash(_data),endpoint,errorMessage); | ||||||
|  |  | ||||||
| @override | @override | ||||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||||
|   return 'WebSocketPacket(type: $type, data: $data, errorMessage: $errorMessage)'; |   return 'WebSocketPacket(type: $type, data: $data, endpoint: $endpoint, errorMessage: $errorMessage)'; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -364,7 +631,7 @@ abstract mixin class _$WebSocketPacketCopyWith<$Res> implements $WebSocketPacket | |||||||
|   factory _$WebSocketPacketCopyWith(_WebSocketPacket value, $Res Function(_WebSocketPacket) _then) = __$WebSocketPacketCopyWithImpl; |   factory _$WebSocketPacketCopyWith(_WebSocketPacket value, $Res Function(_WebSocketPacket) _then) = __$WebSocketPacketCopyWithImpl; | ||||||
| @override @useResult | @override @useResult | ||||||
| $Res call({ | $Res call({ | ||||||
|  String type, Map<String, dynamic>? data, String? errorMessage |  String type, Map<String, dynamic>? data, String? endpoint, String? errorMessage | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -381,11 +648,12 @@ class __$WebSocketPacketCopyWithImpl<$Res> | |||||||
|  |  | ||||||
| /// Create a copy of WebSocketPacket | /// Create a copy of WebSocketPacket | ||||||
| /// with the given fields replaced by the non-null parameter values. | /// with the given fields replaced by the non-null parameter values. | ||||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? data = freezed,Object? errorMessage = freezed,}) { | @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? data = freezed,Object? endpoint = freezed,Object? errorMessage = freezed,}) { | ||||||
|   return _then(_WebSocketPacket( |   return _then(_WebSocketPacket( | ||||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||||
| as String,data: freezed == data ? _self._data : data // ignore: cast_nullable_to_non_nullable | as String,data: freezed == data ? _self._data : data // ignore: cast_nullable_to_non_nullable | ||||||
| as Map<String, dynamic>?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable | as Map<String, dynamic>?,endpoint: freezed == endpoint ? _self.endpoint : endpoint // ignore: cast_nullable_to_non_nullable | ||||||
|  | as String?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable | ||||||
| as String?, | as String?, | ||||||
|   )); |   )); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ _WebSocketPacket _$WebSocketPacketFromJson(Map<String, dynamic> json) => | |||||||
|     _WebSocketPacket( |     _WebSocketPacket( | ||||||
|       type: json['type'] as String, |       type: json['type'] as String, | ||||||
|       data: json['data'] as Map<String, dynamic>?, |       data: json['data'] as Map<String, dynamic>?, | ||||||
|  |       endpoint: json['endpoint'] as String?, | ||||||
|       errorMessage: json['error_message'] as String?, |       errorMessage: json['error_message'] as String?, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| @@ -17,5 +18,6 @@ Map<String, dynamic> _$WebSocketPacketToJson(_WebSocketPacket instance) => | |||||||
|     <String, dynamic>{ |     <String, dynamic>{ | ||||||
|       'type': instance.type, |       'type': instance.type, | ||||||
|       'data': instance.data, |       'data': instance.data, | ||||||
|  |       'endpoint': instance.endpoint, | ||||||
|       'error_message': instance.errorMessage, |       'error_message': instance.errorMessage, | ||||||
|     }; |     }; | ||||||
|   | |||||||
| @@ -63,6 +63,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|         routes: [ |         routes: [ | ||||||
|           // Standalone routes without bottom navigation |           // Standalone routes without bottom navigation | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'postCompose', | ||||||
|             path: '/posts/compose', |             path: '/posts/compose', | ||||||
|             builder: |             builder: | ||||||
|                 (context, state) => PostComposeScreen( |                 (context, state) => PostComposeScreen( | ||||||
| @@ -73,6 +74,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 ), |                 ), | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'postEdit', | ||||||
|             path: '/posts/:id/edit', |             path: '/posts/:id/edit', | ||||||
|             builder: (context, state) { |             builder: (context, state) { | ||||||
|               final id = state.pathParameters['id']!; |               final id = state.pathParameters['id']!; | ||||||
| @@ -80,6 +82,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|             }, |             }, | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'chatCall', | ||||||
|             path: '/chat/:id/call', |             path: '/chat/:id/call', | ||||||
|             builder: (context, state) { |             builder: (context, state) { | ||||||
|               final id = state.pathParameters['id']!; |               final id = state.pathParameters['id']!; | ||||||
| @@ -87,6 +90,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|             }, |             }, | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'accountCalendar', | ||||||
|             path: '/account/:name/calendar', |             path: '/account/:name/calendar', | ||||||
|             builder: (context, state) { |             builder: (context, state) { | ||||||
|               final name = state.pathParameters['name']!; |               final name = state.pathParameters['name']!; | ||||||
| @@ -98,11 +102,13 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 (context, state, child) => CreatorHubShellScreen(child: child), |                 (context, state, child) => CreatorHubShellScreen(child: child), | ||||||
|             routes: [ |             routes: [ | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorHub', | ||||||
|                 path: '/creators', |                 path: '/creators', | ||||||
|                 builder: (context, state) => const CreatorHubScreen(), |                 builder: (context, state) => const CreatorHubScreen(), | ||||||
|               ), |               ), | ||||||
|               // Web Feed Routes |               // Web Feed Routes | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorFeeds', | ||||||
|                 path: '/creators/:name/feeds', |                 path: '/creators/:name/feeds', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -110,6 +116,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|                 routes: [ |                 routes: [ | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'creatorFeedNew', | ||||||
|                     path: 'new', |                     path: 'new', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       return WebFeedNewScreen( |                       return WebFeedNewScreen( | ||||||
| @@ -118,6 +125,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     }, |                     }, | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'creatorFeedEdit', | ||||||
|                     path: ':feedId', |                     path: ':feedId', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       return WebFeedEditScreen( |                       return WebFeedEditScreen( | ||||||
| @@ -129,6 +137,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 ], |                 ], | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorPosts', | ||||||
|                 path: '/creators/:name/posts', |                 path: '/creators/:name/posts', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -136,6 +145,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickers', | ||||||
|                 path: '/creators/:name/stickers', |                 path: '/creators/:name/stickers', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -143,6 +153,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickerPackNew', | ||||||
|                 path: '/creators/:name/stickers/new', |                 path: '/creators/:name/stickers/new', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -150,6 +161,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickerPackEdit', | ||||||
|                 path: '/creators/:name/stickers/:packId/edit', |                 path: '/creators/:name/stickers/:packId/edit', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -158,6 +170,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickerPackDetail', | ||||||
|                 path: '/creators/:name/stickers/:packId', |                 path: '/creators/:name/stickers/:packId', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -166,6 +179,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickerNew', | ||||||
|                 path: '/creators/:name/stickers/:packId/new', |                 path: '/creators/:name/stickers/:packId/new', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final packId = state.pathParameters['packId']!; |                   final packId = state.pathParameters['packId']!; | ||||||
| @@ -173,6 +187,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorStickerEdit', | ||||||
|                 path: '/creators/:name/stickers/:packId/:id/edit', |                 path: '/creators/:name/stickers/:packId/:id/edit', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final packId = state.pathParameters['packId']!; |                   final packId = state.pathParameters['packId']!; | ||||||
| @@ -181,10 +196,12 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorNew', | ||||||
|                 path: '/creators/new', |                 path: '/creators/new', | ||||||
|                 builder: (context, state) => const NewPublisherScreen(), |                 builder: (context, state) => const NewPublisherScreen(), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'creatorEdit', | ||||||
|                 path: '/creators/:name/edit', |                 path: '/creators/:name/edit', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -199,10 +216,12 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     DeveloperHubShellScreen(child: child), |                     DeveloperHubShellScreen(child: child), | ||||||
|             routes: [ |             routes: [ | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'developerHub', | ||||||
|                 path: '/developers', |                 path: '/developers', | ||||||
|                 builder: (context, state) => const DeveloperHubScreen(), |                 builder: (context, state) => const DeveloperHubScreen(), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'developerApps', | ||||||
|                 path: '/developers/:name/apps', |                 path: '/developers/:name/apps', | ||||||
|                 builder: |                 builder: | ||||||
|                     (context, state) => CustomAppsScreen( |                     (context, state) => CustomAppsScreen( | ||||||
| @@ -210,6 +229,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     ), |                     ), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'developerAppNew', | ||||||
|                 path: '/developers/:name/apps/new', |                 path: '/developers/:name/apps/new', | ||||||
|                 builder: |                 builder: | ||||||
|                     (context, state) => NewCustomAppScreen( |                     (context, state) => NewCustomAppScreen( | ||||||
| @@ -217,6 +237,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     ), |                     ), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'developerAppEdit', | ||||||
|                 path: '/developers/:name/apps/:id', |                 path: '/developers/:name/apps/:id', | ||||||
|                 builder: |                 builder: | ||||||
|                     (context, state) => EditAppScreen( |                     (context, state) => EditAppScreen( | ||||||
| @@ -229,10 +250,12 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|  |  | ||||||
|           // Web articles |           // Web articles | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'articles', | ||||||
|             path: '/feeds/articles', |             path: '/feeds/articles', | ||||||
|             builder: (context, state) => const ArticlesScreen(), |             builder: (context, state) => const ArticlesScreen(), | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'articleDetail', | ||||||
|             path: '/feeds/articles/:id', |             path: '/feeds/articles/:id', | ||||||
|             builder: (context, state) { |             builder: (context, state) { | ||||||
|               final id = state.pathParameters['id']!; |               final id = state.pathParameters['id']!; | ||||||
| @@ -242,30 +265,30 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|  |  | ||||||
|           // Auth routes |           // Auth routes | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'login', | ||||||
|             path: '/auth/login', |             path: '/auth/login', | ||||||
|             builder: (context, state) => const LoginScreen(), |             builder: (context, state) => const LoginScreen(), | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'createAccount', | ||||||
|             path: '/auth/create-account', |             path: '/auth/create-account', | ||||||
|             builder: (context, state) => const CreateAccountScreen(), |             builder: (context, state) => const CreateAccountScreen(), | ||||||
|           ), |           ), | ||||||
|  |  | ||||||
|           // Other routes |           // Other routes | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'settings', | ||||||
|             path: '/settings', |             path: '/settings', | ||||||
|             builder: (context, state) => const SettingsScreen(), |             builder: (context, state) => const SettingsScreen(), | ||||||
|           ), |           ), | ||||||
|           GoRoute( |           GoRoute( | ||||||
|  |             name: 'about', | ||||||
|             path: '/about', |             path: '/about', | ||||||
|             builder: (context, state) => const AboutScreen(), |             builder: (context, state) => const AboutScreen(), | ||||||
|           ), |           ), | ||||||
|  |  | ||||||
|           GoRoute( |           GoRoute( | ||||||
|             path: '/safety/reports/me', |             name: 'reportDetail', | ||||||
|             builder: (context, state) => const AbuseReportListScreen(), |  | ||||||
|           ), |  | ||||||
|  |  | ||||||
|           GoRoute( |  | ||||||
|             path: '/safety/reports/me/:id', |             path: '/safety/reports/me/:id', | ||||||
|             builder: (context, state) { |             builder: (context, state) { | ||||||
|               final id = state.pathParameters['id']!; |               final id = state.pathParameters['id']!; | ||||||
| @@ -281,19 +304,18 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|             }, |             }, | ||||||
|             routes: [ |             routes: [ | ||||||
|               // Explore tab |               // Explore tab | ||||||
|               ShellRoute( |  | ||||||
|                 builder: |  | ||||||
|                     (context, state, child) => ExploreShellScreen(child: child), |  | ||||||
|                 routes: [ |  | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'explore', | ||||||
|                 path: '/', |                 path: '/', | ||||||
|                 builder: (context, state) => const ExploreScreen(), |                 builder: (context, state) => const ExploreScreen(), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'postSearch', | ||||||
|                 path: '/posts/search', |                 path: '/posts/search', | ||||||
|                 builder: (context, state) => const PostSearchScreen(), |                 builder: (context, state) => const PostSearchScreen(), | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'postDetail', | ||||||
|                 path: '/posts/:id', |                 path: '/posts/:id', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final id = state.pathParameters['id']!; |                   final id = state.pathParameters['id']!; | ||||||
| @@ -301,6 +323,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'publisherProfile', | ||||||
|                 path: '/publishers/:name', |                 path: '/publishers/:name', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
| @@ -308,11 +331,10 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'discoveryRealms', | ||||||
|                 path: '/discovery/realms', |                 path: '/discovery/realms', | ||||||
|                 builder: (context, state) => const DiscoveryRealmsScreen(), |                 builder: (context, state) => const DiscoveryRealmsScreen(), | ||||||
|               ), |               ), | ||||||
|                 ], |  | ||||||
|               ), |  | ||||||
|  |  | ||||||
|               // Chat tab |               // Chat tab | ||||||
|               ShellRoute( |               ShellRoute( | ||||||
| @@ -320,14 +342,17 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     (context, state, child) => ChatShellScreen(child: child), |                     (context, state, child) => ChatShellScreen(child: child), | ||||||
|                 routes: [ |                 routes: [ | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'chatList', | ||||||
|                     path: '/chat', |                     path: '/chat', | ||||||
|                     builder: (context, state) => const ChatListScreen(), |                     builder: (context, state) => const ChatListScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'chatNew', | ||||||
|                     path: '/chat/new', |                     path: '/chat/new', | ||||||
|                     builder: (context, state) => const NewChatScreen(), |                     builder: (context, state) => const NewChatScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'chatRoom', | ||||||
|                     path: '/chat/:id', |                     path: '/chat/:id', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       final id = state.pathParameters['id']!; |                       final id = state.pathParameters['id']!; | ||||||
| @@ -335,6 +360,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     }, |                     }, | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'chatEdit', | ||||||
|                     path: '/chat/:id/edit', |                     path: '/chat/:id/edit', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       final id = state.pathParameters['id']!; |                       final id = state.pathParameters['id']!; | ||||||
| @@ -342,6 +368,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     }, |                     }, | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'chatDetail', | ||||||
|                     path: '/chat/:id/detail', |                     path: '/chat/:id/detail', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       final id = state.pathParameters['id']!; |                       final id = state.pathParameters['id']!; | ||||||
| @@ -353,14 +380,17 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|  |  | ||||||
|               // Realms tab |               // Realms tab | ||||||
|               GoRoute( |               GoRoute( | ||||||
|  |                 name: 'realmList', | ||||||
|                 path: '/realms', |                 path: '/realms', | ||||||
|                 builder: (context, state) => const RealmListScreen(), |                 builder: (context, state) => const RealmListScreen(), | ||||||
|                 routes: [ |                 routes: [ | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'realmNew', | ||||||
|                     path: 'new', |                     path: 'new', | ||||||
|                     builder: (context, state) => const NewRealmScreen(), |                     builder: (context, state) => const NewRealmScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'realmDetail', | ||||||
|                     path: ':slug', |                     path: ':slug', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       final slug = state.pathParameters['slug']!; |                       final slug = state.pathParameters['slug']!; | ||||||
| @@ -368,6 +398,7 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     }, |                     }, | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'realmEdit', | ||||||
|                     path: ':slug/edit', |                     path: ':slug/edit', | ||||||
|                     builder: (context, state) { |                     builder: (context, state) { | ||||||
|                       final slug = state.pathParameters['slug']!; |                       final slug = state.pathParameters['slug']!; | ||||||
| @@ -383,42 +414,56 @@ final routerProvider = Provider<GoRouter>((ref) { | |||||||
|                     (context, state, child) => AccountShellScreen(child: child), |                     (context, state, child) => AccountShellScreen(child: child), | ||||||
|                 routes: [ |                 routes: [ | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'account', | ||||||
|                     path: '/account', |                     path: '/account', | ||||||
|                     builder: (context, state) => const AccountScreen(), |                     builder: (context, state) => const AccountScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'notifications', | ||||||
|                     path: '/account/notifications', |                     path: '/account/notifications', | ||||||
|                     builder: (context, state) => const NotificationScreen(), |                     builder: (context, state) => const NotificationScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'wallet', | ||||||
|                     path: '/account/wallet', |                     path: '/account/wallet', | ||||||
|                     builder: (context, state) => const WalletScreen(), |                     builder: (context, state) => const WalletScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'relationships', | ||||||
|                     path: '/account/relationships', |                     path: '/account/relationships', | ||||||
|                     builder: (context, state) => const RelationshipScreen(), |                     builder: (context, state) => const RelationshipScreen(), | ||||||
|                   ), |                   ), | ||||||
|                   GoRoute( |                   GoRoute( | ||||||
|  |                     name: 'profileUpdate', | ||||||
|  |                     path: '/account/me/update', | ||||||
|  |                     builder: (context, state) => const UpdateProfileScreen(), | ||||||
|  |                   ), | ||||||
|  |                   GoRoute( | ||||||
|  |                     name: 'leveling', | ||||||
|  |                     path: '/account/me/leveling', | ||||||
|  |                     builder: (context, state) => const LevelingScreen(), | ||||||
|  |                   ), | ||||||
|  |                   GoRoute( | ||||||
|  |                     name: 'accountSettings', | ||||||
|  |                     path: '/account/me/settings', | ||||||
|  |                     builder: (context, state) => const AccountSettingsScreen(), | ||||||
|  |                   ), | ||||||
|  |                   GoRoute( | ||||||
|  |                     name: 'reportList', | ||||||
|  |                     path: '/safety/reports/me', | ||||||
|  |                     builder: (context, state) => const AbuseReportListScreen(), | ||||||
|  |                   ), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |  | ||||||
|  |               GoRoute( | ||||||
|  |                 name: 'accountProfile', | ||||||
|                 path: '/account/:name', |                 path: '/account/:name', | ||||||
|                 builder: (context, state) { |                 builder: (context, state) { | ||||||
|                   final name = state.pathParameters['name']!; |                   final name = state.pathParameters['name']!; | ||||||
|                   return AccountProfileScreen(name: name); |                   return AccountProfileScreen(name: name); | ||||||
|                 }, |                 }, | ||||||
|               ), |               ), | ||||||
|                   GoRoute( |  | ||||||
|                     path: '/account/me/update', |  | ||||||
|                     builder: (context, state) => const UpdateProfileScreen(), |  | ||||||
|                   ), |  | ||||||
|                   GoRoute( |  | ||||||
|                     path: '/account/me/leveling', |  | ||||||
|                     builder: (context, state) => const LevelingScreen(), |  | ||||||
|                   ), |  | ||||||
|                   GoRoute( |  | ||||||
|                     path: '/account/me/settings', |  | ||||||
|                     builder: (context, state) => const AccountSettingsScreen(), |  | ||||||
|                   ), |  | ||||||
|                 ], |  | ||||||
|               ), |  | ||||||
|             ], |             ], | ||||||
|           ), |           ), | ||||||
|         ], |         ], | ||||||
| @@ -441,6 +486,10 @@ class AppRouter { | |||||||
|     context.push(path); |     context.push(path); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   static void pushNamed(BuildContext context, String name) { | ||||||
|  |     context.pushNamed(name); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   static void pop(BuildContext context) { |   static void pop(BuildContext context) { | ||||||
|     context.pop(); |     context.pop(); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,18 +1,19 @@ | |||||||
|  | import 'dart:io'; | ||||||
|  |  | ||||||
| import 'package:device_info_plus/device_info_plus.dart'; | import 'package:device_info_plus/device_info_plus.dart'; | ||||||
|  | import 'package:flutter/foundation.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||||
| import 'package:gap/gap.dart'; | import 'package:gap/gap.dart'; | ||||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
| import 'package:island/pods/network.dart'; |  | ||||||
| import 'package:island/services/notify.dart'; |  | ||||||
| import 'package:island/services/udid.native.dart'; | import 'package:island/services/udid.native.dart'; | ||||||
| import 'package:island/widgets/alert.dart'; |  | ||||||
| import 'package:island/widgets/app_scaffold.dart'; | import 'package:island/widgets/app_scaffold.dart'; | ||||||
| import 'package:material_symbols_icons/symbols.dart'; | import 'package:material_symbols_icons/symbols.dart'; | ||||||
| import 'package:package_info_plus/package_info_plus.dart'; | import 'package:package_info_plus/package_info_plus.dart'; | ||||||
| import 'package:styled_widget/styled_widget.dart'; | import 'package:styled_widget/styled_widget.dart'; | ||||||
| import 'package:url_launcher/url_launcher.dart'; | import 'package:url_launcher/url_launcher.dart'; | ||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
|  | import 'package:url_launcher/url_launcher_string.dart'; | ||||||
|  |  | ||||||
| class AboutScreen extends ConsumerStatefulWidget { | class AboutScreen extends ConsumerStatefulWidget { | ||||||
|   const AboutScreen({super.key}); |   const AboutScreen({super.key}); | ||||||
| @@ -92,6 +93,7 @@ class _AboutScreenState extends ConsumerState<AboutScreen> { | |||||||
|     final theme = Theme.of(context); |     final theme = Theme.of(context); | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|  |       isNoBackground: false, | ||||||
|       appBar: AppBar(title: Text('about'.tr()), elevation: 0), |       appBar: AppBar(title: Text('about'.tr()), elevation: 0), | ||||||
|       body: |       body: | ||||||
|           _isLoading |           _isLoading | ||||||
| @@ -168,34 +170,16 @@ class _AboutScreenState extends ConsumerState<AboutScreen> { | |||||||
|                           _buildInfoItem( |                           _buildInfoItem( | ||||||
|                             context, |                             context, | ||||||
|                             icon: Symbols.label, |                             icon: Symbols.label, | ||||||
|                             label: 'Device Name', |                             label: 'aboutDeviceName'.tr(), | ||||||
|                             value: _deviceInfo?.data['name'], |                             value: _deviceInfo?.data['name'], | ||||||
|                           ), |                           ), | ||||||
|                           _buildInfoItem( |                           _buildInfoItem( | ||||||
|                             context, |                             context, | ||||||
|                             icon: Symbols.fingerprint, |                             icon: Symbols.fingerprint, | ||||||
|                             label: 'Device Identifier', |                             label: 'aboutDeviceIdentifier'.tr(), | ||||||
|                             value: _deviceUdid ?? 'N/A', |                             value: _deviceUdid ?? 'N/A', | ||||||
|                             copyable: true, |                             copyable: true, | ||||||
|                           ), |                           ), | ||||||
|                           const Divider(height: 1), |  | ||||||
|                           _buildListTile( |  | ||||||
|                             context, |  | ||||||
|                             icon: Symbols.notifications_active, |  | ||||||
|                             title: 'Reactivate Push Notifications', |  | ||||||
|                             onTap: () async { |  | ||||||
|                               showLoadingModal(context); |  | ||||||
|                               try { |  | ||||||
|                                 await subscribePushNotification( |  | ||||||
|                                   ref.watch(apiClientProvider), |  | ||||||
|                                 ); |  | ||||||
|                               } catch (err) { |  | ||||||
|                                 showErrorAlert(err); |  | ||||||
|                               } finally { |  | ||||||
|                                 if (context.mounted) hideLoadingModal(context); |  | ||||||
|                               } |  | ||||||
|                             }, |  | ||||||
|                           ), |  | ||||||
|                         ], |                         ], | ||||||
|                       ), |                       ), | ||||||
|  |  | ||||||
| @@ -266,6 +250,18 @@ class _AboutScreenState extends ConsumerState<AboutScreen> { | |||||||
|                                 'https://github.com/Solsynth/Solian/blob/v3/LICENSE.txt', |                                 'https://github.com/Solsynth/Solian/blob/v3/LICENSE.txt', | ||||||
|                               ), |                               ), | ||||||
|                         ), |                         ), | ||||||
|  |                         if (kIsWeb || !(Platform.isMacOS || Platform.isIOS)) | ||||||
|  |                           _buildListTile( | ||||||
|  |                             context, | ||||||
|  |                             icon: Symbols.favorite, | ||||||
|  |                             title: 'donate'.tr(), | ||||||
|  |                             subtitle: 'donateDescription'.tr(), | ||||||
|  |                             onTap: () { | ||||||
|  |                               launchUrlString( | ||||||
|  |                                 'https://afdian.com/@littlesheep', | ||||||
|  |                               ); | ||||||
|  |                             }, | ||||||
|  |                           ), | ||||||
|                       ], |                       ], | ||||||
|                     ), |                     ), | ||||||
|  |  | ||||||
|   | |||||||
| @@ -64,7 +64,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       noBackground: isWide, |       isNoBackground: isWide, | ||||||
|       appBar: AppBar(backgroundColor: Colors.transparent, toolbarHeight: 0), |       appBar: AppBar(backgroundColor: Colors.transparent, toolbarHeight: 0), | ||||||
|       body: SingleChildScrollView( |       body: SingleChildScrollView( | ||||||
|         padding: getTabbedPadding(context), |         padding: getTabbedPadding(context), | ||||||
| @@ -98,7 +98,10 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|                           radius: 24, |                           radius: 24, | ||||||
|                         ), |                         ), | ||||||
|                         onTap: () { |                         onTap: () { | ||||||
|                           context.push('/account/${user.value!.name}'); |                           context.pushNamed( | ||||||
|  |                             'accountProfile', | ||||||
|  |                             pathParameters: {'name': user.value!.name}, | ||||||
|  |                           ); | ||||||
|                         }, |                         }, | ||||||
|                       ), |                       ), | ||||||
|                       Expanded( |                       Expanded( | ||||||
| @@ -143,7 +146,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|                 progress: user.value!.profile.levelingProgress, |                 progress: user.value!.profile.levelingProgress, | ||||||
|               ), |               ), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/me/leveling'); |                 context.pushNamed('leveling'); | ||||||
|               }, |               }, | ||||||
|             ).padding(horizontal: 12), |             ).padding(horizontal: 12), | ||||||
|             Row( |             Row( | ||||||
| @@ -161,7 +164,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|                         ], |                         ], | ||||||
|                       ).padding(horizontal: 16, vertical: 12), |                       ).padding(horizontal: 16, vertical: 12), | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         context.push('/creators'); |                         context.pushNamed('creatorHub'); | ||||||
|                       }, |                       }, | ||||||
|                     ), |                     ), | ||||||
|                   ).height(140), |                   ).height(140), | ||||||
| @@ -179,7 +182,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|                         ], |                         ], | ||||||
|                       ).padding(horizontal: 16, vertical: 12), |                       ).padding(horizontal: 16, vertical: 12), | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         context.push('/developers'); |                         context.pushNamed('developerHub'); | ||||||
|                       }, |                       }, | ||||||
|                     ), |                     ), | ||||||
|                   ).height(140), |                   ).height(140), | ||||||
| @@ -202,7 +205,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|                 ], |                 ], | ||||||
|               ), |               ), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/notifications'); |                 context.pushNamed('notifications'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -212,7 +215,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('wallet').tr(), |               title: Text('wallet').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/wallet'); |                 context.pushNamed('wallet'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -222,16 +225,16 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('relationships').tr(), |               title: Text('relationships').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/relationships'); |                 context.pushNamed('relationships'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
|               minTileHeight: 48, |               minTileHeight: 48, | ||||||
|               title: Text('abuseReports').tr(), |               title: Text('abuseReports').tr(), | ||||||
|               contentPadding: const EdgeInsets.only(left: 24, right: 17), |               contentPadding: const EdgeInsets.symmetric(horizontal: 24), | ||||||
|               leading: const Icon(Symbols.gavel), |               leading: const Icon(Symbols.gavel), | ||||||
|               trailing: const Icon(Symbols.chevron_right), |               trailing: const Icon(Symbols.chevron_right), | ||||||
|               onTap: () => context.push('/safety/reports/me'), |               onTap: () => context.pushNamed('reportList'), | ||||||
|             ), |             ), | ||||||
|             const Divider(height: 1).padding(vertical: 8), |             const Divider(height: 1).padding(vertical: 8), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -241,7 +244,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('appSettings').tr(), |               title: Text('appSettings').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/settings'); |                 context.pushNamed('settings'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -251,7 +254,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('updateYourProfile').tr(), |               title: Text('updateYourProfile').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/me/update'); |                 context.pushNamed('profileUpdate'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -261,7 +264,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('accountSettings').tr(), |               title: Text('accountSettings').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/account/me/settings'); |                 context.pushNamed('accountSettings'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             if (kDebugMode) const Divider(height: 1).padding(vertical: 8), |             if (kDebugMode) const Divider(height: 1).padding(vertical: 8), | ||||||
| @@ -296,7 +299,7 @@ class AccountScreen extends HookConsumerWidget { | |||||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), |               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||||
|               title: Text('about').tr(), |               title: Text('about').tr(), | ||||||
|               onTap: () { |               onTap: () { | ||||||
|                 context.push('/about'); |                 context.pushNamed('about'); | ||||||
|               }, |               }, | ||||||
|             ), |             ), | ||||||
|             ListTile( |             ListTile( | ||||||
| @@ -336,7 +339,7 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | |||||||
|                   child: Card( |                   child: Card( | ||||||
|                     child: InkWell( |                     child: InkWell( | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         context.push('/auth/create-account'); |                         context.pushNamed('createAccount'); | ||||||
|                       }, |                       }, | ||||||
|                       child: Padding( |                       child: Padding( | ||||||
|                         padding: const EdgeInsets.all(16), |                         padding: const EdgeInsets.all(16), | ||||||
| @@ -358,7 +361,7 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | |||||||
|                   child: Card( |                   child: Card( | ||||||
|                     child: InkWell( |                     child: InkWell( | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         context.push('/auth/login'); |                         context.pushNamed('login'); | ||||||
|                       }, |                       }, | ||||||
|                       child: Padding( |                       child: Padding( | ||||||
|                         padding: const EdgeInsets.all(16), |                         padding: const EdgeInsets.all(16), | ||||||
| @@ -380,13 +383,13 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | |||||||
|                   children: [ |                   children: [ | ||||||
|                     TextButton( |                     TextButton( | ||||||
|                       onPressed: () { |                       onPressed: () { | ||||||
|                         context.push('/about'); |                         context.pushNamed('about'); | ||||||
|                       }, |                       }, | ||||||
|                       child: Text('about').tr(), |                       child: Text('about').tr(), | ||||||
|                     ), |                     ), | ||||||
|                     TextButton( |                     TextButton( | ||||||
|                       onPressed: () { |                       onPressed: () { | ||||||
|                         context.push('/settings'); |                         context.pushNamed('settings'); | ||||||
|                       }, |                       }, | ||||||
|                       child: Text('appSettings').tr(), |                       child: Text('appSettings').tr(), | ||||||
|                     ), |                     ), | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ class EventCalanderScreen extends HookConsumerWidget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       noBackground: false, |       isNoBackground: false, | ||||||
|       appBar: AppBar( |       appBar: AppBar( | ||||||
|         leading: const PageBackButton(), |         leading: const PageBackButton(), | ||||||
|         title: Text('eventCalander').tr(), |         title: Text('eventCalander').tr(), | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ part 'leveling.g.dart'; | |||||||
| Future<SnWalletSubscription?> accountStellarSubscription(Ref ref) async { | Future<SnWalletSubscription?> accountStellarSubscription(Ref ref) async { | ||||||
|   try { |   try { | ||||||
|     final client = ref.watch(apiClientProvider); |     final client = ref.watch(apiClientProvider); | ||||||
|     final resp = await client.get('/subscriptions/fuzzy/solian.stellar'); |     final resp = await client.get('/id/subscriptions/fuzzy/solian.stellar'); | ||||||
|     return SnWalletSubscription.fromJson(resp.data); |     return SnWalletSubscription.fromJson(resp.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) return null; |     if (err is DioException && err.response?.statusCode == 404) return null; | ||||||
| @@ -432,7 +432,7 @@ class LevelingScreen extends HookConsumerWidget { | |||||||
|         'id': 'solian.stellar.nova', |         'id': 'solian.stellar.nova', | ||||||
|         'name': 'membershipTierNova'.tr(), |         'name': 'membershipTierNova'.tr(), | ||||||
|         'price': 'membershipPriceNova'.tr(), |         'price': 'membershipPriceNova'.tr(), | ||||||
|         'color': Colors.indigo, |         'color': Color.fromRGBO(57, 197, 187, 1), | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         'id': 'solian.stellar.supernova', |         'id': 'solian.stellar.supernova', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ part of 'leveling.dart'; | |||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$accountStellarSubscriptionHash() => | String _$accountStellarSubscriptionHash() => | ||||||
|     r'37fb821460e3ac50b5cf777c933b6779f732daee'; |     r'80abcdefb3868775fd8fe3c980215713efff5948'; | ||||||
|  |  | ||||||
| /// See also [accountStellarSubscription]. | /// See also [accountStellarSubscription]. | ||||||
| @ProviderFor(accountStellarSubscription) | @ProviderFor(accountStellarSubscription) | ||||||
|   | |||||||
| @@ -28,14 +28,14 @@ part 'settings.g.dart'; | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnAuthFactor>> authFactors(Ref ref) async { | Future<List<SnAuthFactor>> authFactors(Ref ref) async { | ||||||
|   final client = ref.read(apiClientProvider); |   final client = ref.read(apiClientProvider); | ||||||
|   final res = await client.get('/accounts/me/factors'); |   final res = await client.get('/id/accounts/me/factors'); | ||||||
|   return res.data.map<SnAuthFactor>((e) => SnAuthFactor.fromJson(e)).toList(); |   return res.data.map<SnAuthFactor>((e) => SnAuthFactor.fromJson(e)).toList(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnContactMethod>> contactMethods(Ref ref) async { | Future<List<SnContactMethod>> contactMethods(Ref ref) async { | ||||||
|   final client = ref.read(apiClientProvider); |   final client = ref.read(apiClientProvider); | ||||||
|   final resp = await client.get('/accounts/me/contacts'); |   final resp = await client.get('/id/accounts/me/contacts'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map<SnContactMethod>((e) => SnContactMethod.fromJson(e)) |       .map<SnContactMethod>((e) => SnContactMethod.fromJson(e)) | ||||||
|       .toList(); |       .toList(); | ||||||
| @@ -44,7 +44,7 @@ Future<List<SnContactMethod>> contactMethods(Ref ref) async { | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnAccountConnection>> accountConnections(Ref ref) async { | Future<List<SnAccountConnection>> accountConnections(Ref ref) async { | ||||||
|   final client = ref.read(apiClientProvider); |   final client = ref.read(apiClientProvider); | ||||||
|   final resp = await client.get('/accounts/me/connections'); |   final resp = await client.get('/id/accounts/me/connections'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map<SnAccountConnection>((e) => SnAccountConnection.fromJson(e)) |       .map<SnAccountConnection>((e) => SnAccountConnection.fromJson(e)) | ||||||
|       .toList(); |       .toList(); | ||||||
| @@ -68,7 +68,7 @@ class AccountSettingsScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.delete('/accounts/me'); |         await client.delete('/id/accounts/me'); | ||||||
|         if (context.mounted) { |         if (context.mounted) { | ||||||
|           showSnackBar('accountDeletionSent'.tr()); |           showSnackBar('accountDeletionSent'.tr()); | ||||||
|         } |         } | ||||||
| @@ -94,7 +94,7 @@ class AccountSettingsScreen extends HookConsumerWidget { | |||||||
|         final userInfo = ref.read(userInfoProvider); |         final userInfo = ref.read(userInfoProvider); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/accounts/recovery/password', |           '/id/accounts/recovery/password', | ||||||
|           data: {'account': userInfo.value!.name, 'captcha_token': captchaTk}, |           data: {'account': userInfo.value!.name, 'captcha_token': captchaTk}, | ||||||
|         ); |         ); | ||||||
|         if (context.mounted) { |         if (context.mounted) { | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'settings.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$authFactorsHash() => r'4bb65bc0c065c4091c209ee81e57ddef41051ae2'; | String _$authFactorsHash() => r'24fe2f7b375b019d87fc3b85cbedbe857f399c0f'; | ||||||
|  |  | ||||||
| /// See also [authFactors]. | /// See also [authFactors]. | ||||||
| @ProviderFor(authFactors) | @ProviderFor(authFactors) | ||||||
| @@ -25,7 +25,7 @@ final authFactorsProvider = | |||||||
| @Deprecated('Will be removed in 3.0. Use Ref instead') | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
| // ignore: unused_element | // ignore: unused_element | ||||||
| typedef AuthFactorsRef = AutoDisposeFutureProviderRef<List<SnAuthFactor>>; | typedef AuthFactorsRef = AutoDisposeFutureProviderRef<List<SnAuthFactor>>; | ||||||
| String _$contactMethodsHash() => r'4d7952fc196dce4dc646314565a49c115fd1d292'; | String _$contactMethodsHash() => r'76a1a93f61c51c44b32b4821f5112d58406155f0'; | ||||||
|  |  | ||||||
| /// See also [contactMethods]. | /// See also [contactMethods]. | ||||||
| @ProviderFor(contactMethods) | @ProviderFor(contactMethods) | ||||||
| @@ -45,7 +45,7 @@ final contactMethodsProvider = | |||||||
| // ignore: unused_element | // ignore: unused_element | ||||||
| typedef ContactMethodsRef = AutoDisposeFutureProviderRef<List<SnContactMethod>>; | typedef ContactMethodsRef = AutoDisposeFutureProviderRef<List<SnContactMethod>>; | ||||||
| String _$accountConnectionsHash() => | String _$accountConnectionsHash() => | ||||||
|     r'38a309d596e0ea2539cd92ea86984e1e4fb346e4'; |     r'9f69e7f23e3e53c528d38b93d76f0c9efc9a83db'; | ||||||
|  |  | ||||||
| /// See also [accountConnections]. | /// See also [accountConnections]. | ||||||
| @ProviderFor(accountConnections) | @ProviderFor(accountConnections) | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ class AuthFactorSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.delete('/accounts/me/factors/${factor.id}'); |         await client.delete('/id/accounts/me/factors/${factor.id}'); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -49,7 +49,7 @@ class AuthFactorSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post('/accounts/me/factors/${factor.id}/disable'); |         await client.post('/id/accounts/me/factors/${factor.id}/disable'); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -106,7 +106,7 @@ class AuthFactorSheet extends HookConsumerWidget { | |||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/accounts/me/factors/${factor.id}/enable', |           '/id/accounts/me/factors/${factor.id}/enable', | ||||||
|           data: jsonEncode(password), |           data: jsonEncode(password), | ||||||
|         ); |         ); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
| @@ -193,7 +193,7 @@ class AuthFactorNewSheet extends HookConsumerWidget { | |||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final apiClient = ref.read(apiClientProvider); |         final apiClient = ref.read(apiClientProvider); | ||||||
|         final resp = await apiClient.post( |         final resp = await apiClient.post( | ||||||
|           '/accounts/me/factors', |           '/id/accounts/me/factors', | ||||||
|           data: {'type': factorType.value, 'secret': secretController.text}, |           data: {'type': factorType.value, 'secret': secretController.text}, | ||||||
|         ); |         ); | ||||||
|         final factor = SnAuthFactor.fromJson(resp.data); |         final factor = SnAuthFactor.fromJson(resp.data); | ||||||
|   | |||||||
| @@ -74,7 +74,7 @@ class AccountConnectionSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.delete('/accounts/me/connections/${connection.id}'); |         await client.delete('/id/accounts/me/connections/${connection.id}'); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -174,7 +174,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget { | |||||||
|             if (context.mounted) showLoadingModal(context); |             if (context.mounted) showLoadingModal(context); | ||||||
|  |  | ||||||
|             await client.post( |             await client.post( | ||||||
|               '/auth/connect/apple/mobile', |               '/id/auth/connect/apple/mobile', | ||||||
|               data: { |               data: { | ||||||
|                 'identity_token': credential.identityToken!, |                 'identity_token': credential.identityToken!, | ||||||
|                 'authorization_code': credential.authorizationCode, |                 'authorization_code': credential.authorizationCode, | ||||||
| @@ -336,7 +336,7 @@ class AccountConnectionsSheet extends HookConsumerWidget { | |||||||
|                                 try { |                                 try { | ||||||
|                                   final client = ref.read(apiClientProvider); |                                   final client = ref.read(apiClientProvider); | ||||||
|                                   await client.delete( |                                   await client.delete( | ||||||
|                                     '/accounts/me/connections/${connection.id}', |                                     '/id/accounts/me/connections/${connection.id}', | ||||||
|                                   ); |                                   ); | ||||||
|                                   ref.invalidate(accountConnectionsProvider); |                                   ref.invalidate(accountConnectionsProvider); | ||||||
|                                   return true; |                                   return true; | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ class ContactMethodSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.delete('/accounts/me/contacts/${contact.id}'); |         await client.delete('/id/accounts/me/contacts/${contact.id}'); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -38,7 +38,7 @@ class ContactMethodSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post('/accounts/me/contacts/${contact.id}/verify'); |         await client.post('/id/accounts/me/contacts/${contact.id}/verify'); | ||||||
|         if (context.mounted) { |         if (context.mounted) { | ||||||
|           showSnackBar('contactMethodVerificationSent'.tr()); |           showSnackBar('contactMethodVerificationSent'.tr()); | ||||||
|         } |         } | ||||||
| @@ -53,7 +53,7 @@ class ContactMethodSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post('/accounts/me/contacts/${contact.id}/primary'); |         await client.post('/id/accounts/me/contacts/${contact.id}/primary'); | ||||||
|         if (context.mounted) Navigator.pop(context, true); |         if (context.mounted) Navigator.pop(context, true); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -160,7 +160,7 @@ class ContactMethodNewSheet extends HookConsumerWidget { | |||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final apiClient = ref.read(apiClientProvider); |         final apiClient = ref.read(apiClientProvider); | ||||||
|         await apiClient.post( |         await apiClient.post( | ||||||
|           '/accounts/me/contacts', |           '/id/accounts/me/contacts', | ||||||
|           data: {'type': contactType.value, 'content': contentController.text}, |           data: {'type': contactType.value, 'content': contentController.text}, | ||||||
|         ); |         ); | ||||||
|         if (context.mounted) { |         if (context.mounted) { | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | |||||||
|         } |         } | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.patch( |         await client.patch( | ||||||
|           '/accounts/me/profile', |           '/id/accounts/me/profile', | ||||||
|           data: {'${position}_id': cloudFile.id}, |           data: {'${position}_id': cloudFile.id}, | ||||||
|         ); |         ); | ||||||
|         final userNotifier = ref.read(userInfoProvider.notifier); |         final userNotifier = ref.read(userInfoProvider.notifier); | ||||||
| @@ -102,7 +102,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.patch( |         await client.patch( | ||||||
|           '/accounts/me', |           '/id/accounts/me', | ||||||
|           data: { |           data: { | ||||||
|             'name': usernameController.text, |             'name': usernameController.text, | ||||||
|             'nick': nicknameController.text, |             'nick': nicknameController.text, | ||||||
| @@ -154,7 +154,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.patch( |         await client.patch( | ||||||
|           '/accounts/me/profile', |           '/id/accounts/me/profile', | ||||||
|           data: { |           data: { | ||||||
|             'bio': bioController.text, |             'bio': bioController.text, | ||||||
|             'first_name': firstNameController.text, |             'first_name': firstNameController.text, | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import 'package:island/pods/event_calendar.dart'; | |||||||
| import 'package:island/pods/network.dart'; | import 'package:island/pods/network.dart'; | ||||||
| import 'package:island/pods/userinfo.dart'; | import 'package:island/pods/userinfo.dart'; | ||||||
| import 'package:island/services/color.dart'; | import 'package:island/services/color.dart'; | ||||||
|  | import 'package:island/services/responsive.dart'; | ||||||
| import 'package:island/services/time.dart'; | import 'package:island/services/time.dart'; | ||||||
| import 'package:island/services/timezone/native.dart'; | import 'package:island/services/timezone/native.dart'; | ||||||
| import 'package:island/widgets/account/account_name.dart'; | import 'package:island/widgets/account/account_name.dart'; | ||||||
| @@ -39,14 +40,14 @@ Future<SnAccount> account(Ref ref, String uname) async { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   final resp = await apiClient.get("/accounts/$uname"); |   final resp = await apiClient.get("/id/accounts/$uname"); | ||||||
|   return SnAccount.fromJson(resp.data); |   return SnAccount.fromJson(resp.data); | ||||||
| } | } | ||||||
|  |  | ||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async { | Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async { | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   final resp = await apiClient.get("/accounts/$uname/badges"); |   final resp = await apiClient.get("/id/accounts/$uname/badges"); | ||||||
|   return List<SnAccountBadge>.from( |   return List<SnAccountBadge>.from( | ||||||
|     resp.data.map((x) => SnAccountBadge.fromJson(x)), |     resp.data.map((x) => SnAccountBadge.fromJson(x)), | ||||||
|   ); |   ); | ||||||
| @@ -78,7 +79,7 @@ Future<SnChatRoom?> accountDirectChat(Ref ref, String uname) async { | |||||||
|   final account = await ref.watch(accountProvider(uname).future); |   final account = await ref.watch(accountProvider(uname).future); | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   try { |   try { | ||||||
|     final resp = await apiClient.get("/chat/direct/${account.id}"); |     final resp = await apiClient.get("/sphere/chat/direct/${account.id}"); | ||||||
|     return SnChatRoom.fromJson(resp.data); |     return SnChatRoom.fromJson(resp.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) { |     if (err is DioException && err.response?.statusCode == 404) { | ||||||
| @@ -95,7 +96,7 @@ Future<SnRelationship?> accountRelationship(Ref ref, String uname) async { | |||||||
|   final account = await ref.watch(accountProvider(uname).future); |   final account = await ref.watch(accountProvider(uname).future); | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   try { |   try { | ||||||
|     final resp = await apiClient.get("/relationships/${account.id}"); |     final resp = await apiClient.get("/id/relationships/${account.id}"); | ||||||
|     return SnRelationship.fromJson(resp.data); |     return SnRelationship.fromJson(resp.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) { |     if (err is DioException && err.response?.statusCode == 404) { | ||||||
| @@ -135,7 +136,7 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|       showLoadingModal(context); |       showLoadingModal(context); | ||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.post('/relationships/${account.value!.id}/friends'); |         await client.post('/id/relationships/${account.value!.id}/friends'); | ||||||
|         ref.invalidate(accountRelationshipProvider(name)); |         ref.invalidate(accountRelationshipProvider(name)); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -149,9 +150,9 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         if (accountRelationship.value == null) { |         if (accountRelationship.value == null) { | ||||||
|           await client.post('/relationships/${account.value!.id}/block'); |           await client.post('/id/relationships/${account.value!.id}/block'); | ||||||
|         } else { |         } else { | ||||||
|           await client.delete('/relationships/${account.value!.id}/block'); |           await client.delete('/id/relationships/${account.value!.id}/block'); | ||||||
|         } |         } | ||||||
|         ref.invalidate(accountRelationshipProvider(name)); |         ref.invalidate(accountRelationshipProvider(name)); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
| @@ -164,18 +165,23 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|     Future<void> directMessageAction() async { |     Future<void> directMessageAction() async { | ||||||
|       if (!account.hasValue) return; |       if (!account.hasValue) return; | ||||||
|       if (accountChat.value != null) { |       if (accountChat.value != null) { | ||||||
|         context.push('/chat/${accountChat.value!.id}'); |         context.pushNamed( | ||||||
|  |           'chatRoom', | ||||||
|  |           pathParameters: {'id': accountChat.value!.id}, | ||||||
|  |         ); | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
|       showLoadingModal(context); |       showLoadingModal(context); | ||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         final resp = await client.post( |         final resp = await client.post( | ||||||
|           '/chat/direct', |           '/sphere/chat/direct', | ||||||
|           data: {'related_user_id': account.value!.id}, |           data: {'related_user_id': account.value!.id}, | ||||||
|         ); |         ); | ||||||
|         final chat = SnChatRoom.fromJson(resp.data); |         final chat = SnChatRoom.fromJson(resp.data); | ||||||
|         if (context.mounted) context.push('/chat/${chat.id}'); |         if (context.mounted) { | ||||||
|  |           context.pushNamed('chatRoom', pathParameters: {'id': chat.id}); | ||||||
|  |         } | ||||||
|         ref.invalidate(accountDirectChatProvider(name)); |         ref.invalidate(accountDirectChatProvider(name)); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -243,58 +249,12 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|  |  | ||||||
|     final user = ref.watch(userInfoProvider); |     final user = ref.watch(userInfoProvider); | ||||||
|  |  | ||||||
|     return account.when( |     Widget accountBasicInfo(SnAccount data) => Padding( | ||||||
|       data: |  | ||||||
|           (data) => AppScaffold( |  | ||||||
|             body: CustomScrollView( |  | ||||||
|               slivers: [ |  | ||||||
|                 SliverAppBar( |  | ||||||
|                   foregroundColor: appbarColor.value, |  | ||||||
|                   expandedHeight: 180, |  | ||||||
|                   pinned: true, |  | ||||||
|                   leading: PageBackButton( |  | ||||||
|                     color: appbarColor.value, |  | ||||||
|                     shadows: [appbarShadow], |  | ||||||
|                   ), |  | ||||||
|                   flexibleSpace: Stack( |  | ||||||
|                     children: [ |  | ||||||
|                       Positioned.fill( |  | ||||||
|                         child: |  | ||||||
|                             data.profile.background?.id != null |  | ||||||
|                                 ? CloudImageWidget( |  | ||||||
|                                   file: data.profile.background, |  | ||||||
|                                 ) |  | ||||||
|                                 : Container( |  | ||||||
|                                   color: |  | ||||||
|                                       Theme.of( |  | ||||||
|                                         context, |  | ||||||
|                                       ).appBarTheme.backgroundColor, |  | ||||||
|                                 ), |  | ||||||
|                       ), |  | ||||||
|                       FlexibleSpaceBar( |  | ||||||
|                         title: Text( |  | ||||||
|                           data.nick, |  | ||||||
|                           style: TextStyle( |  | ||||||
|                             color: |  | ||||||
|                                 appbarColor.value ?? |  | ||||||
|                                 Theme.of(context).appBarTheme.foregroundColor, |  | ||||||
|                             shadows: [appbarShadow], |  | ||||||
|                           ), |  | ||||||
|                         ), |  | ||||||
|                       ), |  | ||||||
|                     ], |  | ||||||
|                   ), |  | ||||||
|                 ), |  | ||||||
|                 SliverToBoxAdapter( |  | ||||||
|                   child: Padding( |  | ||||||
|       padding: const EdgeInsets.fromLTRB(24, 24, 24, 8), |       padding: const EdgeInsets.fromLTRB(24, 24, 24, 8), | ||||||
|       child: Row( |       child: Row( | ||||||
|         crossAxisAlignment: CrossAxisAlignment.start, |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|         children: [ |         children: [ | ||||||
|                         ProfilePictureWidget( |           ProfilePictureWidget(file: data.profile.picture, radius: 32), | ||||||
|                           file: data.profile.picture, |  | ||||||
|                           radius: 32, |  | ||||||
|                         ), |  | ||||||
|           const Gap(20), |           const Gap(20), | ||||||
|           Expanded( |           Expanded( | ||||||
|             child: Column( |             child: Column( | ||||||
| @@ -302,55 +262,20 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|               children: [ |               children: [ | ||||||
|                 Row( |                 Row( | ||||||
|                   children: [ |                   children: [ | ||||||
|                                   AccountName( |                     AccountName(account: data, style: TextStyle(fontSize: 20)), | ||||||
|                                     account: data, |  | ||||||
|                                     style: TextStyle(fontSize: 20), |  | ||||||
|                                   ), |  | ||||||
|                     const Gap(6), |                     const Gap(6), | ||||||
|                                   Text( |                     Text('@${data.name}').fontSize(14).opacity(0.85), | ||||||
|                                     '@${data.name}', |  | ||||||
|                                   ).fontSize(14).opacity(0.85), |  | ||||||
|                   ], |                   ], | ||||||
|                 ), |                 ), | ||||||
|                               AccountStatusWidget( |                 AccountStatusWidget(uname: name, padding: EdgeInsets.zero), | ||||||
|                                 uname: name, |  | ||||||
|                                 padding: EdgeInsets.zero, |  | ||||||
|                               ), |  | ||||||
|               ], |               ], | ||||||
|             ), |             ), | ||||||
|           ), |           ), | ||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|                   ), |     ); | ||||||
|                 ), |  | ||||||
|                 if (data.badges.isNotEmpty) |  | ||||||
|                   SliverToBoxAdapter( |  | ||||||
|                     child: BadgeList( |  | ||||||
|                       badges: data.badges, |  | ||||||
|                     ).padding(horizontal: 24, bottom: 24), |  | ||||||
|                   ), |  | ||||||
|                 SliverToBoxAdapter( |  | ||||||
|                   child: Column( |  | ||||||
|                     spacing: 12, |  | ||||||
|                     children: [ |  | ||||||
|                       LevelingProgressCard( |  | ||||||
|                         level: data.profile.level, |  | ||||||
|                         experience: data.profile.experience, |  | ||||||
|                         progress: data.profile.levelingProgress, |  | ||||||
|                       ), |  | ||||||
|                       if (data.profile.verification != null) |  | ||||||
|                         VerificationStatusCard( |  | ||||||
|                           mark: data.profile.verification!, |  | ||||||
|                         ), |  | ||||||
|                     ], |  | ||||||
|                   ).padding(horizontal: 20), |  | ||||||
|                 ), |  | ||||||
|  |  | ||||||
|                 SliverToBoxAdapter( |     Widget accountProfileDetail(SnAccount data) => Column( | ||||||
|                   child: const Divider(height: 1).padding(vertical: 24), |  | ||||||
|                 ), |  | ||||||
|                 SliverToBoxAdapter( |  | ||||||
|                   child: Column( |  | ||||||
|       crossAxisAlignment: CrossAxisAlignment.stretch, |       crossAxisAlignment: CrossAxisAlignment.stretch, | ||||||
|       spacing: 24, |       spacing: 24, | ||||||
|       children: [ |       children: [ | ||||||
| @@ -388,9 +313,7 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|                     ).$2.formatCustomGlobal('HH:mm'), |                     ).$2.formatCustomGlobal('HH:mm'), | ||||||
|                   ), |                   ), | ||||||
|                   Text( |                   Text( | ||||||
|                                   getTzInfo( |                     getTzInfo(data.profile.timeZone).$1.formatOffsetLocal(), | ||||||
|                                     data.profile.timeZone, |  | ||||||
|                                   ).$1.formatOffsetLocal(), |  | ||||||
|                   ).fontSize(11), |                   ).fontSize(11), | ||||||
|                   Text( |                   Text( | ||||||
|                     'UTC${getTzInfo(data.profile.timeZone).$1.formatOffset()}', |                     'UTC${getTzInfo(data.profile.timeZone).$1.formatOffset()}', | ||||||
| @@ -400,18 +323,12 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|             ], |             ], | ||||||
|           ), |           ), | ||||||
|       ], |       ], | ||||||
|                   ).padding(horizontal: 24), |     ).padding(horizontal: 24); | ||||||
|                 ), |  | ||||||
|  |  | ||||||
|                 if (user.value != null) |     Widget accountAction(SnAccount data) => Card( | ||||||
|                   SliverToBoxAdapter( |       child: Column( | ||||||
|                     child: const Divider( |         children: [ | ||||||
|                       height: 1, |           Row( | ||||||
|                     ).padding(top: 24, bottom: 12), |  | ||||||
|                   ), |  | ||||||
|                 if (user.value != null) |  | ||||||
|                   SliverToBoxAdapter( |  | ||||||
|                     child: Row( |  | ||||||
|             spacing: 8, |             spacing: 8, | ||||||
|             children: [ |             children: [ | ||||||
|               if (accountRelationship.value == null || |               if (accountRelationship.value == null || | ||||||
| @@ -427,9 +344,7 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|                       foregroundColor: WidgetStatePropertyAll( |                       foregroundColor: WidgetStatePropertyAll( | ||||||
|                         accountRelationship.value == null |                         accountRelationship.value == null | ||||||
|                             ? null |                             ? null | ||||||
|                                       : Theme.of( |                             : Theme.of(context).colorScheme.onSecondary, | ||||||
|                                         context, |  | ||||||
|                                       ).colorScheme.onSecondary, |  | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                     onPressed: relationshipAction, |                     onPressed: relationshipAction, | ||||||
| @@ -458,9 +373,7 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|                       foregroundColor: WidgetStatePropertyAll( |                       foregroundColor: WidgetStatePropertyAll( | ||||||
|                         accountRelationship.value == null |                         accountRelationship.value == null | ||||||
|                             ? null |                             ? null | ||||||
|                                       : Theme.of( |                             : Theme.of(context).colorScheme.onSecondary, | ||||||
|                                         context, |  | ||||||
|                                       ).colorScheme.onSecondary, |  | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                     onPressed: blockAction, |                     onPressed: blockAction, | ||||||
| @@ -478,9 +391,7 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|                 ), |                 ), | ||||||
|             ], |             ], | ||||||
|           ).padding(horizontal: 16), |           ).padding(horizontal: 16), | ||||||
|                   ), |           Row( | ||||||
|                 SliverToBoxAdapter( |  | ||||||
|                   child: Row( |  | ||||||
|             spacing: 8, |             spacing: 8, | ||||||
|             children: [ |             children: [ | ||||||
|               Expanded( |               Expanded( | ||||||
| @@ -514,11 +425,179 @@ class AccountProfileScreen extends HookConsumerWidget { | |||||||
|                 ), |                 ), | ||||||
|               ), |               ), | ||||||
|             ], |             ], | ||||||
|                   ).padding(horizontal: 16, top: 4), |           ), | ||||||
|  |         ], | ||||||
|  |       ).padding(horizontal: 16, vertical: 8), | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     return account.when( | ||||||
|  |       data: | ||||||
|  |           (data) => AppScaffold( | ||||||
|  |             isNoBackground: false, | ||||||
|  |             appBar: | ||||||
|  |                 isWideScreen(context) | ||||||
|  |                     ? AppBar( | ||||||
|  |                       foregroundColor: appbarColor.value, | ||||||
|  |                       leading: PageBackButton( | ||||||
|  |                         color: appbarColor.value, | ||||||
|  |                         shadows: [appbarShadow], | ||||||
|  |                       ), | ||||||
|  |                       flexibleSpace: Stack( | ||||||
|  |                         children: [ | ||||||
|  |                           Positioned.fill( | ||||||
|  |                             child: | ||||||
|  |                                 data.profile.background?.id != null | ||||||
|  |                                     ? CloudImageWidget( | ||||||
|  |                                       file: data.profile.background, | ||||||
|  |                                     ) | ||||||
|  |                                     : Container( | ||||||
|  |                                       color: | ||||||
|  |                                           Theme.of( | ||||||
|  |                                             context, | ||||||
|  |                                           ).appBarTheme.backgroundColor, | ||||||
|  |                                     ), | ||||||
|  |                           ), | ||||||
|  |                           FlexibleSpaceBar( | ||||||
|  |                             title: Text( | ||||||
|  |                               data.nick, | ||||||
|  |                               style: TextStyle( | ||||||
|  |                                 color: | ||||||
|  |                                     appbarColor.value ?? | ||||||
|  |                                     Theme.of( | ||||||
|  |                                       context, | ||||||
|  |                                     ).appBarTheme.foregroundColor, | ||||||
|  |                                 shadows: [appbarShadow], | ||||||
|  |                               ), | ||||||
|  |                             ), | ||||||
|  |                           ), | ||||||
|  |                         ], | ||||||
|  |                       ), | ||||||
|  |                     ) | ||||||
|  |                     : null, | ||||||
|  |             body: | ||||||
|  |                 isWideScreen(context) | ||||||
|  |                     ? Row( | ||||||
|  |                       children: [ | ||||||
|  |                         Flexible( | ||||||
|  |                           child: CustomScrollView( | ||||||
|  |                             slivers: [ | ||||||
|  |                               SliverToBoxAdapter(child: accountBasicInfo(data)), | ||||||
|  |                               if (data.badges.isNotEmpty) | ||||||
|  |                                 SliverToBoxAdapter( | ||||||
|  |                                   child: BadgeList( | ||||||
|  |                                     badges: data.badges, | ||||||
|  |                                   ).padding(horizontal: 24, bottom: 24), | ||||||
|                                 ), |                                 ), | ||||||
|                               SliverToBoxAdapter( |                               SliverToBoxAdapter( | ||||||
|                   child: const Divider(height: 1).padding(top: 12), |                                 child: Column( | ||||||
|  |                                   spacing: 12, | ||||||
|  |                                   children: [ | ||||||
|  |                                     LevelingProgressCard( | ||||||
|  |                                       level: data.profile.level, | ||||||
|  |                                       experience: data.profile.experience, | ||||||
|  |                                       progress: data.profile.levelingProgress, | ||||||
|                                     ), |                                     ), | ||||||
|  |                                     if (data.profile.verification != null) | ||||||
|  |                                       VerificationStatusCard( | ||||||
|  |                                         mark: data.profile.verification!, | ||||||
|  |                                       ), | ||||||
|  |                                   ], | ||||||
|  |                                 ).padding(horizontal: 20), | ||||||
|  |                               ), | ||||||
|  |                             ], | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                         Flexible( | ||||||
|  |                           child: CustomScrollView( | ||||||
|  |                             slivers: [ | ||||||
|  |                               SliverToBoxAdapter( | ||||||
|  |                                 child: accountProfileDetail(data), | ||||||
|  |                               ), | ||||||
|  |  | ||||||
|  |                               if (user.value != null) | ||||||
|  |                                 SliverToBoxAdapter(child: accountAction(data)), | ||||||
|  |                               SliverToBoxAdapter( | ||||||
|  |                                 child: Card( | ||||||
|  |                                   child: FortuneGraphWidget( | ||||||
|  |                                     events: accountEvents, | ||||||
|  |                                     eventCalanderUser: data.name, | ||||||
|  |                                   ), | ||||||
|  |                                 ).padding(all: 8), | ||||||
|  |                               ), | ||||||
|  |                             ], | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       ], | ||||||
|  |                     ) | ||||||
|  |                     : CustomScrollView( | ||||||
|  |                       slivers: [ | ||||||
|  |                         SliverAppBar( | ||||||
|  |                           foregroundColor: appbarColor.value, | ||||||
|  |                           expandedHeight: 180, | ||||||
|  |                           pinned: true, | ||||||
|  |                           leading: PageBackButton( | ||||||
|  |                             color: appbarColor.value, | ||||||
|  |                             shadows: [appbarShadow], | ||||||
|  |                           ), | ||||||
|  |                           flexibleSpace: Stack( | ||||||
|  |                             children: [ | ||||||
|  |                               Positioned.fill( | ||||||
|  |                                 child: | ||||||
|  |                                     data.profile.background?.id != null | ||||||
|  |                                         ? CloudImageWidget( | ||||||
|  |                                           file: data.profile.background, | ||||||
|  |                                         ) | ||||||
|  |                                         : Container( | ||||||
|  |                                           color: | ||||||
|  |                                               Theme.of( | ||||||
|  |                                                 context, | ||||||
|  |                                               ).appBarTheme.backgroundColor, | ||||||
|  |                                         ), | ||||||
|  |                               ), | ||||||
|  |                               FlexibleSpaceBar( | ||||||
|  |                                 title: Text( | ||||||
|  |                                   data.nick, | ||||||
|  |                                   style: TextStyle( | ||||||
|  |                                     color: | ||||||
|  |                                         appbarColor.value ?? | ||||||
|  |                                         Theme.of( | ||||||
|  |                                           context, | ||||||
|  |                                         ).appBarTheme.foregroundColor, | ||||||
|  |                                     shadows: [appbarShadow], | ||||||
|  |                                   ), | ||||||
|  |                                 ), | ||||||
|  |                               ), | ||||||
|  |                             ], | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                         SliverToBoxAdapter(child: accountBasicInfo(data)), | ||||||
|  |                         if (data.badges.isNotEmpty) | ||||||
|  |                           SliverToBoxAdapter( | ||||||
|  |                             child: BadgeList( | ||||||
|  |                               badges: data.badges, | ||||||
|  |                             ).padding(horizontal: 24, bottom: 24), | ||||||
|  |                           ), | ||||||
|  |                         SliverToBoxAdapter( | ||||||
|  |                           child: Column( | ||||||
|  |                             spacing: 12, | ||||||
|  |                             children: [ | ||||||
|  |                               LevelingProgressCard( | ||||||
|  |                                 level: data.profile.level, | ||||||
|  |                                 experience: data.profile.experience, | ||||||
|  |                                 progress: data.profile.levelingProgress, | ||||||
|  |                               ), | ||||||
|  |                               if (data.profile.verification != null) | ||||||
|  |                                 VerificationStatusCard( | ||||||
|  |                                   mark: data.profile.verification!, | ||||||
|  |                                 ), | ||||||
|  |                             ], | ||||||
|  |                           ).padding(horizontal: 20), | ||||||
|  |                         ), | ||||||
|  |  | ||||||
|  |                         SliverToBoxAdapter(child: accountProfileDetail(data)), | ||||||
|  |  | ||||||
|  |                         if (user.value != null) | ||||||
|  |                           SliverToBoxAdapter(child: accountAction(data)), | ||||||
|                         SliverToBoxAdapter( |                         SliverToBoxAdapter( | ||||||
|                           child: Column( |                           child: Column( | ||||||
|                             children: [ |                             children: [ | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'profile.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$accountHash() => r'd2b0579617e6264452d98f47f695a9cdf45b24ec'; | String _$accountHash() => r'ce7264a04f69e32a5cb07bc10ca5fa47ae1fddaa'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
| @@ -145,7 +145,7 @@ class _AccountProviderElement | |||||||
|   String get uname => (origin as AccountProvider).uname; |   String get uname => (origin as AccountProvider).uname; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$accountBadgesHash() => r'4bfe5fb0d6ac0d4cde4563460bde289289188f6d'; | String _$accountBadgesHash() => r'1de05e122c23ff2c6ac6d318977165761e2ad177'; | ||||||
|  |  | ||||||
| /// See also [accountBadges]. | /// See also [accountBadges]. | ||||||
| @ProviderFor(accountBadges) | @ProviderFor(accountBadges) | ||||||
| @@ -395,7 +395,7 @@ class _AccountAppbarForcegroundColorProviderElement | |||||||
|   String get uname => (origin as AccountAppbarForcegroundColorProvider).uname; |   String get uname => (origin as AccountAppbarForcegroundColorProvider).uname; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$accountDirectChatHash() => r'3d28c8ba8079159f724fe3cd47bbe00db55cedcc'; | String _$accountDirectChatHash() => r'149ea3a3730672cfbbb8c16fe1f2caa0bb9f0e17'; | ||||||
|  |  | ||||||
| /// See also [accountDirectChat]. | /// See also [accountDirectChat]. | ||||||
| @ProviderFor(accountDirectChat) | @ProviderFor(accountDirectChat) | ||||||
| @@ -517,7 +517,7 @@ class _AccountDirectChatProviderElement | |||||||
| } | } | ||||||
|  |  | ||||||
| String _$accountRelationshipHash() => | String _$accountRelationshipHash() => | ||||||
|     r'0be2420e1f6a65b8dcead9617191471924aaf232'; |     r'9a3a4e8c6c6706f73df95feccb86736fcad33f30'; | ||||||
|  |  | ||||||
| /// See also [accountRelationship]. | /// See also [accountRelationship]. | ||||||
| @ProviderFor(accountRelationship) | @ProviderFor(accountRelationship) | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ part 'relationship.g.dart'; | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnRelationship>> sentFriendRequest(Ref ref) async { | Future<List<SnRelationship>> sentFriendRequest(Ref ref) async { | ||||||
|   final client = ref.read(apiClientProvider); |   final client = ref.read(apiClientProvider); | ||||||
|   final resp = await client.get('/relationships/requests'); |   final resp = await client.get('/id/relationships/requests'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnRelationship.fromJson(e)) |       .map((e) => SnRelationship.fromJson(e)) | ||||||
|       .cast<SnRelationship>() |       .cast<SnRelationship>() | ||||||
| @@ -42,7 +42,7 @@ class RelationshipListNotifier extends _$RelationshipListNotifier | |||||||
|     final take = 20; |     final take = 20; | ||||||
|  |  | ||||||
|     final response = await client.get( |     final response = await client.get( | ||||||
|       '/relationships', |       '/id/relationships', | ||||||
|       queryParameters: {'offset': offset, 'take': take}, |       queryParameters: {'offset': offset, 'take': take}, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| @@ -221,7 +221,7 @@ class RelationshipScreen extends HookConsumerWidget { | |||||||
|       if (result == null) return; |       if (result == null) return; | ||||||
|  |  | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       await client.post('/relationships/${result.id}/friends'); |       await client.post('/id/relationships/${result.id}/friends'); | ||||||
|       ref.invalidate(sentFriendRequestProvider); |       ref.invalidate(sentFriendRequestProvider); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -235,7 +235,7 @@ class RelationshipScreen extends HookConsumerWidget { | |||||||
|         submitting.value = true; |         submitting.value = true; | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/relationships/${relationship.accountId}/friends/${isAccept ? 'accept' : 'decline'}', |           '/id/relationships/${relationship.accountId}/friends/${isAccept ? 'accept' : 'decline'}', | ||||||
|         ); |         ); | ||||||
|         relationshipNotifier.forceRefresh(); |         relationshipNotifier.forceRefresh(); | ||||||
|         if (!context.mounted) return; |         if (!context.mounted) return; | ||||||
| @@ -262,7 +262,7 @@ class RelationshipScreen extends HookConsumerWidget { | |||||||
|     ) async { |     ) async { | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       await client.patch( |       await client.patch( | ||||||
|         '/relationships/${relationship.accountId}', |         '/id/relationships/${relationship.accountId}', | ||||||
|         data: {'status': newStatus}, |         data: {'status': newStatus}, | ||||||
|       ); |       ); | ||||||
|       relationshipNotifier.forceRefresh(); |       relationshipNotifier.forceRefresh(); | ||||||
| @@ -345,7 +345,7 @@ class _SentFriendRequestsSheet extends HookConsumerWidget { | |||||||
|     Future<void> cancelRequest(SnRelationship request) async { |     Future<void> cancelRequest(SnRelationship request) async { | ||||||
|       try { |       try { | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.delete('/relationships/${request.relatedId}/friends'); |         await client.delete('/id/relationships/${request.relatedId}/friends'); | ||||||
|         ref.invalidate(sentFriendRequestProvider); |         ref.invalidate(sentFriendRequestProvider); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'relationship.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$sentFriendRequestHash() => r'2efa72835b1740e0fe96bd347bce0f98b6ae80d6'; | String _$sentFriendRequestHash() => r'dc02ace6cb755a01ab862c9fcff3b26de7f946cb'; | ||||||
|  |  | ||||||
| /// See also [sentFriendRequest]. | /// See also [sentFriendRequest]. | ||||||
| @ProviderFor(sentFriendRequest) | @ProviderFor(sentFriendRequest) | ||||||
| @@ -27,7 +27,7 @@ final sentFriendRequestProvider = | |||||||
| typedef SentFriendRequestRef = | typedef SentFriendRequestRef = | ||||||
|     AutoDisposeFutureProviderRef<List<SnRelationship>>; |     AutoDisposeFutureProviderRef<List<SnRelationship>>; | ||||||
| String _$relationshipListNotifierHash() => | String _$relationshipListNotifierHash() => | ||||||
|     r'560410cba6e4c26affd91aa86b3666319bd31f24'; |     r'0a134ce69489a4f2002d2223853855b6f22e4e9f'; | ||||||
|  |  | ||||||
| /// See also [RelationshipListNotifier]. | /// See also [RelationshipListNotifier]. | ||||||
| @ProviderFor(RelationshipListNotifier) | @ProviderFor(RelationshipListNotifier) | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								lib/screens/auth/captcha.config.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/screens/auth/captcha.config.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
|  | import 'package:island/pods/network.dart'; | ||||||
|  | import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||||||
|  |  | ||||||
|  | part 'captcha.config.g.dart'; | ||||||
|  |  | ||||||
|  | @riverpod | ||||||
|  | Future<String> captchaUrl(Ref ref) async { | ||||||
|  |   final apiClient = ref.watch(apiClientProvider); | ||||||
|  |   final resp = await apiClient.get('/.well-known/services'); | ||||||
|  |   final serviceMapping = await resp.data; | ||||||
|  |   var baseUrl = serviceMapping['DysonNetwork.Pass'] as String; | ||||||
|  |   // The backend using self-signed certicates on development | ||||||
|  |   // Which mobile simulator might not accept, use this to avoid errors | ||||||
|  |   if (baseUrl.contains('https://localhost')) baseUrl = 'http://localhost:5216'; | ||||||
|  |   return '$baseUrl/captcha'; | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								lib/screens/auth/captcha.config.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib/screens/auth/captcha.config.g.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  |  | ||||||
|  | part of 'captcha.config.dart'; | ||||||
|  |  | ||||||
|  | // ************************************************************************** | ||||||
|  | // RiverpodGenerator | ||||||
|  | // ************************************************************************** | ||||||
|  |  | ||||||
|  | String _$captchaUrlHash() => r'bbed0d18272dd205069642b3c6583ea2eef735d1'; | ||||||
|  |  | ||||||
|  | /// See also [captchaUrl]. | ||||||
|  | @ProviderFor(captchaUrl) | ||||||
|  | final captchaUrlProvider = AutoDisposeFutureProvider<String>.internal( | ||||||
|  |   captchaUrl, | ||||||
|  |   name: r'captchaUrlProvider', | ||||||
|  |   debugGetCreateSourceHash: | ||||||
|  |       const bool.fromEnvironment('dart.vm.product') ? null : _$captchaUrlHash, | ||||||
|  |   dependencies: null, | ||||||
|  |   allTransitiveDependencies: null, | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
|  | // ignore: unused_element | ||||||
|  | typedef CaptchaUrlRef = AutoDisposeFutureProviderRef<String>; | ||||||
|  | // ignore_for_file: type=lint | ||||||
|  | // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter_inappwebview/flutter_inappwebview.dart'; | import 'package:flutter_inappwebview/flutter_inappwebview.dart'; | ||||||
| import 'package:flutter_riverpod/flutter_riverpod.dart'; | import 'package:flutter_riverpod/flutter_riverpod.dart'; | ||||||
| import 'package:island/pods/config.dart'; | import 'package:island/screens/auth/captcha.config.dart'; | ||||||
| import 'package:island/widgets/app_scaffold.dart'; | import 'package:island/widgets/app_scaffold.dart'; | ||||||
|  |  | ||||||
| class CaptchaScreen extends ConsumerWidget { | class CaptchaScreen extends ConsumerWidget { | ||||||
| @@ -9,13 +9,15 @@ class CaptchaScreen extends ConsumerWidget { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context, WidgetRef ref) { |   Widget build(BuildContext context, WidgetRef ref) { | ||||||
|     final serverUrl = ref.watch(serverUrlProvider); |     final captchaUrl = ref.watch(captchaUrlProvider); | ||||||
|  |  | ||||||
|  |     if (!captchaUrl.hasValue) return Center(child: CircularProgressIndicator()); | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       appBar: AppBar(title: Text("Anti-Robot")), |       appBar: AppBar(title: Text("Anti-Robot")), | ||||||
|       body: InAppWebView( |       body: InAppWebView( | ||||||
|         initialUrlRequest: URLRequest( |         initialUrlRequest: URLRequest( | ||||||
|           url: WebUri('$serverUrl/auth/captcha?redirect_uri=solink://captcha'), |           url: WebUri('${captchaUrl.value}?redirect_uri=solian://captcha'), | ||||||
|         ), |         ), | ||||||
|         shouldOverrideUrlLoading: (controller, navigationAction) async { |         shouldOverrideUrlLoading: (controller, navigationAction) async { | ||||||
|           Uri? url = navigationAction.request.url; |           Uri? url = navigationAction.request.url; | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| import 'dart:ui_web' as ui; | import 'dart:ui_web' as ui; | ||||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
| import 'package:island/pods/config.dart'; | import 'package:island/pods/config.dart'; | ||||||
|  | import 'package:island/screens/auth/captcha.config.dart'; | ||||||
| import 'package:island/widgets/app_scaffold.dart'; | import 'package:island/widgets/app_scaffold.dart'; | ||||||
| import 'package:web/web.dart' as web; | import 'package:web/web.dart' as web; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| @@ -17,7 +18,7 @@ class CaptchaScreen extends ConsumerStatefulWidget { | |||||||
| class _CaptchaScreenState extends ConsumerState<CaptchaScreen> { | class _CaptchaScreenState extends ConsumerState<CaptchaScreen> { | ||||||
|   bool _isInitialized = false; |   bool _isInitialized = false; | ||||||
|  |  | ||||||
|   void _setupWebListener(String serverUrl) { |   void _setupWebListener(String serverUrl) async { | ||||||
|     web.window.onMessage.listen((event) { |     web.window.onMessage.listen((event) { | ||||||
|       if (event.data != null && event.data is String) { |       if (event.data != null && event.data is String) { | ||||||
|         final message = event.data as String; |         final message = event.data as String; | ||||||
| @@ -29,9 +30,11 @@ class _CaptchaScreenState extends ConsumerState<CaptchaScreen> { | |||||||
|       } |       } | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     final captchaUrl = await ref.watch(captchaUrlProvider.future); | ||||||
|  |  | ||||||
|     final iframe = |     final iframe = | ||||||
|         web.HTMLIFrameElement() |         web.HTMLIFrameElement() | ||||||
|           ..src = '$serverUrl/auth/captcha' |           ..src = captchaUrl | ||||||
|           ..style.border = 'none' |           ..style.border = 'none' | ||||||
|           ..width = '100%' |           ..width = '100%' | ||||||
|           ..height = '100%'; |           ..height = '100%'; | ||||||
|   | |||||||
| @@ -49,7 +49,7 @@ class CreateAccountScreen extends HookConsumerWidget { | |||||||
|         showLoadingModal(context); |         showLoadingModal(context); | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/accounts', |           '/id/accounts', | ||||||
|           data: { |           data: { | ||||||
|             'name': usernameController.text, |             'name': usernameController.text, | ||||||
|             'nick': nicknameController.text, |             'nick': nicknameController.text, | ||||||
| @@ -73,7 +73,7 @@ class CreateAccountScreen extends HookConsumerWidget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       noBackground: false, |       isNoBackground: false, | ||||||
|       appBar: AppBar( |       appBar: AppBar( | ||||||
|         leading: const PageBackButton(), |         leading: const PageBackButton(), | ||||||
|         title: Text('createAccount').tr(), |         title: Text('createAccount').tr(), | ||||||
| @@ -305,7 +305,7 @@ class _PostCreateModal extends HookConsumerWidget { | |||||||
|             TextButton( |             TextButton( | ||||||
|               onPressed: () { |               onPressed: () { | ||||||
|                 Navigator.pop(context); |                 Navigator.pop(context); | ||||||
|                 context.pushReplacement('/auth/login'); |                 context.pushReplacementNamed('login'); | ||||||
|               }, |               }, | ||||||
|               child: Text('login'.tr()), |               child: Text('login'.tr()), | ||||||
|             ), |             ), | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ class LoginScreen extends HookConsumerWidget { | |||||||
|     final factorPicked = useState<SnAuthFactor?>(null); |     final factorPicked = useState<SnAuthFactor?>(null); | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       noBackground: false, |       isNoBackground: false, | ||||||
|       appBar: AppBar( |       appBar: AppBar( | ||||||
|         leading: const PageBackButton(), |         leading: const PageBackButton(), | ||||||
|         title: Text('login').tr(), |         title: Text('login').tr(), | ||||||
| @@ -178,7 +178,7 @@ class _LoginCheckScreen extends HookConsumerWidget { | |||||||
|       // Get token if challenge is completed |       // Get token if challenge is completed | ||||||
|       final client = ref.watch(apiClientProvider); |       final client = ref.watch(apiClientProvider); | ||||||
|       final tokenResp = await client.post( |       final tokenResp = await client.post( | ||||||
|         '/auth/token', |         '/id/auth/token', | ||||||
|         data: { |         data: { | ||||||
|           'grant_type': 'authorization_code', |           'grant_type': 'authorization_code', | ||||||
|           'code': code ?? challenge!.id, |           'code': code ?? challenge!.id, | ||||||
| @@ -215,7 +215,7 @@ class _LoginCheckScreen extends HookConsumerWidget { | |||||||
|         if (name != null) { |         if (name != null) { | ||||||
|           final client = ref.watch(apiClientProvider); |           final client = ref.watch(apiClientProvider); | ||||||
|           await client.patch( |           await client.patch( | ||||||
|             '/accounts/me/sessions/current/label', |             '/id/accounts/me/sessions/current/label', | ||||||
|             data: jsonEncode(name), |             data: jsonEncode(name), | ||||||
|           ); |           ); | ||||||
|         } |         } | ||||||
| @@ -225,6 +225,7 @@ class _LoginCheckScreen extends HookConsumerWidget { | |||||||
|     useEffect(() { |     useEffect(() { | ||||||
|       if (challenge != null && challenge?.stepRemain == 0) { |       if (challenge != null && challenge?.stepRemain == 0) { | ||||||
|         Future(() { |         Future(() { | ||||||
|  |           if (isBusy.value) return; | ||||||
|           isBusy.value = true; |           isBusy.value = true; | ||||||
|           getToken().catchError((err) { |           getToken().catchError((err) { | ||||||
|             showErrorAlert(err); |             showErrorAlert(err); | ||||||
| @@ -265,7 +266,7 @@ class _LoginCheckScreen extends HookConsumerWidget { | |||||||
|         // Pass challenge |         // Pass challenge | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         final resp = await client.patch( |         final resp = await client.patch( | ||||||
|           '/auth/challenge/${challenge!.id}', |           '/id/auth/challenge/${challenge!.id}', | ||||||
|           data: {'factor_id': factor!.id, 'password': pwd}, |           data: {'factor_id': factor!.id, 'password': pwd}, | ||||||
|         ); |         ); | ||||||
|         final result = SnAuthChallenge.fromJson(resp.data); |         final result = SnAuthChallenge.fromJson(resp.data); | ||||||
| @@ -412,7 +413,7 @@ class _LoginPickerScreen extends HookConsumerWidget { | |||||||
|  |  | ||||||
|       try { |       try { | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/auth/challenge/${challenge!.id}/factors/${factorPicked.value!.id}', |           '/id/auth/challenge/${challenge!.id}/factors/${factorPicked.value!.id}', | ||||||
|           data: |           data: | ||||||
|               hintController.text.isNotEmpty |               hintController.text.isNotEmpty | ||||||
|                   ? jsonEncode(hintController.text) |                   ? jsonEncode(hintController.text) | ||||||
| @@ -555,7 +556,7 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.post( |         await client.post( | ||||||
|           '/accounts/recovery/password', |           '/id/accounts/recovery/password', | ||||||
|           data: {'account': uname, 'captcha_token': captchaTk}, |           data: {'account': uname, 'captcha_token': captchaTk}, | ||||||
|         ); |         ); | ||||||
|         showInfoAlert('loginResetPasswordSent'.tr(), 'done'.tr()); |         showInfoAlert('loginResetPasswordSent'.tr(), 'done'.tr()); | ||||||
| @@ -573,7 +574,7 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         final resp = await client.post( |         final resp = await client.post( | ||||||
|           '/auth/challenge', |           '/id/auth/challenge', | ||||||
|           data: { |           data: { | ||||||
|             'account': uname, |             'account': uname, | ||||||
|             'device_id': await getUdid(), |             'device_id': await getUdid(), | ||||||
| @@ -593,7 +594,7 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|         final result = SnAuthChallenge.fromJson(resp.data); |         final result = SnAuthChallenge.fromJson(resp.data); | ||||||
|         onChallenge(result); |         onChallenge(result); | ||||||
|         final factorResp = await client.get( |         final factorResp = await client.get( | ||||||
|           '/auth/challenge/${result.id}/factors', |           '/id/auth/challenge/${result.id}/factors', | ||||||
|         ); |         ); | ||||||
|         onFactor( |         onFactor( | ||||||
|           List<SnAuthFactor>.from( |           List<SnAuthFactor>.from( | ||||||
| @@ -622,7 +623,7 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|  |  | ||||||
|         if (context.mounted) showLoadingModal(context); |         if (context.mounted) showLoadingModal(context); | ||||||
|         final resp = await client.post( |         final resp = await client.post( | ||||||
|           '/auth/login/apple/mobile', |           '/id/auth/login/apple/mobile', | ||||||
|           data: { |           data: { | ||||||
|             'identity_token': credential.identityToken!, |             'identity_token': credential.identityToken!, | ||||||
|             'authorization_code': credential.authorizationCode, |             'authorization_code': credential.authorizationCode, | ||||||
| @@ -633,7 +634,7 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|         final challenge = SnAuthChallenge.fromJson(resp.data); |         final challenge = SnAuthChallenge.fromJson(resp.data); | ||||||
|         onChallenge(challenge); |         onChallenge(challenge); | ||||||
|         final factorResp = await client.get( |         final factorResp = await client.get( | ||||||
|           '/auth/challenge/${challenge.id}/factors', |           '/id/auth/challenge/${challenge.id}/factors', | ||||||
|         ); |         ); | ||||||
|         onFactor( |         onFactor( | ||||||
|           List<SnAuthFactor>.from( |           List<SnAuthFactor>.from( | ||||||
| @@ -658,11 +659,11 @@ class _LoginLookupScreen extends HookConsumerWidget { | |||||||
|  |  | ||||||
|       final client = ref.watch(apiClientProvider); |       final client = ref.watch(apiClientProvider); | ||||||
|       try { |       try { | ||||||
|         final resp = await client.get('/auth/challenge/$challengeId'); |         final resp = await client.get('/id/auth/challenge/$challengeId'); | ||||||
|         final challenge = SnAuthChallenge.fromJson(resp.data); |         final challenge = SnAuthChallenge.fromJson(resp.data); | ||||||
|         onChallenge(challenge); |         onChallenge(challenge); | ||||||
|         final factorResp = await client.get( |         final factorResp = await client.get( | ||||||
|           '/auth/challenge/${challenge.id}/factors', |           '/id/auth/challenge/${challenge.id}/factors', | ||||||
|         ); |         ); | ||||||
|         onFactor( |         onFactor( | ||||||
|           List<SnAuthFactor>.from( |           List<SnAuthFactor>.from( | ||||||
|   | |||||||
| @@ -120,7 +120,7 @@ class _OidcScreenState extends ConsumerState<OidcScreen> { | |||||||
|                       final queryParams = url.queryParameters; |                       final queryParams = url.queryParameters; | ||||||
|  |  | ||||||
|                       // Check if we're on the token page |                       // Check if we're on the token page | ||||||
|                       if (path.endsWith('/auth/callback')) { |                       if (path.endsWith('/id/auth/callback')) { | ||||||
|                         // Extract token from URL |                         // Extract token from URL | ||||||
|                         final challenge = queryParams['challenge']; |                         final challenge = queryParams['challenge']; | ||||||
|                         // Return the token and close the webview |                         // Return the token and close the webview | ||||||
|   | |||||||
| @@ -1,14 +1,16 @@ | |||||||
|  | import 'dart:developer'; | ||||||
|  |  | ||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart' hide ConnectionState; | ||||||
| import 'package:flutter_hooks/flutter_hooks.dart'; | import 'package:flutter_hooks/flutter_hooks.dart'; | ||||||
| import 'package:gap/gap.dart'; | import 'package:gap/gap.dart'; | ||||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
| import 'package:island/pods/call.dart'; | import 'package:island/pods/call.dart'; | ||||||
| import 'package:island/services/responsive.dart'; |  | ||||||
| import 'package:island/widgets/app_scaffold.dart'; | import 'package:island/widgets/app_scaffold.dart'; | ||||||
| import 'package:island/widgets/chat/call_button.dart'; | import 'package:island/widgets/chat/call_button.dart'; | ||||||
| import 'package:island/widgets/chat/call_overlay.dart'; | import 'package:island/widgets/chat/call_overlay.dart'; | ||||||
| import 'package:island/widgets/chat/call_participant_tile.dart'; | import 'package:island/widgets/chat/call_participant_tile.dart'; | ||||||
|  | import 'package:island/widgets/alert.dart'; | ||||||
| import 'package:livekit_client/livekit_client.dart'; | import 'package:livekit_client/livekit_client.dart'; | ||||||
| import 'package:material_symbols_icons/symbols.dart'; | import 'package:material_symbols_icons/symbols.dart'; | ||||||
| import 'package:styled_widget/styled_widget.dart'; | import 'package:styled_widget/styled_widget.dart'; | ||||||
| @@ -21,17 +23,39 @@ class CallScreen extends HookConsumerWidget { | |||||||
|   Widget build(BuildContext context, WidgetRef ref) { |   Widget build(BuildContext context, WidgetRef ref) { | ||||||
|     final ongoingCall = ref.watch(ongoingCallProvider(roomId)); |     final ongoingCall = ref.watch(ongoingCallProvider(roomId)); | ||||||
|     final callState = ref.watch(callNotifierProvider); |     final callState = ref.watch(callNotifierProvider); | ||||||
|     final callNotifier = ref.read(callNotifierProvider.notifier); |     final callNotifier = ref.watch(callNotifierProvider.notifier); | ||||||
|  |  | ||||||
|     useEffect(() { |     useEffect(() { | ||||||
|  |       log('[Call] Joining the call...'); | ||||||
|  |       callNotifier.joinRoom(roomId).catchError((_) { | ||||||
|  |         showConfirmAlert( | ||||||
|  |           'Seems there already has a call connected, do you want override it?', | ||||||
|  |           'Call already connected', | ||||||
|  |         ).then((value) { | ||||||
|  |           if (value != true) return; | ||||||
|  |           log('[Call] Joining the call... with overrides'); | ||||||
|  |           callNotifier.disconnect(); | ||||||
|  |           callNotifier.dispose(); | ||||||
|           callNotifier.joinRoom(roomId); |           callNotifier.joinRoom(roomId); | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|       return null; |       return null; | ||||||
|     }, []); |     }, []); | ||||||
|  |  | ||||||
|     final viewMode = useState<String>('grid'); |     final allAudioOnly = callNotifier.participants.every( | ||||||
|  |       (p) => | ||||||
|  |           !(p.hasVideo && | ||||||
|  |               p.remoteParticipant.trackPublications.values.any( | ||||||
|  |                 (pub) => | ||||||
|  |                     pub.track != null && | ||||||
|  |                     pub.kind == TrackType.VIDEO && | ||||||
|  |                     !pub.muted && | ||||||
|  |                     !pub.isDisposed, | ||||||
|  |               )), | ||||||
|  |     ); | ||||||
|  |  | ||||||
|     return AppScaffold( |     return AppScaffold( | ||||||
|       noBackground: false, |       isNoBackground: false, | ||||||
|       appBar: AppBar( |       appBar: AppBar( | ||||||
|         leading: PageBackButton(), |         leading: PageBackButton(), | ||||||
|         title: Column( |         title: Column( | ||||||
| @@ -44,45 +68,55 @@ class CallScreen extends HookConsumerWidget { | |||||||
|             Text( |             Text( | ||||||
|               callState.isConnected |               callState.isConnected | ||||||
|                   ? formatDuration(callState.duration) |                   ? formatDuration(callState.duration) | ||||||
|                   : 'Connecting', |                   : (switch (callNotifier.room?.connectionState) { | ||||||
|  |                     ConnectionState.connected => 'connected', | ||||||
|  |                     ConnectionState.connecting => 'connecting', | ||||||
|  |                     ConnectionState.reconnecting => 'reconnecting', | ||||||
|  |                     _ => 'disconnected', | ||||||
|  |                   }).tr(), | ||||||
|               style: const TextStyle(fontSize: 14), |               style: const TextStyle(fontSize: 14), | ||||||
|             ), |             ), | ||||||
|           ], |           ], | ||||||
|         ), |         ), | ||||||
|         actions: [ |         actions: [ | ||||||
|           Row( |           if (!allAudioOnly) | ||||||
|             mainAxisAlignment: MainAxisAlignment.end, |             SingleChildScrollView( | ||||||
|  |               child: Row( | ||||||
|  |                 spacing: 4, | ||||||
|                 children: [ |                 children: [ | ||||||
|               IconButton( |                   for (final live in callNotifier.participants) | ||||||
|                 icon: Icon(Symbols.grid_view), |                     SpeakingRippleAvatar(live: live, size: 30), | ||||||
|                 tooltip: 'Grid View', |                   const Gap(8), | ||||||
|                 onPressed: () => viewMode.value = 'grid', |  | ||||||
|                 color: |  | ||||||
|                     viewMode.value == 'grid' |  | ||||||
|                         ? Theme.of(context).colorScheme.primary |  | ||||||
|                         : null, |  | ||||||
|               ), |  | ||||||
|               IconButton( |  | ||||||
|                 icon: Icon(Symbols.view_agenda), |  | ||||||
|                 tooltip: 'Stage View', |  | ||||||
|                 onPressed: () => viewMode.value = 'stage', |  | ||||||
|                 color: |  | ||||||
|                     viewMode.value == 'stage' |  | ||||||
|                         ? Theme.of(context).colorScheme.primary |  | ||||||
|                         : null, |  | ||||||
|               ), |  | ||||||
|                 ], |                 ], | ||||||
|               ), |               ), | ||||||
|           const Gap(8), |             ), | ||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|       body: |       body: | ||||||
|           callState.error != null |           callState.error != null | ||||||
|               ? Center( |               ? Center( | ||||||
|                 child: Text( |                 child: ConstrainedBox( | ||||||
|  |                   constraints: const BoxConstraints(maxWidth: 320), | ||||||
|  |                   child: Column( | ||||||
|  |                     children: [ | ||||||
|  |                       const Icon(Symbols.error_outline, size: 48), | ||||||
|  |                       const Gap(4), | ||||||
|  |                       Text( | ||||||
|                         callState.error!, |                         callState.error!, | ||||||
|                         textAlign: TextAlign.center, |                         textAlign: TextAlign.center, | ||||||
|                   style: const TextStyle(color: Colors.red), |                         style: const TextStyle(color: Color(0xFF757575)), | ||||||
|  |                       ), | ||||||
|  |                       const Gap(8), | ||||||
|  |                       TextButton( | ||||||
|  |                         onPressed: () { | ||||||
|  |                           callNotifier.disconnect(); | ||||||
|  |                           callNotifier.dispose(); | ||||||
|  |                           callNotifier.joinRoom(roomId); | ||||||
|  |                         }, | ||||||
|  |                         child: Text('retry').tr(), | ||||||
|  |                       ), | ||||||
|  |                     ], | ||||||
|  |                   ), | ||||||
|                 ), |                 ), | ||||||
|               ) |               ) | ||||||
|               : Column( |               : Column( | ||||||
| @@ -100,17 +134,8 @@ class CallScreen extends HookConsumerWidget { | |||||||
|                             child: Text('No participants in call'), |                             child: Text('No participants in call'), | ||||||
|                           ); |                           ); | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
|                         final participants = callNotifier.participants; |                         final participants = callNotifier.participants; | ||||||
|                         final allAudioOnly = participants.every( |  | ||||||
|                           (p) => |  | ||||||
|                               !(p.hasVideo && |  | ||||||
|                                   p.remoteParticipant.trackPublications.values |  | ||||||
|                                       .any( |  | ||||||
|                                         (pub) => |  | ||||||
|                                             pub.track != null && |  | ||||||
|                                             pub.kind == TrackType.VIDEO, |  | ||||||
|                                       )), |  | ||||||
|                         ); |  | ||||||
|                         if (allAudioOnly) { |                         if (allAudioOnly) { | ||||||
|                           // Audio-only: show avatars in a compact row |                           // Audio-only: show avatars in a compact row | ||||||
|                           return Center( |                           return Center( | ||||||
| @@ -123,31 +148,16 @@ class CallScreen extends HookConsumerWidget { | |||||||
|                                 runSpacing: 8, |                                 runSpacing: 8, | ||||||
|                                 children: [ |                                 children: [ | ||||||
|                                   for (final live in participants) |                                   for (final live in participants) | ||||||
|                                     Padding( |                                     SpeakingRippleAvatar( | ||||||
|                                       padding: const EdgeInsets.symmetric( |                                       live: live, | ||||||
|                                         horizontal: 8, |  | ||||||
|                                       ), |  | ||||||
|                                       child: SpeakingRippleAvatar( |  | ||||||
|                                         isSpeaking: live.isSpeaking, |  | ||||||
|                                         audioLevel: |  | ||||||
|                                             live.remoteParticipant.audioLevel, |  | ||||||
|                                         pictureId: |  | ||||||
|                                             live |  | ||||||
|                                                 .participant |  | ||||||
|                                                 .profile |  | ||||||
|                                                 ?.account |  | ||||||
|                                                 .profile |  | ||||||
|                                                 .picture |  | ||||||
|                                                 ?.id, |  | ||||||
|                                       size: 72, |                                       size: 72, | ||||||
|                                       ), |                                     ).padding(horizontal: 4), | ||||||
|                                     ), |  | ||||||
|                                 ], |                                 ], | ||||||
|                               ), |                               ), | ||||||
|                             ), |                             ), | ||||||
|                           ); |                           ); | ||||||
|                         } |                         } | ||||||
|                         if (viewMode.value == 'stage') { |  | ||||||
|                         // Stage view: show main speaker(s) large, others in row |                         // Stage view: show main speaker(s) large, others in row | ||||||
|                         final mainSpeakers = |                         final mainSpeakers = | ||||||
|                             participants |                             participants | ||||||
| @@ -166,95 +176,13 @@ class CallScreen extends HookConsumerWidget { | |||||||
|                         if (mainSpeakers.isEmpty && participants.isNotEmpty) { |                         if (mainSpeakers.isEmpty && participants.isNotEmpty) { | ||||||
|                           mainSpeakers.add(participants.first); |                           mainSpeakers.add(participants.first); | ||||||
|                         } |                         } | ||||||
|                           final others = |  | ||||||
|                               participants |  | ||||||
|                                   .where((p) => !mainSpeakers.contains(p)) |  | ||||||
|                                   .toList(); |  | ||||||
|                         return Column( |                         return Column( | ||||||
|                             children: [ |  | ||||||
|                               Expanded( |  | ||||||
|                                 child: Row( |  | ||||||
|                                   mainAxisAlignment: MainAxisAlignment.center, |  | ||||||
|                           children: [ |                           children: [ | ||||||
|                             for (final speaker in mainSpeakers) |                             for (final speaker in mainSpeakers) | ||||||
|                               Expanded( |                               Expanded( | ||||||
|                                         child: |                                 child: CallParticipantTile(live: speaker), | ||||||
|                                             AspectRatio( |  | ||||||
|                                               aspectRatio: 16 / 9, |  | ||||||
|                                               child: Card( |  | ||||||
|                                                 margin: EdgeInsets.zero, |  | ||||||
|                                                 child: ClipRRect( |  | ||||||
|                                                   borderRadius: |  | ||||||
|                                                       BorderRadius.circular(8), |  | ||||||
|                                                   child: Column( |  | ||||||
|                                                     children: [ |  | ||||||
|                                                       CallParticipantTile( |  | ||||||
|                                                         live: speaker, |  | ||||||
|                               ), |                               ), | ||||||
|                           ], |                           ], | ||||||
|                                                   ), |  | ||||||
|                                                 ), |  | ||||||
|                                               ), |  | ||||||
|                                             ).center(), |  | ||||||
|                                       ), |  | ||||||
|                                   ], |  | ||||||
|                                 ).padding(horizontal: 12), |  | ||||||
|                               ), |  | ||||||
|                               if (others.isNotEmpty) |  | ||||||
|                                 SizedBox( |  | ||||||
|                                   height: 100, |  | ||||||
|                                   child: ListView( |  | ||||||
|                                     scrollDirection: Axis.horizontal, |  | ||||||
|                                     children: [ |  | ||||||
|                                       for (final other in others) |  | ||||||
|                                         Padding( |  | ||||||
|                                           padding: const EdgeInsets.symmetric( |  | ||||||
|                                             horizontal: 8, |  | ||||||
|                                           ), |  | ||||||
|                                           child: CallParticipantTile( |  | ||||||
|                                             live: other, |  | ||||||
|                                           ), |  | ||||||
|                                         ), |  | ||||||
|                                     ], |  | ||||||
|                                   ), |  | ||||||
|                                 ), |  | ||||||
|                             ], |  | ||||||
|                           ); |  | ||||||
|                         } |  | ||||||
|                         // Default: grid view |  | ||||||
|                         return GridView.builder( |  | ||||||
|                           padding: const EdgeInsets.symmetric( |  | ||||||
|                             horizontal: 12, |  | ||||||
|                             vertical: 8, |  | ||||||
|                           ), |  | ||||||
|                           gridDelegate: |  | ||||||
|                               SliverGridDelegateWithFixedCrossAxisCount( |  | ||||||
|                                 crossAxisCount: |  | ||||||
|                                     isWidestScreen(context) |  | ||||||
|                                         ? 4 |  | ||||||
|                                         : isWiderScreen(context) |  | ||||||
|                                         ? 3 |  | ||||||
|                                         : 2, |  | ||||||
|                                 childAspectRatio: 16 / 9, |  | ||||||
|                                 crossAxisSpacing: 8, |  | ||||||
|                                 mainAxisSpacing: 8, |  | ||||||
|                               ), |  | ||||||
|                           itemCount: participants.length, |  | ||||||
|                           itemBuilder: (context, idx) { |  | ||||||
|                             final live = participants[idx]; |  | ||||||
|                             return AspectRatio( |  | ||||||
|                               aspectRatio: 16 / 9, |  | ||||||
|                               child: Card( |  | ||||||
|                                 margin: EdgeInsets.zero, |  | ||||||
|                                 child: ClipRRect( |  | ||||||
|                                   borderRadius: BorderRadius.circular(8), |  | ||||||
|                                   child: Column( |  | ||||||
|                                     children: [CallParticipantTile(live: live)], |  | ||||||
|                                   ), |  | ||||||
|                                 ), |  | ||||||
|                               ), |  | ||||||
|                             ).center(); |  | ||||||
|                           }, |  | ||||||
|                         ); |                         ); | ||||||
|                       }, |                       }, | ||||||
|                     ), |                     ), | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ import 'package:island/services/responsive.dart'; | |||||||
| import 'package:island/widgets/account/account_picker.dart'; | import 'package:island/widgets/account/account_picker.dart'; | ||||||
| import 'package:island/widgets/alert.dart'; | import 'package:island/widgets/alert.dart'; | ||||||
| import 'package:island/widgets/app_scaffold.dart'; | import 'package:island/widgets/app_scaffold.dart'; | ||||||
| import 'package:island/widgets/chat/call_overlay.dart'; |  | ||||||
| import 'package:island/widgets/content/cloud_files.dart'; | import 'package:island/widgets/content/cloud_files.dart'; | ||||||
| import 'package:island/widgets/content/sheet.dart'; | import 'package:island/widgets/content/sheet.dart'; | ||||||
| import 'package:island/widgets/realms/selection_dropdown.dart'; | import 'package:island/widgets/realms/selection_dropdown.dart'; | ||||||
| @@ -165,7 +164,7 @@ class ChatRoomListTile extends HookConsumerWidget { | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnChatRoom>> chatroomsJoined(Ref ref) async { | Future<List<SnChatRoom>> chatroomsJoined(Ref ref) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/chat'); |   final resp = await client.get('/sphere/chat'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnChatRoom.fromJson(e)) |       .map((e) => SnChatRoom.fromJson(e)) | ||||||
|       .cast<SnChatRoom>() |       .cast<SnChatRoom>() | ||||||
| @@ -233,7 +232,10 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|       if (result == null) return; |       if (result == null) return; | ||||||
|       final client = ref.read(apiClientProvider); |       final client = ref.read(apiClientProvider); | ||||||
|       try { |       try { | ||||||
|         await client.post('/chat/direct', data: {'related_user_id': result.id}); |         await client.post( | ||||||
|  |           '/sphere/chat/direct', | ||||||
|  |           data: {'related_user_id': result.id}, | ||||||
|  |         ); | ||||||
|         ref.invalidate(chatroomsJoinedProvider); |         ref.invalidate(chatroomsJoinedProvider); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
| @@ -295,6 +297,7 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|             ), |             ), | ||||||
|             onPressed: () { |             onPressed: () { | ||||||
|               showModalBottomSheet( |               showModalBottomSheet( | ||||||
|  |                 useRootNavigator: true, | ||||||
|                 isScrollControlled: true, |                 isScrollControlled: true, | ||||||
|                 context: context, |                 context: context, | ||||||
|                 builder: (context) => const _ChatInvitesSheet(), |                 builder: (context) => const _ChatInvitesSheet(), | ||||||
| @@ -319,7 +322,7 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|                       leading: const Icon(Symbols.add), |                       leading: const Icon(Symbols.add), | ||||||
|                       onTap: () { |                       onTap: () { | ||||||
|                         Navigator.pop(context); |                         Navigator.pop(context); | ||||||
|                         context.push('/chat/new').then((value) { |                         context.pushNamed('chatNew').then((value) { | ||||||
|                           if (value != null) { |                           if (value != null) { | ||||||
|                             ref.invalidate(chatroomsJoinedProvider); |                             ref.invalidate(chatroomsJoinedProvider); | ||||||
|                           } |                           } | ||||||
| @@ -342,9 +345,7 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|         child: const Icon(Symbols.add), |         child: const Icon(Symbols.add), | ||||||
|       ), |       ), | ||||||
|       floatingActionButtonLocation: TabbedFabLocation(context), |       floatingActionButtonLocation: TabbedFabLocation(context), | ||||||
|       body: Stack( |       body: Column( | ||||||
|         children: [ |  | ||||||
|           Column( |  | ||||||
|         children: [ |         children: [ | ||||||
|           Consumer( |           Consumer( | ||||||
|             builder: (context, ref, _) { |             builder: (context, ref, _) { | ||||||
| @@ -379,8 +380,7 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|                                     selectedTab.value == 0 || |                                     selectedTab.value == 0 || | ||||||
|                                     (selectedTab.value == 1 && |                                     (selectedTab.value == 1 && | ||||||
|                                         item.type == 1) || |                                         item.type == 1) || | ||||||
|                                         (selectedTab.value == 2 && |                                     (selectedTab.value == 2 && item.type != 1), | ||||||
|                                             item.type != 1), |  | ||||||
|                               ) |                               ) | ||||||
|                               .length, |                               .length, | ||||||
|                       itemBuilder: (context, index) { |                       itemBuilder: (context, index) { | ||||||
| @@ -400,14 +400,16 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|                           room: item, |                           room: item, | ||||||
|                           isDirect: item.type == 1, |                           isDirect: item.type == 1, | ||||||
|                           onTap: () { |                           onTap: () { | ||||||
|                                 context.push('/chat/${item.id}'); |                             context.pushNamed( | ||||||
|  |                               'chatRoom', | ||||||
|  |                               pathParameters: {'id': item.id}, | ||||||
|  |                             ); | ||||||
|                           }, |                           }, | ||||||
|                         ); |                         ); | ||||||
|                       }, |                       }, | ||||||
|                     ), |                     ), | ||||||
|                   ), |                   ), | ||||||
|                   loading: |               loading: () => const Center(child: CircularProgressIndicator()), | ||||||
|                       () => const Center(child: CircularProgressIndicator()), |  | ||||||
|               error: |               error: | ||||||
|                   (error, stack) => ResponseErrorWidget( |                   (error, stack) => ResponseErrorWidget( | ||||||
|                     error: error, |                     error: error, | ||||||
| @@ -419,14 +421,6 @@ class ChatListScreen extends HookConsumerWidget { | |||||||
|           ), |           ), | ||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|           Positioned( |  | ||||||
|             left: 0, |  | ||||||
|             right: 0, |  | ||||||
|             bottom: getTabbedPadding(context).bottom + 8, |  | ||||||
|             child: const CallOverlayBar().padding(horizontal: 16, vertical: 12), |  | ||||||
|           ), |  | ||||||
|         ], |  | ||||||
|       ), |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -436,7 +430,7 @@ Future<SnChatRoom?> chatroom(Ref ref, String? identifier) async { | |||||||
|   if (identifier == null) return null; |   if (identifier == null) return null; | ||||||
|   try { |   try { | ||||||
|     final client = ref.watch(apiClientProvider); |     final client = ref.watch(apiClientProvider); | ||||||
|     final resp = await client.get('/chat/$identifier'); |     final resp = await client.get('/sphere/chat/$identifier'); | ||||||
|     return SnChatRoom.fromJson(resp.data); |     return SnChatRoom.fromJson(resp.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) { |     if (err is DioException && err.response?.statusCode == 404) { | ||||||
| @@ -451,7 +445,7 @@ Future<SnChatMember?> chatroomIdentity(Ref ref, String? identifier) async { | |||||||
|   if (identifier == null) return null; |   if (identifier == null) return null; | ||||||
|   try { |   try { | ||||||
|     final client = ref.watch(apiClientProvider); |     final client = ref.watch(apiClientProvider); | ||||||
|     final resp = await client.get('/chat/$identifier/members/me'); |     final resp = await client.get('/sphere/chat/$identifier/members/me'); | ||||||
|     return SnChatMember.fromJson(resp.data); |     return SnChatMember.fromJson(resp.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) { |     if (err is DioException && err.response?.statusCode == 404) { | ||||||
| @@ -575,7 +569,7 @@ class EditChatScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         final resp = await client.request( |         final resp = await client.request( | ||||||
|           id == null ? '/chat' : '/chat/$id', |           id == null ? '/sphere/chat' : '/sphere/chat/$id', | ||||||
|           data: { |           data: { | ||||||
|             'name': nameController.text, |             'name': nameController.text, | ||||||
|             'description': descriptionController.text, |             'description': descriptionController.text, | ||||||
| @@ -602,7 +596,8 @@ class EditChatScreen extends HookConsumerWidget { | |||||||
|         title: Text(id == null ? 'createChatRoom' : 'editChatRoom').tr(), |         title: Text(id == null ? 'createChatRoom' : 'editChatRoom').tr(), | ||||||
|         leading: const PageBackButton(), |         leading: const PageBackButton(), | ||||||
|       ), |       ), | ||||||
|       body: Column( |       body: SingleChildScrollView( | ||||||
|  |         child: Column( | ||||||
|           children: [ |           children: [ | ||||||
|             RealmSelectionDropdown( |             RealmSelectionDropdown( | ||||||
|               value: currentRealm.value, |               value: currentRealm.value, | ||||||
| @@ -724,6 +719,7 @@ class EditChatScreen extends HookConsumerWidget { | |||||||
|             ), |             ), | ||||||
|           ], |           ], | ||||||
|         ), |         ), | ||||||
|  |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -731,7 +727,7 @@ class EditChatScreen extends HookConsumerWidget { | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnChatMember>> chatroomInvites(Ref ref) async { | Future<List<SnChatMember>> chatroomInvites(Ref ref) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/chat/invites'); |   final resp = await client.get('/sphere/chat/invites'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnChatMember.fromJson(e)) |       .map((e) => SnChatMember.fromJson(e)) | ||||||
|       .cast<SnChatMember>() |       .cast<SnChatMember>() | ||||||
| @@ -748,7 +744,7 @@ class _ChatInvitesSheet extends HookConsumerWidget { | |||||||
|     Future<void> acceptInvite(SnChatMember invite) async { |     Future<void> acceptInvite(SnChatMember invite) async { | ||||||
|       try { |       try { | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post('/chat/invites/${invite.chatRoom!.id}/accept'); |         await client.post('/sphere/chat/invites/${invite.chatRoom!.id}/accept'); | ||||||
|         ref.invalidate(chatroomInvitesProvider); |         ref.invalidate(chatroomInvitesProvider); | ||||||
|         ref.invalidate(chatroomsJoinedProvider); |         ref.invalidate(chatroomsJoinedProvider); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
| @@ -759,7 +755,9 @@ class _ChatInvitesSheet extends HookConsumerWidget { | |||||||
|     Future<void> declineInvite(SnChatMember invite) async { |     Future<void> declineInvite(SnChatMember invite) async { | ||||||
|       try { |       try { | ||||||
|         final client = ref.read(apiClientProvider); |         final client = ref.read(apiClientProvider); | ||||||
|         await client.post('/chat/invites/${invite.chatRoom!.id}/decline'); |         await client.post( | ||||||
|  |           '/sphere/chat/invites/${invite.chatRoom!.id}/decline', | ||||||
|  |         ); | ||||||
|         ref.invalidate(chatroomInvitesProvider); |         ref.invalidate(chatroomInvitesProvider); | ||||||
|       } catch (err) { |       } catch (err) { | ||||||
|         showErrorAlert(err); |         showErrorAlert(err); | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'chat.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$chatroomsJoinedHash() => r'0c93fd3cb8fe5c87626836ced4f244bfa7598582'; | String _$chatroomsJoinedHash() => r'3bb6389af07e81007680484d04bf5fe6f6c10571'; | ||||||
|  |  | ||||||
| /// See also [chatroomsJoined]. | /// See also [chatroomsJoined]. | ||||||
| @ProviderFor(chatroomsJoined) | @ProviderFor(chatroomsJoined) | ||||||
| @@ -25,7 +25,7 @@ final chatroomsJoinedProvider = | |||||||
| @Deprecated('Will be removed in 3.0. Use Ref instead') | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
| // ignore: unused_element | // ignore: unused_element | ||||||
| typedef ChatroomsJoinedRef = AutoDisposeFutureProviderRef<List<SnChatRoom>>; | typedef ChatroomsJoinedRef = AutoDisposeFutureProviderRef<List<SnChatRoom>>; | ||||||
| String _$chatroomHash() => r'8dac7aaac50932e6dd213039102d43c1cf5f1d4e'; | String _$chatroomHash() => r'2b17d94728026420d18d6c383d2400cf4a070913'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
| @@ -164,7 +164,7 @@ class _ChatroomProviderElement | |||||||
|   String? get identifier => (origin as ChatroomProvider).identifier; |   String? get identifier => (origin as ChatroomProvider).identifier; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$chatroomIdentityHash() => r'ad6ad09b6fc4cf7c4abe146ea97f8e364a3d4fd0'; | String _$chatroomIdentityHash() => r'35e19a5a3e31752c79b97ba0358a7ec8fb8f6e99'; | ||||||
|  |  | ||||||
| /// See also [chatroomIdentity]. | /// See also [chatroomIdentity]. | ||||||
| @ProviderFor(chatroomIdentity) | @ProviderFor(chatroomIdentity) | ||||||
| @@ -286,7 +286,7 @@ class _ChatroomIdentityProviderElement | |||||||
|   String? get identifier => (origin as ChatroomIdentityProvider).identifier; |   String? get identifier => (origin as ChatroomIdentityProvider).identifier; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$chatroomInvitesHash() => r'c15f06c1e9c6074e6159d9d1f4404f31250ce523'; | String _$chatroomInvitesHash() => r'5cd6391b09c5517ede19bacce43b45c8d71dd087'; | ||||||
|  |  | ||||||
| /// See also [chatroomInvites]. | /// See also [chatroomInvites]. | ||||||
| @ProviderFor(chatroomInvites) | @ProviderFor(chatroomInvites) | ||||||
|   | |||||||
| @@ -376,7 +376,11 @@ class ChatRoomScreen extends HookConsumerWidget { | |||||||
|       final wsState = ref.read(websocketStateProvider.notifier); |       final wsState = ref.read(websocketStateProvider.notifier); | ||||||
|       wsState.sendMessage( |       wsState.sendMessage( | ||||||
|         jsonEncode( |         jsonEncode( | ||||||
|           WebSocketPacket(type: 'messages.read', data: {'chat_room_id': id}), |           WebSocketPacket( | ||||||
|  |             type: 'messages.read', | ||||||
|  |             data: {'chat_room_id': id}, | ||||||
|  |             endpoint: 'DysonNetwork.Sphere', | ||||||
|  |           ), | ||||||
|         ), |         ), | ||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
| @@ -393,7 +397,11 @@ class ChatRoomScreen extends HookConsumerWidget { | |||||||
|       final wsState = ref.read(websocketStateProvider.notifier); |       final wsState = ref.read(websocketStateProvider.notifier); | ||||||
|       wsState.sendMessage( |       wsState.sendMessage( | ||||||
|         jsonEncode( |         jsonEncode( | ||||||
|           WebSocketPacket(type: 'messages.typing', data: {'chat_room_id': id}), |           WebSocketPacket( | ||||||
|  |             type: 'messages.typing', | ||||||
|  |             data: {'chat_room_id': id}, | ||||||
|  |             endpoint: 'DysonNetwork.Sphere', | ||||||
|  |           ), | ||||||
|         ), |         ), | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
| @@ -687,7 +695,7 @@ class ChatRoomScreen extends HookConsumerWidget { | |||||||
|           IconButton( |           IconButton( | ||||||
|             icon: const Icon(Icons.more_vert), |             icon: const Icon(Icons.more_vert), | ||||||
|             onPressed: () { |             onPressed: () { | ||||||
|               context.push('/chat/$id/detail'); |               context.pushNamed('chatDetail', pathParameters: {'id': id}); | ||||||
|             }, |             }, | ||||||
|           ), |           ), | ||||||
|           const Gap(8), |           const Gap(8), | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ class ChatDetailScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.patch( |         await client.patch( | ||||||
|           '/chat/$id/members/me/notify', |           '/sphere/chat/$id/members/me/notify', | ||||||
|           data: {'notify_level': level}, |           data: {'notify_level': level}, | ||||||
|         ); |         ); | ||||||
|         ref.invalidate(chatroomIdentityProvider(id)); |         ref.invalidate(chatroomIdentityProvider(id)); | ||||||
| @@ -59,7 +59,7 @@ class ChatDetailScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         await client.patch( |         await client.patch( | ||||||
|           '/chat/$id/members/me/notify', |           '/sphere/chat/$id/members/me/notify', | ||||||
|           data: {'break_until': until.toUtc().toIso8601String()}, |           data: {'break_until': until.toUtc().toIso8601String()}, | ||||||
|         ); |         ); | ||||||
|         ref.invalidate(chatroomProvider(id)); |         ref.invalidate(chatroomProvider(id)); | ||||||
| @@ -389,7 +389,10 @@ class _ChatRoomActionMenu extends HookConsumerWidget { | |||||||
|             if ((chatIdentity.value?.role ?? 0) >= 50) |             if ((chatIdentity.value?.role ?? 0) >= 50) | ||||||
|               PopupMenuItem( |               PopupMenuItem( | ||||||
|                 onTap: () { |                 onTap: () { | ||||||
|                   context.pushReplacement('/chat/$id/edit'); |                   context.pushReplacementNamed( | ||||||
|  |                     'chatEdit', | ||||||
|  |                     pathParameters: {'id': id}, | ||||||
|  |                   ); | ||||||
|                 }, |                 }, | ||||||
|                 child: Row( |                 child: Row( | ||||||
|                   children: [ |                   children: [ | ||||||
| @@ -418,10 +421,10 @@ class _ChatRoomActionMenu extends HookConsumerWidget { | |||||||
|                   showConfirmAlert( |                   showConfirmAlert( | ||||||
|                     'deleteChatRoomHint'.tr(), |                     'deleteChatRoomHint'.tr(), | ||||||
|                     'deleteChatRoom'.tr(), |                     'deleteChatRoom'.tr(), | ||||||
|                   ).then((confirm) { |                   ).then((confirm) async { | ||||||
|                     if (confirm) { |                     if (confirm) { | ||||||
|                       final client = ref.watch(apiClientProvider); |                       final client = ref.watch(apiClientProvider); | ||||||
|                       client.delete('/chat/$id'); |                       await client.delete('/sphere/chat/$id'); | ||||||
|                       ref.invalidate(chatroomsJoinedProvider); |                       ref.invalidate(chatroomsJoinedProvider); | ||||||
|                       if (context.mounted) { |                       if (context.mounted) { | ||||||
|                         context.pop(); |                         context.pop(); | ||||||
| @@ -451,10 +454,10 @@ class _ChatRoomActionMenu extends HookConsumerWidget { | |||||||
|                   showConfirmAlert( |                   showConfirmAlert( | ||||||
|                     'leaveChatRoomHint'.tr(), |                     'leaveChatRoomHint'.tr(), | ||||||
|                     'leaveChatRoom'.tr(), |                     'leaveChatRoom'.tr(), | ||||||
|                   ).then((confirm) { |                   ).then((confirm) async { | ||||||
|                     if (confirm) { |                     if (confirm) { | ||||||
|                       final client = ref.watch(apiClientProvider); |                       final client = ref.watch(apiClientProvider); | ||||||
|                       client.delete('/chat/$id/members/me'); |                       await client.delete('/sphere/chat/$id/members/me'); | ||||||
|                       ref.invalidate(chatroomsJoinedProvider); |                       ref.invalidate(chatroomsJoinedProvider); | ||||||
|                       if (context.mounted) { |                       if (context.mounted) { | ||||||
|                         context.pop(); |                         context.pop(); | ||||||
| @@ -502,7 +505,7 @@ class ChatMemberNotifier extends StateNotifier<ChatRoomMemberState> { | |||||||
|  |  | ||||||
|     try { |     try { | ||||||
|       final response = await _apiClient.get( |       final response = await _apiClient.get( | ||||||
|         '/chat/$roomId/members', |         '/sphere/chat/$roomId/members', | ||||||
|         queryParameters: {'offset': offset, 'take': take}, |         queryParameters: {'offset': offset, 'take': take}, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
| @@ -540,7 +543,7 @@ class ChatMemberListNotifier extends _$ChatMemberListNotifier | |||||||
|  |  | ||||||
|     final apiClient = ref.watch(apiClientProvider); |     final apiClient = ref.watch(apiClientProvider); | ||||||
|     final response = await apiClient.get( |     final response = await apiClient.get( | ||||||
|       '/chat/$roomId/members', |       '/sphere/chat/$roomId/members', | ||||||
|       queryParameters: {'offset': offset, 'take': take}, |       queryParameters: {'offset': offset, 'take': take}, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| @@ -592,7 +595,7 @@ class _ChatMemberListSheet extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final apiClient = ref.watch(apiClientProvider); |         final apiClient = ref.watch(apiClientProvider); | ||||||
|         await apiClient.post( |         await apiClient.post( | ||||||
|           '/chat/invites/$roomId', |           '/sphere/chat/invites/$roomId', | ||||||
|           data: {'related_user_id': result.id, 'role': 0}, |           data: {'related_user_id': result.id, 'role': 0}, | ||||||
|         ); |         ); | ||||||
|         // Refresh both providers |         // Refresh both providers | ||||||
| @@ -846,7 +849,7 @@ class _ChatMemberRoleSheet extends HookConsumerWidget { | |||||||
|  |  | ||||||
|                       final apiClient = ref.read(apiClientProvider); |                       final apiClient = ref.read(apiClientProvider); | ||||||
|                       await apiClient.patch( |                       await apiClient.patch( | ||||||
|                         '/chat/$roomId/members/${member.accountId}/role', |                         '/sphere/chat/$roomId/members/${member.accountId}/role', | ||||||
|                         data: newRole, |                         data: newRole, | ||||||
|                       ); |                       ); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| // dart format width=80 |  | ||||||
| // coverage:ignore-file |  | ||||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | // GENERATED CODE - DO NOT MODIFY BY HAND | ||||||
|  | // coverage:ignore-file | ||||||
| // ignore_for_file: type=lint | // 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 | // 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 | ||||||
|  |  | ||||||
| @@ -76,6 +75,130 @@ as String?, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /// Adds pattern-matching-related methods to [ChatRoomMemberState]. | ||||||
|  | extension ChatRoomMemberStatePatterns on ChatRoomMemberState { | ||||||
|  | /// 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( _ChatRoomMemberState value)?  $default,{required TResult orElse(),}){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState() 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( _ChatRoomMemberState value)  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState(): | ||||||
|  | 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( _ChatRoomMemberState value)?  $default,){ | ||||||
|  | final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState() 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( List<SnChatMember> members,  bool isLoading,  int total,  String? error)?  $default,{required TResult orElse(),}) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState() when $default != null: | ||||||
|  | return $default(_that.members,_that.isLoading,_that.total,_that.error);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( List<SnChatMember> members,  bool isLoading,  int total,  String? error)  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState(): | ||||||
|  | return $default(_that.members,_that.isLoading,_that.total,_that.error);} | ||||||
|  | } | ||||||
|  | /// 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( List<SnChatMember> members,  bool isLoading,  int total,  String? error)?  $default,) {final _that = this; | ||||||
|  | switch (_that) { | ||||||
|  | case _ChatRoomMemberState() when $default != null: | ||||||
|  | return $default(_that.members,_that.isLoading,_that.total,_that.error);case _: | ||||||
|  |   return null; | ||||||
|  |  | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /// @nodoc | /// @nodoc | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ part of 'room_detail.dart'; | |||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$chatMemberListNotifierHash() => | String _$chatMemberListNotifierHash() => | ||||||
|     r'f2191a631ba00ae3de39ccac10e4cdd065ffee17'; |     r'c8fbf4b95df6dae24b1ba21063e9a43351832974'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ part 'hub.g.dart'; | |||||||
| Future<SnPublisherStats?> publisherStats(Ref ref, String? uname) async { | Future<SnPublisherStats?> publisherStats(Ref ref, String? uname) async { | ||||||
|   if (uname == null) return null; |   if (uname == null) return null; | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   final resp = await apiClient.get('/publishers/$uname/stats'); |   final resp = await apiClient.get('/sphere/publishers/$uname/stats'); | ||||||
|   return SnPublisherStats.fromJson(resp.data); |   return SnPublisherStats.fromJson(resp.data); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -37,7 +37,9 @@ Future<SnPublisherStats?> publisherStats(Ref ref, String? uname) async { | |||||||
| Future<SnPublisherMember?> publisherIdentity(Ref ref, String uname) async { | Future<SnPublisherMember?> publisherIdentity(Ref ref, String uname) async { | ||||||
|   try { |   try { | ||||||
|     final apiClient = ref.watch(apiClientProvider); |     final apiClient = ref.watch(apiClientProvider); | ||||||
|     final response = await apiClient.get('/publishers/$uname/members/me'); |     final response = await apiClient.get( | ||||||
|  |       '/sphere/publishers/$uname/members/me', | ||||||
|  |     ); | ||||||
|     return SnPublisherMember.fromJson(response.data); |     return SnPublisherMember.fromJson(response.data); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     if (err is DioException && err.response?.statusCode == 404) { |     if (err is DioException && err.response?.statusCode == 404) { | ||||||
| @@ -51,14 +53,14 @@ Future<SnPublisherMember?> publisherIdentity(Ref ref, String uname) async { | |||||||
| Future<Map<String, bool>> publisherFeatures(Ref ref, String? uname) async { | Future<Map<String, bool>> publisherFeatures(Ref ref, String? uname) async { | ||||||
|   if (uname == null) return {}; |   if (uname == null) return {}; | ||||||
|   final apiClient = ref.watch(apiClientProvider); |   final apiClient = ref.watch(apiClientProvider); | ||||||
|   final response = await apiClient.get('/publishers/$uname/features'); |   final response = await apiClient.get('/sphere/publishers/$uname/features'); | ||||||
|   return Map<String, bool>.from(response.data); |   return Map<String, bool>.from(response.data); | ||||||
| } | } | ||||||
|  |  | ||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnPublisherMember>> publisherInvites(Ref ref) async { | Future<List<SnPublisherMember>> publisherInvites(Ref ref) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/publishers/invites'); |   final resp = await client.get('/sphere/publishers/invites'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnPublisherMember.fromJson(e)) |       .map((e) => SnPublisherMember.fromJson(e)) | ||||||
|       .cast<SnPublisherMember>() |       .cast<SnPublisherMember>() | ||||||
| @@ -81,7 +83,7 @@ class PublisherMemberListNotifier extends _$PublisherMemberListNotifier | |||||||
|     final offset = cursor != null ? int.parse(cursor) : 0; |     final offset = cursor != null ? int.parse(cursor) : 0; | ||||||
|  |  | ||||||
|     final response = await apiClient.get( |     final response = await apiClient.get( | ||||||
|       '/publishers/$uname/members', |       '/sphere/publishers/$uname/members', | ||||||
|       queryParameters: {'offset': offset, 'take': _pageSize}, |       queryParameters: {'offset': offset, 'take': _pageSize}, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| @@ -112,9 +114,9 @@ class CreatorHubShellScreen extends StatelessWidget { | |||||||
|         isRoot: true, |         isRoot: true, | ||||||
|         child: Row( |         child: Row( | ||||||
|           children: [ |           children: [ | ||||||
|             SizedBox(width: 360, child: const CreatorHubScreen(isAside: true)), |             Flexible(flex: 2, child: const CreatorHubScreen(isAside: true)), | ||||||
|             const VerticalDivider(width: 1), |             const VerticalDivider(width: 1), | ||||||
|             Expanded(child: child), |             Flexible(flex: 3, child: child), | ||||||
|           ], |           ], | ||||||
|         ), |         ), | ||||||
|       ); |       ); | ||||||
| @@ -141,13 +143,18 @@ class CreatorHubScreen extends HookConsumerWidget { | |||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     void updatePublisher() { |     void updatePublisher() { | ||||||
|       context.push('/creators/${currentPublisher.value!.name}/edit').then(( |       context | ||||||
|         value, |           .pushNamed( | ||||||
|       ) async { |             'creatorEdit', | ||||||
|  |             pathParameters: {'name': currentPublisher.value!.name}, | ||||||
|  |           ) | ||||||
|  |           .then((value) async { | ||||||
|             if (value == null) return; |             if (value == null) return; | ||||||
|             final data = await ref.refresh(publishersManagedProvider.future); |             final data = await ref.refresh(publishersManagedProvider.future); | ||||||
|             currentPublisher.value = |             currentPublisher.value = | ||||||
|             data.where((e) => e.id == currentPublisher.value!.id).firstOrNull; |                 data | ||||||
|  |                     .where((e) => e.id == currentPublisher.value!.id) | ||||||
|  |                     .firstOrNull; | ||||||
|           }); |           }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -156,7 +163,7 @@ class CreatorHubScreen extends HookConsumerWidget { | |||||||
|         (confirm) { |         (confirm) { | ||||||
|           if (confirm) { |           if (confirm) { | ||||||
|             final client = ref.watch(apiClientProvider); |             final client = ref.watch(apiClientProvider); | ||||||
|             client.delete('/publishers/${currentPublisher.value!.name}'); |             client.delete('/sphere/publishers/${currentPublisher.value!.name}'); | ||||||
|             ref.invalidate(publishersManagedProvider); |             ref.invalidate(publishersManagedProvider); | ||||||
|             currentPublisher.value = null; |             currentPublisher.value = null; | ||||||
|           } |           } | ||||||
| @@ -324,7 +331,7 @@ class CreatorHubScreen extends HookConsumerWidget { | |||||||
|                             subtitle: Text('createPublisherHint').tr(), |                             subtitle: Text('createPublisherHint').tr(), | ||||||
|                             trailing: const Icon(Symbols.chevron_right), |                             trailing: const Icon(Symbols.chevron_right), | ||||||
|                             onTap: () { |                             onTap: () { | ||||||
|                               context.push('/creators/new').then((value) { |                               context.pushNamed('creatorNew').then((value) { | ||||||
|                                 if (value != null) { |                                 if (value != null) { | ||||||
|                                   ref.invalidate(publishersManagedProvider); |                                   ref.invalidate(publishersManagedProvider); | ||||||
|                                 } |                                 } | ||||||
| @@ -348,8 +355,11 @@ class CreatorHubScreen extends HookConsumerWidget { | |||||||
|                               horizontal: 24, |                               horizontal: 24, | ||||||
|                             ), |                             ), | ||||||
|                             onTap: () { |                             onTap: () { | ||||||
|                               context.push( |                               context.pushNamed( | ||||||
|                                 '/creators/${currentPublisher.value!.name}/stickers', |                                 'creatorStickers', | ||||||
|  |                                 pathParameters: { | ||||||
|  |                                   'name': currentPublisher.value!.name, | ||||||
|  |                                 }, | ||||||
|                               ); |                               ); | ||||||
|                             }, |                             }, | ||||||
|                           ), |                           ), | ||||||
| @@ -362,8 +372,11 @@ class CreatorHubScreen extends HookConsumerWidget { | |||||||
|                               horizontal: 24, |                               horizontal: 24, | ||||||
|                             ), |                             ), | ||||||
|                             onTap: () { |                             onTap: () { | ||||||
|                               context.push( |                               context.pushNamed( | ||||||
|                                 '/creators/${currentPublisher.value!.name}/posts', |                                 'creatorPosts', | ||||||
|  |                                 pathParameters: { | ||||||
|  |                                   'name': currentPublisher.value!.name, | ||||||
|  |                                 }, | ||||||
|                               ); |                               ); | ||||||
|                             }, |                             }, | ||||||
|                           ), |                           ), | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'hub.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$publisherStatsHash() => r'315705881d116b2aeac93f94f5ee2bc816d9f0f6'; | String _$publisherStatsHash() => r'eea4ed98bf165cc785874f83b912bb7e23d1f7bc'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
| @@ -149,7 +149,7 @@ class _PublisherStatsProviderElement | |||||||
|   String? get uname => (origin as PublisherStatsProvider).uname; |   String? get uname => (origin as PublisherStatsProvider).uname; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$publisherIdentityHash() => r'f7fd986a303a729ca5557022fceb37cd01fa17f3'; | String _$publisherIdentityHash() => r'299372f25fa4b2bf8e11a8ba2d645100fc38e76f'; | ||||||
|  |  | ||||||
| /// See also [publisherIdentity]. | /// See also [publisherIdentity]. | ||||||
| @ProviderFor(publisherIdentity) | @ProviderFor(publisherIdentity) | ||||||
| @@ -271,7 +271,7 @@ class _PublisherIdentityProviderElement | |||||||
|   String get uname => (origin as PublisherIdentityProvider).uname; |   String get uname => (origin as PublisherIdentityProvider).uname; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$publisherFeaturesHash() => r'34db65d9a4b6b0c6961733ae79e67f25d5d111d3'; | String _$publisherFeaturesHash() => r'08bace2d9a3da227ecec0cbf8709e55ee0646ca2'; | ||||||
|  |  | ||||||
| /// See also [publisherFeatures]. | /// See also [publisherFeatures]. | ||||||
| @ProviderFor(publisherFeatures) | @ProviderFor(publisherFeatures) | ||||||
| @@ -393,7 +393,7 @@ class _PublisherFeaturesProviderElement | |||||||
|   String? get uname => (origin as PublisherFeaturesProvider).uname; |   String? get uname => (origin as PublisherFeaturesProvider).uname; | ||||||
| } | } | ||||||
|  |  | ||||||
| String _$publisherInvitesHash() => r'488cd443407895ce11f4edff07cb6ea58f2aa018'; | String _$publisherInvitesHash() => r'93aafc2f02af0a7a055ec1770b3999363dfaabdc'; | ||||||
|  |  | ||||||
| /// See also [publisherInvites]. | /// See also [publisherInvites]. | ||||||
| @ProviderFor(publisherInvites) | @ProviderFor(publisherInvites) | ||||||
| @@ -414,7 +414,7 @@ final publisherInvitesProvider = | |||||||
| typedef PublisherInvitesRef = | typedef PublisherInvitesRef = | ||||||
|     AutoDisposeFutureProviderRef<List<SnPublisherMember>>; |     AutoDisposeFutureProviderRef<List<SnPublisherMember>>; | ||||||
| String _$publisherMemberListNotifierHash() => | String _$publisherMemberListNotifierHash() => | ||||||
|     r'237e8f39c9757a6cbdff817853c697539242ad2a'; |     r'b4afd5d591a6f3d29f1b45fb1b6d17cb34f3f11b'; | ||||||
|  |  | ||||||
| abstract class _$PublisherMemberListNotifier | abstract class _$PublisherMemberListNotifier | ||||||
|     extends |     extends | ||||||
|   | |||||||
| @@ -30,8 +30,9 @@ class CreatorPostListScreen extends HookConsumerWidget { | |||||||
|                     subtitle: Text('Create a regular post'), |                     subtitle: Text('Create a regular post'), | ||||||
|                     onTap: () async { |                     onTap: () async { | ||||||
|                       Navigator.pop(context); |                       Navigator.pop(context); | ||||||
|                       final result = await context.push( |                       final result = await context.pushNamed( | ||||||
|                         '/posts/compose?type=0', |                         'postCompose', | ||||||
|  |                         queryParameters: {'type': '0'}, | ||||||
|                       ); |                       ); | ||||||
|                       if (result == true) { |                       if (result == true) { | ||||||
|                         refreshKey.value++; |                         refreshKey.value++; | ||||||
| @@ -44,8 +45,9 @@ class CreatorPostListScreen extends HookConsumerWidget { | |||||||
|                     subtitle: Text('Create a detailed article'), |                     subtitle: Text('Create a detailed article'), | ||||||
|                     onTap: () async { |                     onTap: () async { | ||||||
|                       Navigator.pop(context); |                       Navigator.pop(context); | ||||||
|                       final result = await context.push( |                       final result = await context.pushNamed( | ||||||
|                         '/posts/compose?type=1', |                         'postCompose', | ||||||
|  |                         queryParameters: {'type': '1'}, | ||||||
|                       ); |                       ); | ||||||
|                       if (result == true) { |                       if (result == true) { | ||||||
|                         refreshKey.value++; |                         refreshKey.value++; | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ part 'publishers.g.dart'; | |||||||
| @riverpod | @riverpod | ||||||
| Future<List<SnPublisher>> publishersManaged(Ref ref) async { | Future<List<SnPublisher>> publishersManaged(Ref ref) async { | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/publishers'); |   final resp = await client.get('/sphere/publishers'); | ||||||
|   return resp.data |   return resp.data | ||||||
|       .map((e) => SnPublisher.fromJson(e)) |       .map((e) => SnPublisher.fromJson(e)) | ||||||
|       .cast<SnPublisher>() |       .cast<SnPublisher>() | ||||||
| @@ -40,7 +40,7 @@ Future<List<SnPublisher>> publishersManaged(Ref ref) async { | |||||||
| Future<SnPublisher?> publisher(Ref ref, String? identifier) async { | Future<SnPublisher?> publisher(Ref ref, String? identifier) async { | ||||||
|   if (identifier == null) return null; |   if (identifier == null) return null; | ||||||
|   final client = ref.watch(apiClientProvider); |   final client = ref.watch(apiClientProvider); | ||||||
|   final resp = await client.get('/publishers/$identifier'); |   final resp = await client.get('/sphere/publishers/$identifier'); | ||||||
|   return SnPublisher.fromJson(resp.data); |   return SnPublisher.fromJson(resp.data); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -160,11 +160,11 @@ class EditPublisherScreen extends HookConsumerWidget { | |||||||
|       try { |       try { | ||||||
|         final client = ref.watch(apiClientProvider); |         final client = ref.watch(apiClientProvider); | ||||||
|         final resp = await client.request( |         final resp = await client.request( | ||||||
|           name == null |           '/sphere${name == null | ||||||
|               ? currentRealm.value == null |               ? currentRealm.value == null | ||||||
|                   ? '/publishers/individual' |                   ? '/publishers/individual' | ||||||
|                   : '/publishers/organization/${currentRealm.value!.slug}' |                   : '/publishers/organization/${currentRealm.value!.slug}' | ||||||
|               : '/publishers/$name', |               : '/publishers/$name'}', | ||||||
|           data: { |           data: { | ||||||
|             'name': nameController.text, |             'name': nameController.text, | ||||||
|             'nick': nickController.text, |             'nick': nickController.text, | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ part of 'publishers.dart'; | |||||||
| // RiverpodGenerator | // RiverpodGenerator | ||||||
| // ************************************************************************** | // ************************************************************************** | ||||||
|  |  | ||||||
| String _$publishersManagedHash() => r'1ea611c8d45c46002976c99bf4ee7f60bd6dbf8e'; | String _$publishersManagedHash() => r'ea83759fed9bd5119738b4d09f12b4476959e0a3'; | ||||||
|  |  | ||||||
| /// See also [publishersManaged]. | /// See also [publishersManaged]. | ||||||
| @ProviderFor(publishersManaged) | @ProviderFor(publishersManaged) | ||||||
| @@ -25,7 +25,7 @@ final publishersManagedProvider = | |||||||
| @Deprecated('Will be removed in 3.0. Use Ref instead') | @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||||
| // ignore: unused_element | // ignore: unused_element | ||||||
| typedef PublishersManagedRef = AutoDisposeFutureProviderRef<List<SnPublisher>>; | typedef PublishersManagedRef = AutoDisposeFutureProviderRef<List<SnPublisher>>; | ||||||
| String _$publisherHash() => r'd66f2efba7ae449b9b460a4da34ce48cf3b16fe5'; | String _$publisherHash() => r'18fb5c6b3d79dd8af4fbee108dec1a0e8a034038'; | ||||||
|  |  | ||||||
| /// Copied from Dart SDK | /// Copied from Dart SDK | ||||||
| class _SystemHash { | class _SystemHash { | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user