Compare commits
	
		
			117 Commits
		
	
	
		
			3.0.0+112
			...
			6558854a7a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6558854a7a | |||
| 892035ab27 | |||
| 87ae8d2ff4 | |||
| 15c2dbaa0d | |||
| 6b3338b885 | |||
| bb00b1bc6a | |||
| 5e1a15ada2 | |||
| 9bdf8ba346 | |||
| 204c087f29 | |||
| 1def3e1895 | |||
| 550c74e544 | |||
| a39565f012 | |||
| aa9755e6a7 | |||
| b25e8d661a | |||
| 4b253ac3ec | |||
| 5d1b875d3c | |||
| e2e103fa67 | |||
| 43c90da4e3 | |||
| fa210dd98f | |||
| 43d9ca92bf | |||
| 5e592c143f | |||
| 0c59816f26 | |||
| 19c2457895 | |||
| af8d87857e | |||
| d05f63a36a | |||
| e2dc520012 | |||
| cff9c15e31 | |||
| f00135c4bf | |||
| 30b8a6c30f | |||
| b9c4ee31b1 | |||
| 87870af866 | |||
| b83cb0fb0b | |||
| 7fd1fe34e5 | |||
| 1c18330891 | |||
| d320879ad0 | |||
| 950150e119 | |||
| 3c4a9767e1 | |||
| 5df2445f3f | |||
| 56543d7b4c | |||
| 4c6fea1242 | |||
| fff43de9e3 | |||
| b31a915544 | |||
| 8956723ac5 | |||
| ccc3ac415e | |||
| 8c47a59b80 | |||
| a6d869ebf6 | |||
| f3a8699389 | |||
| d345c00e84 | |||
| a706f127b6 | |||
| 680ece0b6a | |||
| b976c6ed37 | |||
| 6ae6b132de | |||
| 95aec7c95b | |||
| edd760fbcb | |||
| ba269dbbb8 | |||
| 1aa45dd9f1 | |||
| 92685d7410 | |||
| c8e351514d | |||
| f3900825e3 | |||
| 2cc6652f75 | |||
| 4d4409de2e | |||
| e1286c797f | |||
| bec037622f | |||
| a0d8c1a9b3 | |||
| 26135d2116 | |||
| 71b67fd22d | |||
| 855072dfea | |||
| b39e2e2d64 | |||
| 84b1d6a346 | |||
| 28335dd548 | |||
| 7253e2d3ef | |||
| 4d489425fa | |||
| 890a8a44cf | |||
| 8e3583f57a | |||
| d0ff14659f | |||
| 1f7caaeaac | |||
| 9f9f42071a | |||
| 6bd6e994cb | |||
| 02e68d76ee | |||
| d04b06089c | |||
| 9be6fea2e0 | |||
| 6b1214a06f | |||
| 4597373ac9 | |||
| 047c8d93aa | |||
| 715f95ca22 | |||
| ba709012d7 | |||
| fd186f8391 | |||
| 262d36cd2d | |||
| f320855348 | |||
| ed90152462 | |||
| 6e5c5f1690 | |||
| 7c92dee097 | |||
| e4bb031138 | |||
| 97226ae96b | |||
| d8cd33e79a | |||
| 5ecd39b6a9 | |||
| 8854305e99 | |||
| 903cade296 | |||
| e48410a528 | |||
| 170ea4f2c0 | |||
| 19f0e11384 | |||
| 80bf6c3bbe | |||
| 8352ce8b5b | |||
| c06abf6e42 | |||
| 37cc0a5291 | |||
| 25ae18d6a9 | |||
| 18db50d80c | |||
| 903008d397 | |||
| 4499d4ec8e | |||
| 3a4faac8cb | |||
| e6c58b7b63 | |||
| a7454edec0 | |||
| cbf1952eb7 | |||
| 6d06f0a1b4 | |||
| f2d2a9efd8 | |||
| d44c8217b0 | |||
| 446c33d8b0 | 
							
								
								
									
										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 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev | ||||
