Compare commits
45 Commits
76009147e9
...
v3
| Author | SHA1 | Date | |
|---|---|---|---|
|
62fd0500f3
|
|||
|
eeae865cc8
|
|||
|
cdf1413fe0
|
|||
|
327b4c04f1
|
|||
|
bd903ce29c
|
|||
|
1b8ecb15ce
|
|||
|
d4e380a97a
|
|||
|
126048b4fa
|
|||
|
8bec18813d
|
|||
|
1ae81794b1
|
|||
|
2a7d12de48
|
|||
|
64c60ead48
|
|||
| 001549b190 | |||
| 4595865ad3 | |||
|
|
1834643167 | ||
|
|
0e816eaa3e | ||
|
|
7c1f24b824 | ||
|
c6594ea2ce
|
|||
|
3bec6e683e
|
|||
|
83e92e2eed
|
|||
|
|
b7d44d96ba | ||
|
a83b929d42
|
|||
|
9423affa75
|
|||
|
cda23db609
|
|||
|
61074bc5a3
|
|||
|
5feafa9255
|
|||
|
e604577c1f
|
|||
|
af0ddd1273
|
|||
|
8a6bb34808
|
|||
|
4ef8445c77
|
|||
|
ec39ad6ca3
|
|||
|
eabb3154f1
|
|||
|
910bf20eef
|
|||
|
5efa9b2ae8
|
|||
|
dd3e39e891
|
|||
|
b6896ded23
|
|||
|
f28a73ff9c
|
|||
|
a014b64235
|
|||
|
7e0e7c20d7
|
|||
|
389fa515ba
|
|||
|
681ead02eb
|
|||
|
8d1c145b0b
|
|||
|
51b4754182
|
|||
|
8a2b321701
|
|||
|
f685a7a249
|
@@ -75,3 +75,4 @@ dependencies {
|
|||||||
flutter {
|
flutter {
|
||||||
source = "../.."
|
source = "../.."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -171,8 +171,8 @@
|
|||||||
"checkInResultLevel3": "Good Luck",
|
"checkInResultLevel3": "Good Luck",
|
||||||
"checkInResultLevel4": "Best Luck",
|
"checkInResultLevel4": "Best Luck",
|
||||||
"checkInActivityTitle": "{} checked in on {} and got a {}",
|
"checkInActivityTitle": "{} checked in on {} and got a {}",
|
||||||
"eventCalander": "Event Calander",
|
"eventCalendar": "Event Calendar",
|
||||||
"eventCalanderEmpty": "No events on that day.",
|
"eventCalendarEmpty": "No events on that day.",
|
||||||
"fortuneGraph": "Fortune Trend",
|
"fortuneGraph": "Fortune Trend",
|
||||||
"noFortuneData": "No fortune data available for this month.",
|
"noFortuneData": "No fortune data available for this month.",
|
||||||
"creatorHub": "Creator Hub",
|
"creatorHub": "Creator Hub",
|
||||||
@@ -479,7 +479,6 @@
|
|||||||
"accountProfileView": "View Profile",
|
"accountProfileView": "View Profile",
|
||||||
"unspecified": "Unspecified",
|
"unspecified": "Unspecified",
|
||||||
"added": "Added",
|
"added": "Added",
|
||||||
"preview": "Preview",
|
|
||||||
"togglePreview": "Toggle Preview",
|
"togglePreview": "Toggle Preview",
|
||||||
"subscribe": "Subscribe",
|
"subscribe": "Subscribe",
|
||||||
"unsubscribe": "Unsubscribe",
|
"unsubscribe": "Unsubscribe",
|
||||||
@@ -640,6 +639,10 @@
|
|||||||
"chatNotJoined": "You have not joined this chat yet.",
|
"chatNotJoined": "You have not joined this chat yet.",
|
||||||
"chatUnableJoin": "You can't join this chat due to it's access control settings.",
|
"chatUnableJoin": "You can't join this chat due to it's access control settings.",
|
||||||
"chatJoin": "Join the Chat",
|
"chatJoin": "Join the Chat",
|
||||||
|
"chatReplyingTo": "Replying to {}",
|
||||||
|
"chatForwarding": "Forwarding message",
|
||||||
|
"chatEditing": "Editing message",
|
||||||
|
"chatNoContent": "No content",
|
||||||
"realmJoin": "Join the Realm",
|
"realmJoin": "Join the Realm",
|
||||||
"realmJoinSuccess": "Successfully joined the realm.",
|
"realmJoinSuccess": "Successfully joined the realm.",
|
||||||
"search": "Search",
|
"search": "Search",
|
||||||
@@ -868,6 +871,7 @@
|
|||||||
"pollShortTextAnswerPreview": "Short text answer (preview)",
|
"pollShortTextAnswerPreview": "Short text answer (preview)",
|
||||||
"award": "Award",
|
"award": "Award",
|
||||||
"awardPost": "Award Post",
|
"awardPost": "Award Post",
|
||||||
|
"awardPoints": "Awarded {} points",
|
||||||
"awardMessage": "Message",
|
"awardMessage": "Message",
|
||||||
"awardMessageHint": "Enter your award message...",
|
"awardMessageHint": "Enter your award message...",
|
||||||
"awardAttitude": "Attitude",
|
"awardAttitude": "Attitude",
|
||||||
@@ -1227,5 +1231,64 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"spoiler": "Spoiler",
|
"spoiler": "Spoiler",
|
||||||
"activityHeatmap": "Activity Heatmap",
|
"activityHeatmap": "Activity Heatmap",
|
||||||
"custom": "Custom"
|
"custom": "Custom",
|
||||||
|
"usernameColor": "Username Color",
|
||||||
|
"colorType": "Color Type",
|
||||||
|
"plain": "Plain",
|
||||||
|
"gradient": "Gradient",
|
||||||
|
"colorValue": "Color Value",
|
||||||
|
"gradientDirection": "Gradient Direction",
|
||||||
|
"gradientDirectionToRight": "To Right",
|
||||||
|
"gradientDirectionToLeft": "To Left",
|
||||||
|
"gradientDirectionToBottom": "To Bottom",
|
||||||
|
"gradientDirectionToTop": "To Top",
|
||||||
|
"gradientDirectionToBottomRight": "To Bottom Right",
|
||||||
|
"gradientDirectionToBottomLeft": "To Bottom Left",
|
||||||
|
"gradientDirectionToTopRight": "To Top Right",
|
||||||
|
"gradientDirectionToTopLeft": "To Top Left",
|
||||||
|
"gradientColors": "Gradient Colors",
|
||||||
|
"color": "Color",
|
||||||
|
"addColor": "Add Color",
|
||||||
|
"preview": "Preview",
|
||||||
|
"availableWithYourPlan": "Available with your plan",
|
||||||
|
"upgradeRequired": "Upgrade required",
|
||||||
|
"settingsDisableAnimation": "Disable Animation",
|
||||||
|
"addTag": "Add Tag",
|
||||||
|
"postFeaturedIn": "Post featured on {}",
|
||||||
|
"messageSentAt": "Sent at {}",
|
||||||
|
"myTickets": "My Tickets",
|
||||||
|
"drawHistory": "Draw History",
|
||||||
|
"lottery": "Lottery",
|
||||||
|
"noLotteryTickets": "No lottery tickets yet",
|
||||||
|
"buyYourFirstTicket": "Buy your first lottery ticket to get started!",
|
||||||
|
"buyTicket": "Buy Ticket",
|
||||||
|
"ticketNumbers": "Numbers: {}, Special: {}",
|
||||||
|
"cost": "Cost",
|
||||||
|
"multiplier": "Multiplier",
|
||||||
|
"prizeWon": "Prize Won",
|
||||||
|
"pending": "Pending",
|
||||||
|
"drawn": "Drawn",
|
||||||
|
"won": "Won",
|
||||||
|
"lost": "Lost",
|
||||||
|
"noDrawHistory": "No draw history yet",
|
||||||
|
"buyLotteryTicket": "Buy Lottery Ticket",
|
||||||
|
"selectNumbers": "Select Numbers",
|
||||||
|
"select5UniqueNumbers": "Select 5 unique numbers",
|
||||||
|
"selectSpecialNumber": "Select Special Number",
|
||||||
|
"selectMultiplier": "Select Multiplier",
|
||||||
|
"baseCost": "Base Cost",
|
||||||
|
"totalCost": "Total Cost",
|
||||||
|
"prizeStructure": "Prize Structure",
|
||||||
|
"enterPinToConfirmPurchase": "Enter your PIN to confirm purchase",
|
||||||
|
"ticketPurchasedSuccessfully": "Ticket purchased successfully!",
|
||||||
|
"winningNumbers": "Winning Numbers",
|
||||||
|
"specialNumber": "Special Number",
|
||||||
|
"totalTickets": "Total Tickets",
|
||||||
|
"totalWinners": "Total Winners",
|
||||||
|
"prizePool": "Prize Pool",
|
||||||
|
"enterPinToConfirmPayment": "Enter your PIN code to confirm payment",
|
||||||
|
"purchase": "Purchase",
|
||||||
|
"multiplierLabel": "Multiplier",
|
||||||
|
"specialOnly": "Special Only",
|
||||||
|
"matches": "Matches"
|
||||||
}
|
}
|
||||||
|
|||||||
147
ios/Podfile.lock
147
ios/Podfile.lock
@@ -44,83 +44,83 @@ PODS:
|
|||||||
- Flutter
|
- Flutter
|
||||||
- file_saver (0.0.1):
|
- file_saver (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Firebase/CoreOnly (12.2.0):
|
- Firebase/CoreOnly (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- Firebase/Crashlytics (12.2.0):
|
- Firebase/Crashlytics (12.4.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseCrashlytics (~> 12.2.0)
|
- FirebaseCrashlytics (~> 12.4.0)
|
||||||
- Firebase/Messaging (12.2.0):
|
- Firebase/Messaging (12.4.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseMessaging (~> 12.2.0)
|
- FirebaseMessaging (~> 12.4.0)
|
||||||
- firebase_analytics (12.0.2):
|
- firebase_analytics (12.0.3):
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- FirebaseAnalytics (= 12.2.0)
|
- FirebaseAnalytics (= 12.4.0)
|
||||||
- Flutter
|
- Flutter
|
||||||
- firebase_core (4.1.1):
|
- firebase_core (4.2.0):
|
||||||
- Firebase/CoreOnly (= 12.2.0)
|
- Firebase/CoreOnly (= 12.4.0)
|
||||||
- Flutter
|
- Flutter
|
||||||
- firebase_crashlytics (5.0.2):
|
- firebase_crashlytics (5.0.3):
|
||||||
- Firebase/Crashlytics (= 12.2.0)
|
- Firebase/Crashlytics (= 12.4.0)
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- Flutter
|
- Flutter
|
||||||
- firebase_messaging (16.0.2):
|
- firebase_messaging (16.0.3):
|
||||||
- Firebase/Messaging (= 12.2.0)
|
- Firebase/Messaging (= 12.4.0)
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- Flutter
|
- Flutter
|
||||||
- FirebaseAnalytics (12.2.0):
|
- FirebaseAnalytics (12.4.0):
|
||||||
- FirebaseAnalytics/Default (= 12.2.0)
|
- FirebaseAnalytics/Default (= 12.4.0)
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseInstallations (~> 12.2.0)
|
- FirebaseInstallations (~> 12.4.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- FirebaseAnalytics/Default (12.2.0):
|
- FirebaseAnalytics/Default (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseInstallations (~> 12.2.0)
|
- FirebaseInstallations (~> 12.4.0)
|
||||||
- GoogleAppMeasurement/Default (= 12.2.0)
|
- GoogleAppMeasurement/Default (= 12.4.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- FirebaseCore (12.2.0):
|
- FirebaseCore (12.4.0):
|
||||||
- FirebaseCoreInternal (~> 12.2.0)
|
- FirebaseCoreInternal (~> 12.4.0)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/Logger (~> 8.1)
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
- FirebaseCoreExtension (12.2.0):
|
- FirebaseCoreExtension (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseCoreInternal (12.2.0):
|
- FirebaseCoreInternal (12.4.0):
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- FirebaseCrashlytics (12.2.0):
|
- FirebaseCrashlytics (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseInstallations (~> 12.2.0)
|
- FirebaseInstallations (~> 12.4.0)
|
||||||
- FirebaseRemoteConfigInterop (~> 12.2.0)
|
- FirebaseRemoteConfigInterop (~> 12.4.0)
|
||||||
- FirebaseSessions (~> 12.2.0)
|
- FirebaseSessions (~> 12.4.0)
|
||||||
- GoogleDataTransport (~> 10.1)
|
- GoogleDataTransport (~> 10.1)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
- FirebaseInstallations (12.2.0):
|
- FirebaseInstallations (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
- FirebaseMessaging (12.2.0):
|
- FirebaseMessaging (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseInstallations (~> 12.2.0)
|
- FirebaseInstallations (~> 12.4.0)
|
||||||
- GoogleDataTransport (~> 10.1)
|
- GoogleDataTransport (~> 10.1)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/Reachability (~> 8.1)
|
- GoogleUtilities/Reachability (~> 8.1)
|
||||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- FirebaseRemoteConfigInterop (12.2.0)
|
- FirebaseRemoteConfigInterop (12.4.0)
|
||||||
- FirebaseSessions (12.2.0):
|
- FirebaseSessions (12.4.0):
|
||||||
- FirebaseCore (~> 12.2.0)
|
- FirebaseCore (~> 12.4.0)
|
||||||
- FirebaseCoreExtension (~> 12.2.0)
|
- FirebaseCoreExtension (~> 12.4.0)
|
||||||
- FirebaseInstallations (~> 12.2.0)
|
- FirebaseInstallations (~> 12.4.0)
|
||||||
- GoogleDataTransport (~> 10.1)
|
- GoogleDataTransport (~> 10.1)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
@@ -157,27 +157,28 @@ PODS:
|
|||||||
- gal (1.0.0):
|
- gal (1.0.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- GoogleAdsOnDeviceConversion (2.3.0):
|
- GoogleAdsOnDeviceConversion (3.1.0):
|
||||||
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/Logger (~> 8.1)
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- GoogleAppMeasurement/Core (12.2.0):
|
- GoogleAppMeasurement/Core (12.4.0):
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- GoogleAppMeasurement/Default (12.2.0):
|
- GoogleAppMeasurement/Default (12.4.0):
|
||||||
- GoogleAdsOnDeviceConversion (= 2.3.0)
|
- GoogleAdsOnDeviceConversion (~> 3.1.0)
|
||||||
- GoogleAppMeasurement/Core (= 12.2.0)
|
- GoogleAppMeasurement/Core (= 12.4.0)
|
||||||
- GoogleAppMeasurement/IdentitySupport (= 12.2.0)
|
- GoogleAppMeasurement/IdentitySupport (= 12.4.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- GoogleAppMeasurement/IdentitySupport (12.2.0):
|
- GoogleAppMeasurement/IdentitySupport (12.4.0):
|
||||||
- GoogleAppMeasurement/Core (= 12.2.0)
|
- GoogleAppMeasurement/Core (= 12.4.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Network (~> 8.1)
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
@@ -218,7 +219,7 @@ PODS:
|
|||||||
- irondash_engine_context (0.0.1):
|
- irondash_engine_context (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Kingfisher (8.6.0)
|
- Kingfisher (8.6.0)
|
||||||
- livekit_client (2.5.0):
|
- livekit_client (2.5.2):
|
||||||
- Flutter
|
- Flutter
|
||||||
- flutter_webrtc
|
- flutter_webrtc
|
||||||
- WebRTC-SDK (= 137.7151.04)
|
- WebRTC-SDK (= 137.7151.04)
|
||||||
@@ -486,20 +487,20 @@ SPEC CHECKSUMS:
|
|||||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||||
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
|
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
|
||||||
file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
|
file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
|
||||||
Firebase: 26f6f8d460603af3df970ad505b16b15f5e2e9a1
|
Firebase: f07b15ae5a6ec0f93713e30b923d9970d144af3e
|
||||||
firebase_analytics: 8c78ce6224e0623152379d6cc7ef3d9098477b7e
|
firebase_analytics: 1d024068b1d4707d5ba7a42a12976ddf3316d835
|
||||||
firebase_core: dfc4bd142bee4bc53a5d482397ca322c2dd3165d
|
firebase_core: 744984dbbed8b3036abf34f0b98d80f130a7e464
|
||||||
firebase_crashlytics: e55dcf895eed0dd87c447dd5aff8db7f1bb8bbdb
|
firebase_crashlytics: f3a9a4338ab99b67042f64e9e22e1bf349cb44ed
|
||||||
firebase_messaging: 38c66c1184695b0c87abe51d40fc590718abed1a
|
firebase_messaging: 82c70650c426a0a14873e1acdb9ec2b443c4e8b4
|
||||||
FirebaseAnalytics: e04e23bc070e3014aa5cf4980f9df7ce5cd79ec8
|
FirebaseAnalytics: 0fc2b20091f0ddd21bf73397cf8f0eb5346dc24f
|
||||||
FirebaseCore: 311c48a147ad4a0ab7febbaed89e8025c67510cd
|
FirebaseCore: bb595f3114953664e3c1dc032f008a244147cfd3
|
||||||
FirebaseCoreExtension: 73af080c22a2f7b44cefa391dc08f7e4ee162cb5
|
FirebaseCoreExtension: 7e1f7118ee970e001a8013719fb90950ee5e0018
|
||||||
FirebaseCoreInternal: 56ea29f3dad2894f81b060f706f9d53509b6ed3b
|
FirebaseCoreInternal: d7f5a043c2cd01a08103ab586587c1468047bca6
|
||||||
FirebaseCrashlytics: f83cbf176d5c637ade108c0aacf1ccbd5ec499bf
|
FirebaseCrashlytics: a6ece278a837c7e88de2d9b5da0a3542f2342395
|
||||||
FirebaseInstallations: 3e884b01feabdf67582a80f3250425a00979b4ed
|
FirebaseInstallations: ae9f4902cb5bf1d0c5eaa31ec1f4e5495a0714e2
|
||||||
FirebaseMessaging: 43ec73bbfedd0c385a849bb91593ab4ad4b9e48e
|
FirebaseMessaging: d33971b7bb252745ea6cd31ab190d1a1df4b8ed5
|
||||||
FirebaseRemoteConfigInterop: 0896fd52ab72586a355c8f389ff85aaa9e5375e1
|
FirebaseRemoteConfigInterop: 1e31ec72b89c9924367c59bfb5ec9ab60d1d6766
|
||||||
FirebaseSessions: f4692789e770bec66ce17d772c0e9561c4f11737
|
FirebaseSessions: ba7c7a7ca8696a8d540eb3fe3800fbe98c79786d
|
||||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
|
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
|
||||||
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
|
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
|
||||||
@@ -512,14 +513,14 @@ SPEC CHECKSUMS:
|
|||||||
flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9
|
flutter_udid: f7c3884e6ec2951efe4f9de082257fc77c4d15e9
|
||||||
flutter_webrtc: c3e21fc0dcd9d8eb246ae4d5256fcbeb2f5ecd22
|
flutter_webrtc: c3e21fc0dcd9d8eb246ae4d5256fcbeb2f5ecd22
|
||||||
gal: baecd024ebfd13c441269ca7404792a7152fde89
|
gal: baecd024ebfd13c441269ca7404792a7152fde89
|
||||||
GoogleAdsOnDeviceConversion: 9090c435cde08903e8dd1ba2c77fbec9e46d9afe
|
GoogleAdsOnDeviceConversion: e03a386840803ea7eef3fd22a061930142c039c1
|
||||||
GoogleAppMeasurement: 09f341dfa8527d1612a09cbfe809a242c0b737af
|
GoogleAppMeasurement: 1e718274b7e015cefd846ac1fcf7820c70dc017d
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||||
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486
|
irondash_engine_context: 8e58ca8e0212ee9d1c7dc6a42121849986c88486
|
||||||
Kingfisher: 64278f126a815d0e2d391cdf71311b85882c4de0
|
Kingfisher: 64278f126a815d0e2d391cdf71311b85882c4de0
|
||||||
livekit_client: a6f5fa86ac28ccd7ded53626a5379961db311ab4
|
livekit_client: 10e5f01922529565a0967660ecb1a6181778cc32
|
||||||
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
||||||
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
|
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
|
||||||
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
|
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
|
||||||
@@ -528,8 +529,8 @@ SPEC CHECKSUMS:
|
|||||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||||
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||||
pasteboard: 49088aeb6119d51f976a421db60d8e1ab079b63c
|
pasteboard: 49088aeb6119d51f976a421db60d8e1ab079b63c
|
||||||
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
|
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
|
||||||
pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed
|
pointer_interceptor_ios: da06a662d5bfd329602b45b2ab41bc0fb5fdb0f0
|
||||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||||
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
|
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
|
||||||
receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00
|
receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00
|
||||||
@@ -537,7 +538,7 @@ SPEC CHECKSUMS:
|
|||||||
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
|
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
|
||||||
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
|
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
|
||||||
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
|
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
|
||||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||||
sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b
|
sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b
|
||||||
@@ -545,7 +546,7 @@ SPEC CHECKSUMS:
|
|||||||
super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4
|
super_native_extensions: b763c02dc3a8fd078389f410bf15149179020cb4
|
||||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||||
syncfusion_flutter_pdfviewer: 90dc48305d2e33d4aa20681d1e98ddeda891bc14
|
syncfusion_flutter_pdfviewer: 90dc48305d2e33d4aa20681d1e98ddeda891bc14
|
||||||
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
|
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||||
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
|
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
|
||||||
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
||||||
WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e
|
WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e
|
||||||
|
|||||||
@@ -120,13 +120,24 @@ void main() async {
|
|||||||
windowButtonVisibility: true,
|
windowButtonVisibility: true,
|
||||||
);
|
);
|
||||||
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||||
|
final env = Platform.environment;
|
||||||
|
final isWayland = env.containsKey('WAYLAND_DISPLAY');
|
||||||
|
|
||||||
|
if (isWayland) {
|
||||||
|
try {
|
||||||
|
await windowManager.setAsFrameless();
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('[Wayland] setAsFrameless failed: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
await windowManager.setMinimumSize(defaultSize);
|
await windowManager.setMinimumSize(defaultSize);
|
||||||
await windowManager.show();
|
await windowManager.show();
|
||||||
await windowManager.focus();
|
await windowManager.focus();
|
||||||
final opacity = prefs.getDouble(kAppWindowOpacity) ?? 1.0;
|
final opacity = prefs.getDouble(kAppWindowOpacity) ?? 1.0;
|
||||||
await windowManager.setOpacity(opacity);
|
await windowManager.setOpacity(opacity);
|
||||||
talker.info(
|
talker.info(
|
||||||
"[SplashScreen] Desktop window is ready with size: ${initialSize.width}x${initialSize.height}",
|
"[SplashScreen] Desktop window is ready with size: ${initialSize.width}x${initialSize.height}"
|
||||||
|
"${isWayland ? " (Wayland frameless fix applied)" : ""}",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,19 @@ class ProfileLinkConverter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
sealed class UsernameColor with _$UsernameColor {
|
||||||
|
const factory UsernameColor({
|
||||||
|
@Default('plain') String type,
|
||||||
|
String? value,
|
||||||
|
String? direction,
|
||||||
|
List<String>? colors,
|
||||||
|
}) = _UsernameColor;
|
||||||
|
|
||||||
|
factory UsernameColor.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$UsernameColorFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
sealed class SnAccountProfile with _$SnAccountProfile {
|
sealed class SnAccountProfile with _$SnAccountProfile {
|
||||||
const factory SnAccountProfile({
|
const factory SnAccountProfile({
|
||||||
@@ -79,6 +92,7 @@ sealed class SnAccountProfile with _$SnAccountProfile {
|
|||||||
required SnCloudFile? picture,
|
required SnCloudFile? picture,
|
||||||
required SnCloudFile? background,
|
required SnCloudFile? background,
|
||||||
required SnVerificationMark? verification,
|
required SnVerificationMark? verification,
|
||||||
|
UsernameColor? usernameColor,
|
||||||
required DateTime createdAt,
|
required DateTime createdAt,
|
||||||
required DateTime updatedAt,
|
required DateTime updatedAt,
|
||||||
required DateTime? deletedAt,
|
required DateTime? deletedAt,
|
||||||
|
|||||||
@@ -622,10 +622,284 @@ as String,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$UsernameColor {
|
||||||
|
|
||||||
|
String get type; String? get value; String? get direction; List<String>? get colors;
|
||||||
|
/// Create a copy of UsernameColor
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$UsernameColorCopyWith<UsernameColor> get copyWith => _$UsernameColorCopyWithImpl<UsernameColor>(this as UsernameColor, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this UsernameColor to a JSON map.
|
||||||
|
Map<String, dynamic> toJson();
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is UsernameColor&&(identical(other.type, type) || other.type == type)&&(identical(other.value, value) || other.value == value)&&(identical(other.direction, direction) || other.direction == direction)&&const DeepCollectionEquality().equals(other.colors, colors));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(runtimeType,type,value,direction,const DeepCollectionEquality().hash(colors));
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'UsernameColor(type: $type, value: $value, direction: $direction, colors: $colors)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class $UsernameColorCopyWith<$Res> {
|
||||||
|
factory $UsernameColorCopyWith(UsernameColor value, $Res Function(UsernameColor) _then) = _$UsernameColorCopyWithImpl;
|
||||||
|
@useResult
|
||||||
|
$Res call({
|
||||||
|
String type, String? value, String? direction, List<String>? colors
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class _$UsernameColorCopyWithImpl<$Res>
|
||||||
|
implements $UsernameColorCopyWith<$Res> {
|
||||||
|
_$UsernameColorCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final UsernameColor _self;
|
||||||
|
final $Res Function(UsernameColor) _then;
|
||||||
|
|
||||||
|
/// Create a copy of UsernameColor
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline') @override $Res call({Object? type = null,Object? value = freezed,Object? direction = freezed,Object? colors = freezed,}) {
|
||||||
|
return _then(_self.copyWith(
|
||||||
|
type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,value: freezed == value ? _self.value : value // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,direction: freezed == direction ? _self.direction : direction // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,colors: freezed == colors ? _self.colors : colors // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Adds pattern-matching-related methods to [UsernameColor].
|
||||||
|
extension UsernameColorPatterns on UsernameColor {
|
||||||
|
/// 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( _UsernameColor value)? $default,{required TResult orElse(),}){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor() 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( _UsernameColor value) $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor():
|
||||||
|
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( _UsernameColor value)? $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor() 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? value, String? direction, List<String>? colors)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor() when $default != null:
|
||||||
|
return $default(_that.type,_that.value,_that.direction,_that.colors);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? value, String? direction, List<String>? colors) $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor():
|
||||||
|
return $default(_that.type,_that.value,_that.direction,_that.colors);}
|
||||||
|
}
|
||||||
|
/// 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? value, String? direction, List<String>? colors)? $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _UsernameColor() when $default != null:
|
||||||
|
return $default(_that.type,_that.value,_that.direction,_that.colors);case _:
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
|
||||||
|
class _UsernameColor implements UsernameColor {
|
||||||
|
const _UsernameColor({this.type = 'plain', this.value, this.direction, final List<String>? colors}): _colors = colors;
|
||||||
|
factory _UsernameColor.fromJson(Map<String, dynamic> json) => _$UsernameColorFromJson(json);
|
||||||
|
|
||||||
|
@override@JsonKey() final String type;
|
||||||
|
@override final String? value;
|
||||||
|
@override final String? direction;
|
||||||
|
final List<String>? _colors;
|
||||||
|
@override List<String>? get colors {
|
||||||
|
final value = _colors;
|
||||||
|
if (value == null) return null;
|
||||||
|
if (_colors is EqualUnmodifiableListView) return _colors;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Create a copy of UsernameColor
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$UsernameColorCopyWith<_UsernameColor> get copyWith => __$UsernameColorCopyWithImpl<_UsernameColor>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$UsernameColorToJson(this, );
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is _UsernameColor&&(identical(other.type, type) || other.type == type)&&(identical(other.value, value) || other.value == value)&&(identical(other.direction, direction) || other.direction == direction)&&const DeepCollectionEquality().equals(other._colors, _colors));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(runtimeType,type,value,direction,const DeepCollectionEquality().hash(_colors));
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'UsernameColor(type: $type, value: $value, direction: $direction, colors: $colors)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class _$UsernameColorCopyWith<$Res> implements $UsernameColorCopyWith<$Res> {
|
||||||
|
factory _$UsernameColorCopyWith(_UsernameColor value, $Res Function(_UsernameColor) _then) = __$UsernameColorCopyWithImpl;
|
||||||
|
@override @useResult
|
||||||
|
$Res call({
|
||||||
|
String type, String? value, String? direction, List<String>? colors
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class __$UsernameColorCopyWithImpl<$Res>
|
||||||
|
implements _$UsernameColorCopyWith<$Res> {
|
||||||
|
__$UsernameColorCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final _UsernameColor _self;
|
||||||
|
final $Res Function(_UsernameColor) _then;
|
||||||
|
|
||||||
|
/// Create a copy of UsernameColor
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @pragma('vm:prefer-inline') $Res call({Object? type = null,Object? value = freezed,Object? direction = freezed,Object? colors = freezed,}) {
|
||||||
|
return _then(_UsernameColor(
|
||||||
|
type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,value: freezed == value ? _self.value : value // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,direction: freezed == direction ? _self.direction : direction // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,colors: freezed == colors ? _self._colors : colors // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$SnAccountProfile {
|
mixin _$SnAccountProfile {
|
||||||
|
|
||||||
String get id; String get firstName; String get middleName; String get lastName; String get bio; String get gender; String get pronouns; String get location; String get timeZone; DateTime? get birthday;@ProfileLinkConverter() List<ProfileLink> get links; DateTime? get lastSeenAt; SnAccountBadge? get activeBadge; int get experience; int get level; double get socialCredits; int get socialCreditsLevel; double get levelingProgress; SnCloudFile? get picture; SnCloudFile? get background; SnVerificationMark? get verification; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
|
String get id; String get firstName; String get middleName; String get lastName; String get bio; String get gender; String get pronouns; String get location; String get timeZone; DateTime? get birthday;@ProfileLinkConverter() List<ProfileLink> get links; DateTime? get lastSeenAt; SnAccountBadge? get activeBadge; int get experience; int get level; double get socialCredits; int get socialCreditsLevel; double get levelingProgress; SnCloudFile? get picture; SnCloudFile? get background; SnVerificationMark? get verification; UsernameColor? get usernameColor; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
|
||||||
/// Create a copy of SnAccountProfile
|
/// Create a copy of SnAccountProfile
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@@ -638,16 +912,16 @@ $SnAccountProfileCopyWith<SnAccountProfile> get copyWith => _$SnAccountProfileCo
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnAccountProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.middleName, middleName) || other.middleName == middleName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.gender, gender) || other.gender == gender)&&(identical(other.pronouns, pronouns) || other.pronouns == pronouns)&&(identical(other.location, location) || other.location == location)&&(identical(other.timeZone, timeZone) || other.timeZone == timeZone)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&const DeepCollectionEquality().equals(other.links, links)&&(identical(other.lastSeenAt, lastSeenAt) || other.lastSeenAt == lastSeenAt)&&(identical(other.activeBadge, activeBadge) || other.activeBadge == activeBadge)&&(identical(other.experience, experience) || other.experience == experience)&&(identical(other.level, level) || other.level == level)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(identical(other.socialCreditsLevel, socialCreditsLevel) || other.socialCreditsLevel == socialCreditsLevel)&&(identical(other.levelingProgress, levelingProgress) || other.levelingProgress == levelingProgress)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.verification, verification) || other.verification == verification)&&(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 SnAccountProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.middleName, middleName) || other.middleName == middleName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.gender, gender) || other.gender == gender)&&(identical(other.pronouns, pronouns) || other.pronouns == pronouns)&&(identical(other.location, location) || other.location == location)&&(identical(other.timeZone, timeZone) || other.timeZone == timeZone)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&const DeepCollectionEquality().equals(other.links, links)&&(identical(other.lastSeenAt, lastSeenAt) || other.lastSeenAt == lastSeenAt)&&(identical(other.activeBadge, activeBadge) || other.activeBadge == activeBadge)&&(identical(other.experience, experience) || other.experience == experience)&&(identical(other.level, level) || other.level == level)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(identical(other.socialCreditsLevel, socialCreditsLevel) || other.socialCreditsLevel == socialCreditsLevel)&&(identical(other.levelingProgress, levelingProgress) || other.levelingProgress == levelingProgress)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.verification, verification) || other.verification == verification)&&(identical(other.usernameColor, usernameColor) || other.usernameColor == usernameColor)&&(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)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hashAll([runtimeType,id,firstName,middleName,lastName,bio,gender,pronouns,location,timeZone,birthday,const DeepCollectionEquality().hash(links),lastSeenAt,activeBadge,experience,level,socialCredits,socialCreditsLevel,levelingProgress,picture,background,verification,createdAt,updatedAt,deletedAt]);
|
int get hashCode => Object.hashAll([runtimeType,id,firstName,middleName,lastName,bio,gender,pronouns,location,timeZone,birthday,const DeepCollectionEquality().hash(links),lastSeenAt,activeBadge,experience,level,socialCredits,socialCreditsLevel,levelingProgress,picture,background,verification,usernameColor,createdAt,updatedAt,deletedAt]);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'SnAccountProfile(id: $id, firstName: $firstName, middleName: $middleName, lastName: $lastName, bio: $bio, gender: $gender, pronouns: $pronouns, location: $location, timeZone: $timeZone, birthday: $birthday, links: $links, lastSeenAt: $lastSeenAt, activeBadge: $activeBadge, experience: $experience, level: $level, socialCredits: $socialCredits, socialCreditsLevel: $socialCreditsLevel, levelingProgress: $levelingProgress, picture: $picture, background: $background, verification: $verification, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
return 'SnAccountProfile(id: $id, firstName: $firstName, middleName: $middleName, lastName: $lastName, bio: $bio, gender: $gender, pronouns: $pronouns, location: $location, timeZone: $timeZone, birthday: $birthday, links: $links, lastSeenAt: $lastSeenAt, activeBadge: $activeBadge, experience: $experience, level: $level, socialCredits: $socialCredits, socialCreditsLevel: $socialCreditsLevel, levelingProgress: $levelingProgress, picture: $picture, background: $background, verification: $verification, usernameColor: $usernameColor, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -658,11 +932,11 @@ abstract mixin class $SnAccountProfileCopyWith<$Res> {
|
|||||||
factory $SnAccountProfileCopyWith(SnAccountProfile value, $Res Function(SnAccountProfile) _then) = _$SnAccountProfileCopyWithImpl;
|
factory $SnAccountProfileCopyWith(SnAccountProfile value, $Res Function(SnAccountProfile) _then) = _$SnAccountProfileCopyWithImpl;
|
||||||
@useResult
|
@useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday,@ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday,@ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, UsernameColor? usernameColor, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
$SnAccountBadgeCopyWith<$Res>? get activeBadge;$SnCloudFileCopyWith<$Res>? get picture;$SnCloudFileCopyWith<$Res>? get background;$SnVerificationMarkCopyWith<$Res>? get verification;
|
$SnAccountBadgeCopyWith<$Res>? get activeBadge;$SnCloudFileCopyWith<$Res>? get picture;$SnCloudFileCopyWith<$Res>? get background;$SnVerificationMarkCopyWith<$Res>? get verification;$UsernameColorCopyWith<$Res>? get usernameColor;
|
||||||
|
|
||||||
}
|
}
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -675,7 +949,7 @@ class _$SnAccountProfileCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of SnAccountProfile
|
/// Create a copy of SnAccountProfile
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? firstName = null,Object? middleName = null,Object? lastName = null,Object? bio = null,Object? gender = null,Object? pronouns = null,Object? location = null,Object? timeZone = null,Object? birthday = freezed,Object? links = null,Object? lastSeenAt = freezed,Object? activeBadge = freezed,Object? experience = null,Object? level = null,Object? socialCredits = null,Object? socialCreditsLevel = null,Object? levelingProgress = null,Object? picture = freezed,Object? background = freezed,Object? verification = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? firstName = null,Object? middleName = null,Object? lastName = null,Object? bio = null,Object? gender = null,Object? pronouns = null,Object? location = null,Object? timeZone = null,Object? birthday = freezed,Object? links = null,Object? lastSeenAt = freezed,Object? activeBadge = freezed,Object? experience = null,Object? level = null,Object? socialCredits = null,Object? socialCreditsLevel = null,Object? levelingProgress = null,Object? picture = freezed,Object? background = freezed,Object? verification = freezed,Object? usernameColor = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
return _then(_self.copyWith(
|
return _then(_self.copyWith(
|
||||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
|
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -698,7 +972,8 @@ as int,levelingProgress: null == levelingProgress ? _self.levelingProgress : lev
|
|||||||
as double,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable
|
as double,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable
|
||||||
as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable
|
as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable
|
||||||
as SnCloudFile?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable
|
as SnCloudFile?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable
|
||||||
as SnVerificationMark?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
as SnVerificationMark?,usernameColor: freezed == usernameColor ? _self.usernameColor : usernameColor // ignore: cast_nullable_to_non_nullable
|
||||||
|
as UsernameColor?,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,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,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,
|
as DateTime?,
|
||||||
@@ -752,6 +1027,18 @@ $SnVerificationMarkCopyWith<$Res>? get verification {
|
|||||||
return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) {
|
return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) {
|
||||||
return _then(_self.copyWith(verification: value));
|
return _then(_self.copyWith(verification: value));
|
||||||
});
|
});
|
||||||
|
}/// Create a copy of SnAccountProfile
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$UsernameColorCopyWith<$Res>? get usernameColor {
|
||||||
|
if (_self.usernameColor == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $UsernameColorCopyWith<$Res>(_self.usernameColor!, (value) {
|
||||||
|
return _then(_self.copyWith(usernameColor: value));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -831,10 +1118,10 @@ return $default(_that);case _:
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,{required TResult orElse(),}) {final _that = this;
|
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, UsernameColor? usernameColor, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnAccountProfile() when $default != null:
|
case _SnAccountProfile() when $default != null:
|
||||||
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.usernameColor,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
||||||
return orElse();
|
return orElse();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -852,10 +1139,10 @@ return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.b
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt) $default,) {final _that = this;
|
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, UsernameColor? usernameColor, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt) $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnAccountProfile():
|
case _SnAccountProfile():
|
||||||
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.createdAt,_that.updatedAt,_that.deletedAt);}
|
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.usernameColor,_that.createdAt,_that.updatedAt,_that.deletedAt);}
|
||||||
}
|
}
|
||||||
/// A variant of `when` that fallback to returning `null`
|
/// A variant of `when` that fallback to returning `null`
|
||||||
///
|
///
|
||||||
@@ -869,10 +1156,10 @@ return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.b
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,) {final _that = this;
|
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday, @ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, UsernameColor? usernameColor, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnAccountProfile() when $default != null:
|
case _SnAccountProfile() when $default != null:
|
||||||
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.bio,_that.gender,_that.pronouns,_that.location,_that.timeZone,_that.birthday,_that.links,_that.lastSeenAt,_that.activeBadge,_that.experience,_that.level,_that.socialCredits,_that.socialCreditsLevel,_that.levelingProgress,_that.picture,_that.background,_that.verification,_that.usernameColor,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -884,7 +1171,7 @@ return $default(_that.id,_that.firstName,_that.middleName,_that.lastName,_that.b
|
|||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
|
|
||||||
class _SnAccountProfile implements SnAccountProfile {
|
class _SnAccountProfile implements SnAccountProfile {
|
||||||
const _SnAccountProfile({required this.id, this.firstName = '', this.middleName = '', this.lastName = '', this.bio = '', this.gender = '', this.pronouns = '', this.location = '', this.timeZone = '', this.birthday, @ProfileLinkConverter() final List<ProfileLink> links = const [], this.lastSeenAt, this.activeBadge, required this.experience, required this.level, this.socialCredits = 100, this.socialCreditsLevel = 0, required this.levelingProgress, required this.picture, required this.background, required this.verification, required this.createdAt, required this.updatedAt, required this.deletedAt}): _links = links;
|
const _SnAccountProfile({required this.id, this.firstName = '', this.middleName = '', this.lastName = '', this.bio = '', this.gender = '', this.pronouns = '', this.location = '', this.timeZone = '', this.birthday, @ProfileLinkConverter() final List<ProfileLink> links = const [], this.lastSeenAt, this.activeBadge, required this.experience, required this.level, this.socialCredits = 100, this.socialCreditsLevel = 0, required this.levelingProgress, required this.picture, required this.background, required this.verification, this.usernameColor, required this.createdAt, required this.updatedAt, required this.deletedAt}): _links = links;
|
||||||
factory _SnAccountProfile.fromJson(Map<String, dynamic> json) => _$SnAccountProfileFromJson(json);
|
factory _SnAccountProfile.fromJson(Map<String, dynamic> json) => _$SnAccountProfileFromJson(json);
|
||||||
|
|
||||||
@override final String id;
|
@override final String id;
|
||||||
@@ -914,6 +1201,7 @@ class _SnAccountProfile implements SnAccountProfile {
|
|||||||
@override final SnCloudFile? picture;
|
@override final SnCloudFile? picture;
|
||||||
@override final SnCloudFile? background;
|
@override final SnCloudFile? background;
|
||||||
@override final SnVerificationMark? verification;
|
@override final SnVerificationMark? verification;
|
||||||
|
@override final UsernameColor? usernameColor;
|
||||||
@override final DateTime createdAt;
|
@override final DateTime createdAt;
|
||||||
@override final DateTime updatedAt;
|
@override final DateTime updatedAt;
|
||||||
@override final DateTime? deletedAt;
|
@override final DateTime? deletedAt;
|
||||||
@@ -931,16 +1219,16 @@ Map<String, dynamic> toJson() {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnAccountProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.middleName, middleName) || other.middleName == middleName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.gender, gender) || other.gender == gender)&&(identical(other.pronouns, pronouns) || other.pronouns == pronouns)&&(identical(other.location, location) || other.location == location)&&(identical(other.timeZone, timeZone) || other.timeZone == timeZone)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&const DeepCollectionEquality().equals(other._links, _links)&&(identical(other.lastSeenAt, lastSeenAt) || other.lastSeenAt == lastSeenAt)&&(identical(other.activeBadge, activeBadge) || other.activeBadge == activeBadge)&&(identical(other.experience, experience) || other.experience == experience)&&(identical(other.level, level) || other.level == level)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(identical(other.socialCreditsLevel, socialCreditsLevel) || other.socialCreditsLevel == socialCreditsLevel)&&(identical(other.levelingProgress, levelingProgress) || other.levelingProgress == levelingProgress)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.verification, verification) || other.verification == verification)&&(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 _SnAccountProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.middleName, middleName) || other.middleName == middleName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.gender, gender) || other.gender == gender)&&(identical(other.pronouns, pronouns) || other.pronouns == pronouns)&&(identical(other.location, location) || other.location == location)&&(identical(other.timeZone, timeZone) || other.timeZone == timeZone)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&const DeepCollectionEquality().equals(other._links, _links)&&(identical(other.lastSeenAt, lastSeenAt) || other.lastSeenAt == lastSeenAt)&&(identical(other.activeBadge, activeBadge) || other.activeBadge == activeBadge)&&(identical(other.experience, experience) || other.experience == experience)&&(identical(other.level, level) || other.level == level)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(identical(other.socialCreditsLevel, socialCreditsLevel) || other.socialCreditsLevel == socialCreditsLevel)&&(identical(other.levelingProgress, levelingProgress) || other.levelingProgress == levelingProgress)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.verification, verification) || other.verification == verification)&&(identical(other.usernameColor, usernameColor) || other.usernameColor == usernameColor)&&(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)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hashAll([runtimeType,id,firstName,middleName,lastName,bio,gender,pronouns,location,timeZone,birthday,const DeepCollectionEquality().hash(_links),lastSeenAt,activeBadge,experience,level,socialCredits,socialCreditsLevel,levelingProgress,picture,background,verification,createdAt,updatedAt,deletedAt]);
|
int get hashCode => Object.hashAll([runtimeType,id,firstName,middleName,lastName,bio,gender,pronouns,location,timeZone,birthday,const DeepCollectionEquality().hash(_links),lastSeenAt,activeBadge,experience,level,socialCredits,socialCreditsLevel,levelingProgress,picture,background,verification,usernameColor,createdAt,updatedAt,deletedAt]);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'SnAccountProfile(id: $id, firstName: $firstName, middleName: $middleName, lastName: $lastName, bio: $bio, gender: $gender, pronouns: $pronouns, location: $location, timeZone: $timeZone, birthday: $birthday, links: $links, lastSeenAt: $lastSeenAt, activeBadge: $activeBadge, experience: $experience, level: $level, socialCredits: $socialCredits, socialCreditsLevel: $socialCreditsLevel, levelingProgress: $levelingProgress, picture: $picture, background: $background, verification: $verification, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
return 'SnAccountProfile(id: $id, firstName: $firstName, middleName: $middleName, lastName: $lastName, bio: $bio, gender: $gender, pronouns: $pronouns, location: $location, timeZone: $timeZone, birthday: $birthday, links: $links, lastSeenAt: $lastSeenAt, activeBadge: $activeBadge, experience: $experience, level: $level, socialCredits: $socialCredits, socialCreditsLevel: $socialCreditsLevel, levelingProgress: $levelingProgress, picture: $picture, background: $background, verification: $verification, usernameColor: $usernameColor, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -951,11 +1239,11 @@ abstract mixin class _$SnAccountProfileCopyWith<$Res> implements $SnAccountProfi
|
|||||||
factory _$SnAccountProfileCopyWith(_SnAccountProfile value, $Res Function(_SnAccountProfile) _then) = __$SnAccountProfileCopyWithImpl;
|
factory _$SnAccountProfileCopyWith(_SnAccountProfile value, $Res Function(_SnAccountProfile) _then) = __$SnAccountProfileCopyWithImpl;
|
||||||
@override @useResult
|
@override @useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday,@ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
String id, String firstName, String middleName, String lastName, String bio, String gender, String pronouns, String location, String timeZone, DateTime? birthday,@ProfileLinkConverter() List<ProfileLink> links, DateTime? lastSeenAt, SnAccountBadge? activeBadge, int experience, int level, double socialCredits, int socialCreditsLevel, double levelingProgress, SnCloudFile? picture, SnCloudFile? background, SnVerificationMark? verification, UsernameColor? usernameColor, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@override $SnAccountBadgeCopyWith<$Res>? get activeBadge;@override $SnCloudFileCopyWith<$Res>? get picture;@override $SnCloudFileCopyWith<$Res>? get background;@override $SnVerificationMarkCopyWith<$Res>? get verification;
|
@override $SnAccountBadgeCopyWith<$Res>? get activeBadge;@override $SnCloudFileCopyWith<$Res>? get picture;@override $SnCloudFileCopyWith<$Res>? get background;@override $SnVerificationMarkCopyWith<$Res>? get verification;@override $UsernameColorCopyWith<$Res>? get usernameColor;
|
||||||
|
|
||||||
}
|
}
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -968,7 +1256,7 @@ class __$SnAccountProfileCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of SnAccountProfile
|
/// Create a copy of SnAccountProfile
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? firstName = null,Object? middleName = null,Object? lastName = null,Object? bio = null,Object? gender = null,Object? pronouns = null,Object? location = null,Object? timeZone = null,Object? birthday = freezed,Object? links = null,Object? lastSeenAt = freezed,Object? activeBadge = freezed,Object? experience = null,Object? level = null,Object? socialCredits = null,Object? socialCreditsLevel = null,Object? levelingProgress = null,Object? picture = freezed,Object? background = freezed,Object? verification = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? firstName = null,Object? middleName = null,Object? lastName = null,Object? bio = null,Object? gender = null,Object? pronouns = null,Object? location = null,Object? timeZone = null,Object? birthday = freezed,Object? links = null,Object? lastSeenAt = freezed,Object? activeBadge = freezed,Object? experience = null,Object? level = null,Object? socialCredits = null,Object? socialCreditsLevel = null,Object? levelingProgress = null,Object? picture = freezed,Object? background = freezed,Object? verification = freezed,Object? usernameColor = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
return _then(_SnAccountProfile(
|
return _then(_SnAccountProfile(
|
||||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
|
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -991,7 +1279,8 @@ as int,levelingProgress: null == levelingProgress ? _self.levelingProgress : lev
|
|||||||
as double,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable
|
as double,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable
|
||||||
as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable
|
as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable
|
||||||
as SnCloudFile?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable
|
as SnCloudFile?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable
|
||||||
as SnVerificationMark?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
as SnVerificationMark?,usernameColor: freezed == usernameColor ? _self.usernameColor : usernameColor // ignore: cast_nullable_to_non_nullable
|
||||||
|
as UsernameColor?,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,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,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,
|
as DateTime?,
|
||||||
@@ -1046,6 +1335,18 @@ $SnVerificationMarkCopyWith<$Res>? get verification {
|
|||||||
return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) {
|
return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) {
|
||||||
return _then(_self.copyWith(verification: value));
|
return _then(_self.copyWith(verification: value));
|
||||||
});
|
});
|
||||||
|
}/// Create a copy of SnAccountProfile
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$UsernameColorCopyWith<$Res>? get usernameColor {
|
||||||
|
if (_self.usernameColor == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $UsernameColorCopyWith<$Res>(_self.usernameColor!, (value) {
|
||||||
|
return _then(_self.copyWith(usernameColor: value));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,23 @@ _ProfileLink _$ProfileLinkFromJson(Map<String, dynamic> json) =>
|
|||||||
Map<String, dynamic> _$ProfileLinkToJson(_ProfileLink instance) =>
|
Map<String, dynamic> _$ProfileLinkToJson(_ProfileLink instance) =>
|
||||||
<String, dynamic>{'name': instance.name, 'url': instance.url};
|
<String, dynamic>{'name': instance.name, 'url': instance.url};
|
||||||
|
|
||||||
|
_UsernameColor _$UsernameColorFromJson(Map<String, dynamic> json) =>
|
||||||
|
_UsernameColor(
|
||||||
|
type: json['type'] as String? ?? 'plain',
|
||||||
|
value: json['value'] as String?,
|
||||||
|
direction: json['direction'] as String?,
|
||||||
|
colors:
|
||||||
|
(json['colors'] as List<dynamic>?)?.map((e) => e as String).toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$UsernameColorToJson(_UsernameColor instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'type': instance.type,
|
||||||
|
'value': instance.value,
|
||||||
|
'direction': instance.direction,
|
||||||
|
'colors': instance.colors,
|
||||||
|
};
|
||||||
|
|
||||||
_SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) =>
|
_SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) =>
|
||||||
_SnAccountProfile(
|
_SnAccountProfile(
|
||||||
id: json['id'] as String,
|
id: json['id'] as String,
|
||||||
@@ -113,6 +130,12 @@ _SnAccountProfile _$SnAccountProfileFromJson(Map<String, dynamic> json) =>
|
|||||||
: SnVerificationMark.fromJson(
|
: SnVerificationMark.fromJson(
|
||||||
json['verification'] as Map<String, dynamic>,
|
json['verification'] as Map<String, dynamic>,
|
||||||
),
|
),
|
||||||
|
usernameColor:
|
||||||
|
json['username_color'] == null
|
||||||
|
? null
|
||||||
|
: UsernameColor.fromJson(
|
||||||
|
json['username_color'] as Map<String, dynamic>,
|
||||||
|
),
|
||||||
createdAt: DateTime.parse(json['created_at'] as String),
|
createdAt: DateTime.parse(json['created_at'] as String),
|
||||||
updatedAt: DateTime.parse(json['updated_at'] as String),
|
updatedAt: DateTime.parse(json['updated_at'] as String),
|
||||||
deletedAt:
|
deletedAt:
|
||||||
@@ -144,6 +167,7 @@ Map<String, dynamic> _$SnAccountProfileToJson(_SnAccountProfile instance) =>
|
|||||||
'picture': instance.picture?.toJson(),
|
'picture': instance.picture?.toJson(),
|
||||||
'background': instance.background?.toJson(),
|
'background': instance.background?.toJson(),
|
||||||
'verification': instance.verification?.toJson(),
|
'verification': instance.verification?.toJson(),
|
||||||
|
'username_color': instance.usernameColor?.toJson(),
|
||||||
'created_at': instance.createdAt.toIso8601String(),
|
'created_at': instance.createdAt.toIso8601String(),
|
||||||
'updated_at': instance.updatedAt.toIso8601String(),
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
'deleted_at': instance.deletedAt?.toIso8601String(),
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ sealed class SnPost with _$SnPost {
|
|||||||
@Default([]) List<SnPostTag> tags,
|
@Default([]) List<SnPostTag> tags,
|
||||||
@Default([]) List<SnPostCategory> categories,
|
@Default([]) List<SnPostCategory> categories,
|
||||||
@Default([]) List<dynamic> collections,
|
@Default([]) List<dynamic> collections,
|
||||||
|
@Default([]) List<SnPostFeaturedRecord> featuredRecords,
|
||||||
@Default(null) DateTime? createdAt,
|
@Default(null) DateTime? createdAt,
|
||||||
@Default(null) DateTime? updatedAt,
|
@Default(null) DateTime? updatedAt,
|
||||||
DateTime? deletedAt,
|
DateTime? deletedAt,
|
||||||
@@ -161,3 +162,19 @@ sealed class SnPostReaction with _$SnPostReaction {
|
|||||||
factory SnPostReaction.fromJson(Map<String, dynamic> json) =>
|
factory SnPostReaction.fromJson(Map<String, dynamic> json) =>
|
||||||
_$SnPostReactionFromJson(json);
|
_$SnPostReactionFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
sealed class SnPostFeaturedRecord with _$SnPostFeaturedRecord {
|
||||||
|
const factory SnPostFeaturedRecord({
|
||||||
|
required String id,
|
||||||
|
required String postId,
|
||||||
|
required DateTime? featuredAt,
|
||||||
|
required int socialCredits,
|
||||||
|
required DateTime createdAt,
|
||||||
|
required DateTime updatedAt,
|
||||||
|
required DateTime? deletedAt,
|
||||||
|
}) = _SnPostFeaturedRecord;
|
||||||
|
|
||||||
|
factory SnPostFeaturedRecord.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SnPostFeaturedRecordFromJson(json);
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ T _$identity<T>(T value) => value;
|
|||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$SnPost {
|
mixin _$SnPost {
|
||||||
|
|
||||||
String get id; String? get title; String? get description; String? get language; DateTime? get editedAt; DateTime? get publishedAt; int get visibility; String? get content; String? get slug; int get type; Map<String, dynamic>? get meta; SnPostEmbedView? get embedView; int get viewsUnique; int get viewsTotal; int get upvotes; int get downvotes; int get repliesCount; int get awardedScore; int? get pinMode; String? get threadedPostId; SnPost? get threadedPost; String? get repliedPostId; SnPost? get repliedPost; String? get forwardedPostId; SnPost? get forwardedPost; String? get realmId; SnRealm? get realm; 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;
|
String get id; String? get title; String? get description; String? get language; DateTime? get editedAt; DateTime? get publishedAt; int get visibility; String? get content; String? get slug; int get type; Map<String, dynamic>? get meta; SnPostEmbedView? get embedView; int get viewsUnique; int get viewsTotal; int get upvotes; int get downvotes; int get repliesCount; int get awardedScore; int? get pinMode; String? get threadedPostId; SnPost? get threadedPost; String? get repliedPostId; SnPost? get repliedPost; String? get forwardedPostId; SnPost? get forwardedPost; String? get realmId; SnRealm? get realm; 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; List<SnPostFeaturedRecord> get featuredRecords; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; bool get isTruncated;
|
||||||
/// Create a copy of SnPost
|
/// Create a copy of SnPost
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@@ -28,16 +28,16 @@ $SnPostCopyWith<SnPost> get copyWith => _$SnPostCopyWithImpl<SnPost>(this as SnP
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.meta, meta)&&(identical(other.embedView, embedView) || other.embedView == embedView)&&(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.awardedScore, awardedScore) || other.awardedScore == awardedScore)&&(identical(other.pinMode, pinMode) || other.pinMode == pinMode)&&(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)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&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));
|
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.slug, slug) || other.slug == slug)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.meta, meta)&&(identical(other.embedView, embedView) || other.embedView == embedView)&&(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.awardedScore, awardedScore) || other.awardedScore == awardedScore)&&(identical(other.pinMode, pinMode) || other.pinMode == pinMode)&&(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)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&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)&&const DeepCollectionEquality().equals(other.featuredRecords, featuredRecords)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,slug,type,const DeepCollectionEquality().hash(meta),embedView,viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,awardedScore,pinMode,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,realmId,realm,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]);
|
int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,slug,type,const DeepCollectionEquality().hash(meta),embedView,viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,awardedScore,pinMode,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,realmId,realm,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),const DeepCollectionEquality().hash(featuredRecords),createdAt,updatedAt,deletedAt,isTruncated]);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, slug: $slug, type: $type, meta: $meta, embedView: $embedView, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, awardedScore: $awardedScore, pinMode: $pinMode, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, realmId: $realmId, realm: $realm, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, 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, slug: $slug, type: $type, meta: $meta, embedView: $embedView, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, awardedScore: $awardedScore, pinMode: $pinMode, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, realmId: $realmId, realm: $realm, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, featuredRecords: $featuredRecords, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ abstract mixin class $SnPostCopyWith<$Res> {
|
|||||||
factory $SnPostCopyWith(SnPost value, $Res Function(SnPost) _then) = _$SnPostCopyWithImpl;
|
factory $SnPostCopyWith(SnPost value, $Res Function(SnPost) _then) = _$SnPostCopyWithImpl;
|
||||||
@useResult
|
@useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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
|
String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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, List<SnPostFeaturedRecord> featuredRecords, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ class _$SnPostCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of SnPost
|
/// Create a copy of SnPost
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? slug = freezed,Object? type = null,Object? meta = freezed,Object? embedView = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? awardedScore = null,Object? pinMode = freezed,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? realmId = freezed,Object? realm = 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,}) {
|
@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? slug = freezed,Object? type = null,Object? meta = freezed,Object? embedView = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? awardedScore = null,Object? pinMode = freezed,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? realmId = freezed,Object? realm = 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? featuredRecords = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) {
|
||||||
return _then(_self.copyWith(
|
return _then(_self.copyWith(
|
||||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable
|
as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -102,7 +102,8 @@ as Map<String, bool>,reactions: null == reactions ? _self.reactions : reactions
|
|||||||
as List<dynamic>,tags: null == tags ? _self.tags : tags // ignore: cast_nullable_to_non_nullable
|
as List<dynamic>,tags: null == tags ? _self.tags : tags // ignore: cast_nullable_to_non_nullable
|
||||||
as List<SnPostTag>,categories: null == categories ? _self.categories : categories // 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<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 List<dynamic>,featuredRecords: null == featuredRecords ? _self.featuredRecords : featuredRecords // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<SnPostFeaturedRecord>,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?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,isTruncated: null == isTruncated ? _self.isTruncated : isTruncated // ignore: cast_nullable_to_non_nullable
|
as DateTime?,isTruncated: null == isTruncated ? _self.isTruncated : isTruncated // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -257,10 +258,10 @@ return $default(_that);case _:
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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;
|
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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, List<SnPostFeaturedRecord> featuredRecords, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnPost() when $default != null:
|
case _SnPost() when $default != null:
|
||||||
return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_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 $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.featuredRecords,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);case _:
|
||||||
return orElse();
|
return orElse();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -278,10 +279,10 @@ return $default(_that.id,_that.title,_that.description,_that.language,_that.edit
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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;
|
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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, List<SnPostFeaturedRecord> featuredRecords, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated) $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnPost():
|
case _SnPost():
|
||||||
return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);}
|
return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.featuredRecords,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);}
|
||||||
}
|
}
|
||||||
/// A variant of `when` that fallback to returning `null`
|
/// A variant of `when` that fallback to returning `null`
|
||||||
///
|
///
|
||||||
@@ -295,10 +296,10 @@ return $default(_that.id,_that.title,_that.description,_that.language,_that.edit
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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;
|
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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, List<SnPostFeaturedRecord> featuredRecords, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated)? $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _SnPost() when $default != null:
|
case _SnPost() when $default != null:
|
||||||
return $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_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 $default(_that.id,_that.title,_that.description,_that.language,_that.editedAt,_that.publishedAt,_that.visibility,_that.content,_that.slug,_that.type,_that.meta,_that.embedView,_that.viewsUnique,_that.viewsTotal,_that.upvotes,_that.downvotes,_that.repliesCount,_that.awardedScore,_that.pinMode,_that.threadedPostId,_that.threadedPost,_that.repliedPostId,_that.repliedPost,_that.forwardedPostId,_that.forwardedPost,_that.realmId,_that.realm,_that.attachments,_that.publisher,_that.reactionsCount,_that.reactionsMade,_that.reactions,_that.tags,_that.categories,_that.collections,_that.featuredRecords,_that.createdAt,_that.updatedAt,_that.deletedAt,_that.isTruncated);case _:
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -310,7 +311,7 @@ return $default(_that.id,_that.title,_that.description,_that.language,_that.edit
|
|||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
|
|
||||||
class _SnPost implements SnPost {
|
class _SnPost implements SnPost {
|
||||||
const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.slug, this.type = 0, final Map<String, dynamic>? meta, this.embedView, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.awardedScore = 0, this.pinMode, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, this.realmId, this.realm, 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;
|
const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.slug, this.type = 0, final Map<String, dynamic>? meta, this.embedView, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.awardedScore = 0, this.pinMode, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, this.realmId, this.realm, 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 [], final List<SnPostFeaturedRecord> featuredRecords = 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,_featuredRecords = featuredRecords;
|
||||||
factory _SnPost.fromJson(Map<String, dynamic> json) => _$SnPostFromJson(json);
|
factory _SnPost.fromJson(Map<String, dynamic> json) => _$SnPostFromJson(json);
|
||||||
|
|
||||||
@override final String id;
|
@override final String id;
|
||||||
@@ -398,6 +399,13 @@ class _SnPost implements SnPost {
|
|||||||
return EqualUnmodifiableListView(_collections);
|
return EqualUnmodifiableListView(_collections);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final List<SnPostFeaturedRecord> _featuredRecords;
|
||||||
|
@override@JsonKey() List<SnPostFeaturedRecord> get featuredRecords {
|
||||||
|
if (_featuredRecords is EqualUnmodifiableListView) return _featuredRecords;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_featuredRecords);
|
||||||
|
}
|
||||||
|
|
||||||
@override@JsonKey() final DateTime? createdAt;
|
@override@JsonKey() final DateTime? createdAt;
|
||||||
@override@JsonKey() final DateTime? updatedAt;
|
@override@JsonKey() final DateTime? updatedAt;
|
||||||
@override final DateTime? deletedAt;
|
@override final DateTime? deletedAt;
|
||||||
@@ -416,16 +424,16 @@ Map<String, dynamic> toJson() {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPost&&(identical(other.id, id) || other.id == id)&&(identical(other.title, title) || other.title == title)&&(identical(other.description, description) || other.description == description)&&(identical(other.language, language) || other.language == language)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&(identical(other.publishedAt, publishedAt) || other.publishedAt == publishedAt)&&(identical(other.visibility, visibility) || other.visibility == visibility)&&(identical(other.content, content) || other.content == content)&&(identical(other.slug, slug) || other.slug == slug)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._meta, _meta)&&(identical(other.embedView, embedView) || other.embedView == embedView)&&(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.awardedScore, awardedScore) || other.awardedScore == awardedScore)&&(identical(other.pinMode, pinMode) || other.pinMode == pinMode)&&(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)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&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));
|
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.slug, slug) || other.slug == slug)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._meta, _meta)&&(identical(other.embedView, embedView) || other.embedView == embedView)&&(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.awardedScore, awardedScore) || other.awardedScore == awardedScore)&&(identical(other.pinMode, pinMode) || other.pinMode == pinMode)&&(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)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.realm, realm) || other.realm == realm)&&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)&&const DeepCollectionEquality().equals(other._featuredRecords, _featuredRecords)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.isTruncated, isTruncated) || other.isTruncated == isTruncated));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,slug,type,const DeepCollectionEquality().hash(_meta),embedView,viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,awardedScore,pinMode,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,realmId,realm,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]);
|
int get hashCode => Object.hashAll([runtimeType,id,title,description,language,editedAt,publishedAt,visibility,content,slug,type,const DeepCollectionEquality().hash(_meta),embedView,viewsUnique,viewsTotal,upvotes,downvotes,repliesCount,awardedScore,pinMode,threadedPostId,threadedPost,repliedPostId,repliedPost,forwardedPostId,forwardedPost,realmId,realm,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),const DeepCollectionEquality().hash(_featuredRecords),createdAt,updatedAt,deletedAt,isTruncated]);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'SnPost(id: $id, title: $title, description: $description, language: $language, editedAt: $editedAt, publishedAt: $publishedAt, visibility: $visibility, content: $content, slug: $slug, type: $type, meta: $meta, embedView: $embedView, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, awardedScore: $awardedScore, pinMode: $pinMode, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, realmId: $realmId, realm: $realm, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, 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, slug: $slug, type: $type, meta: $meta, embedView: $embedView, viewsUnique: $viewsUnique, viewsTotal: $viewsTotal, upvotes: $upvotes, downvotes: $downvotes, repliesCount: $repliesCount, awardedScore: $awardedScore, pinMode: $pinMode, threadedPostId: $threadedPostId, threadedPost: $threadedPost, repliedPostId: $repliedPostId, repliedPost: $repliedPost, forwardedPostId: $forwardedPostId, forwardedPost: $forwardedPost, realmId: $realmId, realm: $realm, attachments: $attachments, publisher: $publisher, reactionsCount: $reactionsCount, reactionsMade: $reactionsMade, reactions: $reactions, tags: $tags, categories: $categories, collections: $collections, featuredRecords: $featuredRecords, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, isTruncated: $isTruncated)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -436,7 +444,7 @@ abstract mixin class _$SnPostCopyWith<$Res> implements $SnPostCopyWith<$Res> {
|
|||||||
factory _$SnPostCopyWith(_SnPost value, $Res Function(_SnPost) _then) = __$SnPostCopyWithImpl;
|
factory _$SnPostCopyWith(_SnPost value, $Res Function(_SnPost) _then) = __$SnPostCopyWithImpl;
|
||||||
@override @useResult
|
@override @useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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
|
String id, String? title, String? description, String? language, DateTime? editedAt, DateTime? publishedAt, int visibility, String? content, String? slug, int type, Map<String, dynamic>? meta, SnPostEmbedView? embedView, int viewsUnique, int viewsTotal, int upvotes, int downvotes, int repliesCount, int awardedScore, int? pinMode, String? threadedPostId, SnPost? threadedPost, String? repliedPostId, SnPost? repliedPost, String? forwardedPostId, SnPost? forwardedPost, String? realmId, SnRealm? realm, 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, List<SnPostFeaturedRecord> featuredRecords, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, bool isTruncated
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -453,7 +461,7 @@ class __$SnPostCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of SnPost
|
/// Create a copy of SnPost
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? title = freezed,Object? description = freezed,Object? language = freezed,Object? editedAt = freezed,Object? publishedAt = freezed,Object? visibility = null,Object? content = freezed,Object? slug = freezed,Object? type = null,Object? meta = freezed,Object? embedView = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? awardedScore = null,Object? pinMode = freezed,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? realmId = freezed,Object? realm = 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,}) {
|
@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? slug = freezed,Object? type = null,Object? meta = freezed,Object? embedView = freezed,Object? viewsUnique = null,Object? viewsTotal = null,Object? upvotes = null,Object? downvotes = null,Object? repliesCount = null,Object? awardedScore = null,Object? pinMode = freezed,Object? threadedPostId = freezed,Object? threadedPost = freezed,Object? repliedPostId = freezed,Object? repliedPost = freezed,Object? forwardedPostId = freezed,Object? forwardedPost = freezed,Object? realmId = freezed,Object? realm = 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? featuredRecords = null,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? isTruncated = null,}) {
|
||||||
return _then(_SnPost(
|
return _then(_SnPost(
|
||||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable
|
as String,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -490,7 +498,8 @@ as Map<String, bool>,reactions: null == reactions ? _self._reactions : reactions
|
|||||||
as List<dynamic>,tags: null == tags ? _self._tags : tags // ignore: cast_nullable_to_non_nullable
|
as List<dynamic>,tags: null == tags ? _self._tags : tags // ignore: cast_nullable_to_non_nullable
|
||||||
as List<SnPostTag>,categories: null == categories ? _self._categories : categories // 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<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 List<dynamic>,featuredRecords: null == featuredRecords ? _self._featuredRecords : featuredRecords // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<SnPostFeaturedRecord>,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?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
as DateTime?,isTruncated: null == isTruncated ? _self.isTruncated : isTruncated // ignore: cast_nullable_to_non_nullable
|
as DateTime?,isTruncated: null == isTruncated ? _self.isTruncated : isTruncated // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -2205,4 +2214,279 @@ $SnAccountCopyWith<$Res>? get account {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$SnPostFeaturedRecord {
|
||||||
|
|
||||||
|
String get id; String get postId; DateTime? get featuredAt; int get socialCredits; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
|
||||||
|
/// Create a copy of SnPostFeaturedRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$SnPostFeaturedRecordCopyWith<SnPostFeaturedRecord> get copyWith => _$SnPostFeaturedRecordCopyWithImpl<SnPostFeaturedRecord>(this as SnPostFeaturedRecord, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this SnPostFeaturedRecord to a JSON map.
|
||||||
|
Map<String, dynamic> toJson();
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPostFeaturedRecord&&(identical(other.id, id) || other.id == id)&&(identical(other.postId, postId) || other.postId == postId)&&(identical(other.featuredAt, featuredAt) || other.featuredAt == featuredAt)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(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,postId,featuredAt,socialCredits,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnPostFeaturedRecord(id: $id, postId: $postId, featuredAt: $featuredAt, socialCredits: $socialCredits, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class $SnPostFeaturedRecordCopyWith<$Res> {
|
||||||
|
factory $SnPostFeaturedRecordCopyWith(SnPostFeaturedRecord value, $Res Function(SnPostFeaturedRecord) _then) = _$SnPostFeaturedRecordCopyWithImpl;
|
||||||
|
@useResult
|
||||||
|
$Res call({
|
||||||
|
String id, String postId, DateTime? featuredAt, int socialCredits, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class _$SnPostFeaturedRecordCopyWithImpl<$Res>
|
||||||
|
implements $SnPostFeaturedRecordCopyWith<$Res> {
|
||||||
|
_$SnPostFeaturedRecordCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final SnPostFeaturedRecord _self;
|
||||||
|
final $Res Function(SnPostFeaturedRecord) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnPostFeaturedRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? postId = null,Object? featuredAt = freezed,Object? socialCredits = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
|
return _then(_self.copyWith(
|
||||||
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,postId: null == postId ? _self.postId : postId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,featuredAt: freezed == featuredAt ? _self.featuredAt : featuredAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,socialCredits: null == socialCredits ? _self.socialCredits : socialCredits // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Adds pattern-matching-related methods to [SnPostFeaturedRecord].
|
||||||
|
extension SnPostFeaturedRecordPatterns on SnPostFeaturedRecord {
|
||||||
|
/// 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( _SnPostFeaturedRecord value)? $default,{required TResult orElse(),}){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord() 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( _SnPostFeaturedRecord value) $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord():
|
||||||
|
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( _SnPostFeaturedRecord value)? $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord() 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 postId, DateTime? featuredAt, int socialCredits, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord() when $default != null:
|
||||||
|
return $default(_that.id,_that.postId,_that.featuredAt,_that.socialCredits,_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 postId, DateTime? featuredAt, int socialCredits, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt) $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord():
|
||||||
|
return $default(_that.id,_that.postId,_that.featuredAt,_that.socialCredits,_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 postId, DateTime? featuredAt, int socialCredits, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnPostFeaturedRecord() when $default != null:
|
||||||
|
return $default(_that.id,_that.postId,_that.featuredAt,_that.socialCredits,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
|
||||||
|
class _SnPostFeaturedRecord implements SnPostFeaturedRecord {
|
||||||
|
const _SnPostFeaturedRecord({required this.id, required this.postId, required this.featuredAt, required this.socialCredits, required this.createdAt, required this.updatedAt, required this.deletedAt});
|
||||||
|
factory _SnPostFeaturedRecord.fromJson(Map<String, dynamic> json) => _$SnPostFeaturedRecordFromJson(json);
|
||||||
|
|
||||||
|
@override final String id;
|
||||||
|
@override final String postId;
|
||||||
|
@override final DateTime? featuredAt;
|
||||||
|
@override final int socialCredits;
|
||||||
|
@override final DateTime createdAt;
|
||||||
|
@override final DateTime updatedAt;
|
||||||
|
@override final DateTime? deletedAt;
|
||||||
|
|
||||||
|
/// Create a copy of SnPostFeaturedRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$SnPostFeaturedRecordCopyWith<_SnPostFeaturedRecord> get copyWith => __$SnPostFeaturedRecordCopyWithImpl<_SnPostFeaturedRecord>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$SnPostFeaturedRecordToJson(this, );
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPostFeaturedRecord&&(identical(other.id, id) || other.id == id)&&(identical(other.postId, postId) || other.postId == postId)&&(identical(other.featuredAt, featuredAt) || other.featuredAt == featuredAt)&&(identical(other.socialCredits, socialCredits) || other.socialCredits == socialCredits)&&(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,postId,featuredAt,socialCredits,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnPostFeaturedRecord(id: $id, postId: $postId, featuredAt: $featuredAt, socialCredits: $socialCredits, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class _$SnPostFeaturedRecordCopyWith<$Res> implements $SnPostFeaturedRecordCopyWith<$Res> {
|
||||||
|
factory _$SnPostFeaturedRecordCopyWith(_SnPostFeaturedRecord value, $Res Function(_SnPostFeaturedRecord) _then) = __$SnPostFeaturedRecordCopyWithImpl;
|
||||||
|
@override @useResult
|
||||||
|
$Res call({
|
||||||
|
String id, String postId, DateTime? featuredAt, int socialCredits, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class __$SnPostFeaturedRecordCopyWithImpl<$Res>
|
||||||
|
implements _$SnPostFeaturedRecordCopyWith<$Res> {
|
||||||
|
__$SnPostFeaturedRecordCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final _SnPostFeaturedRecord _self;
|
||||||
|
final $Res Function(_SnPostFeaturedRecord) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnPostFeaturedRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? postId = null,Object? featuredAt = freezed,Object? socialCredits = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
|
return _then(_SnPostFeaturedRecord(
|
||||||
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,postId: null == postId ? _self.postId : postId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,featuredAt: freezed == featuredAt ? _self.featuredAt : featuredAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,socialCredits: null == socialCredits ? _self.socialCredits : socialCredits // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// dart format on
|
// dart format on
|
||||||
|
|||||||
@@ -85,6 +85,11 @@ _SnPost _$SnPostFromJson(Map<String, dynamic> json) => _SnPost(
|
|||||||
.toList() ??
|
.toList() ??
|
||||||
const [],
|
const [],
|
||||||
collections: json['collections'] as List<dynamic>? ?? const [],
|
collections: json['collections'] as List<dynamic>? ?? const [],
|
||||||
|
featuredRecords:
|
||||||
|
(json['featured_records'] as List<dynamic>?)
|
||||||
|
?.map((e) => SnPostFeaturedRecord.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
createdAt:
|
createdAt:
|
||||||
json['created_at'] == null
|
json['created_at'] == null
|
||||||
? null
|
? null
|
||||||
@@ -136,6 +141,7 @@ Map<String, dynamic> _$SnPostToJson(_SnPost instance) => <String, dynamic>{
|
|||||||
'tags': instance.tags.map((e) => e.toJson()).toList(),
|
'tags': instance.tags.map((e) => e.toJson()).toList(),
|
||||||
'categories': instance.categories.map((e) => e.toJson()).toList(),
|
'categories': instance.categories.map((e) => e.toJson()).toList(),
|
||||||
'collections': instance.collections,
|
'collections': instance.collections,
|
||||||
|
'featured_records': instance.featuredRecords.map((e) => e.toJson()).toList(),
|
||||||
'created_at': instance.createdAt?.toIso8601String(),
|
'created_at': instance.createdAt?.toIso8601String(),
|
||||||
'updated_at': instance.updatedAt?.toIso8601String(),
|
'updated_at': instance.updatedAt?.toIso8601String(),
|
||||||
'deleted_at': instance.deletedAt?.toIso8601String(),
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
@@ -262,3 +268,33 @@ Map<String, dynamic> _$SnPostReactionToJson(_SnPostReaction instance) =>
|
|||||||
'account': instance.account?.toJson(),
|
'account': instance.account?.toJson(),
|
||||||
'deleted_at': instance.deletedAt?.toIso8601String(),
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_SnPostFeaturedRecord _$SnPostFeaturedRecordFromJson(
|
||||||
|
Map<String, dynamic> json,
|
||||||
|
) => _SnPostFeaturedRecord(
|
||||||
|
id: json['id'] as String,
|
||||||
|
postId: json['post_id'] as String,
|
||||||
|
featuredAt:
|
||||||
|
json['featured_at'] == null
|
||||||
|
? null
|
||||||
|
: DateTime.parse(json['featured_at'] as String),
|
||||||
|
socialCredits: (json['social_credits'] as num).toInt(),
|
||||||
|
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> _$SnPostFeaturedRecordToJson(
|
||||||
|
_SnPostFeaturedRecord instance,
|
||||||
|
) => <String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'post_id': instance.postId,
|
||||||
|
'featured_at': instance.featuredAt?.toIso8601String(),
|
||||||
|
'social_credits': instance.socialCredits,
|
||||||
|
'created_at': instance.createdAt.toIso8601String(),
|
||||||
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
|
};
|
||||||
|
|||||||
@@ -211,3 +211,44 @@ sealed class SnWalletFundRecipient with _$SnWalletFundRecipient {
|
|||||||
factory SnWalletFundRecipient.fromJson(Map<String, dynamic> json) =>
|
factory SnWalletFundRecipient.fromJson(Map<String, dynamic> json) =>
|
||||||
_$SnWalletFundRecipientFromJson(json);
|
_$SnWalletFundRecipientFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
sealed class SnLotteryTicket with _$SnLotteryTicket {
|
||||||
|
const factory SnLotteryTicket({
|
||||||
|
required String id,
|
||||||
|
required String accountId,
|
||||||
|
required SnAccount? account,
|
||||||
|
required List<int> regionOneNumbers,
|
||||||
|
required int regionTwoNumber,
|
||||||
|
required int multiplier,
|
||||||
|
required int drawStatus,
|
||||||
|
required DateTime? drawDate,
|
||||||
|
required List<int>? matchedRegionOneNumbers,
|
||||||
|
required int? matchedRegionTwoNumber,
|
||||||
|
required DateTime createdAt,
|
||||||
|
required DateTime updatedAt,
|
||||||
|
required DateTime? deletedAt,
|
||||||
|
}) = _SnLotteryTicket;
|
||||||
|
|
||||||
|
factory SnLotteryTicket.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SnLotteryTicketFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
sealed class SnLotteryRecord with _$SnLotteryRecord {
|
||||||
|
const factory SnLotteryRecord({
|
||||||
|
required String id,
|
||||||
|
required DateTime drawDate,
|
||||||
|
required List<int> winningRegionOneNumbers,
|
||||||
|
required int winningRegionTwoNumber,
|
||||||
|
required int totalTickets,
|
||||||
|
required int totalPrizesAwarded,
|
||||||
|
required double totalPrizeAmount,
|
||||||
|
required DateTime createdAt,
|
||||||
|
required DateTime updatedAt,
|
||||||
|
required DateTime? deletedAt,
|
||||||
|
}) = _SnLotteryRecord;
|
||||||
|
|
||||||
|
factory SnLotteryRecord.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SnLotteryRecordFromJson(json);
|
||||||
|
}
|
||||||
|
|||||||
@@ -3184,4 +3184,625 @@ $SnAccountCopyWith<$Res>? get recipientAccount {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$SnLotteryTicket {
|
||||||
|
|
||||||
|
String get id; String get accountId; SnAccount? get account; List<int> get regionOneNumbers; int get regionTwoNumber; int get multiplier; int get drawStatus; DateTime? get drawDate; List<int>? get matchedRegionOneNumbers; int? get matchedRegionTwoNumber; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$SnLotteryTicketCopyWith<SnLotteryTicket> get copyWith => _$SnLotteryTicketCopyWithImpl<SnLotteryTicket>(this as SnLotteryTicket, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this SnLotteryTicket to a JSON map.
|
||||||
|
Map<String, dynamic> toJson();
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnLotteryTicket&&(identical(other.id, id) || other.id == id)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&const DeepCollectionEquality().equals(other.regionOneNumbers, regionOneNumbers)&&(identical(other.regionTwoNumber, regionTwoNumber) || other.regionTwoNumber == regionTwoNumber)&&(identical(other.multiplier, multiplier) || other.multiplier == multiplier)&&(identical(other.drawStatus, drawStatus) || other.drawStatus == drawStatus)&&(identical(other.drawDate, drawDate) || other.drawDate == drawDate)&&const DeepCollectionEquality().equals(other.matchedRegionOneNumbers, matchedRegionOneNumbers)&&(identical(other.matchedRegionTwoNumber, matchedRegionTwoNumber) || other.matchedRegionTwoNumber == matchedRegionTwoNumber)&&(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,accountId,account,const DeepCollectionEquality().hash(regionOneNumbers),regionTwoNumber,multiplier,drawStatus,drawDate,const DeepCollectionEquality().hash(matchedRegionOneNumbers),matchedRegionTwoNumber,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnLotteryTicket(id: $id, accountId: $accountId, account: $account, regionOneNumbers: $regionOneNumbers, regionTwoNumber: $regionTwoNumber, multiplier: $multiplier, drawStatus: $drawStatus, drawDate: $drawDate, matchedRegionOneNumbers: $matchedRegionOneNumbers, matchedRegionTwoNumber: $matchedRegionTwoNumber, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class $SnLotteryTicketCopyWith<$Res> {
|
||||||
|
factory $SnLotteryTicketCopyWith(SnLotteryTicket value, $Res Function(SnLotteryTicket) _then) = _$SnLotteryTicketCopyWithImpl;
|
||||||
|
@useResult
|
||||||
|
$Res call({
|
||||||
|
String id, String accountId, SnAccount? account, List<int> regionOneNumbers, int regionTwoNumber, int multiplier, int drawStatus, DateTime? drawDate, List<int>? matchedRegionOneNumbers, int? matchedRegionTwoNumber, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$SnAccountCopyWith<$Res>? get account;
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class _$SnLotteryTicketCopyWithImpl<$Res>
|
||||||
|
implements $SnLotteryTicketCopyWith<$Res> {
|
||||||
|
_$SnLotteryTicketCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final SnLotteryTicket _self;
|
||||||
|
final $Res Function(SnLotteryTicket) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? accountId = null,Object? account = freezed,Object? regionOneNumbers = null,Object? regionTwoNumber = null,Object? multiplier = null,Object? drawStatus = null,Object? drawDate = freezed,Object? matchedRegionOneNumbers = freezed,Object? matchedRegionTwoNumber = 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,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable
|
||||||
|
as SnAccount?,regionOneNumbers: null == regionOneNumbers ? _self.regionOneNumbers : regionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>,regionTwoNumber: null == regionTwoNumber ? _self.regionTwoNumber : regionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,multiplier: null == multiplier ? _self.multiplier : multiplier // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,drawStatus: null == drawStatus ? _self.drawStatus : drawStatus // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,drawDate: freezed == drawDate ? _self.drawDate : drawDate // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,matchedRegionOneNumbers: freezed == matchedRegionOneNumbers ? _self.matchedRegionOneNumbers : matchedRegionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>?,matchedRegionTwoNumber: freezed == matchedRegionTwoNumber ? _self.matchedRegionTwoNumber : matchedRegionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int?,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?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$SnAccountCopyWith<$Res>? get account {
|
||||||
|
if (_self.account == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $SnAccountCopyWith<$Res>(_self.account!, (value) {
|
||||||
|
return _then(_self.copyWith(account: value));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Adds pattern-matching-related methods to [SnLotteryTicket].
|
||||||
|
extension SnLotteryTicketPatterns on SnLotteryTicket {
|
||||||
|
/// 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( _SnLotteryTicket value)? $default,{required TResult orElse(),}){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket() 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( _SnLotteryTicket value) $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket():
|
||||||
|
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( _SnLotteryTicket value)? $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket() 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, SnAccount? account, List<int> regionOneNumbers, int regionTwoNumber, int multiplier, int drawStatus, DateTime? drawDate, List<int>? matchedRegionOneNumbers, int? matchedRegionTwoNumber, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket() when $default != null:
|
||||||
|
return $default(_that.id,_that.accountId,_that.account,_that.regionOneNumbers,_that.regionTwoNumber,_that.multiplier,_that.drawStatus,_that.drawDate,_that.matchedRegionOneNumbers,_that.matchedRegionTwoNumber,_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, SnAccount? account, List<int> regionOneNumbers, int regionTwoNumber, int multiplier, int drawStatus, DateTime? drawDate, List<int>? matchedRegionOneNumbers, int? matchedRegionTwoNumber, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt) $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket():
|
||||||
|
return $default(_that.id,_that.accountId,_that.account,_that.regionOneNumbers,_that.regionTwoNumber,_that.multiplier,_that.drawStatus,_that.drawDate,_that.matchedRegionOneNumbers,_that.matchedRegionTwoNumber,_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, SnAccount? account, List<int> regionOneNumbers, int regionTwoNumber, int multiplier, int drawStatus, DateTime? drawDate, List<int>? matchedRegionOneNumbers, int? matchedRegionTwoNumber, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryTicket() when $default != null:
|
||||||
|
return $default(_that.id,_that.accountId,_that.account,_that.regionOneNumbers,_that.regionTwoNumber,_that.multiplier,_that.drawStatus,_that.drawDate,_that.matchedRegionOneNumbers,_that.matchedRegionTwoNumber,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
|
||||||
|
class _SnLotteryTicket implements SnLotteryTicket {
|
||||||
|
const _SnLotteryTicket({required this.id, required this.accountId, required this.account, required final List<int> regionOneNumbers, required this.regionTwoNumber, required this.multiplier, required this.drawStatus, required this.drawDate, required final List<int>? matchedRegionOneNumbers, required this.matchedRegionTwoNumber, required this.createdAt, required this.updatedAt, required this.deletedAt}): _regionOneNumbers = regionOneNumbers,_matchedRegionOneNumbers = matchedRegionOneNumbers;
|
||||||
|
factory _SnLotteryTicket.fromJson(Map<String, dynamic> json) => _$SnLotteryTicketFromJson(json);
|
||||||
|
|
||||||
|
@override final String id;
|
||||||
|
@override final String accountId;
|
||||||
|
@override final SnAccount? account;
|
||||||
|
final List<int> _regionOneNumbers;
|
||||||
|
@override List<int> get regionOneNumbers {
|
||||||
|
if (_regionOneNumbers is EqualUnmodifiableListView) return _regionOneNumbers;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_regionOneNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override final int regionTwoNumber;
|
||||||
|
@override final int multiplier;
|
||||||
|
@override final int drawStatus;
|
||||||
|
@override final DateTime? drawDate;
|
||||||
|
final List<int>? _matchedRegionOneNumbers;
|
||||||
|
@override List<int>? get matchedRegionOneNumbers {
|
||||||
|
final value = _matchedRegionOneNumbers;
|
||||||
|
if (value == null) return null;
|
||||||
|
if (_matchedRegionOneNumbers is EqualUnmodifiableListView) return _matchedRegionOneNumbers;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override final int? matchedRegionTwoNumber;
|
||||||
|
@override final DateTime createdAt;
|
||||||
|
@override final DateTime updatedAt;
|
||||||
|
@override final DateTime? deletedAt;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$SnLotteryTicketCopyWith<_SnLotteryTicket> get copyWith => __$SnLotteryTicketCopyWithImpl<_SnLotteryTicket>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$SnLotteryTicketToJson(this, );
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnLotteryTicket&&(identical(other.id, id) || other.id == id)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&const DeepCollectionEquality().equals(other._regionOneNumbers, _regionOneNumbers)&&(identical(other.regionTwoNumber, regionTwoNumber) || other.regionTwoNumber == regionTwoNumber)&&(identical(other.multiplier, multiplier) || other.multiplier == multiplier)&&(identical(other.drawStatus, drawStatus) || other.drawStatus == drawStatus)&&(identical(other.drawDate, drawDate) || other.drawDate == drawDate)&&const DeepCollectionEquality().equals(other._matchedRegionOneNumbers, _matchedRegionOneNumbers)&&(identical(other.matchedRegionTwoNumber, matchedRegionTwoNumber) || other.matchedRegionTwoNumber == matchedRegionTwoNumber)&&(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,accountId,account,const DeepCollectionEquality().hash(_regionOneNumbers),regionTwoNumber,multiplier,drawStatus,drawDate,const DeepCollectionEquality().hash(_matchedRegionOneNumbers),matchedRegionTwoNumber,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnLotteryTicket(id: $id, accountId: $accountId, account: $account, regionOneNumbers: $regionOneNumbers, regionTwoNumber: $regionTwoNumber, multiplier: $multiplier, drawStatus: $drawStatus, drawDate: $drawDate, matchedRegionOneNumbers: $matchedRegionOneNumbers, matchedRegionTwoNumber: $matchedRegionTwoNumber, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class _$SnLotteryTicketCopyWith<$Res> implements $SnLotteryTicketCopyWith<$Res> {
|
||||||
|
factory _$SnLotteryTicketCopyWith(_SnLotteryTicket value, $Res Function(_SnLotteryTicket) _then) = __$SnLotteryTicketCopyWithImpl;
|
||||||
|
@override @useResult
|
||||||
|
$Res call({
|
||||||
|
String id, String accountId, SnAccount? account, List<int> regionOneNumbers, int regionTwoNumber, int multiplier, int drawStatus, DateTime? drawDate, List<int>? matchedRegionOneNumbers, int? matchedRegionTwoNumber, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@override $SnAccountCopyWith<$Res>? get account;
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class __$SnLotteryTicketCopyWithImpl<$Res>
|
||||||
|
implements _$SnLotteryTicketCopyWith<$Res> {
|
||||||
|
__$SnLotteryTicketCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final _SnLotteryTicket _self;
|
||||||
|
final $Res Function(_SnLotteryTicket) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? accountId = null,Object? account = freezed,Object? regionOneNumbers = null,Object? regionTwoNumber = null,Object? multiplier = null,Object? drawStatus = null,Object? drawDate = freezed,Object? matchedRegionOneNumbers = freezed,Object? matchedRegionTwoNumber = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
|
return _then(_SnLotteryTicket(
|
||||||
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable
|
||||||
|
as SnAccount?,regionOneNumbers: null == regionOneNumbers ? _self._regionOneNumbers : regionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>,regionTwoNumber: null == regionTwoNumber ? _self.regionTwoNumber : regionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,multiplier: null == multiplier ? _self.multiplier : multiplier // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,drawStatus: null == drawStatus ? _self.drawStatus : drawStatus // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,drawDate: freezed == drawDate ? _self.drawDate : drawDate // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,matchedRegionOneNumbers: freezed == matchedRegionOneNumbers ? _self._matchedRegionOneNumbers : matchedRegionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>?,matchedRegionTwoNumber: freezed == matchedRegionTwoNumber ? _self.matchedRegionTwoNumber : matchedRegionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int?,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?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryTicket
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$SnAccountCopyWith<$Res>? get account {
|
||||||
|
if (_self.account == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $SnAccountCopyWith<$Res>(_self.account!, (value) {
|
||||||
|
return _then(_self.copyWith(account: value));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$SnLotteryRecord {
|
||||||
|
|
||||||
|
String get id; DateTime get drawDate; List<int> get winningRegionOneNumbers; int get winningRegionTwoNumber; int get totalTickets; int get totalPrizesAwarded; double get totalPrizeAmount; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt;
|
||||||
|
/// Create a copy of SnLotteryRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$SnLotteryRecordCopyWith<SnLotteryRecord> get copyWith => _$SnLotteryRecordCopyWithImpl<SnLotteryRecord>(this as SnLotteryRecord, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this SnLotteryRecord to a JSON map.
|
||||||
|
Map<String, dynamic> toJson();
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnLotteryRecord&&(identical(other.id, id) || other.id == id)&&(identical(other.drawDate, drawDate) || other.drawDate == drawDate)&&const DeepCollectionEquality().equals(other.winningRegionOneNumbers, winningRegionOneNumbers)&&(identical(other.winningRegionTwoNumber, winningRegionTwoNumber) || other.winningRegionTwoNumber == winningRegionTwoNumber)&&(identical(other.totalTickets, totalTickets) || other.totalTickets == totalTickets)&&(identical(other.totalPrizesAwarded, totalPrizesAwarded) || other.totalPrizesAwarded == totalPrizesAwarded)&&(identical(other.totalPrizeAmount, totalPrizeAmount) || other.totalPrizeAmount == totalPrizeAmount)&&(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,drawDate,const DeepCollectionEquality().hash(winningRegionOneNumbers),winningRegionTwoNumber,totalTickets,totalPrizesAwarded,totalPrizeAmount,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnLotteryRecord(id: $id, drawDate: $drawDate, winningRegionOneNumbers: $winningRegionOneNumbers, winningRegionTwoNumber: $winningRegionTwoNumber, totalTickets: $totalTickets, totalPrizesAwarded: $totalPrizesAwarded, totalPrizeAmount: $totalPrizeAmount, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class $SnLotteryRecordCopyWith<$Res> {
|
||||||
|
factory $SnLotteryRecordCopyWith(SnLotteryRecord value, $Res Function(SnLotteryRecord) _then) = _$SnLotteryRecordCopyWithImpl;
|
||||||
|
@useResult
|
||||||
|
$Res call({
|
||||||
|
String id, DateTime drawDate, List<int> winningRegionOneNumbers, int winningRegionTwoNumber, int totalTickets, int totalPrizesAwarded, double totalPrizeAmount, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class _$SnLotteryRecordCopyWithImpl<$Res>
|
||||||
|
implements $SnLotteryRecordCopyWith<$Res> {
|
||||||
|
_$SnLotteryRecordCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final SnLotteryRecord _self;
|
||||||
|
final $Res Function(SnLotteryRecord) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? drawDate = null,Object? winningRegionOneNumbers = null,Object? winningRegionTwoNumber = null,Object? totalTickets = null,Object? totalPrizesAwarded = null,Object? totalPrizeAmount = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
|
return _then(_self.copyWith(
|
||||||
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,drawDate: null == drawDate ? _self.drawDate : drawDate // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,winningRegionOneNumbers: null == winningRegionOneNumbers ? _self.winningRegionOneNumbers : winningRegionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>,winningRegionTwoNumber: null == winningRegionTwoNumber ? _self.winningRegionTwoNumber : winningRegionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalTickets: null == totalTickets ? _self.totalTickets : totalTickets // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalPrizesAwarded: null == totalPrizesAwarded ? _self.totalPrizesAwarded : totalPrizesAwarded // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalPrizeAmount: null == totalPrizeAmount ? _self.totalPrizeAmount : totalPrizeAmount // ignore: cast_nullable_to_non_nullable
|
||||||
|
as double,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Adds pattern-matching-related methods to [SnLotteryRecord].
|
||||||
|
extension SnLotteryRecordPatterns on SnLotteryRecord {
|
||||||
|
/// 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( _SnLotteryRecord value)? $default,{required TResult orElse(),}){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord() 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( _SnLotteryRecord value) $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord():
|
||||||
|
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( _SnLotteryRecord value)? $default,){
|
||||||
|
final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord() 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 drawDate, List<int> winningRegionOneNumbers, int winningRegionTwoNumber, int totalTickets, int totalPrizesAwarded, double totalPrizeAmount, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord() when $default != null:
|
||||||
|
return $default(_that.id,_that.drawDate,_that.winningRegionOneNumbers,_that.winningRegionTwoNumber,_that.totalTickets,_that.totalPrizesAwarded,_that.totalPrizeAmount,_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 drawDate, List<int> winningRegionOneNumbers, int winningRegionTwoNumber, int totalTickets, int totalPrizesAwarded, double totalPrizeAmount, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt) $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord():
|
||||||
|
return $default(_that.id,_that.drawDate,_that.winningRegionOneNumbers,_that.winningRegionTwoNumber,_that.totalTickets,_that.totalPrizesAwarded,_that.totalPrizeAmount,_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 drawDate, List<int> winningRegionOneNumbers, int winningRegionTwoNumber, int totalTickets, int totalPrizesAwarded, double totalPrizeAmount, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt)? $default,) {final _that = this;
|
||||||
|
switch (_that) {
|
||||||
|
case _SnLotteryRecord() when $default != null:
|
||||||
|
return $default(_that.id,_that.drawDate,_that.winningRegionOneNumbers,_that.winningRegionTwoNumber,_that.totalTickets,_that.totalPrizesAwarded,_that.totalPrizeAmount,_that.createdAt,_that.updatedAt,_that.deletedAt);case _:
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
|
||||||
|
class _SnLotteryRecord implements SnLotteryRecord {
|
||||||
|
const _SnLotteryRecord({required this.id, required this.drawDate, required final List<int> winningRegionOneNumbers, required this.winningRegionTwoNumber, required this.totalTickets, required this.totalPrizesAwarded, required this.totalPrizeAmount, required this.createdAt, required this.updatedAt, required this.deletedAt}): _winningRegionOneNumbers = winningRegionOneNumbers;
|
||||||
|
factory _SnLotteryRecord.fromJson(Map<String, dynamic> json) => _$SnLotteryRecordFromJson(json);
|
||||||
|
|
||||||
|
@override final String id;
|
||||||
|
@override final DateTime drawDate;
|
||||||
|
final List<int> _winningRegionOneNumbers;
|
||||||
|
@override List<int> get winningRegionOneNumbers {
|
||||||
|
if (_winningRegionOneNumbers is EqualUnmodifiableListView) return _winningRegionOneNumbers;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_winningRegionOneNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override final int winningRegionTwoNumber;
|
||||||
|
@override final int totalTickets;
|
||||||
|
@override final int totalPrizesAwarded;
|
||||||
|
@override final double totalPrizeAmount;
|
||||||
|
@override final DateTime createdAt;
|
||||||
|
@override final DateTime updatedAt;
|
||||||
|
@override final DateTime? deletedAt;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$SnLotteryRecordCopyWith<_SnLotteryRecord> get copyWith => __$SnLotteryRecordCopyWithImpl<_SnLotteryRecord>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$SnLotteryRecordToJson(this, );
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnLotteryRecord&&(identical(other.id, id) || other.id == id)&&(identical(other.drawDate, drawDate) || other.drawDate == drawDate)&&const DeepCollectionEquality().equals(other._winningRegionOneNumbers, _winningRegionOneNumbers)&&(identical(other.winningRegionTwoNumber, winningRegionTwoNumber) || other.winningRegionTwoNumber == winningRegionTwoNumber)&&(identical(other.totalTickets, totalTickets) || other.totalTickets == totalTickets)&&(identical(other.totalPrizesAwarded, totalPrizesAwarded) || other.totalPrizesAwarded == totalPrizesAwarded)&&(identical(other.totalPrizeAmount, totalPrizeAmount) || other.totalPrizeAmount == totalPrizeAmount)&&(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,drawDate,const DeepCollectionEquality().hash(_winningRegionOneNumbers),winningRegionTwoNumber,totalTickets,totalPrizesAwarded,totalPrizeAmount,createdAt,updatedAt,deletedAt);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnLotteryRecord(id: $id, drawDate: $drawDate, winningRegionOneNumbers: $winningRegionOneNumbers, winningRegionTwoNumber: $winningRegionTwoNumber, totalTickets: $totalTickets, totalPrizesAwarded: $totalPrizesAwarded, totalPrizeAmount: $totalPrizeAmount, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract mixin class _$SnLotteryRecordCopyWith<$Res> implements $SnLotteryRecordCopyWith<$Res> {
|
||||||
|
factory _$SnLotteryRecordCopyWith(_SnLotteryRecord value, $Res Function(_SnLotteryRecord) _then) = __$SnLotteryRecordCopyWithImpl;
|
||||||
|
@override @useResult
|
||||||
|
$Res call({
|
||||||
|
String id, DateTime drawDate, List<int> winningRegionOneNumbers, int winningRegionTwoNumber, int totalTickets, int totalPrizesAwarded, double totalPrizeAmount, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/// @nodoc
|
||||||
|
class __$SnLotteryRecordCopyWithImpl<$Res>
|
||||||
|
implements _$SnLotteryRecordCopyWith<$Res> {
|
||||||
|
__$SnLotteryRecordCopyWithImpl(this._self, this._then);
|
||||||
|
|
||||||
|
final _SnLotteryRecord _self;
|
||||||
|
final $Res Function(_SnLotteryRecord) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnLotteryRecord
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? drawDate = null,Object? winningRegionOneNumbers = null,Object? winningRegionTwoNumber = null,Object? totalTickets = null,Object? totalPrizesAwarded = null,Object? totalPrizeAmount = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) {
|
||||||
|
return _then(_SnLotteryRecord(
|
||||||
|
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,drawDate: null == drawDate ? _self.drawDate : drawDate // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,winningRegionOneNumbers: null == winningRegionOneNumbers ? _self._winningRegionOneNumbers : winningRegionOneNumbers // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<int>,winningRegionTwoNumber: null == winningRegionTwoNumber ? _self.winningRegionTwoNumber : winningRegionTwoNumber // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalTickets: null == totalTickets ? _self.totalTickets : totalTickets // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalPrizesAwarded: null == totalPrizesAwarded ? _self.totalPrizesAwarded : totalPrizesAwarded // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,totalPrizeAmount: null == totalPrizeAmount ? _self.totalPrizeAmount : totalPrizeAmount // ignore: cast_nullable_to_non_nullable
|
||||||
|
as double,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable
|
||||||
|
as DateTime?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// dart format on
|
// dart format on
|
||||||
|
|||||||
@@ -414,3 +414,88 @@ Map<String, dynamic> _$SnWalletFundRecipientToJson(
|
|||||||
'updated_at': instance.updatedAt.toIso8601String(),
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
'deleted_at': instance.deletedAt?.toIso8601String(),
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_SnLotteryTicket _$SnLotteryTicketFromJson(Map<String, dynamic> json) =>
|
||||||
|
_SnLotteryTicket(
|
||||||
|
id: json['id'] as String,
|
||||||
|
accountId: json['account_id'] as String,
|
||||||
|
account:
|
||||||
|
json['account'] == null
|
||||||
|
? null
|
||||||
|
: SnAccount.fromJson(json['account'] as Map<String, dynamic>),
|
||||||
|
regionOneNumbers:
|
||||||
|
(json['region_one_numbers'] as List<dynamic>)
|
||||||
|
.map((e) => (e as num).toInt())
|
||||||
|
.toList(),
|
||||||
|
regionTwoNumber: (json['region_two_number'] as num).toInt(),
|
||||||
|
multiplier: (json['multiplier'] as num).toInt(),
|
||||||
|
drawStatus: (json['draw_status'] as num).toInt(),
|
||||||
|
drawDate:
|
||||||
|
json['draw_date'] == null
|
||||||
|
? null
|
||||||
|
: DateTime.parse(json['draw_date'] as String),
|
||||||
|
matchedRegionOneNumbers:
|
||||||
|
(json['matched_region_one_numbers'] as List<dynamic>?)
|
||||||
|
?.map((e) => (e as num).toInt())
|
||||||
|
.toList(),
|
||||||
|
matchedRegionTwoNumber:
|
||||||
|
(json['matched_region_two_number'] as num?)?.toInt(),
|
||||||
|
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> _$SnLotteryTicketToJson(_SnLotteryTicket instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'account_id': instance.accountId,
|
||||||
|
'account': instance.account?.toJson(),
|
||||||
|
'region_one_numbers': instance.regionOneNumbers,
|
||||||
|
'region_two_number': instance.regionTwoNumber,
|
||||||
|
'multiplier': instance.multiplier,
|
||||||
|
'draw_status': instance.drawStatus,
|
||||||
|
'draw_date': instance.drawDate?.toIso8601String(),
|
||||||
|
'matched_region_one_numbers': instance.matchedRegionOneNumbers,
|
||||||
|
'matched_region_two_number': instance.matchedRegionTwoNumber,
|
||||||
|
'created_at': instance.createdAt.toIso8601String(),
|
||||||
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
|
};
|
||||||
|
|
||||||
|
_SnLotteryRecord _$SnLotteryRecordFromJson(Map<String, dynamic> json) =>
|
||||||
|
_SnLotteryRecord(
|
||||||
|
id: json['id'] as String,
|
||||||
|
drawDate: DateTime.parse(json['draw_date'] as String),
|
||||||
|
winningRegionOneNumbers:
|
||||||
|
(json['winning_region_one_numbers'] as List<dynamic>)
|
||||||
|
.map((e) => (e as num).toInt())
|
||||||
|
.toList(),
|
||||||
|
winningRegionTwoNumber:
|
||||||
|
(json['winning_region_two_number'] as num).toInt(),
|
||||||
|
totalTickets: (json['total_tickets'] as num).toInt(),
|
||||||
|
totalPrizesAwarded: (json['total_prizes_awarded'] as num).toInt(),
|
||||||
|
totalPrizeAmount: (json['total_prize_amount'] as num).toDouble(),
|
||||||
|
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> _$SnLotteryRecordToJson(_SnLotteryRecord instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'draw_date': instance.drawDate.toIso8601String(),
|
||||||
|
'winning_region_one_numbers': instance.winningRegionOneNumbers,
|
||||||
|
'winning_region_two_number': instance.winningRegionTwoNumber,
|
||||||
|
'total_tickets': instance.totalTickets,
|
||||||
|
'total_prizes_awarded': instance.totalPrizesAwarded,
|
||||||
|
'total_prize_amount': instance.totalPrizeAmount,
|
||||||
|
'created_at': instance.createdAt.toIso8601String(),
|
||||||
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
|
};
|
||||||
|
|||||||
@@ -433,7 +433,7 @@ Future<void> setRemoteActivityStatus(
|
|||||||
) async {
|
) async {
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.post(
|
await apiClient.post(
|
||||||
'/id/accounts/me/statuses',
|
'/pass/accounts/me/statuses',
|
||||||
data: {
|
data: {
|
||||||
'is_invisible': false,
|
'is_invisible': false,
|
||||||
'is_not_disturb': false,
|
'is_not_disturb': false,
|
||||||
@@ -448,7 +448,7 @@ Future<void> setRemoteActivityStatus(
|
|||||||
Future<void> unsetRemoteActivityStatus(Ref ref, String appId) async {
|
Future<void> unsetRemoteActivityStatus(Ref ref, String appId) async {
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.delete(
|
await apiClient.delete(
|
||||||
'/id/accounts/me/statuses',
|
'/pass/accounts/me/statuses',
|
||||||
queryParameters: {'app': appId},
|
queryParameters: {'app': appId},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'messages_notifier.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$messagesNotifierHash() => r'639286fd8e4e0cfdef5be6cf5d80eea769007cb3';
|
String _$messagesNotifierHash() => r'6adefd9152cdd686c2a863964993f24c42d405b5';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ const kAppDefaultPoolId = 'app_default_pool_id';
|
|||||||
const kAppMessageDisplayStyle = 'app_message_display_style';
|
const kAppMessageDisplayStyle = 'app_message_display_style';
|
||||||
const kAppThemeMode = 'app_theme_mode';
|
const kAppThemeMode = 'app_theme_mode';
|
||||||
const kMaterialYouToggleStoreKey = 'app_theme_material_you';
|
const kMaterialYouToggleStoreKey = 'app_theme_material_you';
|
||||||
|
const kAppDisableAnimation = 'app_disable_animation';
|
||||||
const kFeaturedPostsCollapsedId =
|
const kFeaturedPostsCollapsedId =
|
||||||
'featured_posts_collapsed_id'; // Key for storing the ID of the collapsed featured post
|
'featured_posts_collapsed_id'; // Key for storing the ID of the collapsed featured post
|
||||||
|
|
||||||
@@ -96,6 +97,7 @@ sealed class AppSettings with _$AppSettings {
|
|||||||
required String messageDisplayStyle,
|
required String messageDisplayStyle,
|
||||||
required String? themeMode,
|
required String? themeMode,
|
||||||
required bool useMaterial3,
|
required bool useMaterial3,
|
||||||
|
required bool disableAnimation,
|
||||||
}) = _AppSettings;
|
}) = _AppSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +124,7 @@ class AppSettingsNotifier extends _$AppSettingsNotifier {
|
|||||||
messageDisplayStyle: prefs.getString(kAppMessageDisplayStyle) ?? 'bubble',
|
messageDisplayStyle: prefs.getString(kAppMessageDisplayStyle) ?? 'bubble',
|
||||||
themeMode: prefs.getString(kAppThemeMode) ?? 'system',
|
themeMode: prefs.getString(kAppThemeMode) ?? 'system',
|
||||||
useMaterial3: prefs.getBool(kMaterialYouToggleStoreKey) ?? true,
|
useMaterial3: prefs.getBool(kMaterialYouToggleStoreKey) ?? true,
|
||||||
|
disableAnimation: prefs.getBool(kAppDisableAnimation) ?? false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,6 +276,12 @@ class AppSettingsNotifier extends _$AppSettingsNotifier {
|
|||||||
}
|
}
|
||||||
state = state.copyWith(customColors: value);
|
state = state.copyWith(customColors: value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDisableAnimation(bool value) {
|
||||||
|
final prefs = ref.read(sharedPreferencesProvider);
|
||||||
|
prefs.setBool(kAppDisableAnimation, value);
|
||||||
|
state = state.copyWith(disableAnimation: value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final updateInfoProvider =
|
final updateInfoProvider =
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ mixin _$AppSettings {
|
|||||||
ThemeColors? get customColors; Size? get windowSize;// The window size for desktop platforms
|
ThemeColors? get customColors; Size? get windowSize;// The window size for desktop platforms
|
||||||
double get windowOpacity;// The window opacity for desktop platforms
|
double get windowOpacity;// The window opacity for desktop platforms
|
||||||
double get cardTransparency;// The card background opacity
|
double get cardTransparency;// The card background opacity
|
||||||
String? get defaultPoolId; String get messageDisplayStyle; String? get themeMode; bool get useMaterial3;
|
String? get defaultPoolId; String get messageDisplayStyle; String? get themeMode; bool get useMaterial3; bool get disableAnimation;
|
||||||
/// Create a copy of AppSettings
|
/// Create a copy of AppSettings
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@@ -301,16 +301,16 @@ $AppSettingsCopyWith<AppSettings> get copyWith => _$AppSettingsCopyWithImpl<AppS
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.customColors, customColors) || other.customColors == customColors)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.cardTransparency, cardTransparency) || other.cardTransparency == cardTransparency)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)&&(identical(other.useMaterial3, useMaterial3) || other.useMaterial3 == useMaterial3));
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.customColors, customColors) || other.customColors == customColors)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.cardTransparency, cardTransparency) || other.cardTransparency == cardTransparency)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)&&(identical(other.useMaterial3, useMaterial3) || other.useMaterial3 == useMaterial3)&&(identical(other.disableAnimation, disableAnimation) || other.disableAnimation == disableAnimation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,customColors,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3);
|
int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,customColors,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3,disableAnimation);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, customColors: $customColors, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3)';
|
return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, customColors: $customColors, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3, disableAnimation: $disableAnimation)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -321,7 +321,7 @@ abstract mixin class $AppSettingsCopyWith<$Res> {
|
|||||||
factory $AppSettingsCopyWith(AppSettings value, $Res Function(AppSettings) _then) = _$AppSettingsCopyWithImpl;
|
factory $AppSettingsCopyWith(AppSettings value, $Res Function(AppSettings) _then) = _$AppSettingsCopyWithImpl;
|
||||||
@useResult
|
@useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3
|
bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3, bool disableAnimation
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ class _$AppSettingsCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of AppSettings
|
/// Create a copy of AppSettings
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? customColors = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,}) {
|
@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? customColors = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,Object? disableAnimation = null,}) {
|
||||||
return _then(_self.copyWith(
|
return _then(_self.copyWith(
|
||||||
autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable
|
autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable
|
as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -357,6 +357,7 @@ as double,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaul
|
|||||||
as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable
|
as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable
|
||||||
as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable
|
as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable
|
||||||
as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable
|
as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,disableAnimation: null == disableAnimation ? _self.disableAnimation : disableAnimation // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -451,10 +452,10 @@ return $default(_that);case _:
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3)? $default,{required TResult orElse(),}) {final _that = this;
|
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3, bool disableAnimation)? $default,{required TResult orElse(),}) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _AppSettings() when $default != null:
|
case _AppSettings() when $default != null:
|
||||||
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);case _:
|
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3,_that.disableAnimation);case _:
|
||||||
return orElse();
|
return orElse();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -472,10 +473,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3) $default,) {final _that = this;
|
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3, bool disableAnimation) $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _AppSettings():
|
case _AppSettings():
|
||||||
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);}
|
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3,_that.disableAnimation);}
|
||||||
}
|
}
|
||||||
/// A variant of `when` that fallback to returning `null`
|
/// A variant of `when` that fallback to returning `null`
|
||||||
///
|
///
|
||||||
@@ -489,10 +490,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3)? $default,) {final _that = this;
|
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3, bool disableAnimation)? $default,) {final _that = this;
|
||||||
switch (_that) {
|
switch (_that) {
|
||||||
case _AppSettings() when $default != null:
|
case _AppSettings() when $default != null:
|
||||||
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3);case _:
|
return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.customColors,_that.windowSize,_that.windowOpacity,_that.cardTransparency,_that.defaultPoolId,_that.messageDisplayStyle,_that.themeMode,_that.useMaterial3,_that.disableAnimation);case _:
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -504,7 +505,7 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha
|
|||||||
|
|
||||||
|
|
||||||
class _AppSettings implements AppSettings {
|
class _AppSettings implements AppSettings {
|
||||||
const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.customColors, required this.windowSize, required this.windowOpacity, required this.cardTransparency, required this.defaultPoolId, required this.messageDisplayStyle, required this.themeMode, required this.useMaterial3});
|
const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.customColors, required this.windowSize, required this.windowOpacity, required this.cardTransparency, required this.defaultPoolId, required this.messageDisplayStyle, required this.themeMode, required this.useMaterial3, required this.disableAnimation});
|
||||||
|
|
||||||
|
|
||||||
@override final bool autoTranslate;
|
@override final bool autoTranslate;
|
||||||
@@ -528,6 +529,7 @@ class _AppSettings implements AppSettings {
|
|||||||
@override final String messageDisplayStyle;
|
@override final String messageDisplayStyle;
|
||||||
@override final String? themeMode;
|
@override final String? themeMode;
|
||||||
@override final bool useMaterial3;
|
@override final bool useMaterial3;
|
||||||
|
@override final bool disableAnimation;
|
||||||
|
|
||||||
/// Create a copy of AppSettings
|
/// Create a copy of AppSettings
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -539,16 +541,16 @@ _$AppSettingsCopyWith<_AppSettings> get copyWith => __$AppSettingsCopyWithImpl<_
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.customColors, customColors) || other.customColors == customColors)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.cardTransparency, cardTransparency) || other.cardTransparency == cardTransparency)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)&&(identical(other.useMaterial3, useMaterial3) || other.useMaterial3 == useMaterial3));
|
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.customColors, customColors) || other.customColors == customColors)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.windowOpacity, windowOpacity) || other.windowOpacity == windowOpacity)&&(identical(other.cardTransparency, cardTransparency) || other.cardTransparency == cardTransparency)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)&&(identical(other.themeMode, themeMode) || other.themeMode == themeMode)&&(identical(other.useMaterial3, useMaterial3) || other.useMaterial3 == useMaterial3)&&(identical(other.disableAnimation, disableAnimation) || other.disableAnimation == disableAnimation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,customColors,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3);
|
int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,customColors,windowSize,windowOpacity,cardTransparency,defaultPoolId,messageDisplayStyle,themeMode,useMaterial3,disableAnimation);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, customColors: $customColors, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3)';
|
return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, customColors: $customColors, windowSize: $windowSize, windowOpacity: $windowOpacity, cardTransparency: $cardTransparency, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle, themeMode: $themeMode, useMaterial3: $useMaterial3, disableAnimation: $disableAnimation)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -559,7 +561,7 @@ abstract mixin class _$AppSettingsCopyWith<$Res> implements $AppSettingsCopyWith
|
|||||||
factory _$AppSettingsCopyWith(_AppSettings value, $Res Function(_AppSettings) _then) = __$AppSettingsCopyWithImpl;
|
factory _$AppSettingsCopyWith(_AppSettings value, $Res Function(_AppSettings) _then) = __$AppSettingsCopyWithImpl;
|
||||||
@override @useResult
|
@override @useResult
|
||||||
$Res call({
|
$Res call({
|
||||||
bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3
|
bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, ThemeColors? customColors, Size? windowSize, double windowOpacity, double cardTransparency, String? defaultPoolId, String messageDisplayStyle, String? themeMode, bool useMaterial3, bool disableAnimation
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -576,7 +578,7 @@ class __$AppSettingsCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// Create a copy of AppSettings
|
/// Create a copy of AppSettings
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? customColors = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,}) {
|
@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? customColors = freezed,Object? windowSize = freezed,Object? windowOpacity = null,Object? cardTransparency = null,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,Object? themeMode = freezed,Object? useMaterial3 = null,Object? disableAnimation = null,}) {
|
||||||
return _then(_AppSettings(
|
return _then(_AppSettings(
|
||||||
autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable
|
autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable
|
as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -595,6 +597,7 @@ as double,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaul
|
|||||||
as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable
|
as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable
|
||||||
as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable
|
as String,themeMode: freezed == themeMode ? _self.themeMode : themeMode // ignore: cast_nullable_to_non_nullable
|
||||||
as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable
|
as String?,useMaterial3: null == useMaterial3 ? _self.useMaterial3 : useMaterial3 // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,disableAnimation: null == disableAnimation ? _self.disableAnimation : disableAnimation // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ Map<String, dynamic> _$ThemeColorsToJson(_ThemeColors instance) =>
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$appSettingsNotifierHash() =>
|
String _$appSettingsNotifierHash() =>
|
||||||
r'3ba2cdce76f3c4fed84f4108341c88a0a971bf3a';
|
r'10ebd893c39d24ae588a4c0bf4144ee4656465a4';
|
||||||
|
|
||||||
/// See also [AppSettingsNotifier].
|
/// See also [AppSettingsNotifier].
|
||||||
@ProviderFor(AppSettingsNotifier)
|
@ProviderFor(AppSettingsNotifier)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Future<List<SnEventCalendarEntry>> eventCalendar(
|
|||||||
) async {
|
) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get(
|
final resp = await client.get(
|
||||||
'/id/accounts/${query.uname ?? 'me'}/calendar',
|
'/pass/accounts/${query.uname ?? 'me'}/calendar',
|
||||||
queryParameters: {'year': query.year, 'month': query.month},
|
queryParameters: {'year': query.year, 'month': query.month},
|
||||||
);
|
);
|
||||||
return resp.data
|
return resp.data
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'event_calendar.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$eventCalendarHash() => r'72232fc044ac3c99b855dca37ff2f06a64be0afb';
|
String _$eventCalendarHash() => r'3a33581c28bcd44bc5eb3abdb770171b4d275a5d';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:dio_smart_retry/dio_smart_retry.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
@@ -109,6 +110,16 @@ final apiClientProvider = Provider<Dio>((ref) {
|
|||||||
printResponseData: false,
|
printResponseData: false,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
RetryInterceptor(
|
||||||
|
dio: dio,
|
||||||
|
retries: 3,
|
||||||
|
retryDelays: const [
|
||||||
|
Duration(milliseconds: 300),
|
||||||
|
Duration(milliseconds: 500),
|
||||||
|
Duration(milliseconds: 1000),
|
||||||
|
],
|
||||||
|
retryEvaluator: (err, _) => err.requestOptions.method == 'GET',
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return dio;
|
return dio;
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ ThemeData createAppTheme(Brightness brightness, AppSettings settings) {
|
|||||||
color: colorScheme.surfaceContainer.withOpacity(
|
color: colorScheme.surfaceContainer.withOpacity(
|
||||||
settings.cardTransparency,
|
settings.cardTransparency,
|
||||||
),
|
),
|
||||||
|
elevation: settings.cardTransparency < 1 ? 0 : null,
|
||||||
),
|
),
|
||||||
pageTransitionsTheme: PageTransitionsTheme(
|
pageTransitionsTheme: PageTransitionsTheme(
|
||||||
builders: {
|
builders: {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class UserInfoNotifier extends StateNotifier<AsyncValue<SnAccount?>> {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
final client = _ref.read(apiClientProvider);
|
final client = _ref.read(apiClientProvider);
|
||||||
final response = await client.get('/id/accounts/me');
|
final response = await client.get('/pass/accounts/me');
|
||||||
final user = SnAccount.fromJson(response.data);
|
final user = SnAccount.fromJson(response.data);
|
||||||
state = AsyncValue.data(user);
|
state = AsyncValue.data(user);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import 'package:island/screens/tabs.dart';
|
|||||||
import 'package:island/screens/explore.dart';
|
import 'package:island/screens/explore.dart';
|
||||||
import 'package:island/screens/discovery/article_detail.dart';
|
import 'package:island/screens/discovery/article_detail.dart';
|
||||||
import 'package:island/screens/account.dart';
|
import 'package:island/screens/account.dart';
|
||||||
import 'package:island/screens/notification.dart';
|
|
||||||
import 'package:island/screens/wallet.dart';
|
import 'package:island/screens/wallet.dart';
|
||||||
import 'package:island/screens/account/relationship.dart';
|
import 'package:island/screens/account/relationship.dart';
|
||||||
import 'package:island/screens/account/profile.dart';
|
import 'package:island/screens/account/profile.dart';
|
||||||
@@ -58,7 +57,6 @@ import 'package:island/screens/settings.dart';
|
|||||||
import 'package:island/screens/realm/realms.dart';
|
import 'package:island/screens/realm/realms.dart';
|
||||||
import 'package:island/screens/realm/realm_form.dart';
|
import 'package:island/screens/realm/realm_form.dart';
|
||||||
import 'package:island/screens/realm/realm_detail.dart';
|
import 'package:island/screens/realm/realm_detail.dart';
|
||||||
import 'package:island/screens/account/event_calendar.dart';
|
|
||||||
import 'package:island/screens/discovery/realms.dart';
|
import 'package:island/screens/discovery/realms.dart';
|
||||||
import 'package:island/screens/reports/report_detail.dart';
|
import 'package:island/screens/reports/report_detail.dart';
|
||||||
import 'package:island/screens/reports/report_list.dart';
|
import 'package:island/screens/reports/report_list.dart';
|
||||||
@@ -138,14 +136,6 @@ final routerProvider = Provider<GoRouter>((ref) {
|
|||||||
path: '/logs',
|
path: '/logs',
|
||||||
builder: (context, state) => TalkerScreen(talker: talker),
|
builder: (context, state) => TalkerScreen(talker: talker),
|
||||||
),
|
),
|
||||||
GoRoute(
|
|
||||||
name: 'accountCalendar',
|
|
||||||
path: '/account/:name/calendar',
|
|
||||||
builder: (context, state) {
|
|
||||||
final name = state.pathParameters['name']!;
|
|
||||||
return EventCalanderScreen(name: name);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
|
|
||||||
// Web articles
|
// Web articles
|
||||||
GoRoute(
|
GoRoute(
|
||||||
@@ -401,11 +391,6 @@ final routerProvider = Provider<GoRouter>((ref) {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
GoRoute(
|
|
||||||
name: 'notifications',
|
|
||||||
path: '/account/notifications',
|
|
||||||
builder: (context, state) => const NotificationScreen(),
|
|
||||||
),
|
|
||||||
GoRoute(
|
GoRoute(
|
||||||
name: 'wallet',
|
name: 'wallet',
|
||||||
path: '/account/wallet',
|
path: '/account/wallet',
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ class AccountScreen extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
).padding(horizontal: 16, vertical: 12),
|
).padding(horizontal: 16, vertical: 12),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.pushNamed('developerHub');
|
context.goNamed('developerHub');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
).height(140),
|
).height(140),
|
||||||
@@ -282,7 +282,12 @@ class AccountScreen extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.pushNamed('notifications');
|
showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
isScrollControlled: true,
|
||||||
|
useRootNavigator: true,
|
||||||
|
builder: (context) => const NotificationSheet(),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
@@ -378,7 +383,7 @@ class AccountScreen extends HookConsumerWidget {
|
|||||||
onTap: () async {
|
onTap: () async {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
await apiClient.delete('/id/accounts/me/sessions/current');
|
await apiClient.delete('/pass/accounts/me/sessions/current');
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
hideLoadingModal(context);
|
hideLoadingModal(context);
|
||||||
final userNotifier = ref.read(userInfoProvider.notifier);
|
final userNotifier = ref.read(userInfoProvider.notifier);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ part 'credits.g.dart';
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<double> socialCredits(Ref ref) async {
|
Future<double> socialCredits(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final response = await client.get('/id/accounts/me/credits');
|
final response = await client.get('/pass/accounts/me/credits');
|
||||||
if (response.statusCode != 200) {
|
if (response.statusCode != 200) {
|
||||||
throw Exception('Failed to load social credits');
|
throw Exception('Failed to load social credits');
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ class SocialCreditHistoryNotifier extends _$SocialCreditHistoryNotifier
|
|||||||
final queryParams = {'offset': offset, 'take': _pageSize};
|
final queryParams = {'offset': offset, 'take': _pageSize};
|
||||||
|
|
||||||
final response = await client.get(
|
final response = await client.get(
|
||||||
'/id/accounts/me/credits/history',
|
'/pass/accounts/me/credits/history',
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams,
|
||||||
);
|
);
|
||||||
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'credits.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$socialCreditsHash() => r'2599844e892127ee4d315caced5c10e4dbaea142';
|
String _$socialCreditsHash() => r'a0284583e94bc97285c689ac2bc018536932da69';
|
||||||
|
|
||||||
/// See also [socialCredits].
|
/// See also [socialCredits].
|
||||||
@ProviderFor(socialCredits)
|
@ProviderFor(socialCredits)
|
||||||
@@ -25,7 +25,7 @@ final socialCreditsProvider = AutoDisposeFutureProvider<double>.internal(
|
|||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef SocialCreditsRef = AutoDisposeFutureProviderRef<double>;
|
typedef SocialCreditsRef = AutoDisposeFutureProviderRef<double>;
|
||||||
String _$socialCreditHistoryNotifierHash() =>
|
String _$socialCreditHistoryNotifierHash() =>
|
||||||
r'950db020754160f835c64cedf3fa2175e61e4d64';
|
r'3e87af246cc5dc72a1f3a87b81d1c87169bdfb5b';
|
||||||
|
|
||||||
/// See also [SocialCreditHistoryNotifier].
|
/// See also [SocialCreditHistoryNotifier].
|
||||||
@ProviderFor(SocialCreditHistoryNotifier)
|
@ProviderFor(SocialCreditHistoryNotifier)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class LevelingHistoryNotifier extends _$LevelingHistoryNotifier
|
|||||||
final queryParams = {'offset': offset, 'take': _pageSize};
|
final queryParams = {'offset': offset, 'take': _pageSize};
|
||||||
|
|
||||||
final response = await client.get(
|
final response = await client.get(
|
||||||
'/id/accounts/me/leveling',
|
'/pass/accounts/me/leveling',
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams,
|
||||||
);
|
);
|
||||||
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ part of 'leveling.dart';
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$levelingHistoryNotifierHash() =>
|
String _$levelingHistoryNotifierHash() =>
|
||||||
r'e795f9b7911c9e50f15c095ea237cb0e87bf1e89';
|
r'de51012e1590ac46388b6f3f2050b21cb96698d1';
|
||||||
|
|
||||||
/// See also [LevelingHistoryNotifier].
|
/// See also [LevelingHistoryNotifier].
|
||||||
@ProviderFor(LevelingHistoryNotifier)
|
@ProviderFor(LevelingHistoryNotifier)
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ part 'account_settings.g.dart';
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnAuthFactor>> authFactors(Ref ref) async {
|
Future<List<SnAuthFactor>> authFactors(Ref ref) async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
final res = await client.get('/id/accounts/me/factors');
|
final res = await client.get('/pass/accounts/me/factors');
|
||||||
return res.data.map<SnAuthFactor>((e) => SnAuthFactor.fromJson(e)).toList();
|
return res.data.map<SnAuthFactor>((e) => SnAuthFactor.fromJson(e)).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnContactMethod>> contactMethods(Ref ref) async {
|
Future<List<SnContactMethod>> contactMethods(Ref ref) async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
final resp = await client.get('/id/accounts/me/contacts');
|
final resp = await client.get('/pass/accounts/me/contacts');
|
||||||
return resp.data
|
return resp.data
|
||||||
.map<SnContactMethod>((e) => SnContactMethod.fromJson(e))
|
.map<SnContactMethod>((e) => SnContactMethod.fromJson(e))
|
||||||
.toList();
|
.toList();
|
||||||
@@ -44,7 +44,7 @@ Future<List<SnContactMethod>> contactMethods(Ref ref) async {
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnAccountConnection>> accountConnections(Ref ref) async {
|
Future<List<SnAccountConnection>> accountConnections(Ref ref) async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
final resp = await client.get('/id/accounts/me/connections');
|
final resp = await client.get('/pass/accounts/me/connections');
|
||||||
return resp.data
|
return resp.data
|
||||||
.map<SnAccountConnection>((e) => SnAccountConnection.fromJson(e))
|
.map<SnAccountConnection>((e) => SnAccountConnection.fromJson(e))
|
||||||
.toList();
|
.toList();
|
||||||
@@ -67,7 +67,7 @@ class AccountSettingsScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/accounts/me');
|
await client.delete('/pass/accounts/me');
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
showSnackBar('accountDeletionSent'.tr());
|
showSnackBar('accountDeletionSent'.tr());
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ class AccountSettingsScreen extends HookConsumerWidget {
|
|||||||
final userInfo = ref.read(userInfoProvider);
|
final userInfo = ref.read(userInfoProvider);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/accounts/recovery/password',
|
'/pass/accounts/recovery/password',
|
||||||
data: {'account': userInfo.value!.name, 'captcha_token': captchaTk},
|
data: {'account': userInfo.value!.name, 'captcha_token': captchaTk},
|
||||||
);
|
);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'account_settings.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$authFactorsHash() => r'24fe2f7b375b019d87fc3b85cbedbe857f399c0f';
|
String _$authFactorsHash() => r'ed87d7dbd421fef0a5620416727c3dc598c97ef5';
|
||||||
|
|
||||||
/// See also [authFactors].
|
/// See also [authFactors].
|
||||||
@ProviderFor(authFactors)
|
@ProviderFor(authFactors)
|
||||||
@@ -25,7 +25,7 @@ final authFactorsProvider =
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef AuthFactorsRef = AutoDisposeFutureProviderRef<List<SnAuthFactor>>;
|
typedef AuthFactorsRef = AutoDisposeFutureProviderRef<List<SnAuthFactor>>;
|
||||||
String _$contactMethodsHash() => r'76a1a93f61c51c44b32b4821f5112d58406155f0';
|
String _$contactMethodsHash() => r'1d3d03e9ffbf36126236558ead22cb7d88bb9cb2';
|
||||||
|
|
||||||
/// See also [contactMethods].
|
/// See also [contactMethods].
|
||||||
@ProviderFor(contactMethods)
|
@ProviderFor(contactMethods)
|
||||||
@@ -45,7 +45,7 @@ final contactMethodsProvider =
|
|||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef ContactMethodsRef = AutoDisposeFutureProviderRef<List<SnContactMethod>>;
|
typedef ContactMethodsRef = AutoDisposeFutureProviderRef<List<SnContactMethod>>;
|
||||||
String _$accountConnectionsHash() =>
|
String _$accountConnectionsHash() =>
|
||||||
r'9f69e7f23e3e53c528d38b93d76f0c9efc9a83db';
|
r'33c10b98962ede6c428d4028c0d5f2f12ff0eb22';
|
||||||
|
|
||||||
/// See also [accountConnections].
|
/// See also [accountConnections].
|
||||||
@ProviderFor(accountConnections)
|
@ProviderFor(accountConnections)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import 'package:island/pods/userinfo.dart';
|
|||||||
import 'package:island/services/file.dart';
|
import 'package:island/services/file.dart';
|
||||||
import 'package:island/services/file_uploader.dart';
|
import 'package:island/services/file_uploader.dart';
|
||||||
import 'package:island/services/timezone.dart';
|
import 'package:island/services/timezone.dart';
|
||||||
|
import 'package:island/widgets/account/account_name.dart';
|
||||||
import 'package:island/widgets/alert.dart';
|
import 'package:island/widgets/alert.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
@@ -24,6 +25,17 @@ const kServerSupportedLanguages = {'en-US': 'en-us', 'zh-CN': 'zh-hans'};
|
|||||||
const kServerSupportedRegions = ['US', 'JP', 'CN'];
|
const kServerSupportedRegions = ['US', 'JP', 'CN'];
|
||||||
|
|
||||||
class UpdateProfileScreen extends HookConsumerWidget {
|
class UpdateProfileScreen extends HookConsumerWidget {
|
||||||
|
bool _isValidHexColor(String color) {
|
||||||
|
if (!color.startsWith('#')) return false;
|
||||||
|
if (color.length != 7) return false; // #RRGGBB format
|
||||||
|
try {
|
||||||
|
int.parse(color.substring(1), radix: 16);
|
||||||
|
return true;
|
||||||
|
} catch (_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const UpdateProfileScreen({super.key});
|
const UpdateProfileScreen({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -75,7 +87,7 @@ class UpdateProfileScreen extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.patch(
|
await client.patch(
|
||||||
'/id/accounts/me/profile',
|
'/pass/accounts/me/profile',
|
||||||
data: {'${position}_id': cloudFile.id},
|
data: {'${position}_id': cloudFile.id},
|
||||||
);
|
);
|
||||||
final userNotifier = ref.read(userInfoProvider.notifier);
|
final userNotifier = ref.read(userInfoProvider.notifier);
|
||||||
@@ -102,7 +114,7 @@ class UpdateProfileScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.patch(
|
await client.patch(
|
||||||
'/id/accounts/me',
|
'/pass/accounts/me',
|
||||||
data: {
|
data: {
|
||||||
'name': usernameController.text,
|
'name': usernameController.text,
|
||||||
'nick': nicknameController.text,
|
'nick': nicknameController.text,
|
||||||
@@ -148,14 +160,41 @@ class UpdateProfileScreen extends HookConsumerWidget {
|
|||||||
text: user.value!.profile.timeZone,
|
text: user.value!.profile.timeZone,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Username color state
|
||||||
|
final usernameColorType = useState<String>(
|
||||||
|
user.value!.profile.usernameColor?.type ?? 'plain',
|
||||||
|
);
|
||||||
|
final usernameColorValue = useTextEditingController(
|
||||||
|
text: user.value!.profile.usernameColor?.value,
|
||||||
|
);
|
||||||
|
final usernameColorDirection = useTextEditingController(
|
||||||
|
text: user.value!.profile.usernameColor?.direction,
|
||||||
|
);
|
||||||
|
final usernameColorColors = useState<List<String>>(
|
||||||
|
user.value!.profile.usernameColor?.colors ?? [],
|
||||||
|
);
|
||||||
|
|
||||||
void updateProfile() async {
|
void updateProfile() async {
|
||||||
if (!formKeyProfile.currentState!.validate()) return;
|
if (!formKeyProfile.currentState!.validate()) return;
|
||||||
|
|
||||||
submitting.value = true;
|
submitting.value = true;
|
||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
|
final usernameColorData = {
|
||||||
|
'type': usernameColorType.value,
|
||||||
|
if (usernameColorType.value == 'plain' &&
|
||||||
|
usernameColorValue.text.isNotEmpty)
|
||||||
|
'value': usernameColorValue.text,
|
||||||
|
if (usernameColorType.value == 'gradient') ...{
|
||||||
|
if (usernameColorDirection.text.isNotEmpty)
|
||||||
|
'direction': usernameColorDirection.text,
|
||||||
|
'colors':
|
||||||
|
usernameColorColors.value.where((c) => c.isNotEmpty).toList(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
await client.patch(
|
await client.patch(
|
||||||
'/id/accounts/me/profile',
|
'/pass/accounts/me/profile',
|
||||||
data: {
|
data: {
|
||||||
'bio': bioController.text,
|
'bio': bioController.text,
|
||||||
'first_name': firstNameController.text,
|
'first_name': firstNameController.text,
|
||||||
@@ -166,6 +205,7 @@ class UpdateProfileScreen extends HookConsumerWidget {
|
|||||||
'location': locationController.text,
|
'location': locationController.text,
|
||||||
'time_zone': timeZoneController.text,
|
'time_zone': timeZoneController.text,
|
||||||
'birthday': birthday.value?.toUtc().toIso8601String(),
|
'birthday': birthday.value?.toUtc().toIso8601String(),
|
||||||
|
'username_color': usernameColorData,
|
||||||
'links':
|
'links':
|
||||||
links.value
|
links.value
|
||||||
.where((e) => e.name.isNotEmpty && e.url.isNotEmpty)
|
.where((e) => e.name.isNotEmpty && e.url.isNotEmpty)
|
||||||
@@ -593,6 +633,320 @@ class UpdateProfileScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Text(
|
||||||
|
'usernameColor',
|
||||||
|
).tr().bold().fontSize(18).padding(top: 16),
|
||||||
|
Column(
|
||||||
|
spacing: 16,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
// Preview section
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color:
|
||||||
|
Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.surfaceContainerHighest,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text('preview').tr().bold().fontSize(14),
|
||||||
|
const Gap(8),
|
||||||
|
// Create a preview account with the current settings
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final previewAccount = user.value!.copyWith(
|
||||||
|
profile: user.value!.profile.copyWith(
|
||||||
|
usernameColor: UsernameColor(
|
||||||
|
type: usernameColorType.value,
|
||||||
|
value:
|
||||||
|
usernameColorType.value == 'plain' &&
|
||||||
|
usernameColorValue
|
||||||
|
.text
|
||||||
|
.isNotEmpty
|
||||||
|
? usernameColorValue.text
|
||||||
|
: null,
|
||||||
|
direction:
|
||||||
|
usernameColorType.value ==
|
||||||
|
'gradient' &&
|
||||||
|
usernameColorDirection
|
||||||
|
.text
|
||||||
|
.isNotEmpty
|
||||||
|
? usernameColorDirection.text
|
||||||
|
: null,
|
||||||
|
colors:
|
||||||
|
usernameColorType.value == 'gradient'
|
||||||
|
? usernameColorColors.value
|
||||||
|
.where((c) => c.isNotEmpty)
|
||||||
|
.toList()
|
||||||
|
: null,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check if user can use this color
|
||||||
|
final tier =
|
||||||
|
user.value!.perkSubscription?.identifier;
|
||||||
|
final canUseColor = switch (tier) {
|
||||||
|
'solian.stellar.primary' =>
|
||||||
|
usernameColorType.value == 'plain' &&
|
||||||
|
(kUsernamePlainColors.containsKey(
|
||||||
|
usernameColorValue.text,
|
||||||
|
) ||
|
||||||
|
(usernameColorValue.text.startsWith(
|
||||||
|
'#',
|
||||||
|
) &&
|
||||||
|
_isValidHexColor(
|
||||||
|
usernameColorValue.text,
|
||||||
|
))),
|
||||||
|
'solian.stellar.nova' =>
|
||||||
|
usernameColorType.value == 'plain',
|
||||||
|
'solian.stellar.supernova' => true,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
AccountName(
|
||||||
|
account: previewAccount,
|
||||||
|
style: const TextStyle(fontSize: 18),
|
||||||
|
ignorePermissions: true,
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
canUseColor
|
||||||
|
? Symbols.check_circle
|
||||||
|
: Symbols.error,
|
||||||
|
size: 16,
|
||||||
|
color:
|
||||||
|
canUseColor
|
||||||
|
? Colors.green
|
||||||
|
: Colors.red,
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
canUseColor
|
||||||
|
? 'availableWithYourPlan'.tr()
|
||||||
|
: 'upgradeRequired'.tr(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color:
|
||||||
|
canUseColor
|
||||||
|
? Colors.green
|
||||||
|
: Colors.red,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DropdownButtonFormField2<String>(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'colorType'.tr(),
|
||||||
|
),
|
||||||
|
items: [
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'plain',
|
||||||
|
child: Text('plain'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'gradient',
|
||||||
|
child: Text('gradient'.tr()),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: usernameColorType.value,
|
||||||
|
onChanged: (value) {
|
||||||
|
usernameColorType.value = value ?? 'plain';
|
||||||
|
},
|
||||||
|
customButton: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(child: Text(usernameColorType.value).tr()),
|
||||||
|
Icon(Symbols.arrow_drop_down),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (usernameColorType.value == 'plain')
|
||||||
|
Autocomplete<String>(
|
||||||
|
optionsBuilder: (TextEditingValue textEditingValue) {
|
||||||
|
final options = kUsernamePlainColors.keys.toList();
|
||||||
|
if (textEditingValue.text == '') {
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
return options.where(
|
||||||
|
(option) => option.toLowerCase().contains(
|
||||||
|
textEditingValue.text.toLowerCase(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onSelected: (String selection) {
|
||||||
|
usernameColorValue.text = selection;
|
||||||
|
},
|
||||||
|
fieldViewBuilder: (
|
||||||
|
context,
|
||||||
|
controller,
|
||||||
|
focusNode,
|
||||||
|
onFieldSubmitted,
|
||||||
|
) {
|
||||||
|
// Initialize the controller with the current value
|
||||||
|
if (controller.text.isEmpty &&
|
||||||
|
usernameColorValue.text.isNotEmpty) {
|
||||||
|
controller.text = usernameColorValue.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TextFormField(
|
||||||
|
controller: controller,
|
||||||
|
focusNode: focusNode,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'colorValue'.tr(),
|
||||||
|
hintText: 'e.g. red or #ff6600',
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
usernameColorValue.text = value;
|
||||||
|
},
|
||||||
|
onTapOutside:
|
||||||
|
(_) =>
|
||||||
|
FocusManager.instance.primaryFocus
|
||||||
|
?.unfocus(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (usernameColorType.value == 'gradient') ...[
|
||||||
|
DropdownButtonFormField2<String>(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'gradientDirection'.tr(),
|
||||||
|
),
|
||||||
|
items: [
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to right',
|
||||||
|
child: Text('gradientDirectionToRight'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to left',
|
||||||
|
child: Text('gradientDirectionToLeft'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to bottom',
|
||||||
|
child: Text('gradientDirectionToBottom'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to top',
|
||||||
|
child: Text('gradientDirectionToTop'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to bottom right',
|
||||||
|
child: Text(
|
||||||
|
'gradientDirectionToBottomRight'.tr(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to bottom left',
|
||||||
|
child: Text('gradientDirectionToBottomLeft'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to top right',
|
||||||
|
child: Text('gradientDirectionToTopRight'.tr()),
|
||||||
|
),
|
||||||
|
DropdownMenuItem(
|
||||||
|
value: 'to top left',
|
||||||
|
child: Text('gradientDirectionToTopLeft'.tr()),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value:
|
||||||
|
usernameColorDirection.text.isNotEmpty
|
||||||
|
? usernameColorDirection.text
|
||||||
|
: 'to right',
|
||||||
|
onChanged: (value) {
|
||||||
|
usernameColorDirection.text = value ?? 'to right';
|
||||||
|
},
|
||||||
|
customButton: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
usernameColorDirection.text.isNotEmpty
|
||||||
|
? usernameColorDirection.text
|
||||||
|
: 'to right',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Icon(Symbols.arrow_drop_down),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'gradientColors',
|
||||||
|
).tr().bold().fontSize(14).padding(top: 8),
|
||||||
|
Column(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
for (
|
||||||
|
var i = 0;
|
||||||
|
i < usernameColorColors.value.length;
|
||||||
|
i++
|
||||||
|
)
|
||||||
|
Row(
|
||||||
|
key: ValueKey(
|
||||||
|
usernameColorColors.value[i].hashCode,
|
||||||
|
),
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue:
|
||||||
|
usernameColorColors.value[i],
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'color'.tr(),
|
||||||
|
hintText: 'e.g. #ff0000',
|
||||||
|
isDense: true,
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
usernameColorColors.value[i] = value;
|
||||||
|
},
|
||||||
|
onTapOutside:
|
||||||
|
(_) =>
|
||||||
|
FocusManager.instance.primaryFocus
|
||||||
|
?.unfocus(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Symbols.delete),
|
||||||
|
onPressed: () {
|
||||||
|
usernameColorColors.value =
|
||||||
|
usernameColorColors.value
|
||||||
|
.whereIndexed(
|
||||||
|
(idx, _) => idx != i,
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.centerRight,
|
||||||
|
child: FilledButton.icon(
|
||||||
|
onPressed: () {
|
||||||
|
usernameColorColors.value = List.from(
|
||||||
|
usernameColorColors.value,
|
||||||
|
)..add('');
|
||||||
|
},
|
||||||
|
label: Text('addColor').tr(),
|
||||||
|
icon: const Icon(Symbols.add),
|
||||||
|
).padding(top: 8),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
Text('links').tr().bold().fontSize(18).padding(top: 16),
|
Text('links').tr().bold().fontSize(18).padding(top: 16),
|
||||||
Column(
|
Column(
|
||||||
spacing: 8,
|
spacing: 8,
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class AuthFactorSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/accounts/me/factors/${factor.id}');
|
await client.delete('/pass/accounts/me/factors/${factor.id}');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -49,7 +49,7 @@ class AuthFactorSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post('/id/accounts/me/factors/${factor.id}/disable');
|
await client.post('/pass/accounts/me/factors/${factor.id}/disable');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -106,7 +106,7 @@ class AuthFactorSheet extends HookConsumerWidget {
|
|||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/accounts/me/factors/${factor.id}/enable',
|
'/pass/accounts/me/factors/${factor.id}/enable',
|
||||||
data: jsonEncode(password),
|
data: jsonEncode(password),
|
||||||
);
|
);
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
@@ -193,7 +193,7 @@ class AuthFactorNewSheet extends HookConsumerWidget {
|
|||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
final resp = await apiClient.post(
|
final resp = await apiClient.post(
|
||||||
'/id/accounts/me/factors',
|
'/pass/accounts/me/factors',
|
||||||
data: {'type': factorType.value, 'secret': secretController.text},
|
data: {'type': factorType.value, 'secret': secretController.text},
|
||||||
);
|
);
|
||||||
final factor = SnAuthFactor.fromJson(resp.data);
|
final factor = SnAuthFactor.fromJson(resp.data);
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class AccountConnectionSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/accounts/me/connections/${connection.id}');
|
await client.delete('/pass/accounts/me/connections/${connection.id}');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -175,7 +175,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget {
|
|||||||
if (context.mounted) showLoadingModal(context);
|
if (context.mounted) showLoadingModal(context);
|
||||||
|
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/auth/connect/apple/mobile',
|
'/pass/auth/connect/apple/mobile',
|
||||||
data: {
|
data: {
|
||||||
'identity_token': credential.identityToken!,
|
'identity_token': credential.identityToken!,
|
||||||
'authorization_code': credential.authorizationCode,
|
'authorization_code': credential.authorizationCode,
|
||||||
@@ -200,7 +200,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget {
|
|||||||
final serverUrl = ref.watch(serverUrlProvider);
|
final serverUrl = ref.watch(serverUrlProvider);
|
||||||
final accessToken = ref.watch(tokenProvider);
|
final accessToken = ref.watch(tokenProvider);
|
||||||
launchUrlString(
|
launchUrlString(
|
||||||
'$serverUrl/id/auth/login/${selectedProvider.value}?tk=${accessToken!.token}',
|
'$serverUrl/pass/auth/login/${selectedProvider.value}?tk=${accessToken!.token}',
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
await Navigator.of(context, rootNavigator: true).push(
|
await Navigator.of(context, rootNavigator: true).push(
|
||||||
@@ -345,7 +345,7 @@ class AccountConnectionsSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete(
|
await client.delete(
|
||||||
'/id/accounts/me/connections/${connection.id}',
|
'/pass/accounts/me/connections/${connection.id}',
|
||||||
);
|
);
|
||||||
ref.invalidate(accountConnectionsProvider);
|
ref.invalidate(accountConnectionsProvider);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class ContactMethodSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/accounts/me/contacts/${contact.id}');
|
await client.delete('/pass/accounts/me/contacts/${contact.id}');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -38,7 +38,7 @@ class ContactMethodSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post('/id/accounts/me/contacts/${contact.id}/verify');
|
await client.post('/pass/accounts/me/contacts/${contact.id}/verify');
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
showSnackBar('contactMethodVerificationSent'.tr());
|
showSnackBar('contactMethodVerificationSent'.tr());
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ class ContactMethodSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post('/id/accounts/me/contacts/${contact.id}/primary');
|
await client.post('/pass/accounts/me/contacts/${contact.id}/primary');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -66,7 +66,7 @@ class ContactMethodSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post('/id/accounts/me/contacts/${contact.id}/public');
|
await client.post('/pass/accounts/me/contacts/${contact.id}/public');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -79,7 +79,7 @@ class ContactMethodSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/accounts/me/contacts/${contact.id}/public');
|
await client.delete('/pass/accounts/me/contacts/${contact.id}/public');
|
||||||
if (context.mounted) Navigator.pop(context, true);
|
if (context.mounted) Navigator.pop(context, true);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -221,7 +221,7 @@ class ContactMethodNewSheet extends HookConsumerWidget {
|
|||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.post(
|
await apiClient.post(
|
||||||
'/id/accounts/me/contacts',
|
'/pass/accounts/me/contacts',
|
||||||
data: {'type': contactType.value, 'content': contentController.text},
|
data: {'type': contactType.value, 'content': contentController.text},
|
||||||
);
|
);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
|
|||||||
@@ -97,9 +97,7 @@ class _AccountBasicInfo extends StatelessWidget {
|
|||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
SharePlus.instance.share(
|
SharePlus.instance.share(
|
||||||
ShareParams(
|
ShareParams(uri: Uri.parse('https://solian.app/@${data.name}')),
|
||||||
uri: Uri.parse('https://solian.app/@${data.name}'),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
icon: const Icon(Symbols.share),
|
icon: const Icon(Symbols.share),
|
||||||
@@ -563,14 +561,14 @@ Future<SnAccount> account(Ref ref, String uname) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final resp = await apiClient.get("/id/accounts/$uname");
|
final resp = await apiClient.get("/pass/accounts/$uname");
|
||||||
return SnAccount.fromJson(resp.data);
|
return SnAccount.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async {
|
Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final resp = await apiClient.get("/id/accounts/$uname/badges");
|
final resp = await apiClient.get("/pass/accounts/$uname/badges");
|
||||||
return List<SnAccountBadge>.from(
|
return List<SnAccountBadge>.from(
|
||||||
resp.data.map((x) => SnAccountBadge.fromJson(x)),
|
resp.data.map((x) => SnAccountBadge.fromJson(x)),
|
||||||
);
|
);
|
||||||
@@ -619,7 +617,7 @@ Future<SnRelationship?> accountRelationship(Ref ref, String uname) async {
|
|||||||
final account = await ref.watch(accountProvider(uname).future);
|
final account = await ref.watch(accountProvider(uname).future);
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
final resp = await apiClient.get("/id/relationships/${account.id}");
|
final resp = await apiClient.get("/pass/relationships/${account.id}");
|
||||||
return SnRelationship.fromJson(resp.data);
|
return SnRelationship.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException && err.response?.statusCode == 404) {
|
if (err is DioException && err.response?.statusCode == 404) {
|
||||||
@@ -692,7 +690,7 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.post('/id/relationships/${account.value!.id}/friends');
|
await client.post('/pass/relationships/${account.value!.id}/friends');
|
||||||
ref.invalidate(accountRelationshipProvider(name));
|
ref.invalidate(accountRelationshipProvider(name));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -706,9 +704,9 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
if (accountRelationship.value == null) {
|
if (accountRelationship.value == null) {
|
||||||
await client.post('/id/relationships/${account.value!.id}/block');
|
await client.post('/pass/relationships/${account.value!.id}/block');
|
||||||
} else {
|
} else {
|
||||||
await client.delete('/id/relationships/${account.value!.id}/block');
|
await client.delete('/pass/relationships/${account.value!.id}/block');
|
||||||
}
|
}
|
||||||
ref.invalidate(accountRelationshipProvider(name));
|
ref.invalidate(accountRelationshipProvider(name));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -879,7 +877,7 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
child: Card(
|
child: Card(
|
||||||
child: FortuneGraphWidget(
|
child: FortuneGraphWidget(
|
||||||
events: accountEvents,
|
events: accountEvents,
|
||||||
eventCalanderUser: data.name,
|
eventCalandarUser: data.name,
|
||||||
margin: EdgeInsets.zero,
|
margin: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -1004,7 +1002,7 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
child: Card(
|
child: Card(
|
||||||
child: FortuneGraphWidget(
|
child: FortuneGraphWidget(
|
||||||
events: accountEvents,
|
events: accountEvents,
|
||||||
eventCalanderUser: data.name,
|
eventCalandarUser: data.name,
|
||||||
),
|
),
|
||||||
).padding(horizontal: 4),
|
).padding(horizontal: 4),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'profile.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$accountHash() => r'ce7264a04f69e32a5cb07bc10ca5fa47ae1fddaa';
|
String _$accountHash() => r'5e2b7bd59151b4638a5561f495537c259f767123';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
@@ -145,7 +145,7 @@ class _AccountProviderElement
|
|||||||
String get uname => (origin as AccountProvider).uname;
|
String get uname => (origin as AccountProvider).uname;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$accountBadgesHash() => r'1de05e122c23ff2c6ac6d318977165761e2ad177';
|
String _$accountBadgesHash() => r'68db63f49827020beecbdbf20529520d0cd14a7d';
|
||||||
|
|
||||||
/// See also [accountBadges].
|
/// See also [accountBadges].
|
||||||
@ProviderFor(accountBadges)
|
@ProviderFor(accountBadges)
|
||||||
@@ -517,7 +517,7 @@ class _AccountDirectChatProviderElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
String _$accountRelationshipHash() =>
|
String _$accountRelationshipHash() =>
|
||||||
r'9a3a4e8c6c6706f73df95feccb86736fcad33f30';
|
r'319f743261b113a1d3c6a397d48d13c858312669';
|
||||||
|
|
||||||
/// See also [accountRelationship].
|
/// See also [accountRelationship].
|
||||||
@ProviderFor(accountRelationship)
|
@ProviderFor(accountRelationship)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ part 'relationship.g.dart';
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnRelationship>> sentFriendRequest(Ref ref) async {
|
Future<List<SnRelationship>> sentFriendRequest(Ref ref) async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
final resp = await client.get('/id/relationships/requests');
|
final resp = await client.get('/pass/relationships/requests');
|
||||||
return resp.data
|
return resp.data
|
||||||
.map((e) => SnRelationship.fromJson(e))
|
.map((e) => SnRelationship.fromJson(e))
|
||||||
.cast<SnRelationship>()
|
.cast<SnRelationship>()
|
||||||
@@ -43,7 +43,7 @@ class RelationshipListNotifier extends _$RelationshipListNotifier
|
|||||||
final take = 20;
|
final take = 20;
|
||||||
|
|
||||||
final response = await client.get(
|
final response = await client.get(
|
||||||
'/id/relationships',
|
'/pass/relationships',
|
||||||
queryParameters: {'offset': offset, 'take': take},
|
queryParameters: {'offset': offset, 'take': take},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -226,7 +226,7 @@ class RelationshipScreen extends HookConsumerWidget {
|
|||||||
if (result == null) return;
|
if (result == null) return;
|
||||||
|
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post('/id/relationships/${result.id}/friends');
|
await client.post('/pass/relationships/${result.id}/friends');
|
||||||
ref.invalidate(sentFriendRequestProvider);
|
ref.invalidate(sentFriendRequestProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,7 +240,7 @@ class RelationshipScreen extends HookConsumerWidget {
|
|||||||
submitting.value = true;
|
submitting.value = true;
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/relationships/${relationship.accountId}/friends/${isAccept ? 'accept' : 'decline'}',
|
'/pass/relationships/${relationship.accountId}/friends/${isAccept ? 'accept' : 'decline'}',
|
||||||
);
|
);
|
||||||
relationshipNotifier.forceRefresh();
|
relationshipNotifier.forceRefresh();
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
@@ -267,7 +267,7 @@ class RelationshipScreen extends HookConsumerWidget {
|
|||||||
) async {
|
) async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.patch(
|
await client.patch(
|
||||||
'/id/relationships/${relationship.accountId}',
|
'/pass/relationships/${relationship.accountId}',
|
||||||
data: {'status': newStatus},
|
data: {'status': newStatus},
|
||||||
);
|
);
|
||||||
relationshipNotifier.forceRefresh();
|
relationshipNotifier.forceRefresh();
|
||||||
@@ -350,7 +350,7 @@ class _SentFriendRequestsSheet extends HookConsumerWidget {
|
|||||||
Future<void> cancelRequest(SnRelationship request) async {
|
Future<void> cancelRequest(SnRelationship request) async {
|
||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.delete('/id/relationships/${request.relatedId}/friends');
|
await client.delete('/pass/relationships/${request.relatedId}/friends');
|
||||||
ref.invalidate(sentFriendRequestProvider);
|
ref.invalidate(sentFriendRequestProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'relationship.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$sentFriendRequestHash() => r'dc02ace6cb755a01ab862c9fcff3b26de7f946cb';
|
String _$sentFriendRequestHash() => r'0c52813eb6f86c05f6e0b1e4e840d0d9c350aa9e';
|
||||||
|
|
||||||
/// See also [sentFriendRequest].
|
/// See also [sentFriendRequest].
|
||||||
@ProviderFor(sentFriendRequest)
|
@ProviderFor(sentFriendRequest)
|
||||||
@@ -27,7 +27,7 @@ final sentFriendRequestProvider =
|
|||||||
typedef SentFriendRequestRef =
|
typedef SentFriendRequestRef =
|
||||||
AutoDisposeFutureProviderRef<List<SnRelationship>>;
|
AutoDisposeFutureProviderRef<List<SnRelationship>>;
|
||||||
String _$relationshipListNotifierHash() =>
|
String _$relationshipListNotifierHash() =>
|
||||||
r'0a134ce69489a4f2002d2223853855b6f22e4e9f';
|
r'fc46920256f7c48445c00652165e879890f2c9a3';
|
||||||
|
|
||||||
/// See also [RelationshipListNotifier].
|
/// See also [RelationshipListNotifier].
|
||||||
@ProviderFor(RelationshipListNotifier)
|
@ProviderFor(RelationshipListNotifier)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class CreateAccountScreen extends HookConsumerWidget {
|
|||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/accounts',
|
'/pass/accounts',
|
||||||
data: {
|
data: {
|
||||||
'name': usernameController.text,
|
'name': usernameController.text,
|
||||||
'nick': nicknameController.text,
|
'nick': nicknameController.text,
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ class _LoginCheckScreen extends HookConsumerWidget {
|
|||||||
// Get token if challenge is completed
|
// Get token if challenge is completed
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final tokenResp = await client.post(
|
final tokenResp = await client.post(
|
||||||
'/id/auth/token',
|
'/pass/auth/token',
|
||||||
data: {
|
data: {
|
||||||
'grant_type': 'authorization_code',
|
'grant_type': 'authorization_code',
|
||||||
'code': code ?? challenge!.id,
|
'code': code ?? challenge!.id,
|
||||||
@@ -241,7 +241,7 @@ class _LoginCheckScreen extends HookConsumerWidget {
|
|||||||
// Pass challenge
|
// Pass challenge
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.patch(
|
final resp = await client.patch(
|
||||||
'/id/auth/challenge/${challenge!.id}',
|
'/pass/auth/challenge/${challenge!.id}',
|
||||||
data: {'factor_id': factor!.id, 'password': pwd},
|
data: {'factor_id': factor!.id, 'password': pwd},
|
||||||
);
|
);
|
||||||
final result = SnAuthChallenge.fromJson(resp.data);
|
final result = SnAuthChallenge.fromJson(resp.data);
|
||||||
@@ -388,7 +388,7 @@ class _LoginPickerScreen extends HookConsumerWidget {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/auth/challenge/${challenge!.id}/factors/${factorPicked.value!.id}',
|
'/pass/auth/challenge/${challenge!.id}/factors/${factorPicked.value!.id}',
|
||||||
data:
|
data:
|
||||||
hintController.text.isNotEmpty
|
hintController.text.isNotEmpty
|
||||||
? jsonEncode(hintController.text)
|
? jsonEncode(hintController.text)
|
||||||
@@ -531,7 +531,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/accounts/recovery/password',
|
'/pass/accounts/recovery/password',
|
||||||
data: {'account': uname, 'captcha_token': captchaTk},
|
data: {'account': uname, 'captcha_token': captchaTk},
|
||||||
);
|
);
|
||||||
showInfoAlert('loginResetPasswordSent'.tr(), 'done'.tr());
|
showInfoAlert('loginResetPasswordSent'.tr(), 'done'.tr());
|
||||||
@@ -549,7 +549,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/auth/challenge',
|
'/pass/auth/challenge',
|
||||||
data: {
|
data: {
|
||||||
'account': uname,
|
'account': uname,
|
||||||
'device_id': await getUdid(),
|
'device_id': await getUdid(),
|
||||||
@@ -570,7 +570,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
final result = SnAuthChallenge.fromJson(resp.data);
|
final result = SnAuthChallenge.fromJson(resp.data);
|
||||||
onChallenge(result);
|
onChallenge(result);
|
||||||
final factorResp = await client.get(
|
final factorResp = await client.get(
|
||||||
'/id/auth/challenge/${result.id}/factors',
|
'/pass/auth/challenge/${result.id}/factors',
|
||||||
);
|
);
|
||||||
onFactor(
|
onFactor(
|
||||||
List<SnAuthFactor>.from(
|
List<SnAuthFactor>.from(
|
||||||
@@ -599,7 +599,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
|
|
||||||
if (context.mounted) showLoadingModal(context);
|
if (context.mounted) showLoadingModal(context);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/auth/login/apple/mobile',
|
'/pass/auth/login/apple/mobile',
|
||||||
data: {
|
data: {
|
||||||
'identity_token': credential.identityToken!,
|
'identity_token': credential.identityToken!,
|
||||||
'authorization_code': credential.authorizationCode,
|
'authorization_code': credential.authorizationCode,
|
||||||
@@ -611,7 +611,7 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
final challenge = SnAuthChallenge.fromJson(resp.data);
|
final challenge = SnAuthChallenge.fromJson(resp.data);
|
||||||
onChallenge(challenge);
|
onChallenge(challenge);
|
||||||
final factorResp = await client.get(
|
final factorResp = await client.get(
|
||||||
'/id/auth/challenge/${challenge.id}/factors',
|
'/pass/auth/challenge/${challenge.id}/factors',
|
||||||
);
|
);
|
||||||
onFactor(
|
onFactor(
|
||||||
List<SnAuthFactor>.from(
|
List<SnAuthFactor>.from(
|
||||||
@@ -636,11 +636,11 @@ class _LoginLookupScreen extends HookConsumerWidget {
|
|||||||
|
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
final resp = await client.get('/id/auth/challenge/$challengeId');
|
final resp = await client.get('/pass/auth/challenge/$challengeId');
|
||||||
final challenge = SnAuthChallenge.fromJson(resp.data);
|
final challenge = SnAuthChallenge.fromJson(resp.data);
|
||||||
onChallenge(challenge);
|
onChallenge(challenge);
|
||||||
final factorResp = await client.get(
|
final factorResp = await client.get(
|
||||||
'/id/auth/challenge/${challenge.id}/factors',
|
'/pass/auth/challenge/${challenge.id}/factors',
|
||||||
);
|
);
|
||||||
onFactor(
|
onFactor(
|
||||||
List<SnAuthFactor>.from(
|
List<SnAuthFactor>.from(
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ class _OidcScreenState extends ConsumerState<OidcScreen> {
|
|||||||
: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
|
: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
|
||||||
),
|
),
|
||||||
initialUrlRequest: URLRequest(
|
initialUrlRequest: URLRequest(
|
||||||
url: WebUri('$serverUrl/id/auth/login/${widget.provider}'),
|
url: WebUri(
|
||||||
|
'$serverUrl/pass/auth/login/${widget.provider}',
|
||||||
|
),
|
||||||
headers: {
|
headers: {
|
||||||
if (token?.token.isNotEmpty ?? false)
|
if (token?.token.isNotEmpty ?? false)
|
||||||
'Authorization': 'AtField ${token!.token}',
|
'Authorization': 'AtField ${token!.token}',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import "package:island/pods/chat/chat_subscribe.dart";
|
|||||||
import "package:island/pods/chat/messages_notifier.dart";
|
import "package:island/pods/chat/messages_notifier.dart";
|
||||||
import "package:island/pods/network.dart";
|
import "package:island/pods/network.dart";
|
||||||
import "package:island/pods/chat/chat_online_count.dart";
|
import "package:island/pods/chat/chat_online_count.dart";
|
||||||
|
import "package:island/pods/config.dart";
|
||||||
import "package:island/screens/chat/search_messages.dart";
|
import "package:island/screens/chat/search_messages.dart";
|
||||||
import "package:island/services/file_uploader.dart";
|
import "package:island/services/file_uploader.dart";
|
||||||
import "package:island/screens/chat/chat.dart";
|
import "package:island/screens/chat/chat.dart";
|
||||||
@@ -44,6 +45,7 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
final chatIdentity = ref.watch(chatroomIdentityProvider(id));
|
final chatIdentity = ref.watch(chatroomIdentityProvider(id));
|
||||||
final isSyncing = ref.watch(isSyncingProvider);
|
final isSyncing = ref.watch(isSyncingProvider);
|
||||||
final onlineCount = ref.watch(chatOnlineCountNotifierProvider(id));
|
final onlineCount = ref.watch(chatOnlineCountNotifierProvider(id));
|
||||||
|
final settings = ref.watch(appSettingsNotifierProvider);
|
||||||
|
|
||||||
final hasOnlineCount = onlineCount.hasValue;
|
final hasOnlineCount = onlineCount.hasValue;
|
||||||
|
|
||||||
@@ -535,7 +537,7 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
listController: listController,
|
listController: listController,
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
top: 16,
|
top: 16,
|
||||||
bottom: 80 + MediaQuery.of(context).padding.bottom,
|
bottom: MediaQuery.of(context).padding.bottom + 16,
|
||||||
),
|
),
|
||||||
controller: scrollController,
|
controller: scrollController,
|
||||||
reverse: true, // Show newest messages at the bottom
|
reverse: true, // Show newest messages at the bottom
|
||||||
@@ -543,7 +545,9 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
findChildIndexCallback: (key) {
|
findChildIndexCallback: (key) {
|
||||||
if (key is! ValueKey<String>) return null;
|
if (key is! ValueKey<String>) return null;
|
||||||
final messageId = key.value.substring(messageKeyPrefix.length);
|
final messageId = key.value.substring(messageKeyPrefix.length);
|
||||||
final index = messageList.indexWhere((m) => m.id == messageId);
|
final index = messageList.indexWhere(
|
||||||
|
(m) => (m.nonce ?? m.id) == messageId,
|
||||||
|
);
|
||||||
// Return null for invalid indices to let SuperListView handle it properly
|
// Return null for invalid indices to let SuperListView handle it properly
|
||||||
return index >= 0 ? index : null;
|
return index >= 0 ? index : null;
|
||||||
},
|
},
|
||||||
@@ -561,13 +565,14 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
.abs() >
|
.abs() >
|
||||||
3;
|
3;
|
||||||
|
|
||||||
final key = ValueKey('$messageKeyPrefix${message.id}');
|
// Use a stable animation key that doesn't change during message lifecycle
|
||||||
|
final key = Key('$messageKeyPrefix${message.nonce ?? message.id}');
|
||||||
|
|
||||||
return chatIdentity.when(
|
final messageWidget = chatIdentity.when(
|
||||||
skipError: true,
|
skipError: true,
|
||||||
data:
|
data:
|
||||||
(identity) => MessageItem(
|
(identity) => MessageItem(
|
||||||
key: key,
|
key: settings.disableAnimation ? key : null,
|
||||||
message: message,
|
message: message,
|
||||||
isCurrentUser: identity?.id == message.senderId,
|
isCurrentUser: identity?.id == message.senderId,
|
||||||
onAction: (action) {
|
onAction: (action) {
|
||||||
@@ -605,7 +610,6 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
loading:
|
loading:
|
||||||
() => MessageItem(
|
() => MessageItem(
|
||||||
key: key,
|
|
||||||
message: message,
|
message: message,
|
||||||
isCurrentUser: false,
|
isCurrentUser: false,
|
||||||
onAction: null,
|
onAction: null,
|
||||||
@@ -613,8 +617,29 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
showAvatar: false,
|
showAvatar: false,
|
||||||
onJump: (_) {},
|
onJump: (_) {},
|
||||||
),
|
),
|
||||||
error: (_, _) => SizedBox.shrink(key: key),
|
error: (_, _) => const SizedBox.shrink(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return settings.disableAnimation
|
||||||
|
? messageWidget
|
||||||
|
: TweenAnimationBuilder<double>(
|
||||||
|
key: key,
|
||||||
|
tween: Tween<double>(begin: 0.0, end: 1.0),
|
||||||
|
duration: Duration(
|
||||||
|
milliseconds: 400 + (index % 5) * 50,
|
||||||
|
), // Staggered delay
|
||||||
|
curve: Curves.easeOutCubic,
|
||||||
|
builder: (context, animationValue, child) {
|
||||||
|
return Transform.translate(
|
||||||
|
offset: Offset(
|
||||||
|
0,
|
||||||
|
20 * (1 - animationValue),
|
||||||
|
), // Slide up from bottom
|
||||||
|
child: Opacity(opacity: animationValue, child: child),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: messageWidget,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -687,91 +712,116 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
body: Stack(
|
body: Stack(
|
||||||
children: [
|
children: [
|
||||||
// Messages
|
// Messages and Input in Column
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
child: messages.when(
|
child: Column(
|
||||||
data:
|
children: [
|
||||||
(messageList) =>
|
Expanded(
|
||||||
messageList.isEmpty
|
child: AnimatedSwitcher(
|
||||||
? Center(child: Text('No messages yet'.tr()))
|
duration: const Duration(milliseconds: 300),
|
||||||
: chatMessageListWidget(messageList),
|
switchInCurve: Curves.easeOutCubic,
|
||||||
loading: () => const Center(child: CircularProgressIndicator()),
|
switchOutCurve: Curves.easeInCubic,
|
||||||
error:
|
transitionBuilder: (
|
||||||
(error, _) => ResponseErrorWidget(
|
Widget child,
|
||||||
error: error,
|
Animation<double> animation,
|
||||||
onRetry: () => messagesNotifier.loadInitial(),
|
) {
|
||||||
|
return SlideTransition(
|
||||||
|
position: Tween<Offset>(
|
||||||
|
begin: const Offset(0, 0.05),
|
||||||
|
end: Offset.zero,
|
||||||
|
).animate(animation),
|
||||||
|
child: FadeTransition(opacity: animation, child: child),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: messages.when(
|
||||||
|
data:
|
||||||
|
(messageList) =>
|
||||||
|
messageList.isEmpty
|
||||||
|
? Center(
|
||||||
|
key: const ValueKey('empty-messages'),
|
||||||
|
child: Text('No messages yet'.tr()),
|
||||||
|
)
|
||||||
|
: chatMessageListWidget(messageList),
|
||||||
|
loading:
|
||||||
|
() => const Center(
|
||||||
|
key: ValueKey('loading-messages'),
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
),
|
||||||
|
error:
|
||||||
|
(error, _) => ResponseErrorWidget(
|
||||||
|
key: const ValueKey('error-messages'),
|
||||||
|
error: error,
|
||||||
|
onRetry: () => messagesNotifier.loadInitial(),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
chatRoom.when(
|
||||||
// Input
|
data:
|
||||||
Positioned(
|
(room) => Column(
|
||||||
bottom: 0,
|
mainAxisSize: MainAxisSize.min,
|
||||||
left: 0,
|
children: [
|
||||||
right: 0,
|
ChatInput(
|
||||||
child: chatRoom.when(
|
messageController: messageController,
|
||||||
data:
|
chatRoom: room!,
|
||||||
(room) => Column(
|
onSend: sendMessage,
|
||||||
mainAxisSize: MainAxisSize.min,
|
onClear: () {
|
||||||
children: [
|
if (messageEditingTo.value != null) {
|
||||||
ChatInput(
|
attachments.value.clear();
|
||||||
messageController: messageController,
|
messageController.clear();
|
||||||
chatRoom: room!,
|
}
|
||||||
onSend: sendMessage,
|
messageEditingTo.value = null;
|
||||||
onClear: () {
|
messageReplyingTo.value = null;
|
||||||
if (messageEditingTo.value != null) {
|
messageForwardingTo.value = null;
|
||||||
attachments.value.clear();
|
},
|
||||||
messageController.clear();
|
messageEditingTo: messageEditingTo.value,
|
||||||
}
|
messageReplyingTo: messageReplyingTo.value,
|
||||||
messageEditingTo.value = null;
|
messageForwardingTo: messageForwardingTo.value,
|
||||||
messageReplyingTo.value = null;
|
onPickFile: (bool isPhoto) {
|
||||||
messageForwardingTo.value = null;
|
if (isPhoto) {
|
||||||
},
|
pickPhotoMedia();
|
||||||
messageEditingTo: messageEditingTo.value,
|
} else {
|
||||||
messageReplyingTo: messageReplyingTo.value,
|
pickVideoMedia();
|
||||||
messageForwardingTo: messageForwardingTo.value,
|
}
|
||||||
onPickFile: (bool isPhoto) {
|
},
|
||||||
if (isPhoto) {
|
onPickAudio: pickAudioMedia,
|
||||||
pickPhotoMedia();
|
onPickGeneralFile: pickGeneralFile,
|
||||||
} else {
|
onLinkAttachment: linkAttachment,
|
||||||
pickVideoMedia();
|
attachments: attachments.value,
|
||||||
}
|
onUploadAttachment: uploadAttachment,
|
||||||
},
|
onDeleteAttachment: (index) async {
|
||||||
onPickAudio: pickAudioMedia,
|
final attachment = attachments.value[index];
|
||||||
onPickGeneralFile: pickGeneralFile,
|
if (attachment.isOnCloud && !attachment.isLink) {
|
||||||
onLinkAttachment: linkAttachment,
|
final client = ref.watch(apiClientProvider);
|
||||||
attachments: attachments.value,
|
await client.delete(
|
||||||
onUploadAttachment: uploadAttachment,
|
'/drive/files/${attachment.data.id}',
|
||||||
onDeleteAttachment: (index) async {
|
);
|
||||||
final attachment = attachments.value[index];
|
}
|
||||||
if (attachment.isOnCloud && !attachment.isLink) {
|
final clone = List.of(attachments.value);
|
||||||
final client = ref.watch(apiClientProvider);
|
clone.removeAt(index);
|
||||||
await client.delete(
|
attachments.value = clone;
|
||||||
'/drive/files/${attachment.data.id}',
|
},
|
||||||
);
|
onMoveAttachment: (idx, delta) {
|
||||||
}
|
if (idx + delta < 0 ||
|
||||||
final clone = List.of(attachments.value);
|
idx + delta >= attachments.value.length) {
|
||||||
clone.removeAt(index);
|
return;
|
||||||
attachments.value = clone;
|
}
|
||||||
},
|
final clone = List.of(attachments.value);
|
||||||
onMoveAttachment: (idx, delta) {
|
clone.insert(idx + delta, clone.removeAt(idx));
|
||||||
if (idx + delta < 0 ||
|
attachments.value = clone;
|
||||||
idx + delta >= attachments.value.length) {
|
},
|
||||||
return;
|
onAttachmentsChanged: (newAttachments) {
|
||||||
}
|
attachments.value = newAttachments;
|
||||||
final clone = List.of(attachments.value);
|
},
|
||||||
clone.insert(idx + delta, clone.removeAt(idx));
|
attachmentProgress: attachmentProgress.value,
|
||||||
attachments.value = clone;
|
),
|
||||||
},
|
Gap(MediaQuery.of(context).padding.bottom),
|
||||||
onAttachmentsChanged: (newAttachments) {
|
],
|
||||||
attachments.value = newAttachments;
|
|
||||||
},
|
|
||||||
attachmentProgress: attachmentProgress.value,
|
|
||||||
),
|
),
|
||||||
Gap(MediaQuery.of(context).padding.bottom),
|
error: (_, _) => const SizedBox.shrink(),
|
||||||
],
|
loading: () => const SizedBox.shrink(),
|
||||||
),
|
),
|
||||||
error: (_, _) => const SizedBox.shrink(),
|
],
|
||||||
loading: () => const SizedBox.shrink(),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
|
|||||||
@@ -522,7 +522,7 @@ class CreatorHubScreen extends HookConsumerWidget {
|
|||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
isNoBackground: false,
|
isNoBackground: false,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: const PageBackButton(),
|
leading: const PageBackButton(backTo: '/account'),
|
||||||
title: Text('creatorHub').tr(),
|
title: Text('creatorHub').tr(),
|
||||||
actions: [
|
actions: [
|
||||||
if (!isWideScreen(context))
|
if (!isWideScreen(context))
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:island/models/custom_app.dart';
|
import 'package:island/models/custom_app.dart';
|
||||||
@@ -32,6 +33,7 @@ class AppDetailScreen extends HookConsumerWidget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
|
isNoBackground: false,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(appData.value?.name ?? 'appDetails'.tr()),
|
title: Text(appData.value?.name ?? 'appDetails'.tr()),
|
||||||
actions: [
|
actions: [
|
||||||
@@ -51,6 +53,7 @@ class AppDetailScreen extends HookConsumerWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
const Gap(8),
|
||||||
],
|
],
|
||||||
bottom: TabBar(
|
bottom: TabBar(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class BotDetailScreen extends HookConsumerWidget {
|
|||||||
final botData = ref.watch(botProvider(publisherName, projectId, botId));
|
final botData = ref.watch(botProvider(publisherName, projectId, botId));
|
||||||
|
|
||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
|
isNoBackground: false,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(botData.value?.account.nick ?? 'botDetails'.tr()),
|
title: Text(botData.value?.account.nick ?? 'botDetails'.tr()),
|
||||||
actions: [
|
actions: [
|
||||||
|
|||||||
@@ -317,6 +317,7 @@ class EditAppScreen extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
|
isNoBackground: false,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(isNew ? 'createCustomApp'.tr() : 'editCustomApp'.tr()),
|
title: Text(isNew ? 'createCustomApp'.tr() : 'editCustomApp'.tr()),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ class EditBotScreen extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
|
isNoBackground: false,
|
||||||
appBar: AppBar(title: Text(isNew ? 'createBot'.tr() : 'editBot'.tr())),
|
appBar: AppBar(title: Text(isNew ? 'createBot'.tr() : 'editBot'.tr())),
|
||||||
body:
|
body:
|
||||||
botData == null && !isNew
|
botData == null && !isNew
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ class _ConsoleAppBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return AppBar(
|
return AppBar(
|
||||||
leading: const PageBackButton(),
|
leading: const PageBackButton(backTo: '/account'),
|
||||||
title: Text('developerHub').tr(),
|
title: Text('developerHub').tr(),
|
||||||
actions: [
|
actions: [
|
||||||
if (currentProject != null)
|
if (currentProject != null)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class ArticleDetailScreen extends ConsumerWidget {
|
|||||||
final articleAsync = ref.watch(articleDetailProvider(articleId));
|
final articleAsync = ref.watch(articleDetailProvider(articleId));
|
||||||
|
|
||||||
return AppScaffold(
|
return AppScaffold(
|
||||||
|
isNoBackground: false,
|
||||||
body: articleAsync.when(
|
body: articleAsync.when(
|
||||||
data:
|
data:
|
||||||
(article) => AppScaffold(
|
(article) => AppScaffold(
|
||||||
|
|||||||
@@ -54,7 +54,12 @@ Widget notificationIndicatorWidget(
|
|||||||
trailing: const Icon(Symbols.chevron_right),
|
trailing: const Icon(Symbols.chevron_right),
|
||||||
contentPadding: EdgeInsets.only(left: 16, right: 15),
|
contentPadding: EdgeInsets.only(left: 16, right: 15),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
GoRouter.of(context).pushNamed('notifications');
|
showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
isScrollControlled: true,
|
||||||
|
useRootNavigator: true,
|
||||||
|
builder: (context) => const NotificationSheet(),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -330,7 +335,7 @@ class ExploreScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
PostFeaturedList(),
|
PostFeaturedList(),
|
||||||
PostComposeCard(
|
PostComposeCard(
|
||||||
onSubmit: (post) {
|
onSubmit: () {
|
||||||
activitiesNotifier.forceRefresh();
|
activitiesNotifier.forceRefresh();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
829
lib/screens/lottery.dart
Normal file
829
lib/screens/lottery.dart
Normal file
@@ -0,0 +1,829 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:island/models/wallet.dart';
|
||||||
|
import 'package:island/pods/network.dart';
|
||||||
|
import 'package:island/screens/wallet.dart';
|
||||||
|
import 'package:island/services/time.dart';
|
||||||
|
import 'package:island/widgets/alert.dart';
|
||||||
|
import 'package:island/widgets/content/sheet.dart';
|
||||||
|
import 'package:island/widgets/payment/payment_overlay.dart';
|
||||||
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
|
part 'lottery.g.dart';
|
||||||
|
|
||||||
|
@riverpod
|
||||||
|
Future<List<SnLotteryTicket>> lotteryTickets(
|
||||||
|
Ref ref, {
|
||||||
|
int offset = 0,
|
||||||
|
int take = 20,
|
||||||
|
}) async {
|
||||||
|
final client = ref.watch(apiClientProvider);
|
||||||
|
final resp = await client.get('/pass/lotteries?offset=$offset&take=$take');
|
||||||
|
return (resp.data as List).map((e) => SnLotteryTicket.fromJson(e)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@riverpod
|
||||||
|
Future<List<SnLotteryRecord>> lotteryRecords(
|
||||||
|
Ref ref, {
|
||||||
|
int offset = 0,
|
||||||
|
int take = 20,
|
||||||
|
}) async {
|
||||||
|
final client = ref.watch(apiClientProvider);
|
||||||
|
final resp = await client.get(
|
||||||
|
'/pass/lotteries/records?offset=$offset&take=$take',
|
||||||
|
);
|
||||||
|
return (resp.data as List).map((e) => SnLotteryRecord.fromJson(e)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
class LotteryTab extends StatelessWidget {
|
||||||
|
const LotteryTab({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return DefaultTabController(
|
||||||
|
length: 2,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
TabBar(
|
||||||
|
tabs: [Tab(text: 'myTickets'.tr()), Tab(text: 'drawHistory'.tr())],
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: TabBarView(
|
||||||
|
children: [LotteryTicketsList(), LotteryRecordsList()],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LotteryTicketsList extends HookConsumerWidget {
|
||||||
|
const LotteryTicketsList({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final tickets = ref.watch(lotteryTicketsProvider());
|
||||||
|
|
||||||
|
return tickets.when(
|
||||||
|
data: (ticketsList) {
|
||||||
|
if (ticketsList.isEmpty) {
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Symbols.casino,
|
||||||
|
size: 48,
|
||||||
|
color: Theme.of(context).colorScheme.outline,
|
||||||
|
),
|
||||||
|
const Gap(16),
|
||||||
|
Text(
|
||||||
|
'noLotteryTickets'.tr(),
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Text(
|
||||||
|
'buyYourFirstTicket'.tr(),
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
const Gap(16),
|
||||||
|
FilledButton.icon(
|
||||||
|
onPressed: () => _showLotteryPurchaseSheet(context, ref),
|
||||||
|
icon: const Icon(Symbols.add),
|
||||||
|
label: Text('buyTicket'.tr()),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
itemCount: ticketsList.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
final ticket = ticketsList[index];
|
||||||
|
return Card(
|
||||||
|
margin: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Symbols.confirmation_number,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Expanded(
|
||||||
|
child: Text(ticket.createdAt.formatSystem()),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
vertical: 4,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: _getLotteryStatusColor(
|
||||||
|
context,
|
||||||
|
ticket.drawStatus,
|
||||||
|
).withOpacity(0.1),
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
_getLotteryStatusText(ticket.drawStatus),
|
||||||
|
style: TextStyle(
|
||||||
|
color: _getLotteryStatusColor(
|
||||||
|
context,
|
||||||
|
ticket.drawStatus,
|
||||||
|
),
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
_buildTicketNumbersDisplay(context, ticket),
|
||||||
|
const Gap(8),
|
||||||
|
Row(
|
||||||
|
spacing: 6,
|
||||||
|
children: [
|
||||||
|
const Icon(Symbols.asterisk, size: 18),
|
||||||
|
Text('multiplier').tr().fontSize(13),
|
||||||
|
Text(
|
||||||
|
'·',
|
||||||
|
).fontWeight(FontWeight.w900).fontSize(13),
|
||||||
|
Text(
|
||||||
|
'${ticket.multiplier}x',
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
|
).fontSize(13),
|
||||||
|
],
|
||||||
|
).opacity(0.75),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: FilledButton.icon(
|
||||||
|
onPressed: () => _showLotteryPurchaseSheet(context, ref),
|
||||||
|
icon: const Icon(Symbols.add),
|
||||||
|
label: Text('buyTicket'.tr()),
|
||||||
|
style: FilledButton.styleFrom(
|
||||||
|
minimumSize: const Size(double.infinity, 48),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
loading: () => const Center(child: CircularProgressIndicator()),
|
||||||
|
error: (error, stack) => Center(child: Text('Error: $error')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _showLotteryPurchaseSheet(
|
||||||
|
BuildContext context,
|
||||||
|
WidgetRef ref,
|
||||||
|
) async {
|
||||||
|
final result = await showModalBottomSheet<Map<String, dynamic>>(
|
||||||
|
context: context,
|
||||||
|
useRootNavigator: true,
|
||||||
|
isScrollControlled: true,
|
||||||
|
builder: (context) => const LotteryPurchaseSheet(),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result != null && context.mounted) {
|
||||||
|
await _handleLotteryPurchase(context, ref, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _handleLotteryPurchase(
|
||||||
|
BuildContext context,
|
||||||
|
WidgetRef ref,
|
||||||
|
Map<String, dynamic> purchaseData,
|
||||||
|
) async {
|
||||||
|
final client = ref.read(apiClientProvider);
|
||||||
|
try {
|
||||||
|
showLoadingModal(context);
|
||||||
|
|
||||||
|
// The lottery API creates the order for us
|
||||||
|
final orderResponse = await client.post(
|
||||||
|
'/pass/lotteries',
|
||||||
|
data: purchaseData,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (context.mounted) hideLoadingModal(context);
|
||||||
|
|
||||||
|
final order = SnWalletOrder.fromJson(orderResponse.data);
|
||||||
|
|
||||||
|
// Show payment overlay
|
||||||
|
if (context.mounted) {
|
||||||
|
final completedOrder = await PaymentOverlay.show(
|
||||||
|
context: context,
|
||||||
|
order: order,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (completedOrder != null) {
|
||||||
|
// Payment successful, refresh data
|
||||||
|
ref.invalidate(lotteryTicketsProvider);
|
||||||
|
ref.invalidate(walletCurrentProvider);
|
||||||
|
if (context.mounted) {
|
||||||
|
showSnackBar('ticketPurchasedSuccessfully'.tr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
if (context.mounted) hideLoadingModal(context);
|
||||||
|
showErrorAlert(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String _getLotteryStatusText(int status) {
|
||||||
|
switch (status) {
|
||||||
|
case 0:
|
||||||
|
return 'pending'.tr();
|
||||||
|
case 1:
|
||||||
|
return 'drawn'.tr();
|
||||||
|
case 2:
|
||||||
|
return 'won'.tr();
|
||||||
|
case 3:
|
||||||
|
return 'lost'.tr();
|
||||||
|
default:
|
||||||
|
return 'unknown'.tr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color _getLotteryStatusColor(BuildContext context, int status) {
|
||||||
|
switch (status) {
|
||||||
|
case 0:
|
||||||
|
return Colors.blue;
|
||||||
|
case 1:
|
||||||
|
return Colors.orange;
|
||||||
|
case 2:
|
||||||
|
return Colors.green;
|
||||||
|
case 3:
|
||||||
|
return Colors.red;
|
||||||
|
default:
|
||||||
|
return Theme.of(context).colorScheme.primary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTicketNumbersDisplay(
|
||||||
|
BuildContext context,
|
||||||
|
SnLotteryTicket ticket,
|
||||||
|
) {
|
||||||
|
final numbers = <Widget>[];
|
||||||
|
|
||||||
|
// Check if any numbers matched
|
||||||
|
bool hasAnyMatch =
|
||||||
|
ticket.matchedRegionOneNumbers != null &&
|
||||||
|
ticket.matchedRegionOneNumbers!.isNotEmpty;
|
||||||
|
|
||||||
|
// Add region one numbers
|
||||||
|
for (final number in ticket.regionOneNumbers) {
|
||||||
|
final isMatched =
|
||||||
|
ticket.matchedRegionOneNumbers?.contains(number) ?? false;
|
||||||
|
if (isMatched) hasAnyMatch = true;
|
||||||
|
numbers.add(
|
||||||
|
_buildNumberWidget(
|
||||||
|
context,
|
||||||
|
number,
|
||||||
|
isMatched: isMatched,
|
||||||
|
allUnmatched: !hasAnyMatch && ticket.drawStatus >= 1,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add region two number
|
||||||
|
final isSpecialMatched =
|
||||||
|
ticket.matchedRegionTwoNumber == ticket.regionTwoNumber;
|
||||||
|
if (isSpecialMatched) hasAnyMatch = true;
|
||||||
|
numbers.add(
|
||||||
|
_buildNumberWidget(
|
||||||
|
context,
|
||||||
|
ticket.regionTwoNumber,
|
||||||
|
isMatched: isSpecialMatched,
|
||||||
|
isSpecial: true,
|
||||||
|
allUnmatched: !hasAnyMatch && ticket.drawStatus >= 1,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return Wrap(
|
||||||
|
spacing: 6,
|
||||||
|
crossAxisAlignment: WrapCrossAlignment.center,
|
||||||
|
children: numbers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildNumberWidget(
|
||||||
|
BuildContext context,
|
||||||
|
int number, {
|
||||||
|
bool isMatched = false,
|
||||||
|
bool isSpecial = false,
|
||||||
|
bool allUnmatched = false,
|
||||||
|
}) {
|
||||||
|
Color backgroundColor;
|
||||||
|
Color textColor;
|
||||||
|
Color borderColor;
|
||||||
|
|
||||||
|
if (isMatched) {
|
||||||
|
backgroundColor = Colors.green;
|
||||||
|
textColor = Colors.white;
|
||||||
|
borderColor = Colors.green;
|
||||||
|
} else {
|
||||||
|
backgroundColor =
|
||||||
|
isSpecial
|
||||||
|
? Theme.of(context).colorScheme.secondary
|
||||||
|
: Theme.of(context).colorScheme.surface;
|
||||||
|
textColor =
|
||||||
|
isSpecial
|
||||||
|
? Theme.of(context).colorScheme.onSecondary
|
||||||
|
: Theme.of(context).colorScheme.onSurface;
|
||||||
|
borderColor =
|
||||||
|
isSpecial
|
||||||
|
? Theme.of(context).colorScheme.secondary
|
||||||
|
: Theme.of(context).colorScheme.outline.withOpacity(0.3);
|
||||||
|
|
||||||
|
// Blend with red if all numbers are unmatched
|
||||||
|
if (allUnmatched) {
|
||||||
|
backgroundColor = Color.alphaBlend(
|
||||||
|
Colors.red.withOpacity(0.3),
|
||||||
|
backgroundColor,
|
||||||
|
);
|
||||||
|
if (!isSpecial) {
|
||||||
|
textColor = Color.alphaBlend(Colors.red.withOpacity(0.5), textColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
width: 32,
|
||||||
|
height: 32,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: backgroundColor,
|
||||||
|
border: Border.all(color: borderColor),
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
number.toString().padLeft(2, '0'),
|
||||||
|
style: TextStyle(
|
||||||
|
color: textColor,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LotteryRecordsList extends HookConsumerWidget {
|
||||||
|
const LotteryRecordsList({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final records = ref.watch(lotteryRecordsProvider());
|
||||||
|
|
||||||
|
return records.when(
|
||||||
|
data: (recordsList) {
|
||||||
|
if (recordsList.isEmpty) {
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Symbols.history,
|
||||||
|
size: 48,
|
||||||
|
color: Theme.of(context).colorScheme.outline,
|
||||||
|
),
|
||||||
|
const Gap(16),
|
||||||
|
Text(
|
||||||
|
'noDrawHistory'.tr(),
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
itemCount: recordsList.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
final record = recordsList[index];
|
||||||
|
return Card(
|
||||||
|
margin: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Symbols.celebration,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Text(
|
||||||
|
DateFormat.yMd().format(record.drawDate),
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Text(
|
||||||
|
'${'winningNumbers'.tr()}: ${record.winningRegionOneNumbers.join(', ')}',
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
'${'specialNumber'.tr()}: ${record.winningRegionTwoNumber}',
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Text(
|
||||||
|
'${'totalTickets'.tr()}: ${record.totalTickets}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
'${'totalWinners'.tr()}: ${record.totalPrizesAwarded}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
'${'prizePool'.tr()}: ${record.totalPrizeAmount.toStringAsFixed(2)} ${'walletCurrencyShortPoints'.tr()}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
loading: () => const Center(child: CircularProgressIndicator()),
|
||||||
|
error: (error, stack) => Center(child: Text('Error: $error')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LotteryPurchaseSheet extends StatefulWidget {
|
||||||
|
const LotteryPurchaseSheet({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<LotteryPurchaseSheet> createState() => _LotteryPurchaseSheetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LotteryPurchaseSheetState extends State<LotteryPurchaseSheet> {
|
||||||
|
final List<int> selectedNumbers = [];
|
||||||
|
int multiplier = 1;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final totalCost = 10.0 * multiplier; // Base cost of 10 ISP per ticket
|
||||||
|
|
||||||
|
return SheetScaffold(
|
||||||
|
titleText: 'buyLotteryTicket'.tr(),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
// Number Selection Section
|
||||||
|
Text(
|
||||||
|
'selectNumbers'.tr(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Text(
|
||||||
|
'select5UniqueNumbers'.tr(),
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
'The last selected number will be your special number.',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||||
|
color: Theme.of(context).colorScheme.secondary,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(16),
|
||||||
|
|
||||||
|
// Number Grid
|
||||||
|
_buildNumberGrid(),
|
||||||
|
|
||||||
|
const Gap(16),
|
||||||
|
|
||||||
|
// Multiplier Section
|
||||||
|
Text(
|
||||||
|
'selectMultiplier'.tr(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(16),
|
||||||
|
_buildMultiplierSelector(),
|
||||||
|
|
||||||
|
const Gap(16),
|
||||||
|
|
||||||
|
// Cost Summary
|
||||||
|
Card(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text('baseCost'.tr()),
|
||||||
|
Text('10.00 ${'walletCurrencyShortPoints'.tr()}'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (multiplier > 1) ...[
|
||||||
|
const Gap(8),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'multiplier'.tr(
|
||||||
|
args: [multiplier.toString()],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'+ ${(10.0 * (multiplier - 1)).toStringAsFixed(2)} ${'walletCurrencyShortPoints'.tr()}',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
const Divider(),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'totalCost'.tr(),
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'${totalCost.toStringAsFixed(2)} ${'walletCurrencyShortPoints'.tr()}',
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
const Gap(16),
|
||||||
|
|
||||||
|
// Prize Structure
|
||||||
|
Text(
|
||||||
|
'prizeStructure'.tr(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
_buildPrizeStructure(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Action Buttons
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: OutlinedButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text('cancel'.tr()),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Expanded(
|
||||||
|
child: FilledButton(
|
||||||
|
onPressed: _canPurchase ? _purchaseTicket : null,
|
||||||
|
child: Text('purchase'.tr()),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildNumberGrid() {
|
||||||
|
return GridView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
crossAxisCount: 10,
|
||||||
|
crossAxisSpacing: 8,
|
||||||
|
mainAxisSpacing: 8,
|
||||||
|
),
|
||||||
|
itemCount: 100,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
final number = index;
|
||||||
|
final isSelected = selectedNumbers.contains(number);
|
||||||
|
final isSpecialNumber =
|
||||||
|
selectedNumbers.isNotEmpty &&
|
||||||
|
selectedNumbers.last == number &&
|
||||||
|
selectedNumbers.length == 6;
|
||||||
|
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () => _toggleNumber(number),
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color:
|
||||||
|
isSpecialNumber
|
||||||
|
? Theme.of(context).colorScheme.secondary
|
||||||
|
: isSelected
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Theme.of(context).colorScheme.surface,
|
||||||
|
border: Border.all(
|
||||||
|
color:
|
||||||
|
isSpecialNumber
|
||||||
|
? Theme.of(context).colorScheme.secondary
|
||||||
|
: isSelected
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.outline.withOpacity(0.3),
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
number.toString().padLeft(2, '0'),
|
||||||
|
style: TextStyle(
|
||||||
|
color:
|
||||||
|
isSpecialNumber
|
||||||
|
? Theme.of(context).colorScheme.onSecondary
|
||||||
|
: isSelected
|
||||||
|
? Theme.of(context).colorScheme.onPrimary
|
||||||
|
: Theme.of(context).colorScheme.onSurface,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildMultiplierSelector() {
|
||||||
|
return TextFormField(
|
||||||
|
initialValue: multiplier.toString(),
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'multiplierLabel'.tr(),
|
||||||
|
prefixText: 'x',
|
||||||
|
border: OutlineInputBorder(borderRadius: BorderRadius.circular(8)),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 16,
|
||||||
|
vertical: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
final parsed = int.tryParse(value);
|
||||||
|
if (parsed != null && parsed >= 1) {
|
||||||
|
setState(() => multiplier = parsed);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
validator: (value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return 'Please enter a multiplier';
|
||||||
|
}
|
||||||
|
final parsed = int.tryParse(value);
|
||||||
|
if (parsed == null || parsed < 1 || parsed > 10) {
|
||||||
|
return 'Multiplier must be between 1 and 10';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildPrizeStructure() {
|
||||||
|
// Base rewards for matched numbers (0-5)
|
||||||
|
final baseRewards = [0, 10, 100, 500, 1000, 10000];
|
||||||
|
|
||||||
|
final prizeStructure = <String, String>{};
|
||||||
|
|
||||||
|
// Generate prize structure for 0-5 matches with and without special
|
||||||
|
for (int matches = 5; matches >= 0; matches--) {
|
||||||
|
final baseReward = baseRewards[matches];
|
||||||
|
|
||||||
|
// With special number match (x10 multiplier)
|
||||||
|
final specialReward = baseReward * 10;
|
||||||
|
prizeStructure['$matches+Special'] = specialReward.toStringAsFixed(2);
|
||||||
|
|
||||||
|
// Without special number match
|
||||||
|
if (matches > 0) {
|
||||||
|
prizeStructure[matches.toString()] = baseReward.toStringAsFixed(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Card(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
children:
|
||||||
|
prizeStructure.entries.map((entry) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
entry.key == '0+Special'
|
||||||
|
? 'specialOnly'.tr()
|
||||||
|
: entry.key.tr(),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'${entry.value} ${'walletCurrencyShortPoints'.tr()}',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _toggleNumber(int number) {
|
||||||
|
setState(() {
|
||||||
|
if (selectedNumbers.contains(number)) {
|
||||||
|
selectedNumbers.remove(number);
|
||||||
|
} else if (selectedNumbers.length < 6) {
|
||||||
|
selectedNumbers.add(number);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get _canPurchase {
|
||||||
|
return selectedNumbers.length == 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _purchaseTicket() async {
|
||||||
|
if (!_canPurchase) return;
|
||||||
|
|
||||||
|
// Sort all numbers except the last one (special number)
|
||||||
|
final regularNumbers = selectedNumbers.sublist(0, 5)..sort();
|
||||||
|
final specialNumber = selectedNumbers.last;
|
||||||
|
|
||||||
|
final purchaseData = {
|
||||||
|
'region_one_numbers': regularNumbers,
|
||||||
|
'region_two_number': specialNumber,
|
||||||
|
'multiplier': multiplier,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (mounted) Navigator.of(context).pop(purchaseData);
|
||||||
|
}
|
||||||
|
}
|
||||||
307
lib/screens/lottery.g.dart
Normal file
307
lib/screens/lottery.g.dart
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'lottery.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$lotteryTicketsHash() => r'dd17cd721fc3b176ffa0ee0a85d0d850740e5e80';
|
||||||
|
|
||||||
|
/// 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 [lotteryTickets].
|
||||||
|
@ProviderFor(lotteryTickets)
|
||||||
|
const lotteryTicketsProvider = LotteryTicketsFamily();
|
||||||
|
|
||||||
|
/// See also [lotteryTickets].
|
||||||
|
class LotteryTicketsFamily extends Family<AsyncValue<List<SnLotteryTicket>>> {
|
||||||
|
/// See also [lotteryTickets].
|
||||||
|
const LotteryTicketsFamily();
|
||||||
|
|
||||||
|
/// See also [lotteryTickets].
|
||||||
|
LotteryTicketsProvider call({int offset = 0, int take = 20}) {
|
||||||
|
return LotteryTicketsProvider(offset: offset, take: take);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
LotteryTicketsProvider getProviderOverride(
|
||||||
|
covariant LotteryTicketsProvider provider,
|
||||||
|
) {
|
||||||
|
return call(offset: provider.offset, take: provider.take);
|
||||||
|
}
|
||||||
|
|
||||||
|
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'lotteryTicketsProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [lotteryTickets].
|
||||||
|
class LotteryTicketsProvider
|
||||||
|
extends AutoDisposeFutureProvider<List<SnLotteryTicket>> {
|
||||||
|
/// See also [lotteryTickets].
|
||||||
|
LotteryTicketsProvider({int offset = 0, int take = 20})
|
||||||
|
: this._internal(
|
||||||
|
(ref) => lotteryTickets(
|
||||||
|
ref as LotteryTicketsRef,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
),
|
||||||
|
from: lotteryTicketsProvider,
|
||||||
|
name: r'lotteryTicketsProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$lotteryTicketsHash,
|
||||||
|
dependencies: LotteryTicketsFamily._dependencies,
|
||||||
|
allTransitiveDependencies:
|
||||||
|
LotteryTicketsFamily._allTransitiveDependencies,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
);
|
||||||
|
|
||||||
|
LotteryTicketsProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.offset,
|
||||||
|
required this.take,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final int offset;
|
||||||
|
final int take;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<List<SnLotteryTicket>> Function(LotteryTicketsRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: LotteryTicketsProvider._internal(
|
||||||
|
(ref) => create(ref as LotteryTicketsRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<List<SnLotteryTicket>> createElement() {
|
||||||
|
return _LotteryTicketsProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is LotteryTicketsProvider &&
|
||||||
|
other.offset == offset &&
|
||||||
|
other.take == take;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, offset.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, take.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
|
// ignore: unused_element
|
||||||
|
mixin LotteryTicketsRef on AutoDisposeFutureProviderRef<List<SnLotteryTicket>> {
|
||||||
|
/// The parameter `offset` of this provider.
|
||||||
|
int get offset;
|
||||||
|
|
||||||
|
/// The parameter `take` of this provider.
|
||||||
|
int get take;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LotteryTicketsProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<List<SnLotteryTicket>>
|
||||||
|
with LotteryTicketsRef {
|
||||||
|
_LotteryTicketsProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get offset => (origin as LotteryTicketsProvider).offset;
|
||||||
|
@override
|
||||||
|
int get take => (origin as LotteryTicketsProvider).take;
|
||||||
|
}
|
||||||
|
|
||||||
|
String _$lotteryRecordsHash() => r'55c657460f18d9777741d09013b445ca036863f3';
|
||||||
|
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
@ProviderFor(lotteryRecords)
|
||||||
|
const lotteryRecordsProvider = LotteryRecordsFamily();
|
||||||
|
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
class LotteryRecordsFamily extends Family<AsyncValue<List<SnLotteryRecord>>> {
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
const LotteryRecordsFamily();
|
||||||
|
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
LotteryRecordsProvider call({int offset = 0, int take = 20}) {
|
||||||
|
return LotteryRecordsProvider(offset: offset, take: take);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
LotteryRecordsProvider getProviderOverride(
|
||||||
|
covariant LotteryRecordsProvider provider,
|
||||||
|
) {
|
||||||
|
return call(offset: provider.offset, take: provider.take);
|
||||||
|
}
|
||||||
|
|
||||||
|
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'lotteryRecordsProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
class LotteryRecordsProvider
|
||||||
|
extends AutoDisposeFutureProvider<List<SnLotteryRecord>> {
|
||||||
|
/// See also [lotteryRecords].
|
||||||
|
LotteryRecordsProvider({int offset = 0, int take = 20})
|
||||||
|
: this._internal(
|
||||||
|
(ref) => lotteryRecords(
|
||||||
|
ref as LotteryRecordsRef,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
),
|
||||||
|
from: lotteryRecordsProvider,
|
||||||
|
name: r'lotteryRecordsProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$lotteryRecordsHash,
|
||||||
|
dependencies: LotteryRecordsFamily._dependencies,
|
||||||
|
allTransitiveDependencies:
|
||||||
|
LotteryRecordsFamily._allTransitiveDependencies,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
);
|
||||||
|
|
||||||
|
LotteryRecordsProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.offset,
|
||||||
|
required this.take,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final int offset;
|
||||||
|
final int take;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<List<SnLotteryRecord>> Function(LotteryRecordsRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: LotteryRecordsProvider._internal(
|
||||||
|
(ref) => create(ref as LotteryRecordsRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
offset: offset,
|
||||||
|
take: take,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<List<SnLotteryRecord>> createElement() {
|
||||||
|
return _LotteryRecordsProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is LotteryRecordsProvider &&
|
||||||
|
other.offset == offset &&
|
||||||
|
other.take == take;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, offset.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, take.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
|
// ignore: unused_element
|
||||||
|
mixin LotteryRecordsRef on AutoDisposeFutureProviderRef<List<SnLotteryRecord>> {
|
||||||
|
/// The parameter `offset` of this provider.
|
||||||
|
int get offset;
|
||||||
|
|
||||||
|
/// The parameter `take` of this provider.
|
||||||
|
int get take;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LotteryRecordsProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<List<SnLotteryRecord>>
|
||||||
|
with LotteryRecordsRef {
|
||||||
|
_LotteryRecordsProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get offset => (origin as LotteryRecordsProvider).offset;
|
||||||
|
@override
|
||||||
|
int get take => (origin as LotteryRecordsProvider).take;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
@@ -3,7 +3,6 @@ import 'dart:math' as math;
|
|||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gap/gap.dart';
|
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:island/models/account.dart';
|
import 'package:island/models/account.dart';
|
||||||
@@ -11,8 +10,8 @@ import 'package:island/pods/network.dart';
|
|||||||
import 'package:island/pods/websocket.dart';
|
import 'package:island/pods/websocket.dart';
|
||||||
import 'package:island/route.dart';
|
import 'package:island/route.dart';
|
||||||
import 'package:island/widgets/alert.dart';
|
import 'package:island/widgets/alert.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
|
||||||
import 'package:island/widgets/content/markdown.dart';
|
import 'package:island/widgets/content/markdown.dart';
|
||||||
|
import 'package:island/widgets/content/sheet.dart';
|
||||||
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
||||||
import 'package:relative_time/relative_time.dart';
|
import 'package:relative_time/relative_time.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
@@ -113,8 +112,8 @@ class NotificationListNotifier extends _$NotificationListNotifier
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NotificationScreen extends HookConsumerWidget {
|
class NotificationSheet extends HookConsumerWidget {
|
||||||
const NotificationScreen({super.key});
|
const NotificationSheet({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
@@ -128,19 +127,15 @@ class NotificationScreen extends HookConsumerWidget {
|
|||||||
ref.watch(notificationUnreadCountNotifierProvider.notifier).clear();
|
ref.watch(notificationUnreadCountNotifierProvider.notifier).clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
return AppScaffold(
|
return SheetScaffold(
|
||||||
appBar: AppBar(
|
titleText: 'notifications'.tr(),
|
||||||
leading: const PageBackButton(),
|
actions: [
|
||||||
title: const Text('notifications').tr(),
|
IconButton(
|
||||||
actions: [
|
onPressed: markAllRead,
|
||||||
IconButton(
|
icon: const Icon(Symbols.mark_as_unread),
|
||||||
onPressed: markAllRead,
|
),
|
||||||
icon: const Icon(Symbols.mark_as_unread),
|
],
|
||||||
),
|
child: PagingHelperView(
|
||||||
const Gap(8),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: PagingHelperView(
|
|
||||||
provider: notificationListNotifierProvider,
|
provider: notificationListNotifierProvider,
|
||||||
futureRefreshable: notificationListNotifierProvider.future,
|
futureRefreshable: notificationListNotifierProvider.future,
|
||||||
notifierRefreshable: notificationListNotifierProvider.notifier,
|
notifierRefreshable: notificationListNotifierProvider.notifier,
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ class PostCategoryDetailScreen extends HookConsumerWidget {
|
|||||||
loading: () => ResponseLoadingWidget(),
|
loading: () => ResponseLoadingWidget(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
).padding(horizontal: 8),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SliverGap(4),
|
const SliverGap(4),
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ class PostActionButtons extends HookConsumerWidget {
|
|||||||
builder: (context) => PostAwardHistorySheet(postId: post.id),
|
builder: (context) => PostAwardHistorySheet(postId: post.id),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
icon: const Icon(Symbols.star),
|
icon: const Icon(Symbols.emoji_events),
|
||||||
label:
|
label:
|
||||||
post.awardedScore > 0
|
post.awardedScore > 0
|
||||||
? Text('${formatScore(post.awardedScore)} pts')
|
? Text('${formatScore(post.awardedScore)} pts')
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:island/models/post.dart';
|
import 'package:island/models/post.dart';
|
||||||
import 'package:island/models/publisher.dart';
|
import 'package:island/models/publisher.dart';
|
||||||
import 'package:island/models/account.dart';
|
import 'package:island/models/account.dart';
|
||||||
|
import 'package:island/models/heatmap.dart';
|
||||||
import 'package:island/pods/config.dart';
|
import 'package:island/pods/config.dart';
|
||||||
import 'package:island/pods/network.dart';
|
import 'package:island/pods/network.dart';
|
||||||
import 'package:island/services/color.dart';
|
import 'package:island/services/color.dart';
|
||||||
@@ -20,6 +21,7 @@ import 'package:island/widgets/app_scaffold.dart';
|
|||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
import 'package:island/widgets/content/markdown.dart';
|
import 'package:island/widgets/content/markdown.dart';
|
||||||
import 'package:island/widgets/post/post_list.dart';
|
import 'package:island/widgets/post/post_list.dart';
|
||||||
|
import 'package:island/widgets/activity_heatmap.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:island/services/color_extraction.dart';
|
import 'package:island/services/color_extraction.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
@@ -222,6 +224,32 @@ class _PublisherBioWidget extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _PublisherHeatmapWidget extends StatelessWidget {
|
||||||
|
final AsyncValue<SnHeatmap?> heatmap;
|
||||||
|
final bool forceDense;
|
||||||
|
|
||||||
|
const _PublisherHeatmapWidget({
|
||||||
|
required this.heatmap,
|
||||||
|
this.forceDense = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return heatmap.when(
|
||||||
|
data:
|
||||||
|
(data) =>
|
||||||
|
data != null
|
||||||
|
? ActivityHeatmapWidget(
|
||||||
|
heatmap: data,
|
||||||
|
forceDense: forceDense,
|
||||||
|
).padding(horizontal: 8)
|
||||||
|
: const SizedBox.shrink(),
|
||||||
|
loading: () => const SizedBox.shrink(),
|
||||||
|
error: (_, _) => const SizedBox.shrink(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class _PublisherCategoryTabWidget extends StatelessWidget {
|
class _PublisherCategoryTabWidget extends StatelessWidget {
|
||||||
final TabController categoryTabController;
|
final TabController categoryTabController;
|
||||||
|
|
||||||
@@ -257,7 +285,9 @@ Future<List<SnAccountBadge>> publisherBadges(Ref ref, String pubName) async {
|
|||||||
final pub = await ref.watch(publisherProvider(pubName).future);
|
final pub = await ref.watch(publisherProvider(pubName).future);
|
||||||
if (pub.type != 0 || pub.account == null) return [];
|
if (pub.type != 0 || pub.account == null) return [];
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final resp = await apiClient.get("/id/accounts/${pub.account!.name}/badges");
|
final resp = await apiClient.get(
|
||||||
|
"/pass/accounts/${pub.account!.name}/badges",
|
||||||
|
);
|
||||||
return List<SnAccountBadge>.from(
|
return List<SnAccountBadge>.from(
|
||||||
resp.data.map((x) => SnAccountBadge.fromJson(x)),
|
resp.data.map((x) => SnAccountBadge.fromJson(x)),
|
||||||
);
|
);
|
||||||
@@ -292,6 +322,13 @@ Future<Color?> publisherAppbarForcegroundColor(Ref ref, String pubName) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@riverpod
|
||||||
|
Future<SnHeatmap?> publisherHeatmap(Ref ref, String uname) async {
|
||||||
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
|
final resp = await apiClient.get('/sphere/publishers/$uname/heatmap');
|
||||||
|
return SnHeatmap.fromJson(resp.data);
|
||||||
|
}
|
||||||
|
|
||||||
class PublisherProfileScreen extends HookConsumerWidget {
|
class PublisherProfileScreen extends HookConsumerWidget {
|
||||||
final String name;
|
final String name;
|
||||||
const PublisherProfileScreen({super.key, required this.name});
|
const PublisherProfileScreen({super.key, required this.name});
|
||||||
@@ -301,6 +338,7 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
final publisher = ref.watch(publisherProvider(name));
|
final publisher = ref.watch(publisherProvider(name));
|
||||||
final badges = ref.watch(publisherBadgesProvider(name));
|
final badges = ref.watch(publisherBadgesProvider(name));
|
||||||
final subStatus = ref.watch(publisherSubscriptionStatusProvider(name));
|
final subStatus = ref.watch(publisherSubscriptionStatusProvider(name));
|
||||||
|
final heatmap = ref.watch(publisherHeatmapProvider(name));
|
||||||
final appbarColor = ref.watch(
|
final appbarColor = ref.watch(
|
||||||
publisherAppbarForcegroundColorProvider(name),
|
publisherAppbarForcegroundColorProvider(name),
|
||||||
);
|
);
|
||||||
@@ -446,6 +484,10 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
_PublisherVerificationWidget(data: data),
|
_PublisherVerificationWidget(data: data),
|
||||||
_PublisherBioWidget(data: data),
|
_PublisherBioWidget(data: data),
|
||||||
|
_PublisherHeatmapWidget(
|
||||||
|
heatmap: heatmap,
|
||||||
|
forceDense: true,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -517,6 +559,9 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: _PublisherBioWidget(data: data),
|
child: _PublisherBioWidget(data: data),
|
||||||
),
|
),
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: _PublisherHeatmapWidget(heatmap: heatmap),
|
||||||
|
),
|
||||||
SliverPostList(pubName: name, pinned: true),
|
SliverPostList(pubName: name, pinned: true),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: _PublisherCategoryTabWidget(
|
child: _PublisherCategoryTabWidget(
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ class _PublisherProviderElement
|
|||||||
String get uname => (origin as PublisherProvider).uname;
|
String get uname => (origin as PublisherProvider).uname;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$publisherBadgesHash() => r'527efad74225fbacf558ac5db160ecce53a60c62';
|
String _$publisherBadgesHash() => r'26776fd6cb611953f52bdb6a7dfa004c34d5cd8e';
|
||||||
|
|
||||||
/// See also [publisherBadges].
|
/// See also [publisherBadges].
|
||||||
@ProviderFor(publisherBadges)
|
@ProviderFor(publisherBadges)
|
||||||
@@ -530,5 +530,126 @@ class _PublisherAppbarForcegroundColorProviderElement
|
|||||||
(origin as PublisherAppbarForcegroundColorProvider).pubName;
|
(origin as PublisherAppbarForcegroundColorProvider).pubName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _$publisherHeatmapHash() => r'86db275ce3861a2855b5ec35fbfef85fc47b23a6';
|
||||||
|
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
@ProviderFor(publisherHeatmap)
|
||||||
|
const publisherHeatmapProvider = PublisherHeatmapFamily();
|
||||||
|
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
class PublisherHeatmapFamily extends Family<AsyncValue<SnHeatmap?>> {
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
const PublisherHeatmapFamily();
|
||||||
|
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
PublisherHeatmapProvider call(String uname) {
|
||||||
|
return PublisherHeatmapProvider(uname);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PublisherHeatmapProvider getProviderOverride(
|
||||||
|
covariant PublisherHeatmapProvider provider,
|
||||||
|
) {
|
||||||
|
return call(provider.uname);
|
||||||
|
}
|
||||||
|
|
||||||
|
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'publisherHeatmapProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
class PublisherHeatmapProvider extends AutoDisposeFutureProvider<SnHeatmap?> {
|
||||||
|
/// See also [publisherHeatmap].
|
||||||
|
PublisherHeatmapProvider(String uname)
|
||||||
|
: this._internal(
|
||||||
|
(ref) => publisherHeatmap(ref as PublisherHeatmapRef, uname),
|
||||||
|
from: publisherHeatmapProvider,
|
||||||
|
name: r'publisherHeatmapProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$publisherHeatmapHash,
|
||||||
|
dependencies: PublisherHeatmapFamily._dependencies,
|
||||||
|
allTransitiveDependencies:
|
||||||
|
PublisherHeatmapFamily._allTransitiveDependencies,
|
||||||
|
uname: uname,
|
||||||
|
);
|
||||||
|
|
||||||
|
PublisherHeatmapProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.uname,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final String uname;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<SnHeatmap?> Function(PublisherHeatmapRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: PublisherHeatmapProvider._internal(
|
||||||
|
(ref) => create(ref as PublisherHeatmapRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
uname: uname,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<SnHeatmap?> createElement() {
|
||||||
|
return _PublisherHeatmapProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is PublisherHeatmapProvider && other.uname == uname;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, uname.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
|
// ignore: unused_element
|
||||||
|
mixin PublisherHeatmapRef on AutoDisposeFutureProviderRef<SnHeatmap?> {
|
||||||
|
/// The parameter `uname` of this provider.
|
||||||
|
String get uname;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PublisherHeatmapProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<SnHeatmap?>
|
||||||
|
with PublisherHeatmapRef {
|
||||||
|
_PublisherHeatmapProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get uname => (origin as PublisherHeatmapProvider).uname;
|
||||||
|
}
|
||||||
|
|
||||||
// ignore_for_file: type=lint
|
// 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
|
// 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
|
||||||
|
|||||||
@@ -47,9 +47,7 @@ Future<Color?> realmAppbarForegroundColor(Ref ref, String realmSlug) async {
|
|||||||
Future<SnRealmMember?> realmIdentity(Ref ref, String realmSlug) async {
|
Future<SnRealmMember?> realmIdentity(Ref ref, String realmSlug) async {
|
||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final response = await apiClient.get(
|
final response = await apiClient.get('/pass/realms/$realmSlug/members/me');
|
||||||
'/sphere/realms/$realmSlug/members/me',
|
|
||||||
);
|
|
||||||
return SnRealmMember.fromJson(response.data);
|
return SnRealmMember.fromJson(response.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException && err.response?.statusCode == 404) {
|
if (err is DioException && err.response?.statusCode == 404) {
|
||||||
@@ -117,7 +115,7 @@ class RealmDetailScreen extends HookConsumerWidget {
|
|||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
try {
|
try {
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.post('/sphere/realms/$slug/members/me');
|
await apiClient.post('/pass/realms/$slug/members/me');
|
||||||
ref.invalidate(realmIdentityProvider(slug));
|
ref.invalidate(realmIdentityProvider(slug));
|
||||||
ref.invalidate(realmsJoinedProvider);
|
ref.invalidate(realmsJoinedProvider);
|
||||||
showSnackBar('realmJoinSuccess'.tr());
|
showSnackBar('realmJoinSuccess'.tr());
|
||||||
@@ -432,7 +430,7 @@ class _RealmActionMenu extends HookConsumerWidget {
|
|||||||
).then((confirm) {
|
).then((confirm) {
|
||||||
if (confirm) {
|
if (confirm) {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
client.delete('/sphere/realms/$realmSlug');
|
client.delete('/pass/realms/$realmSlug');
|
||||||
ref.invalidate(realmsJoinedProvider);
|
ref.invalidate(realmsJoinedProvider);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
context.pop(true);
|
context.pop(true);
|
||||||
@@ -465,7 +463,7 @@ class _RealmActionMenu extends HookConsumerWidget {
|
|||||||
if (confirm) {
|
if (confirm) {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.delete(
|
await client.delete(
|
||||||
'/sphere/realms/$realmSlug/members/me',
|
'/pass/realms/$realmSlug/members/me',
|
||||||
);
|
);
|
||||||
ref.invalidate(realmsJoinedProvider);
|
ref.invalidate(realmsJoinedProvider);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
@@ -505,7 +503,7 @@ class _RealmActionMenu extends HookConsumerWidget {
|
|||||||
if (confirm) {
|
if (confirm) {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.delete(
|
await client.delete(
|
||||||
'/sphere/realms/$realmSlug/members/me',
|
'/pass/realms/$realmSlug/members/me',
|
||||||
);
|
);
|
||||||
ref.invalidate(realmsJoinedProvider);
|
ref.invalidate(realmsJoinedProvider);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
@@ -539,7 +537,7 @@ class RealmMemberListNotifier extends _$RealmMemberListNotifier
|
|||||||
final offset = cursor != null ? int.parse(cursor) : 0;
|
final offset = cursor != null ? int.parse(cursor) : 0;
|
||||||
|
|
||||||
final response = await apiClient.get(
|
final response = await apiClient.get(
|
||||||
'/sphere/realms/$realmSlug/members',
|
'/pass/realms/$realmSlug/members',
|
||||||
queryParameters: {
|
queryParameters: {
|
||||||
'offset': offset,
|
'offset': offset,
|
||||||
'take': _pageSize,
|
'take': _pageSize,
|
||||||
@@ -592,7 +590,7 @@ class _RealmMemberListSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
await apiClient.post(
|
await apiClient.post(
|
||||||
'/sphere/realms/invites/$realmSlug',
|
'/pass/realms/invites/$realmSlug',
|
||||||
data: {'related_user_id': result.id, 'role': 0},
|
data: {'related_user_id': result.id, 'role': 0},
|
||||||
);
|
);
|
||||||
// Refresh the provider
|
// Refresh the provider
|
||||||
@@ -729,7 +727,7 @@ class _RealmMemberListSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
await apiClient.delete(
|
await apiClient.delete(
|
||||||
'/sphere/realms/$realmSlug/members/${member.accountId}',
|
'/pass/realms/$realmSlug/members/${member.accountId}',
|
||||||
);
|
);
|
||||||
// Refresh the provider
|
// Refresh the provider
|
||||||
ref.invalidate(memberListProvider);
|
ref.invalidate(memberListProvider);
|
||||||
@@ -860,7 +858,7 @@ class _RealmMemberRoleSheet extends HookConsumerWidget {
|
|||||||
|
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.patch(
|
await apiClient.patch(
|
||||||
'/sphere/realms/$realmSlug/members/${member.accountId}/role',
|
'/pass/realms/$realmSlug/members/${member.accountId}/role',
|
||||||
data: newRole,
|
data: newRole,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ class _RealmAppbarForegroundColorProviderElement
|
|||||||
(origin as RealmAppbarForegroundColorProvider).realmSlug;
|
(origin as RealmAppbarForegroundColorProvider).realmSlug;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$realmIdentityHash() => r'c5e2977d243260947b919bc27146c134e34f0db1';
|
String _$realmIdentityHash() => r'd5a3ecc6eeec291cebbfc9a45d8aac7195366381';
|
||||||
|
|
||||||
/// See also [realmIdentity].
|
/// See also [realmIdentity].
|
||||||
@ProviderFor(realmIdentity)
|
@ProviderFor(realmIdentity)
|
||||||
@@ -399,7 +399,7 @@ class _RealmChatRoomsProviderElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
String _$realmMemberListNotifierHash() =>
|
String _$realmMemberListNotifierHash() =>
|
||||||
r'db1fd8a6741dfb3d5bb921d5d965f0cfdc0e7bcc';
|
r'ab38c550c43cbf93d4c3e92e6658d76f40252c1f';
|
||||||
|
|
||||||
abstract class _$RealmMemberListNotifier
|
abstract class _$RealmMemberListNotifier
|
||||||
extends BuildlessAutoDisposeAsyncNotifier<CursorPagingData<SnRealmMember>> {
|
extends BuildlessAutoDisposeAsyncNotifier<CursorPagingData<SnRealmMember>> {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ class EditRealmScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.request(
|
final resp = await client.request(
|
||||||
'/sphere${slug == null ? '/realms' : '/realms/$slug'}',
|
'/pass${slug == null ? '/realms' : '/realms/$slug'}',
|
||||||
data: {
|
data: {
|
||||||
'slug': slugController.text,
|
'slug': slugController.text,
|
||||||
'name': nameController.text,
|
'name': nameController.text,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ part 'realms.g.dart';
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnRealm>> realmsJoined(Ref ref) async {
|
Future<List<SnRealm>> realmsJoined(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/sphere/realms');
|
final resp = await client.get('/pass/realms');
|
||||||
return resp.data.map((e) => SnRealm.fromJson(e)).cast<SnRealm>().toList();
|
return resp.data.map((e) => SnRealm.fromJson(e)).cast<SnRealm>().toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ Future<List<SnRealm>> realmsJoined(Ref ref) async {
|
|||||||
Future<SnRealm?> realm(Ref ref, String? identifier) async {
|
Future<SnRealm?> realm(Ref ref, String? identifier) async {
|
||||||
if (identifier == null) return null;
|
if (identifier == null) return null;
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/sphere/realms/$identifier');
|
final resp = await client.get('/pass/realms/$identifier');
|
||||||
return SnRealm.fromJson(resp.data);
|
return SnRealm.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ class RealmListScreen extends HookConsumerWidget {
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<List<SnRealmMember>> realmInvites(Ref ref) async {
|
Future<List<SnRealmMember>> realmInvites(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/sphere/realms/invites');
|
final resp = await client.get('/pass/realms/invites');
|
||||||
return resp.data
|
return resp.data
|
||||||
.map((e) => SnRealmMember.fromJson(e))
|
.map((e) => SnRealmMember.fromJson(e))
|
||||||
.cast<SnRealmMember>()
|
.cast<SnRealmMember>()
|
||||||
@@ -145,9 +145,7 @@ class _RealmInviteSheet extends HookConsumerWidget {
|
|||||||
Future<void> acceptInvite(SnRealmMember invite) async {
|
Future<void> acceptInvite(SnRealmMember invite) async {
|
||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post('/pass/realms/invites/${invite.realm!.slug}/accept');
|
||||||
'/sphere/realms/invites/${invite.realm!.slug}/accept',
|
|
||||||
);
|
|
||||||
ref.invalidate(realmInvitesProvider);
|
ref.invalidate(realmInvitesProvider);
|
||||||
ref.invalidate(realmsJoinedProvider);
|
ref.invalidate(realmsJoinedProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -158,9 +156,7 @@ class _RealmInviteSheet extends HookConsumerWidget {
|
|||||||
Future<void> declineInvite(SnRealmMember invite) async {
|
Future<void> declineInvite(SnRealmMember invite) async {
|
||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post('/pass/realms/invites/${invite.realm!.slug}/decline');
|
||||||
'/sphere/realms/invites/${invite.realm!.slug}/decline',
|
|
||||||
);
|
|
||||||
ref.invalidate(realmInvitesProvider);
|
ref.invalidate(realmInvitesProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'realms.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$realmsJoinedHash() => r'e8083f02ffae450bba2470c31757675b4df32cd0';
|
String _$realmsJoinedHash() => r'b15029acd38f03bbbb8708adb78f25ac357a0421';
|
||||||
|
|
||||||
/// See also [realmsJoined].
|
/// See also [realmsJoined].
|
||||||
@ProviderFor(realmsJoined)
|
@ProviderFor(realmsJoined)
|
||||||
@@ -22,7 +22,7 @@ final realmsJoinedProvider = AutoDisposeFutureProvider<List<SnRealm>>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef RealmsJoinedRef = AutoDisposeFutureProviderRef<List<SnRealm>>;
|
typedef RealmsJoinedRef = AutoDisposeFutureProviderRef<List<SnRealm>>;
|
||||||
String _$realmHash() => r'4650b17608a9ee14170ef20295eb14d295e909c9';
|
String _$realmHash() => r'71a126ab2810566646e1629290c1ce9ffa0839e3';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
@@ -156,7 +156,7 @@ class _RealmProviderElement extends AutoDisposeFutureProviderElement<SnRealm?>
|
|||||||
String? get identifier => (origin as RealmProvider).identifier;
|
String? get identifier => (origin as RealmProvider).identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$realmInvitesHash() => r'ed73443c6423b92ed72982be2a93b7dcc7ce3945';
|
String _$realmInvitesHash() => r'92cce0978c7ca8813e27ae42fc6f3a93a09a8962';
|
||||||
|
|
||||||
/// See also [realmInvites].
|
/// See also [realmInvites].
|
||||||
@ProviderFor(realmInvites)
|
@ProviderFor(realmInvites)
|
||||||
|
|||||||
@@ -784,6 +784,22 @@ class SettingsScreen extends HookConsumerWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// Disable animation settings
|
||||||
|
ListTile(
|
||||||
|
minLeadingWidth: 48,
|
||||||
|
title: Text('settingsDisableAnimation').tr(),
|
||||||
|
contentPadding: const EdgeInsets.only(left: 24, right: 17),
|
||||||
|
leading: const Icon(Symbols.animation),
|
||||||
|
trailing: Switch(
|
||||||
|
value: settings.disableAnimation,
|
||||||
|
onChanged: (value) {
|
||||||
|
ref
|
||||||
|
.read(appSettingsNotifierProvider.notifier)
|
||||||
|
.setDisableAnimation(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
// Desktop-specific settings
|
// Desktop-specific settings
|
||||||
|
|||||||
@@ -50,10 +50,13 @@ class TabsScreen extends HookConsumerWidget {
|
|||||||
label: 'explore'.tr(),
|
label: 'explore'.tr(),
|
||||||
icon: const Icon(Symbols.explore),
|
icon: const Icon(Symbols.explore),
|
||||||
),
|
),
|
||||||
NavigationDestination(label: 'chat'.tr(), icon: const Icon(Symbols.chat)),
|
NavigationDestination(
|
||||||
|
label: 'chat'.tr(),
|
||||||
|
icon: const Icon(Symbols.chat_rounded),
|
||||||
|
),
|
||||||
NavigationDestination(
|
NavigationDestination(
|
||||||
label: 'realms'.tr(),
|
label: 'realms'.tr(),
|
||||||
icon: const Icon(Symbols.workspaces),
|
icon: const Icon(Symbols.group),
|
||||||
),
|
),
|
||||||
NavigationDestination(
|
NavigationDestination(
|
||||||
label: 'account'.tr(),
|
label: 'account'.tr(),
|
||||||
@@ -66,12 +69,12 @@ class TabsScreen extends HookConsumerWidget {
|
|||||||
if (wideScreen)
|
if (wideScreen)
|
||||||
NavigationDestination(
|
NavigationDestination(
|
||||||
label: 'creatorHub'.tr(),
|
label: 'creatorHub'.tr(),
|
||||||
icon: const Icon(Symbols.draw),
|
icon: const Icon(Symbols.ink_pen),
|
||||||
),
|
),
|
||||||
if (wideScreen)
|
if (wideScreen)
|
||||||
NavigationDestination(
|
NavigationDestination(
|
||||||
label: 'developerHub'.tr(),
|
label: 'developerHub'.tr(),
|
||||||
icon: const Icon(Symbols.code),
|
icon: const Icon(Symbols.data_object),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -126,6 +129,7 @@ class TabsScreen extends HookConsumerWidget {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
extendBody: true,
|
extendBody: true,
|
||||||
|
resizeToAvoidBottomInset: false,
|
||||||
body: ClipRRect(
|
body: ClipRRect(
|
||||||
borderRadius: const BorderRadius.only(
|
borderRadius: const BorderRadius.only(
|
||||||
topLeft: Radius.circular(16),
|
topLeft: Radius.circular(16),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:island/models/account.dart';
|
import 'package:island/models/account.dart';
|
||||||
import 'package:island/models/wallet.dart';
|
import 'package:island/models/wallet.dart';
|
||||||
import 'package:island/pods/network.dart';
|
import 'package:island/pods/network.dart';
|
||||||
|
import 'package:island/screens/lottery.dart';
|
||||||
import 'package:island/widgets/account/account_pfc.dart';
|
import 'package:island/widgets/account/account_pfc.dart';
|
||||||
import 'package:island/widgets/account/account_picker.dart';
|
import 'package:island/widgets/account/account_picker.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
@@ -28,7 +29,7 @@ part 'wallet.g.dart';
|
|||||||
Future<SnWallet?> walletCurrent(Ref ref) async {
|
Future<SnWallet?> walletCurrent(Ref ref) async {
|
||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final resp = await apiClient.get('/id/wallets');
|
final resp = await apiClient.get('/pass/wallets');
|
||||||
return SnWallet.fromJson(resp.data);
|
return SnWallet.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException && err.response?.statusCode == 404) {
|
if (err is DioException && err.response?.statusCode == 404) {
|
||||||
@@ -41,7 +42,7 @@ Future<SnWallet?> walletCurrent(Ref ref) async {
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<SnWalletStats> walletStats(Ref ref) async {
|
Future<SnWalletStats> walletStats(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/stats');
|
final resp = await client.get('/pass/wallets/stats');
|
||||||
return SnWalletStats.fromJson(resp.data);
|
return SnWalletStats.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,11 +999,6 @@ class _CreateTransferSheetState extends State<CreateTransferSheet> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Map<String, IconData> kCurrencyIconData = {
|
|
||||||
'points': Symbols.toll,
|
|
||||||
'golds': Symbols.attach_money,
|
|
||||||
};
|
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
class TransactionListNotifier extends _$TransactionListNotifier
|
class TransactionListNotifier extends _$TransactionListNotifier
|
||||||
with CursorPagingNotifierMixin<SnTransaction> {
|
with CursorPagingNotifierMixin<SnTransaction> {
|
||||||
@@ -1021,7 +1017,7 @@ class TransactionListNotifier extends _$TransactionListNotifier
|
|||||||
final queryParams = {'offset': offset, 'take': _pageSize};
|
final queryParams = {'offset': offset, 'take': _pageSize};
|
||||||
|
|
||||||
final response = await client.get(
|
final response = await client.get(
|
||||||
'/id/wallets/transactions',
|
'/pass/wallets/transactions',
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams,
|
||||||
);
|
);
|
||||||
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
||||||
@@ -1048,7 +1044,9 @@ Future<List<SnWalletFund>> walletFunds(
|
|||||||
int take = 20,
|
int take = 20,
|
||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/funds?offset=$offset&take=$take');
|
final resp = await client.get(
|
||||||
|
'/pass/wallets/funds?offset=$offset&take=$take',
|
||||||
|
);
|
||||||
return (resp.data as List).map((e) => SnWalletFund.fromJson(e)).toList();
|
return (resp.data as List).map((e) => SnWalletFund.fromJson(e)).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1060,7 +1058,7 @@ Future<List<SnWalletFundRecipient>> walletFundRecipients(
|
|||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get(
|
final resp = await client.get(
|
||||||
'/id/wallets/funds/recipients?offset=$offset&take=$take',
|
'/pass/wallets/funds/recipients?offset=$offset&take=$take',
|
||||||
);
|
);
|
||||||
return (resp.data as List)
|
return (resp.data as List)
|
||||||
.map((e) => SnWalletFundRecipient.fromJson(e))
|
.map((e) => SnWalletFundRecipient.fromJson(e))
|
||||||
@@ -1070,7 +1068,7 @@ Future<List<SnWalletFundRecipient>> walletFundRecipients(
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<SnWalletFund> walletFund(Ref ref, String fundId) async {
|
Future<SnWalletFund> walletFund(Ref ref, String fundId) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/funds/$fundId');
|
final resp = await client.get('/pass/wallets/funds/$fundId');
|
||||||
return SnWalletFund.fromJson(resp.data);
|
return SnWalletFund.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1247,7 +1245,7 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final wallet = ref.watch(walletCurrentProvider);
|
final wallet = ref.watch(walletCurrentProvider);
|
||||||
final tabController = useTabController(initialLength: 2);
|
final tabController = useTabController(initialLength: 3);
|
||||||
final currentTabIndex = useState(0);
|
final currentTabIndex = useState(0);
|
||||||
|
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
@@ -1262,7 +1260,7 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
Future<void> createWallet() async {
|
Future<void> createWallet() async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
await client.post('/id/wallets');
|
await client.post('/pass/wallets');
|
||||||
ref.invalidate(walletCurrentProvider);
|
ref.invalidate(walletCurrentProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -1326,18 +1324,20 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text('wallet').tr(),
|
title: Text('wallet').tr(),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
if (currentTabIndex.value != 2) // Hide for lottery tab
|
||||||
icon: Icon(
|
IconButton(
|
||||||
currentTabIndex.value == 1
|
icon: Icon(
|
||||||
? Symbols.money_bag
|
|
||||||
: Symbols.swap_horiz,
|
|
||||||
),
|
|
||||||
onPressed: currentTabIndex.value == 1 ? createFund : createTransfer,
|
|
||||||
tooltip:
|
|
||||||
currentTabIndex.value == 1
|
currentTabIndex.value == 1
|
||||||
? 'createFund'.tr()
|
? Symbols.money_bag
|
||||||
: 'createTransfer'.tr(),
|
: Symbols.swap_horiz,
|
||||||
),
|
),
|
||||||
|
onPressed:
|
||||||
|
currentTabIndex.value == 1 ? createFund : createTransfer,
|
||||||
|
tooltip:
|
||||||
|
currentTabIndex.value == 1
|
||||||
|
? 'createFund'.tr()
|
||||||
|
: 'createTransfer'.tr(),
|
||||||
|
),
|
||||||
const Gap(8),
|
const Gap(8),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -1408,6 +1408,7 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
tabs: [
|
tabs: [
|
||||||
Tab(text: 'transactions'.tr()),
|
Tab(text: 'transactions'.tr()),
|
||||||
Tab(text: 'myFunds'.tr()),
|
Tab(text: 'myFunds'.tr()),
|
||||||
|
Tab(text: 'lottery'.tr()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -1485,6 +1486,9 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
|
|
||||||
// My Funds Tab
|
// My Funds Tab
|
||||||
_buildFundsList(context, ref),
|
_buildFundsList(context, ref),
|
||||||
|
|
||||||
|
// Lottery Tab
|
||||||
|
const LotteryTab(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -1762,14 +1766,16 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/wallets/funds',
|
'/pass/wallets/funds',
|
||||||
data: fundData,
|
data: fundData,
|
||||||
options: Options(headers: {'X-Noop': true}),
|
options: Options(headers: {'X-Noop': true}),
|
||||||
);
|
);
|
||||||
final fund = SnWalletFund.fromJson(resp.data);
|
final fund = SnWalletFund.fromJson(resp.data);
|
||||||
if (fund.status == 0) return; // Already created
|
if (fund.status == 0) return; // Already created
|
||||||
|
|
||||||
final orderResp = await client.post('/id/wallets/funds/${fund.id}/order');
|
final orderResp = await client.post(
|
||||||
|
'/pass/wallets/funds/${fund.id}/order',
|
||||||
|
);
|
||||||
final order = SnWalletOrder.fromJson(orderResp.data);
|
final order = SnWalletOrder.fromJson(orderResp.data);
|
||||||
|
|
||||||
if (context.mounted) hideLoadingModal(context);
|
if (context.mounted) hideLoadingModal(context);
|
||||||
@@ -1808,7 +1814,7 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
await client.post('/id/wallets/transfer', data: transferData);
|
await client.post('/pass/wallets/transfer', data: transferData);
|
||||||
|
|
||||||
if (context.mounted) hideLoadingModal(context);
|
if (context.mounted) hideLoadingModal(context);
|
||||||
|
|
||||||
@@ -1855,3 +1861,8 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Map<String, IconData> kCurrencyIconData = {
|
||||||
|
'points': Symbols.toll,
|
||||||
|
'golds': Symbols.attach_money,
|
||||||
|
};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ part 'wallet.g.dart';
|
|||||||
Future<SnWallet?> walletCurrent(Ref ref) async {
|
Future<SnWallet?> walletCurrent(Ref ref) async {
|
||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final resp = await apiClient.get('/id/wallets');
|
final resp = await apiClient.get('/pass/wallets');
|
||||||
return SnWallet.fromJson(resp.data);
|
return SnWallet.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException && err.response?.statusCode == 404) {
|
if (err is DioException && err.response?.statusCode == 404) {
|
||||||
@@ -491,7 +491,7 @@ class TransactionListNotifier extends _$TransactionListNotifier
|
|||||||
final queryParams = {'offset': offset, 'take': _pageSize};
|
final queryParams = {'offset': offset, 'take': _pageSize};
|
||||||
|
|
||||||
final response = await client.get(
|
final response = await client.get(
|
||||||
'/id/wallets/transactions',
|
'/pass/wallets/transactions',
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams,
|
||||||
);
|
);
|
||||||
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
final total = int.parse(response.headers.value('X-Total') ?? '0');
|
||||||
@@ -518,7 +518,7 @@ Future<List<SnWalletFund>> walletFunds(
|
|||||||
int take = 20,
|
int take = 20,
|
||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/funds?offset=$offset&take=$take');
|
final resp = await client.get('/pass/wallets/funds?offset=$offset&take=$take');
|
||||||
return (resp.data as List).map((e) => SnWalletFund.fromJson(e)).toList();
|
return (resp.data as List).map((e) => SnWalletFund.fromJson(e)).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,7 +530,7 @@ Future<List<SnWalletFundRecipient>> walletFundRecipients(
|
|||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get(
|
final resp = await client.get(
|
||||||
'/id/wallets/funds/recipients?offset=$offset&take=$take',
|
'/pass/wallets/funds/recipients?offset=$offset&take=$take',
|
||||||
);
|
);
|
||||||
return (resp.data as List)
|
return (resp.data as List)
|
||||||
.map((e) => SnWalletFundRecipient.fromJson(e))
|
.map((e) => SnWalletFundRecipient.fromJson(e))
|
||||||
@@ -540,14 +540,14 @@ Future<List<SnWalletFundRecipient>> walletFundRecipients(
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<SnWalletFund> walletFund(Ref ref, String fundId) async {
|
Future<SnWalletFund> walletFund(Ref ref, String fundId) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/funds/$fundId');
|
final resp = await client.get('/pass/wallets/funds/$fundId');
|
||||||
return SnWalletFund.fromJson(resp.data);
|
return SnWalletFund.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Future<Map<String, dynamic>> walletFundStats(Ref ref) async {
|
Future<Map<String, dynamic>> walletFundStats(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/wallets/funds/stats');
|
final resp = await client.get('/pass/wallets/funds/stats');
|
||||||
return resp.data as Map<String, dynamic>;
|
return resp.data as Map<String, dynamic>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -563,7 +563,7 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
Future<void> createWallet() async {
|
Future<void> createWallet() async {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
await client.post('/id/wallets');
|
await client.post('/pass/wallets');
|
||||||
ref.invalidate(walletCurrentProvider);
|
ref.invalidate(walletCurrentProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -941,14 +941,14 @@ class WalletScreen extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/wallets/funds',
|
'/pass/wallets/funds',
|
||||||
data: fundData,
|
data: fundData,
|
||||||
options: Options(headers: {'X-Noop': true}),
|
options: Options(headers: {'X-Noop': true}),
|
||||||
);
|
);
|
||||||
final fund = SnWalletFund.fromJson(resp.data);
|
final fund = SnWalletFund.fromJson(resp.data);
|
||||||
if (fund.status == 0) return; // Already created
|
if (fund.status == 0) return; // Already created
|
||||||
|
|
||||||
final orderResp = await client.post('/id/wallets/funds/${fund.id}/order');
|
final orderResp = await client.post('/pass/wallets/funds/${fund.id}/order');
|
||||||
final order = SnWalletOrder.fromJson(orderResp.data);
|
final order = SnWalletOrder.fromJson(orderResp.data);
|
||||||
|
|
||||||
if (context.mounted) hideLoadingModal(context);
|
if (context.mounted) hideLoadingModal(context);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'wallet.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$walletCurrentHash() => r'088505ce1a78901016a3bda05217f813ed3b44c6';
|
String _$walletCurrentHash() => r'bdc7cb27ce2286b561a03522085cc4efc884faad';
|
||||||
|
|
||||||
/// See also [walletCurrent].
|
/// See also [walletCurrent].
|
||||||
@ProviderFor(walletCurrent)
|
@ProviderFor(walletCurrent)
|
||||||
@@ -24,7 +24,7 @@ final walletCurrentProvider = AutoDisposeFutureProvider<SnWallet?>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef WalletCurrentRef = AutoDisposeFutureProviderRef<SnWallet?>;
|
typedef WalletCurrentRef = AutoDisposeFutureProviderRef<SnWallet?>;
|
||||||
String _$walletStatsHash() => r'23d692a922c2388135be6a46afa73c018762eb57';
|
String _$walletStatsHash() => r'2243011937b377a66cdf44cae144021cee69e82f';
|
||||||
|
|
||||||
/// See also [walletStats].
|
/// See also [walletStats].
|
||||||
@ProviderFor(walletStats)
|
@ProviderFor(walletStats)
|
||||||
@@ -40,7 +40,7 @@ final walletStatsProvider = AutoDisposeFutureProvider<SnWalletStats>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef WalletStatsRef = AutoDisposeFutureProviderRef<SnWalletStats>;
|
typedef WalletStatsRef = AutoDisposeFutureProviderRef<SnWalletStats>;
|
||||||
String _$walletFundsHash() => r'7ceb415f64fcadab2b10461e27b95bf92352c707';
|
String _$walletFundsHash() => r'f60718c01ca5b7618a02682a0417669f750644a3';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
@@ -195,7 +195,7 @@ class _WalletFundsProviderElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
String _$walletFundRecipientsHash() =>
|
String _$walletFundRecipientsHash() =>
|
||||||
r'18eb815eb709449dd5c545d81fc0ee43ca667578';
|
r'3a5e32b2d20700edd5944885693aff127b58adb1';
|
||||||
|
|
||||||
/// See also [walletFundRecipients].
|
/// See also [walletFundRecipients].
|
||||||
@ProviderFor(walletFundRecipients)
|
@ProviderFor(walletFundRecipients)
|
||||||
@@ -339,7 +339,7 @@ class _WalletFundRecipientsProviderElement
|
|||||||
int get take => (origin as WalletFundRecipientsProvider).take;
|
int get take => (origin as WalletFundRecipientsProvider).take;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$walletFundHash() => r'a690b0def8f4293b4a8f244e44f8bb735687e5dd';
|
String _$walletFundHash() => r'459efdee5e2775eedaa4312e0d317c218fa7e1fa';
|
||||||
|
|
||||||
/// See also [walletFund].
|
/// See also [walletFund].
|
||||||
@ProviderFor(walletFund)
|
@ProviderFor(walletFund)
|
||||||
@@ -460,7 +460,7 @@ class _WalletFundProviderElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
String _$transactionListNotifierHash() =>
|
String _$transactionListNotifierHash() =>
|
||||||
r'7b777cd44f3351f68f7bd1dd76bfe8b388381bdb';
|
r'74d3c15f45a6e55b36150ab38e98475a508fc932';
|
||||||
|
|
||||||
/// See also [TransactionListNotifier].
|
/// See also [TransactionListNotifier].
|
||||||
@ProviderFor(TransactionListNotifier)
|
@ProviderFor(TransactionListNotifier)
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ class AbuseReportService {
|
|||||||
Future<SnAbuseReport> getReport(String id) async {
|
Future<SnAbuseReport> getReport(String id) async {
|
||||||
final response = await ref
|
final response = await ref
|
||||||
.read(apiClientProvider)
|
.read(apiClientProvider)
|
||||||
.get('/id/safety/reports/me/$id');
|
.get('/pass/safety/reports/me/$id');
|
||||||
return SnAbuseReport.fromJson(response.data);
|
return SnAbuseReport.fromJson(response.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<SnAbuseReport>> getReports() async {
|
Future<List<SnAbuseReport>> getReports() async {
|
||||||
final response = await ref
|
final response = await ref
|
||||||
.read(apiClientProvider)
|
.read(apiClientProvider)
|
||||||
.get('/id/safety/reports/me');
|
.get('/pass/safety/reports/me');
|
||||||
return (response.data as List)
|
return (response.data as List)
|
||||||
.map((json) => SnAbuseReport.fromJson(json))
|
.map((json) => SnAbuseReport.fromJson(json))
|
||||||
.toList();
|
.toList();
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ part 'account_devices.g.dart';
|
|||||||
Future<List<SnAuthDeviceWithChallenge>> authDevices(Ref ref) async {
|
Future<List<SnAuthDeviceWithChallenge>> authDevices(Ref ref) async {
|
||||||
final resp = await ref
|
final resp = await ref
|
||||||
.watch(apiClientProvider)
|
.watch(apiClientProvider)
|
||||||
.get('/id/accounts/me/devices');
|
.get('/pass/accounts/me/devices');
|
||||||
final currentId = await getUdid();
|
final currentId = await getUdid();
|
||||||
final data =
|
final data =
|
||||||
resp.data.map<SnAuthDeviceWithChallenge>((e) {
|
resp.data.map<SnAuthDeviceWithChallenge>((e) {
|
||||||
@@ -154,7 +154,7 @@ class AccountSessionSheet extends HookConsumerWidget {
|
|||||||
if (!confirm || !context.mounted) return;
|
if (!confirm || !context.mounted) return;
|
||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
await apiClient.delete('/id/accounts/me/devices/$sessionId');
|
await apiClient.delete('/pass/accounts/me/devices/$sessionId');
|
||||||
ref.invalidate(authDevicesProvider);
|
ref.invalidate(authDevicesProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showErrorAlert(err);
|
showErrorAlert(err);
|
||||||
@@ -193,7 +193,7 @@ class AccountSessionSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
await apiClient.patch(
|
await apiClient.patch(
|
||||||
'/id/accounts/me/devices/$sessionId/label',
|
'/pass/accounts/me/devices/$sessionId/label',
|
||||||
data: jsonEncode(label),
|
data: jsonEncode(label),
|
||||||
);
|
);
|
||||||
ref.invalidate(authDevicesProvider);
|
ref.invalidate(authDevicesProvider);
|
||||||
@@ -284,7 +284,7 @@ class AccountSessionSheet extends HookConsumerWidget {
|
|||||||
apiClientProvider,
|
apiClientProvider,
|
||||||
);
|
);
|
||||||
await apiClient.delete(
|
await apiClient.delete(
|
||||||
'/id/accounts/me/devices/${device.deviceId}',
|
'/pass/accounts/me/devices/${device.deviceId}',
|
||||||
);
|
);
|
||||||
ref.invalidate(authDevicesProvider);
|
ref.invalidate(authDevicesProvider);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'account_devices.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$authDevicesHash() => r'feb19238f759921e51c888f8b443a3d7761e68da';
|
String _$authDevicesHash() => r'35735af4ed75b73fe80c8942e53b3bc26a569c01';
|
||||||
|
|
||||||
/// See also [authDevices].
|
/// See also [authDevices].
|
||||||
@ProviderFor(authDevices)
|
@ProviderFor(authDevices)
|
||||||
|
|||||||
@@ -6,6 +6,25 @@ import 'package:island/models/wallet.dart';
|
|||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
|
const Map<String, Color> kUsernamePlainColors = {
|
||||||
|
'red': Colors.red,
|
||||||
|
'blue': Colors.blue,
|
||||||
|
'green': Colors.green,
|
||||||
|
'yellow': Colors.yellow,
|
||||||
|
'purple': Colors.purple,
|
||||||
|
'orange': Colors.orange,
|
||||||
|
'pink': Colors.pink,
|
||||||
|
'cyan': Colors.cyan,
|
||||||
|
'lime': Colors.lime,
|
||||||
|
'indigo': Colors.indigo,
|
||||||
|
'teal': Colors.teal,
|
||||||
|
'amber': Colors.amber,
|
||||||
|
'brown': Colors.brown,
|
||||||
|
'grey': Colors.grey,
|
||||||
|
'black': Colors.black,
|
||||||
|
'white': Colors.white,
|
||||||
|
};
|
||||||
|
|
||||||
const kVerificationMarkColors = [
|
const kVerificationMarkColors = [
|
||||||
Colors.teal,
|
Colors.teal,
|
||||||
Colors.blue,
|
Colors.blue,
|
||||||
@@ -17,12 +36,177 @@ const kVerificationMarkColors = [
|
|||||||
class AccountName extends StatelessWidget {
|
class AccountName extends StatelessWidget {
|
||||||
final SnAccount account;
|
final SnAccount account;
|
||||||
final TextStyle? style;
|
final TextStyle? style;
|
||||||
const AccountName({super.key, required this.account, this.style});
|
final String? textOverride;
|
||||||
|
final bool ignorePermissions;
|
||||||
|
const AccountName({
|
||||||
|
super.key,
|
||||||
|
required this.account,
|
||||||
|
this.style,
|
||||||
|
this.textOverride,
|
||||||
|
this.ignorePermissions = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
Alignment _parseGradientDirection(String direction) {
|
||||||
|
switch (direction) {
|
||||||
|
case 'to right':
|
||||||
|
return Alignment.centerLeft;
|
||||||
|
case 'to left':
|
||||||
|
return Alignment.centerRight;
|
||||||
|
case 'to bottom':
|
||||||
|
return Alignment.topCenter;
|
||||||
|
case 'to top':
|
||||||
|
return Alignment.bottomCenter;
|
||||||
|
case 'to bottom right':
|
||||||
|
return Alignment.topLeft;
|
||||||
|
case 'to bottom left':
|
||||||
|
return Alignment.topRight;
|
||||||
|
case 'to top right':
|
||||||
|
return Alignment.bottomLeft;
|
||||||
|
case 'to top left':
|
||||||
|
return Alignment.bottomRight;
|
||||||
|
default:
|
||||||
|
return Alignment.centerLeft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Alignment _parseGradientEnd(String direction) {
|
||||||
|
switch (direction) {
|
||||||
|
case 'to right':
|
||||||
|
return Alignment.centerRight;
|
||||||
|
case 'to left':
|
||||||
|
return Alignment.centerLeft;
|
||||||
|
case 'to bottom':
|
||||||
|
return Alignment.bottomCenter;
|
||||||
|
case 'to top':
|
||||||
|
return Alignment.topCenter;
|
||||||
|
case 'to bottom right':
|
||||||
|
return Alignment.bottomRight;
|
||||||
|
case 'to bottom left':
|
||||||
|
return Alignment.bottomLeft;
|
||||||
|
case 'to top right':
|
||||||
|
return Alignment.topRight;
|
||||||
|
case 'to top left':
|
||||||
|
return Alignment.topLeft;
|
||||||
|
default:
|
||||||
|
return Alignment.centerRight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var nameStyle = (style ?? TextStyle());
|
var nameStyle = (style ?? TextStyle());
|
||||||
if (account.perkSubscription != null) {
|
|
||||||
|
// Apply username color based on membership tier and custom settings
|
||||||
|
if (account.profile.usernameColor != null) {
|
||||||
|
final usernameColor = account.profile.usernameColor!;
|
||||||
|
final tier = account.perkSubscription?.identifier;
|
||||||
|
|
||||||
|
// Check tier restrictions
|
||||||
|
final canUseCustomColor =
|
||||||
|
ignorePermissions ||
|
||||||
|
switch (tier) {
|
||||||
|
'solian.stellar.primary' =>
|
||||||
|
usernameColor.type == 'plain' &&
|
||||||
|
kUsernamePlainColors.containsKey(usernameColor.value),
|
||||||
|
'solian.stellar.nova' => usernameColor.type == 'plain',
|
||||||
|
'solian.stellar.supernova' => true,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (canUseCustomColor) {
|
||||||
|
if (usernameColor.type == 'plain') {
|
||||||
|
// Plain color
|
||||||
|
Color? color;
|
||||||
|
if (kUsernamePlainColors.containsKey(usernameColor.value)) {
|
||||||
|
color = kUsernamePlainColors[usernameColor.value];
|
||||||
|
} else if (usernameColor.value != null) {
|
||||||
|
// Try to parse hex color
|
||||||
|
try {
|
||||||
|
color = Color(
|
||||||
|
int.parse(
|
||||||
|
usernameColor.value!.replaceFirst('#', ''),
|
||||||
|
radix: 16,
|
||||||
|
) +
|
||||||
|
0xFF000000,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
// Invalid hex, ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (color != null) {
|
||||||
|
nameStyle = nameStyle.copyWith(color: color);
|
||||||
|
}
|
||||||
|
} else if (usernameColor.type == 'gradient' &&
|
||||||
|
usernameColor.colors != null &&
|
||||||
|
usernameColor.colors!.isNotEmpty) {
|
||||||
|
// Gradient - use ShaderMask for text gradient
|
||||||
|
final colors = <Color>[];
|
||||||
|
for (final colorStr in usernameColor.colors!) {
|
||||||
|
Color? color;
|
||||||
|
if (kUsernamePlainColors.containsKey(colorStr)) {
|
||||||
|
color = kUsernamePlainColors[colorStr];
|
||||||
|
} else {
|
||||||
|
// Try to parse hex color
|
||||||
|
try {
|
||||||
|
color = Color(
|
||||||
|
int.parse(colorStr.replaceFirst('#', ''), radix: 16) +
|
||||||
|
0xFF000000,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
// Invalid hex, skip
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (color != null) {
|
||||||
|
colors.add(color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colors.isNotEmpty) {
|
||||||
|
final gradient = LinearGradient(
|
||||||
|
colors: colors,
|
||||||
|
begin: _parseGradientDirection(
|
||||||
|
usernameColor.direction ?? 'to right',
|
||||||
|
),
|
||||||
|
end: _parseGradientEnd(usernameColor.direction ?? 'to right'),
|
||||||
|
);
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
spacing: 4,
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
child: ShaderMask(
|
||||||
|
shaderCallback: (bounds) => gradient.createShader(bounds),
|
||||||
|
child: Text(
|
||||||
|
textOverride ?? account.nick,
|
||||||
|
style: nameStyle.copyWith(color: Colors.white),
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (account.perkSubscription != null)
|
||||||
|
StellarMembershipMark(membership: account.perkSubscription!),
|
||||||
|
if (account.profile.verification != null)
|
||||||
|
VerificationMark(mark: account.profile.verification!),
|
||||||
|
if (account.automatedId != null)
|
||||||
|
Tooltip(
|
||||||
|
message: 'accountAutomated'.tr(),
|
||||||
|
child: Icon(
|
||||||
|
Symbols.smart_toy,
|
||||||
|
size: 16,
|
||||||
|
color: nameStyle.color,
|
||||||
|
fill: 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (account.perkSubscription != null) {
|
||||||
|
// Default membership colors if no custom color is set
|
||||||
nameStyle = nameStyle.copyWith(
|
nameStyle = nameStyle.copyWith(
|
||||||
color: (switch (account.perkSubscription!.identifier) {
|
color: (switch (account.perkSubscription!.identifier) {
|
||||||
'solian.stellar.primary' => Colors.blueAccent,
|
'solian.stellar.primary' => Colors.blueAccent,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ Future<List<SnAccount>> searchAccounts(Ref ref, {required String query}) async {
|
|||||||
|
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
final response = await apiClient.get(
|
final response = await apiClient.get(
|
||||||
'/id/accounts/search',
|
'/pass/accounts/search',
|
||||||
queryParameters: {'query': query},
|
queryParameters: {'query': query},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'account_picker.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$searchAccountsHash() => r'fa3b8b7d51e14cf40d4116ba0ff0b6955fa0ff54';
|
String _$searchAccountsHash() => r'3b4aa4d7970a1e406c1a0a1dfac2c686e05bc533';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
@@ -6,14 +5,24 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:island/pods/event_calendar.dart';
|
import 'package:island/pods/event_calendar.dart';
|
||||||
import 'package:island/screens/account/profile.dart';
|
import 'package:island/screens/account/profile.dart';
|
||||||
import 'package:island/widgets/account/account_nameplate.dart';
|
import 'package:island/widgets/account/account_nameplate.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
|
||||||
import 'package:island/widgets/account/event_calendar.dart';
|
import 'package:island/widgets/account/event_calendar.dart';
|
||||||
import 'package:island/widgets/account/fortune_graph.dart';
|
import 'package:island/widgets/account/fortune_graph.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
class EventCalanderScreen extends HookConsumerWidget {
|
/// A reusable content widget for event calendar that can be used in screens or sheets
|
||||||
|
/// This widget manages the calendar state and displays the calendar and fortune graph
|
||||||
|
class EventCalendarContent extends HookConsumerWidget {
|
||||||
|
/// Username to fetch calendar for, null means current user ('me')
|
||||||
final String name;
|
final String name;
|
||||||
const EventCalanderScreen({super.key, required this.name});
|
|
||||||
|
/// Whether this is being displayed in a sheet (affects layout)
|
||||||
|
final bool isSheet;
|
||||||
|
|
||||||
|
const EventCalendarContent({
|
||||||
|
super.key,
|
||||||
|
required this.name,
|
||||||
|
this.isSheet = false,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
@@ -45,13 +54,37 @@ class EventCalanderScreen extends HookConsumerWidget {
|
|||||||
selectedDay.value = day;
|
selectedDay.value = day;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AppScaffold(
|
if (isSheet) {
|
||||||
isNoBackground: false,
|
// Sheet layout - simplified, no app bar, scrollable content
|
||||||
appBar: AppBar(
|
return SingleChildScrollView(
|
||||||
leading: const PageBackButton(),
|
child: Column(
|
||||||
title: Text('eventCalander').tr(),
|
children: [
|
||||||
),
|
// Use the reusable EventCalendarWidget
|
||||||
body: SingleChildScrollView(
|
EventCalendarWidget(
|
||||||
|
events: events,
|
||||||
|
initialDate: now,
|
||||||
|
showEventDetails: true,
|
||||||
|
onMonthChanged: onMonthChanged,
|
||||||
|
onDaySelected: onDaySelected,
|
||||||
|
),
|
||||||
|
|
||||||
|
// Add the fortune graph widget
|
||||||
|
const Divider(height: 1),
|
||||||
|
FortuneGraphWidget(
|
||||||
|
events: events,
|
||||||
|
onPointSelected: onDaySelected,
|
||||||
|
).padding(horizontal: 8, vertical: 4),
|
||||||
|
|
||||||
|
// Show user profile if viewing someone else's calendar
|
||||||
|
if (name != 'me' && user.value != null)
|
||||||
|
AccountNameplate(name: name),
|
||||||
|
Gap(MediaQuery.of(context).padding.bottom + 16),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Screen layout - with responsive design
|
||||||
|
return SingleChildScrollView(
|
||||||
child:
|
child:
|
||||||
MediaQuery.of(context).size.width > 480
|
MediaQuery.of(context).size.width > 480
|
||||||
? ConstrainedBox(
|
? ConstrainedBox(
|
||||||
@@ -111,7 +144,7 @@ class EventCalanderScreen extends HookConsumerWidget {
|
|||||||
Gap(MediaQuery.of(context).padding.bottom + 16),
|
Gap(MediaQuery.of(context).padding.bottom + 16),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,10 +76,17 @@ class EventDetailsWidget extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if ((getActivityTitle(status.label, status.meta) ?? status.label).isNotEmpty)
|
if ((getActivityTitle(status.label, status.meta) ??
|
||||||
Text(getActivityTitle(status.label, status.meta) ?? status.label),
|
status.label)
|
||||||
|
.isNotEmpty)
|
||||||
|
Text(
|
||||||
|
getActivityTitle(status.label, status.meta) ??
|
||||||
|
status.label,
|
||||||
|
),
|
||||||
if (getActivitySubtitle(status.meta) != null)
|
if (getActivitySubtitle(status.meta) != null)
|
||||||
Text(getActivitySubtitle(status.meta)!).fontSize(11).opacity(0.8),
|
Text(
|
||||||
|
getActivitySubtitle(status.meta)!,
|
||||||
|
).fontSize(11).opacity(0.8),
|
||||||
Text(
|
Text(
|
||||||
'${status.createdAt.formatSystem()} - ${status.clearedAt?.formatSystem() ?? 'present'.tr()}',
|
'${status.createdAt.formatSystem()} - ${status.clearedAt?.formatSystem() ?? 'present'.tr()}',
|
||||||
).fontSize(11).opacity(0.8),
|
).fontSize(11).opacity(0.8),
|
||||||
@@ -92,7 +99,7 @@ class EventDetailsWidget extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
if (event?.checkInResult == null && (event?.statuses.isEmpty ?? true))
|
if (event?.checkInResult == null && (event?.statuses.isEmpty ?? true))
|
||||||
Text('eventCalanderEmpty').tr(),
|
Text('eventCalendarEmpty').tr(),
|
||||||
],
|
],
|
||||||
).padding(vertical: 24, horizontal: 24);
|
).padding(vertical: 24, horizontal: 24);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:fl_chart/fl_chart.dart';
|
import 'package:fl_chart/fl_chart.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:island/models/activity.dart';
|
import 'package:island/models/activity.dart';
|
||||||
|
import 'package:island/widgets/account/event_calendar_content.dart';
|
||||||
|
import 'package:island/widgets/content/sheet.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
/// A widget that displays a graph of fortune levels over time
|
/// A widget that displays a graph of fortune levels over time
|
||||||
@@ -24,7 +25,7 @@ class FortuneGraphWidget extends HookConsumerWidget {
|
|||||||
/// Callback when a point is selected
|
/// Callback when a point is selected
|
||||||
final void Function(DateTime)? onPointSelected;
|
final void Function(DateTime)? onPointSelected;
|
||||||
|
|
||||||
final String? eventCalanderUser;
|
final String? eventCalandarUser;
|
||||||
|
|
||||||
final EdgeInsets? margin;
|
final EdgeInsets? margin;
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ class FortuneGraphWidget extends HookConsumerWidget {
|
|||||||
this.maxWidth = double.infinity,
|
this.maxWidth = double.infinity,
|
||||||
this.height = 180,
|
this.height = 180,
|
||||||
this.onPointSelected,
|
this.onPointSelected,
|
||||||
this.eventCalanderUser,
|
this.eventCalandarUser,
|
||||||
this.margin,
|
this.margin,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -59,7 +60,7 @@ class FortuneGraphWidget extends HookConsumerWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text('fortuneGraph').tr().fontSize(18).bold(),
|
Text('fortuneGraph').tr().fontSize(18).bold(),
|
||||||
if (eventCalanderUser != null)
|
if (eventCalandarUser != null)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.calendar_month, size: 20),
|
icon: const Icon(Icons.calendar_month, size: 20),
|
||||||
visualDensity: const VisualDensity(
|
visualDensity: const VisualDensity(
|
||||||
@@ -69,9 +70,17 @@ class FortuneGraphWidget extends HookConsumerWidget {
|
|||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
constraints: const BoxConstraints(),
|
constraints: const BoxConstraints(),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.pushNamed(
|
showModalBottomSheet(
|
||||||
'accountCalendar',
|
context: context,
|
||||||
pathParameters: {'name': eventCalanderUser!},
|
isScrollControlled: true,
|
||||||
|
builder:
|
||||||
|
(context) => SheetScaffold(
|
||||||
|
titleText: 'eventCalendar'.tr(),
|
||||||
|
child: EventCalendarContent(
|
||||||
|
name: eventCalandarUser!,
|
||||||
|
isSheet: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class RestorePurchaseSheet extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/subscriptions/order/restore/${selectedProvider.value!}',
|
'/pass/subscriptions/order/restore/${selectedProvider.value!}',
|
||||||
data: {'order_id': orderIdController.text.trim()},
|
data: {'order_id': orderIdController.text.trim()},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -27,14 +27,18 @@ class CurrentAccountStatusNotifier extends StateNotifier<SnAccountStatus?> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final currentAccountStatusProvider = StateNotifierProvider<CurrentAccountStatusNotifier, SnAccountStatus?>((ref) {
|
final currentAccountStatusProvider =
|
||||||
return CurrentAccountStatusNotifier();
|
StateNotifierProvider<CurrentAccountStatusNotifier, SnAccountStatus?>((
|
||||||
});
|
ref,
|
||||||
|
) {
|
||||||
|
return CurrentAccountStatusNotifier();
|
||||||
|
});
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Future<SnAccountStatus?> accountStatus(Ref ref, String uname) async {
|
Future<SnAccountStatus?> accountStatus(Ref ref, String uname) async {
|
||||||
final userInfo = ref.watch(userInfoProvider);
|
final userInfo = ref.watch(userInfoProvider);
|
||||||
if (uname == 'me' || (userInfo.value != null && uname == userInfo.value!.name)) {
|
if (uname == 'me' ||
|
||||||
|
(userInfo.value != null && uname == userInfo.value!.name)) {
|
||||||
final local = ref.watch(currentAccountStatusProvider);
|
final local = ref.watch(currentAccountStatusProvider);
|
||||||
if (local != null) {
|
if (local != null) {
|
||||||
return local;
|
return local;
|
||||||
@@ -42,7 +46,7 @@ Future<SnAccountStatus?> accountStatus(Ref ref, String uname) async {
|
|||||||
}
|
}
|
||||||
final apiClient = ref.watch(apiClientProvider);
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
final resp = await apiClient.get('/id/accounts/$uname/statuses');
|
final resp = await apiClient.get('/pass/accounts/$uname/statuses');
|
||||||
return SnAccountStatus.fromJson(resp.data);
|
return SnAccountStatus.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException) {
|
if (err is DioException) {
|
||||||
@@ -137,9 +141,13 @@ class AccountStatusWidget extends HookConsumerWidget {
|
|||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final userInfo = ref.watch(userInfoProvider);
|
final userInfo = ref.watch(userInfoProvider);
|
||||||
final localStatus = ref.watch(currentAccountStatusProvider);
|
final localStatus = ref.watch(currentAccountStatusProvider);
|
||||||
final status = (uname == 'me' || (userInfo.value != null && uname == userInfo.value!.name && localStatus != null))
|
final status =
|
||||||
? AsyncValue.data(localStatus)
|
(uname == 'me' ||
|
||||||
: ref.watch(accountStatusProvider(uname));
|
(userInfo.value != null &&
|
||||||
|
uname == userInfo.value!.name &&
|
||||||
|
localStatus != null))
|
||||||
|
? AsyncValue.data(localStatus)
|
||||||
|
: ref.watch(accountStatusProvider(uname));
|
||||||
final account = ref.watch(accountProvider(uname));
|
final account = ref.watch(accountProvider(uname));
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
@@ -166,16 +174,17 @@ class AccountStatusWidget extends HookConsumerWidget {
|
|||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => AlertDialog(
|
builder:
|
||||||
title: Text('Activity Details'),
|
(context) => AlertDialog(
|
||||||
content: buildActivityDetails(status.value),
|
title: Text('Activity Details'),
|
||||||
actions: [
|
content: buildActivityDetails(status.value),
|
||||||
TextButton(
|
actions: [
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
TextButton(
|
||||||
child: Text('Close'),
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text('Close'),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Tooltip(
|
child: Tooltip(
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ part of 'status.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$accountStatusHash() => r'abc2f11f0fbaf637efc182cf85ab838936c4d875';
|
String _$accountStatusHash() => r'4cac809808e6f1345dab06dc32d759cfcea13315';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class AccountStatusCreationSheet extends HookConsumerWidget {
|
|||||||
submitting.value = true;
|
submitting.value = true;
|
||||||
final user = ref.watch(userInfoProvider);
|
final user = ref.watch(userInfoProvider);
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.delete('/id/accounts/me/statuses');
|
await apiClient.delete('/pass/accounts/me/statuses');
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
ref.invalidate(accountStatusProvider(user.value!.name));
|
ref.invalidate(accountStatusProvider(user.value!.name));
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
@@ -50,7 +50,7 @@ class AccountStatusCreationSheet extends HookConsumerWidget {
|
|||||||
final user = ref.watch(userInfoProvider);
|
final user = ref.watch(userInfoProvider);
|
||||||
final apiClient = ref.read(apiClientProvider);
|
final apiClient = ref.read(apiClientProvider);
|
||||||
await apiClient.request(
|
await apiClient.request(
|
||||||
'/id/accounts/me/statuses',
|
'/pass/accounts/me/statuses',
|
||||||
data: {
|
data: {
|
||||||
'attitude': attitude.value,
|
'attitude': attitude.value,
|
||||||
'is_invisible': isInvisible.value,
|
'is_invisible': isInvisible.value,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ part 'stellar_program_tab.g.dart';
|
|||||||
Future<SnWalletSubscription?> accountStellarSubscription(Ref ref) async {
|
Future<SnWalletSubscription?> accountStellarSubscription(Ref ref) async {
|
||||||
try {
|
try {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/subscriptions/fuzzy/solian.stellar');
|
final resp = await client.get('/pass/subscriptions/fuzzy/solian.stellar');
|
||||||
return SnWalletSubscription.fromJson(resp.data);
|
return SnWalletSubscription.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException && err.response?.statusCode == 404) return null;
|
if (err is DioException && err.response?.statusCode == 404) return null;
|
||||||
@@ -46,7 +46,7 @@ Future<List<SnWalletGift>> accountSentGifts(
|
|||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get(
|
final resp = await client.get(
|
||||||
'/id/subscriptions/gifts/sent?offset=$offset&take=$take',
|
'/pass/subscriptions/gifts/sent?offset=$offset&take=$take',
|
||||||
);
|
);
|
||||||
return (resp.data as List).map((e) => SnWalletGift.fromJson(e)).toList();
|
return (resp.data as List).map((e) => SnWalletGift.fromJson(e)).toList();
|
||||||
}
|
}
|
||||||
@@ -59,7 +59,7 @@ Future<List<SnWalletGift>> accountReceivedGifts(
|
|||||||
}) async {
|
}) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get(
|
final resp = await client.get(
|
||||||
'/id/subscriptions/gifts/received?offset=$offset&take=$take',
|
'/pass/subscriptions/gifts/received?offset=$offset&take=$take',
|
||||||
);
|
);
|
||||||
return (resp.data as List).map((e) => SnWalletGift.fromJson(e)).toList();
|
return (resp.data as List).map((e) => SnWalletGift.fromJson(e)).toList();
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ Future<List<SnWalletGift>> accountReceivedGifts(
|
|||||||
@riverpod
|
@riverpod
|
||||||
Future<SnWalletGift> accountGift(Ref ref, String giftId) async {
|
Future<SnWalletGift> accountGift(Ref ref, String giftId) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
final resp = await client.get('/id/subscriptions/gifts/$giftId');
|
final resp = await client.get('/pass/subscriptions/gifts/$giftId');
|
||||||
return SnWalletGift.fromJson(resp.data);
|
return SnWalletGift.fromJson(resp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,7 +388,9 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
await client.post('/id/subscriptions/${membership.identifier}/cancel');
|
await client.post(
|
||||||
|
'/pass/subscriptions/${membership.identifier}/cancel',
|
||||||
|
);
|
||||||
ref.invalidate(accountStellarSubscriptionProvider);
|
ref.invalidate(accountStellarSubscriptionProvider);
|
||||||
ref.read(userInfoProvider.notifier).fetchUser();
|
ref.read(userInfoProvider.notifier).fetchUser();
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
@@ -698,7 +700,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/subscriptions',
|
'/pass/subscriptions',
|
||||||
data: {
|
data: {
|
||||||
'identifier': tierId,
|
'identifier': tierId,
|
||||||
'payment_method': 'solian.wallet',
|
'payment_method': 'solian.wallet',
|
||||||
@@ -710,7 +712,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
final subscription = SnWalletSubscription.fromJson(resp.data);
|
final subscription = SnWalletSubscription.fromJson(resp.data);
|
||||||
if (subscription.status == 1) return;
|
if (subscription.status == 1) return;
|
||||||
final orderResp = await client.post(
|
final orderResp = await client.post(
|
||||||
'/id/subscriptions/${subscription.identifier}/order',
|
'/pass/subscriptions/${subscription.identifier}/order',
|
||||||
);
|
);
|
||||||
final order = SnWalletOrder.fromJson(orderResp.data);
|
final order = SnWalletOrder.fromJson(orderResp.data);
|
||||||
|
|
||||||
@@ -1221,7 +1223,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
final resp = await client.post(
|
final resp = await client.post(
|
||||||
'/id/subscriptions/gifts/purchase',
|
'/pass/subscriptions/gifts/purchase',
|
||||||
data: {
|
data: {
|
||||||
'subscription_identifier': subscriptionId,
|
'subscription_identifier': subscriptionId,
|
||||||
if (recipientId != null) 'recipient_id': recipientId,
|
if (recipientId != null) 'recipient_id': recipientId,
|
||||||
@@ -1237,7 +1239,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
if (gift.status == 1) return; // Already paid
|
if (gift.status == 1) return; // Already paid
|
||||||
|
|
||||||
final orderResp = await client.post(
|
final orderResp = await client.post(
|
||||||
'/id/subscriptions/gifts/${gift.id}/order',
|
'/pass/subscriptions/gifts/${gift.id}/order',
|
||||||
);
|
);
|
||||||
final order = SnWalletOrder.fromJson(orderResp.data);
|
final order = SnWalletOrder.fromJson(orderResp.data);
|
||||||
|
|
||||||
@@ -1258,7 +1260,9 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
await Future.delayed(const Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
|
|
||||||
// Get the updated gift
|
// Get the updated gift
|
||||||
final giftResp = await client.get('/id/subscriptions/gifts/${gift.id}');
|
final giftResp = await client.get(
|
||||||
|
'/pass/subscriptions/gifts/${gift.id}',
|
||||||
|
);
|
||||||
final updatedGift = SnWalletGift.fromJson(giftResp.data);
|
final updatedGift = SnWalletGift.fromJson(giftResp.data);
|
||||||
|
|
||||||
if (context.mounted) hideLoadingModal(context);
|
if (context.mounted) hideLoadingModal(context);
|
||||||
@@ -1367,7 +1371,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
|
|
||||||
// First check if gift can be redeemed
|
// First check if gift can be redeemed
|
||||||
final checkResp = await client.get(
|
final checkResp = await client.get(
|
||||||
'/id/subscriptions/gifts/check/$giftCode',
|
'/pass/subscriptions/gifts/check/$giftCode',
|
||||||
);
|
);
|
||||||
final checkData = checkResp.data as Map<String, dynamic>;
|
final checkData = checkResp.data as Map<String, dynamic>;
|
||||||
|
|
||||||
@@ -1379,7 +1383,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
|
|
||||||
// Redeem the gift
|
// Redeem the gift
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/subscriptions/gifts/redeem',
|
'/pass/subscriptions/gifts/redeem',
|
||||||
data: {'gift_code': giftCode},
|
data: {'gift_code': giftCode},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1424,7 +1428,7 @@ class StellarProgramTab extends HookConsumerWidget {
|
|||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
showLoadingModal(context);
|
showLoadingModal(context);
|
||||||
await client.post('/id/subscriptions/gifts/${gift.id}/cancel');
|
await client.post('/pass/subscriptions/gifts/${gift.id}/cancel');
|
||||||
ref.invalidate(accountSentGiftsProvider);
|
ref.invalidate(accountSentGiftsProvider);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
hideLoadingModal(context);
|
hideLoadingModal(context);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ part of 'stellar_program_tab.dart';
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$accountStellarSubscriptionHash() =>
|
String _$accountStellarSubscriptionHash() =>
|
||||||
r'80abcdefb3868775fd8fe3c980215713efff5948';
|
r'7cdfc7ca29aac240fc8704f4493498d87f307400';
|
||||||
|
|
||||||
/// See also [accountStellarSubscription].
|
/// See also [accountStellarSubscription].
|
||||||
@ProviderFor(accountStellarSubscription)
|
@ProviderFor(accountStellarSubscription)
|
||||||
@@ -27,7 +27,7 @@ final accountStellarSubscriptionProvider =
|
|||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef AccountStellarSubscriptionRef =
|
typedef AccountStellarSubscriptionRef =
|
||||||
AutoDisposeFutureProviderRef<SnWalletSubscription?>;
|
AutoDisposeFutureProviderRef<SnWalletSubscription?>;
|
||||||
String _$accountSentGiftsHash() => r'36fdf4e2be3805e8501cca1657d8be27aa891ef4';
|
String _$accountSentGiftsHash() => r'460af8d22e16dc402848cb94e9b8a8a26d023c41';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
@@ -187,7 +187,7 @@ class _AccountSentGiftsProviderElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
String _$accountReceivedGiftsHash() =>
|
String _$accountReceivedGiftsHash() =>
|
||||||
r'15f6f7e27aa0277b67b02dd72875ba3efd147dfd';
|
r'1208c27cca49e154af073071a197b37a2703f56d';
|
||||||
|
|
||||||
/// See also [accountReceivedGifts].
|
/// See also [accountReceivedGifts].
|
||||||
@ProviderFor(accountReceivedGifts)
|
@ProviderFor(accountReceivedGifts)
|
||||||
@@ -328,7 +328,7 @@ class _AccountReceivedGiftsProviderElement
|
|||||||
int get take => (origin as AccountReceivedGiftsProvider).take;
|
int get take => (origin as AccountReceivedGiftsProvider).take;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$accountGiftHash() => r'598c5071fff3cc1dd7eb867df48d69fef04543db';
|
String _$accountGiftHash() => r'70ca553e0b84cba9dfbee428f9bf44207138713a';
|
||||||
|
|
||||||
/// See also [accountGift].
|
/// See also [accountGift].
|
||||||
@ProviderFor(accountGift)
|
@ProviderFor(accountGift)
|
||||||
|
|||||||
@@ -11,8 +11,13 @@ import '../services/responsive.dart';
|
|||||||
/// Shows exactly 365 days (wide screen) or 90 days (non-wide screen) of data ending at the current date.
|
/// Shows exactly 365 days (wide screen) or 90 days (non-wide screen) of data ending at the current date.
|
||||||
class ActivityHeatmapWidget extends HookConsumerWidget {
|
class ActivityHeatmapWidget extends HookConsumerWidget {
|
||||||
final SnHeatmap heatmap;
|
final SnHeatmap heatmap;
|
||||||
|
final bool forceDense;
|
||||||
|
|
||||||
const ActivityHeatmapWidget({super.key, required this.heatmap});
|
const ActivityHeatmapWidget({
|
||||||
|
super.key,
|
||||||
|
required this.heatmap,
|
||||||
|
this.forceDense = false,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
@@ -21,7 +26,7 @@ class ActivityHeatmapWidget extends HookConsumerWidget {
|
|||||||
final now = DateTime.now();
|
final now = DateTime.now();
|
||||||
|
|
||||||
final isWide = isWideScreen(context);
|
final isWide = isWideScreen(context);
|
||||||
final days = isWide ? 365 : 90;
|
final days = (isWide && !forceDense) ? 365 : 90;
|
||||||
|
|
||||||
// Start from exactly the selected days ago
|
// Start from exactly the selected days ago
|
||||||
final startDate = now.subtract(Duration(days: days));
|
final startDate = now.subtract(Duration(days: days));
|
||||||
|
|||||||
@@ -314,28 +314,22 @@ class AppScaffold extends HookConsumerWidget {
|
|||||||
|
|
||||||
final noBackground = isNoBackground ?? isWideScreen(context);
|
final noBackground = isNoBackground ?? isWideScreen(context);
|
||||||
|
|
||||||
final content = Column(
|
final builtWidget = Focus(
|
||||||
children: [
|
|
||||||
IgnorePointer(
|
|
||||||
child: SizedBox(height: appBar != null ? appBarHeight + safeTop : 0),
|
|
||||||
),
|
|
||||||
if (body != null) Expanded(child: body!),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
return Focus(
|
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
extendBody: extendBody ?? true,
|
extendBody: extendBody ?? true,
|
||||||
extendBodyBehindAppBar: true,
|
extendBodyBehindAppBar: true,
|
||||||
backgroundColor:
|
backgroundColor: Colors.transparent,
|
||||||
noBackground
|
body: Column(
|
||||||
? Colors.transparent
|
children: [
|
||||||
: Theme.of(context).scaffoldBackgroundColor,
|
IgnorePointer(
|
||||||
body:
|
child: SizedBox(
|
||||||
noBackground
|
height: appBar != null ? appBarHeight + safeTop : 0,
|
||||||
? content
|
),
|
||||||
: AppBackground(isRoot: true, child: content),
|
),
|
||||||
|
if (body != null) Expanded(child: body!),
|
||||||
|
],
|
||||||
|
),
|
||||||
appBar: appBar,
|
appBar: appBar,
|
||||||
bottomNavigationBar: bottomNavigationBar,
|
bottomNavigationBar: bottomNavigationBar,
|
||||||
bottomSheet: bottomSheet,
|
bottomSheet: bottomSheet,
|
||||||
@@ -348,6 +342,10 @@ class AppScaffold extends HookConsumerWidget {
|
|||||||
onEndDrawerChanged: onEndDrawerChanged,
|
onEndDrawerChanged: onEndDrawerChanged,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return noBackground
|
||||||
|
? builtWidget
|
||||||
|
: AppBackground(isRoot: true, child: builtWidget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,14 +370,20 @@ class PageBackButton extends StatelessWidget {
|
|||||||
final Color? color;
|
final Color? color;
|
||||||
final List<Shadow>? shadows;
|
final List<Shadow>? shadows;
|
||||||
final VoidCallback? onWillPop;
|
final VoidCallback? onWillPop;
|
||||||
const PageBackButton({super.key, this.shadows, this.onWillPop, this.color});
|
final String? backTo;
|
||||||
|
const PageBackButton({
|
||||||
|
super.key,
|
||||||
|
this.shadows,
|
||||||
|
this.onWillPop,
|
||||||
|
this.color,
|
||||||
|
this.backTo,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final isDesktop =
|
final hasPageAction = !kIsWeb && Platform.isMacOS;
|
||||||
!kIsWeb && (Platform.isMacOS || Platform.isLinux || Platform.isWindows);
|
|
||||||
|
|
||||||
if (isDesktop && isWideScreen(context)) return const SizedBox.shrink();
|
if (hasPageAction && isWideScreen(context)) return const SizedBox.shrink();
|
||||||
|
|
||||||
return IconButton(
|
return IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
@@ -387,7 +391,7 @@ class PageBackButton extends StatelessWidget {
|
|||||||
if (context.canPop()) {
|
if (context.canPop()) {
|
||||||
context.pop();
|
context.pop();
|
||||||
} else {
|
} else {
|
||||||
context.go('/');
|
context.go(backTo ?? '/');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
|
|||||||
@@ -73,10 +73,8 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
final chatSubscribe = ref.watch(chatSubscribeNotifierProvider(chatRoom.id));
|
final chatSubscribe = ref.watch(chatSubscribeNotifierProvider(chatRoom.id));
|
||||||
|
|
||||||
void send() {
|
void send() {
|
||||||
|
inputFocusNode.requestFocus();
|
||||||
onSend.call();
|
onSend.call();
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
||||||
inputFocusNode.requestFocus();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void insertNewLine() {
|
void insertNewLine() {
|
||||||
@@ -120,6 +118,8 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final settings = ref.watch(appSettingsNotifierProvider);
|
||||||
|
|
||||||
inputFocusNode.onKeyEvent = (node, event) {
|
inputFocusNode.onKeyEvent = (node, event) {
|
||||||
if (event is! KeyDownEvent) return KeyEventResult.ignored;
|
if (event is! KeyDownEvent) return KeyEventResult.ignored;
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
return KeyEventResult.handled;
|
return KeyEventResult.handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
final enterToSend = ref.read(appSettingsNotifierProvider).enterToSend;
|
final enterToSend = settings.enterToSend;
|
||||||
final isEnter = event.logicalKey == LogicalKeyboardKey.enter;
|
final isEnter = event.logicalKey == LogicalKeyboardKey.enter;
|
||||||
|
|
||||||
if (isEnter) {
|
if (isEnter) {
|
||||||
@@ -225,86 +225,200 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
key: ValueKey('typing-indicator-none'),
|
key: ValueKey('typing-indicator-none'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (attachments.isNotEmpty)
|
AnimatedSwitcher(
|
||||||
SizedBox(
|
duration: const Duration(milliseconds: 250),
|
||||||
height: 180,
|
switchInCurve: Curves.easeOutCubic,
|
||||||
child: ListView.separated(
|
switchOutCurve: Curves.easeInCubic,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
transitionBuilder: (Widget child, Animation<double> animation) {
|
||||||
scrollDirection: Axis.horizontal,
|
return SlideTransition(
|
||||||
itemCount: attachments.length,
|
position: Tween<Offset>(
|
||||||
itemBuilder: (context, idx) {
|
begin: const Offset(0, 0.1),
|
||||||
return SizedBox(
|
end: Offset.zero,
|
||||||
width: 180,
|
).animate(animation),
|
||||||
child: AttachmentPreview(
|
child: FadeTransition(
|
||||||
isCompact: true,
|
opacity: animation,
|
||||||
item: attachments[idx],
|
child: SizeTransition(
|
||||||
progress: attachmentProgress['chat-upload']?[idx],
|
sizeFactor: animation,
|
||||||
onRequestUpload: () => onUploadAttachment(idx),
|
axisAlignment: -1.0,
|
||||||
onDelete: () => onDeleteAttachment(idx),
|
child: child,
|
||||||
onUpdate: (value) {
|
|
||||||
attachments[idx] = value;
|
|
||||||
onAttachmentsChanged(attachments);
|
|
||||||
},
|
|
||||||
onMove: (delta) => onMoveAttachment(idx, delta),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
separatorBuilder: (_, _) => const Gap(8),
|
|
||||||
),
|
|
||||||
).padding(vertical: 12),
|
|
||||||
if (messageReplyingTo != null ||
|
|
||||||
messageForwardingTo != null ||
|
|
||||||
messageEditingTo != null)
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 16,
|
|
||||||
vertical: 4,
|
|
||||||
),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Theme.of(context).colorScheme.surfaceContainerHigh,
|
|
||||||
borderRadius: BorderRadius.circular(32),
|
|
||||||
),
|
|
||||||
margin: const EdgeInsets.only(
|
|
||||||
left: 8,
|
|
||||||
right: 8,
|
|
||||||
top: 8,
|
|
||||||
bottom: 4,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
messageReplyingTo != null
|
|
||||||
? Symbols.reply
|
|
||||||
: messageForwardingTo != null
|
|
||||||
? Symbols.forward
|
|
||||||
: Symbols.edit,
|
|
||||||
size: 20,
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
const Gap(8),
|
),
|
||||||
Expanded(
|
);
|
||||||
child: Text(
|
},
|
||||||
messageReplyingTo != null
|
child:
|
||||||
? 'Replying to ${messageReplyingTo?.sender.account.nick}'
|
attachments.isNotEmpty
|
||||||
: messageForwardingTo != null
|
? SizedBox(
|
||||||
? 'Forwarding message'
|
key: ValueKey('attachments-${attachments.length}'),
|
||||||
: 'Editing message',
|
height: 180,
|
||||||
style: Theme.of(context).textTheme.bodySmall,
|
child: ListView.separated(
|
||||||
maxLines: 1,
|
padding: EdgeInsets.symmetric(horizontal: 12),
|
||||||
overflow: TextOverflow.ellipsis,
|
scrollDirection: Axis.horizontal,
|
||||||
|
itemCount: attachments.length,
|
||||||
|
itemBuilder: (context, idx) {
|
||||||
|
return SizedBox(
|
||||||
|
width: 180,
|
||||||
|
child: AttachmentPreview(
|
||||||
|
isCompact: true,
|
||||||
|
item: attachments[idx],
|
||||||
|
progress:
|
||||||
|
attachmentProgress['chat-upload']?[idx],
|
||||||
|
onRequestUpload:
|
||||||
|
() => onUploadAttachment(idx),
|
||||||
|
onDelete: () => onDeleteAttachment(idx),
|
||||||
|
onUpdate: (value) {
|
||||||
|
attachments[idx] = value;
|
||||||
|
onAttachmentsChanged(attachments);
|
||||||
|
},
|
||||||
|
onMove:
|
||||||
|
(delta) => onMoveAttachment(idx, delta),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (_, _) => const Gap(8),
|
||||||
|
),
|
||||||
|
).padding(vertical: 12)
|
||||||
|
: const SizedBox.shrink(
|
||||||
|
key: ValueKey('no-attachments'),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
AnimatedSwitcher(
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
switchInCurve: Curves.easeOutCubic,
|
||||||
|
switchOutCurve: Curves.easeInCubic,
|
||||||
|
transitionBuilder: (Widget child, Animation<double> animation) {
|
||||||
|
return SlideTransition(
|
||||||
|
position: Tween<Offset>(
|
||||||
|
begin: const Offset(0, -0.2),
|
||||||
|
end: Offset.zero,
|
||||||
|
).animate(animation),
|
||||||
|
child: FadeTransition(
|
||||||
|
opacity: animation,
|
||||||
|
child: SizeTransition(
|
||||||
|
sizeFactor: animation,
|
||||||
|
axisAlignment: -1.0,
|
||||||
|
child: child,
|
||||||
),
|
),
|
||||||
SizedBox(
|
),
|
||||||
width: 28,
|
);
|
||||||
height: 28,
|
},
|
||||||
child: InkWell(
|
child:
|
||||||
onTap: onClear,
|
(messageReplyingTo != null ||
|
||||||
child: const Icon(Icons.close, size: 20).center(),
|
messageForwardingTo != null ||
|
||||||
),
|
messageEditingTo != null)
|
||||||
),
|
? Container(
|
||||||
],
|
key: ValueKey(
|
||||||
),
|
messageReplyingTo?.id ??
|
||||||
),
|
messageForwardingTo?.id ??
|
||||||
|
messageEditingTo?.id ??
|
||||||
|
'action',
|
||||||
|
),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 16,
|
||||||
|
vertical: 8,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color:
|
||||||
|
Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.surfaceContainerHigh,
|
||||||
|
borderRadius: BorderRadius.circular(24),
|
||||||
|
border: Border.all(
|
||||||
|
color: Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.outline.withOpacity(0.2),
|
||||||
|
width: 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
margin: const EdgeInsets.only(
|
||||||
|
left: 8,
|
||||||
|
right: 8,
|
||||||
|
top: 8,
|
||||||
|
bottom: 8,
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
messageReplyingTo != null
|
||||||
|
? Symbols.reply
|
||||||
|
: messageForwardingTo != null
|
||||||
|
? Symbols.forward
|
||||||
|
: Symbols.edit,
|
||||||
|
size: 18,
|
||||||
|
color:
|
||||||
|
Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
const Gap(8),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
messageReplyingTo != null
|
||||||
|
? 'chatReplyingTo'.tr(
|
||||||
|
args: [
|
||||||
|
messageReplyingTo
|
||||||
|
?.sender
|
||||||
|
.account
|
||||||
|
.nick ??
|
||||||
|
'unknown'.tr(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: messageForwardingTo != null
|
||||||
|
? 'chatForwarding'.tr()
|
||||||
|
: 'chatEditing'.tr(),
|
||||||
|
style: Theme.of(
|
||||||
|
context,
|
||||||
|
).textTheme.bodySmall!.copyWith(
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
child: IconButton(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
icon: const Icon(Icons.close, size: 18),
|
||||||
|
onPressed: onClear,
|
||||||
|
tooltip: 'clear'.tr(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (messageReplyingTo != null ||
|
||||||
|
messageForwardingTo != null ||
|
||||||
|
messageEditingTo != null)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
top: 6,
|
||||||
|
left: 26,
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
(messageReplyingTo ??
|
||||||
|
messageForwardingTo ??
|
||||||
|
messageEditingTo)
|
||||||
|
?.content ??
|
||||||
|
'chatNoContent'.tr(),
|
||||||
|
style: Theme.of(
|
||||||
|
context,
|
||||||
|
).textTheme.bodySmall!.copyWith(
|
||||||
|
color:
|
||||||
|
Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: const SizedBox.shrink(key: ValueKey('no-action')),
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
@@ -353,24 +467,28 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
UploadMenu(
|
UploadMenu(
|
||||||
items: [
|
items: [
|
||||||
MenuItemData(
|
UploadMenuItemData(
|
||||||
Symbols.add_a_photo,
|
Symbols.add_a_photo,
|
||||||
'addPhoto',
|
'addPhoto',
|
||||||
() => onPickFile(true),
|
() => onPickFile(true),
|
||||||
),
|
),
|
||||||
MenuItemData(
|
UploadMenuItemData(
|
||||||
Symbols.videocam,
|
Symbols.videocam,
|
||||||
'addVideo',
|
'addVideo',
|
||||||
() => onPickFile(false),
|
() => onPickFile(false),
|
||||||
),
|
),
|
||||||
MenuItemData(Symbols.mic, 'addAudio', onPickAudio),
|
UploadMenuItemData(
|
||||||
MenuItemData(
|
Symbols.mic,
|
||||||
|
'addAudio',
|
||||||
|
onPickAudio,
|
||||||
|
),
|
||||||
|
UploadMenuItemData(
|
||||||
Symbols.file_upload,
|
Symbols.file_upload,
|
||||||
'uploadFile',
|
'uploadFile',
|
||||||
onPickGeneralFile,
|
onPickGeneralFile,
|
||||||
),
|
),
|
||||||
if (onLinkAttachment != null)
|
if (onLinkAttachment != null)
|
||||||
MenuItemData(
|
UploadMenuItemData(
|
||||||
Symbols.attach_file,
|
Symbols.attach_file,
|
||||||
'linkAttachment',
|
'linkAttachment',
|
||||||
onLinkAttachment!,
|
onLinkAttachment!,
|
||||||
@@ -414,11 +532,17 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
? '${messageController.text.length}/4096'
|
? '${messageController.text.length}/4096'
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
maxLines: 3,
|
maxLines: 5,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
onTapOutside:
|
onTapOutside:
|
||||||
(_) =>
|
(_) =>
|
||||||
FocusManager.instance.primaryFocus?.unfocus(),
|
FocusManager.instance.primaryFocus?.unfocus(),
|
||||||
|
textInputAction:
|
||||||
|
settings.enterToSend
|
||||||
|
? TextInputAction.send
|
||||||
|
: null,
|
||||||
|
onSubmitted:
|
||||||
|
settings.enterToSend ? (_) => send() : null,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
suggestionsCallback: (pattern) async {
|
suggestionsCallback: (pattern) async {
|
||||||
@@ -428,11 +552,13 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
final triggerIndex =
|
final triggerIndex =
|
||||||
atIndex > colonIndex ? atIndex : colonIndex;
|
atIndex > colonIndex ? atIndex : colonIndex;
|
||||||
if (triggerIndex == -1) return [];
|
if (triggerIndex == -1) return [];
|
||||||
|
final chopped = pattern.substring(triggerIndex);
|
||||||
|
if (chopped.contains(' ')) return [];
|
||||||
final service = ref.read(autocompleteServiceProvider);
|
final service = ref.read(autocompleteServiceProvider);
|
||||||
try {
|
try {
|
||||||
return await service.getSuggestions(
|
return await service.getSuggestions(
|
||||||
chatRoom.id,
|
chatRoom.id,
|
||||||
pattern,
|
chopped,
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [];
|
return [];
|
||||||
@@ -523,7 +649,7 @@ class ChatInput extends HookConsumerWidget {
|
|||||||
direction: VerticalDirection.up,
|
direction: VerticalDirection.up,
|
||||||
hideOnEmpty: true,
|
hideOnEmpty: true,
|
||||||
hideOnLoading: true,
|
hideOnLoading: true,
|
||||||
debounceDuration: const Duration(milliseconds: 500),
|
debounceDuration: const Duration(milliseconds: 1000),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import 'package:island/pods/chat/chat_rooms.dart';
|
|||||||
import 'package:island/pods/chat/messages_notifier.dart';
|
import 'package:island/pods/chat/messages_notifier.dart';
|
||||||
import 'package:island/pods/translate.dart';
|
import 'package:island/pods/translate.dart';
|
||||||
import 'package:island/pods/config.dart';
|
import 'package:island/pods/config.dart';
|
||||||
|
import 'package:island/services/time.dart';
|
||||||
import 'package:island/widgets/account/account_pfc.dart';
|
import 'package:island/widgets/account/account_pfc.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
|
||||||
import 'package:island/widgets/chat/message_content.dart';
|
import 'package:island/widgets/chat/message_content.dart';
|
||||||
import 'package:island/widgets/chat/message_indicators.dart';
|
import 'package:island/widgets/chat/message_indicators.dart';
|
||||||
import 'package:island/widgets/chat/message_sender_info.dart';
|
import 'package:island/widgets/chat/message_sender_info.dart';
|
||||||
@@ -161,6 +161,7 @@ class MessageItem extends HookConsumerWidget {
|
|||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: [
|
children: [
|
||||||
SwipeTo(
|
SwipeTo(
|
||||||
|
swipeSensitivity: 15,
|
||||||
rightSwipeWidget: Transform.flip(
|
rightSwipeWidget: Transform.flip(
|
||||||
flipX: true,
|
flipX: true,
|
||||||
child: Icon(Symbols.menu_open),
|
child: Icon(Symbols.menu_open),
|
||||||
@@ -398,7 +399,19 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
|||||||
const Gap(4),
|
const Gap(4),
|
||||||
],
|
],
|
||||||
|
|
||||||
const Gap(8),
|
Row(
|
||||||
|
spacing: 6,
|
||||||
|
children: [
|
||||||
|
Icon(Symbols.send, size: 16),
|
||||||
|
Text(
|
||||||
|
'messageSentAt'.tr(
|
||||||
|
args: [widget.message.createdAt.formatSystem()],
|
||||||
|
),
|
||||||
|
).fontSize(13),
|
||||||
|
],
|
||||||
|
).opacity(0.75).padding(horizontal: 20, top: 8, bottom: 6),
|
||||||
|
|
||||||
|
const Divider(),
|
||||||
|
|
||||||
// Action buttons
|
// Action buttons
|
||||||
if (widget.isCurrentUser)
|
if (widget.isCurrentUser)
|
||||||
@@ -477,6 +490,8 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
|||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
|
Gap(MediaQuery.of(context).padding.bottom + 32),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -663,17 +678,11 @@ class MessageItemDisplayBubble extends HookConsumerWidget {
|
|||||||
? Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5)
|
? Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5)
|
||||||
: Theme.of(context).colorScheme.surfaceContainer;
|
: Theme.of(context).colorScheme.surfaceContainer;
|
||||||
|
|
||||||
final hasBackground =
|
|
||||||
ref.watch(backgroundImageFileProvider).valueOrNull != null;
|
|
||||||
|
|
||||||
final remoteMessage = message.toRemoteMessage();
|
final remoteMessage = message.toRemoteMessage();
|
||||||
final sender = remoteMessage.sender;
|
final sender = remoteMessage.sender;
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
color:
|
color: Colors.transparent,
|
||||||
hasBackground
|
|
||||||
? Colors.transparent
|
|
||||||
: Theme.of(context).colorScheme.surface,
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import 'package:dio/dio.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:island/models/activity.dart';
|
import 'package:island/models/activity.dart';
|
||||||
@@ -14,6 +13,8 @@ import 'package:island/pods/userinfo.dart';
|
|||||||
import 'package:island/screens/auth/captcha.dart';
|
import 'package:island/screens/auth/captcha.dart';
|
||||||
import 'package:island/widgets/alert.dart';
|
import 'package:island/widgets/alert.dart';
|
||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
|
import 'package:island/widgets/content/sheet.dart';
|
||||||
|
import 'package:island/widgets/account/event_calendar_content.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:slide_countdown/slide_countdown.dart';
|
import 'package:slide_countdown/slide_countdown.dart';
|
||||||
@@ -25,7 +26,7 @@ part 'check_in.g.dart';
|
|||||||
Future<SnCheckInResult?> checkInResultToday(Ref ref) async {
|
Future<SnCheckInResult?> checkInResultToday(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
final resp = await client.get('/id/accounts/me/check-in');
|
final resp = await client.get('/pass/accounts/me/check-in');
|
||||||
return SnCheckInResult.fromJson(resp.data);
|
return SnCheckInResult.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is DioException) {
|
if (err is DioException) {
|
||||||
@@ -41,7 +42,7 @@ Future<SnCheckInResult?> checkInResultToday(Ref ref) async {
|
|||||||
Future<SnNotableDay?> nextNotableDay(Ref ref) async {
|
Future<SnNotableDay?> nextNotableDay(Ref ref) async {
|
||||||
final client = ref.watch(apiClientProvider);
|
final client = ref.watch(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
final resp = await client.get('/id/notable/me/next');
|
final resp = await client.get('/pass/notable/me/next');
|
||||||
return SnNotableDay.fromJson(resp.data);
|
return SnNotableDay.fromJson(resp.data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return null;
|
return null;
|
||||||
@@ -93,7 +94,7 @@ class CheckInWidget extends HookConsumerWidget {
|
|||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
try {
|
try {
|
||||||
await client.post(
|
await client.post(
|
||||||
'/id/accounts/me/check-in',
|
'/pass/accounts/me/check-in',
|
||||||
data: captchatTk == null ? null : jsonEncode(captchatTk),
|
data: captchatTk == null ? null : jsonEncode(captchatTk),
|
||||||
);
|
);
|
||||||
ref.invalidate(checkInResultTodayProvider);
|
ref.invalidate(checkInResultTodayProvider);
|
||||||
@@ -256,9 +257,17 @@ class CheckInWidget extends HookConsumerWidget {
|
|||||||
if (todayResult.valueOrNull == null) {
|
if (todayResult.valueOrNull == null) {
|
||||||
checkIn();
|
checkIn();
|
||||||
} else {
|
} else {
|
||||||
context.pushNamed(
|
showModalBottomSheet(
|
||||||
'accountCalendar',
|
context: context,
|
||||||
pathParameters: {'name': 'me'},
|
isScrollControlled: true,
|
||||||
|
builder:
|
||||||
|
(context) => SheetScaffold(
|
||||||
|
titleText: 'eventCalendar'.tr(),
|
||||||
|
child: EventCalendarContent(
|
||||||
|
name: 'me',
|
||||||
|
isSheet: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ part of 'check_in.dart';
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$checkInResultTodayHash() =>
|
String _$checkInResultTodayHash() =>
|
||||||
r'402e3a3be0d441ae12b2370d19d09bf81326933f';
|
r'b4dc97b2243f542b36c295dc5cce3fe6097cb308';
|
||||||
|
|
||||||
/// See also [checkInResultToday].
|
/// See also [checkInResultToday].
|
||||||
@ProviderFor(checkInResultToday)
|
@ProviderFor(checkInResultToday)
|
||||||
@@ -26,7 +26,7 @@ final checkInResultTodayProvider =
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef CheckInResultTodayRef = AutoDisposeFutureProviderRef<SnCheckInResult?>;
|
typedef CheckInResultTodayRef = AutoDisposeFutureProviderRef<SnCheckInResult?>;
|
||||||
String _$nextNotableDayHash() => r'698370bec4be28774d332412c5a701f914064c90';
|
String _$nextNotableDayHash() => r'c8404308f6b0f581cc7df251bce8f3c5ac130245';
|
||||||
|
|
||||||
/// See also [nextNotableDay].
|
/// See also [nextNotableDay].
|
||||||
@ProviderFor(nextNotableDay)
|
@ProviderFor(nextNotableDay)
|
||||||
|
|||||||
@@ -530,7 +530,11 @@ class SpoilerSpanNode extends SpanNode {
|
|||||||
? Row(
|
? Row(
|
||||||
spacing: 6,
|
spacing: 6,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [Icon(Symbols.visibility, size: 18), Text(text)],
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Icon(Symbols.visibility, size: 18).padding(top: 1),
|
||||||
|
Flexible(child: Text(text)),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
: Row(
|
: Row(
|
||||||
spacing: 6,
|
spacing: 6,
|
||||||
@@ -541,7 +545,13 @@ class SpoilerSpanNode extends SpanNode {
|
|||||||
color: foregroundColor,
|
color: foregroundColor,
|
||||||
size: 18,
|
size: 18,
|
||||||
),
|
),
|
||||||
Text(text, style: TextStyle(color: foregroundColor)),
|
Flexible(
|
||||||
|
child:
|
||||||
|
Text(
|
||||||
|
'spoiler',
|
||||||
|
style: TextStyle(color: foregroundColor),
|
||||||
|
).tr(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -193,10 +193,7 @@ class _PaymentContentState extends ConsumerState<_PaymentContent> {
|
|||||||
// Perform biometric authentication
|
// Perform biometric authentication
|
||||||
final bool didAuthenticate = await _localAuth.authenticate(
|
final bool didAuthenticate = await _localAuth.authenticate(
|
||||||
localizedReason: 'biometricPrompt'.tr(),
|
localizedReason: 'biometricPrompt'.tr(),
|
||||||
options: const AuthenticationOptions(
|
biometricOnly: true,
|
||||||
biometricOnly: true,
|
|
||||||
stickyAuth: true,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (didAuthenticate) {
|
if (didAuthenticate) {
|
||||||
@@ -244,7 +241,7 @@ class _PaymentContentState extends ConsumerState<_PaymentContent> {
|
|||||||
try {
|
try {
|
||||||
final client = ref.read(apiClientProvider);
|
final client = ref.read(apiClientProvider);
|
||||||
final response = await client.post(
|
final response = await client.post(
|
||||||
'/id/orders/${widget.order.id}/pay',
|
'/pass/orders/${widget.order.id}/pay',
|
||||||
data: {'pin_code': pin},
|
data: {'pin_code': pin},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ class PostComposeCard extends HookConsumerWidget {
|
|||||||
final SnPost? originalPost;
|
final SnPost? originalPost;
|
||||||
final PostComposeInitialState? initialState;
|
final PostComposeInitialState? initialState;
|
||||||
final VoidCallback? onCancel;
|
final VoidCallback? onCancel;
|
||||||
final Function(SnPost)? onSubmit;
|
final Function()? onSubmit;
|
||||||
final Function(ComposeState)? onStateChanged;
|
final Function(ComposeState)? onStateChanged;
|
||||||
final bool isInDialog;
|
final bool isDialog;
|
||||||
|
|
||||||
const PostComposeCard({
|
const PostComposeCard({
|
||||||
super.key,
|
super.key,
|
||||||
@@ -45,7 +45,7 @@ class PostComposeCard extends HookConsumerWidget {
|
|||||||
this.onCancel,
|
this.onCancel,
|
||||||
this.onSubmit,
|
this.onSubmit,
|
||||||
this.onStateChanged,
|
this.onStateChanged,
|
||||||
this.isInDialog = false,
|
this.isDialog = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -164,20 +164,19 @@ class PostComposeCard extends HookConsumerWidget {
|
|||||||
// Reset the form for new composition
|
// Reset the form for new composition
|
||||||
ComposeStateUtils.resetForm(state);
|
ComposeStateUtils.resetForm(state);
|
||||||
|
|
||||||
// Call the widget's onSubmit callback to trigger activity list refresh
|
onSubmit?.call();
|
||||||
// Note: onSubmit still receives the post from the return value
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final maxHeight = math.min(
|
final maxHeight = math.min(
|
||||||
640.0,
|
640.0,
|
||||||
MediaQuery.of(context).size.height * (isInDialog ? 0.8 : 0.72),
|
MediaQuery.of(context).size.height * (isDialog ? 0.8 : 0.72),
|
||||||
);
|
);
|
||||||
|
|
||||||
return Card(
|
return Card(
|
||||||
margin: EdgeInsets.zero,
|
margin: EdgeInsets.zero,
|
||||||
color: Theme.of(context).colorScheme.surfaceContainer,
|
color: isDialog ? Theme.of(context).colorScheme.surfaceContainer : null,
|
||||||
child: Container(
|
child: Container(
|
||||||
constraints: BoxConstraints(maxHeight: maxHeight),
|
constraints: BoxConstraints(maxHeight: maxHeight),
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -311,7 +310,7 @@ class PostComposeCard extends HookConsumerWidget {
|
|||||||
onTap: () {
|
onTap: () {
|
||||||
if (state.currentPublisher.value == null) {
|
if (state.currentPublisher.value == null) {
|
||||||
// No publisher loaded, guide user to create one
|
// No publisher loaded, guide user to create one
|
||||||
if (isInDialog) {
|
if (isDialog) {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}
|
}
|
||||||
context.pushNamed('creatorNew').then((value) {
|
context.pushNamed('creatorNew').then((value) {
|
||||||
@@ -348,7 +347,7 @@ class PostComposeCard extends HookConsumerWidget {
|
|||||||
onPublisherTap: () {
|
onPublisherTap: () {
|
||||||
if (state.currentPublisher.value == null) {
|
if (state.currentPublisher.value == null) {
|
||||||
// No publisher loaded, guide user to create one
|
// No publisher loaded, guide user to create one
|
||||||
if (isInDialog) {
|
if (isDialog) {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}
|
}
|
||||||
context.pushNamed('creatorNew').then((
|
context.pushNamed('creatorNew').then((
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ class PostComposeDialog extends HookConsumerWidget {
|
|||||||
this.isBottomSheet = false,
|
this.isBottomSheet = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
static Future<SnPost?> show(
|
static Future<bool?> show(
|
||||||
BuildContext context, {
|
BuildContext context, {
|
||||||
SnPost? originalPost,
|
SnPost? originalPost,
|
||||||
PostComposeInitialState? initialState,
|
PostComposeInitialState? initialState,
|
||||||
}) {
|
}) {
|
||||||
return showDialog<SnPost>(
|
return showDialog<bool>(
|
||||||
context: context,
|
context: context,
|
||||||
useRootNavigator: true,
|
useRootNavigator: true,
|
||||||
builder:
|
builder:
|
||||||
@@ -74,8 +74,8 @@ class PostComposeDialog extends HookConsumerWidget {
|
|||||||
originalPost: originalPost,
|
originalPost: originalPost,
|
||||||
initialState: restoredInitialState.value ?? initialState,
|
initialState: restoredInitialState.value ?? initialState,
|
||||||
onCancel: () => Navigator.of(context).pop(),
|
onCancel: () => Navigator.of(context).pop(),
|
||||||
onSubmit: (post) => Navigator.of(context).pop(post),
|
onSubmit: () => Navigator.of(context).pop(true),
|
||||||
isInDialog: true,
|
isDialog: true,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -149,9 +149,11 @@ class ComposeFormFields extends HookConsumerWidget {
|
|||||||
final triggerIndex =
|
final triggerIndex =
|
||||||
atIndex > colonIndex ? atIndex : colonIndex;
|
atIndex > colonIndex ? atIndex : colonIndex;
|
||||||
if (triggerIndex == -1) return [];
|
if (triggerIndex == -1) return [];
|
||||||
|
final chopped = pattern.substring(triggerIndex);
|
||||||
|
if (chopped.contains(' ')) return [];
|
||||||
final service = ref.read(autocompleteServiceProvider);
|
final service = ref.read(autocompleteServiceProvider);
|
||||||
try {
|
try {
|
||||||
return await service.getGeneralSuggestions(pattern);
|
return await service.getGeneralSuggestions(chopped);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -235,7 +237,7 @@ class ComposeFormFields extends HookConsumerWidget {
|
|||||||
direction: VerticalDirection.down,
|
direction: VerticalDirection.down,
|
||||||
hideOnEmpty: true,
|
hideOnEmpty: true,
|
||||||
hideOnLoading: true,
|
hideOnLoading: true,
|
||||||
debounceDuration: const Duration(milliseconds: 500),
|
debounceDuration: const Duration(milliseconds: 1000),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ import 'package:dropdown_button2/dropdown_button2.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:island/models/post_category.dart';
|
import 'package:island/models/post_category.dart';
|
||||||
|
import 'package:island/models/post_tag.dart';
|
||||||
import 'package:island/models/realm.dart';
|
import 'package:island/models/realm.dart';
|
||||||
import 'package:island/pods/network.dart';
|
import 'package:island/pods/network.dart';
|
||||||
import 'package:island/screens/realm/realms.dart';
|
import 'package:island/screens/realm/realms.dart';
|
||||||
@@ -14,7 +16,6 @@ import 'package:island/widgets/post/compose_shared.dart';
|
|||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
import 'package:textfield_tags/textfield_tags.dart';
|
|
||||||
|
|
||||||
part 'compose_settings_sheet.g.dart';
|
part 'compose_settings_sheet.g.dart';
|
||||||
|
|
||||||
@@ -35,103 +36,31 @@ Future<List<SnPostCategory>> postCategories(Ref ref) async {
|
|||||||
return uniqueCategories.values.toList();
|
return uniqueCategories.values.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A reusable widget for tag input fields with chip display
|
|
||||||
class ChipTagInputField extends StatelessWidget {
|
|
||||||
final InputFieldValues inputFieldValues;
|
|
||||||
final String labelText;
|
|
||||||
final String hintText;
|
|
||||||
|
|
||||||
const ChipTagInputField({
|
|
||||||
super.key,
|
|
||||||
required this.inputFieldValues,
|
|
||||||
required this.labelText,
|
|
||||||
required this.hintText,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return TextField(
|
|
||||||
controller: inputFieldValues.textEditingController,
|
|
||||||
focusNode: inputFieldValues.focusNode,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
label: Text(labelText).tr(),
|
|
||||||
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
|
|
||||||
contentPadding: const EdgeInsets.all(16),
|
|
||||||
hintText: inputFieldValues.tags.isNotEmpty ? '' : hintText.tr(),
|
|
||||||
errorText: inputFieldValues.error,
|
|
||||||
prefixIconConstraints: BoxConstraints(
|
|
||||||
maxWidth: MediaQuery.of(context).size.width * 0.8,
|
|
||||||
),
|
|
||||||
prefixIcon:
|
|
||||||
inputFieldValues.tags.isNotEmpty
|
|
||||||
? SingleChildScrollView(
|
|
||||||
controller: inputFieldValues.tagScrollController,
|
|
||||||
scrollDirection: Axis.vertical,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 8, bottom: 8, left: 8),
|
|
||||||
child: Wrap(
|
|
||||||
runSpacing: 4.0,
|
|
||||||
spacing: 4.0,
|
|
||||||
children:
|
|
||||||
inputFieldValues.tags.map<Widget>((dynamic tag) {
|
|
||||||
return Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.0),
|
|
||||||
),
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
|
||||||
margin: const EdgeInsets.only(left: 5),
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 10.0,
|
|
||||||
vertical: 5.0,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
InkWell(
|
|
||||||
child: Text(
|
|
||||||
'#$tag',
|
|
||||||
style: TextStyle(
|
|
||||||
color:
|
|
||||||
Theme.of(
|
|
||||||
context,
|
|
||||||
).colorScheme.onPrimary,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const Gap(4),
|
|
||||||
InkWell(
|
|
||||||
child: const Icon(
|
|
||||||
Icons.cancel,
|
|
||||||
size: 14.0,
|
|
||||||
color: Color.fromARGB(255, 233, 233, 233),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
inputFieldValues.onTagRemoved(tag);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}).toList(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: null,
|
|
||||||
),
|
|
||||||
onChanged: inputFieldValues.onTagChanged,
|
|
||||||
onSubmitted: inputFieldValues.onTagSubmitted,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ComposeSettingsSheet extends HookConsumerWidget {
|
class ComposeSettingsSheet extends HookConsumerWidget {
|
||||||
final ComposeState state;
|
final ComposeState state;
|
||||||
|
|
||||||
const ComposeSettingsSheet({super.key, required this.state});
|
const ComposeSettingsSheet({super.key, required this.state});
|
||||||
|
|
||||||
|
Future<List<SnPostTag>> _fetchTagSuggestions(
|
||||||
|
String query,
|
||||||
|
WidgetRef ref,
|
||||||
|
) async {
|
||||||
|
if (query.isEmpty) return [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
final client = ref.read(apiClientProvider);
|
||||||
|
final response = await client.get(
|
||||||
|
'/sphere/posts/tags',
|
||||||
|
queryParameters: {'query': query},
|
||||||
|
);
|
||||||
|
return response.data
|
||||||
|
.map<SnPostTag>((json) => SnPostTag.fromJson(json))
|
||||||
|
.toList();
|
||||||
|
} catch (e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
@@ -140,6 +69,7 @@ class ComposeSettingsSheet extends HookConsumerWidget {
|
|||||||
// Listen to visibility changes to trigger rebuilds
|
// Listen to visibility changes to trigger rebuilds
|
||||||
final currentVisibility = useValueListenable(state.visibility);
|
final currentVisibility = useValueListenable(state.visibility);
|
||||||
final currentCategories = useValueListenable(state.categories);
|
final currentCategories = useValueListenable(state.categories);
|
||||||
|
final currentTags = useValueListenable(state.tags);
|
||||||
final currentRealm = useValueListenable(state.realm);
|
final currentRealm = useValueListenable(state.realm);
|
||||||
final postCategories = ref.watch(postCategoriesProvider);
|
final postCategories = ref.watch(postCategoriesProvider);
|
||||||
final userRealms = ref.watch(realmsJoinedProvider);
|
final userRealms = ref.watch(realmsJoinedProvider);
|
||||||
@@ -255,23 +185,118 @@ class ComposeSettingsSheet extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
|
|
||||||
// Tags field
|
// Tags field
|
||||||
TextFieldTags(
|
Container(
|
||||||
textfieldTagsController: state.tagsController,
|
decoration: BoxDecoration(
|
||||||
textSeparators: const [' ', ','],
|
border: Border.all(
|
||||||
letterCase: LetterCase.normal,
|
color: Theme.of(context).colorScheme.outline,
|
||||||
validator: (String tag) {
|
width: 1,
|
||||||
if (tag.isEmpty) {
|
),
|
||||||
return 'No, cannot be empty';
|
borderRadius: BorderRadius.circular(12),
|
||||||
}
|
),
|
||||||
return null;
|
padding: const EdgeInsets.all(16),
|
||||||
},
|
child: Column(
|
||||||
inputFieldBuilder: (context, inputFieldValues) {
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
return ChipTagInputField(
|
spacing: 12,
|
||||||
inputFieldValues: inputFieldValues,
|
children: [
|
||||||
labelText: 'tags',
|
Text(
|
||||||
hintText: 'tagsHint',
|
'tags'.tr(),
|
||||||
);
|
style: Theme.of(context).textTheme.labelLarge,
|
||||||
},
|
),
|
||||||
|
// Existing tags display
|
||||||
|
if (currentTags.isNotEmpty)
|
||||||
|
Wrap(
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
children:
|
||||||
|
currentTags.map((tag) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12,
|
||||||
|
vertical: 6,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'#$tag',
|
||||||
|
style: TextStyle(
|
||||||
|
color:
|
||||||
|
Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.onPrimary,
|
||||||
|
fontSize: 14,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
final newTags = List<String>.from(
|
||||||
|
state.tags.value,
|
||||||
|
)..remove(tag);
|
||||||
|
state.tags.value = newTags;
|
||||||
|
},
|
||||||
|
child: Icon(
|
||||||
|
Icons.close,
|
||||||
|
size: 16,
|
||||||
|
color:
|
||||||
|
Theme.of(
|
||||||
|
context,
|
||||||
|
).colorScheme.onPrimary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
// Tag input with autocomplete
|
||||||
|
TypeAheadField<SnPostTag>(
|
||||||
|
builder: (context, controller, focusNode) {
|
||||||
|
return TextField(
|
||||||
|
controller: controller,
|
||||||
|
focusNode: focusNode,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: 'addTag'.tr(),
|
||||||
|
border: InputBorder.none,
|
||||||
|
isCollapsed: true,
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
),
|
||||||
|
onSubmitted: (value) {
|
||||||
|
state.tags.value = [...state.tags.value, value];
|
||||||
|
controller.clear();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
suggestionsCallback:
|
||||||
|
(pattern) => _fetchTagSuggestions(pattern, ref),
|
||||||
|
itemBuilder: (context, suggestion) {
|
||||||
|
return ListTile(
|
||||||
|
shape: const RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||||
|
),
|
||||||
|
title: Text('#${suggestion.slug}'),
|
||||||
|
dense: true,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onSelected: (suggestion) {
|
||||||
|
if (!state.tags.value.contains(suggestion.slug)) {
|
||||||
|
state.tags.value = [
|
||||||
|
...state.tags.value,
|
||||||
|
suggestion.slug,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
direction: VerticalDirection.down,
|
||||||
|
hideOnEmpty: true,
|
||||||
|
hideOnLoading: true,
|
||||||
|
debounceDuration: const Duration(milliseconds: 300),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Categories field
|
// Categories field
|
||||||
@@ -399,6 +424,25 @@ class ComposeSettingsSheet extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
).padding(left: 16, right: 8),
|
).padding(left: 16, right: 8),
|
||||||
),
|
),
|
||||||
|
// Include current realm if it's not null and not in joined realms
|
||||||
|
if (currentRealm != null &&
|
||||||
|
!(userRealms.value ?? []).any(
|
||||||
|
(r) => r.id == currentRealm.id,
|
||||||
|
))
|
||||||
|
DropdownMenuItem<SnRealm?>(
|
||||||
|
value: currentRealm,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
ProfilePictureWidget(
|
||||||
|
fileId: currentRealm.picture?.id,
|
||||||
|
fallbackIcon: Symbols.workspaces,
|
||||||
|
radius: 16,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 12),
|
||||||
|
Text(currentRealm.name),
|
||||||
|
],
|
||||||
|
).padding(left: 16, right: 8),
|
||||||
|
),
|
||||||
if (userRealms.hasValue)
|
if (userRealms.hasValue)
|
||||||
...(userRealms.value ?? []).map(
|
...(userRealms.value ?? []).map(
|
||||||
(realm) => DropdownMenuItem<SnRealm?>(
|
(realm) => DropdownMenuItem<SnRealm?>(
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import 'package:island/widgets/post/compose_poll.dart';
|
|||||||
import 'package:island/widgets/post/compose_recorder.dart';
|
import 'package:island/widgets/post/compose_recorder.dart';
|
||||||
import 'package:island/pods/file_pool.dart';
|
import 'package:island/pods/file_pool.dart';
|
||||||
import 'package:pasteboard/pasteboard.dart';
|
import 'package:pasteboard/pasteboard.dart';
|
||||||
import 'package:textfield_tags/textfield_tags.dart';
|
|
||||||
import 'package:island/talker.dart';
|
import 'package:island/talker.dart';
|
||||||
|
|
||||||
class ComposeState {
|
class ComposeState {
|
||||||
@@ -37,7 +36,7 @@ class ComposeState {
|
|||||||
final ValueNotifier<SnPublisher?> currentPublisher;
|
final ValueNotifier<SnPublisher?> currentPublisher;
|
||||||
final ValueNotifier<bool> submitting;
|
final ValueNotifier<bool> submitting;
|
||||||
final ValueNotifier<List<SnPostCategory>> categories;
|
final ValueNotifier<List<SnPostCategory>> categories;
|
||||||
StringTagController tagsController;
|
final ValueNotifier<List<String>> tags;
|
||||||
final ValueNotifier<SnRealm?> realm;
|
final ValueNotifier<SnRealm?> realm;
|
||||||
final ValueNotifier<SnPostEmbedView?> embedView;
|
final ValueNotifier<SnPostEmbedView?> embedView;
|
||||||
final String draftId;
|
final String draftId;
|
||||||
@@ -56,7 +55,7 @@ class ComposeState {
|
|||||||
required this.attachmentProgress,
|
required this.attachmentProgress,
|
||||||
required this.currentPublisher,
|
required this.currentPublisher,
|
||||||
required this.submitting,
|
required this.submitting,
|
||||||
required this.tagsController,
|
required this.tags,
|
||||||
required this.categories,
|
required this.categories,
|
||||||
required this.realm,
|
required this.realm,
|
||||||
required this.embedView,
|
required this.embedView,
|
||||||
@@ -90,14 +89,10 @@ class ComposeLogic {
|
|||||||
int postType = 0,
|
int postType = 0,
|
||||||
}) {
|
}) {
|
||||||
final id = draftId ?? DateTime.now().millisecondsSinceEpoch.toString();
|
final id = draftId ?? DateTime.now().millisecondsSinceEpoch.toString();
|
||||||
final tagsController = StringTagController();
|
|
||||||
|
|
||||||
// Initialize tags from original post
|
// Initialize tags from original post
|
||||||
if (originalPost != null) {
|
final tags =
|
||||||
for (var tag in originalPost.tags) {
|
originalPost?.tags.map((tag) => tag.slug).toList() ?? <String>[];
|
||||||
tagsController.addTag(tag.slug);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize categories from original post
|
// Initialize categories from original post
|
||||||
final categories = originalPost?.categories ?? <SnPostCategory>[];
|
final categories = originalPost?.categories ?? <SnPostCategory>[];
|
||||||
@@ -129,7 +124,7 @@ class ComposeLogic {
|
|||||||
submitting: ValueNotifier<bool>(false),
|
submitting: ValueNotifier<bool>(false),
|
||||||
attachmentProgress: ValueNotifier<Map<int, double>>({}),
|
attachmentProgress: ValueNotifier<Map<int, double>>({}),
|
||||||
currentPublisher: ValueNotifier<SnPublisher?>(originalPost?.publisher),
|
currentPublisher: ValueNotifier<SnPublisher?>(originalPost?.publisher),
|
||||||
tagsController: tagsController,
|
tags: ValueNotifier<List<String>>(tags),
|
||||||
categories: ValueNotifier<List<SnPostCategory>>(categories),
|
categories: ValueNotifier<List<SnPostCategory>>(categories),
|
||||||
realm: ValueNotifier(originalPost?.realm),
|
realm: ValueNotifier(originalPost?.realm),
|
||||||
embedView: ValueNotifier<SnPostEmbedView?>(originalPost?.embedView),
|
embedView: ValueNotifier<SnPostEmbedView?>(originalPost?.embedView),
|
||||||
@@ -141,10 +136,7 @@ class ComposeLogic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ComposeState createStateFromDraft(SnPost draft, {int postType = 0}) {
|
static ComposeState createStateFromDraft(SnPost draft, {int postType = 0}) {
|
||||||
final tagsController = StringTagController();
|
final tags = draft.tags.map((tag) => tag.slug).toList();
|
||||||
for (var x in draft.tags) {
|
|
||||||
tagsController.addTag(x.slug);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ComposeState(
|
return ComposeState(
|
||||||
attachments: ValueNotifier<List<UniversalFile>>(
|
attachments: ValueNotifier<List<UniversalFile>>(
|
||||||
@@ -158,7 +150,7 @@ class ComposeLogic {
|
|||||||
submitting: ValueNotifier<bool>(false),
|
submitting: ValueNotifier<bool>(false),
|
||||||
attachmentProgress: ValueNotifier<Map<int, double>>({}),
|
attachmentProgress: ValueNotifier<Map<int, double>>({}),
|
||||||
currentPublisher: ValueNotifier<SnPublisher?>(null),
|
currentPublisher: ValueNotifier<SnPublisher?>(null),
|
||||||
tagsController: tagsController,
|
tags: ValueNotifier<List<String>>(tags),
|
||||||
categories: ValueNotifier<List<SnPostCategory>>(draft.categories),
|
categories: ValueNotifier<List<SnPostCategory>>(draft.categories),
|
||||||
realm: ValueNotifier(draft.realm),
|
realm: ValueNotifier(draft.realm),
|
||||||
embedView: ValueNotifier<SnPostEmbedView?>(draft.embedView),
|
embedView: ValueNotifier<SnPostEmbedView?>(draft.embedView),
|
||||||
@@ -685,7 +677,7 @@ class ComposeLogic {
|
|||||||
'type': state.postType,
|
'type': state.postType,
|
||||||
if (repliedPost != null) 'replied_post_id': repliedPost.id,
|
if (repliedPost != null) 'replied_post_id': repliedPost.id,
|
||||||
if (forwardedPost != null) 'forwarded_post_id': forwardedPost.id,
|
if (forwardedPost != null) 'forwarded_post_id': forwardedPost.id,
|
||||||
'tags': state.tagsController.getTags,
|
'tags': state.tags.value,
|
||||||
'categories': state.categories.value.map((e) => e.slug).toList(),
|
'categories': state.categories.value.map((e) => e.slug).toList(),
|
||||||
if (state.realm.value != null) 'realm_id': state.realm.value?.id,
|
if (state.realm.value != null) 'realm_id': state.realm.value?.id,
|
||||||
if (state.pollId.value != null) 'poll_id': state.pollId.value,
|
if (state.pollId.value != null) 'poll_id': state.pollId.value,
|
||||||
@@ -781,7 +773,7 @@ class ComposeLogic {
|
|||||||
state.submitting.dispose();
|
state.submitting.dispose();
|
||||||
state.attachmentProgress.dispose();
|
state.attachmentProgress.dispose();
|
||||||
state.currentPublisher.dispose();
|
state.currentPublisher.dispose();
|
||||||
state.tagsController.dispose();
|
state.tags.dispose();
|
||||||
state.categories.dispose();
|
state.categories.dispose();
|
||||||
state.realm.dispose();
|
state.realm.dispose();
|
||||||
state.embedView.dispose();
|
state.embedView.dispose();
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ class ComposeStateUtils {
|
|||||||
state.attachmentProgress.value = {};
|
state.attachmentProgress.value = {};
|
||||||
|
|
||||||
// Clear tags
|
// Clear tags
|
||||||
state.tagsController.clearTags();
|
state.tags.value = [];
|
||||||
|
|
||||||
// Clear categories
|
// Clear categories
|
||||||
state.categories.value = [];
|
state.categories.value = [];
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class ComposeSubmitUtils {
|
|||||||
'type': state.postType,
|
'type': state.postType,
|
||||||
if (repliedPost != null) 'replied_post_id': repliedPost.id,
|
if (repliedPost != null) 'replied_post_id': repliedPost.id,
|
||||||
if (forwardedPost != null) 'forwarded_post_id': forwardedPost.id,
|
if (forwardedPost != null) 'forwarded_post_id': forwardedPost.id,
|
||||||
'tags': state.tagsController.getTags,
|
'tags': state.tags.value,
|
||||||
'categories': state.categories.value.map((e) => e.slug).toList(),
|
'categories': state.categories.value.map((e) => e.slug).toList(),
|
||||||
if (state.realm.value != null) 'realm_id': state.realm.value?.id,
|
if (state.realm.value != null) 'realm_id': state.realm.value?.id,
|
||||||
if (state.pollId.value != null) 'poll_id': state.pollId.value,
|
if (state.pollId.value != null) 'poll_id': state.pollId.value,
|
||||||
|
|||||||
@@ -82,10 +82,10 @@ class ComposeToolbar extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final uploadMenuItems = [
|
final uploadMenuItems = [
|
||||||
MenuItemData(Symbols.add_a_photo, 'addPhoto', pickPhotoMedia),
|
UploadMenuItemData(Symbols.add_a_photo, 'addPhoto', pickPhotoMedia),
|
||||||
MenuItemData(Symbols.videocam, 'addVideo', pickVideoMedia),
|
UploadMenuItemData(Symbols.videocam, 'addVideo', pickVideoMedia),
|
||||||
MenuItemData(Symbols.mic, 'addAudio', addAudio),
|
UploadMenuItemData(Symbols.mic, 'addAudio', addAudio),
|
||||||
MenuItemData(Symbols.file_upload, 'uploadFile', pickGeneralFile),
|
UploadMenuItemData(Symbols.file_upload, 'uploadFile', pickGeneralFile),
|
||||||
];
|
];
|
||||||
|
|
||||||
final colorScheme = Theme.of(context).colorScheme;
|
final colorScheme = Theme.of(context).colorScheme;
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ class PostAwardSheet extends HookConsumerWidget {
|
|||||||
final orderId = awardResponse.data['order_id'] as String;
|
final orderId = awardResponse.data['order_id'] as String;
|
||||||
|
|
||||||
// Fetch order details
|
// Fetch order details
|
||||||
final orderResponse = await client.get('/id/orders/$orderId');
|
final orderResponse = await client.get('/pass/orders/$orderId');
|
||||||
final order = SnWalletOrder.fromJson(orderResponse.data);
|
final order = SnWalletOrder.fromJson(orderResponse.data);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user