|           sudo apt-get install -y gstreamer-1.0 | ||||
|           sudo apt-get install -y libsecret-1-0 | ||||
|           sudo apt-get install -y libsecret-1-dev | ||||
|       - run: flutter pub get | ||||
|       - run: flutter build linux | ||||
|       - name: Archive production artifacts | ||||
|   | ||||
| @@ -8,6 +8,9 @@ | ||||
|  | ||||
| Hello there! Welcome to the main repository of the DysonNetwork (also known as the Solar Network). The code here is mainly about the front-end app (also known as Solian). But you can still post issues here to get help and request new features! | ||||
|  | ||||
| 如果你看得懂这行字,你可以前往我们的文档来了解更多: | ||||
| [Suki - Solar Network](https://kb.solsynth.dev/zh/solar-network) | ||||
|  | ||||
| ## Server | ||||
|  | ||||
| The backend of the Solar Network project is located at [Solsynth/DysonNetwork](https://github.com/Solsynth/DysonNetwork) | ||||
| @@ -25,8 +28,6 @@ The content below will lead you to the world of Solar Network. | ||||
|  | ||||
| ### For Normal Users | ||||
|  | ||||
| **The v3 Release is not ready, yet.** | ||||
|  | ||||
| 1. Go to the Github Releases page, and download the latest release / pre-release according to your platform. | ||||
|    - **What's the difference between stable and pre-release?** The pre-release is untested by the other users and includes the new cutting-edge features, usually the pre-release is the feature drop. At the same time, due to we're not doing the API versioning, some breaking changes may break the stable release, so use the pre-release one instead. | ||||
| 2. Create an account on the Solar Network | ||||
|   | ||||
| @@ -59,7 +59,6 @@ dependencies { | ||||
|     implementation("com.google.android.material:material:1.12.0") | ||||
|     implementation("com.github.bumptech.glide:glide:4.16.0") | ||||
|     implementation("com.squareup.okhttp3:okhttp:4.12.0") | ||||
|     implementation("com.google.firebase:firebase-messaging-ktx") | ||||
| } | ||||
|  | ||||
| flutter { | ||||
|   | ||||
| @@ -12,7 +12,12 @@ | ||||
|           "package_name": "dev.solsynth.solian" | ||||
|         } | ||||
|       }, | ||||
|       "oauth_client": [], | ||||
|       "oauth_client": [ | ||||
|         { | ||||
|           "client_id": "961776991058-963m1qin2vtp8fv693b5fdrab5hmpl89.apps.googleusercontent.com", | ||||
|           "client_type": 3 | ||||
|         } | ||||
|       ], | ||||
|       "api_key": [ | ||||
|         { | ||||
|           "current_key": "AIzaSyDvFNudXYs29uDtcCv6pFR8h5tXBs90FYk" | ||||
| @@ -20,7 +25,20 @@ | ||||
|       ], | ||||
|       "services": { | ||||
|         "appinvite_service": { | ||||
|           "other_platform_oauth_client": [] | ||||
|           "other_platform_oauth_client": [ | ||||
|             { | ||||
|               "client_id": "961776991058-963m1qin2vtp8fv693b5fdrab5hmpl89.apps.googleusercontent.com", | ||||
|               "client_type": 3 | ||||
|             }, | ||||
|             { | ||||
|               "client_id": "961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com", | ||||
|               "client_type": 2, | ||||
|               "ios_info": { | ||||
|                 "bundle_id": "dev.solsynth.solian", | ||||
|                 "app_store_id": "6499032345" | ||||
|               } | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
|     <uses-permission android:name="android.permission.CAMERA" /> | ||||
|     <uses-permission android:name="android.permission.RECORD_AUDIO" /> | ||||
|     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> | ||||
|     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | ||||
|     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> | ||||
|     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> | ||||
| @@ -89,6 +90,13 @@ | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|  | ||||
|         <!-- Livekit Screenshare --> | ||||
|         <service | ||||
|             android:name="de.julianassmann.flutter_background.IsolateHolderService" | ||||
|             android:enabled="true" | ||||
|             android:exported="false" | ||||
|             android:foregroundServiceType="mediaProjection" /> | ||||
|  | ||||
|         <!-- Sign in with Apple --> | ||||
|         <activity | ||||
|             android:name="com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback" | ||||
| @@ -109,14 +117,6 @@ | ||||
|             android:enabled="true" | ||||
|             android:exported="true" /> | ||||
|  | ||||
|         <service | ||||
|             android:name=".service.MessagingService" | ||||
|             android:exported="false"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="com.google.firebase.MESSAGING_EVENT" /> | ||||
|             </intent-filter> | ||||
|         </service> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.core.content.FileProvider" | ||||
|             android:authorities="dev.solsynth.solian.provider" | ||||
| @@ -143,4 +143,4 @@ | ||||
|             <data android:mimeType="text/plain" /> | ||||
|         </intent> | ||||
|     </queries> | ||||
| </manifest> | ||||
| </manifest> | ||||
|   | ||||
| @@ -1,102 +0,0 @@ | ||||
| package dev.solsynth.solian.service | ||||
|  | ||||
| import android.app.PendingIntent | ||||
| import android.content.Intent | ||||
| import android.graphics.Bitmap | ||||
| import android.graphics.drawable.Drawable | ||||
| import android.os.Build | ||||
| import androidx.core.app.NotificationCompat | ||||
| import androidx.core.app.NotificationManagerCompat | ||||
| import androidx.core.app.RemoteInput | ||||
| import com.bumptech.glide.Glide | ||||
| import com.bumptech.glide.request.target.CustomTarget | ||||
| import com.bumptech.glide.request.transition.Transition | ||||
| import com.google.firebase.messaging.FirebaseMessagingService | ||||
| import com.google.firebase.messaging.RemoteMessage | ||||
| import dev.solsynth.solian.MainActivity | ||||
| import dev.solsynth.solian.receiver.ReplyReceiver | ||||
| import org.json.JSONObject | ||||
|  | ||||
| class MessagingService: FirebaseMessagingService() { | ||||
|     override fun onMessageReceived(remoteMessage: RemoteMessage) { | ||||
|         val type = remoteMessage.data["type"] | ||||
|         if (type == "messages.new") { | ||||
|             handleMessageNotification(remoteMessage) | ||||
|         } else { | ||||
|             // Handle other notification types | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun handleMessageNotification(remoteMessage: RemoteMessage) { | ||||
|         val data = remoteMessage.data | ||||
|         val metaString = data["meta"] ?: return | ||||
|         val meta = JSONObject(metaString) | ||||
|  | ||||
|         val pfp = meta.optString("pfp", null) | ||||
|         val roomId = meta.optString("room_id", null) | ||||
|         val messageId = meta.optString("message_id", null) | ||||
|  | ||||
|         val notificationId = System.currentTimeMillis().toInt() | ||||
|  | ||||
|         val replyLabel = "Reply" | ||||
|         val remoteInput = RemoteInput.Builder("key_text_reply") | ||||
|             .setLabel(replyLabel) | ||||
|             .build() | ||||
|  | ||||
|         val replyIntent = Intent(this, ReplyReceiver::class.java).apply { | ||||
|             putExtra("room_id", roomId) | ||||
|             putExtra("message_id", messageId) | ||||
|             putExtra("notification_id", notificationId) | ||||
|         } | ||||
|  | ||||
|         val pendingIntentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { | ||||
|             PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE | ||||
|         } else { | ||||
|             PendingIntent.FLAG_UPDATE_CURRENT | ||||
|         } | ||||
|  | ||||
|         val replyPendingIntent = PendingIntent.getBroadcast( | ||||
|             applicationContext, | ||||
|             notificationId, | ||||
|             replyIntent, | ||||
|             pendingIntentFlags | ||||
|         ) | ||||
|  | ||||
|         val action = NotificationCompat.Action.Builder( | ||||
|             android.R.drawable.ic_menu_send, | ||||
|             replyLabel, | ||||
|             replyPendingIntent | ||||
|         ) | ||||
|             .addRemoteInput(remoteInput) | ||||
|             .build() | ||||
|  | ||||
|         val intent = Intent(this, MainActivity::class.java) | ||||
|         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) | ||||
|         intent.putExtra("room_id", roomId) | ||||
|         val pendingIntent = PendingIntent.getActivity(this, 0, intent, pendingIntentFlags) | ||||
|  | ||||
|         val notificationBuilder = NotificationCompat.Builder(this, "messages") | ||||
|             .setSmallIcon(android.R.drawable.ic_dialog_info) | ||||
|             .setContentTitle(remoteMessage.notification?.title) | ||||
|             .setContentText(remoteMessage.notification?.body) | ||||
|             .setPriority(NotificationCompat.PRIORITY_HIGH) | ||||
|             .setContentIntent(pendingIntent) | ||||
|             .addAction(action) | ||||
|  | ||||
|         if (pfp != null) { | ||||
|             Glide.with(applicationContext) | ||||
|                 .asBitmap() | ||||
|                 .load(pfp) | ||||
|                 .into(object : CustomTarget<Bitmap>() { | ||||
|                     override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { | ||||
|                         notificationBuilder.setLargeIcon(resource) | ||||
|                         NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build()) | ||||
|                     } | ||||
|  | ||||
|                     override fun onLoadCleared(placeholder: Drawable?) {} | ||||
|                 }) | ||||
|         } else { | ||||
|             NotificationManagerCompat.from(this).notify(notificationId, notificationBuilder.build()) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -144,9 +144,16 @@ | ||||
|     "other": "{} attachments" | ||||
|   }, | ||||
|   "edited": "Edited", | ||||
|   "editedAt": "Edited at {}", | ||||
|   "addVideo": "Add video", | ||||
|   "addPhoto": "Add photo", | ||||
|   "addAudio": "Add audio", | ||||
|   "addFile": "Add file", | ||||
|   "recordAudio": "Record Audio", | ||||
|   "linkAttachment": "Link Attachment", | ||||
|   "fileIdCannotBeEmpty": "File ID cannot be empty", | ||||
|   "fileIdLinkHint": "Haven't upload to the Solar Network? Tap here to open Solar Network Drive to customize your uploads.", | ||||
|   "failedToFetchFile": "Failed to fetch file: {}", | ||||
|   "createDirectMessage": "Send new DM", | ||||
|   "gotoDirectMessage": "Go to DM", | ||||
|   "react": "React", | ||||
| @@ -352,6 +359,8 @@ | ||||
|   "postTitle": "Title", | ||||
|   "postDescription": "Description", | ||||
|   "call": "Call", | ||||
|   "callLeave": "Leave", | ||||
|   "callEnd": "End this call", | ||||
|   "done": "Done", | ||||
|   "loginResetPasswordSent": "Password reset link sent, please check your email inbox.", | ||||
|   "accountDeletion": "Delete Account", | ||||
| @@ -622,8 +631,8 @@ | ||||
|   "chatJoin": "Join the Chat", | ||||
|   "realmJoin": "Join the Realm", | ||||
|   "realmJoinSuccess": "Successfully joined the realm.", | ||||
|   "discoverRealms": "Discover Realms", | ||||
|   "discoverPublishers": "Discover Publishers", | ||||
|   "discoverRealms": "Discover realms", | ||||
|   "discoverPublishers": "Discover publishers", | ||||
|   "search": "Search", | ||||
|   "publisherMembers": "Collaborators", | ||||
|   "developerHub": "Developer Hub", | ||||
| @@ -698,5 +707,85 @@ | ||||
|   "postForwardingTo": "Forwarding to", | ||||
|   "postReplyingTo": "Replying to", | ||||
|   "postEditing": "You are editing an existing post", | ||||
|   "postArticle": "Article" | ||||
| } | ||||
|   "postArticle": "Article", | ||||
|   "aboutDeviceName": "Device Name", | ||||
|   "aboutDeviceIdentifier": "Device Identifier", | ||||
|   "donate": "Donate", | ||||
|   "donateDescription": "Support us to continue developing the Solar Network and keep the server up and running.", | ||||
|   "fileId": "File ID", | ||||
|   "fileIdHint": "The file ID is the ID you get after upload the file via the Solar Network Drive.", | ||||
|   "translate": "Translate", | ||||
|   "translating": "Translating", | ||||
|   "translated": "Translated", | ||||
|   "reactionThumbUp": "Thumbs Up", | ||||
|   "reactionThumbDown": "Thumbs Down", | ||||
|   "reactionJustOkay": "Just Okay", | ||||
|   "reactionCry": "Cry", | ||||
|   "reactionConfuse": "Confused", | ||||
|   "reactionClap": "Clap", | ||||
|   "reactionLaugh": "Laugh", | ||||
|   "reactionAngry": "Angry", | ||||
|   "reactionParty": "Party", | ||||
|   "reactionPray": "Pray", | ||||
|   "reactionHeart": "Heart", | ||||
|   "selectMicrophone": "Select Microphone", | ||||
|   "selectCamera": "Select Camera", | ||||
|   "switchedTo": "Switched to {}", | ||||
|   "connecting": "Connecting", | ||||
|   "reconnecting": "Reconnecting", | ||||
|   "disconnected": "Disconnected", | ||||
|   "connected": "Connected", | ||||
|   "repliesLoadMore": "Load more replies", | ||||
|   "attachmentsRecentUploads": "Recent Uploads", | ||||
|   "attachmentsManualInput": "Manual Input", | ||||
|   "crop": "Crop", | ||||
|   "rename": "Rename", | ||||
|   "markAsSensitive": "Mark as Sensitive", | ||||
|   "fileName": "File name", | ||||
|   "sensitiveCategories.language": "Language", | ||||
|   "sensitiveCategories.sexualContent": "Sexual Content", | ||||
|   "sensitiveCategories.violence": "Violence", | ||||
|   "sensitiveCategories.profanity": "Profanity", | ||||
|   "sensitiveCategories.hateSpeech": "Hate Speech", | ||||
|   "sensitiveCategories.racism": "Racism", | ||||
|   "sensitiveCategories.adultContent": "Adult Content", | ||||
|   "sensitiveCategories.drugAbuse": "Drug Abuse", | ||||
|   "sensitiveCategories.alcoholAbuse": "Alcohol Abuse", | ||||
|   "sensitiveCategories.gambling": "Gambling", | ||||
|   "sensitiveCategories.selfHarm": "Self-harm", | ||||
|   "sensitiveCategories.childAbuse": "Child Abuse", | ||||
|   "sensitiveCategories.other": "Other", | ||||
|   "poll": "Poll", | ||||
|   "pollsRecent": "Recent Polls", | ||||
|   "pollCreateNew": "Create New", | ||||
|   "pollCreateNewHint": "Create a new poll for your post. Pick a publisher and continue.", | ||||
|   "publisher": "Publisher", | ||||
|   "publisherHint": "Enter the publisher name", | ||||
|   "publisherCannotBeEmpty": "Publisher cannot be empty", | ||||
|   "operationFailed": "Operation failed: {}", | ||||
|   "stickerMarketplace": "Sticker Marketplace", | ||||
|   "stickerPackAdded": "Sticker pack added to your collection", | ||||
|   "stickerPackRemoved": "Sticker pack removed from your collection", | ||||
|   "addPack": "Add Pack", | ||||
|   "removePack": "Remove Pack", | ||||
|   "browseAndAddStickers": "Browse and add sticker packs", | ||||
|   "stickerPack": "Sticker Pack", | ||||
|   "postCategoryTechnology": "Technology", | ||||
|   "postCategoryTravel": "Travel", | ||||
|   "postCategoryFood": "Food", | ||||
|   "postCategoryHealth": "Health", | ||||
|   "postCategoryScience": "Science", | ||||
|   "postCategorySports": "Sports", | ||||
|   "postCategoryFinance": "Finance", | ||||
|   "postCategoryLife": "Life", | ||||
|   "postCategoryArt": "Art", | ||||
|   "postCategoryStudy": "Study", | ||||
|   "postCategoryGaming": "Gaming", | ||||
|   "postCategoryProgramming": "Programming", | ||||
|   "postCategoryMusic": "Music", | ||||
|   "links": "Links", | ||||
|   "addLink": "Add link", | ||||
|   "linkKey": "Link Name", | ||||
|   "linkValue": "URL", | ||||
|   "debugOptions": "Debug Options" | ||||
| } | ||||
|   | ||||
| @@ -120,9 +120,14 @@ | ||||
|     "other": "{}个附件" | ||||
|   }, | ||||
|   "edited": "已编辑", | ||||
|   "editedAt": "编辑于 {}", | ||||
|   "addVideo": "添加视频", | ||||
|   "addPhoto": "添加照片", | ||||
|   "addFile": "添加文件", | ||||
|   "addAttachmentById": "通过 ID 添加附件", | ||||
|   "enterFileId": "输入文件 ID", | ||||
|   "fileIdCannotBeEmpty": "文件 ID 不能为空", | ||||
|   "failedToFetchFile": "获取文件失败: {}", | ||||
|   "createDirectMessage": "创建新私人消息", | ||||
|   "gotoDirectMessage": "前往私信", | ||||
|   "react": "反应", | ||||
|   | ||||
| @@ -123,6 +123,10 @@ | ||||
|     "addVideo": "新增影片", | ||||
|     "addPhoto": "新增照片", | ||||
|     "addFile": "新增檔案", | ||||
|     "addAttachmentById": "透過 ID 新增附件", | ||||
|     "enterFileId": "輸入檔案 ID", | ||||
|     "fileIdCannotBeEmpty": "檔案 ID 不能為空", | ||||
|     "failedToFetchFile": "無法取得檔案: {}", | ||||
|     "createDirectMessage": "建立新私人訊息", | ||||
|     "gotoDirectMessage": "Go to DM", | ||||
|     "react": "反應", | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| {"flutter":{"platforms":{"android":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:android:a8d3f7995b0b8e86f4188b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"solian-0x001","configurations":{"android":"1:961776991058:android:a8d3f7995b0b8e86f4188b","ios":"1:961776991058:ios:727229d368cc47e1f4188b","macos":"1:961776991058:ios:727229d368cc47e1f4188b","web":"1:961776991058:web:b91d12f2892a5609f4188b","windows":"1:961776991058:web:3a912c0eb14028e5f4188b"}}}}}} | ||||
| {"flutter":{"platforms":{"android":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:android:a8d3f7995b0b8e86f4188b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"solian-0x001","appId":"1:961776991058:ios:727229d368cc47e1f4188b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"solian-0x001","configurations":{"android":"1:961776991058:android:a8d3f7995b0b8e86f4188b","ios":"1:961776991058:ios:727229d368cc47e1f4188b","macos":"1:961776991058:ios:727229d368cc47e1f4188b","web":"1:961776991058:web:3a912c0eb14028e5f4188b","windows":"1:961776991058:web:3a912c0eb14028e5f4188b"}}}}}} | ||||
| @@ -1,5 +1,5 @@ | ||||
| # Uncomment this line to define a global platform for your project | ||||
| platform :ios, '13.0' | ||||
| platform :ios, '15.0' | ||||
|  | ||||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||
|   | ||||
| @@ -40,33 +40,33 @@ PODS: | ||||
|   - file_picker (0.0.1): | ||||
|     - DKImagePickerController/PhotoGallery | ||||
|     - Flutter | ||||
|   - Firebase/CoreOnly (11.15.0): | ||||
|     - FirebaseCore (~> 11.15.0) | ||||
|   - Firebase/Messaging (11.15.0): | ||||
|   - Firebase/CoreOnly (12.0.0): | ||||
|     - FirebaseCore (~> 12.0.0) | ||||
|   - Firebase/Messaging (12.0.0): | ||||
|     - Firebase/CoreOnly | ||||
|     - FirebaseMessaging (~> 11.15.0) | ||||
|   - firebase_core (3.15.0): | ||||
|     - Firebase/CoreOnly (= 11.15.0) | ||||
|     - FirebaseMessaging (~> 12.0.0) | ||||
|   - firebase_core (4.0.0): | ||||
|     - Firebase/CoreOnly (= 12.0.0) | ||||
|     - Flutter | ||||
|   - firebase_messaging (15.2.8): | ||||
|     - Firebase/Messaging (= 11.15.0) | ||||
|   - firebase_messaging (16.0.0): | ||||
|     - Firebase/Messaging (= 12.0.0) | ||||
|     - firebase_core | ||||
|     - Flutter | ||||
|   - FirebaseCore (11.15.0): | ||||
|     - FirebaseCoreInternal (~> 11.15.0) | ||||
|   - FirebaseCore (12.0.0): | ||||
|     - FirebaseCoreInternal (~> 12.0.0) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/Logger (~> 8.1) | ||||
|   - FirebaseCoreInternal (11.15.0): | ||||
|   - FirebaseCoreInternal (12.0.0): | ||||
|     - "GoogleUtilities/NSData+zlib (~> 8.1)" | ||||
|   - FirebaseInstallations (11.15.0): | ||||
|     - FirebaseCore (~> 11.15.0) | ||||
|   - FirebaseInstallations (12.0.0): | ||||
|     - FirebaseCore (~> 12.0.0) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/UserDefaults (~> 8.1) | ||||
|     - PromisesObjC (~> 2.4) | ||||
|   - FirebaseMessaging (11.15.0): | ||||
|     - FirebaseCore (~> 11.15.0) | ||||
|     - FirebaseInstallations (~> 11.0) | ||||
|     - GoogleDataTransport (~> 10.0) | ||||
|   - FirebaseMessaging (12.0.0): | ||||
|     - FirebaseCore (~> 12.0.0) | ||||
|     - FirebaseInstallations (~> 12.0.0) | ||||
|     - GoogleDataTransport (~> 10.1) | ||||
|     - GoogleUtilities/AppDelegateSwizzler (~> 8.1) | ||||
|     - GoogleUtilities/Environment (~> 8.1) | ||||
|     - GoogleUtilities/Reachability (~> 8.1) | ||||
| @@ -93,9 +93,9 @@ PODS: | ||||
|   - flutter_udid (0.0.1): | ||||
|     - Flutter | ||||
|     - SAMKeychain | ||||
|   - flutter_webrtc (0.14.0): | ||||
|   - flutter_webrtc (1.0.0): | ||||
|     - Flutter | ||||
|     - WebRTC-SDK (= 125.6422.07) | ||||
|     - WebRTC-SDK (= 137.7151.02) | ||||
|   - gal (1.0.0): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
| @@ -130,11 +130,11 @@ PODS: | ||||
|     - Flutter | ||||
|   - irondash_engine_context (0.0.1): | ||||
|     - Flutter | ||||
|   - Kingfisher (8.3.3) | ||||
|   - livekit_client (2.4.9): | ||||
|   - Kingfisher (8.5.0) | ||||
|   - livekit_client (2.5.0): | ||||
|     - Flutter | ||||
|     - flutter_webrtc | ||||
|     - WebRTC-SDK (= 125.6422.07) | ||||
|     - WebRTC-SDK (= 137.7151.02) | ||||
|   - local_auth_darwin (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
| @@ -178,28 +178,31 @@ PODS: | ||||
|   - sqflite_darwin (0.0.4): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|   - sqlite3 (3.50.1): | ||||
|     - sqlite3/common (= 3.50.1) | ||||
|   - sqlite3/common (3.50.1) | ||||
|   - sqlite3/dbstatvtab (3.50.1): | ||||
|   - sqlite3 (3.50.3): | ||||
|     - sqlite3/common (= 3.50.3) | ||||
|   - sqlite3/common (3.50.3) | ||||
|   - sqlite3/dbstatvtab (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/fts5 (3.50.1): | ||||
|   - sqlite3/fts5 (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/math (3.50.1): | ||||
|   - sqlite3/math (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/perf-threadsafe (3.50.1): | ||||
|   - sqlite3/perf-threadsafe (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/rtree (3.50.1): | ||||
|   - sqlite3/rtree (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3/session (3.50.3): | ||||
|     - sqlite3/common | ||||
|   - sqlite3_flutter_libs (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|     - sqlite3 (~> 3.50.1) | ||||
|     - sqlite3 (~> 3.50.3) | ||||
|     - sqlite3/dbstatvtab | ||||
|     - sqlite3/fts5 | ||||
|     - sqlite3/math | ||||
|     - sqlite3/perf-threadsafe | ||||
|     - sqlite3/rtree | ||||
|     - sqlite3/session | ||||
|   - super_native_extensions (0.0.1): | ||||
|     - Flutter | ||||
|   - SwiftyGif (5.4.5) | ||||
| @@ -209,7 +212,7 @@ PODS: | ||||
|     - Flutter | ||||
|   - wakelock_plus (0.0.1): | ||||
|     - Flutter | ||||
|   - WebRTC-SDK (125.6422.07) | ||||
|   - WebRTC-SDK (137.7151.02) | ||||
|  | ||||
| DEPENDENCIES: | ||||
|   - Alamofire | ||||
| @@ -361,13 +364,13 @@ SPEC CHECKSUMS: | ||||
|   DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c | ||||
|   DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 | ||||
|   file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be | ||||
|   Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e | ||||
|   firebase_core: c727a02c560a53f1f1e56e18f16515eb5753c492 | ||||
|   firebase_messaging: 4158969b04b667f5435731ec9d6e453bb58b0c4c | ||||
|   FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e | ||||
|   FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 | ||||
|   FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 | ||||
|   FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 | ||||
|   Firebase: 800d487043c0557d9faed71477a38d9aafb08a41 | ||||
|   firebase_core: 633e1851ffe1b9ab875f6467a4f574c79cef02e4 | ||||
|   firebase_messaging: d17feef781edc84ebefe62624fb384358ad96361 | ||||
|   FirebaseCore: 055f4ab117d5964158c833f3d5e7ec6d91648d4a | ||||
|   FirebaseCoreInternal: dedc28e569a4be85f38f3d6af1070a2e12018d55 | ||||
|   FirebaseInstallations: d4c7c958f99c8860d7fcece786314ae790e2f988 | ||||
|   FirebaseMessaging: af49f8d7c0a3d2a017d9302c80946f45a7777dde | ||||
|   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 | ||||
|   flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 | ||||
|   flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 | ||||
| @@ -376,15 +379,15 @@ SPEC CHECKSUMS: | ||||
|   flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 | ||||
|   flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544 | ||||
|   flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9 | ||||
|   flutter_webrtc: fd0d3bdef8766a0736dbbe2e5b7e85f1f3c52117 | ||||
|   flutter_webrtc: 6f7da106613d52ade777d5b4875a43f48c28b457 | ||||
|   gal: baecd024ebfd13c441269ca7404792a7152fde89 | ||||
|   GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 | ||||
|   GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 | ||||
|   image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a | ||||
|   irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486 | ||||
|   Kingfisher: ff82cb91d9266ddb56cbb2f72d32c26f00d3e5be | ||||
|   livekit_client: 3f79d79233a5bd13d5b541732624ef959d7c538e | ||||
|   local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 | ||||
|   Kingfisher: ff0d31a1f07bdff6a1ebb3ba08b8e6e567b6500c | ||||
|   livekit_client: e3b79b99405428aac439b6b76a254cd9a11dbbfb | ||||
|   local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 | ||||
|   media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854 | ||||
|   media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474 | ||||
|   nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 | ||||
| @@ -403,15 +406,15 @@ SPEC CHECKSUMS: | ||||
|   shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 | ||||
|   sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 | ||||
|   sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 | ||||
|   sqlite3: 1d85290c3321153511f6e900ede7a1608718bbd5 | ||||
|   sqlite3_flutter_libs: e7fc8c9ea2200ff3271f08f127842131746b70e2 | ||||
|   sqlite3: 83105acd294c9137c026e2da1931c30b4588ab81 | ||||
|   sqlite3_flutter_libs: 616267f2fca40e9c6af8c5d82324e05667040b6e | ||||
|   super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4 | ||||
|   SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 | ||||
|   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d | ||||
|   volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 | ||||
|   wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 | ||||
|   WebRTC-SDK: dff00a3892bc570b6014e046297782084071657e | ||||
|   WebRTC-SDK: d20de357dcbf7c9696b124b39f3ff62125107e4b | ||||
|  | ||||
| PODFILE CHECKSUM: f6df17c2a0cbd7af89692fd3877231eaea40230f | ||||
| PODFILE CHECKSUM: c818292390b02fa379036ea099713a332bd7193f | ||||
|  | ||||
| COCOAPODS: 1.16.2 | ||||
|   | ||||
| @@ -10,6 +10,8 @@ | ||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||
| 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; | ||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | ||||
| 		73ACDFAD2E3D0E6100B63535 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */; }; | ||||
| 		73ACDFC32E3D0E6100B63535 /* SolianBroadcastExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73CDD6812DEC00480059D95D /* SolianNotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; | ||||
| 		73D4264B2DEB815D006C0AAE /* NotifyDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */; }; | ||||
| @@ -32,6 +34,13 @@ | ||||
| 			remoteGlobalIDString = 97C146ED1CF9000F007C117D; | ||||
| 			remoteInfo = Runner; | ||||
| 		}; | ||||
| 		73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||
| 			proxyType = 1; | ||||
| 			remoteGlobalIDString = 73ACDFAA2E3D0E6100B63535; | ||||
| 			remoteInfo = SolianBroadcastExtension; | ||||
| 		}; | ||||
| 		73C305D62E0BE878009035B9 /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||
| @@ -55,6 +64,7 @@ | ||||
| 			dstPath = ""; | ||||
| 			dstSubfolderSpec = 13; | ||||
| 			files = ( | ||||
| 				73ACDFC32E3D0E6100B63535 /* SolianBroadcastExtension.appex in Embed Foundation Extensions */, | ||||
| 				73C305D82E0BE878009035B9 /* SolianShareExtension.appex in Embed Foundation Extensions */, | ||||
| 				73CDD6812DEC00480059D95D /* SolianNotificationService.appex in Embed Foundation Extensions */, | ||||
| 			); | ||||
| @@ -91,6 +101,9 @@ | ||||
| 		3A1C47BD29CC6AC2587D4DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		737E920B2DB6A9FF00BE9CDB /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; }; | ||||
| 		73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianBroadcastExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; }; | ||||
| 		73ACDFB82E3D0E6100B63535 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | ||||
| 		73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		73D4264A2DEB815D006C0AAE /* NotifyDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyDelegate.swift; sourceTree = "<group>"; }; | ||||
| @@ -117,6 +130,13 @@ | ||||
| /* End PBXFileReference section */ | ||||
|  | ||||
| /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ | ||||
| 		73ACDFCA2E3D0E6100B63535 /* Exceptions for "SolianBroadcastExtension" folder in "SolianBroadcastExtension" target */ = { | ||||
| 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | ||||
| 			membershipExceptions = ( | ||||
| 				Info.plist, | ||||
| 			); | ||||
| 			target = 73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */; | ||||
| 		}; | ||||
| 		73C305DC2E0BE878009035B9 /* Exceptions for "SolianShareExtension" folder in "SolianShareExtension" target */ = { | ||||
| 			isa = PBXFileSystemSynchronizedBuildFileExceptionSet; | ||||
| 			membershipExceptions = ( | ||||
| @@ -150,6 +170,14 @@ | ||||
| 			path = Services; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */ = { | ||||
| 			isa = PBXFileSystemSynchronizedRootGroup; | ||||
| 			exceptions = ( | ||||
| 				73ACDFCA2E3D0E6100B63535 /* Exceptions for "SolianBroadcastExtension" folder in "SolianBroadcastExtension" target */, | ||||
| 			); | ||||
| 			path = SolianBroadcastExtension; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		73C305CF2E0BE878009035B9 /* SolianShareExtension */ = { | ||||
| 			isa = PBXFileSystemSynchronizedRootGroup; | ||||
| 			exceptions = ( | ||||
| @@ -177,6 +205,14 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA82E3D0E6100B63535 /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				73ACDFAD2E3D0E6100B63535 /* ReplayKit.framework in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CB2E0BE878009035B9 /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -220,6 +256,8 @@ | ||||
| 				AA0CA8A3E15DEE023BB27438 /* Pods_NotificationService.framework */, | ||||
| 				39FE4CC6223F0D3C0E1FFD04 /* Pods_SolianNotificationService.framework */, | ||||
| 				7B40764A2C4CC0E7DC70A0D3 /* Pods_SolianShareExtension.framework */, | ||||
| 				73ACDFAC2E3D0E6100B63535 /* ReplayKit.framework */, | ||||
| 				73ACDFB82E3D0E6100B63535 /* UIKit.framework */, | ||||
| 			); | ||||
| 			name = Frameworks; | ||||
| 			sourceTree = "<group>"; | ||||
| @@ -264,6 +302,7 @@ | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				73CDD67B2DEC00480059D95D /* SolianNotificationService */, | ||||
| 				73C305CF2E0BE878009035B9 /* SolianShareExtension */, | ||||
| 				73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 				331C8082294A63A400263BE5 /* RunnerTests */, | ||||
| 				91E124CE95BCB4DCD890160D /* Pods */, | ||||
| @@ -279,6 +318,7 @@ | ||||
| 				331C8081294A63A400263BE5 /* RunnerTests.xctest */, | ||||
| 				73CDD67A2DEC00480059D95D /* SolianNotificationService.appex */, | ||||
| 				73C305CE2E0BE878009035B9 /* SolianShareExtension.appex */, | ||||
| 				73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| @@ -323,6 +363,26 @@ | ||||
| 			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; | ||||
| 			productType = "com.apple.product-type.bundle.unit-test"; | ||||
| 		}; | ||||
| 		73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 73ACDFCB2E3D0E6100B63535 /* Build configuration list for PBXNativeTarget "SolianBroadcastExtension" */; | ||||
| 			buildPhases = ( | ||||
| 				73ACDFA72E3D0E6100B63535 /* Sources */, | ||||
| 				73ACDFA82E3D0E6100B63535 /* Frameworks */, | ||||
| 				73ACDFA92E3D0E6100B63535 /* Resources */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			fileSystemSynchronizedGroups = ( | ||||
| 				73ACDFAE2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 			); | ||||
| 			name = SolianBroadcastExtension; | ||||
| 			productName = SolianBroadcastExtension; | ||||
| 			productReference = 73ACDFAB2E3D0E6100B63535 /* SolianBroadcastExtension.appex */; | ||||
| 			productType = "com.apple.product-type.app-extension"; | ||||
| 		}; | ||||
| 		73C305CD2E0BE878009035B9 /* SolianShareExtension */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */; | ||||
| @@ -385,6 +445,7 @@ | ||||
| 			dependencies = ( | ||||
| 				73CDD6802DEC00480059D95D /* PBXTargetDependency */, | ||||
| 				73C305D72E0BE878009035B9 /* PBXTargetDependency */, | ||||
| 				73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */, | ||||
| 			); | ||||
| 			fileSystemSynchronizedGroups = ( | ||||
| 				73268D272DEB012A0076E970 /* Services */, | ||||
| @@ -409,6 +470,9 @@ | ||||
| 						CreatedOnToolsVersion = 14.0; | ||||
| 						TestTargetID = 97C146ED1CF9000F007C117D; | ||||
| 					}; | ||||
| 					73ACDFAA2E3D0E6100B63535 = { | ||||
| 						CreatedOnToolsVersion = 16.4; | ||||
| 					}; | ||||
| 					73C305CD2E0BE878009035B9 = { | ||||
| 						CreatedOnToolsVersion = 16.4; | ||||
| 					}; | ||||
| @@ -438,6 +502,7 @@ | ||||
| 				331C8080294A63A400263BE5 /* RunnerTests */, | ||||
| 				73CDD6792DEC00480059D95D /* SolianNotificationService */, | ||||
| 				73C305CD2E0BE878009035B9 /* SolianShareExtension */, | ||||
| 				73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| @@ -450,6 +515,13 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA92E3D0E6100B63535 /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CC2E0BE878009035B9 /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -643,6 +715,13 @@ | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73ACDFA72E3D0E6100B63535 /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		73C305CA2E0BE878009035B9 /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| @@ -675,6 +754,11 @@ | ||||
| 			target = 97C146ED1CF9000F007C117D /* Runner */; | ||||
| 			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| 		73ACDFC22E3D0E6100B63535 /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 73ACDFAA2E3D0E6100B63535 /* SolianBroadcastExtension */; | ||||
| 			targetProxy = 73ACDFC12E3D0E6100B63535 /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| 		73C305D72E0BE878009035B9 /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 73C305CD2E0BE878009035B9 /* SolianShareExtension */; | ||||
| @@ -773,7 +857,7 @@ | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -836,6 +920,123 @@ | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		73ACDFC42E3D0E6100B63535 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		73ACDFC52E3D0E6100B63535 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		73ACDFC62E3D0E6100B63535 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CODE_SIGN_ENTITLEMENTS = SolianBroadcastExtension/SolianBroadcastExtension.entitlements; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				DEVELOPMENT_TEAM = W7HPZ53V6B; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu17; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				INFOPLIST_FILE = SolianBroadcastExtension/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = SolianBroadcastExtension; | ||||
| 				INFOPLIST_KEY_NSHumanReadableCopyright = ""; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@executable_path/../../Frameworks", | ||||
| 				); | ||||
| 				LOCALIZATION_PREFERS_STRING_CATALOGS = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianBroadcastExtension; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_EMIT_LOC_STRINGS = YES; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		73C305D92E0BE878009035B9 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 17FAB080A9C53193ABD9C15B /* Pods-SolianShareExtension.debug.xcconfig */; | ||||
| @@ -1204,7 +1405,7 @@ | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -1232,7 +1433,7 @@ | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				INFOPLIST_KEY_CFBundleDisplayName = Solian; | ||||
| 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 13.0; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 15.0; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| @@ -1258,6 +1459,16 @@ | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		73ACDFCB2E3D0E6100B63535 /* Build configuration list for PBXNativeTarget "SolianBroadcastExtension" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				73ACDFC42E3D0E6100B63535 /* Debug */, | ||||
| 				73ACDFC52E3D0E6100B63535 /* Release */, | ||||
| 				73ACDFC62E3D0E6100B63535 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		73C305DD2E0BE878009035B9 /* Build configuration list for PBXNativeTarget "SolianShareExtension" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
|   | ||||
| @@ -27,6 +27,7 @@ import UIKit | ||||
|         UNUserNotificationCenter.current().setNotificationCategories([replyableMessageCategory]) | ||||
|          | ||||
|         GeneratedPluginRegistrant.register(with: self) | ||||
|          | ||||
|         return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> | ||||
|     <device id="retina6_12" orientation="portrait" appearance="light"/> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/> | ||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--Flutter View Controller--> | ||||
| @@ -14,13 +16,14 @@ | ||||
|                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||||
|                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|             <point key="canvasLocation" x="-26" y="-76"/> | ||||
|         </scene> | ||||
|     </scenes> | ||||
| </document> | ||||
|   | ||||
| @@ -2,6 +2,12 @@ | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CLIENT_ID</key> | ||||
| 	<string>961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com</string> | ||||
| 	<key>REVERSED_CLIENT_ID</key> | ||||
| 	<string>com.googleusercontent.apps.961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig</string> | ||||
| 	<key>ANDROID_CLIENT_ID</key> | ||||
| 	<string>961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com</string> | ||||
| 	<key>API_KEY</key> | ||||
| 	<string>AIzaSyCzQIyiYKoYHTpGXhN-IjgMML8z797WVD8</string> | ||||
| 	<key>GCM_SENDER_ID</key> | ||||
|   | ||||
| @@ -83,6 +83,8 @@ | ||||
| 	<false/> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
|   | ||||
							
								
								
									
										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) { | ||||
|     return (update(chatMessages) | ||||
|       ..where((m) => m.id.equals(message.id.value))).write(message); | ||||
|     return into(chatMessages).insert(message, mode: InsertMode.insertOrReplace); | ||||
|   } | ||||
|  | ||||
|   Future<int> updateMessageStatus(String id, MessageStatus status) { | ||||
|   | ||||
| @@ -38,7 +38,7 @@ class MessageRepository { | ||||
|     if (lastMessage == null) return false; | ||||
|     try { | ||||
|       final resp = await _apiClient.post( | ||||
|         '/chat/${room.id}/sync', | ||||
|         '/sphere/chat/${room.id}/sync', | ||||
|         data: { | ||||
|           'last_sync_timestamp': | ||||
|               lastMessage.toRemoteMessage().updatedAt.millisecondsSinceEpoch, | ||||
| @@ -154,7 +154,7 @@ class MessageRepository { | ||||
|     // Use cached total count if available, otherwise fetch it | ||||
|     if (_totalCount == null) { | ||||
|       final response = await _apiClient.get( | ||||
|         '/chat/$roomId/messages', | ||||
|         '/sphere/chat/$roomId/messages', | ||||
|         queryParameters: {'offset': 0, 'take': 1}, | ||||
|       ); | ||||
|       _totalCount = int.parse(response.headers['x-total']?.firstOrNull ?? '0'); | ||||
| @@ -165,7 +165,7 @@ class MessageRepository { | ||||
|     } | ||||
|  | ||||
|     final response = await _apiClient.get( | ||||
|       '/chat/$roomId/messages', | ||||
|       '/sphere/chat/$roomId/messages', | ||||
|       queryParameters: {'offset': offset, 'take': take}, | ||||
|     ); | ||||
|  | ||||
| @@ -269,8 +269,8 @@ class MessageRepository { | ||||
|       // Send to server | ||||
|       final response = await _apiClient.request( | ||||
|         editingTo == null | ||||
|             ? '/chat/$roomId/messages' | ||||
|             : '/chat/$roomId/messages/${editingTo.id}', | ||||
|             ? '/sphere/chat/$roomId/messages' | ||||
|             : '/sphere/chat/$roomId/messages/${editingTo.id}', | ||||
|         data: { | ||||
|           'content': content, | ||||
|           'attachments_id': cloudAttachments.map((e) => e.id).toList(), | ||||
| @@ -325,7 +325,7 @@ class MessageRepository { | ||||
|       // Send to server | ||||
|       var remoteMessage = message.toRemoteMessage(); | ||||
|       final response = await _apiClient.post( | ||||
|         '/chat/${message.roomId}/messages', | ||||
|         '/sphere/chat/${message.roomId}/messages', | ||||
|         data: { | ||||
|           'content': remoteMessage.content, | ||||
|           'attachments_id': remoteMessage.attachments, | ||||
| @@ -423,7 +423,7 @@ class MessageRepository { | ||||
|     try { | ||||
|       // Update on server | ||||
|       final response = await _apiClient.put( | ||||
|         '/chat/${room.id}/messages/$messageId', | ||||
|         '/sphere/chat/${room.id}/messages/$messageId', | ||||
|         data: {'content': content, 'attachments': attachments, 'meta': meta}, | ||||
|       ); | ||||
|  | ||||
| @@ -444,7 +444,7 @@ class MessageRepository { | ||||
|  | ||||
|   Future<void> deleteMessage(String messageId) async { | ||||
|     try { | ||||
|       await _apiClient.delete('/chat/${room.id}/messages/$messageId'); | ||||
|       await _apiClient.delete('/sphere/chat/${room.id}/messages/$messageId'); | ||||
|       pendingMessages.remove(messageId); | ||||
|       await _database.deleteMessage(messageId); | ||||
|     } catch (e) { | ||||
| @@ -464,7 +464,7 @@ class MessageRepository { | ||||
|  | ||||
|       // If not found locally, fetch from the server | ||||
|       final response = await _apiClient.get( | ||||
|         '/chat/${room.id}/messages/$messageId', | ||||
|         '/sphere/chat/${room.id}/messages/$messageId', | ||||
|       ); | ||||
|       final remoteMessage = SnChatMessage.fromJson(response.data); | ||||
|       final message = LocalChatMessage.fromRemoteMessage( | ||||
|   | ||||
| @@ -29,10 +29,7 @@ class DefaultFirebaseOptions { | ||||
|       case TargetPlatform.windows: | ||||
|         return windows; | ||||
|       case TargetPlatform.linux: | ||||
|         throw UnsupportedError( | ||||
|           'DefaultFirebaseOptions have not been configured for linux - ' | ||||
|           'you can reconfigure this by running the FlutterFire CLI again.', | ||||
|         ); | ||||
|         return windows; | ||||
|       default: | ||||
|         throw UnsupportedError( | ||||
|           'DefaultFirebaseOptions are not supported for this platform.', | ||||
| @@ -41,13 +38,13 @@ class DefaultFirebaseOptions { | ||||
|   } | ||||
|  | ||||
|   static const FirebaseOptions web = FirebaseOptions( | ||||
|     apiKey: 'AIzaSyBKfIQpTouj5rXnlzkEieSlbAzepm4mgJE', | ||||
|     appId: '1:961776991058:web:b91d12f2892a5609f4188b', | ||||
|     apiKey: 'AIzaSyCfgOdlcr7h8x8j0WKx_S2wXnGkOopq320', | ||||
|     appId: '1:961776991058:web:3a912c0eb14028e5f4188b', | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     authDomain: 'solian-0x001.firebaseapp.com', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     measurementId: 'G-XY3HHKG0PE', | ||||
|     measurementId: 'G-JD1YEG9D6F', | ||||
|   ); | ||||
|  | ||||
|   static const FirebaseOptions android = FirebaseOptions( | ||||
| @@ -64,6 +61,10 @@ class DefaultFirebaseOptions { | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     androidClientId: | ||||
|         '961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com', | ||||
|     iosClientId: | ||||
|         '961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com', | ||||
|     iosBundleId: 'dev.solsynth.solian', | ||||
|   ); | ||||
|  | ||||
| @@ -73,6 +74,10 @@ class DefaultFirebaseOptions { | ||||
|     messagingSenderId: '961776991058', | ||||
|     projectId: 'solian-0x001', | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     androidClientId: | ||||
|         '961776991058-r4iv9qoio57ul7utbfpgfrda2etvtch8.apps.googleusercontent.com', | ||||
|     iosClientId: | ||||
|         '961776991058-stt7et4qvn3cpscl4r61gl1hnlatqkig.apps.googleusercontent.com', | ||||
|     iosBundleId: 'dev.solsynth.solian', | ||||
|   ); | ||||
|  | ||||
| @@ -85,5 +90,4 @@ class DefaultFirebaseOptions { | ||||
|     storageBucket: 'solian-0x001.firebasestorage.app', | ||||
|     measurementId: 'G-JD1YEG9D6F', | ||||
|   ); | ||||
|  | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,6 @@ import 'package:bitsdojo_window/bitsdojo_window.dart'; | ||||
| import 'package:island/pods/userinfo.dart'; | ||||
| import 'package:island/pods/websocket.dart'; | ||||
| import 'package:island/route.dart'; | ||||
|  | ||||
| import 'package:island/services/notify.dart'; | ||||
| import 'package:island/services/timezone.dart'; | ||||
| import 'package:island/widgets/alert.dart'; | ||||
| @@ -30,6 +29,8 @@ import 'package:shared_preferences/shared_preferences.dart'; | ||||
| import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; | ||||
| import 'package:flutter_native_splash/flutter_native_splash.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
| import 'package:flutter_langdetect/flutter_langdetect.dart' as langdetect; | ||||
| import 'package:island/services/update_service.dart'; | ||||
|  | ||||
| @pragma('vm:entry-point') | ||||
| Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { | ||||
| @@ -51,11 +52,18 @@ void main() async { | ||||
|   } | ||||
|  | ||||
|   try { | ||||
|     await langdetect.initLangDetect(); | ||||
|     await EasyLocalization.ensureInitialized(); | ||||
|     await Firebase.initializeApp( | ||||
|       options: DefaultFirebaseOptions.currentPlatform, | ||||
|     ); | ||||
|     FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); | ||||
|  | ||||
|     if (kIsWeb || !Platform.isLinux) { | ||||
|       await Firebase.initializeApp( | ||||
|         options: DefaultFirebaseOptions.currentPlatform, | ||||
|       ); | ||||
|       FirebaseMessaging.onBackgroundMessage( | ||||
|         _firebaseMessagingBackgroundHandler, | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     log("[SplashScreen] Firebase is ready!"); | ||||
|   } catch (err) { | ||||
|     showErrorAlert(err); | ||||
| @@ -136,6 +144,15 @@ void main() async { | ||||
|       ), | ||||
|     ), | ||||
|   ); | ||||
|  | ||||
|   // Schedule update check shortly after startup, when a context is available. | ||||
|   // Uses the global overlay key to obtain a BuildContext safely. | ||||
|   WidgetsBinding.instance.addPostFrameCallback((_) { | ||||
|     final ctx = globalOverlay.currentContext; | ||||
|     if (ctx != null) { | ||||
|       UpdateService().checkForUpdates(ctx); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| // Router will be provided through Riverpod | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -85,6 +84,130 @@ as DateTime?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnAbuseReport]. | ||||
| extension SnAbuseReportPatterns on SnAbuseReport { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnAbuseReport value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnAbuseReport value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnAbuseReport value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport(): | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String resourceIdentifier,  int type,  String reason,  DateTime? resolvedAt,  String? resolution,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnAbuseReport() when $default != null: | ||||
| return $default(_that.id,_that.resourceIdentifier,_that.type,_that.reason,_that.resolvedAt,_that.resolution,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -100,6 +99,136 @@ as List<AutoCompletionItem>, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [AutoCompletionResponse]. | ||||
| extension AutoCompletionResponsePatterns on AutoCompletionResponse { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>({TResult Function( AutoCompletionAccountResponse value)?  account,TResult Function( AutoCompletionStickerResponse value)?  sticker,required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>({required TResult Function( AutoCompletionAccountResponse value)  account,required TResult Function( AutoCompletionStickerResponse value)  sticker,}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse(): | ||||
| return account(_that);case AutoCompletionStickerResponse(): | ||||
| return sticker(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>({TResult? Function( AutoCompletionAccountResponse value)?  account,TResult? Function( AutoCompletionStickerResponse value)?  sticker,}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>({TResult Function( String type,  List<AutoCompletionItem> items)?  account,TResult Function( String type,  List<AutoCompletionItem> items)?  sticker,required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that.type,_that.items);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>({required TResult Function( String type,  List<AutoCompletionItem> items)  account,required TResult Function( String type,  List<AutoCompletionItem> items)  sticker,}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse(): | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse(): | ||||
| return sticker(_that.type,_that.items);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>({TResult? Function( String type,  List<AutoCompletionItem> items)?  account,TResult? Function( String type,  List<AutoCompletionItem> items)?  sticker,}) {final _that = this; | ||||
| switch (_that) { | ||||
| case AutoCompletionAccountResponse() when account != null: | ||||
| return account(_that.type,_that.items);case AutoCompletionStickerResponse() when sticker != null: | ||||
| return sticker(_that.type,_that.items);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -330,6 +459,130 @@ as dynamic, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [AutoCompletionItem]. | ||||
| extension AutoCompletionItemPatterns on AutoCompletionItem { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AutoCompletionItem value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AutoCompletionItem value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AutoCompletionItem value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem(): | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String displayName,  String? secondaryText,  String type,  dynamic data)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _AutoCompletionItem() when $default != null: | ||||
| return $default(_that.id,_that.displayName,_that.secondaryText,_that.type,_that.data);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -162,8 +162,6 @@ sealed class CallParticipant with _$CallParticipant { | ||||
|     required String identity, | ||||
|     required String name, | ||||
|     required DateTime joinedAt, | ||||
|     required String? accountId, | ||||
|     required SnChatMember? profile, | ||||
|   }) = _CallParticipant; | ||||
|  | ||||
|   factory CallParticipant.fromJson(Map<String, dynamic> json) => | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -285,11 +285,6 @@ _CallParticipant _$CallParticipantFromJson(Map<String, dynamic> json) => | ||||
|       identity: json['identity'] as String, | ||||
|       name: json['name'] as String, | ||||
|       joinedAt: DateTime.parse(json['joined_at'] as String), | ||||
|       accountId: json['account_id'] as String?, | ||||
|       profile: | ||||
|           json['profile'] == null | ||||
|               ? null | ||||
|               : SnChatMember.fromJson(json['profile'] as Map<String, dynamic>), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | ||||
| @@ -297,8 +292,6 @@ Map<String, dynamic> _$CallParticipantToJson(_CallParticipant instance) => | ||||
|       'identity': instance.identity, | ||||
|       'name': instance.name, | ||||
|       'joined_at': instance.joinedAt.toIso8601String(), | ||||
|       'account_id': instance.accountId, | ||||
|       'profile': instance.profile?.toJson(), | ||||
|     }; | ||||
|  | ||||
| _SnRealtimeCall _$SnRealtimeCallFromJson(Map<String, dynamic> json) => | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -147,6 +146,130 @@ $CustomAppLinksCopyWith<$Res>? get links { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [CustomApp]. | ||||
| extension CustomAppPatterns on CustomApp { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _CustomApp value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _CustomApp value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CustomApp value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp(): | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String slug,  String name,  String? description,  int status,  SnCloudFile? picture,  SnCloudFile? background,  SnVerificationMark? verification,  CustomAppOauthConfig? oauthConfig,  CustomAppLinks? links,  List<CustomAppSecret> secrets,  String publisherId)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomApp() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.status,_that.picture,_that.background,_that.verification,_that.oauthConfig,_that.links,_that.secrets,_that.publisherId);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -370,6 +493,130 @@ as String?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [CustomAppLinks]. | ||||
| extension CustomAppLinksPatterns on CustomAppLinks { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _CustomAppLinks value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _CustomAppLinks value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CustomAppLinks value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? homePage,  String? privacyPolicy,  String? termsOfService)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks() when $default != null: | ||||
| return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? homePage,  String? privacyPolicy,  String? termsOfService)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks(): | ||||
| return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? homePage,  String? privacyPolicy,  String? termsOfService)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppLinks() when $default != null: | ||||
| return $default(_that.homePage,_that.privacyPolicy,_that.termsOfService);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -513,6 +760,130 @@ as bool, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [CustomAppOauthConfig]. | ||||
| extension CustomAppOauthConfigPatterns on CustomAppOauthConfig { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _CustomAppOauthConfig value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _CustomAppOauthConfig value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CustomAppOauthConfig value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig() when $default != null: | ||||
| return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig(): | ||||
| return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? clientUri,  List<String> redirectUris,  List<String>? postLogoutRedirectUris,  List<String> allowedScopes,  List<String> allowedGrantTypes,  bool requirePkce,  bool allowOfflineAccess)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppOauthConfig() when $default != null: | ||||
| return $default(_that.clientUri,_that.redirectUris,_that.postLogoutRedirectUris,_that.allowedScopes,_that.allowedGrantTypes,_that.requirePkce,_that.allowOfflineAccess);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -689,6 +1060,130 @@ as String, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [CustomAppSecret]. | ||||
| extension CustomAppSecretPatterns on CustomAppSecret { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _CustomAppSecret value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _CustomAppSecret value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CustomAppSecret value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String secret,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String secret,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret(): | ||||
| return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String secret,  String? description,  DateTime? expiredAt,  bool isOidc,  String appId)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _CustomAppSecret() when $default != null: | ||||
| return $default(_that.id,_that.secret,_that.description,_that.expiredAt,_that.isOidc,_that.appId);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,26 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/publisher.dart'; | ||||
|  | ||||
| part 'developer.freezed.dart'; | ||||
| part 'developer.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnDeveloper with _$SnDeveloper { | ||||
|   const factory SnDeveloper({ | ||||
|     required String id, | ||||
|     required String publisherId, | ||||
|     SnPublisher? publisher, | ||||
|   }) = _SnDeveloper; | ||||
|  | ||||
|   factory SnDeveloper.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnDeveloperFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class DeveloperStats with _$DeveloperStats { | ||||
|   const factory DeveloperStats({ | ||||
|     @Default(0) int totalCustomApps, | ||||
|   }) = _DeveloperStats; | ||||
|   const factory DeveloperStats({@Default(0) int totalCustomApps}) = | ||||
|       _DeveloperStats; | ||||
|  | ||||
|   factory DeveloperStats.fromJson(Map<String, dynamic> json) => | ||||
|       _$DeveloperStatsFromJson(json); | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -13,6 +12,293 @@ part of 'developer.dart'; | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnDeveloper { | ||||
|  | ||||
|  String get id; String get publisherId; SnPublisher? get publisher; | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnDeveloperCopyWith<SnDeveloper> get copyWith => _$SnDeveloperCopyWithImpl<SnDeveloper>(this as SnDeveloper, _$identity); | ||||
|  | ||||
|   /// Serializes this SnDeveloper to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnDeveloper&&(identical(other.id, id) || other.id == id)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,publisherId,publisher); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnDeveloper(id: $id, publisherId: $publisherId, publisher: $publisher)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnDeveloperCopyWith<$Res>  { | ||||
|   factory $SnDeveloperCopyWith(SnDeveloper value, $Res Function(SnDeveloper) _then) = _$SnDeveloperCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String publisherId, SnPublisher? publisher | ||||
| }); | ||||
|  | ||||
|  | ||||
| $SnPublisherCopyWith<$Res>? get publisher; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnDeveloperCopyWithImpl<$Res> | ||||
|     implements $SnDeveloperCopyWith<$Res> { | ||||
|   _$SnDeveloperCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnDeveloper _self; | ||||
|   final $Res Function(SnDeveloper) _then; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? publisherId = null,Object? publisher = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||
| as SnPublisher?, | ||||
|   )); | ||||
| } | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnPublisherCopyWith<$Res>? get publisher { | ||||
|     if (_self.publisher == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { | ||||
|     return _then(_self.copyWith(publisher: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnDeveloper]. | ||||
| extension SnDeveloperPatterns on SnDeveloper { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnDeveloper value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnDeveloper value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnDeveloper value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String publisherId,  SnPublisher? publisher)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String publisherId,  SnPublisher? publisher)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper(): | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String publisherId,  SnPublisher? publisher)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnDeveloper() when $default != null: | ||||
| return $default(_that.id,_that.publisherId,_that.publisher);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnDeveloper implements SnDeveloper { | ||||
|   const _SnDeveloper({required this.id, required this.publisherId, this.publisher}); | ||||
|   factory _SnDeveloper.fromJson(Map<String, dynamic> json) => _$SnDeveloperFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String publisherId; | ||||
| @override final  SnPublisher? publisher; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnDeveloperCopyWith<_SnDeveloper> get copyWith => __$SnDeveloperCopyWithImpl<_SnDeveloper>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnDeveloperToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnDeveloper&&(identical(other.id, id) || other.id == id)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,publisherId,publisher); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnDeveloper(id: $id, publisherId: $publisherId, publisher: $publisher)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnDeveloperCopyWith<$Res> implements $SnDeveloperCopyWith<$Res> { | ||||
|   factory _$SnDeveloperCopyWith(_SnDeveloper value, $Res Function(_SnDeveloper) _then) = __$SnDeveloperCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String publisherId, SnPublisher? publisher | ||||
| }); | ||||
|  | ||||
|  | ||||
| @override $SnPublisherCopyWith<$Res>? get publisher; | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnDeveloperCopyWithImpl<$Res> | ||||
|     implements _$SnDeveloperCopyWith<$Res> { | ||||
|   __$SnDeveloperCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnDeveloper _self; | ||||
|   final $Res Function(_SnDeveloper) _then; | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? publisherId = null,Object? publisher = freezed,}) { | ||||
|   return _then(_SnDeveloper( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable | ||||
| as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable | ||||
| as SnPublisher?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| /// Create a copy of SnDeveloper | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnPublisherCopyWith<$Res>? get publisher { | ||||
|     if (_self.publisher == null) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { | ||||
|     return _then(_self.copyWith(publisher: value)); | ||||
|   }); | ||||
| } | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$DeveloperStats { | ||||
|  | ||||
| @@ -76,6 +362,130 @@ as int, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [DeveloperStats]. | ||||
| extension DeveloperStatsPatterns on DeveloperStats { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _DeveloperStats value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _DeveloperStats value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _DeveloperStats value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( int totalCustomApps)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that.totalCustomApps);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( int totalCustomApps)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats(): | ||||
| return $default(_that.totalCustomApps);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( int totalCustomApps)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _DeveloperStats() when $default != null: | ||||
| return $default(_that.totalCustomApps);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,22 @@ part of 'developer.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnDeveloper _$SnDeveloperFromJson(Map<String, dynamic> json) => _SnDeveloper( | ||||
|   id: json['id'] as String, | ||||
|   publisherId: json['publisher_id'] as String, | ||||
|   publisher: | ||||
|       json['publisher'] == null | ||||
|           ? null | ||||
|           : SnPublisher.fromJson(json['publisher'] as Map<String, dynamic>), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnDeveloperToJson(_SnDeveloper instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'publisher_id': instance.publisherId, | ||||
|       'publisher': instance.publisher?.toJson(), | ||||
|     }; | ||||
|  | ||||
| _DeveloperStats _$DeveloperStatsFromJson(Map<String, dynamic> json) => | ||||
|     _DeveloperStats( | ||||
|       totalCustomApps: (json['total_custom_apps'] as num?)?.toInt() ?? 0, | ||||
|   | ||||
| @@ -3,25 +3,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| part 'embed.freezed.dart'; | ||||
| part 'embed.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnEmbedLink with _$SnEmbedLink { | ||||
|   const factory SnEmbedLink({ | ||||
|     @JsonKey(name: 'Type') required String type, | ||||
|     @JsonKey(name: 'Url') required String url, | ||||
|     @JsonKey(name: 'Title') required String title, | ||||
|     @JsonKey(name: 'Description') required String? description, | ||||
|     @JsonKey(name: 'ImageUrl') required String? imageUrl, | ||||
|     @JsonKey(name: 'FaviconUrl') required String faviconUrl, | ||||
|     @JsonKey(name: 'SiteName') required String siteName, | ||||
|     @JsonKey(name: 'ContentType') required String? contentType, | ||||
|     @JsonKey(name: 'Author') required String? author, | ||||
|     @JsonKey(name: 'PublishedDate') required DateTime? publishedDate, | ||||
|   }) = _SnEmbedLink; | ||||
|  | ||||
|   factory SnEmbedLink.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnEmbedLinkFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnScrappedLink with _$SnScrappedLink { | ||||
|   const factory SnScrappedLink({ | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -13,166 +12,6 @@ part of 'embed.dart'; | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnEmbedLink { | ||||
|  | ||||
| @JsonKey(name: 'Type') String get type;@JsonKey(name: 'Url') String get url;@JsonKey(name: 'Title') String get title;@JsonKey(name: 'Description') String? get description;@JsonKey(name: 'ImageUrl') String? get imageUrl;@JsonKey(name: 'FaviconUrl') String get faviconUrl;@JsonKey(name: 'SiteName') String get siteName;@JsonKey(name: 'ContentType') String? get contentType;@JsonKey(name: 'Author') String? get author;@JsonKey(name: 'PublishedDate') DateTime? get publishedDate; | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $SnEmbedLinkCopyWith<SnEmbedLink> get copyWith => _$SnEmbedLinkCopyWithImpl<SnEmbedLink>(this as SnEmbedLink, _$identity); | ||||
|  | ||||
|   /// Serializes this SnEmbedLink to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnEmbedLink&&(identical(other.type, type) || other.type == type)&&(identical(other.url, url) || other.url == url)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.imageUrl, imageUrl) || other.imageUrl == imageUrl)&&(identical(other.faviconUrl, faviconUrl) || other.faviconUrl == faviconUrl)&&(identical(other.siteName, siteName) || other.siteName == siteName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.author, author) || other.author == author)&&(identical(other.publishedDate, publishedDate) || other.publishedDate == publishedDate)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,url,title,description,imageUrl,faviconUrl,siteName,contentType,author,publishedDate); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnEmbedLink(type: $type, url: $url, title: $title, description: $description, imageUrl: $imageUrl, faviconUrl: $faviconUrl, siteName: $siteName, contentType: $contentType, author: $author, publishedDate: $publishedDate)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $SnEmbedLinkCopyWith<$Res>  { | ||||
|   factory $SnEmbedLinkCopyWith(SnEmbedLink value, $Res Function(SnEmbedLink) _then) = _$SnEmbedLinkCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
| @JsonKey(name: 'Type') String type,@JsonKey(name: 'Url') String url,@JsonKey(name: 'Title') String title,@JsonKey(name: 'Description') String? description,@JsonKey(name: 'ImageUrl') String? imageUrl,@JsonKey(name: 'FaviconUrl') String faviconUrl,@JsonKey(name: 'SiteName') String siteName,@JsonKey(name: 'ContentType') String? contentType,@JsonKey(name: 'Author') String? author,@JsonKey(name: 'PublishedDate') DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$SnEmbedLinkCopyWithImpl<$Res> | ||||
|     implements $SnEmbedLinkCopyWith<$Res> { | ||||
|   _$SnEmbedLinkCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final SnEmbedLink _self; | ||||
|   final $Res Function(SnEmbedLink) _then; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnEmbedLink implements SnEmbedLink { | ||||
|   const _SnEmbedLink({@JsonKey(name: 'Type') required this.type, @JsonKey(name: 'Url') required this.url, @JsonKey(name: 'Title') required this.title, @JsonKey(name: 'Description') required this.description, @JsonKey(name: 'ImageUrl') required this.imageUrl, @JsonKey(name: 'FaviconUrl') required this.faviconUrl, @JsonKey(name: 'SiteName') required this.siteName, @JsonKey(name: 'ContentType') required this.contentType, @JsonKey(name: 'Author') required this.author, @JsonKey(name: 'PublishedDate') required this.publishedDate}); | ||||
|   factory _SnEmbedLink.fromJson(Map<String, dynamic> json) => _$SnEmbedLinkFromJson(json); | ||||
|  | ||||
| @override@JsonKey(name: 'Type') final  String type; | ||||
| @override@JsonKey(name: 'Url') final  String url; | ||||
| @override@JsonKey(name: 'Title') final  String title; | ||||
| @override@JsonKey(name: 'Description') final  String? description; | ||||
| @override@JsonKey(name: 'ImageUrl') final  String? imageUrl; | ||||
| @override@JsonKey(name: 'FaviconUrl') final  String faviconUrl; | ||||
| @override@JsonKey(name: 'SiteName') final  String siteName; | ||||
| @override@JsonKey(name: 'ContentType') final  String? contentType; | ||||
| @override@JsonKey(name: 'Author') final  String? author; | ||||
| @override@JsonKey(name: 'PublishedDate') final  DateTime? publishedDate; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$SnEmbedLinkCopyWith<_SnEmbedLink> get copyWith => __$SnEmbedLinkCopyWithImpl<_SnEmbedLink>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$SnEmbedLinkToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnEmbedLink&&(identical(other.type, type) || other.type == type)&&(identical(other.url, url) || other.url == url)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.imageUrl, imageUrl) || other.imageUrl == imageUrl)&&(identical(other.faviconUrl, faviconUrl) || other.faviconUrl == faviconUrl)&&(identical(other.siteName, siteName) || other.siteName == siteName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.author, author) || other.author == author)&&(identical(other.publishedDate, publishedDate) || other.publishedDate == publishedDate)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,type,url,title,description,imageUrl,faviconUrl,siteName,contentType,author,publishedDate); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnEmbedLink(type: $type, url: $url, title: $title, description: $description, imageUrl: $imageUrl, faviconUrl: $faviconUrl, siteName: $siteName, contentType: $contentType, author: $author, publishedDate: $publishedDate)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$SnEmbedLinkCopyWith<$Res> implements $SnEmbedLinkCopyWith<$Res> { | ||||
|   factory _$SnEmbedLinkCopyWith(_SnEmbedLink value, $Res Function(_SnEmbedLink) _then) = __$SnEmbedLinkCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
| @JsonKey(name: 'Type') String type,@JsonKey(name: 'Url') String url,@JsonKey(name: 'Title') String title,@JsonKey(name: 'Description') String? description,@JsonKey(name: 'ImageUrl') String? imageUrl,@JsonKey(name: 'FaviconUrl') String faviconUrl,@JsonKey(name: 'SiteName') String siteName,@JsonKey(name: 'ContentType') String? contentType,@JsonKey(name: 'Author') String? author,@JsonKey(name: 'PublishedDate') DateTime? publishedDate | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$SnEmbedLinkCopyWithImpl<$Res> | ||||
|     implements _$SnEmbedLinkCopyWith<$Res> { | ||||
|   __$SnEmbedLinkCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _SnEmbedLink _self; | ||||
|   final $Res Function(_SnEmbedLink) _then; | ||||
|  | ||||
| /// Create a copy of SnEmbedLink | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? url = null,Object? title = null,Object? description = freezed,Object? imageUrl = freezed,Object? faviconUrl = null,Object? siteName = null,Object? contentType = freezed,Object? author = freezed,Object? publishedDate = freezed,}) { | ||||
|   return _then(_SnEmbedLink( | ||||
| type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable | ||||
| as String,title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,imageUrl: freezed == imageUrl ? _self.imageUrl : imageUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String?,faviconUrl: null == faviconUrl ? _self.faviconUrl : faviconUrl // ignore: cast_nullable_to_non_nullable | ||||
| as String,siteName: null == siteName ? _self.siteName : siteName // ignore: cast_nullable_to_non_nullable | ||||
| as String,contentType: freezed == contentType ? _self.contentType : contentType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,author: freezed == author ? _self.author : author // ignore: cast_nullable_to_non_nullable | ||||
| as String?,publishedDate: freezed == publishedDate ? _self.publishedDate : publishedDate // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$SnScrappedLink { | ||||
|  | ||||
| @@ -245,6 +84,130 @@ as DateTime?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnScrappedLink]. | ||||
| extension SnScrappedLinkPatterns on SnScrappedLink { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnScrappedLink value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnScrappedLink value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnScrappedLink value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String faviconUrl,  String siteName,  String? contentType,  String? author,  DateTime? publishedDate)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String faviconUrl,  String siteName,  String? contentType,  String? author,  DateTime? publishedDate)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink(): | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String type,  String url,  String title,  String? description,  String? imageUrl,  String faviconUrl,  String siteName,  String? contentType,  String? author,  DateTime? publishedDate)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnScrappedLink() when $default != null: | ||||
| return $default(_that.type,_that.url,_that.title,_that.description,_that.imageUrl,_that.faviconUrl,_that.siteName,_that.contentType,_that.author,_that.publishedDate);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -6,36 +6,6 @@ part of 'embed.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnEmbedLink _$SnEmbedLinkFromJson(Map<String, dynamic> json) => _SnEmbedLink( | ||||
|   type: json['Type'] as String, | ||||
|   url: json['Url'] as String, | ||||
|   title: json['Title'] as String, | ||||
|   description: json['Description'] as String?, | ||||
|   imageUrl: json['ImageUrl'] as String?, | ||||
|   faviconUrl: json['FaviconUrl'] as String, | ||||
|   siteName: json['SiteName'] as String, | ||||
|   contentType: json['ContentType'] as String?, | ||||
|   author: json['Author'] as String?, | ||||
|   publishedDate: | ||||
|       json['PublishedDate'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['PublishedDate'] as String), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnEmbedLinkToJson(_SnEmbedLink instance) => | ||||
|     <String, dynamic>{ | ||||
|       'Type': instance.type, | ||||
|       'Url': instance.url, | ||||
|       'Title': instance.title, | ||||
|       'Description': instance.description, | ||||
|       'ImageUrl': instance.imageUrl, | ||||
|       'FaviconUrl': instance.faviconUrl, | ||||
|       'SiteName': instance.siteName, | ||||
|       'ContentType': instance.contentType, | ||||
|       'Author': instance.author, | ||||
|       'PublishedDate': instance.publishedDate?.toIso8601String(), | ||||
|     }; | ||||
|  | ||||
| _SnScrappedLink _$SnScrappedLinkFromJson(Map<String, dynamic> json) => | ||||
|     _SnScrappedLink( | ||||
|       type: json['type'] as String, | ||||
|   | ||||
| @@ -12,6 +12,7 @@ sealed class UniversalFile with _$UniversalFile { | ||||
|   const factory UniversalFile({ | ||||
|     required dynamic data, | ||||
|     required UniversalFileType type, | ||||
|     @Default(false) bool isLink, | ||||
|   }) = _UniversalFile; | ||||
|  | ||||
|   factory UniversalFile.fromJson(Map<String, dynamic> json) => | ||||
| @@ -41,6 +42,7 @@ sealed class SnCloudFile with _$SnCloudFile { | ||||
|     required String? description, | ||||
|     required Map<String, dynamic>? fileMeta, | ||||
|     required Map<String, dynamic>? userMeta, | ||||
|     @Default([]) List<int> sensitiveMarks, | ||||
|     required String? mimeType, | ||||
|     required String? hash, | ||||
|     required int size, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -16,7 +15,7 @@ T _$identity<T>(T value) => value; | ||||
| /// @nodoc | ||||
| mixin _$UniversalFile { | ||||
|  | ||||
|  dynamic get data; UniversalFileType get type; | ||||
|  dynamic get data; UniversalFileType get type; bool get isLink; | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -29,16 +28,16 @@ $UniversalFileCopyWith<UniversalFile> get copyWith => _$UniversalFileCopyWithImp | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)&&(identical(other.isLink, isLink) || other.isLink == isLink)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type,isLink); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'UniversalFile(data: $data, type: $type)'; | ||||
|   return 'UniversalFile(data: $data, type: $type, isLink: $isLink)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -49,7 +48,7 @@ abstract mixin class $UniversalFileCopyWith<$Res>  { | ||||
|   factory $UniversalFileCopyWith(UniversalFile value, $Res Function(UniversalFile) _then) = _$UniversalFileCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  dynamic data, UniversalFileType type | ||||
|  dynamic data, UniversalFileType type, bool isLink | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -66,26 +65,152 @@ class _$UniversalFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? data = freezed,Object? type = null,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? data = freezed,Object? type = null,Object? isLink = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as UniversalFileType, | ||||
| as UniversalFileType,isLink: null == isLink ? _self.isLink : isLink // ignore: cast_nullable_to_non_nullable | ||||
| as bool, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [UniversalFile]. | ||||
| extension UniversalFilePatterns on UniversalFile { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _UniversalFile value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _UniversalFile value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _UniversalFile value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( dynamic data,  UniversalFileType type,  bool isLink)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that.data,_that.type,_that.isLink);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( dynamic data,  UniversalFileType type,  bool isLink)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile(): | ||||
| return $default(_that.data,_that.type,_that.isLink);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( dynamic data,  UniversalFileType type,  bool isLink)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _UniversalFile() when $default != null: | ||||
| return $default(_that.data,_that.type,_that.isLink);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _UniversalFile extends UniversalFile { | ||||
|   const _UniversalFile({required this.data, required this.type}): super._(); | ||||
|   const _UniversalFile({required this.data, required this.type, this.isLink = false}): super._(); | ||||
|   factory _UniversalFile.fromJson(Map<String, dynamic> json) => _$UniversalFileFromJson(json); | ||||
|  | ||||
| @override final  dynamic data; | ||||
| @override final  UniversalFileType type; | ||||
| @override@JsonKey() final  bool isLink; | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @@ -100,16 +225,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)&&(identical(other.isLink, isLink) || other.isLink == isLink)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); | ||||
| int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type,isLink); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'UniversalFile(data: $data, type: $type)'; | ||||
|   return 'UniversalFile(data: $data, type: $type, isLink: $isLink)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -120,7 +245,7 @@ abstract mixin class _$UniversalFileCopyWith<$Res> implements $UniversalFileCopy | ||||
|   factory _$UniversalFileCopyWith(_UniversalFile value, $Res Function(_UniversalFile) _then) = __$UniversalFileCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  dynamic data, UniversalFileType type | ||||
|  dynamic data, UniversalFileType type, bool isLink | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -137,11 +262,12 @@ class __$UniversalFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of UniversalFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? data = freezed,Object? type = null,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? data = freezed,Object? type = null,Object? isLink = null,}) { | ||||
|   return _then(_UniversalFile( | ||||
| data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable | ||||
| as dynamic,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable | ||||
| as UniversalFileType, | ||||
| as UniversalFileType,isLink: null == isLink ? _self.isLink : isLink // ignore: cast_nullable_to_non_nullable | ||||
| as bool, | ||||
|   )); | ||||
| } | ||||
|  | ||||
| @@ -152,7 +278,7 @@ as UniversalFileType, | ||||
| /// @nodoc | ||||
| mixin _$SnCloudFile { | ||||
|  | ||||
|  String get id; String get name; String? get description; Map<String, dynamic>? get fileMeta; Map<String, dynamic>? get userMeta; String? get mimeType; String? get hash; int get size; DateTime? get uploadedAt; String? get uploadedTo; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
|  String get id; String get name; String? get description; Map<String, dynamic>? get fileMeta; Map<String, dynamic>? get userMeta; List<int> get sensitiveMarks; String? get mimeType; String? get hash; int get size; DateTime? get uploadedAt; String? get uploadedTo; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -165,16 +291,16 @@ $SnCloudFileCopyWith<SnCloudFile> get copyWith => _$SnCloudFileCopyWithImpl<SnCl | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other.fileMeta, fileMeta)&&const DeepCollectionEquality().equals(other.userMeta, userMeta)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other.fileMeta, fileMeta)&&const DeepCollectionEquality().equals(other.userMeta, userMeta)&&const DeepCollectionEquality().equals(other.sensitiveMarks, sensitiveMarks)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(fileMeta),const DeepCollectionEquality().hash(userMeta),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(fileMeta),const DeepCollectionEquality().hash(userMeta),const DeepCollectionEquality().hash(sensitiveMarks),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -185,7 +311,7 @@ abstract mixin class $SnCloudFileCopyWith<$Res>  { | ||||
|   factory $SnCloudFileCopyWith(SnCloudFile value, $Res Function(SnCloudFile) _then) = _$SnCloudFileCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -202,14 +328,15 @@ class _$SnCloudFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? sensitiveMarks = null,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,fileMeta: freezed == fileMeta ? _self.fileMeta : fileMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,userMeta: freezed == userMeta ? _self.userMeta : userMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,sensitiveMarks: null == sensitiveMarks ? _self.sensitiveMarks : sensitiveMarks // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,hash: freezed == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable | ||||
| as String?,size: null == size ? _self.size : size // ignore: cast_nullable_to_non_nullable | ||||
| as int,uploadedAt: freezed == uploadedAt ? _self.uploadedAt : uploadedAt // ignore: cast_nullable_to_non_nullable | ||||
| @@ -224,11 +351,135 @@ as DateTime?, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnCloudFile]. | ||||
| extension SnCloudFilePatterns on SnCloudFile { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnCloudFile value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnCloudFile value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnCloudFile value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile(): | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String name,  String? description,  Map<String, dynamic>? fileMeta,  Map<String, dynamic>? userMeta,  List<int> sensitiveMarks,  String? mimeType,  String? hash,  int size,  DateTime? uploadedAt,  String? uploadedTo,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnCloudFile() when $default != null: | ||||
| return $default(_that.id,_that.name,_that.description,_that.fileMeta,_that.userMeta,_that.sensitiveMarks,_that.mimeType,_that.hash,_that.size,_that.uploadedAt,_that.uploadedTo,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnCloudFile implements SnCloudFile { | ||||
|   const _SnCloudFile({required this.id, required this.name, required this.description, required final  Map<String, dynamic>? fileMeta, required final  Map<String, dynamic>? userMeta, required this.mimeType, required this.hash, required this.size, required this.uploadedAt, required this.uploadedTo, required this.createdAt, required this.updatedAt, required this.deletedAt}): _fileMeta = fileMeta,_userMeta = userMeta; | ||||
|   const _SnCloudFile({required this.id, required this.name, required this.description, required final  Map<String, dynamic>? fileMeta, required final  Map<String, dynamic>? userMeta, final  List<int> sensitiveMarks = const [], required this.mimeType, required this.hash, required this.size, required this.uploadedAt, required this.uploadedTo, required this.createdAt, required this.updatedAt, required this.deletedAt}): _fileMeta = fileMeta,_userMeta = userMeta,_sensitiveMarks = sensitiveMarks; | ||||
|   factory _SnCloudFile.fromJson(Map<String, dynamic> json) => _$SnCloudFileFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @@ -252,6 +503,13 @@ class _SnCloudFile implements SnCloudFile { | ||||
|   return EqualUnmodifiableMapView(value); | ||||
| } | ||||
|  | ||||
|  final  List<int> _sensitiveMarks; | ||||
| @override@JsonKey() List<int> get sensitiveMarks { | ||||
|   if (_sensitiveMarks is EqualUnmodifiableListView) return _sensitiveMarks; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_sensitiveMarks); | ||||
| } | ||||
|  | ||||
| @override final  String? mimeType; | ||||
| @override final  String? hash; | ||||
| @override final  int size; | ||||
| @@ -274,16 +532,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other._fileMeta, _fileMeta)&&const DeepCollectionEquality().equals(other._userMeta, _userMeta)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnCloudFile&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&const DeepCollectionEquality().equals(other._fileMeta, _fileMeta)&&const DeepCollectionEquality().equals(other._userMeta, _userMeta)&&const DeepCollectionEquality().equals(other._sensitiveMarks, _sensitiveMarks)&&(identical(other.mimeType, mimeType) || other.mimeType == mimeType)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.size, size) || other.size == size)&&(identical(other.uploadedAt, uploadedAt) || other.uploadedAt == uploadedAt)&&(identical(other.uploadedTo, uploadedTo) || other.uploadedTo == uploadedTo)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(_fileMeta),const DeepCollectionEquality().hash(_userMeta),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,const DeepCollectionEquality().hash(_fileMeta),const DeepCollectionEquality().hash(_userMeta),const DeepCollectionEquality().hash(_sensitiveMarks),mimeType,hash,size,uploadedAt,uploadedTo,createdAt,updatedAt,deletedAt); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnCloudFile(id: $id, name: $name, description: $description, fileMeta: $fileMeta, userMeta: $userMeta, sensitiveMarks: $sensitiveMarks, mimeType: $mimeType, hash: $hash, size: $size, uploadedAt: $uploadedAt, uploadedTo: $uploadedTo, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -294,7 +552,7 @@ abstract mixin class _$SnCloudFileCopyWith<$Res> implements $SnCloudFileCopyWith | ||||
|   factory _$SnCloudFileCopyWith(_SnCloudFile value, $Res Function(_SnCloudFile) _then) = __$SnCloudFileCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String? description, Map<String, dynamic>? fileMeta, Map<String, dynamic>? userMeta, List<int> sensitiveMarks, String? mimeType, String? hash, int size, DateTime? uploadedAt, String? uploadedTo, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -311,14 +569,15 @@ class __$SnCloudFileCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnCloudFile | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = freezed,Object? fileMeta = freezed,Object? userMeta = freezed,Object? sensitiveMarks = null,Object? mimeType = freezed,Object? hash = freezed,Object? size = null,Object? uploadedAt = freezed,Object? uploadedTo = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
|   return _then(_SnCloudFile( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| as String,description: freezed == description ? _self.description : description // ignore: cast_nullable_to_non_nullable | ||||
| as String?,fileMeta: freezed == fileMeta ? _self._fileMeta : fileMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,userMeta: freezed == userMeta ? _self._userMeta : userMeta // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as Map<String, dynamic>?,sensitiveMarks: null == sensitiveMarks ? _self._sensitiveMarks : sensitiveMarks // ignore: cast_nullable_to_non_nullable | ||||
| as List<int>,mimeType: freezed == mimeType ? _self.mimeType : mimeType // ignore: cast_nullable_to_non_nullable | ||||
| as String?,hash: freezed == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable | ||||
| as String?,size: null == size ? _self.size : size // ignore: cast_nullable_to_non_nullable | ||||
| as int,uploadedAt: freezed == uploadedAt ? _self.uploadedAt : uploadedAt // ignore: cast_nullable_to_non_nullable | ||||
|   | ||||
| @@ -10,12 +10,14 @@ _UniversalFile _$UniversalFileFromJson(Map<String, dynamic> json) => | ||||
|     _UniversalFile( | ||||
|       data: json['data'], | ||||
|       type: $enumDecode(_$UniversalFileTypeEnumMap, json['type']), | ||||
|       isLink: json['is_link'] as bool? ?? false, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$UniversalFileToJson(_UniversalFile instance) => | ||||
|     <String, dynamic>{ | ||||
|       'data': instance.data, | ||||
|       'type': _$UniversalFileTypeEnumMap[instance.type]!, | ||||
|       'is_link': instance.isLink, | ||||
|     }; | ||||
|  | ||||
| const _$UniversalFileTypeEnumMap = { | ||||
| @@ -31,6 +33,11 @@ _SnCloudFile _$SnCloudFileFromJson(Map<String, dynamic> json) => _SnCloudFile( | ||||
|   description: json['description'] as String?, | ||||
|   fileMeta: json['file_meta'] as Map<String, dynamic>?, | ||||
|   userMeta: json['user_meta'] as Map<String, dynamic>?, | ||||
|   sensitiveMarks: | ||||
|       (json['sensitive_marks'] as List<dynamic>?) | ||||
|           ?.map((e) => (e as num).toInt()) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   mimeType: json['mime_type'] as String?, | ||||
|   hash: json['hash'] as String?, | ||||
|   size: (json['size'] as num).toInt(), | ||||
| @@ -54,6 +61,7 @@ Map<String, dynamic> _$SnCloudFileToJson(_SnCloudFile instance) => | ||||
|       'description': instance.description, | ||||
|       'file_meta': instance.fileMeta, | ||||
|       'user_meta': instance.userMeta, | ||||
|       'sensitive_marks': instance.sensitiveMarks, | ||||
|       'mime_type': instance.mimeType, | ||||
|       'hash': instance.hash, | ||||
|       'size': instance.size, | ||||
|   | ||||
							
								
								
									
										108
									
								
								lib/models/poll.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								lib/models/poll.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/publisher.dart'; | ||||
|  | ||||
| part 'poll.freezed.dart'; | ||||
| part 'poll.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class SnPollWithStats with _$SnPollWithStats { | ||||
|   const factory SnPollWithStats({ | ||||
|     required Map<String, dynamic>? userAnswer, | ||||
|     required Map<String, dynamic> stats, | ||||
|     required String id, | ||||
|     required List<SnPollQuestion> questions, | ||||
|     String? title, | ||||
|     String? description, | ||||
|     DateTime? endedAt, | ||||
|     required String publisherId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     DateTime? deletedAt, | ||||
|   }) = _SnPollWithStats; | ||||
|  | ||||
|   factory SnPollWithStats.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPollWithStatsFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnPoll with _$SnPoll { | ||||
|   const factory SnPoll({ | ||||
|     required String id, | ||||
|     required List<SnPollQuestion> questions, | ||||
|  | ||||
|     String? title, | ||||
|     String? description, | ||||
|  | ||||
|     DateTime? endedAt, | ||||
|  | ||||
|     required String publisherId, | ||||
|     SnPublisher? publisher, | ||||
|  | ||||
|     // ModelBase fields | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     DateTime? deletedAt, | ||||
|   }) = _SnPoll; | ||||
|  | ||||
|   factory SnPoll.fromJson(Map<String, dynamic> json) => _$SnPollFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnPollQuestion with _$SnPollQuestion { | ||||
|   const factory SnPollQuestion({ | ||||
|     required String id, | ||||
|  | ||||
|     required SnPollQuestionType type, | ||||
|     List<SnPollOption>? options, | ||||
|  | ||||
|     required String title, | ||||
|     String? description, | ||||
|     required int order, | ||||
|     required bool isRequired, | ||||
|   }) = _SnPollQuestion; | ||||
|  | ||||
|   factory SnPollQuestion.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPollQuestionFromJson(json); | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnPollOption with _$SnPollOption { | ||||
|   const factory SnPollOption({ | ||||
|     required String id, | ||||
|     required String label, | ||||
|     String? description, | ||||
|     required int order, | ||||
|   }) = _SnPollOption; | ||||
|  | ||||
|   factory SnPollOption.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPollOptionFromJson(json); | ||||
| } | ||||
|  | ||||
| enum SnPollQuestionType { | ||||
|   @JsonValue(0) | ||||
|   singleChoice, | ||||
|   @JsonValue(1) | ||||
|   multipleChoice, | ||||
|   @JsonValue(2) | ||||
|   yesNo, | ||||
|   @JsonValue(3) | ||||
|   rating, | ||||
|   @JsonValue(4) | ||||
|   freeText, | ||||
| } | ||||
|  | ||||
| @freezed | ||||
| sealed class SnPollAnswer with _$SnPollAnswer { | ||||
|   const factory SnPollAnswer({ | ||||
|     required String id, | ||||
|     required Map<String, dynamic> answer, | ||||
|     required String accountId, | ||||
|     required String pollId, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
|   }) = _SnPollAnswer; | ||||
|  | ||||
|   factory SnPollAnswer.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPollAnswerFromJson(json); | ||||
| } | ||||
							
								
								
									
										1467
									
								
								lib/models/poll.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1467
									
								
								lib/models/poll.freezed.dart
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										158
									
								
								lib/models/poll.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								lib/models/poll.g.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
|  | ||||
| part of 'poll.dart'; | ||||
|  | ||||
| // ************************************************************************** | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _SnPollWithStats _$SnPollWithStatsFromJson(Map<String, dynamic> json) => | ||||
|     _SnPollWithStats( | ||||
|       userAnswer: json['user_answer'] as Map<String, dynamic>?, | ||||
|       stats: json['stats'] as Map<String, dynamic>, | ||||
|       id: json['id'] as String, | ||||
|       questions: | ||||
|           (json['questions'] as List<dynamic>) | ||||
|               .map((e) => SnPollQuestion.fromJson(e as Map<String, dynamic>)) | ||||
|               .toList(), | ||||
|       title: json['title'] as String?, | ||||
|       description: json['description'] as String?, | ||||
|       endedAt: | ||||
|           json['ended_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['ended_at'] as String), | ||||
|       publisherId: json['publisher_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
|           json['deleted_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['deleted_at'] as String), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnPollWithStatsToJson(_SnPollWithStats instance) => | ||||
|     <String, dynamic>{ | ||||
|       'user_answer': instance.userAnswer, | ||||
|       'stats': instance.stats, | ||||
|       'id': instance.id, | ||||
|       'questions': instance.questions.map((e) => e.toJson()).toList(), | ||||
|       'title': instance.title, | ||||
|       'description': instance.description, | ||||
|       'ended_at': instance.endedAt?.toIso8601String(), | ||||
|       'publisher_id': instance.publisherId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|     }; | ||||
|  | ||||
| _SnPoll _$SnPollFromJson(Map<String, dynamic> json) => _SnPoll( | ||||
|   id: json['id'] as String, | ||||
|   questions: | ||||
|       (json['questions'] as List<dynamic>) | ||||
|           .map((e) => SnPollQuestion.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList(), | ||||
|   title: json['title'] as String?, | ||||
|   description: json['description'] as String?, | ||||
|   endedAt: | ||||
|       json['ended_at'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['ended_at'] as String), | ||||
|   publisherId: json['publisher_id'] as String, | ||||
|   publisher: | ||||
|       json['publisher'] == null | ||||
|           ? null | ||||
|           : SnPublisher.fromJson(json['publisher'] as Map<String, dynamic>), | ||||
|   createdAt: DateTime.parse(json['created_at'] as String), | ||||
|   updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|   deletedAt: | ||||
|       json['deleted_at'] == null | ||||
|           ? null | ||||
|           : DateTime.parse(json['deleted_at'] as String), | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$SnPollToJson(_SnPoll instance) => <String, dynamic>{ | ||||
|   'id': instance.id, | ||||
|   'questions': instance.questions.map((e) => e.toJson()).toList(), | ||||
|   'title': instance.title, | ||||
|   'description': instance.description, | ||||
|   'ended_at': instance.endedAt?.toIso8601String(), | ||||
|   'publisher_id': instance.publisherId, | ||||
|   'publisher': instance.publisher?.toJson(), | ||||
|   'created_at': instance.createdAt.toIso8601String(), | ||||
|   'updated_at': instance.updatedAt.toIso8601String(), | ||||
|   'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
| }; | ||||
|  | ||||
| _SnPollQuestion _$SnPollQuestionFromJson(Map<String, dynamic> json) => | ||||
|     _SnPollQuestion( | ||||
|       id: json['id'] as String, | ||||
|       type: $enumDecode(_$SnPollQuestionTypeEnumMap, json['type']), | ||||
|       options: | ||||
|           (json['options'] as List<dynamic>?) | ||||
|               ?.map((e) => SnPollOption.fromJson(e as Map<String, dynamic>)) | ||||
|               .toList(), | ||||
|       title: json['title'] as String, | ||||
|       description: json['description'] as String?, | ||||
|       order: (json['order'] as num).toInt(), | ||||
|       isRequired: json['is_required'] as bool, | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnPollQuestionToJson(_SnPollQuestion instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'type': _$SnPollQuestionTypeEnumMap[instance.type]!, | ||||
|       'options': instance.options?.map((e) => e.toJson()).toList(), | ||||
|       'title': instance.title, | ||||
|       'description': instance.description, | ||||
|       'order': instance.order, | ||||
|       'is_required': instance.isRequired, | ||||
|     }; | ||||
|  | ||||
| const _$SnPollQuestionTypeEnumMap = { | ||||
|   SnPollQuestionType.singleChoice: 0, | ||||
|   SnPollQuestionType.multipleChoice: 1, | ||||
|   SnPollQuestionType.yesNo: 2, | ||||
|   SnPollQuestionType.rating: 3, | ||||
|   SnPollQuestionType.freeText: 4, | ||||
| }; | ||||
|  | ||||
| _SnPollOption _$SnPollOptionFromJson(Map<String, dynamic> json) => | ||||
|     _SnPollOption( | ||||
|       id: json['id'] as String, | ||||
|       label: json['label'] as String, | ||||
|       description: json['description'] as String?, | ||||
|       order: (json['order'] as num).toInt(), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnPollOptionToJson(_SnPollOption instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'label': instance.label, | ||||
|       'description': instance.description, | ||||
|       'order': instance.order, | ||||
|     }; | ||||
|  | ||||
| _SnPollAnswer _$SnPollAnswerFromJson(Map<String, dynamic> json) => | ||||
|     _SnPollAnswer( | ||||
|       id: json['id'] as String, | ||||
|       answer: json['answer'] as Map<String, dynamic>, | ||||
|       accountId: json['account_id'] as String, | ||||
|       pollId: json['poll_id'] as String, | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
|           json['deleted_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['deleted_at'] as String), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnPollAnswerToJson(_SnPollAnswer instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'answer': instance.answer, | ||||
|       'account_id': instance.accountId, | ||||
|       'poll_id': instance.pollId, | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|     }; | ||||
| @@ -34,9 +34,10 @@ sealed class SnPost with _$SnPost { | ||||
|     @Default([]) List<SnCloudFile> attachments, | ||||
|     required SnPublisher publisher, | ||||
|     @Default({}) Map<String, int> reactionsCount, | ||||
|     @Default({}) Map<String, bool> reactionsMade, | ||||
|     @Default([]) List<dynamic> reactions, | ||||
|     @Default([]) List<PostTag> tags, | ||||
|     @Default([]) List<PostCategory> categories, | ||||
|     @Default([]) List<SnPostTag> tags, | ||||
|     @Default([]) List<SnPostCategory> categories, | ||||
|     @Default([]) List<dynamic> collections, | ||||
|     @Default(null) DateTime? createdAt, | ||||
|     @Default(null) DateTime? updatedAt, | ||||
| @@ -77,6 +78,13 @@ sealed class SnSubscriptionStatus with _$SnSubscriptionStatus { | ||||
| sealed class ReactInfo with _$ReactInfo { | ||||
|   const factory ReactInfo({required String icon, required int attitude}) = | ||||
|       _ReactInfo; | ||||
|  | ||||
|   static String getTranslationKey(String templateKey) { | ||||
|     final parts = templateKey.split('_'); | ||||
|     final camelCase = | ||||
|         parts.map((p) => p[0].toUpperCase() + p.substring(1)).join(); | ||||
|     return 'reaction$camelCase'; | ||||
|   } | ||||
| } | ||||
|  | ||||
| const Map<String, ReactInfo> kReactionTemplates = { | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -16,7 +15,7 @@ T _$identity<T>(T value) => value; | ||||
| /// @nodoc | ||||
| mixin _$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<SnPostTag> get tags; List<SnPostCategory> get categories; List<dynamic> get collections; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; bool get isTruncated; | ||||
| /// Create a copy of SnPost | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -29,16 +28,16 @@ $SnPostCopyWith<SnPost> get copyWith => _$SnPostCopyWithImpl<SnPost>(this as SnP | ||||
|  | ||||
| @override | ||||
| 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) | ||||
| @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 | ||||
| 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; | ||||
| @useResult | ||||
| $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<SnPostTag> tags, List<SnPostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -66,7 +65,7 @@ class _$SnPostCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnPost | ||||
| /// 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( | ||||
| 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 | ||||
| @@ -92,10 +91,11 @@ as String?,forwardedPost: freezed == forwardedPost ? _self.forwardedPost : forwa | ||||
| 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 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<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<SnPostTag>,categories: null == categories ? _self.categories : categories // ignore: cast_nullable_to_non_nullable | ||||
| as List<SnPostCategory>,collections: null == collections ? _self.collections : collections // ignore: cast_nullable_to_non_nullable | ||||
| as List<dynamic>,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| @@ -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<SnPostTag> tags,  List<SnPostCategory> 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<SnPostTag> tags,  List<SnPostCategory> 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<SnPostTag> tags,  List<SnPostCategory> 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 | ||||
| @JsonSerializable() | ||||
|  | ||||
| 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<SnPostTag> tags = const [], final  List<SnPostCategory> 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); | ||||
|  | ||||
| @override final  String id; | ||||
| @@ -203,6 +327,13 @@ class _SnPost implements SnPost { | ||||
|   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; | ||||
| @override@JsonKey() List<dynamic> get reactions { | ||||
|   if (_reactions is EqualUnmodifiableListView) return _reactions; | ||||
| @@ -210,15 +341,15 @@ class _SnPost implements SnPost { | ||||
|   return EqualUnmodifiableListView(_reactions); | ||||
| } | ||||
|  | ||||
|  final  List<PostTag> _tags; | ||||
| @override@JsonKey() List<PostTag> get tags { | ||||
|  final  List<SnPostTag> _tags; | ||||
| @override@JsonKey() List<SnPostTag> get tags { | ||||
|   if (_tags is EqualUnmodifiableListView) return _tags; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_tags); | ||||
| } | ||||
|  | ||||
|  final  List<PostCategory> _categories; | ||||
| @override@JsonKey() List<PostCategory> get categories { | ||||
|  final  List<SnPostCategory> _categories; | ||||
| @override@JsonKey() List<SnPostCategory> get categories { | ||||
|   if (_categories is EqualUnmodifiableListView) return _categories; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_categories); | ||||
| @@ -249,16 +380,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| 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) | ||||
| @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 | ||||
| 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; | ||||
| @override @useResult | ||||
| $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<SnPostTag> tags, List<SnPostCategory> categories, List<dynamic> collections, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -286,7 +417,7 @@ class __$SnPostCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnPost | ||||
| /// 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( | ||||
| 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 | ||||
| @@ -312,10 +443,11 @@ as String?,forwardedPost: freezed == forwardedPost ? _self.forwardedPost : forwa | ||||
| 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 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<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<SnPostTag>,categories: null == categories ? _self._categories : categories // ignore: cast_nullable_to_non_nullable | ||||
| as List<SnPostCategory>,collections: null == collections ? _self._collections : collections // ignore: cast_nullable_to_non_nullable | ||||
| as List<dynamic>,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| @@ -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 | ||||
| @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 | ||||
| @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 | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -54,15 +54,20 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost( | ||||
|         (k, e) => MapEntry(k, (e as num).toInt()), | ||||
|       ) ?? | ||||
|       const {}, | ||||
|   reactionsMade: | ||||
|       (json['reactions_made'] as Map<String, dynamic>?)?.map( | ||||
|         (k, e) => MapEntry(k, e as bool), | ||||
|       ) ?? | ||||
|       const {}, | ||||
|   reactions: json['reactions'] as List<dynamic>? ?? const [], | ||||
|   tags: | ||||
|       (json['tags'] as List<dynamic>?) | ||||
|           ?.map((e) => PostTag.fromJson(e as Map<String, dynamic>)) | ||||
|           ?.map((e) => SnPostTag.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   categories: | ||||
|       (json['categories'] as List<dynamic>?) | ||||
|           ?.map((e) => PostCategory.fromJson(e as Map<String, dynamic>)) | ||||
|           ?.map((e) => SnPostCategory.fromJson(e as Map<String, dynamic>)) | ||||
|           .toList() ?? | ||||
|       const [], | ||||
|   collections: json['collections'] as List<dynamic>? ?? const [], | ||||
| @@ -106,6 +111,7 @@ Map<String, dynamic> _$SnPostToJson(_SnPost instance) => <String, dynamic>{ | ||||
|   'attachments': instance.attachments.map((e) => e.toJson()).toList(), | ||||
|   'publisher': instance.publisher.toJson(), | ||||
|   'reactions_count': instance.reactionsCount, | ||||
|   'reactions_made': instance.reactionsMade, | ||||
|   'reactions': instance.reactions, | ||||
|   'tags': instance.tags.map((e) => e.toJson()).toList(), | ||||
|   'categories': instance.categories.map((e) => e.toJson()).toList(), | ||||
|   | ||||
| @@ -1,19 +1,30 @@ | ||||
|  | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/post.dart'; | ||||
| import 'package:island/services/text.dart'; | ||||
|  | ||||
| part 'post_category.freezed.dart'; | ||||
| part 'post_category.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class PostCategory with _$PostCategory { | ||||
|   const factory PostCategory({ | ||||
| sealed class SnPostCategory with _$SnPostCategory { | ||||
|   const SnPostCategory._(); | ||||
|  | ||||
|   const factory SnPostCategory({ | ||||
|     required String id, | ||||
|     required String slug, | ||||
|     String? name, | ||||
|     @Default([]) List<SnPost> posts, | ||||
|   }) = _PostCategory; | ||||
|   }) = _SnPostCategory; | ||||
|  | ||||
|   factory PostCategory.fromJson(Map<String, dynamic> json) => | ||||
|       _$PostCategoryFromJson(json); | ||||
|   factory SnPostCategory.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPostCategoryFromJson(json); | ||||
|  | ||||
|   String get categoryDisplayTitle { | ||||
|     final capitalizedSlug = slug.capitalizeEachWord(); | ||||
|     if ('postCategory$capitalizedSlug'.trExists()) { | ||||
|       return 'postCategory$capitalizedSlug'.tr(); | ||||
|     } | ||||
|     return name ?? slug; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -14,22 +13,22 @@ part of 'post_category.dart'; | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$PostCategory { | ||||
| mixin _$SnPostCategory { | ||||
|  | ||||
|  String get id; String get slug; String? get name; List<SnPost> get posts; | ||||
| /// Create a copy of PostCategory | ||||
| /// Create a copy of SnPostCategory | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $PostCategoryCopyWith<PostCategory> get copyWith => _$PostCategoryCopyWithImpl<PostCategory>(this as PostCategory, _$identity); | ||||
| $SnPostCategoryCopyWith<SnPostCategory> get copyWith => _$SnPostCategoryCopyWithImpl<SnPostCategory>(this as SnPostCategory, _$identity); | ||||
|  | ||||
|   /// Serializes this PostCategory to a JSON map. | ||||
|   /// Serializes this SnPostCategory to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is PostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -38,15 +37,15 @@ int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEqu | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'PostCategory(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
|   return 'SnPostCategory(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $PostCategoryCopyWith<$Res>  { | ||||
|   factory $PostCategoryCopyWith(PostCategory value, $Res Function(PostCategory) _then) = _$PostCategoryCopyWithImpl; | ||||
| abstract mixin class $SnPostCategoryCopyWith<$Res>  { | ||||
|   factory $SnPostCategoryCopyWith(SnPostCategory value, $Res Function(SnPostCategory) _then) = _$SnPostCategoryCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String slug, String? name, List<SnPost> posts | ||||
| @@ -57,14 +56,14 @@ $Res call({ | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$PostCategoryCopyWithImpl<$Res> | ||||
|     implements $PostCategoryCopyWith<$Res> { | ||||
|   _$PostCategoryCopyWithImpl(this._self, this._then); | ||||
| class _$SnPostCategoryCopyWithImpl<$Res> | ||||
|     implements $SnPostCategoryCopyWith<$Res> { | ||||
|   _$SnPostCategoryCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final PostCategory _self; | ||||
|   final $Res Function(PostCategory) _then; | ||||
|   final SnPostCategory _self; | ||||
|   final $Res Function(SnPostCategory) _then; | ||||
|  | ||||
| /// Create a copy of PostCategory | ||||
| /// Create a copy of SnPostCategory | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| @@ -79,12 +78,136 @@ as List<SnPost>, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnPostCategory]. | ||||
| extension SnPostCategoryPatterns on SnPostCategory { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnPostCategory value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostCategory() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnPostCategory value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostCategory(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnPostCategory value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostCategory() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String slug,  String? name,  List<SnPost> posts)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostCategory() 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 _SnPostCategory(): | ||||
| 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 _SnPostCategory() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.posts);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _PostCategory implements PostCategory { | ||||
|   const _PostCategory({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts; | ||||
|   factory _PostCategory.fromJson(Map<String, dynamic> json) => _$PostCategoryFromJson(json); | ||||
| class _SnPostCategory extends SnPostCategory { | ||||
|   const _SnPostCategory({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts,super._(); | ||||
|   factory _SnPostCategory.fromJson(Map<String, dynamic> json) => _$SnPostCategoryFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String slug; | ||||
| @@ -97,20 +220,20 @@ class _PostCategory implements PostCategory { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Create a copy of PostCategory | ||||
| /// Create a copy of SnPostCategory | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$PostCategoryCopyWith<_PostCategory> get copyWith => __$PostCategoryCopyWithImpl<_PostCategory>(this, _$identity); | ||||
| _$SnPostCategoryCopyWith<_SnPostCategory> get copyWith => __$SnPostCategoryCopyWithImpl<_SnPostCategory>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$PostCategoryToJson(this, ); | ||||
|   return _$SnPostCategoryToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _PostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPostCategory&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -119,15 +242,15 @@ int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEqu | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'PostCategory(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
|   return 'SnPostCategory(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$PostCategoryCopyWith<$Res> implements $PostCategoryCopyWith<$Res> { | ||||
|   factory _$PostCategoryCopyWith(_PostCategory value, $Res Function(_PostCategory) _then) = __$PostCategoryCopyWithImpl; | ||||
| abstract mixin class _$SnPostCategoryCopyWith<$Res> implements $SnPostCategoryCopyWith<$Res> { | ||||
|   factory _$SnPostCategoryCopyWith(_SnPostCategory value, $Res Function(_SnPostCategory) _then) = __$SnPostCategoryCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String slug, String? name, List<SnPost> posts | ||||
| @@ -138,17 +261,17 @@ $Res call({ | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$PostCategoryCopyWithImpl<$Res> | ||||
|     implements _$PostCategoryCopyWith<$Res> { | ||||
|   __$PostCategoryCopyWithImpl(this._self, this._then); | ||||
| class __$SnPostCategoryCopyWithImpl<$Res> | ||||
|     implements _$SnPostCategoryCopyWith<$Res> { | ||||
|   __$SnPostCategoryCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _PostCategory _self; | ||||
|   final $Res Function(_PostCategory) _then; | ||||
|   final _SnPostCategory _self; | ||||
|   final $Res Function(_SnPostCategory) _then; | ||||
|  | ||||
| /// Create a copy of PostCategory | ||||
| /// Create a copy of SnPostCategory | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) { | ||||
|   return _then(_PostCategory( | ||||
|   return _then(_SnPostCategory( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
|   | ||||
| @@ -6,8 +6,8 @@ part of 'post_category.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _PostCategory _$PostCategoryFromJson(Map<String, dynamic> json) => | ||||
|     _PostCategory( | ||||
| _SnPostCategory _$SnPostCategoryFromJson(Map<String, dynamic> json) => | ||||
|     _SnPostCategory( | ||||
|       id: json['id'] as String, | ||||
|       slug: json['slug'] as String, | ||||
|       name: json['name'] as String?, | ||||
| @@ -18,7 +18,7 @@ _PostCategory _$PostCategoryFromJson(Map<String, dynamic> json) => | ||||
|           const [], | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$PostCategoryToJson(_PostCategory instance) => | ||||
| Map<String, dynamic> _$SnPostCategoryToJson(_SnPostCategory instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'slug': instance.slug, | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
|  | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:island/models/post.dart'; | ||||
|  | ||||
| @@ -6,14 +5,14 @@ part 'post_tag.freezed.dart'; | ||||
| part 'post_tag.g.dart'; | ||||
|  | ||||
| @freezed | ||||
| sealed class PostTag with _$PostTag { | ||||
|   const factory PostTag({ | ||||
| sealed class SnPostTag with _$SnPostTag { | ||||
|   const factory SnPostTag({ | ||||
|     required String id, | ||||
|     required String slug, | ||||
|     String? name, | ||||
|     @Default([]) List<SnPost> posts, | ||||
|   }) = _PostTag; | ||||
|   }) = _SnPostTag; | ||||
|  | ||||
|   factory PostTag.fromJson(Map<String, dynamic> json) => | ||||
|       _$PostTagFromJson(json); | ||||
|   factory SnPostTag.fromJson(Map<String, dynamic> json) => | ||||
|       _$SnPostTagFromJson(json); | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -14,22 +13,22 @@ part of 'post_tag.dart'; | ||||
| T _$identity<T>(T value) => value; | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$PostTag { | ||||
| mixin _$SnPostTag { | ||||
|  | ||||
|  String get id; String get slug; String? get name; List<SnPost> get posts; | ||||
| /// Create a copy of PostTag | ||||
| /// Create a copy of SnPostTag | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| $PostTagCopyWith<PostTag> get copyWith => _$PostTagCopyWithImpl<PostTag>(this as PostTag, _$identity); | ||||
| $SnPostTagCopyWith<SnPostTag> get copyWith => _$SnPostTagCopyWithImpl<SnPostTag>(this as SnPostTag, _$identity); | ||||
|  | ||||
|   /// Serializes this PostTag to a JSON map. | ||||
|   /// Serializes this SnPostTag to a JSON map. | ||||
|   Map<String, dynamic> toJson(); | ||||
|  | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is PostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other.posts, posts)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -38,15 +37,15 @@ int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEqu | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'PostTag(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
|   return 'SnPostTag(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class $PostTagCopyWith<$Res>  { | ||||
|   factory $PostTagCopyWith(PostTag value, $Res Function(PostTag) _then) = _$PostTagCopyWithImpl; | ||||
| abstract mixin class $SnPostTagCopyWith<$Res>  { | ||||
|   factory $SnPostTagCopyWith(SnPostTag value, $Res Function(SnPostTag) _then) = _$SnPostTagCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String slug, String? name, List<SnPost> posts | ||||
| @@ -57,14 +56,14 @@ $Res call({ | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class _$PostTagCopyWithImpl<$Res> | ||||
|     implements $PostTagCopyWith<$Res> { | ||||
|   _$PostTagCopyWithImpl(this._self, this._then); | ||||
| class _$SnPostTagCopyWithImpl<$Res> | ||||
|     implements $SnPostTagCopyWith<$Res> { | ||||
|   _$SnPostTagCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final PostTag _self; | ||||
|   final $Res Function(PostTag) _then; | ||||
|   final SnPostTag _self; | ||||
|   final $Res Function(SnPostTag) _then; | ||||
|  | ||||
| /// Create a copy of PostTag | ||||
| /// Create a copy of SnPostTag | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| @@ -79,12 +78,136 @@ as List<SnPost>, | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnPostTag]. | ||||
| extension SnPostTagPatterns on SnPostTag { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnPostTag value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostTag() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnPostTag value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostTag(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnPostTag value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostTag() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String slug,  String? name,  List<SnPost> posts)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPostTag() 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 _SnPostTag(): | ||||
| 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 _SnPostTag() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.posts);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _PostTag implements PostTag { | ||||
|   const _PostTag({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts; | ||||
|   factory _PostTag.fromJson(Map<String, dynamic> json) => _$PostTagFromJson(json); | ||||
| class _SnPostTag implements SnPostTag { | ||||
|   const _SnPostTag({required this.id, required this.slug, this.name, final  List<SnPost> posts = const []}): _posts = posts; | ||||
|   factory _SnPostTag.fromJson(Map<String, dynamic> json) => _$SnPostTagFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @override final  String slug; | ||||
| @@ -97,20 +220,20 @@ class _PostTag implements PostTag { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Create a copy of PostTag | ||||
| /// Create a copy of SnPostTag | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @pragma('vm:prefer-inline') | ||||
| _$PostTagCopyWith<_PostTag> get copyWith => __$PostTagCopyWithImpl<_PostTag>(this, _$identity); | ||||
| _$SnPostTagCopyWith<_SnPostTag> get copyWith => __$SnPostTagCopyWithImpl<_SnPostTag>(this, _$identity); | ||||
|  | ||||
| @override | ||||
| Map<String, dynamic> toJson() { | ||||
|   return _$PostTagToJson(this, ); | ||||
|   return _$SnPostTagToJson(this, ); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _PostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPostTag&&(identical(other.id, id) || other.id == id)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.name, name) || other.name == name)&&const DeepCollectionEquality().equals(other._posts, _posts)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -119,15 +242,15 @@ int get hashCode => Object.hash(runtimeType,id,slug,name,const DeepCollectionEqu | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'PostTag(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
|   return 'SnPostTag(id: $id, slug: $slug, name: $name, posts: $posts)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| abstract mixin class _$PostTagCopyWith<$Res> implements $PostTagCopyWith<$Res> { | ||||
|   factory _$PostTagCopyWith(_PostTag value, $Res Function(_PostTag) _then) = __$PostTagCopyWithImpl; | ||||
| abstract mixin class _$SnPostTagCopyWith<$Res> implements $SnPostTagCopyWith<$Res> { | ||||
|   factory _$SnPostTagCopyWith(_SnPostTag value, $Res Function(_SnPostTag) _then) = __$SnPostTagCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String slug, String? name, List<SnPost> posts | ||||
| @@ -138,17 +261,17 @@ $Res call({ | ||||
|  | ||||
| } | ||||
| /// @nodoc | ||||
| class __$PostTagCopyWithImpl<$Res> | ||||
|     implements _$PostTagCopyWith<$Res> { | ||||
|   __$PostTagCopyWithImpl(this._self, this._then); | ||||
| class __$SnPostTagCopyWithImpl<$Res> | ||||
|     implements _$SnPostTagCopyWith<$Res> { | ||||
|   __$SnPostTagCopyWithImpl(this._self, this._then); | ||||
|  | ||||
|   final _PostTag _self; | ||||
|   final $Res Function(_PostTag) _then; | ||||
|   final _SnPostTag _self; | ||||
|   final $Res Function(_SnPostTag) _then; | ||||
|  | ||||
| /// Create a copy of PostTag | ||||
| /// Create a copy of SnPostTag | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? slug = null,Object? name = freezed,Object? posts = null,}) { | ||||
|   return _then(_PostTag( | ||||
|   return _then(_SnPostTag( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,slug: null == slug ? _self.slug : slug // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'post_tag.dart'; | ||||
| // JsonSerializableGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| _PostTag _$PostTagFromJson(Map<String, dynamic> json) => _PostTag( | ||||
| _SnPostTag _$SnPostTagFromJson(Map<String, dynamic> json) => _SnPostTag( | ||||
|   id: json['id'] as String, | ||||
|   slug: json['slug'] as String, | ||||
|   name: json['name'] as String?, | ||||
| @@ -17,9 +17,10 @@ _PostTag _$PostTagFromJson(Map<String, dynamic> json) => _PostTag( | ||||
|       const [], | ||||
| ); | ||||
|  | ||||
| Map<String, dynamic> _$PostTagToJson(_PostTag instance) => <String, dynamic>{ | ||||
|   'id': instance.id, | ||||
|   'slug': instance.slug, | ||||
|   'name': instance.name, | ||||
|   'posts': instance.posts.map((e) => e.toJson()).toList(), | ||||
| }; | ||||
| Map<String, dynamic> _$SnPostTagToJson(_SnPostTag instance) => | ||||
|     <String, dynamic>{ | ||||
|       'id': instance.id, | ||||
|       'slug': instance.slug, | ||||
|       'name': instance.name, | ||||
|       'posts': instance.posts.map((e) => e.toJson()).toList(), | ||||
|     }; | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -137,6 +136,130 @@ $SnVerificationMarkCopyWith<$Res>? get verification { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnPublisher]. | ||||
| extension SnPublisherPatterns on SnPublisher { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnPublisher value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnPublisher value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnPublisher value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  int type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher() when $default != null: | ||||
| return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  int type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher(): | ||||
| return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  int type,  String name,  String nick,  String bio,  SnCloudFile? picture,  SnCloudFile? background,  SnAccount? account,  String? accountId,  DateTime? createdAt,  DateTime? updatedAt,  DateTime? deletedAt,  String? realmId,  SnVerificationMark? verification)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisher() when $default != null: | ||||
| return $default(_that.id,_that.type,_that.name,_that.nick,_that.bio,_that.picture,_that.background,_that.account,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.realmId,_that.verification);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -376,6 +499,130 @@ $SnAccountCopyWith<$Res>? get account { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnPublisherMember]. | ||||
| extension SnPublisherMemberPatterns on SnPublisherMember { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnPublisherMember value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnPublisherMember value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnPublisherMember value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember() when $default != null: | ||||
| return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember(): | ||||
| return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String publisherId,  SnPublisher? publisher,  String accountId,  SnAccount? account,  int role,  DateTime? joinedAt,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnPublisherMember() when $default != null: | ||||
| return $default(_that.publisherId,_that.publisher,_that.accountId,_that.account,_that.role,_that.joinedAt,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -113,6 +112,130 @@ $SnCloudFileCopyWith<$Res>? get background { | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Adds pattern-matching-related methods to [SnRealm]. | ||||
| extension SnRealmPatterns on SnRealm { | ||||
| /// A variant of `map` that fallback to returning `orElse`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SnRealm value)?  $default,{required TResult orElse(),}){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// Callbacks receives the raw object, upcasted. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case final Subclass2 value: | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SnRealm value)  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm(): | ||||
| return $default(_that);} | ||||
| } | ||||
| /// A variant of `map` that fallback to returning `null`. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case final Subclass value: | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnRealm value)?  $default,){ | ||||
| final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm() when $default != null: | ||||
| return $default(_that);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A variant of `when` that fallback to an `orElse` callback. | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return orElse(); | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id,  String slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,{required TResult orElse(),}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return orElse(); | ||||
|  | ||||
| } | ||||
| } | ||||
| /// A `switch`-like method, using callbacks. | ||||
| /// | ||||
| /// As opposed to `map`, this offers destructuring. | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case Subclass2(:final field2): | ||||
| ///     return ...; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id,  String slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm(): | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);} | ||||
| } | ||||
| /// A variant of `when` that fallback to returning `null` | ||||
| /// | ||||
| /// It is equivalent to doing: | ||||
| /// ```dart | ||||
| /// switch (sealedClass) { | ||||
| ///   case Subclass(:final field): | ||||
| ///     return ...; | ||||
| ///   case _: | ||||
| ///     return null; | ||||
| /// } | ||||
| /// ``` | ||||
|  | ||||
| @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id,  String slug,  String name,  String description,  String? verifiedAs,  DateTime? verifiedAt,  bool isCommunity,  bool isPublic,  SnCloudFile? picture,  SnCloudFile? background,  String accountId,  DateTime createdAt,  DateTime updatedAt,  DateTime? deletedAt)?  $default,) {final _that = this; | ||||
| switch (_that) { | ||||
| case _SnRealm() when $default != null: | ||||
| return $default(_that.id,_that.slug,_that.name,_that.description,_that.verifiedAs,_that.verifiedAt,_that.isCommunity,_that.isPublic,_that.picture,_that.background,_that.accountId,_that.createdAt,_that.updatedAt,_that.deletedAt);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,7 @@ sealed class SnStickerPack with _$SnStickerPack { | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     required DateTime? deletedAt, | ||||
|     @Default([]) List<SnSticker> stickers, | ||||
|   }) = _SnStickerPack; | ||||
|  | ||||
|   factory SnStickerPack.fromJson(Map<String, dynamic> json) => | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @JsonSerializable() | ||||
|  | ||||
| @@ -215,7 +338,7 @@ $SnStickerPackCopyWith<$Res>? get pack { | ||||
| /// @nodoc | ||||
| mixin _$SnStickerPack { | ||||
|  | ||||
|  String get id; String get name; String get description; String get prefix; String get publisherId; SnPublisher? get publisher; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; | ||||
|  String get id; String get name; String get description; String get prefix; String get publisherId; SnPublisher? get publisher; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; List<SnSticker> get stickers; | ||||
| /// Create a copy of SnStickerPack | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -228,16 +351,16 @@ $SnStickerPackCopyWith<SnStickerPack> get copyWith => _$SnStickerPackCopyWithImp | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnStickerPack&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&(identical(other.prefix, prefix) || other.prefix == prefix)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is SnStickerPack&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&(identical(other.prefix, prefix) || other.prefix == prefix)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&const DeepCollectionEquality().equals(other.stickers, stickers)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,prefix,publisherId,publisher,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,prefix,publisherId,publisher,createdAt,updatedAt,deletedAt,const DeepCollectionEquality().hash(stickers)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnStickerPack(id: $id, name: $name, description: $description, prefix: $prefix, publisherId: $publisherId, publisher: $publisher, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnStickerPack(id: $id, name: $name, description: $description, prefix: $prefix, publisherId: $publisherId, publisher: $publisher, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, stickers: $stickers)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -248,7 +371,7 @@ abstract mixin class $SnStickerPackCopyWith<$Res>  { | ||||
|   factory $SnStickerPackCopyWith(SnStickerPack value, $Res Function(SnStickerPack) _then) = _$SnStickerPackCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String description, String prefix, String publisherId, SnPublisher? publisher, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String description, String prefix, String publisherId, SnPublisher? publisher, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, List<SnSticker> stickers | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -265,7 +388,7 @@ class _$SnStickerPackCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnStickerPack | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = null,Object? prefix = null,Object? publisherId = null,Object? publisher = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? name = null,Object? description = null,Object? prefix = null,Object? publisherId = null,Object? publisher = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? stickers = null,}) { | ||||
|   return _then(_self.copyWith( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| @@ -276,7 +399,8 @@ as String,publisher: freezed == publisher ? _self.publisher : publisher // ignor | ||||
| as SnPublisher?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
| as DateTime?,stickers: null == stickers ? _self.stickers : stickers // ignore: cast_nullable_to_non_nullable | ||||
| as List<SnSticker>, | ||||
|   )); | ||||
| } | ||||
| /// Create a copy of SnStickerPack | ||||
| @@ -295,11 +419,135 @@ $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,  List<SnSticker> stickers)?  $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,_that.stickers);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,  List<SnSticker> stickers)  $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,_that.stickers);} | ||||
| } | ||||
| /// 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,  List<SnSticker> stickers)?  $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,_that.stickers);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| @JsonSerializable() | ||||
|  | ||||
| class _SnStickerPack implements SnStickerPack { | ||||
|   const _SnStickerPack({required this.id, required this.name, required this.description, required this.prefix, required this.publisherId, required this.publisher, required this.createdAt, required this.updatedAt, required this.deletedAt}); | ||||
|   const _SnStickerPack({required this.id, required this.name, required this.description, required this.prefix, required this.publisherId, required this.publisher, required this.createdAt, required this.updatedAt, required this.deletedAt, final  List<SnSticker> stickers = const []}): _stickers = stickers; | ||||
|   factory _SnStickerPack.fromJson(Map<String, dynamic> json) => _$SnStickerPackFromJson(json); | ||||
|  | ||||
| @override final  String id; | ||||
| @@ -311,6 +559,13 @@ class _SnStickerPack implements SnStickerPack { | ||||
| @override final  DateTime createdAt; | ||||
| @override final  DateTime updatedAt; | ||||
| @override final  DateTime? deletedAt; | ||||
|  final  List<SnSticker> _stickers; | ||||
| @override@JsonKey() List<SnSticker> get stickers { | ||||
|   if (_stickers is EqualUnmodifiableListView) return _stickers; | ||||
|   // ignore: implicit_dynamic_type | ||||
|   return EqualUnmodifiableListView(_stickers); | ||||
| } | ||||
|  | ||||
|  | ||||
| /// Create a copy of SnStickerPack | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @@ -325,16 +580,16 @@ Map<String, dynamic> toJson() { | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnStickerPack&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&(identical(other.prefix, prefix) || other.prefix == prefix)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnStickerPack&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.description, description) || other.description == description)&&(identical(other.prefix, prefix) || other.prefix == prefix)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&const DeepCollectionEquality().equals(other._stickers, _stickers)); | ||||
| } | ||||
|  | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @override | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,prefix,publisherId,publisher,createdAt,updatedAt,deletedAt); | ||||
| int get hashCode => Object.hash(runtimeType,id,name,description,prefix,publisherId,publisher,createdAt,updatedAt,deletedAt,const DeepCollectionEquality().hash(_stickers)); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
|   return 'SnStickerPack(id: $id, name: $name, description: $description, prefix: $prefix, publisherId: $publisherId, publisher: $publisher, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; | ||||
|   return 'SnStickerPack(id: $id, name: $name, description: $description, prefix: $prefix, publisherId: $publisherId, publisher: $publisher, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, stickers: $stickers)'; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -345,7 +600,7 @@ abstract mixin class _$SnStickerPackCopyWith<$Res> implements $SnStickerPackCopy | ||||
|   factory _$SnStickerPackCopyWith(_SnStickerPack value, $Res Function(_SnStickerPack) _then) = __$SnStickerPackCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String id, String name, String description, String prefix, String publisherId, SnPublisher? publisher, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt | ||||
|  String id, String name, String description, String prefix, String publisherId, SnPublisher? publisher, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, List<SnSticker> stickers | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -362,7 +617,7 @@ class __$SnStickerPackCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of SnStickerPack | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = null,Object? prefix = null,Object? publisherId = null,Object? publisher = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { | ||||
| @override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? description = null,Object? prefix = null,Object? publisherId = null,Object? publisher = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? stickers = null,}) { | ||||
|   return _then(_SnStickerPack( | ||||
| id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable | ||||
| as String,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable | ||||
| @@ -373,7 +628,8 @@ as String,publisher: freezed == publisher ? _self.publisher : publisher // ignor | ||||
| as SnPublisher?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable | ||||
| as DateTime?, | ||||
| as DateTime?,stickers: null == stickers ? _self._stickers : stickers // ignore: cast_nullable_to_non_nullable | ||||
| as List<SnSticker>, | ||||
|   )); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -54,6 +54,11 @@ _SnStickerPack _$SnStickerPackFromJson(Map<String, dynamic> json) => | ||||
|           json['deleted_at'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['deleted_at'] as String), | ||||
|       stickers: | ||||
|           (json['stickers'] as List<dynamic>?) | ||||
|               ?.map((e) => SnSticker.fromJson(e as Map<String, dynamic>)) | ||||
|               .toList() ?? | ||||
|           const [], | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$SnStickerPackToJson(_SnStickerPack instance) => | ||||
| @@ -67,4 +72,5 @@ Map<String, dynamic> _$SnStickerPackToJson(_SnStickerPack instance) => | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|       'stickers': instance.stickers.map((e) => e.toJson()).toList(), | ||||
|     }; | ||||
|   | ||||
| @@ -14,6 +14,7 @@ sealed class SnAccount with _$SnAccount { | ||||
|     required String language, | ||||
|     required bool isSuperuser, | ||||
|     required SnAccountProfile profile, | ||||
|     required SnWalletSubscriptionRef? perkSubscription, | ||||
|     @Default([]) List<SnAccountBadge> badges, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
| @@ -37,6 +38,7 @@ sealed class SnAccountProfile with _$SnAccountProfile { | ||||
|     @Default('') String location, | ||||
|     @Default('') String timeZone, | ||||
|     DateTime? birthday, | ||||
|     @Default({}) Map<String, String> links, | ||||
|     DateTime? lastSeenAt, | ||||
|     SnAccountBadge? activeBadge, | ||||
|     required int experience, | ||||
| @@ -45,7 +47,6 @@ sealed class SnAccountProfile with _$SnAccountProfile { | ||||
|     required SnCloudFile? picture, | ||||
|     required SnCloudFile? background, | ||||
|     required SnVerificationMark? verification, | ||||
|     required SnWalletSubscriptionRef? stellarMembership, | ||||
|     required DateTime createdAt, | ||||
|     required DateTime updatedAt, | ||||
|     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, | ||||
|   isSuperuser: json['is_superuser'] as bool, | ||||
|   profile: SnAccountProfile.fromJson(json['profile'] as Map<String, dynamic>), | ||||
|   perkSubscription: | ||||
|       json['perk_subscription'] == null | ||||
|           ? null | ||||
|           : SnWalletSubscriptionRef.fromJson( | ||||
|             json['perk_subscription'] as Map<String, dynamic>, | ||||
|           ), | ||||
|   badges: | ||||
|       (json['badges'] as List<dynamic>?) | ||||
|           ?.map((e) => SnAccountBadge.fromJson(e as Map<String, dynamic>)) | ||||
| @@ -34,6 +40,7 @@ Map<String, dynamic> _$SnAccountToJson(_SnAccount instance) => | ||||
|       'language': instance.language, | ||||
|       'is_superuser': instance.isSuperuser, | ||||
|       'profile': instance.profile.toJson(), | ||||
|       'perk_subscription': instance.perkSubscription?.toJson(), | ||||
|       'badges': instance.badges.map((e) => e.toJson()).toList(), | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
| @@ -55,6 +62,11 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|           json['birthday'] == null | ||||
|               ? null | ||||
|               : DateTime.parse(json['birthday'] as String), | ||||
|       links: | ||||
|           (json['links'] as Map<String, dynamic>?)?.map( | ||||
|             (k, e) => MapEntry(k, e as String), | ||||
|           ) ?? | ||||
|           const {}, | ||||
|       lastSeenAt: | ||||
|           json['last_seen_at'] == null | ||||
|               ? null | ||||
| @@ -84,12 +96,6 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) => | ||||
|               : SnVerificationMark.fromJson( | ||||
|                 json['verification'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       stellarMembership: | ||||
|           json['stellar_membership'] == null | ||||
|               ? null | ||||
|               : SnWalletSubscriptionRef.fromJson( | ||||
|                 json['stellar_membership'] as Map<String, dynamic>, | ||||
|               ), | ||||
|       createdAt: DateTime.parse(json['created_at'] as String), | ||||
|       updatedAt: DateTime.parse(json['updated_at'] as String), | ||||
|       deletedAt: | ||||
| @@ -110,6 +116,7 @@ Map<String, dynamic> _$SnAccountProfileToJson(_SnAccountProfile instance) => | ||||
|       'location': instance.location, | ||||
|       'time_zone': instance.timeZone, | ||||
|       'birthday': instance.birthday?.toIso8601String(), | ||||
|       'links': instance.links, | ||||
|       'last_seen_at': instance.lastSeenAt?.toIso8601String(), | ||||
|       'active_badge': instance.activeBadge?.toJson(), | ||||
|       'experience': instance.experience, | ||||
| @@ -118,7 +125,6 @@ Map<String, dynamic> _$SnAccountProfileToJson(_SnAccountProfile instance) => | ||||
|       'picture': instance.picture?.toJson(), | ||||
|       'background': instance.background?.toJson(), | ||||
|       'verification': instance.verification?.toJson(), | ||||
|       'stellar_membership': instance.stellarMembership?.toJson(), | ||||
|       'created_at': instance.createdAt.toIso8601String(), | ||||
|       'updated_at': instance.updatedAt.toIso8601String(), | ||||
|       'deleted_at': instance.deletedAt?.toIso8601String(), | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
| @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 | ||||
| @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 | ||||
| @JsonSerializable() | ||||
|  | ||||
|   | ||||
| @@ -4,28 +4,27 @@ import 'package:island/models/webfeed.dart'; | ||||
| import 'package:island/pods/network.dart'; | ||||
|  | ||||
| /// Provider that fetches a single article by its ID | ||||
| final articleDetailProvider = FutureProvider.autoDispose.family<SnWebArticle, String>( | ||||
|   (ref, articleId) async { | ||||
|     final dio = ref.watch(apiClientProvider); | ||||
|      | ||||
|     try { | ||||
|       final response = await dio.get<Map<String, dynamic>>( | ||||
|         '/feeds/articles/$articleId', | ||||
|       ); | ||||
|        | ||||
|       if (response.statusCode == 200 && response.data != null) { | ||||
|         return SnWebArticle.fromJson(response.data!); | ||||
|       } else { | ||||
|         throw Exception('Failed to load article'); | ||||
| final articleDetailProvider = FutureProvider.autoDispose | ||||
|     .family<SnWebArticle, String>((ref, articleId) async { | ||||
|       final dio = ref.watch(apiClientProvider); | ||||
|  | ||||
|       try { | ||||
|         final response = await dio.get<Map<String, dynamic>>( | ||||
|           '/sphere/feeds/articles/$articleId', | ||||
|         ); | ||||
|  | ||||
|         if (response.statusCode == 200 && response.data != null) { | ||||
|           return SnWebArticle.fromJson(response.data!); | ||||
|         } else { | ||||
|           throw Exception('Failed to load article'); | ||||
|         } | ||||
|       } on DioException catch (e) { | ||||
|         if (e.response?.statusCode == 404) { | ||||
|           throw Exception('Article not found'); | ||||
|         } else { | ||||
|           throw Exception('Failed to load article: ${e.message}'); | ||||
|         } | ||||
|       } catch (e) { | ||||
|         throw Exception('Failed to load article: $e'); | ||||
|       } | ||||
|     } on DioException catch (e) { | ||||
|       if (e.response?.statusCode == 404) { | ||||
|         throw Exception('Article not found'); | ||||
|       } else { | ||||
|         throw Exception('Failed to load article: ${e.message}'); | ||||
|       } | ||||
|     } catch (e) { | ||||
|       throw Exception('Failed to load article: $e'); | ||||
|     } | ||||
|   }, | ||||
| ); | ||||
|     }); | ||||
|   | ||||
| @@ -1,13 +1,14 @@ | ||||
| import 'package:island/pods/userinfo.dart'; | ||||
| import 'package:island/screens/chat/chat.dart'; | ||||
| import 'dart:async'; | ||||
| 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:livekit_client/livekit_client.dart'; | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'dart:async'; | ||||
| import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||||
| import 'package:island/pods/network.dart'; | ||||
| import 'package:island/models/chat.dart'; | ||||
| import 'package:island/pods/websocket.dart'; | ||||
|  | ||||
| part 'call.g.dart'; | ||||
| part 'call.freezed.dart'; | ||||
| @@ -27,6 +28,7 @@ sealed class CallState with _$CallState { | ||||
|     required bool isMicrophoneEnabled, | ||||
|     required bool isCameraEnabled, | ||||
|     required bool isScreenSharing, | ||||
|     required bool isSpeakerphone, | ||||
|     @Default(Duration(seconds: 0)) Duration duration, | ||||
|     String? error, | ||||
|   }) = _CallState; | ||||
| @@ -42,7 +44,8 @@ sealed class CallParticipantLive with _$CallParticipantLive { | ||||
|   }) = _CallParticipantLive; | ||||
|  | ||||
|   bool get isSpeaking => remoteParticipant.isSpeaking; | ||||
|   bool get isMuted => remoteParticipant.isMuted; | ||||
|   bool get isMuted => | ||||
|       remoteParticipant.isMuted || !remoteParticipant.isMicrophoneEnabled(); | ||||
|   bool get isScreenSharing => remoteParticipant.isScreenShareEnabled(); | ||||
|   bool get isScreenSharingWithAudio => | ||||
|       remoteParticipant.isScreenShareAudioEnabled(); | ||||
| @@ -57,13 +60,14 @@ class CallNotifier extends _$CallNotifier { | ||||
|   LocalParticipant? _localParticipant; | ||||
|   List<CallParticipantLive> _participants = []; | ||||
|   final Map<String, CallParticipant> _participantInfoByIdentity = {}; | ||||
|   StreamSubscription? _wsSubscription; | ||||
|   EventsListener? _roomListener; | ||||
|  | ||||
|   List<CallParticipantLive> get participants => | ||||
|       List.unmodifiable(_participants); | ||||
|   LocalParticipant? get localParticipant => _localParticipant; | ||||
|  | ||||
|   Map<String, double> participantsVolumes = {}; | ||||
|  | ||||
|   Timer? _durationTimer; | ||||
|  | ||||
|   Room? get room => _room; | ||||
| @@ -71,36 +75,15 @@ class CallNotifier extends _$CallNotifier { | ||||
|   @override | ||||
|   CallState build() { | ||||
|     // Subscribe to websocket updates | ||||
|     _subscribeToParticipantsUpdate(); | ||||
|     return const CallState( | ||||
|       isConnected: false, | ||||
|       isMicrophoneEnabled: true, | ||||
|       isCameraEnabled: 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() { | ||||
|     if (_room == null) return; | ||||
|     _roomListener?.dispose(); | ||||
| @@ -143,8 +126,6 @@ class CallNotifier extends _$CallNotifier { | ||||
|               identity: remote.identity, | ||||
|               name: remote.identity, | ||||
|               joinedAt: DateTime.now(), | ||||
|               accountId: null, | ||||
|               profile: null, | ||||
|             ); | ||||
|         return CallParticipantLive( | ||||
|           participant: match, | ||||
| @@ -169,16 +150,12 @@ class CallNotifier extends _$CallNotifier { | ||||
|       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 | ||||
|     return _participantInfoByIdentity[_localParticipant!.identity] ?? | ||||
|         CallParticipant( | ||||
|           identity: _localParticipant!.identity, | ||||
|           name: _localParticipant!.identity, | ||||
|           joinedAt: DateTime.now(), | ||||
|           accountId: userInfo.value?.id, | ||||
|           profile: roomIdentity.value, | ||||
|         ); | ||||
|   } | ||||
|  | ||||
| @@ -205,6 +182,7 @@ class CallNotifier extends _$CallNotifier { | ||||
|           remoteParticipant: _localParticipant!, | ||||
|         ), | ||||
|       ); | ||||
|       state = state.copyWith(); | ||||
|     } | ||||
|     // Add remote participants | ||||
|     _participants.addAll( | ||||
| @@ -233,7 +211,13 @@ class CallNotifier extends _$CallNotifier { | ||||
|  | ||||
|   Future<void> joinRoom(String roomId) async { | ||||
|     if (_roomId == roomId && _room != null) { | ||||
|       log('[Call] Call skipped. Already has data'); | ||||
|       return; | ||||
|     } else if (_room != null) { | ||||
|       if (!_room!.isDisposed && | ||||
|           _room!.connectionState != ConnectionState.disconnected) { | ||||
|         throw Exception('Call already connected'); | ||||
|       } | ||||
|     } | ||||
|     _roomId = roomId; | ||||
|     if (_room != null) { | ||||
| @@ -246,7 +230,9 @@ class CallNotifier extends _$CallNotifier { | ||||
|     try { | ||||
|       final apiClient = ref.read(apiClientProvider); | ||||
|       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) { | ||||
|         final data = response.data; | ||||
|         // Parse join response | ||||
| @@ -262,7 +248,8 @@ class CallNotifier extends _$CallNotifier { | ||||
|             duration: Duration( | ||||
|               milliseconds: | ||||
|                   (DateTime.now().millisecondsSinceEpoch - | ||||
|                       (ongoingCall?.createdAt.millisecondsSinceEpoch ?? 0)), | ||||
|                       (ongoingCall?.createdAt.millisecondsSinceEpoch ?? | ||||
|                           DateTime.now().millisecondsSinceEpoch)), | ||||
|             ), | ||||
|           ); | ||||
|         }); | ||||
| @@ -284,6 +271,10 @@ class CallNotifier extends _$CallNotifier { | ||||
|         _initRoomListeners(); | ||||
|         _updateLiveParticipants(participants); | ||||
|  | ||||
|         if (!kIsWeb && (Platform.isIOS || Platform.isAndroid)) { | ||||
|           Hardware.instance.setSpeakerphoneOn(true); | ||||
|         } | ||||
|  | ||||
|         // Listen for connection updates | ||||
|         _room!.addListener(() { | ||||
|           state = state.copyWith( | ||||
| @@ -316,6 +307,7 @@ class CallNotifier extends _$CallNotifier { | ||||
|           stopOnMute: autostop, | ||||
|         ); | ||||
|       } | ||||
|       state = state.copyWith(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -324,6 +316,7 @@ class CallNotifier extends _$CallNotifier { | ||||
|       final target = !_localParticipant!.isCameraEnabled(); | ||||
|       state = state.copyWith(isCameraEnabled: target); | ||||
|       await _localParticipant!.setCameraEnabled(target); | ||||
|       state = state.copyWith(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -332,9 +325,16 @@ class CallNotifier extends _$CallNotifier { | ||||
|       final target = !_localParticipant!.isScreenShareEnabled(); | ||||
|       state = state.copyWith(isScreenSharing: 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 { | ||||
|     if (_room != null) { | ||||
|       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() { | ||||
|     _wsSubscription?.cancel(); | ||||
|     state = state.copyWith( | ||||
|       error: null, | ||||
|       isConnected: false, | ||||
|       isMicrophoneEnabled: false, | ||||
|       isCameraEnabled: false, | ||||
|       isScreenSharing: false, | ||||
|     ); | ||||
|     _roomListener?.dispose(); | ||||
|     _room?.removeListener(_onRoomChange); | ||||
|     _room?.dispose(); | ||||
|     _durationTimer?.cancel(); | ||||
|     _roomId = null; | ||||
|     participantsVolumes = {}; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -13,9 +12,9 @@ part of 'call.dart'; | ||||
| // dart format off | ||||
| T _$identity<T>(T value) => value; | ||||
| /// @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 | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -23,19 +22,25 @@ mixin _$CallState { | ||||
| $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 | ||||
| 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 | ||||
| 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 | ||||
| String toString() { | ||||
|   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, duration: $duration, error: $error)'; | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   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; | ||||
| @useResult | ||||
| $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 | ||||
| /// 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( | ||||
| 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,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,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 Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | ||||
| 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 | ||||
|  | ||||
|  | ||||
| class _CallState implements CallState { | ||||
|   const _CallState({required this.isConnected, required this.isMicrophoneEnabled, required this.isCameraEnabled, required this.isScreenSharing, this.duration = const Duration(seconds: 0), this.error}); | ||||
| class _CallState with DiagnosticableTreeMixin implements CallState { | ||||
|   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 isMicrophoneEnabled; | ||||
| @override final  bool isCameraEnabled; | ||||
| @override final  bool isScreenSharing; | ||||
| @override final  bool isSpeakerphone; | ||||
| @override@JsonKey() final  Duration duration; | ||||
| @override final  String? error; | ||||
|  | ||||
| @@ -99,19 +230,25 @@ class _CallState implements CallState { | ||||
| _$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 | ||||
| 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 | ||||
| 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 | ||||
| String toString() { | ||||
|   return 'CallState(isConnected: $isConnected, isMicrophoneEnabled: $isMicrophoneEnabled, isCameraEnabled: $isCameraEnabled, isScreenSharing: $isScreenSharing, duration: $duration, error: $error)'; | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   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; | ||||
| @override @useResult | ||||
| $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 | ||||
| /// 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( | ||||
| 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,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,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 Duration,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable | ||||
| as String?, | ||||
| @@ -155,7 +293,7 @@ as String?, | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
| mixin _$CallParticipantLive { | ||||
| mixin _$CallParticipantLive implements DiagnosticableTreeMixin { | ||||
|  | ||||
|  CallParticipant get participant; Participant get remoteParticipant; | ||||
| /// Create a copy of CallParticipantLive | ||||
| @@ -165,6 +303,12 @@ mixin _$CallParticipantLive { | ||||
| $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 | ||||
| bool operator ==(Object other) { | ||||
| @@ -176,7 +320,7 @@ bool operator ==(Object other) { | ||||
| int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   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 | ||||
|  | ||||
|  | ||||
| class _CallParticipantLive extends CallParticipantLive { | ||||
| class _CallParticipantLive extends CallParticipantLive with DiagnosticableTreeMixin { | ||||
|   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); | ||||
|  | ||||
|  | ||||
| @override | ||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||
|   properties | ||||
|     ..add(DiagnosticsProperty('type', 'CallParticipantLive')) | ||||
|     ..add(DiagnosticsProperty('participant', participant))..add(DiagnosticsProperty('remoteParticipant', remoteParticipant)); | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
| @@ -253,7 +527,7 @@ bool operator ==(Object other) { | ||||
| int get hashCode => Object.hash(runtimeType,participant,remoteParticipant); | ||||
|  | ||||
| @override | ||||
| String toString() { | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   return 'CallParticipantLive(participant: $participant, remoteParticipant: $remoteParticipant)'; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'call.dart'; | ||||
| // RiverpodGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$callNotifierHash() => r'47eaba43aa2af1a107725998f4a34af2c94fbc55'; | ||||
| String _$callNotifierHash() => r'18fb807f067eecd3ea42631c1426c3e5f1fb4280'; | ||||
|  | ||||
| /// See also [CallNotifier]. | ||||
| @ProviderFor(CallNotifier) | ||||
|   | ||||
| @@ -9,7 +9,7 @@ class ChatSummary extends _$ChatSummary { | ||||
|   @override | ||||
|   Future<Map<String, SnChatSummary>> build() async { | ||||
|     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; | ||||
|     return data.map( | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'chat_summary.dart'; | ||||
| // RiverpodGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$chatSummaryHash() => r'19aad48b5fabb33a76b742400d3b738ceb81c40c'; | ||||
| String _$chatSummaryHash() => r'87a10e4cefa37dc5fa8eadb175ef1b2bed6070bf'; | ||||
|  | ||||
| /// See also [ChatSummary]. | ||||
| @ProviderFor(ChatSummary) | ||||
|   | ||||
| @@ -10,7 +10,7 @@ part 'config.g.dart'; | ||||
|  | ||||
| const kTokenPairStoreKey = 'dyn_user_tk'; | ||||
|  | ||||
| const kNetworkServerDefault = 'https://nt.solian.app'; | ||||
| const kNetworkServerDefault = 'https://api.solian.app'; | ||||
| const kNetworkServerStoreKey = 'app_server_url'; | ||||
|  | ||||
| const kAppbarTransparentStoreKey = 'app_bar_transparent'; | ||||
| @@ -82,7 +82,7 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { | ||||
|   Size? _getWindowSizeFromPrefs(SharedPreferences prefs) { | ||||
|     final sizeString = prefs.getString(kAppWindowSize); | ||||
|     if (sizeString == null) return null; | ||||
|      | ||||
|  | ||||
|     try { | ||||
|       final parts = sizeString.split(','); | ||||
|       if (parts.length == 2) { | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -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 | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -9,10 +9,10 @@ part 'event_calendar.g.dart'; | ||||
| class EventCalendarQuery { | ||||
|   /// Username to fetch calendar for, null means current user ('me') | ||||
|   final String? uname; | ||||
|    | ||||
|  | ||||
|   /// Year to fetch calendar for | ||||
|   final int year; | ||||
|    | ||||
|  | ||||
|   /// Month to fetch calendar for | ||||
|   final int month; | ||||
|  | ||||
| @@ -43,14 +43,12 @@ Future<List<SnEventCalendarEntry>> eventCalendar( | ||||
|   EventCalendarQuery query, | ||||
| ) async { | ||||
|   final client = ref.watch(apiClientProvider); | ||||
|   final resp = await client.get('/accounts/${query.uname ?? 'me'}/calendar',  | ||||
|     queryParameters: { | ||||
|       'year': query.year, | ||||
|       'month': query.month, | ||||
|     }, | ||||
|   final resp = await client.get( | ||||
|     '/id/accounts/${query.uname ?? 'me'}/calendar', | ||||
|     queryParameters: {'year': query.year, 'month': query.month}, | ||||
|   ); | ||||
|   return resp.data | ||||
|       .map((e) => SnEventCalendarEntry.fromJson(e)) | ||||
|       .cast<SnEventCalendarEntry>() | ||||
|       .toList(); | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'event_calendar.dart'; | ||||
| // RiverpodGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$eventCalendarHash() => r'6f2454404fa8660b96334d654490e1a40ee53e10'; | ||||
| String _$eventCalendarHash() => r'72232fc044ac3c99b855dca37ff2f06a64be0afb'; | ||||
|  | ||||
| /// Copied from Dart SDK | ||||
| class _SystemHash { | ||||
|   | ||||
							
								
								
									
										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 { | ||||
|     try { | ||||
|       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); | ||||
|       state = AsyncValue.data(user); | ||||
|     } catch (error, stackTrace) { | ||||
|   | ||||
| @@ -10,7 +10,7 @@ final webFeedListProvider = FutureProvider.family<List<SnWebFeed>, String>(( | ||||
|   pubName, | ||||
| ) async { | ||||
|   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) | ||||
|       .map((json) => SnWebFeed.fromJson(json)) | ||||
|       .toList(); | ||||
| @@ -39,7 +39,7 @@ class WebFeedNotifier | ||||
|     try { | ||||
|       final client = ref.read(apiClientProvider); | ||||
|       final response = await client.get( | ||||
|         '/publishers/${arg.pubName}/feeds/${arg.feedId}', | ||||
|         '/sphere/publishers/${arg.pubName}/feeds/${arg.feedId}', | ||||
|       ); | ||||
|       return SnWebFeed.fromJson(response.data); | ||||
|     } catch (e) { | ||||
| @@ -51,7 +51,7 @@ class WebFeedNotifier | ||||
|     state = const AsyncValue.loading(); | ||||
|     try { | ||||
|       final client = ref.read(apiClientProvider); | ||||
|       final url = '/publishers/${feed.publisherId}/feeds'; | ||||
|       final url = '/sphere/publishers/${feed.publisherId}/feeds'; | ||||
|  | ||||
|       final response = | ||||
|           feed.id.isEmpty | ||||
| @@ -72,7 +72,7 @@ class WebFeedNotifier | ||||
|     state = const AsyncValue.loading(); | ||||
|     try { | ||||
|       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( | ||||
|         SnWebFeed( | ||||
|           id: '', | ||||
| @@ -98,7 +98,7 @@ class WebFeedNotifier | ||||
|     try { | ||||
|       final client = ref.read(apiClientProvider); | ||||
|       await client.post( | ||||
|         '/publishers/${arg.pubName}/feeds/$feedId/scrap', | ||||
|         '/sphere/publishers/${arg.pubName}/feeds/$feedId/scrap', | ||||
|         options: Options( | ||||
|           sendTimeout: const Duration(seconds: 60), | ||||
|           receiveTimeout: const Duration(seconds: 180), | ||||
| @@ -107,7 +107,7 @@ class WebFeedNotifier | ||||
|  | ||||
|       // Reload the feed | ||||
|       final response = await client.get( | ||||
|         '/publishers/${arg.pubName}/feeds/$feedId', | ||||
|         '/sphere/publishers/${arg.pubName}/feeds/$feedId', | ||||
|       ); | ||||
|       state = AsyncValue.data(SnWebFeed.fromJson(response.data)); | ||||
|     } catch (error, stackTrace) { | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import 'dart:async'; | ||||
| import 'dart:convert'; | ||||
| import 'dart:developer'; | ||||
|  | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter_riverpod/flutter_riverpod.dart'; | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| @@ -18,6 +17,8 @@ sealed class WebSocketState with _$WebSocketState { | ||||
|   const factory WebSocketState.connected() = _Connected; | ||||
|   const factory WebSocketState.connecting() = _Connecting; | ||||
|   const factory WebSocketState.disconnected() = _Disconnected; | ||||
|   const factory WebSocketState.serverDown() = _ServerDown; | ||||
|   const factory WebSocketState.duplicateDevice() = _DuplicateDevice; | ||||
|   const factory WebSocketState.error(String message) = _Error; | ||||
| } | ||||
|  | ||||
| @@ -26,6 +27,7 @@ sealed class WebSocketPacket with _$WebSocketPacket { | ||||
|   const factory WebSocketPacket({ | ||||
|     required String type, | ||||
|     required Map<String, dynamic>? data, | ||||
|     String? endpoint, | ||||
|     String? errorMessage, | ||||
|   }) = _WebSocketPacket; | ||||
|  | ||||
| @@ -45,6 +47,10 @@ class WebSocketService { | ||||
|   final StreamController<WebSocketState> _statusStreamController = | ||||
|       StreamController<WebSocketState>.broadcast(); | ||||
|   Timer? _reconnectTimer; | ||||
|   Timer? _heartbeatTimer; | ||||
|  | ||||
|   DateTime? _heartbeatAt; | ||||
|   Duration? heartbeatDelay; | ||||
|  | ||||
|   Stream<WebSocketPacket> get dataStream => _streamController.stream; | ||||
|   Stream<WebSocketState> get statusStream => _statusStreamController.stream; | ||||
| @@ -65,20 +71,33 @@ class WebSocketService { | ||||
|       } else { | ||||
|         _channel = IOWebSocketChannel.connect( | ||||
|           Uri.parse(url), | ||||
|           headers: {'Authorization': 'Bearer $token'}, | ||||
|           headers: {'Authorization': 'AtField $token'}, | ||||
|         ); | ||||
|       } | ||||
|       await _channel!.ready; | ||||
|       _statusStreamController.sink.add(WebSocketState.connected()); | ||||
|       _scheduleHeartbeat(); | ||||
|       _channel!.stream.listen( | ||||
|         (data) { | ||||
|           final dataStr = | ||||
|               data is Uint8List ? utf8.decode(data) : data.toString(); | ||||
|           final packet = WebSocketPacket.fromJson(jsonDecode(dataStr)); | ||||
|           if (packet.type == 'error.dupe') { | ||||
|             _statusStreamController.sink.add(WebSocketState.duplicateDevice()); | ||||
|             _channel!.sink.close(); | ||||
|             return; | ||||
|           } | ||||
|           _streamController.sink.add(packet); | ||||
|           log( | ||||
|             "[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: () { | ||||
|           log('[WebSocket] Connection closed, attempting to reconnect...'); | ||||
| @@ -107,6 +126,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; | ||||
|  | ||||
|   void sendMessage(String message) { | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| // dart format width=80 | ||||
| // coverage:ignore-file | ||||
| // GENERATED CODE - DO NOT MODIFY BY HAND | ||||
| // coverage:ignore-file | ||||
| // ignore_for_file: type=lint | ||||
| // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark | ||||
|  | ||||
| @@ -48,6 +47,160 @@ $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( _ServerDown value)?  serverDown,TResult Function( _DuplicateDevice value)?  duplicateDevice,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 _ServerDown() when serverDown != null: | ||||
| return serverDown(_that);case _DuplicateDevice() when duplicateDevice != null: | ||||
| return duplicateDevice(_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( _ServerDown value)  serverDown,required TResult Function( _DuplicateDevice value)  duplicateDevice,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 _ServerDown(): | ||||
| return serverDown(_that);case _DuplicateDevice(): | ||||
| return duplicateDevice(_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( _ServerDown value)?  serverDown,TResult? Function( _DuplicateDevice value)?  duplicateDevice,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 _ServerDown() when serverDown != null: | ||||
| return serverDown(_that);case _DuplicateDevice() when duplicateDevice != null: | ||||
| return duplicateDevice(_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()?  serverDown,TResult Function()?  duplicateDevice,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 _ServerDown() when serverDown != null: | ||||
| return serverDown();case _DuplicateDevice() when duplicateDevice != null: | ||||
| return duplicateDevice();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()  serverDown,required TResult Function()  duplicateDevice,required TResult Function( String message)  error,}) {final _that = this; | ||||
| switch (_that) { | ||||
| case _Connected(): | ||||
| return connected();case _Connecting(): | ||||
| return connecting();case _Disconnected(): | ||||
| return disconnected();case _ServerDown(): | ||||
| return serverDown();case _DuplicateDevice(): | ||||
| return duplicateDevice();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()?  serverDown,TResult? Function()?  duplicateDevice,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 _ServerDown() when serverDown != null: | ||||
| return serverDown();case _DuplicateDevice() when duplicateDevice != null: | ||||
| return duplicateDevice();case _Error() when error != null: | ||||
| return error(_that.message);case _: | ||||
|   return null; | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| /// @nodoc | ||||
|  | ||||
|  | ||||
| @@ -162,6 +315,82 @@ String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|  | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
|  | ||||
|  | ||||
| class _ServerDown with DiagnosticableTreeMixin implements WebSocketState { | ||||
|   const _ServerDown(); | ||||
|    | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @override | ||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||
|   properties | ||||
|     ..add(DiagnosticsProperty('type', 'WebSocketState.serverDown')) | ||||
|     ; | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _ServerDown); | ||||
| } | ||||
|  | ||||
|  | ||||
| @override | ||||
| int get hashCode => runtimeType.hashCode; | ||||
|  | ||||
| @override | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   return 'WebSocketState.serverDown()'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
|  | ||||
|  | ||||
| class _DuplicateDevice with DiagnosticableTreeMixin implements WebSocketState { | ||||
|   const _DuplicateDevice(); | ||||
|    | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @override | ||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||
|   properties | ||||
|     ..add(DiagnosticsProperty('type', 'WebSocketState.duplicateDevice')) | ||||
|     ; | ||||
| } | ||||
|  | ||||
| @override | ||||
| bool operator ==(Object other) { | ||||
|   return identical(this, other) || (other.runtimeType == runtimeType&&other is _DuplicateDevice); | ||||
| } | ||||
|  | ||||
|  | ||||
| @override | ||||
| int get hashCode => runtimeType.hashCode; | ||||
|  | ||||
| @override | ||||
| String toString({ DiagnosticLevel minLevel = DiagnosticLevel.info }) { | ||||
|   return 'WebSocketState.duplicateDevice()'; | ||||
| } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /// @nodoc | ||||
|  | ||||
|  | ||||
| @@ -238,7 +467,7 @@ as String, | ||||
| /// @nodoc | ||||
| 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 | ||||
| /// with the given fields replaced by the non-null parameter values. | ||||
| @JsonKey(includeFromJson: false, includeToJson: false) | ||||
| @@ -252,21 +481,21 @@ $WebSocketPacketCopyWith<WebSocketPacket> get copyWith => _$WebSocketPacketCopyW | ||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||
|   properties | ||||
|     ..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 | ||||
| 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) | ||||
| @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 | ||||
| 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 +506,7 @@ abstract mixin class $WebSocketPacketCopyWith<$Res>  { | ||||
|   factory $WebSocketPacketCopyWith(WebSocketPacket value, $Res Function(WebSocketPacket) _then) = _$WebSocketPacketCopyWithImpl; | ||||
| @useResult | ||||
| $Res call({ | ||||
|  String type, Map<String, dynamic>? data, String? errorMessage | ||||
|  String type, Map<String, dynamic>? data, String? endpoint, String? errorMessage | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -294,11 +523,12 @@ class _$WebSocketPacketCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of WebSocketPacket | ||||
| /// 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( | ||||
| 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 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?, | ||||
|   )); | ||||
| } | ||||
| @@ -306,11 +536,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 | ||||
| @JsonSerializable() | ||||
|  | ||||
| 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); | ||||
|  | ||||
| @override final  String type; | ||||
| @@ -323,6 +677,7 @@ class _WebSocketPacket with DiagnosticableTreeMixin implements WebSocketPacket { | ||||
|   return EqualUnmodifiableMapView(value); | ||||
| } | ||||
|  | ||||
| @override final  String? endpoint; | ||||
| @override final  String? errorMessage; | ||||
|  | ||||
| /// Create a copy of WebSocketPacket | ||||
| @@ -339,21 +694,21 @@ Map<String, dynamic> toJson() { | ||||
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||||
|   properties | ||||
|     ..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 | ||||
| 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) | ||||
| @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 | ||||
| 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 +719,7 @@ abstract mixin class _$WebSocketPacketCopyWith<$Res> implements $WebSocketPacket | ||||
|   factory _$WebSocketPacketCopyWith(_WebSocketPacket value, $Res Function(_WebSocketPacket) _then) = __$WebSocketPacketCopyWithImpl; | ||||
| @override @useResult | ||||
| $Res call({ | ||||
|  String type, Map<String, dynamic>? data, String? errorMessage | ||||
|  String type, Map<String, dynamic>? data, String? endpoint, String? errorMessage | ||||
| }); | ||||
|  | ||||
|  | ||||
| @@ -381,11 +736,12 @@ class __$WebSocketPacketCopyWithImpl<$Res> | ||||
|  | ||||
| /// Create a copy of WebSocketPacket | ||||
| /// 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( | ||||
| 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 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?, | ||||
|   )); | ||||
| } | ||||
|   | ||||
| @@ -10,6 +10,7 @@ _WebSocketPacket _$WebSocketPacketFromJson(Map<String, dynamic> json) => | ||||
|     _WebSocketPacket( | ||||
|       type: json['type'] as String, | ||||
|       data: json['data'] as Map<String, dynamic>?, | ||||
|       endpoint: json['endpoint'] as String?, | ||||
|       errorMessage: json['error_message'] as String?, | ||||
|     ); | ||||
|  | ||||
| @@ -17,5 +18,6 @@ Map<String, dynamic> _$WebSocketPacketToJson(_WebSocketPacket instance) => | ||||
|     <String, dynamic>{ | ||||
|       'type': instance.type, | ||||
|       'data': instance.data, | ||||
|       'endpoint': instance.endpoint, | ||||
|       'error_message': instance.errorMessage, | ||||
|     }; | ||||
|   | ||||
							
								
								
									
										224
									
								
								lib/route.dart
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								lib/route.dart
									
									
									
									
									
								
							| @@ -7,6 +7,7 @@ import 'package:island/screens/developers/edit_app.dart'; | ||||
| import 'package:island/screens/developers/new_app.dart'; | ||||
| import 'package:island/screens/developers/hub.dart'; | ||||
| import 'package:island/screens/discovery/articles.dart'; | ||||
| import 'package:island/screens/posts/post_category_detail.dart'; | ||||
| import 'package:island/screens/posts/post_search.dart'; | ||||
| import 'package:island/widgets/app_wrapper.dart'; | ||||
| import 'package:island/screens/tabs.dart'; | ||||
| @@ -28,9 +29,13 @@ import 'package:island/screens/creators/hub.dart'; | ||||
| import 'package:island/screens/creators/posts/post_manage_list.dart'; | ||||
| import 'package:island/screens/creators/stickers/stickers.dart'; | ||||
| import 'package:island/screens/creators/stickers/pack_detail.dart'; | ||||
| import 'package:island/screens/stickers/marketplace.dart'; | ||||
| import 'package:island/screens/stickers/pack_detail.dart'; | ||||
| import 'package:island/screens/creators/poll/poll_list.dart'; | ||||
| import 'package:island/screens/creators/publishers.dart'; | ||||
| import 'package:island/screens/creators/webfeed/webfeed_list.dart'; | ||||
| import 'package:island/screens/creators/webfeed/webfeed_edit.dart'; | ||||
| import 'package:island/screens/poll/poll_editor.dart'; | ||||
| import 'package:island/screens/posts/compose.dart'; | ||||
| import 'package:island/screens/posts/post_detail.dart'; | ||||
| import 'package:island/screens/posts/pub_profile.dart'; | ||||
| @@ -63,6 +68,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|         routes: [ | ||||
|           // Standalone routes without bottom navigation | ||||
|           GoRoute( | ||||
|             name: 'postCompose', | ||||
|             path: '/posts/compose', | ||||
|             builder: | ||||
|                 (context, state) => PostComposeScreen( | ||||
| @@ -73,6 +79,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 ), | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'postEdit', | ||||
|             path: '/posts/:id/edit', | ||||
|             builder: (context, state) { | ||||
|               final id = state.pathParameters['id']!; | ||||
| @@ -80,6 +87,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|             }, | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'chatCall', | ||||
|             path: '/chat/:id/call', | ||||
|             builder: (context, state) { | ||||
|               final id = state.pathParameters['id']!; | ||||
| @@ -87,6 +95,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|             }, | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'accountCalendar', | ||||
|             path: '/account/:name/calendar', | ||||
|             builder: (context, state) { | ||||
|               final name = state.pathParameters['name']!; | ||||
| @@ -98,11 +107,13 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 (context, state, child) => CreatorHubShellScreen(child: child), | ||||
|             routes: [ | ||||
|               GoRoute( | ||||
|                 name: 'creatorHub', | ||||
|                 path: '/creators', | ||||
|                 builder: (context, state) => const CreatorHubScreen(), | ||||
|               ), | ||||
|               // Web Feed Routes | ||||
|               GoRoute( | ||||
|                 name: 'creatorFeeds', | ||||
|                 path: '/creators/:name/feeds', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -110,6 +121,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|                 routes: [ | ||||
|                   GoRoute( | ||||
|                     name: 'creatorFeedNew', | ||||
|                     path: 'new', | ||||
|                     builder: (context, state) { | ||||
|                       return WebFeedNewScreen( | ||||
| @@ -118,6 +130,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'creatorFeedEdit', | ||||
|                     path: ':feedId', | ||||
|                     builder: (context, state) { | ||||
|                       return WebFeedEditScreen( | ||||
| @@ -129,13 +142,46 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 ], | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorPosts', | ||||
|                 path: '/creators/:name/posts', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   return CreatorPostListScreen(pubName: name); | ||||
|                 }, | ||||
|               ), | ||||
|               // Poll list route | ||||
|               GoRoute( | ||||
|                 name: 'creatorPolls', | ||||
|                 path: '/creators/:name/polls', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   return CreatorPollListScreen(pubName: name); | ||||
|                 }, | ||||
|               ), | ||||
|               // Poll routes | ||||
|               GoRoute( | ||||
|                 name: 'creatorPollNew', | ||||
|                 path: '/creators/:name/polls/new', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   // initialPollId left null for create; initialPublisher prefilled | ||||
|                   return PollEditorScreen(initialPublisher: name); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorPollEdit', | ||||
|                 path: '/creators/:name/polls/:id/edit', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   final id = state.pathParameters['id']!; | ||||
|                   return PollEditorScreen( | ||||
|                     initialPollId: id, | ||||
|                     initialPublisher: name, | ||||
|                   ); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickers', | ||||
|                 path: '/creators/:name/stickers', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -143,6 +189,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickerPackNew', | ||||
|                 path: '/creators/:name/stickers/new', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -150,6 +197,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickerPackEdit', | ||||
|                 path: '/creators/:name/stickers/:packId/edit', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -158,6 +206,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickerPackDetail', | ||||
|                 path: '/creators/:name/stickers/:packId', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -166,6 +215,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickerNew', | ||||
|                 path: '/creators/:name/stickers/:packId/new', | ||||
|                 builder: (context, state) { | ||||
|                   final packId = state.pathParameters['packId']!; | ||||
| @@ -173,6 +223,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorStickerEdit', | ||||
|                 path: '/creators/:name/stickers/:packId/:id/edit', | ||||
|                 builder: (context, state) { | ||||
|                   final packId = state.pathParameters['packId']!; | ||||
| @@ -181,10 +232,12 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorNew', | ||||
|                 path: '/creators/new', | ||||
|                 builder: (context, state) => const NewPublisherScreen(), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'creatorEdit', | ||||
|                 path: '/creators/:name/edit', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
| @@ -199,10 +252,12 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     DeveloperHubShellScreen(child: child), | ||||
|             routes: [ | ||||
|               GoRoute( | ||||
|                 name: 'developerHub', | ||||
|                 path: '/developers', | ||||
|                 builder: (context, state) => const DeveloperHubScreen(), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'developerApps', | ||||
|                 path: '/developers/:name/apps', | ||||
|                 builder: | ||||
|                     (context, state) => CustomAppsScreen( | ||||
| @@ -210,6 +265,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     ), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'developerAppNew', | ||||
|                 path: '/developers/:name/apps/new', | ||||
|                 builder: | ||||
|                     (context, state) => NewCustomAppScreen( | ||||
| @@ -217,6 +273,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     ), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'developerAppEdit', | ||||
|                 path: '/developers/:name/apps/:id', | ||||
|                 builder: | ||||
|                     (context, state) => EditAppScreen( | ||||
| @@ -229,10 +286,12 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|  | ||||
|           // Web articles | ||||
|           GoRoute( | ||||
|             name: 'articles', | ||||
|             path: '/feeds/articles', | ||||
|             builder: (context, state) => const ArticlesScreen(), | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'articleDetail', | ||||
|             path: '/feeds/articles/:id', | ||||
|             builder: (context, state) { | ||||
|               final id = state.pathParameters['id']!; | ||||
| @@ -242,37 +301,28 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|  | ||||
|           // Auth routes | ||||
|           GoRoute( | ||||
|             name: 'login', | ||||
|             path: '/auth/login', | ||||
|             builder: (context, state) => const LoginScreen(), | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'createAccount', | ||||
|             path: '/auth/create-account', | ||||
|             builder: (context, state) => const CreateAccountScreen(), | ||||
|           ), | ||||
|  | ||||
|           // Other routes | ||||
|           GoRoute( | ||||
|             name: 'settings', | ||||
|             path: '/settings', | ||||
|             builder: (context, state) => const SettingsScreen(), | ||||
|           ), | ||||
|           GoRoute( | ||||
|             name: 'about', | ||||
|             path: '/about', | ||||
|             builder: (context, state) => const AboutScreen(), | ||||
|           ), | ||||
|  | ||||
|           GoRoute( | ||||
|             path: '/safety/reports/me', | ||||
|             builder: (context, state) => const AbuseReportListScreen(), | ||||
|           ), | ||||
|  | ||||
|           GoRoute( | ||||
|             path: '/safety/reports/me/:id', | ||||
|             builder: (context, state) { | ||||
|               final id = state.pathParameters['id']!; | ||||
|               return AbuseReportDetailScreen(reportId: id); | ||||
|             }, | ||||
|           ), | ||||
|  | ||||
|           // Main tabs with TabsScreen shell | ||||
|           ShellRoute( | ||||
|             navigatorKey: _tabsShellKey, | ||||
| @@ -281,37 +331,55 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|             }, | ||||
|             routes: [ | ||||
|               // Explore tab | ||||
|               ShellRoute( | ||||
|                 builder: | ||||
|                     (context, state, child) => ExploreShellScreen(child: child), | ||||
|                 routes: [ | ||||
|                   GoRoute( | ||||
|                     path: '/', | ||||
|                     builder: (context, state) => const ExploreScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     path: '/posts/search', | ||||
|                     builder: (context, state) => const PostSearchScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     path: '/posts/:id', | ||||
|                     builder: (context, state) { | ||||
|                       final id = state.pathParameters['id']!; | ||||
|                       return PostDetailScreen(id: id); | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     path: '/publishers/:name', | ||||
|                     builder: (context, state) { | ||||
|                       final name = state.pathParameters['name']!; | ||||
|                       return PublisherProfileScreen(name: name); | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     path: '/discovery/realms', | ||||
|                     builder: (context, state) => const DiscoveryRealmsScreen(), | ||||
|                   ), | ||||
|                 ], | ||||
|               GoRoute( | ||||
|                 name: 'explore', | ||||
|                 path: '/', | ||||
|                 builder: (context, state) => const ExploreScreen(), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'postSearch', | ||||
|                 path: '/posts/search', | ||||
|                 builder: (context, state) => const PostSearchScreen(), | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'postDetail', | ||||
|                 path: '/posts/:id', | ||||
|                 builder: (context, state) { | ||||
|                   final id = state.pathParameters['id']!; | ||||
|                   return PostDetailScreen(id: id); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'postCategoryDetail', | ||||
|                 path: '/posts/categories/:slug', | ||||
|                 builder: (context, state) { | ||||
|                   final slug = state.pathParameters['slug']!; | ||||
|                   return PostCategoryDetailScreen(slug: slug, isCategory: true); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'postTagDetail', | ||||
|                 path: '/posts/tags/:slug', | ||||
|                 builder: (context, state) { | ||||
|                   final slug = state.pathParameters['slug']!; | ||||
|                   return PostCategoryDetailScreen( | ||||
|                     slug: slug, | ||||
|                     isCategory: false, | ||||
|                   ); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'publisherProfile', | ||||
|                 path: '/publishers/:name', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   return PublisherProfileScreen(name: name); | ||||
|                 }, | ||||
|               ), | ||||
|               GoRoute( | ||||
|                 name: 'discoveryRealms', | ||||
|                 path: '/discovery/realms', | ||||
|                 builder: (context, state) => const DiscoveryRealmsScreen(), | ||||
|               ), | ||||
|  | ||||
|               // Chat tab | ||||
| @@ -320,14 +388,17 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     (context, state, child) => ChatShellScreen(child: child), | ||||
|                 routes: [ | ||||
|                   GoRoute( | ||||
|                     name: 'chatList', | ||||
|                     path: '/chat', | ||||
|                     builder: (context, state) => const ChatListScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'chatNew', | ||||
|                     path: '/chat/new', | ||||
|                     builder: (context, state) => const NewChatScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'chatRoom', | ||||
|                     path: '/chat/:id', | ||||
|                     builder: (context, state) { | ||||
|                       final id = state.pathParameters['id']!; | ||||
| @@ -335,6 +406,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'chatEdit', | ||||
|                     path: '/chat/:id/edit', | ||||
|                     builder: (context, state) { | ||||
|                       final id = state.pathParameters['id']!; | ||||
| @@ -342,6 +414,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'chatDetail', | ||||
|                     path: '/chat/:id/detail', | ||||
|                     builder: (context, state) { | ||||
|                       final id = state.pathParameters['id']!; | ||||
| @@ -353,14 +426,17 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|  | ||||
|               // Realms tab | ||||
|               GoRoute( | ||||
|                 name: 'realmList', | ||||
|                 path: '/realms', | ||||
|                 builder: (context, state) => const RealmListScreen(), | ||||
|                 routes: [ | ||||
|                   GoRoute( | ||||
|                     name: 'realmNew', | ||||
|                     path: 'new', | ||||
|                     builder: (context, state) => const NewRealmScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'realmDetail', | ||||
|                     path: ':slug', | ||||
|                     builder: (context, state) { | ||||
|                       final slug = state.pathParameters['slug']!; | ||||
| @@ -368,6 +444,7 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     }, | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'realmEdit', | ||||
|                     path: ':slug/edit', | ||||
|                     builder: (context, state) { | ||||
|                       final slug = state.pathParameters['slug']!; | ||||
| @@ -383,42 +460,81 @@ final routerProvider = Provider<GoRouter>((ref) { | ||||
|                     (context, state, child) => AccountShellScreen(child: child), | ||||
|                 routes: [ | ||||
|                   GoRoute( | ||||
|                     name: 'account', | ||||
|                     path: '/account', | ||||
|                     builder: (context, state) => const AccountScreen(), | ||||
|                   ), | ||||
|                   // Sticker marketplace (user-facing, no publisher) | ||||
|                   GoRoute( | ||||
|                     name: 'stickerMarketplace', | ||||
|                     path: '/stickers', | ||||
|                     builder: | ||||
|                         (context, state) => const MarketplaceStickersScreen(), | ||||
|                     routes: [ | ||||
|                       GoRoute( | ||||
|                         name: 'stickerPackDetail', | ||||
|                         path: ':packId', | ||||
|                         builder: (context, state) { | ||||
|                           final packId = state.pathParameters['packId']!; | ||||
|                           return MarketplaceStickerPackDetailScreen(id: packId); | ||||
|                         }, | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'notifications', | ||||
|                     path: '/account/notifications', | ||||
|                     builder: (context, state) => const NotificationScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'wallet', | ||||
|                     path: '/account/wallet', | ||||
|                     builder: (context, state) => const WalletScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     name: 'relationships', | ||||
|                     path: '/account/relationships', | ||||
|                     builder: (context, state) => const RelationshipScreen(), | ||||
|                   ), | ||||
|                   GoRoute( | ||||
|                     path: '/account/:name', | ||||
|                     builder: (context, state) { | ||||
|                       final name = state.pathParameters['name']!; | ||||
|                       return AccountProfileScreen(name: name); | ||||
|                     }, | ||||
|                   ), | ||||
|                   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( | ||||
|                     path: '/account/settings', | ||||
|                     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: 'reportDetail', | ||||
|                     path: '/safety/reports/me/:id', | ||||
|                     builder: (context, state) { | ||||
|                       final id = state.pathParameters['id']!; | ||||
|                       return AbuseReportDetailScreen(reportId: id); | ||||
|                     }, | ||||
|                   ), | ||||
|                 ], | ||||
|               ), | ||||
|  | ||||
|               GoRoute( | ||||
|                 name: 'accountProfile', | ||||
|                 path: '/account/:name', | ||||
|                 builder: (context, state) { | ||||
|                   final name = state.pathParameters['name']!; | ||||
|                   return AccountProfileScreen(name: name); | ||||
|                 }, | ||||
|               ), | ||||
|             ], | ||||
|           ), | ||||
|         ], | ||||
| @@ -441,6 +557,10 @@ class AppRouter { | ||||
|     context.push(path); | ||||
|   } | ||||
|  | ||||
|   static void pushNamed(BuildContext context, String name) { | ||||
|     context.pushNamed(name); | ||||
|   } | ||||
|  | ||||
|   static void pop(BuildContext context) { | ||||
|     context.pop(); | ||||
|   } | ||||
|   | ||||
| @@ -1,18 +1,21 @@ | ||||
| import 'dart:io'; | ||||
|  | ||||
| import 'package:device_info_plus/device_info_plus.dart'; | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:gap/gap.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/widgets/alert.dart'; | ||||
| import 'package:island/widgets/app_scaffold.dart'; | ||||
| import 'package:material_symbols_icons/symbols.dart'; | ||||
| import 'package:package_info_plus/package_info_plus.dart'; | ||||
| import 'package:styled_widget/styled_widget.dart'; | ||||
| import 'package:island/services/update_service.dart'; | ||||
| import 'package:island/widgets/content/sheet.dart'; | ||||
| import 'package:url_launcher/url_launcher.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| class AboutScreen extends ConsumerStatefulWidget { | ||||
|   const AboutScreen({super.key}); | ||||
| @@ -92,208 +95,250 @@ class _AboutScreenState extends ConsumerState<AboutScreen> { | ||||
|     final theme = Theme.of(context); | ||||
|  | ||||
|     return AppScaffold( | ||||
|       isNoBackground: false, | ||||
|       appBar: AppBar(title: Text('about'.tr()), elevation: 0), | ||||
|       body: | ||||
|           _isLoading | ||||
|               ? const Center(child: CircularProgressIndicator()) | ||||
|               : _errorMessage != null | ||||
|               ? Center(child: Text(_errorMessage!)) | ||||
|               : SingleChildScrollView( | ||||
|                 child: Column( | ||||
|                   crossAxisAlignment: CrossAxisAlignment.center, | ||||
|                   children: [ | ||||
|                     const SizedBox(height: 24), | ||||
|                     // App Icon and Name | ||||
|                     CircleAvatar( | ||||
|                       radius: 50, | ||||
|                       backgroundColor: theme.colorScheme.primary.withOpacity( | ||||
|                         0.1, | ||||
|                       ), | ||||
|                       child: Image.asset( | ||||
|                         'assets/icons/icon.png', | ||||
|                         width: 56, | ||||
|                         height: 56, | ||||
|                       ), | ||||
|                     ), | ||||
|                     const SizedBox(height: 16), | ||||
|                     Text( | ||||
|                       _packageInfo.appName, | ||||
|                       style: theme.textTheme.headlineSmall?.copyWith( | ||||
|                         fontWeight: FontWeight.bold, | ||||
|                       ), | ||||
|                     ), | ||||
|                     Text( | ||||
|                       'aboutScreenVersionInfo'.tr( | ||||
|                         args: [_packageInfo.version, _packageInfo.buildNumber], | ||||
|                       ), | ||||
|                       style: theme.textTheme.bodyMedium?.copyWith( | ||||
|                         color: theme.textTheme.bodySmall?.color, | ||||
|                       ), | ||||
|                     ), | ||||
|                     const SizedBox(height: 32), | ||||
|  | ||||
|                     // App Info Card | ||||
|                     _buildSection( | ||||
|                       context, | ||||
|                       title: 'aboutScreenAppInfoSectionTitle'.tr(), | ||||
|               : Center( | ||||
|                 child: ConstrainedBox( | ||||
|                   constraints: const BoxConstraints(maxWidth: 540), | ||||
|                   child: SingleChildScrollView( | ||||
|                     child: Column( | ||||
|                       crossAxisAlignment: CrossAxisAlignment.center, | ||||
|                       children: [ | ||||
|                         _buildInfoItem( | ||||
|                           context, | ||||
|                           icon: Symbols.info, | ||||
|                           label: 'aboutScreenPackageNameLabel'.tr(), | ||||
|                           value: _packageInfo.packageName, | ||||
|                         ), | ||||
|                         _buildInfoItem( | ||||
|                           context, | ||||
|                           icon: Symbols.update, | ||||
|                           label: 'aboutScreenVersionLabel'.tr(), | ||||
|                           value: _packageInfo.version, | ||||
|                         ), | ||||
|                         _buildInfoItem( | ||||
|                           context, | ||||
|                           icon: Symbols.build, | ||||
|                           label: 'aboutScreenBuildNumberLabel'.tr(), | ||||
|                           value: _packageInfo.buildNumber, | ||||
|                         ), | ||||
|                       ], | ||||
|                     ), | ||||
|  | ||||
|                     if (_deviceInfo != null) const SizedBox(height: 16), | ||||
|  | ||||
|                     if (_deviceInfo != null) | ||||
|                       _buildSection( | ||||
|                         context, | ||||
|                         title: 'Device Information', | ||||
|                         children: [ | ||||
|                           _buildInfoItem( | ||||
|                             context, | ||||
|                             icon: Symbols.label, | ||||
|                             label: 'Device Name', | ||||
|                             value: _deviceInfo?.data['name'], | ||||
|                         const SizedBox(height: 24), | ||||
|                         // App Icon and Name | ||||
|                         CircleAvatar( | ||||
|                           radius: 50, | ||||
|                           backgroundColor: theme.colorScheme.primary | ||||
|                               .withOpacity(0.1), | ||||
|                           child: Image.asset( | ||||
|                             'assets/icons/icon.png', | ||||
|                             width: 56, | ||||
|                             height: 56, | ||||
|                           ), | ||||
|                           _buildInfoItem( | ||||
|                             context, | ||||
|                             icon: Symbols.fingerprint, | ||||
|                             label: 'Device Identifier', | ||||
|                             value: _deviceUdid ?? 'N/A', | ||||
|                             copyable: true, | ||||
|                         ), | ||||
|                         const SizedBox(height: 16), | ||||
|                         Text( | ||||
|                           _packageInfo.appName, | ||||
|                           style: theme.textTheme.headlineSmall?.copyWith( | ||||
|                             fontWeight: FontWeight.bold, | ||||
|                           ), | ||||
|                           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); | ||||
|                               } | ||||
|                             }, | ||||
|                         ), | ||||
|                         Text( | ||||
|                           'aboutScreenVersionInfo'.tr( | ||||
|                             args: [ | ||||
|                               _packageInfo.version, | ||||
|                               _packageInfo.buildNumber, | ||||
|                             ], | ||||
|                           ), | ||||
|                         ], | ||||
|                       ), | ||||
|  | ||||
|                     const SizedBox(height: 16), | ||||
|  | ||||
|                     // Links Card | ||||
|                     _buildSection( | ||||
|                       context, | ||||
|                       title: 'aboutScreenLinksSectionTitle'.tr(), | ||||
|                       children: [ | ||||
|                         _buildListTile( | ||||
|                           context, | ||||
|                           icon: Symbols.privacy_tip, | ||||
|                           title: 'aboutScreenPrivacyPolicyTitle'.tr(), | ||||
|                           onTap: | ||||
|                               () => _launchURL( | ||||
|                                 'https://solsynth.dev/terms/privacy-policy', | ||||
|                               ), | ||||
|                         ), | ||||
|                         _buildListTile( | ||||
|                           context, | ||||
|                           icon: Symbols.description, | ||||
|                           title: 'aboutScreenTermsOfServiceTitle'.tr(), | ||||
|                           onTap: | ||||
|                               () => _launchURL( | ||||
|                                 'https://solsynth.dev/terms/basic-law', | ||||
|                               ), | ||||
|                         ), | ||||
|                         _buildListTile( | ||||
|                           context, | ||||
|                           icon: Symbols.code, | ||||
|                           title: 'aboutScreenOpenSourceLicensesTitle'.tr(), | ||||
|                           onTap: () { | ||||
|                             showLicensePage( | ||||
|                               context: context, | ||||
|                               applicationName: _packageInfo.appName, | ||||
|                               applicationVersion: | ||||
|                                   'Version ${_packageInfo.version}', | ||||
|                             ); | ||||
|                           }, | ||||
|                         ), | ||||
|                       ], | ||||
|                     ), | ||||
|  | ||||
|                     const SizedBox(height: 16), | ||||
|  | ||||
|                     // Developer Info | ||||
|                     _buildSection( | ||||
|                       context, | ||||
|                       title: 'aboutScreenDeveloperSectionTitle'.tr(), | ||||
|                       children: [ | ||||
|                         _buildListTile( | ||||
|                           context, | ||||
|                           icon: Symbols.email, | ||||
|                           title: 'aboutScreenContactUsTitle'.tr(), | ||||
|                           subtitle: 'lily@solsynth.dev', | ||||
|                           onTap: () => _launchURL('mailto:lily@solsynth.dev'), | ||||
|                         ), | ||||
|                         _buildListTile( | ||||
|                           context, | ||||
|                           icon: Symbols.copyright, | ||||
|                           title: 'aboutScreenLicenseTitle'.tr(), | ||||
|                           subtitle: 'aboutScreenLicenseContent'.tr( | ||||
|                             args: [DateTime.now().year.toString()], | ||||
|                           style: theme.textTheme.bodyMedium?.copyWith( | ||||
|                             color: theme.textTheme.bodySmall?.color, | ||||
|                           ), | ||||
|                           onTap: | ||||
|                               () => _launchURL( | ||||
|                                 'https://github.com/Solsynth/Solian/blob/v3/LICENSE.txt', | ||||
|                               ), | ||||
|                         ), | ||||
|                       ], | ||||
|                     ), | ||||
|                         const SizedBox(height: 32), | ||||
|  | ||||
|                     const SizedBox(height: 32), | ||||
|  | ||||
|                     // Copyright | ||||
|                     Padding( | ||||
|                       padding: const EdgeInsets.all(16.0), | ||||
|                       child: Column( | ||||
|                         children: [ | ||||
|                           Text( | ||||
|                             'aboutScreenCopyright'.tr( | ||||
|                               args: [DateTime.now().year.toString()], | ||||
|                         // App Info Card | ||||
|                         _buildSection( | ||||
|                           context, | ||||
|                           title: 'aboutScreenAppInfoSectionTitle'.tr(), | ||||
|                           children: [ | ||||
|                             _buildInfoItem( | ||||
|                               context, | ||||
|                               icon: Symbols.info, | ||||
|                               label: 'aboutScreenPackageNameLabel'.tr(), | ||||
|                               value: _packageInfo.packageName, | ||||
|                             ), | ||||
|                             style: theme.textTheme.bodySmall, | ||||
|                             textAlign: TextAlign.center, | ||||
|                           ), | ||||
|                           const Gap(1), | ||||
|                           Text( | ||||
|                             'aboutScreenMadeWith'.tr(), | ||||
|                             textAlign: TextAlign.center, | ||||
|                           ).fontSize(10).opacity(0.8), | ||||
|                         ], | ||||
|                       ), | ||||
|                     ), | ||||
|                             _buildInfoItem( | ||||
|                               context, | ||||
|                               icon: Symbols.update, | ||||
|                               label: 'aboutScreenVersionLabel'.tr(), | ||||
|                               value: _packageInfo.version, | ||||
|                             ), | ||||
|                             _buildInfoItem( | ||||
|                               context, | ||||
|                               icon: Symbols.build, | ||||
|                               label: 'aboutScreenBuildNumberLabel'.tr(), | ||||
|                               value: _packageInfo.buildNumber, | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|  | ||||
|                     Gap(MediaQuery.of(context).padding.bottom + 16), | ||||
|                   ], | ||||
|                         if (_deviceInfo != null) const SizedBox(height: 16), | ||||
|  | ||||
|                         if (_deviceInfo != null) | ||||
|                           _buildSection( | ||||
|                             context, | ||||
|                             title: 'Device Information', | ||||
|                             children: [ | ||||
|                               _buildInfoItem( | ||||
|                                 context, | ||||
|                                 icon: Symbols.label, | ||||
|                                 label: 'aboutDeviceName'.tr(), | ||||
|                                 value: _deviceInfo?.data['name'], | ||||
|                               ), | ||||
|                               _buildInfoItem( | ||||
|                                 context, | ||||
|                                 icon: Symbols.fingerprint, | ||||
|                                 label: 'aboutDeviceIdentifier'.tr(), | ||||
|                                 value: _deviceUdid ?? 'N/A', | ||||
|                                 copyable: true, | ||||
|                               ), | ||||
|                             ], | ||||
|                           ), | ||||
|  | ||||
|                         const SizedBox(height: 16), | ||||
|  | ||||
|                         // Links Card | ||||
|                         _buildSection( | ||||
|                           context, | ||||
|                           title: 'aboutScreenLinksSectionTitle'.tr(), | ||||
|                           children: [ | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.system_update, | ||||
|                               title: 'Check for updates', | ||||
|                               onTap: () async { | ||||
|                                 // Fetch latest release and show the unified sheet | ||||
|                                 final svc = UpdateService(); | ||||
|                                 // Reuse service fetch + compare to decide content | ||||
|                                 final release = await svc.fetchLatestRelease(); | ||||
|                                 if (release != null) { | ||||
|                                   await svc.showUpdateSheet(context, release); | ||||
|                                 } else { | ||||
|                                   // Fallback: show a simple sheet indicating no info | ||||
|                                   // Use your SheetScaffold for consistent styling | ||||
|                                   // Show a minimal message | ||||
|                                   // ignore: use_build_context_synchronously | ||||
|                                   showModalBottomSheet( | ||||
|                                     context: context, | ||||
|                                     isScrollControlled: true, | ||||
|                                     useSafeArea: true, | ||||
|                                     showDragHandle: true, | ||||
|                                     backgroundColor: | ||||
|                                         Theme.of(context).colorScheme.surface, | ||||
|                                     builder: | ||||
|                                         (_) => const SheetScaffold( | ||||
|                                           titleText: 'Update', | ||||
|                                           child: Center( | ||||
|                                             child: Padding( | ||||
|                                               padding: EdgeInsets.all(24), | ||||
|                                               child: Text( | ||||
|                                                 'Unable to fetch release info at this time.', | ||||
|                                               ), | ||||
|                                             ), | ||||
|                                           ), | ||||
|                                         ), | ||||
|                                   ); | ||||
|                                 } | ||||
|                               }, | ||||
|                             ), | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.privacy_tip, | ||||
|                               title: 'aboutScreenPrivacyPolicyTitle'.tr(), | ||||
|                               onTap: | ||||
|                                   () => _launchURL( | ||||
|                                     'https://solsynth.dev/terms/privacy-policy', | ||||
|                                   ), | ||||
|                             ), | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.description, | ||||
|                               title: 'aboutScreenTermsOfServiceTitle'.tr(), | ||||
|                               onTap: | ||||
|                                   () => _launchURL( | ||||
|                                     'https://solsynth.dev/terms/user-agreement', | ||||
|                                   ), | ||||
|                             ), | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.code, | ||||
|                               title: 'aboutScreenOpenSourceLicensesTitle'.tr(), | ||||
|                               onTap: () { | ||||
|                                 showLicensePage( | ||||
|                                   context: context, | ||||
|                                   applicationName: _packageInfo.appName, | ||||
|                                   applicationVersion: | ||||
|                                       'Version ${_packageInfo.version}', | ||||
|                                 ); | ||||
|                               }, | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|  | ||||
|                         const SizedBox(height: 16), | ||||
|  | ||||
|                         // Developer Info | ||||
|                         _buildSection( | ||||
|                           context, | ||||
|                           title: 'aboutScreenDeveloperSectionTitle'.tr(), | ||||
|                           children: [ | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.email, | ||||
|                               title: 'aboutScreenContactUsTitle'.tr(), | ||||
|                               subtitle: 'lily@solsynth.dev', | ||||
|                               onTap: | ||||
|                                   () => _launchURL('mailto:lily@solsynth.dev'), | ||||
|                             ), | ||||
|                             _buildListTile( | ||||
|                               context, | ||||
|                               icon: Symbols.copyright, | ||||
|                               title: 'aboutScreenLicenseTitle'.tr(), | ||||
|                               subtitle: 'aboutScreenLicenseContent'.tr( | ||||
|                                 args: [DateTime.now().year.toString()], | ||||
|                               ), | ||||
|                               onTap: | ||||
|                                   () => _launchURL( | ||||
|                                     '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', | ||||
|                                   ); | ||||
|                                 }, | ||||
|                               ), | ||||
|                           ], | ||||
|                         ), | ||||
|  | ||||
|                         const SizedBox(height: 32), | ||||
|  | ||||
|                         // Copyright | ||||
|                         Padding( | ||||
|                           padding: const EdgeInsets.all(16.0), | ||||
|                           child: Column( | ||||
|                             children: [ | ||||
|                               Text( | ||||
|                                 'aboutScreenCopyright'.tr( | ||||
|                                   args: [DateTime.now().year.toString()], | ||||
|                                 ), | ||||
|                                 style: theme.textTheme.bodySmall, | ||||
|                                 textAlign: TextAlign.center, | ||||
|                               ), | ||||
|                               const Gap(1), | ||||
|                               Text( | ||||
|                                 'aboutScreenMadeWith'.tr(), | ||||
|                                 textAlign: TextAlign.center, | ||||
|                               ).fontSize(10).opacity(0.8), | ||||
|                             ], | ||||
|                           ), | ||||
|                         ), | ||||
|  | ||||
|                         Gap(MediaQuery.of(context).padding.bottom + 16), | ||||
|                       ], | ||||
|                     ), | ||||
|                   ), | ||||
|                 ), | ||||
|               ), | ||||
|     ); | ||||
|   | ||||
| @@ -1,12 +1,8 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:go_router/go_router.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:gap/gap.dart'; | ||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||
| import 'package:island/pods/message.dart'; | ||||
| import 'package:island/pods/network.dart'; | ||||
| import 'package:island/pods/userinfo.dart'; | ||||
| import 'package:island/screens/notification.dart'; | ||||
| import 'package:island/services/responsive.dart'; | ||||
| @@ -15,6 +11,7 @@ import 'package:island/widgets/account/status.dart'; | ||||
| import 'package:island/widgets/account/leveling_progress.dart'; | ||||
| import 'package:island/widgets/app_scaffold.dart'; | ||||
| import 'package:island/widgets/content/cloud_files.dart'; | ||||
| import 'package:island/widgets/debug_sheet.dart'; | ||||
| import 'package:material_symbols_icons/symbols.dart'; | ||||
| import 'package:styled_widget/styled_widget.dart'; | ||||
|  | ||||
| @@ -64,7 +61,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|     } | ||||
|  | ||||
|     return AppScaffold( | ||||
|       noBackground: isWide, | ||||
|       isNoBackground: isWide, | ||||
|       appBar: AppBar(backgroundColor: Colors.transparent, toolbarHeight: 0), | ||||
|       body: SingleChildScrollView( | ||||
|         padding: getTabbedPadding(context), | ||||
| @@ -98,7 +95,10 @@ class AccountScreen extends HookConsumerWidget { | ||||
|                           radius: 24, | ||||
|                         ), | ||||
|                         onTap: () { | ||||
|                           context.push('/account/${user.value!.name}'); | ||||
|                           context.pushNamed( | ||||
|                             'accountProfile', | ||||
|                             pathParameters: {'name': user.value!.name}, | ||||
|                           ); | ||||
|                         }, | ||||
|                       ), | ||||
|                       Expanded( | ||||
| @@ -143,7 +143,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|                 progress: user.value!.profile.levelingProgress, | ||||
|               ), | ||||
|               onTap: () { | ||||
|                 context.push('/account/me/leveling'); | ||||
|                 context.pushNamed('leveling'); | ||||
|               }, | ||||
|             ).padding(horizontal: 12), | ||||
|             Row( | ||||
| @@ -161,7 +161,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|                         ], | ||||
|                       ).padding(horizontal: 16, vertical: 12), | ||||
|                       onTap: () { | ||||
|                         context.push('/creators'); | ||||
|                         context.pushNamed('creatorHub'); | ||||
|                       }, | ||||
|                     ), | ||||
|                   ).height(140), | ||||
| @@ -179,14 +179,13 @@ class AccountScreen extends HookConsumerWidget { | ||||
|                         ], | ||||
|                       ).padding(horizontal: 16, vertical: 12), | ||||
|                       onTap: () { | ||||
|                         context.push('/developers'); | ||||
|                         context.pushNamed('developerHub'); | ||||
|                       }, | ||||
|                     ), | ||||
|                   ).height(140), | ||||
|                 ), | ||||
|               ], | ||||
|             ).padding(horizontal: 8), | ||||
|             const Gap(8), | ||||
|             ListTile( | ||||
|               minTileHeight: 48, | ||||
|               leading: const Icon(Symbols.notifications), | ||||
| @@ -202,7 +201,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|                 ], | ||||
|               ), | ||||
|               onTap: () { | ||||
|                 context.push('/account/notifications'); | ||||
|                 context.pushNamed('notifications'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
| @@ -212,7 +211,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('wallet').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/account/wallet'); | ||||
|                 context.pushNamed('wallet'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
| @@ -222,16 +221,26 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('relationships').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/account/relationships'); | ||||
|                 context.pushNamed('relationships'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
|               minTileHeight: 48, | ||||
|               leading: const Icon(Symbols.emoji_emotions), | ||||
|               trailing: const Icon(Symbols.chevron_right), | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('stickers').tr(), | ||||
|               onTap: () { | ||||
|                 context.pushNamed('stickerMarketplace'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
|               minTileHeight: 48, | ||||
|               title: Text('abuseReports').tr(), | ||||
|               contentPadding: const EdgeInsets.only(left: 24, right: 17), | ||||
|               contentPadding: const EdgeInsets.symmetric(horizontal: 24), | ||||
|               leading: const Icon(Symbols.gavel), | ||||
|               trailing: const Icon(Symbols.chevron_right), | ||||
|               onTap: () => context.push('/safety/reports/me'), | ||||
|               onTap: () => context.pushNamed('reportList'), | ||||
|             ), | ||||
|             const Divider(height: 1).padding(vertical: 8), | ||||
|             ListTile( | ||||
| @@ -241,7 +250,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('appSettings').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/settings'); | ||||
|                 context.pushNamed('settings'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
| @@ -251,7 +260,7 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('updateYourProfile').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/account/me/update'); | ||||
|                 context.pushNamed('profileUpdate'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
| @@ -261,33 +270,9 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('accountSettings').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/account/me/settings'); | ||||
|                 context.pushNamed('accountSettings'); | ||||
|               }, | ||||
|             ), | ||||
|             if (kDebugMode) const Divider(height: 1).padding(vertical: 8), | ||||
|             if (kDebugMode) | ||||
|               ListTile( | ||||
|                 minTileHeight: 48, | ||||
|                 leading: const Icon(Symbols.copy_all), | ||||
|                 trailing: const Icon(Symbols.chevron_right), | ||||
|                 contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|                 title: Text('Copy access token'), | ||||
|                 onTap: () async { | ||||
|                   final tk = ref.watch(tokenProvider); | ||||
|                   Clipboard.setData(ClipboardData(text: tk!.token)); | ||||
|                 }, | ||||
|               ), | ||||
|             if (kDebugMode) | ||||
|               ListTile( | ||||
|                 minTileHeight: 48, | ||||
|                 leading: const Icon(Symbols.delete), | ||||
|                 trailing: const Icon(Symbols.chevron_right), | ||||
|                 contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|                 title: Text('Reset database'), | ||||
|                 onTap: () async { | ||||
|                   resetDatabase(ref); | ||||
|                 }, | ||||
|               ), | ||||
|             const Divider(height: 1).padding(vertical: 8), | ||||
|             ListTile( | ||||
|               minTileHeight: 48, | ||||
| @@ -296,7 +281,20 @@ class AccountScreen extends HookConsumerWidget { | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('about').tr(), | ||||
|               onTap: () { | ||||
|                 context.push('/about'); | ||||
|                 context.pushNamed('about'); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
|               minTileHeight: 48, | ||||
|               leading: const Icon(Symbols.bug_report), | ||||
|               trailing: const Icon(Symbols.chevron_right), | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               title: Text('debugOptions').tr(), | ||||
|               onTap: () { | ||||
|                 showModalBottomSheet( | ||||
|                   context: context, | ||||
|                   builder: (context) => DebugSheet(), | ||||
|                 ); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
| @@ -336,7 +334,7 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | ||||
|                   child: Card( | ||||
|                     child: InkWell( | ||||
|                       onTap: () { | ||||
|                         context.push('/auth/create'); | ||||
|                         context.pushNamed('createAccount'); | ||||
|                       }, | ||||
|                       child: Padding( | ||||
|                         padding: const EdgeInsets.all(16), | ||||
| @@ -358,7 +356,7 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | ||||
|                   child: Card( | ||||
|                     child: InkWell( | ||||
|                       onTap: () { | ||||
|                         context.push('/auth/login'); | ||||
|                         context.pushNamed('login'); | ||||
|                       }, | ||||
|                       child: Padding( | ||||
|                         padding: const EdgeInsets.all(16), | ||||
| @@ -380,13 +378,13 @@ class _UnauthorizedAccountScreen extends StatelessWidget { | ||||
|                   children: [ | ||||
|                     TextButton( | ||||
|                       onPressed: () { | ||||
|                         context.push('/about'); | ||||
|                         context.pushNamed('about'); | ||||
|                       }, | ||||
|                       child: Text('about').tr(), | ||||
|                     ), | ||||
|                     TextButton( | ||||
|                       onPressed: () { | ||||
|                         context.push('/settings'); | ||||
|                         context.pushNamed('settings'); | ||||
|                       }, | ||||
|                       child: Text('appSettings').tr(), | ||||
|                     ), | ||||
|   | ||||
| @@ -46,7 +46,7 @@ class EventCalanderScreen extends HookConsumerWidget { | ||||
|     } | ||||
|  | ||||
|     return AppScaffold( | ||||
|       noBackground: false, | ||||
|       isNoBackground: false, | ||||
|       appBar: AppBar( | ||||
|         leading: const PageBackButton(), | ||||
|         title: Text('eventCalander').tr(), | ||||
|   | ||||
| @@ -27,7 +27,7 @@ part 'leveling.g.dart'; | ||||
| Future<SnWalletSubscription?> accountStellarSubscription(Ref ref) async { | ||||
|   try { | ||||
|     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); | ||||
|   } catch (err) { | ||||
|     if (err is DioException && err.response?.statusCode == 404) return null; | ||||
| @@ -280,7 +280,7 @@ class LevelingScreen extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         await client.post('/subscriptions/${membership.identifier}/cancel'); | ||||
|         await client.post('/id/subscriptions/${membership.identifier}/cancel'); | ||||
|         ref.invalidate(accountStellarSubscriptionProvider); | ||||
|         ref.read(userInfoProvider.notifier).fetchUser(); | ||||
|         if (context.mounted) { | ||||
| @@ -432,7 +432,7 @@ class LevelingScreen extends HookConsumerWidget { | ||||
|         'id': 'solian.stellar.nova', | ||||
|         'name': 'membershipTierNova'.tr(), | ||||
|         'price': 'membershipPriceNova'.tr(), | ||||
|         'color': Colors.indigo, | ||||
|         'color': Color.fromRGBO(57, 197, 187, 1), | ||||
|       }, | ||||
|       { | ||||
|         'id': 'solian.stellar.supernova', | ||||
| @@ -603,7 +603,7 @@ class LevelingScreen extends HookConsumerWidget { | ||||
|     try { | ||||
|       showLoadingModal(context); | ||||
|       final resp = await client.post( | ||||
|         '/subscriptions', | ||||
|         '/id/subscriptions', | ||||
|         data: { | ||||
|           'identifier': tierId, | ||||
|           'payment_method': 'solian.wallet', | ||||
| @@ -615,7 +615,7 @@ class LevelingScreen extends HookConsumerWidget { | ||||
|       final subscription = SnWalletSubscription.fromJson(resp.data); | ||||
|       if (subscription.status == 1) return; | ||||
|       final orderResp = await client.post( | ||||
|         '/subscriptions/${subscription.identifier}/order', | ||||
|         '/id/subscriptions/${subscription.identifier}/order', | ||||
|       ); | ||||
|       final order = SnWalletOrder.fromJson(orderResp.data); | ||||
|  | ||||
| @@ -633,7 +633,7 @@ class LevelingScreen extends HookConsumerWidget { | ||||
|  | ||||
|       if (paidOrder != null) { | ||||
|         await client.post( | ||||
|           '/subscriptions/order/handle', | ||||
|           '/id/subscriptions/order/handle', | ||||
|           data: {'order_id': paidOrder.id}, | ||||
|         ); | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,7 @@ part of 'leveling.dart'; | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$accountStellarSubscriptionHash() => | ||||
|     r'37fb821460e3ac50b5cf777c933b6779f732daee'; | ||||
|     r'80abcdefb3868775fd8fe3c980215713efff5948'; | ||||
|  | ||||
| /// See also [accountStellarSubscription]. | ||||
| @ProviderFor(accountStellarSubscription) | ||||
|   | ||||
| @@ -28,14 +28,14 @@ part 'settings.g.dart'; | ||||
| @riverpod | ||||
| Future<List<SnAuthFactor>> authFactors(Ref ref) async { | ||||
|   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(); | ||||
| } | ||||
|  | ||||
| @riverpod | ||||
| Future<List<SnContactMethod>> contactMethods(Ref ref) async { | ||||
|   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 | ||||
|       .map<SnContactMethod>((e) => SnContactMethod.fromJson(e)) | ||||
|       .toList(); | ||||
| @@ -44,7 +44,7 @@ Future<List<SnContactMethod>> contactMethods(Ref ref) async { | ||||
| @riverpod | ||||
| Future<List<SnAccountConnection>> accountConnections(Ref ref) async { | ||||
|   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 | ||||
|       .map<SnAccountConnection>((e) => SnAccountConnection.fromJson(e)) | ||||
|       .toList(); | ||||
| @@ -68,7 +68,7 @@ class AccountSettingsScreen extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         final client = ref.read(apiClientProvider); | ||||
|         await client.delete('/accounts/me'); | ||||
|         await client.delete('/id/accounts/me'); | ||||
|         if (context.mounted) { | ||||
|           showSnackBar('accountDeletionSent'.tr()); | ||||
|         } | ||||
| @@ -94,7 +94,7 @@ class AccountSettingsScreen extends HookConsumerWidget { | ||||
|         final userInfo = ref.read(userInfoProvider); | ||||
|         final client = ref.read(apiClientProvider); | ||||
|         await client.post( | ||||
|           '/accounts/recovery/password', | ||||
|           '/id/accounts/recovery/password', | ||||
|           data: {'account': userInfo.value!.name, 'captcha_token': captchaTk}, | ||||
|         ); | ||||
|         if (context.mounted) { | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'settings.dart'; | ||||
| // RiverpodGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$authFactorsHash() => r'4bb65bc0c065c4091c209ee81e57ddef41051ae2'; | ||||
| String _$authFactorsHash() => r'24fe2f7b375b019d87fc3b85cbedbe857f399c0f'; | ||||
|  | ||||
| /// See also [authFactors]. | ||||
| @ProviderFor(authFactors) | ||||
| @@ -25,7 +25,7 @@ final authFactorsProvider = | ||||
| @Deprecated('Will be removed in 3.0. Use Ref instead') | ||||
| // ignore: unused_element | ||||
| typedef AuthFactorsRef = AutoDisposeFutureProviderRef<List<SnAuthFactor>>; | ||||
| String _$contactMethodsHash() => r'4d7952fc196dce4dc646314565a49c115fd1d292'; | ||||
| String _$contactMethodsHash() => r'76a1a93f61c51c44b32b4821f5112d58406155f0'; | ||||
|  | ||||
| /// See also [contactMethods]. | ||||
| @ProviderFor(contactMethods) | ||||
| @@ -45,7 +45,7 @@ final contactMethodsProvider = | ||||
| // ignore: unused_element | ||||
| typedef ContactMethodsRef = AutoDisposeFutureProviderRef<List<SnContactMethod>>; | ||||
| String _$accountConnectionsHash() => | ||||
|     r'38a309d596e0ea2539cd92ea86984e1e4fb346e4'; | ||||
|     r'9f69e7f23e3e53c528d38b93d76f0c9efc9a83db'; | ||||
|  | ||||
| /// See also [accountConnections]. | ||||
| @ProviderFor(accountConnections) | ||||
|   | ||||
| @@ -31,7 +31,7 @@ class AuthFactorSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -49,7 +49,7 @@ class AuthFactorSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -106,7 +106,7 @@ class AuthFactorSheet extends HookConsumerWidget { | ||||
|         showLoadingModal(context); | ||||
|         final client = ref.read(apiClientProvider); | ||||
|         await client.post( | ||||
|           '/accounts/me/factors/${factor.id}/enable', | ||||
|           '/id/accounts/me/factors/${factor.id}/enable', | ||||
|           data: jsonEncode(password), | ||||
|         ); | ||||
|         if (context.mounted) Navigator.pop(context, true); | ||||
| @@ -193,7 +193,7 @@ class AuthFactorNewSheet extends HookConsumerWidget { | ||||
|         showLoadingModal(context); | ||||
|         final apiClient = ref.read(apiClientProvider); | ||||
|         final resp = await apiClient.post( | ||||
|           '/accounts/me/factors', | ||||
|           '/id/accounts/me/factors', | ||||
|           data: {'type': factorType.value, 'secret': secretController.text}, | ||||
|         ); | ||||
|         final factor = SnAuthFactor.fromJson(resp.data); | ||||
|   | ||||
| @@ -74,7 +74,7 @@ class AccountConnectionSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -174,7 +174,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget { | ||||
|             if (context.mounted) showLoadingModal(context); | ||||
|  | ||||
|             await client.post( | ||||
|               '/auth/connect/apple/mobile', | ||||
|               '/id/auth/connect/apple/mobile', | ||||
|               data: { | ||||
|                 'identity_token': credential.identityToken!, | ||||
|                 'authorization_code': credential.authorizationCode, | ||||
| @@ -336,7 +336,7 @@ class AccountConnectionsSheet extends HookConsumerWidget { | ||||
|                                 try { | ||||
|                                   final client = ref.read(apiClientProvider); | ||||
|                                   await client.delete( | ||||
|                                     '/accounts/me/connections/${connection.id}', | ||||
|                                     '/id/accounts/me/connections/${connection.id}', | ||||
|                                   ); | ||||
|                                   ref.invalidate(accountConnectionsProvider); | ||||
|                                   return true; | ||||
|   | ||||
| @@ -25,7 +25,7 @@ class ContactMethodSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -38,7 +38,7 @@ class ContactMethodSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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) { | ||||
|           showSnackBar('contactMethodVerificationSent'.tr()); | ||||
|         } | ||||
| @@ -53,7 +53,7 @@ class ContactMethodSheet extends HookConsumerWidget { | ||||
|       try { | ||||
|         showLoadingModal(context); | ||||
|         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); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -160,7 +160,7 @@ class ContactMethodNewSheet extends HookConsumerWidget { | ||||
|         showLoadingModal(context); | ||||
|         final apiClient = ref.read(apiClientProvider); | ||||
|         await apiClient.post( | ||||
|           '/accounts/me/contacts', | ||||
|           '/id/accounts/me/contacts', | ||||
|           data: {'type': contactType.value, 'content': contentController.text}, | ||||
|         ); | ||||
|         if (context.mounted) { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ import 'package:dropdown_button2/dropdown_button2.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_hooks/flutter_hooks.dart'; | ||||
| import 'package:gap/gap.dart'; | ||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||
| import 'package:image_picker/image_picker.dart'; | ||||
| import 'package:island/models/file.dart'; | ||||
| @@ -77,7 +78,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|         } | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         await client.patch( | ||||
|           '/accounts/me/profile', | ||||
|           '/id/accounts/me/profile', | ||||
|           data: {'${position}_id': cloudFile.id}, | ||||
|         ); | ||||
|         final userNotifier = ref.read(userInfoProvider.notifier); | ||||
| @@ -94,6 +95,11 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|     final usernameController = useTextEditingController(text: user.value!.name); | ||||
|     final nicknameController = useTextEditingController(text: user.value!.nick); | ||||
|     final language = useState(user.value!.language); | ||||
|     final links = useState<List<Map<String, String>>>( | ||||
|       user.value!.profile.links.entries | ||||
|           .map((e) => {'key': e.key, 'value': e.value}) | ||||
|           .toList(), | ||||
|     ); | ||||
|  | ||||
|     void updateBasicInfo() async { | ||||
|       if (!formKeyBasicInfo.currentState!.validate()) return; | ||||
| @@ -102,7 +108,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|       try { | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         await client.patch( | ||||
|           '/accounts/me', | ||||
|           '/id/accounts/me', | ||||
|           data: { | ||||
|             'name': usernameController.text, | ||||
|             'nick': nicknameController.text, | ||||
| @@ -154,7 +160,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|       try { | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         await client.patch( | ||||
|           '/accounts/me/profile', | ||||
|           '/id/accounts/me/profile', | ||||
|           data: { | ||||
|             'bio': bioController.text, | ||||
|             'first_name': firstNameController.text, | ||||
| @@ -165,6 +171,7 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|             'location': locationController.text, | ||||
|             'time_zone': timeZoneController.text, | ||||
|             'birthday': birthday.value?.toUtc().toIso8601String(), | ||||
|             'links': {for (var e in links.value) e['key']!: e['value']!}, | ||||
|           }, | ||||
|         ); | ||||
|         final userNotifier = ref.read(userInfoProvider.notifier); | ||||
| @@ -558,6 +565,69 @@ class UpdateProfileScreen extends HookConsumerWidget { | ||||
|                       ), | ||||
|                     ), | ||||
|                   ), | ||||
|                   Text('links').tr().bold().fontSize(18).padding(top: 16), | ||||
|                   Column( | ||||
|                     spacing: 8, | ||||
|                     children: [ | ||||
|                       for (var i = 0; i < links.value.length; i++) | ||||
|                         Row( | ||||
|                           crossAxisAlignment: CrossAxisAlignment.end, | ||||
|                           children: [ | ||||
|                             Expanded( | ||||
|                               child: TextFormField( | ||||
|                                 initialValue: links.value[i]['key'], | ||||
|                                 decoration: InputDecoration( | ||||
|                                   labelText: 'linkKey'.tr(), | ||||
|                                   isDense: true, | ||||
|                                 ), | ||||
|                                 onChanged: (value) { | ||||
|                                   links.value[i]['key'] = value; | ||||
|                                 }, | ||||
|                                 onTapOutside: | ||||
|                                     (_) => | ||||
|                                         FocusManager.instance.primaryFocus | ||||
|                                             ?.unfocus(), | ||||
|                               ), | ||||
|                             ), | ||||
|                             const Gap(8), | ||||
|                             Expanded( | ||||
|                               child: TextFormField( | ||||
|                                 initialValue: links.value[i]['value'], | ||||
|                                 decoration: InputDecoration( | ||||
|                                   labelText: 'linkValue'.tr(), | ||||
|                                   isDense: true, | ||||
|                                 ), | ||||
|                                 onChanged: (value) { | ||||
|                                   links.value[i]['value'] = value; | ||||
|                                 }, | ||||
|                                 onTapOutside: | ||||
|                                     (_) => | ||||
|                                         FocusManager.instance.primaryFocus | ||||
|                                             ?.unfocus(), | ||||
|                               ), | ||||
|                             ), | ||||
|                             IconButton( | ||||
|                               icon: const Icon(Symbols.delete), | ||||
|                               onPressed: () { | ||||
|                                 links.value = List.from(links.value) | ||||
|                                   ..removeAt(i); | ||||
|                               }, | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|                       Align( | ||||
|                         alignment: Alignment.centerRight, | ||||
|                         child: FilledButton.icon( | ||||
|                           onPressed: () { | ||||
|                             links.value = List.from(links.value) | ||||
|                               ..add({'key': '', 'value': ''}); | ||||
|                           }, | ||||
|                           label: Text('addLink').tr(), | ||||
|                           icon: const Icon(Symbols.add), | ||||
|                         ).padding(top: 8), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                   Align( | ||||
|                     alignment: Alignment.centerRight, | ||||
|                     child: TextButton.icon( | ||||
|   | ||||
| @@ -12,6 +12,8 @@ import 'package:island/pods/event_calendar.dart'; | ||||
| import 'package:island/pods/network.dart'; | ||||
| import 'package:island/pods/userinfo.dart'; | ||||
| import 'package:island/services/color.dart'; | ||||
| import 'package:island/services/responsive.dart'; | ||||
| import 'package:island/services/text.dart'; | ||||
| import 'package:island/services/time.dart'; | ||||
| import 'package:island/services/timezone/native.dart'; | ||||
| import 'package:island/widgets/account/account_name.dart'; | ||||
| @@ -22,11 +24,14 @@ import 'package:island/widgets/account/status.dart'; | ||||
| import 'package:island/widgets/alert.dart'; | ||||
| import 'package:island/widgets/app_scaffold.dart'; | ||||
| import 'package:island/widgets/content/cloud_files.dart'; | ||||
| import 'package:island/widgets/content/markdown.dart'; | ||||
| import 'package:island/widgets/safety/abuse_report_helper.dart'; | ||||
| import 'package:material_symbols_icons/symbols.dart'; | ||||
| import 'package:palette_generator/palette_generator.dart'; | ||||
| import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||||
| import 'package:share_plus/share_plus.dart'; | ||||
| import 'package:styled_widget/styled_widget.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| part 'profile.g.dart'; | ||||
|  | ||||
| @@ -39,14 +44,14 @@ Future<SnAccount> account(Ref ref, String uname) async { | ||||
|     } | ||||
|   } | ||||
|   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); | ||||
| } | ||||
|  | ||||
| @riverpod | ||||
| Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async { | ||||
|   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( | ||||
|     resp.data.map((x) => SnAccountBadge.fromJson(x)), | ||||
|   ); | ||||
| @@ -78,7 +83,7 @@ Future<SnChatRoom?> accountDirectChat(Ref ref, String uname) async { | ||||
|   final account = await ref.watch(accountProvider(uname).future); | ||||
|   final apiClient = ref.watch(apiClientProvider); | ||||
|   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); | ||||
|   } catch (err) { | ||||
|     if (err is DioException && err.response?.statusCode == 404) { | ||||
| @@ -95,7 +100,7 @@ Future<SnRelationship?> accountRelationship(Ref ref, String uname) async { | ||||
|   final account = await ref.watch(accountProvider(uname).future); | ||||
|   final apiClient = ref.watch(apiClientProvider); | ||||
|   try { | ||||
|     final resp = await apiClient.get("/relationships/${account.id}"); | ||||
|     final resp = await apiClient.get("/id/relationships/${account.id}"); | ||||
|     return SnRelationship.fromJson(resp.data); | ||||
|   } catch (err) { | ||||
|     if (err is DioException && err.response?.statusCode == 404) { | ||||
| @@ -135,7 +140,7 @@ class AccountProfileScreen extends HookConsumerWidget { | ||||
|       showLoadingModal(context); | ||||
|       try { | ||||
|         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)); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -149,9 +154,9 @@ class AccountProfileScreen extends HookConsumerWidget { | ||||
|       try { | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         if (accountRelationship.value == null) { | ||||
|           await client.post('/relationships/${account.value!.id}/block'); | ||||
|           await client.post('/id/relationships/${account.value!.id}/block'); | ||||
|         } else { | ||||
|           await client.delete('/relationships/${account.value!.id}/block'); | ||||
|           await client.delete('/id/relationships/${account.value!.id}/block'); | ||||
|         } | ||||
|         ref.invalidate(accountRelationshipProvider(name)); | ||||
|       } catch (err) { | ||||
| @@ -164,18 +169,23 @@ class AccountProfileScreen extends HookConsumerWidget { | ||||
|     Future<void> directMessageAction() async { | ||||
|       if (!account.hasValue) return; | ||||
|       if (accountChat.value != null) { | ||||
|         context.push('/chat/${accountChat.value!.id}'); | ||||
|         context.pushNamed( | ||||
|           'chatRoom', | ||||
|           pathParameters: {'id': accountChat.value!.id}, | ||||
|         ); | ||||
|         return; | ||||
|       } | ||||
|       showLoadingModal(context); | ||||
|       try { | ||||
|         final client = ref.watch(apiClientProvider); | ||||
|         final resp = await client.post( | ||||
|           '/chat/direct', | ||||
|           '/sphere/chat/direct', | ||||
|           data: {'related_user_id': account.value!.id}, | ||||
|         ); | ||||
|         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)); | ||||
|       } catch (err) { | ||||
|         showErrorAlert(err); | ||||
| @@ -243,294 +253,437 @@ class AccountProfileScreen extends HookConsumerWidget { | ||||
|  | ||||
|     final user = ref.watch(userInfoProvider); | ||||
|  | ||||
|     Widget accountBasicInfo(SnAccount data) => Padding( | ||||
|       padding: const EdgeInsets.fromLTRB(24, 24, 24, 8), | ||||
|       child: Row( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|           ProfilePictureWidget(file: data.profile.picture, radius: 32), | ||||
|           const Gap(20), | ||||
|           Expanded( | ||||
|             child: Column( | ||||
|               crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|               children: [ | ||||
|                 Row( | ||||
|                   children: [ | ||||
|                     AccountName(account: data, style: TextStyle(fontSize: 20)), | ||||
|                     const Gap(6), | ||||
|                     Flexible( | ||||
|                       child: Text( | ||||
|                         '@${data.name}', | ||||
|                         maxLines: 1, | ||||
|                         overflow: TextOverflow.ellipsis, | ||||
|                       ).fontSize(14).opacity(0.85), | ||||
|                     ), | ||||
|                   ], | ||||
|                 ), | ||||
|                 AccountStatusWidget(uname: name, padding: EdgeInsets.zero), | ||||
|               ], | ||||
|             ), | ||||
|           ), | ||||
|           IconButton( | ||||
|             onPressed: () { | ||||
|               SharePlus.instance.share( | ||||
|                 ShareParams( | ||||
|                   uri: Uri.parse('https://id.solian.app/@${data.name}'), | ||||
|                 ), | ||||
|               ); | ||||
|             }, | ||||
|             icon: const Icon(Symbols.share), | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|  | ||||
|     Widget accountProfileBio(SnAccount data) => Card( | ||||
|       child: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|           Text('bio').tr().bold().fontSize(15).padding(bottom: 8), | ||||
|           if (data.profile.bio.isEmpty) | ||||
|             Text('descriptionNone').tr().italic() | ||||
|           else | ||||
|             MarkdownTextContent( | ||||
|               content: data.profile.bio, | ||||
|               linesMargin: EdgeInsets.zero, | ||||
|             ), | ||||
|         ], | ||||
|       ).padding(horizontal: 24, vertical: 20), | ||||
|     ); | ||||
|  | ||||
|     Widget accountProfileDetail(SnAccount data) => Card( | ||||
|       child: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|         spacing: 24, | ||||
|         children: [ | ||||
|           if (buildSubcolumn(data).isNotEmpty) | ||||
|             Column( | ||||
|               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|               spacing: 2, | ||||
|               children: buildSubcolumn(data), | ||||
|             ), | ||||
|           if (data.profile.timeZone.isNotEmpty) | ||||
|             Column( | ||||
|               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|               children: [ | ||||
|                 Text('timeZone').tr().bold(), | ||||
|                 Row( | ||||
|                   crossAxisAlignment: CrossAxisAlignment.baseline, | ||||
|                   textBaseline: TextBaseline.alphabetic, | ||||
|                   spacing: 6, | ||||
|                   children: [ | ||||
|                     Text(data.profile.timeZone), | ||||
|                     Text( | ||||
|                       getTzInfo( | ||||
|                         data.profile.timeZone, | ||||
|                       ).$2.formatCustomGlobal('HH:mm'), | ||||
|                     ), | ||||
|                     Text( | ||||
|                       getTzInfo(data.profile.timeZone).$1.formatOffsetLocal(), | ||||
|                     ).fontSize(11), | ||||
|                     Text( | ||||
|                       'UTC${getTzInfo(data.profile.timeZone).$1.formatOffset()}', | ||||
|                     ).fontSize(11).opacity(0.75), | ||||
|                   ], | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|         ], | ||||
|       ).padding(horizontal: 24, vertical: 16), | ||||
|     ); | ||||
|  | ||||
|     Widget accountProfileLinks(SnAccount data) => Card( | ||||
|       child: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         children: [ | ||||
|           Text('links').tr().bold().padding(horizontal: 24, top: 12, bottom: 4), | ||||
|           for (final link in data.profile.links.entries) | ||||
|             ListTile( | ||||
|               title: Text(link.key.capitalizeEachWord()), | ||||
|               subtitle: Text(link.value), | ||||
|               contentPadding: EdgeInsets.symmetric(horizontal: 24), | ||||
|               trailing: const Icon(Symbols.chevron_right), | ||||
|               shape: RoundedRectangleBorder( | ||||
|                 borderRadius: const BorderRadius.all(Radius.circular(8)), | ||||
|               ), | ||||
|               onTap: () { | ||||
|                 launchUrlString(link.value); | ||||
|               }, | ||||
|             ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|  | ||||
|     Widget accountAction(SnAccount data) => Card( | ||||
|       child: Column( | ||||
|         children: [ | ||||
|           Row( | ||||
|             spacing: 8, | ||||
|             children: [ | ||||
|               if (accountRelationship.value == null || | ||||
|                   accountRelationship.value!.status > -100) | ||||
|                 Expanded( | ||||
|                   child: FilledButton.icon( | ||||
|                     style: ButtonStyle( | ||||
|                       backgroundColor: WidgetStatePropertyAll( | ||||
|                         accountRelationship.value == null | ||||
|                             ? null | ||||
|                             : Theme.of(context).colorScheme.secondary, | ||||
|                       ), | ||||
|                       foregroundColor: WidgetStatePropertyAll( | ||||
|                         accountRelationship.value == null | ||||
|                             ? null | ||||
|                             : Theme.of(context).colorScheme.onSecondary, | ||||
|                       ), | ||||
|                     ), | ||||
|                     onPressed: relationshipAction, | ||||
|                     label: | ||||
|                         Text( | ||||
|                           accountRelationship.value == null | ||||
|                               ? 'addFriendShort' | ||||
|                               : 'added', | ||||
|                         ).tr(), | ||||
|                     icon: | ||||
|                         accountRelationship.value == null | ||||
|                             ? const Icon(Symbols.person_add) | ||||
|                             : const Icon(Symbols.person_check), | ||||
|                   ), | ||||
|                 ), | ||||
|               if (accountRelationship.value == null || | ||||
|                   accountRelationship.value!.status <= -100) | ||||
|                 Expanded( | ||||
|                   child: FilledButton.icon( | ||||
|                     style: ButtonStyle( | ||||
|                       backgroundColor: WidgetStatePropertyAll( | ||||
|                         accountRelationship.value == null | ||||
|                             ? null | ||||
|                             : Theme.of(context).colorScheme.secondary, | ||||
|                       ), | ||||
|                       foregroundColor: WidgetStatePropertyAll( | ||||
|                         accountRelationship.value == null | ||||
|                             ? null | ||||
|                             : Theme.of(context).colorScheme.onSecondary, | ||||
|                       ), | ||||
|                     ), | ||||
|                     onPressed: blockAction, | ||||
|                     label: | ||||
|                         Text( | ||||
|                           accountRelationship.value == null | ||||
|                               ? 'blockUser' | ||||
|                               : 'unblockUser', | ||||
|                         ).tr(), | ||||
|                     icon: | ||||
|                         accountRelationship.value == null | ||||
|                             ? const Icon(Symbols.block) | ||||
|                             : const Icon(Symbols.person_cancel), | ||||
|                   ), | ||||
|                 ), | ||||
|             ], | ||||
|           ), | ||||
|           Row( | ||||
|             spacing: 8, | ||||
|             children: [ | ||||
|               Expanded( | ||||
|                 child: FilledButton.icon( | ||||
|                   onPressed: directMessageAction, | ||||
|                   icon: const Icon(Symbols.message), | ||||
|                   label: | ||||
|                       Text( | ||||
|                         accountChat.value == null | ||||
|                             ? 'createDirectMessage' | ||||
|                             : 'gotoDirectMessage', | ||||
|                         maxLines: 1, | ||||
|                       ).tr(), | ||||
|                 ), | ||||
|               ), | ||||
|               IconButton.filled( | ||||
|                 onPressed: () { | ||||
|                   showAbuseReportSheet( | ||||
|                     context, | ||||
|                     resourceIdentifier: 'account/${data.id}', | ||||
|                   ); | ||||
|                 }, | ||||
|                 icon: Icon( | ||||
|                   Symbols.flag, | ||||
|                   color: Theme.of(context).colorScheme.onError, | ||||
|                 ), | ||||
|                 style: ButtonStyle( | ||||
|                   backgroundColor: WidgetStatePropertyAll( | ||||
|                     Theme.of(context).colorScheme.error, | ||||
|                   ), | ||||
|                 ), | ||||
|               ), | ||||
|             ], | ||||
|           ), | ||||
|         ], | ||||
|       ).padding(horizontal: 16, vertical: 12), | ||||
|     ); | ||||
|  | ||||
|     return account.when( | ||||
|       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, | ||||
|                                 ), | ||||
|             isNoBackground: false, | ||||
|             appBar: | ||||
|                 isWideScreen(context) | ||||
|                     ? AppBar( | ||||
|                       foregroundColor: appbarColor.value, | ||||
|                       leading: PageBackButton( | ||||
|                         color: appbarColor.value, | ||||
|                         shadows: [appbarShadow], | ||||
|                       ), | ||||
|                       FlexibleSpaceBar( | ||||
|                         title: Text( | ||||
|                           data.nick, | ||||
|                           style: TextStyle( | ||||
|                             color: | ||||
|                                 appbarColor.value ?? | ||||
|                                 Theme.of(context).appBarTheme.foregroundColor, | ||||
|                             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: Card( | ||||
|                                     child: BadgeList( | ||||
|                                       badges: data.badges, | ||||
|                                     ).padding(horizontal: 26, vertical: 20), | ||||
|                                   ).padding(left: 2, right: 4), | ||||
|                                 ), | ||||
|                               SliverToBoxAdapter( | ||||
|                                 child: Column( | ||||
|                                   spacing: 12, | ||||
|                                   children: [ | ||||
|                                     LevelingProgressCard( | ||||
|                                       level: data.profile.level, | ||||
|                                       experience: data.profile.experience, | ||||
|                                       progress: data.profile.levelingProgress, | ||||
|                                     ).padding(left: 2, right: 4), | ||||
|                                     if (data.profile.verification != null) | ||||
|                                       Card( | ||||
|                                         margin: EdgeInsets.zero, | ||||
|                                         child: VerificationStatusCard( | ||||
|                                           mark: data.profile.verification!, | ||||
|                                         ), | ||||
|                                       ), | ||||
|                                   ], | ||||
|                                 ).padding(horizontal: 4, top: 8), | ||||
|                               ), | ||||
|                               SliverToBoxAdapter( | ||||
|                                 child: accountProfileBio(data).padding(top: 4), | ||||
|                               ), | ||||
|                               SliverToBoxAdapter( | ||||
|                                 child: accountProfileLinks(data), | ||||
|                               ), | ||||
|                               SliverToBoxAdapter( | ||||
|                                 child: accountProfileDetail(data), | ||||
|                               ), | ||||
|                             ], | ||||
|                           ), | ||||
|                         ), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Padding( | ||||
|                     padding: const EdgeInsets.fromLTRB(24, 24, 24, 8), | ||||
|                     child: Row( | ||||
|                       crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                       children: [ | ||||
|                         ProfilePictureWidget( | ||||
|                           file: data.profile.picture, | ||||
|                           radius: 32, | ||||
|                         ), | ||||
|                         const Gap(20), | ||||
|                         Expanded( | ||||
|                           child: Column( | ||||
|                             crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|                             children: [ | ||||
|                               Row( | ||||
|                                 children: [ | ||||
|                                   AccountName( | ||||
|                                     account: data, | ||||
|                                     style: TextStyle(fontSize: 20), | ||||
|                         Flexible( | ||||
|                           child: CustomScrollView( | ||||
|                             slivers: [ | ||||
|                               SliverGap(24), | ||||
|                               if (user.value != null) | ||||
|                                 SliverToBoxAdapter(child: accountAction(data)), | ||||
|                               SliverToBoxAdapter( | ||||
|                                 child: Card( | ||||
|                                   child: FortuneGraphWidget( | ||||
|                                     events: accountEvents, | ||||
|                                     eventCalanderUser: data.name, | ||||
|                                     margin: EdgeInsets.zero, | ||||
|                                   ), | ||||
|                                   const Gap(6), | ||||
|                                   Text( | ||||
|                                     '@${data.name}', | ||||
|                                   ).fontSize(14).opacity(0.85), | ||||
|                                 ], | ||||
|                               ), | ||||
|                               AccountStatusWidget( | ||||
|                                 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( | ||||
|                   child: const Divider(height: 1).padding(vertical: 24), | ||||
|                 ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Column( | ||||
|                     crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|                     spacing: 24, | ||||
|                     children: [ | ||||
|                       if (buildSubcolumn(data).isNotEmpty) | ||||
|                         Column( | ||||
|                           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                           spacing: 2, | ||||
|                           children: buildSubcolumn(data), | ||||
|                         ), | ||||
|                       Column( | ||||
|                         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                         children: [ | ||||
|                           Text('bio').tr().bold(), | ||||
|                           Text( | ||||
|                             data.profile.bio.isEmpty | ||||
|                                 ? 'descriptionNone'.tr() | ||||
|                                 : data.profile.bio, | ||||
|                     ).padding(horizontal: 24) | ||||
|                     : CustomScrollView( | ||||
|                       slivers: [ | ||||
|                         SliverAppBar( | ||||
|                           foregroundColor: appbarColor.value, | ||||
|                           expandedHeight: 180, | ||||
|                           pinned: true, | ||||
|                           leading: PageBackButton( | ||||
|                             color: appbarColor.value, | ||||
|                             shadows: [appbarShadow], | ||||
|                           ), | ||||
|                         ], | ||||
|                       ), | ||||
|                       if (data.profile.timeZone.isNotEmpty) | ||||
|                         Column( | ||||
|                           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                           children: [ | ||||
|                             Text('timeZone').tr().bold(), | ||||
|                             Row( | ||||
|                               crossAxisAlignment: CrossAxisAlignment.baseline, | ||||
|                               textBaseline: TextBaseline.alphabetic, | ||||
|                               spacing: 6, | ||||
|                               children: [ | ||||
|                                 Text(data.profile.timeZone), | ||||
|                                 Text( | ||||
|                                   getTzInfo( | ||||
|                                     data.profile.timeZone, | ||||
|                                   ).$2.formatCustomGlobal('HH:mm'), | ||||
|                                 ), | ||||
|                                 Text( | ||||
|                                   getTzInfo( | ||||
|                                     data.profile.timeZone, | ||||
|                                   ).$1.formatOffsetLocal(), | ||||
|                                 ).fontSize(11), | ||||
|                                 Text( | ||||
|                                   'UTC${getTzInfo(data.profile.timeZone).$1.formatOffset()}', | ||||
|                                 ).fontSize(11).opacity(0.75), | ||||
|                               ], | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|                     ], | ||||
|                   ).padding(horizontal: 24), | ||||
|                 ), | ||||
|  | ||||
|                 if (user.value != null) | ||||
|                   SliverToBoxAdapter( | ||||
|                     child: const Divider( | ||||
|                       height: 1, | ||||
|                     ).padding(top: 24, bottom: 12), | ||||
|                   ), | ||||
|                 if (user.value != null) | ||||
|                   SliverToBoxAdapter( | ||||
|                     child: Row( | ||||
|                       spacing: 8, | ||||
|                       children: [ | ||||
|                         if (accountRelationship.value == null || | ||||
|                             accountRelationship.value!.status > -100) | ||||
|                           Expanded( | ||||
|                             child: FilledButton.icon( | ||||
|                               style: ButtonStyle( | ||||
|                                 backgroundColor: WidgetStatePropertyAll( | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? null | ||||
|                                       : Theme.of(context).colorScheme.secondary, | ||||
|                                 ), | ||||
|                                 foregroundColor: WidgetStatePropertyAll( | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? null | ||||
|                                       : Theme.of( | ||||
|                                         context, | ||||
|                                       ).colorScheme.onSecondary, | ||||
|                           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], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                               ), | ||||
|                               onPressed: relationshipAction, | ||||
|                               label: | ||||
|                                   Text( | ||||
|                                     accountRelationship.value == null | ||||
|                                         ? 'addFriendShort' | ||||
|                                         : 'added', | ||||
|                                   ).tr(), | ||||
|                               icon: | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? const Icon(Symbols.person_add) | ||||
|                                       : const Icon(Symbols.person_check), | ||||
|                             ), | ||||
|                             ], | ||||
|                           ), | ||||
|                         if (accountRelationship.value == null || | ||||
|                             accountRelationship.value!.status <= -100) | ||||
|                           Expanded( | ||||
|                             child: FilledButton.icon( | ||||
|                               style: ButtonStyle( | ||||
|                                 backgroundColor: WidgetStatePropertyAll( | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? null | ||||
|                                       : Theme.of(context).colorScheme.secondary, | ||||
|                                 ), | ||||
|                                 foregroundColor: WidgetStatePropertyAll( | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? null | ||||
|                                       : Theme.of( | ||||
|                                         context, | ||||
|                                       ).colorScheme.onSecondary, | ||||
|                                 ), | ||||
|                               ), | ||||
|                               onPressed: blockAction, | ||||
|                               label: | ||||
|                                   Text( | ||||
|                                     accountRelationship.value == null | ||||
|                                         ? 'blockUser' | ||||
|                                         : 'unblockUser', | ||||
|                                   ).tr(), | ||||
|                               icon: | ||||
|                                   accountRelationship.value == null | ||||
|                                       ? const Icon(Symbols.block) | ||||
|                                       : const Icon(Symbols.person_cancel), | ||||
|                             ), | ||||
|                         ), | ||||
|                         SliverToBoxAdapter(child: accountBasicInfo(data)), | ||||
|                         if (data.badges.isNotEmpty) | ||||
|                           SliverToBoxAdapter( | ||||
|                             child: Card( | ||||
|                               child: BadgeList( | ||||
|                                 badges: data.badges, | ||||
|                               ).padding(horizontal: 26, vertical: 20), | ||||
|                             ).padding(horizontal: 4), | ||||
|                           ), | ||||
|                         SliverToBoxAdapter( | ||||
|                           child: Column( | ||||
|                             children: [ | ||||
|                               LevelingProgressCard( | ||||
|                                 level: data.profile.level, | ||||
|                                 experience: data.profile.experience, | ||||
|                                 progress: data.profile.levelingProgress, | ||||
|                               ).padding(top: 8, horizontal: 8, bottom: 4), | ||||
|                               if (data.profile.verification != null) | ||||
|                                 Card( | ||||
|                                   child: VerificationStatusCard( | ||||
|                                     mark: data.profile.verification!, | ||||
|                                   ), | ||||
|                                 ).padding(horizontal: 4), | ||||
|                             ], | ||||
|                           ), | ||||
|                         ), | ||||
|                         SliverToBoxAdapter( | ||||
|                           child: accountProfileBio(data).padding(horizontal: 4), | ||||
|                         ), | ||||
|                         SliverToBoxAdapter( | ||||
|                           child: accountProfileLinks( | ||||
|                             data, | ||||
|                           ).padding(horizontal: 4), | ||||
|                         ), | ||||
|                         SliverToBoxAdapter( | ||||
|                           child: accountProfileDetail( | ||||
|                             data, | ||||
|                           ).padding(horizontal: 4), | ||||
|                         ), | ||||
|                         if (user.value != null) | ||||
|                           SliverToBoxAdapter( | ||||
|                             child: accountAction(data).padding(horizontal: 4), | ||||
|                           ), | ||||
|                         SliverToBoxAdapter( | ||||
|                           child: Card( | ||||
|                             child: FortuneGraphWidget( | ||||
|                               events: accountEvents, | ||||
|                               eventCalanderUser: data.name, | ||||
|                             ), | ||||
|                           ).padding(horizontal: 4), | ||||
|                         ), | ||||
|                       ], | ||||
|                     ).padding(horizontal: 16), | ||||
|                   ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Row( | ||||
|                     spacing: 8, | ||||
|                     children: [ | ||||
|                       Expanded( | ||||
|                         child: FilledButton.icon( | ||||
|                           onPressed: directMessageAction, | ||||
|                           icon: const Icon(Symbols.message), | ||||
|                           label: | ||||
|                               Text( | ||||
|                                 accountChat.value == null | ||||
|                                     ? 'createDirectMessage' | ||||
|                                     : 'gotoDirectMessage', | ||||
|                                 maxLines: 1, | ||||
|                               ).tr(), | ||||
|                         ), | ||||
|                       ), | ||||
|                       IconButton.filled( | ||||
|                         onPressed: () { | ||||
|                           showAbuseReportSheet( | ||||
|                             context, | ||||
|                             resourceIdentifier: 'account/${data.id}', | ||||
|                           ); | ||||
|                         }, | ||||
|                         icon: Icon( | ||||
|                           Symbols.flag, | ||||
|                           color: Theme.of(context).colorScheme.onError, | ||||
|                         ), | ||||
|                         style: ButtonStyle( | ||||
|                           backgroundColor: WidgetStatePropertyAll( | ||||
|                             Theme.of(context).colorScheme.error, | ||||
|                           ), | ||||
|                         ), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ).padding(horizontal: 16, top: 4), | ||||
|                 ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: const Divider(height: 1).padding(top: 12), | ||||
|                 ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Column( | ||||
|                     children: [ | ||||
|                       FortuneGraphWidget( | ||||
|                         events: accountEvents, | ||||
|                         eventCalanderUser: data.name, | ||||
|                       ), | ||||
|                     ], | ||||
|                   ).padding(all: 8), | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|                     ), | ||||
|           ), | ||||
|       error: | ||||
|           (error, stackTrace) => AppScaffold( | ||||
|   | ||||
| @@ -6,7 +6,7 @@ part of 'profile.dart'; | ||||
| // RiverpodGenerator | ||||
| // ************************************************************************** | ||||
|  | ||||
| String _$accountHash() => r'd2b0579617e6264452d98f47f695a9cdf45b24ec'; | ||||
| String _$accountHash() => r'ce7264a04f69e32a5cb07bc10ca5fa47ae1fddaa'; | ||||
|  | ||||
| /// Copied from Dart SDK | ||||
| class _SystemHash { | ||||
| @@ -145,7 +145,7 @@ class _AccountProviderElement | ||||
|   String get uname => (origin as AccountProvider).uname; | ||||
| } | ||||
|  | ||||
| String _$accountBadgesHash() => r'4bfe5fb0d6ac0d4cde4563460bde289289188f6d'; | ||||
| String _$accountBadgesHash() => r'1de05e122c23ff2c6ac6d318977165761e2ad177'; | ||||
|  | ||||
| /// See also [accountBadges]. | ||||
| @ProviderFor(accountBadges) | ||||
| @@ -395,7 +395,7 @@ class _AccountAppbarForcegroundColorProviderElement | ||||
|   String get uname => (origin as AccountAppbarForcegroundColorProvider).uname; | ||||
| } | ||||
|  | ||||
| String _$accountDirectChatHash() => r'3d28c8ba8079159f724fe3cd47bbe00db55cedcc'; | ||||
| String _$accountDirectChatHash() => r'149ea3a3730672cfbbb8c16fe1f2caa0bb9f0e17'; | ||||
|  | ||||
| /// See also [accountDirectChat]. | ||||
| @ProviderFor(accountDirectChat) | ||||
| @@ -517,7 +517,7 @@ class _AccountDirectChatProviderElement | ||||
| } | ||||
|  | ||||
| String _$accountRelationshipHash() => | ||||
|     r'0be2420e1f6a65b8dcead9617191471924aaf232'; | ||||
|     r'9a3a4e8c6c6706f73df95feccb86736fcad33f30'; | ||||
|  | ||||
| /// See also [accountRelationship]. | ||||
| @ProviderFor(accountRelationship) | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user