diff --git a/docs/designs/home.html b/docs/designs/home.html index c1534ef..ec7ab1b 100644 --- a/docs/designs/home.html +++ b/docs/designs/home.html @@ -1,495 +1,646 @@ - + - - - - Home - Lazurite - - - - - - - - -
- - -
-

Home

- -
- -
- - -
-
-
JD
-
- + + + + Home - Lazurite + + + + + + + + +
+ +
+

Home

+ +
+ +
+ +
+
+
JD
+
+ +
+
+
+ + + + +
+ +
+
+ + +
+ +
-
-
- -
- -
-
- - -
- - -
- - -
-
-
AS
-
+ + +
+
+
BJ
+
-
- -
- Just launched my new project! 🚀 Check out the demo at example.com. Special thanks to @bob.bsky.social for the help! #buildinpublic #dev -
- -
-
[Project Screenshot]
-
-
My Awesome Project
-
example.com
+ +
+ Working on some exciting features for the next release! Here's a sneak peek of what's coming: improved + search, better notifications, and dark mode support. #bluesky + #atproto
-
- -
- - - - -
- - - -
-
-
BJ
- - -
- Working on some exciting features for the next release! Here's a sneak peek of what's coming: improved search, better notifications, and dark mode support. #bluesky #atproto -
- -
- - - - -
-
- - -
-
-
CW
-
+ + +
+
+
CW
+
-
- -
- The @atproto team has been doing amazing work! Read their latest blog post about federation: atproto.com/blog/federation - -

- - Key highlights: - • Self-hosting guides - • PDS (Personal Data Server) setup - • Relay infrastructure - -

- - #atprotocol #decentralized #socialweb -
- -
- - - - -
- - - -
-
-
DM
- - -
- Beautiful sunset from my hike today! 🌅 #nature #photography #hiking -
- -
-
[Sunset Photo]
-
- -
- - - - -
-
- + +
+ + + + +
+ + + +
+
+
DM
+ +
+ +
+ Beautiful sunset from my hike today! 🌅 #nature + #photography #hiking +
+ +
+
[Sunset Photo]
+
+ +
+ + + + +
+
+
+ + +
- - - - -
- - - + + + diff --git a/docs/designs/logs.html b/docs/designs/logs.html index 7cef42e..7b20651 100644 --- a/docs/designs/logs.html +++ b/docs/designs/logs.html @@ -9,7 +9,9 @@ - + - - -
- - - - -
- - -
-

Messages

- -
- - -
- - -
- -
+ + + + Messages - Lazurite + + + + + + + + +
+ + + +
+ +
+

Messages

+ +
+ + +
+ + +
- -
-
-
AS
-
-
-
-
- Alice Smith - 12m +
+ +
+
+
AS
+
+
+
+
+ Alice Smith + 12m +
+
+ Hey! Did you see the new federation update? It's really exciting. +
-
Hey! Did you see the new federation update? It's really exciting.
-
- -
-
-
BJ
-
-
-
-
- Bob Johnson - 2h + +
+
+
BJ
+
+
+
+
+ Bob Johnson + 2h +
+
Would love to collaborate on the AT Protocol project
-
Would love to collaborate on the AT Protocol project
-
- -
-
-
CW
-
-
-
- Carol White - 1d + +
+
+
CW
+
+
+
+ Carol White + 1d +
+
Thanks for sharing that article! I'll check it out this weekend.
-
Thanks for sharing that article! I'll check it out this weekend.
-
- -
-
-
DM
-
-
-
- David Miller - 3d + +
+
+
DM
+
+
+
+ David Miller + 3d +
+
Sounds good, let's catch up next week then!
-
Sounds good, let's catch up next week then!
+ + + + +
- - - - - -
- -
-
-
EL
-
-
-
- Eva Lee - 1w + +
+
+
EL
+
+
+
+ Eva Lee + 1w +
+
Great chatting with you at the meetup!
-
Great chatting with you at the meetup!
-
- - - - - - -
+ - - - - - -
- -
-
Alice Smith
-
@alice.bsky.social
+ + + +
+ +
+ +
+
Alice Smith
+
@alice.bsky.social
+
+
- -
- -
+ +
+
Today
-
Today
+
+
Hey! Did you see the new federation update? It's really exciting.
+
+
10:23 AM
-
-
Hey! Did you see the new federation update? It's really exciting.
-
-
10:23 AM
+
+
+ Yes! I was just reading through the announcement. The self-hosting guide looks much improved. +
+
+
10:25 AM
-
-
Yes! I was just reading through the announcement. The self-hosting guide looks much improved.
-
-
10:25 AM
+
+
+ Right? I'm thinking of setting up my own PDS this weekend. Want to try it together? +
+
+
10:27 AM
-
-
Right? I'm thinking of setting up my own PDS this weekend. Want to try it together?
-
-
10:27 AM
+
+
+ That sounds great! I've been meaning to do that for a while. Let me know when you're free. +
+
+
10:30 AM
-
-
That sounds great! I've been meaning to do that for a while. Let me know when you're free.
+
+
+ Saturday afternoon works for me. We could do a video call and set them up at the same time. +
+
+
10:32 AM
-
10:30 AM
-
-
Saturday afternoon works for me. We could do a video call and set them up at the same time.
+ +
+ +
-
10:32 AM
- -
- - -
- -
-
-
- - - + + diff --git a/docs/designs/profile.html b/docs/designs/profile.html index e3f21ec..9196f64 100644 --- a/docs/designs/profile.html +++ b/docs/designs/profile.html @@ -1,452 +1,564 @@ - + - - - - Profile - Lazurite - - - - - - - - -
- - -
- -

John Doe

- -
- -
- - -
-
- -
-
JD
- -
- + + + + Profile - Lazurite + + + + + + + + +
+ +
+ +

John Doe

+ +
+ +
+ +
+
+ +
+
JD
+ +
+ +
+ +

John Doe

+
@johndoe.bsky.social
+ +

+ Building things on the web 🚀 • Open source enthusiast • Coffee addict ☕ • + johndoe.dev +

+ +
+
+ + + + + San Francisco, CA +
+ +
+ + + + + + + Joined March 2023 +
+
+ +
+
256 Following
+
1.2K Followers
+
482 Posts
+
- -

John Doe

-
@johndoe.bsky.social
- -

- Building things on the web 🚀 • Open source enthusiast • Coffee addict ☕ • - johndoe.dev -

- -
-
- - - - - San Francisco, CA +
+ + +
+ + + + +
+ + + + +
+
+
JD
+ - -
- - - - - +
+ +
+ Finally shipped the new feature I've been working on! 🎉 Check it out and let me know what you think. Always + open to feedback! #buildinpublic + #indiehacker +
+ +
+ + + + +
+
+ + +
+
+
JD
+
- -
-
256 Following
-
1.2K Followers
-
482 Posts
+ +
+ Really enjoying the @bluesky community so far. Great + conversations happening here! Looking forward to seeing how the platform evolves. + #bluesky #socialmedia
-
-
- - -
- - - - -
- - - - -
-
-
JD
- - -
- Finally shipped the new feature I've been working on! 🎉 Check it out and let me know what you think. Always open to feedback! #buildinpublic #indiehacker -
- -
- - - - -
-
- - -
-
-
JD
-
+ + +
+
+
JD
+
-
- -
- Really enjoying the @bluesky community so far. Great conversations happening here! Looking forward to seeing how the platform evolves. #bluesky #socialmedia -
- -
- - - - -
- - - -
-
-
JD
- - -
- Great read on the future of decentralized social networks by @protocol #atprotocol #web3 -
- -
-
[Article Preview Image]
-
-
The Future of Decentralized Social Networks
-
protocol.com/blog/future-decentralized-social
+ +
+
[Article Preview Image]
+
+
The Future of Decentralized Social Networks
+
protocol.com/blog/future-decentralized-social
+
-
- -
- - - - -
-
- + +
+ + + + +
+ +
+ + +
- - - - -
- - - + + + diff --git a/docs/designs/search.html b/docs/designs/search.html index 9ec86f3..ac4b636 100644 --- a/docs/designs/search.html +++ b/docs/designs/search.html @@ -2,17 +2,13 @@ - + Search - Lazurite + rel="stylesheet" /> - - -
- - -
-

Settings

- -
- -
- - - -
JD
-
-
John Doe
-
@johndoe.bsky.social
-
-
- - - -
-
- - -
-
Appearance
- -
- -
- - -
-
-
- + + + + Settings - Lazurite + + + + + + + + +
+ +
+

Settings

+ +
+ +
+ + +
JD
+
+
John Doe
+
@johndoe.bsky.social
+
+
+ + + +
+
+ + +
+
Appearance
+ +
+ +
+ + +
+
+
+ + + +
+ Light
- Light -
-
-
-
- +
+
+
+ + + +
+ Dark
- Dark -
- -
-
- - - -
-
-
- + +
+
+ + + +
+
+
+ + + +
+ Latte
- Latte -
-
-
-
- +
+
+
+ + + +
+ Mocha
- Mocha -
-
-
- - - -
-
-
- +
+
+ + + +
+
+
+ + + +
+ Snow
- Snow -
-
-
-
- +
+
+
+ + + +
+ Polar
- Polar -
-
-
- - - -
-
-
- +
+
+ + + +
+
+
+ + + +
+ Dawn
- Dawn -
-
-
-
- +
+
+
+ + + +
+ Moon
- Moon -
-
-
-
- - -
-
-
Auto
-
Follow system theme
+
+
-
-
+ + +
+
+
Auto
+
Follow system theme
+
+
+
+
-
- - -
-
Account
- -
-
-
- - - - -
-
Edit Profile
-
Name, bio, avatar
+ + +
+
Account
+ +
+
+
+ + + + +
+
Edit Profile
+
Name, bio, avatar
+
-
-
- - - -
-
- -
-
- - - - -
-
Privacy
-
Visibility settings
+
+ + +
-
- - - + +
+
+ + + + +
+
Privacy
+
Visibility settings
+
+
+
+ + + +
-
- - -
-
Notifications
- -
-
-
- - - - -
-
Push Notifications
+ + +
+
Notifications
+ +
+
+
+ + + + +
+
Push Notifications
+
-
-
-
-
+
+
+
+
-
- -
-
- - - - -
-
Email Notifications
+ +
+
+ + + + +
+
Email Notifications
+
-
-
-
-
+
+
+
+
-
- - -
-
About
- -
- -
- - - - -
-
Dev Tools
-
PDS Explorer
+ + +
+
About
+ +
-
- - - -
-
- - -
- - - - - - - -
-
Logs
-
View app log files
+
+ + +
-
-
- - - -
-
- -
- - -
-
- - - -
-
Privacy Policy
+
+ + + +
+
+ +
+
+ + + + + +
+
Help & Support
+
+
+
+ + +
-
- - - + +
+
+ + + +
+
Privacy Policy
+
+
+
+ + + +
-
- - -
-
Danger Zone
- -
-
-
- - - - - -
-
Log Out
+ + +
+
Danger Zone
+ +
+
+
+ + + + + +
+
Log Out
+
+ + +
Lazurite v1.0.0 (Phase 1)
- - -
- Lazurite v1.0.0 (Phase 1) -
- + + +
- - - - -
- - - + + const active = document.querySelector(`.theme-option[data-theme="${savedTheme}"]`); + if (active) active.classList.add("active"); + })(); + + diff --git a/lib/core/database/app_database.g.dart b/lib/core/database/app_database.g.dart index a5fc281..b0ad7cd 100644 --- a/lib/core/database/app_database.g.dart +++ b/lib/core/database/app_database.g.dart @@ -26,9 +26,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _displayNameMeta = const VerificationMeta( - 'displayName', - ); + static const VerificationMeta _displayNameMeta = const VerificationMeta('displayName'); @override late final GeneratedColumn displayName = GeneratedColumn( 'display_name', @@ -37,9 +35,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _serviceMeta = const VerificationMeta( - 'service', - ); + static const VerificationMeta _serviceMeta = const VerificationMeta('service'); @override late final GeneratedColumn service = GeneratedColumn( 'service', @@ -48,9 +44,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _accessTokenMeta = const VerificationMeta( - 'accessToken', - ); + static const VerificationMeta _accessTokenMeta = const VerificationMeta('accessToken'); @override late final GeneratedColumn accessToken = GeneratedColumn( 'access_token', @@ -59,9 +53,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _refreshTokenMeta = const VerificationMeta( - 'refreshToken', - ); + static const VerificationMeta _refreshTokenMeta = const VerificationMeta('refreshToken'); @override late final GeneratedColumn refreshToken = GeneratedColumn( 'refresh_token', @@ -70,9 +62,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopPublicKeyMeta = const VerificationMeta( - 'dpopPublicKey', - ); + static const VerificationMeta _dpopPublicKeyMeta = const VerificationMeta('dpopPublicKey'); @override late final GeneratedColumn dpopPublicKey = GeneratedColumn( 'dpop_public_key', @@ -81,9 +71,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopPrivateKeyMeta = const VerificationMeta( - 'dpopPrivateKey', - ); + static const VerificationMeta _dpopPrivateKeyMeta = const VerificationMeta('dpopPrivateKey'); @override late final GeneratedColumn dpopPrivateKey = GeneratedColumn( 'dpop_private_key', @@ -92,9 +80,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopNonceMeta = const VerificationMeta( - 'dpopNonce', - ); + static const VerificationMeta _dpopNonceMeta = const VerificationMeta('dpopNonce'); @override late final GeneratedColumn dpopNonce = GeneratedColumn( 'dpop_nonce', @@ -103,9 +89,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _expiresAtMeta = const VerificationMeta( - 'expiresAt', - ); + static const VerificationMeta _expiresAtMeta = const VerificationMeta('expiresAt'); @override late final GeneratedColumn expiresAt = GeneratedColumn( 'expires_at', @@ -114,9 +98,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.dateTime, requiredDuringInsert: false, ); - static const VerificationMeta _createdAtMeta = const VerificationMeta( - 'createdAt', - ); + static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); @override late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', @@ -126,9 +108,7 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { requiredDuringInsert: false, defaultValue: currentDateAndTime, ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta( - 'updatedAt', - ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -159,104 +139,56 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { String get actualTableName => $name; static const String $name = 'accounts'; @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { + VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('did')) { - context.handle( - _didMeta, - did.isAcceptableOrUnknown(data['did']!, _didMeta), - ); + context.handle(_didMeta, did.isAcceptableOrUnknown(data['did']!, _didMeta)); } else if (isInserting) { context.missing(_didMeta); } if (data.containsKey('handle')) { - context.handle( - _handleMeta, - handle.isAcceptableOrUnknown(data['handle']!, _handleMeta), - ); + context.handle(_handleMeta, handle.isAcceptableOrUnknown(data['handle']!, _handleMeta)); } else if (isInserting) { context.missing(_handleMeta); } if (data.containsKey('display_name')) { - context.handle( - _displayNameMeta, - displayName.isAcceptableOrUnknown( - data['display_name']!, - _displayNameMeta, - ), - ); + context.handle(_displayNameMeta, displayName.isAcceptableOrUnknown(data['display_name']!, _displayNameMeta)); } if (data.containsKey('service')) { - context.handle( - _serviceMeta, - service.isAcceptableOrUnknown(data['service']!, _serviceMeta), - ); + context.handle(_serviceMeta, service.isAcceptableOrUnknown(data['service']!, _serviceMeta)); } if (data.containsKey('access_token')) { - context.handle( - _accessTokenMeta, - accessToken.isAcceptableOrUnknown( - data['access_token']!, - _accessTokenMeta, - ), - ); + context.handle(_accessTokenMeta, accessToken.isAcceptableOrUnknown(data['access_token']!, _accessTokenMeta)); } else if (isInserting) { context.missing(_accessTokenMeta); } if (data.containsKey('refresh_token')) { - context.handle( - _refreshTokenMeta, - refreshToken.isAcceptableOrUnknown( - data['refresh_token']!, - _refreshTokenMeta, - ), - ); + context.handle(_refreshTokenMeta, refreshToken.isAcceptableOrUnknown(data['refresh_token']!, _refreshTokenMeta)); } if (data.containsKey('dpop_public_key')) { context.handle( _dpopPublicKeyMeta, - dpopPublicKey.isAcceptableOrUnknown( - data['dpop_public_key']!, - _dpopPublicKeyMeta, - ), + dpopPublicKey.isAcceptableOrUnknown(data['dpop_public_key']!, _dpopPublicKeyMeta), ); } if (data.containsKey('dpop_private_key')) { context.handle( _dpopPrivateKeyMeta, - dpopPrivateKey.isAcceptableOrUnknown( - data['dpop_private_key']!, - _dpopPrivateKeyMeta, - ), + dpopPrivateKey.isAcceptableOrUnknown(data['dpop_private_key']!, _dpopPrivateKeyMeta), ); } if (data.containsKey('dpop_nonce')) { - context.handle( - _dpopNonceMeta, - dpopNonce.isAcceptableOrUnknown(data['dpop_nonce']!, _dpopNonceMeta), - ); + context.handle(_dpopNonceMeta, dpopNonce.isAcceptableOrUnknown(data['dpop_nonce']!, _dpopNonceMeta)); } if (data.containsKey('expires_at')) { - context.handle( - _expiresAtMeta, - expiresAt.isAcceptableOrUnknown(data['expires_at']!, _expiresAtMeta), - ); + context.handle(_expiresAtMeta, expiresAt.isAcceptableOrUnknown(data['expires_at']!, _expiresAtMeta)); } if (data.containsKey('created_at')) { - context.handle( - _createdAtMeta, - createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), - ); + context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); } if (data.containsKey('updated_at')) { - context.handle( - _updatedAtMeta, - updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), - ); + context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); } return context; } @@ -267,54 +199,21 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { Account map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return Account( - did: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}did'], - )!, - handle: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}handle'], - )!, - displayName: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}display_name'], - ), - service: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}service'], - ), - accessToken: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}access_token'], - )!, - refreshToken: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}refresh_token'], - ), - dpopPublicKey: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}dpop_public_key'], - ), + did: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}did'])!, + handle: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}handle'])!, + displayName: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}display_name']), + service: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}service']), + accessToken: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}access_token'])!, + refreshToken: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}refresh_token']), + dpopPublicKey: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}dpop_public_key']), dpopPrivateKey: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}dpop_private_key'], ), - dpopNonce: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}dpop_nonce'], - ), - expiresAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}expires_at'], - ), - createdAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}created_at'], - )!, - updatedAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}updated_at'], - )!, + dpopNonce: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}dpop_nonce']), + expiresAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}expires_at']), + createdAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, ); } @@ -387,37 +286,20 @@ class Account extends DataClass implements Insertable { return AccountsCompanion( did: Value(did), handle: Value(handle), - displayName: displayName == null && nullToAbsent - ? const Value.absent() - : Value(displayName), - service: service == null && nullToAbsent - ? const Value.absent() - : Value(service), + displayName: displayName == null && nullToAbsent ? const Value.absent() : Value(displayName), + service: service == null && nullToAbsent ? const Value.absent() : Value(service), accessToken: Value(accessToken), - refreshToken: refreshToken == null && nullToAbsent - ? const Value.absent() - : Value(refreshToken), - dpopPublicKey: dpopPublicKey == null && nullToAbsent - ? const Value.absent() - : Value(dpopPublicKey), - dpopPrivateKey: dpopPrivateKey == null && nullToAbsent - ? const Value.absent() - : Value(dpopPrivateKey), - dpopNonce: dpopNonce == null && nullToAbsent - ? const Value.absent() - : Value(dpopNonce), - expiresAt: expiresAt == null && nullToAbsent - ? const Value.absent() - : Value(expiresAt), + refreshToken: refreshToken == null && nullToAbsent ? const Value.absent() : Value(refreshToken), + dpopPublicKey: dpopPublicKey == null && nullToAbsent ? const Value.absent() : Value(dpopPublicKey), + dpopPrivateKey: dpopPrivateKey == null && nullToAbsent ? const Value.absent() : Value(dpopPrivateKey), + dpopNonce: dpopNonce == null && nullToAbsent ? const Value.absent() : Value(dpopNonce), + expiresAt: expiresAt == null && nullToAbsent ? const Value.absent() : Value(expiresAt), createdAt: Value(createdAt), updatedAt: Value(updatedAt), ); } - factory Account.fromJson( - Map json, { - ValueSerializer? serializer, - }) { + factory Account.fromJson(Map json, {ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return Account( did: serializer.fromJson(json['did']), @@ -473,12 +355,8 @@ class Account extends DataClass implements Insertable { service: service.present ? service.value : this.service, accessToken: accessToken ?? this.accessToken, refreshToken: refreshToken.present ? refreshToken.value : this.refreshToken, - dpopPublicKey: dpopPublicKey.present - ? dpopPublicKey.value - : this.dpopPublicKey, - dpopPrivateKey: dpopPrivateKey.present - ? dpopPrivateKey.value - : this.dpopPrivateKey, + dpopPublicKey: dpopPublicKey.present ? dpopPublicKey.value : this.dpopPublicKey, + dpopPrivateKey: dpopPrivateKey.present ? dpopPrivateKey.value : this.dpopPrivateKey, dpopNonce: dpopNonce.present ? dpopNonce.value : this.dpopNonce, expiresAt: expiresAt.present ? expiresAt.value : this.expiresAt, createdAt: createdAt ?? this.createdAt, @@ -488,22 +366,12 @@ class Account extends DataClass implements Insertable { return Account( did: data.did.present ? data.did.value : this.did, handle: data.handle.present ? data.handle.value : this.handle, - displayName: data.displayName.present - ? data.displayName.value - : this.displayName, + displayName: data.displayName.present ? data.displayName.value : this.displayName, service: data.service.present ? data.service.value : this.service, - accessToken: data.accessToken.present - ? data.accessToken.value - : this.accessToken, - refreshToken: data.refreshToken.present - ? data.refreshToken.value - : this.refreshToken, - dpopPublicKey: data.dpopPublicKey.present - ? data.dpopPublicKey.value - : this.dpopPublicKey, - dpopPrivateKey: data.dpopPrivateKey.present - ? data.dpopPrivateKey.value - : this.dpopPrivateKey, + accessToken: data.accessToken.present ? data.accessToken.value : this.accessToken, + refreshToken: data.refreshToken.present ? data.refreshToken.value : this.refreshToken, + dpopPublicKey: data.dpopPublicKey.present ? data.dpopPublicKey.value : this.dpopPublicKey, + dpopPrivateKey: data.dpopPrivateKey.present ? data.dpopPrivateKey.value : this.dpopPrivateKey, dpopNonce: data.dpopNonce.present ? data.dpopNonce.value : this.dpopNonce, expiresAt: data.expiresAt.present ? data.expiresAt.value : this.expiresAt, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, @@ -739,8 +607,7 @@ class AccountsCompanion extends UpdateCompanion { } } -class $CachedProfilesTable extends CachedProfiles - with TableInfo<$CachedProfilesTable, CachedProfile> { +class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfilesTable, CachedProfile> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -763,9 +630,7 @@ class $CachedProfilesTable extends CachedProfiles type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _payloadMeta = const VerificationMeta( - 'payload', - ); + static const VerificationMeta _payloadMeta = const VerificationMeta('payload'); @override late final GeneratedColumn payload = GeneratedColumn( 'payload', @@ -774,9 +639,7 @@ class $CachedProfilesTable extends CachedProfiles type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _fetchedAtMeta = const VerificationMeta( - 'fetchedAt', - ); + static const VerificationMeta _fetchedAtMeta = const VerificationMeta('fetchedAt'); @override late final GeneratedColumn fetchedAt = GeneratedColumn( 'fetched_at', @@ -794,41 +657,26 @@ class $CachedProfilesTable extends CachedProfiles String get actualTableName => $name; static const String $name = 'cached_profiles'; @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { + VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('did')) { - context.handle( - _didMeta, - did.isAcceptableOrUnknown(data['did']!, _didMeta), - ); + context.handle(_didMeta, did.isAcceptableOrUnknown(data['did']!, _didMeta)); } else if (isInserting) { context.missing(_didMeta); } if (data.containsKey('handle')) { - context.handle( - _handleMeta, - handle.isAcceptableOrUnknown(data['handle']!, _handleMeta), - ); + context.handle(_handleMeta, handle.isAcceptableOrUnknown(data['handle']!, _handleMeta)); } else if (isInserting) { context.missing(_handleMeta); } if (data.containsKey('payload')) { - context.handle( - _payloadMeta, - payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta), - ); + context.handle(_payloadMeta, payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta)); } else if (isInserting) { context.missing(_payloadMeta); } if (data.containsKey('fetched_at')) { - context.handle( - _fetchedAtMeta, - fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta), - ); + context.handle(_fetchedAtMeta, fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta)); } return context; } @@ -839,22 +687,10 @@ class $CachedProfilesTable extends CachedProfiles CachedProfile map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return CachedProfile( - did: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}did'], - )!, - handle: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}handle'], - )!, - payload: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}payload'], - )!, - fetchedAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}fetched_at'], - )!, + did: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}did'])!, + handle: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}handle'])!, + payload: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}payload'])!, + fetchedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}fetched_at'])!, ); } @@ -869,12 +705,7 @@ class CachedProfile extends DataClass implements Insertable { final String handle; final String payload; final DateTime fetchedAt; - const CachedProfile({ - required this.did, - required this.handle, - required this.payload, - required this.fetchedAt, - }); + const CachedProfile({required this.did, required this.handle, required this.payload, required this.fetchedAt}); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -894,10 +725,7 @@ class CachedProfile extends DataClass implements Insertable { ); } - factory CachedProfile.fromJson( - Map json, { - ValueSerializer? serializer, - }) { + factory CachedProfile.fromJson(Map json, {ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return CachedProfile( did: serializer.fromJson(json['did']), @@ -917,12 +745,7 @@ class CachedProfile extends DataClass implements Insertable { }; } - CachedProfile copyWith({ - String? did, - String? handle, - String? payload, - DateTime? fetchedAt, - }) => CachedProfile( + CachedProfile copyWith({String? did, String? handle, String? payload, DateTime? fetchedAt}) => CachedProfile( did: did ?? this.did, handle: handle ?? this.handle, payload: payload ?? this.payload, @@ -1048,8 +871,7 @@ class CachedProfilesCompanion extends UpdateCompanion { } } -class $CachedPostsTable extends CachedPosts - with TableInfo<$CachedPostsTable, CachedPost> { +class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, CachedPost> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1063,9 +885,7 @@ class $CachedPostsTable extends CachedPosts type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _authorDidMeta = const VerificationMeta( - 'authorDid', - ); + static const VerificationMeta _authorDidMeta = const VerificationMeta('authorDid'); @override late final GeneratedColumn authorDid = GeneratedColumn( 'author_did', @@ -1074,9 +894,7 @@ class $CachedPostsTable extends CachedPosts type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _payloadMeta = const VerificationMeta( - 'payload', - ); + static const VerificationMeta _payloadMeta = const VerificationMeta('payload'); @override late final GeneratedColumn payload = GeneratedColumn( 'payload', @@ -1085,9 +903,7 @@ class $CachedPostsTable extends CachedPosts type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _createdAtMeta = const VerificationMeta( - 'createdAt', - ); + static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); @override late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', @@ -1096,9 +912,7 @@ class $CachedPostsTable extends CachedPosts type: DriftSqlType.dateTime, requiredDuringInsert: false, ); - static const VerificationMeta _fetchedAtMeta = const VerificationMeta( - 'fetchedAt', - ); + static const VerificationMeta _fetchedAtMeta = const VerificationMeta('fetchedAt'); @override late final GeneratedColumn fetchedAt = GeneratedColumn( 'fetched_at', @@ -1109,60 +923,36 @@ class $CachedPostsTable extends CachedPosts defaultValue: currentDateAndTime, ); @override - List get $columns => [ - uri, - authorDid, - payload, - createdAt, - fetchedAt, - ]; + List get $columns => [uri, authorDid, payload, createdAt, fetchedAt]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'cached_posts'; @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { + VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('uri')) { - context.handle( - _uriMeta, - uri.isAcceptableOrUnknown(data['uri']!, _uriMeta), - ); + context.handle(_uriMeta, uri.isAcceptableOrUnknown(data['uri']!, _uriMeta)); } else if (isInserting) { context.missing(_uriMeta); } if (data.containsKey('author_did')) { - context.handle( - _authorDidMeta, - authorDid.isAcceptableOrUnknown(data['author_did']!, _authorDidMeta), - ); + context.handle(_authorDidMeta, authorDid.isAcceptableOrUnknown(data['author_did']!, _authorDidMeta)); } else if (isInserting) { context.missing(_authorDidMeta); } if (data.containsKey('payload')) { - context.handle( - _payloadMeta, - payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta), - ); + context.handle(_payloadMeta, payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta)); } else if (isInserting) { context.missing(_payloadMeta); } if (data.containsKey('created_at')) { - context.handle( - _createdAtMeta, - createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), - ); + context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); } if (data.containsKey('fetched_at')) { - context.handle( - _fetchedAtMeta, - fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta), - ); + context.handle(_fetchedAtMeta, fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta)); } return context; } @@ -1173,26 +963,11 @@ class $CachedPostsTable extends CachedPosts CachedPost map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return CachedPost( - uri: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}uri'], - )!, - authorDid: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}author_did'], - )!, - payload: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}payload'], - )!, - createdAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}created_at'], - ), - fetchedAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}fetched_at'], - )!, + uri: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}uri'])!, + authorDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}author_did'])!, + payload: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}payload'])!, + createdAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at']), + fetchedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}fetched_at'])!, ); } @@ -1233,17 +1008,12 @@ class CachedPost extends DataClass implements Insertable { uri: Value(uri), authorDid: Value(authorDid), payload: Value(payload), - createdAt: createdAt == null && nullToAbsent - ? const Value.absent() - : Value(createdAt), + createdAt: createdAt == null && nullToAbsent ? const Value.absent() : Value(createdAt), fetchedAt: Value(fetchedAt), ); } - factory CachedPost.fromJson( - Map json, { - ValueSerializer? serializer, - }) { + factory CachedPost.fromJson(Map json, {ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return CachedPost( uri: serializer.fromJson(json['uri']), @@ -1301,8 +1071,7 @@ class CachedPost extends DataClass implements Insertable { } @override - int get hashCode => - Object.hash(uri, authorDid, payload, createdAt, fetchedAt); + int get hashCode => Object.hash(uri, authorDid, payload, createdAt, fetchedAt); @override bool operator ==(Object other) => identical(this, other) || @@ -1413,8 +1182,7 @@ class CachedPostsCompanion extends UpdateCompanion { } } -class $SettingsTable extends Settings - with TableInfo<$SettingsTable, SettingsEntry> { +class $SettingsTable extends Settings with TableInfo<$SettingsTable, SettingsEntry> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1437,9 +1205,7 @@ class $SettingsTable extends Settings type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta( - 'updatedAt', - ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -1457,33 +1223,21 @@ class $SettingsTable extends Settings String get actualTableName => $name; static const String $name = 'settings'; @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { + VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('key')) { - context.handle( - _keyMeta, - key.isAcceptableOrUnknown(data['key']!, _keyMeta), - ); + context.handle(_keyMeta, key.isAcceptableOrUnknown(data['key']!, _keyMeta)); } else if (isInserting) { context.missing(_keyMeta); } if (data.containsKey('value')) { - context.handle( - _valueMeta, - value.isAcceptableOrUnknown(data['value']!, _valueMeta), - ); + context.handle(_valueMeta, value.isAcceptableOrUnknown(data['value']!, _valueMeta)); } else if (isInserting) { context.missing(_valueMeta); } if (data.containsKey('updated_at')) { - context.handle( - _updatedAtMeta, - updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), - ); + context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); } return context; } @@ -1494,18 +1248,9 @@ class $SettingsTable extends Settings SettingsEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return SettingsEntry( - key: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}key'], - )!, - value: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}value'], - )!, - updatedAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}updated_at'], - )!, + key: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}key'])!, + value: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}value'])!, + updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, ); } @@ -1519,11 +1264,7 @@ class SettingsEntry extends DataClass implements Insertable { final String key; final String value; final DateTime updatedAt; - const SettingsEntry({ - required this.key, - required this.value, - required this.updatedAt, - }); + const SettingsEntry({required this.key, required this.value, required this.updatedAt}); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -1534,17 +1275,10 @@ class SettingsEntry extends DataClass implements Insertable { } SettingsCompanion toCompanion(bool nullToAbsent) { - return SettingsCompanion( - key: Value(key), - value: Value(value), - updatedAt: Value(updatedAt), - ); + return SettingsCompanion(key: Value(key), value: Value(value), updatedAt: Value(updatedAt)); } - factory SettingsEntry.fromJson( - Map json, { - ValueSerializer? serializer, - }) { + factory SettingsEntry.fromJson(Map json, {ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return SettingsEntry( key: serializer.fromJson(json['key']), @@ -1563,11 +1297,7 @@ class SettingsEntry extends DataClass implements Insertable { } SettingsEntry copyWith({String? key, String? value, DateTime? updatedAt}) => - SettingsEntry( - key: key ?? this.key, - value: value ?? this.value, - updatedAt: updatedAt ?? this.updatedAt, - ); + SettingsEntry(key: key ?? this.key, value: value ?? this.value, updatedAt: updatedAt ?? this.updatedAt); SettingsEntry copyWithCompanion(SettingsCompanion data) { return SettingsEntry( key: data.key.present ? data.key.value : this.key, @@ -1673,8 +1403,7 @@ class SettingsCompanion extends UpdateCompanion { } } -class $SavedFeedsTable extends SavedFeeds - with TableInfo<$SavedFeedsTable, SavedFeedEntry> { +class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, SavedFeedEntry> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1688,9 +1417,7 @@ class $SavedFeedsTable extends SavedFeeds type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _accountDidMeta = const VerificationMeta( - 'accountDid', - ); + static const VerificationMeta _accountDidMeta = const VerificationMeta('accountDid'); @override late final GeneratedColumn accountDid = GeneratedColumn( 'account_did', @@ -1725,14 +1452,10 @@ class $SavedFeedsTable extends SavedFeeds false, type: DriftSqlType.bool, requiredDuringInsert: false, - defaultConstraints: GeneratedColumn.constraintIsAlways( - 'CHECK ("pinned" IN (0, 1))', - ), + defaultConstraints: GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'), defaultValue: const Constant(false), ); - static const VerificationMeta _sortOrderMeta = const VerificationMeta( - 'sortOrder', - ); + static const VerificationMeta _sortOrderMeta = const VerificationMeta('sortOrder'); @override late final GeneratedColumn sortOrder = GeneratedColumn( 'sort_order', @@ -1742,9 +1465,7 @@ class $SavedFeedsTable extends SavedFeeds requiredDuringInsert: false, defaultValue: const Constant(0), ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta( - 'updatedAt', - ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -1755,25 +1476,14 @@ class $SavedFeedsTable extends SavedFeeds defaultValue: currentDateAndTime, ); @override - List get $columns => [ - id, - accountDid, - type, - value, - pinned, - sortOrder, - updatedAt, - ]; + List get $columns => [id, accountDid, type, value, pinned, sortOrder, updatedAt]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'saved_feeds'; @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { + VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) { @@ -1782,46 +1492,28 @@ class $SavedFeedsTable extends SavedFeeds context.missing(_idMeta); } if (data.containsKey('account_did')) { - context.handle( - _accountDidMeta, - accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta), - ); + context.handle(_accountDidMeta, accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta)); } else if (isInserting) { context.missing(_accountDidMeta); } if (data.containsKey('type')) { - context.handle( - _typeMeta, - type.isAcceptableOrUnknown(data['type']!, _typeMeta), - ); + context.handle(_typeMeta, type.isAcceptableOrUnknown(data['type']!, _typeMeta)); } else if (isInserting) { context.missing(_typeMeta); } if (data.containsKey('value')) { - context.handle( - _valueMeta, - value.isAcceptableOrUnknown(data['value']!, _valueMeta), - ); + context.handle(_valueMeta, value.isAcceptableOrUnknown(data['value']!, _valueMeta)); } else if (isInserting) { context.missing(_valueMeta); } if (data.containsKey('pinned')) { - context.handle( - _pinnedMeta, - pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta), - ); + context.handle(_pinnedMeta, pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta)); } if (data.containsKey('sort_order')) { - context.handle( - _sortOrderMeta, - sortOrder.isAcceptableOrUnknown(data['sort_order']!, _sortOrderMeta), - ); + context.handle(_sortOrderMeta, sortOrder.isAcceptableOrUnknown(data['sort_order']!, _sortOrderMeta)); } if (data.containsKey('updated_at')) { - context.handle( - _updatedAtMeta, - updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), - ); + context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); } return context; } @@ -1832,34 +1524,13 @@ class $SavedFeedsTable extends SavedFeeds SavedFeedEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return SavedFeedEntry( - id: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}id'], - )!, - accountDid: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}account_did'], - )!, - type: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}type'], - )!, - value: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}value'], - )!, - pinned: attachedDatabase.typeMapping.read( - DriftSqlType.bool, - data['${effectivePrefix}pinned'], - )!, - sortOrder: attachedDatabase.typeMapping.read( - DriftSqlType.int, - data['${effectivePrefix}sort_order'], - )!, - updatedAt: attachedDatabase.typeMapping.read( - DriftSqlType.dateTime, - data['${effectivePrefix}updated_at'], - )!, + id: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}id'])!, + accountDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}account_did'])!, + type: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}type'])!, + value: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}value'])!, + pinned: attachedDatabase.typeMapping.read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!, + sortOrder: attachedDatabase.typeMapping.read(DriftSqlType.int, data['${effectivePrefix}sort_order'])!, + updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, ); } @@ -1911,10 +1582,7 @@ class SavedFeedEntry extends DataClass implements Insertable { ); } - factory SavedFeedEntry.fromJson( - Map json, { - ValueSerializer? serializer, - }) { + factory SavedFeedEntry.fromJson(Map json, {ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return SavedFeedEntry( id: serializer.fromJson(json['id']), @@ -1960,9 +1628,7 @@ class SavedFeedEntry extends DataClass implements Insertable { SavedFeedEntry copyWithCompanion(SavedFeedsCompanion data) { return SavedFeedEntry( id: data.id.present ? data.id.value : this.id, - accountDid: data.accountDid.present - ? data.accountDid.value - : this.accountDid, + accountDid: data.accountDid.present ? data.accountDid.value : this.accountDid, type: data.type.present ? data.type.value : this.type, value: data.value.present ? data.value.value : this.value, pinned: data.pinned.present ? data.pinned.value : this.pinned, @@ -1986,8 +1652,7 @@ class SavedFeedEntry extends DataClass implements Insertable { } @override - int get hashCode => - Object.hash(id, accountDid, type, value, pinned, sortOrder, updatedAt); + int get hashCode => Object.hash(id, accountDid, type, value, pinned, sortOrder, updatedAt); @override bool operator ==(Object other) => identical(this, other) || @@ -2132,16 +1797,9 @@ abstract class _$AppDatabase extends GeneratedDatabase { late final $SettingsTable settings = $SettingsTable(this); late final $SavedFeedsTable savedFeeds = $SavedFeedsTable(this); @override - Iterable> get allTables => - allSchemaEntities.whereType>(); + Iterable> get allTables => allSchemaEntities.whereType>(); @override - List get allSchemaEntities => [ - accounts, - cachedProfiles, - cachedPosts, - settings, - savedFeeds, - ]; + List get allSchemaEntities => [accounts, cachedProfiles, cachedPosts, settings, savedFeeds]; } typedef $$AccountsTableCreateCompanionBuilder = @@ -2177,8 +1835,7 @@ typedef $$AccountsTableUpdateCompanionBuilder = Value rowid, }); -class $$AccountsTableFilterComposer - extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableFilterComposer extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableFilterComposer({ required super.$db, required super.$table, @@ -2186,69 +1843,43 @@ class $$AccountsTableFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get did => $composableBuilder( - column: $table.did, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get did => $composableBuilder(column: $table.did, builder: (column) => ColumnFilters(column)); - ColumnFilters get handle => $composableBuilder( - column: $table.handle, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get handle => + $composableBuilder(column: $table.handle, builder: (column) => ColumnFilters(column)); - ColumnFilters get displayName => $composableBuilder( - column: $table.displayName, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get displayName => + $composableBuilder(column: $table.displayName, builder: (column) => ColumnFilters(column)); - ColumnFilters get service => $composableBuilder( - column: $table.service, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get service => + $composableBuilder(column: $table.service, builder: (column) => ColumnFilters(column)); - ColumnFilters get accessToken => $composableBuilder( - column: $table.accessToken, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get accessToken => + $composableBuilder(column: $table.accessToken, builder: (column) => ColumnFilters(column)); - ColumnFilters get refreshToken => $composableBuilder( - column: $table.refreshToken, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get refreshToken => + $composableBuilder(column: $table.refreshToken, builder: (column) => ColumnFilters(column)); - ColumnFilters get dpopPublicKey => $composableBuilder( - column: $table.dpopPublicKey, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get dpopPublicKey => + $composableBuilder(column: $table.dpopPublicKey, builder: (column) => ColumnFilters(column)); - ColumnFilters get dpopPrivateKey => $composableBuilder( - column: $table.dpopPrivateKey, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get dpopPrivateKey => + $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => ColumnFilters(column)); - ColumnFilters get dpopNonce => $composableBuilder( - column: $table.dpopNonce, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get dpopNonce => + $composableBuilder(column: $table.dpopNonce, builder: (column) => ColumnFilters(column)); - ColumnFilters get expiresAt => $composableBuilder( - column: $table.expiresAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get expiresAt => + $composableBuilder(column: $table.expiresAt, builder: (column) => ColumnFilters(column)); - ColumnFilters get createdAt => $composableBuilder( - column: $table.createdAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => ColumnFilters(column)); - ColumnFilters get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); } -class $$AccountsTableOrderingComposer - extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableOrderingComposer extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableOrderingComposer({ required super.$db, required super.$table, @@ -2256,69 +1887,44 @@ class $$AccountsTableOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get did => $composableBuilder( - column: $table.did, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get did => + $composableBuilder(column: $table.did, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get handle => $composableBuilder( - column: $table.handle, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get handle => + $composableBuilder(column: $table.handle, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get displayName => $composableBuilder( - column: $table.displayName, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get displayName => + $composableBuilder(column: $table.displayName, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get service => $composableBuilder( - column: $table.service, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get service => + $composableBuilder(column: $table.service, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get accessToken => $composableBuilder( - column: $table.accessToken, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get accessToken => + $composableBuilder(column: $table.accessToken, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get refreshToken => $composableBuilder( - column: $table.refreshToken, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get refreshToken => + $composableBuilder(column: $table.refreshToken, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get dpopPublicKey => $composableBuilder( - column: $table.dpopPublicKey, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get dpopPublicKey => + $composableBuilder(column: $table.dpopPublicKey, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get dpopPrivateKey => $composableBuilder( - column: $table.dpopPrivateKey, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get dpopPrivateKey => + $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get dpopNonce => $composableBuilder( - column: $table.dpopNonce, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get dpopNonce => + $composableBuilder(column: $table.dpopNonce, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get expiresAt => $composableBuilder( - column: $table.expiresAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get expiresAt => + $composableBuilder(column: $table.expiresAt, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get createdAt => $composableBuilder( - column: $table.createdAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); } -class $$AccountsTableAnnotationComposer - extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableAnnotationComposer extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableAnnotationComposer({ required super.$db, required super.$table, @@ -2326,51 +1932,34 @@ class $$AccountsTableAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get did => - $composableBuilder(column: $table.did, builder: (column) => column); + GeneratedColumn get did => $composableBuilder(column: $table.did, builder: (column) => column); - GeneratedColumn get handle => - $composableBuilder(column: $table.handle, builder: (column) => column); + GeneratedColumn get handle => $composableBuilder(column: $table.handle, builder: (column) => column); - GeneratedColumn get displayName => $composableBuilder( - column: $table.displayName, - builder: (column) => column, - ); + GeneratedColumn get displayName => + $composableBuilder(column: $table.displayName, builder: (column) => column); - GeneratedColumn get service => - $composableBuilder(column: $table.service, builder: (column) => column); + GeneratedColumn get service => $composableBuilder(column: $table.service, builder: (column) => column); - GeneratedColumn get accessToken => $composableBuilder( - column: $table.accessToken, - builder: (column) => column, - ); + GeneratedColumn get accessToken => + $composableBuilder(column: $table.accessToken, builder: (column) => column); - GeneratedColumn get refreshToken => $composableBuilder( - column: $table.refreshToken, - builder: (column) => column, - ); + GeneratedColumn get refreshToken => + $composableBuilder(column: $table.refreshToken, builder: (column) => column); - GeneratedColumn get dpopPublicKey => $composableBuilder( - column: $table.dpopPublicKey, - builder: (column) => column, - ); + GeneratedColumn get dpopPublicKey => + $composableBuilder(column: $table.dpopPublicKey, builder: (column) => column); - GeneratedColumn get dpopPrivateKey => $composableBuilder( - column: $table.dpopPrivateKey, - builder: (column) => column, - ); + GeneratedColumn get dpopPrivateKey => + $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => column); - GeneratedColumn get dpopNonce => - $composableBuilder(column: $table.dpopNonce, builder: (column) => column); + GeneratedColumn get dpopNonce => $composableBuilder(column: $table.dpopNonce, builder: (column) => column); - GeneratedColumn get expiresAt => - $composableBuilder(column: $table.expiresAt, builder: (column) => column); + GeneratedColumn get expiresAt => $composableBuilder(column: $table.expiresAt, builder: (column) => column); - GeneratedColumn get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => column); + GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); - GeneratedColumn get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$AccountsTableTableManager @@ -2393,12 +1982,9 @@ class $$AccountsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => - $$AccountsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$AccountsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$AccountsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => $$AccountsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => $$AccountsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => $$AccountsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value did = const Value.absent(), @@ -2459,9 +2045,7 @@ class $$AccountsTableTableManager updatedAt: updatedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), + withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), prefetchHooksCallback: null, ), ); @@ -2498,8 +2082,7 @@ typedef $$CachedProfilesTableUpdateCompanionBuilder = Value rowid, }); -class $$CachedProfilesTableFilterComposer - extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableFilterComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableFilterComposer({ required super.$db, required super.$table, @@ -2507,29 +2090,19 @@ class $$CachedProfilesTableFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get did => $composableBuilder( - column: $table.did, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get did => $composableBuilder(column: $table.did, builder: (column) => ColumnFilters(column)); - ColumnFilters get handle => $composableBuilder( - column: $table.handle, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get handle => + $composableBuilder(column: $table.handle, builder: (column) => ColumnFilters(column)); - ColumnFilters get payload => $composableBuilder( - column: $table.payload, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get payload => + $composableBuilder(column: $table.payload, builder: (column) => ColumnFilters(column)); - ColumnFilters get fetchedAt => $composableBuilder( - column: $table.fetchedAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnFilters(column)); } -class $$CachedProfilesTableOrderingComposer - extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableOrderingComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableOrderingComposer({ required super.$db, required super.$table, @@ -2537,29 +2110,20 @@ class $$CachedProfilesTableOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get did => $composableBuilder( - column: $table.did, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get did => + $composableBuilder(column: $table.did, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get handle => $composableBuilder( - column: $table.handle, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get handle => + $composableBuilder(column: $table.handle, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get payload => $composableBuilder( - column: $table.payload, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get payload => + $composableBuilder(column: $table.payload, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get fetchedAt => $composableBuilder( - column: $table.fetchedAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnOrderings(column)); } -class $$CachedProfilesTableAnnotationComposer - extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableAnnotationComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableAnnotationComposer({ required super.$db, required super.$table, @@ -2567,17 +2131,13 @@ class $$CachedProfilesTableAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get did => - $composableBuilder(column: $table.did, builder: (column) => column); + GeneratedColumn get did => $composableBuilder(column: $table.did, builder: (column) => column); - GeneratedColumn get handle => - $composableBuilder(column: $table.handle, builder: (column) => column); + GeneratedColumn get handle => $composableBuilder(column: $table.handle, builder: (column) => column); - GeneratedColumn get payload => - $composableBuilder(column: $table.payload, builder: (column) => column); + GeneratedColumn get payload => $composableBuilder(column: $table.payload, builder: (column) => column); - GeneratedColumn get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => column); + GeneratedColumn get fetchedAt => $composableBuilder(column: $table.fetchedAt, builder: (column) => column); } class $$CachedProfilesTableTableManager @@ -2591,26 +2151,18 @@ class $$CachedProfilesTableTableManager $$CachedProfilesTableAnnotationComposer, $$CachedProfilesTableCreateCompanionBuilder, $$CachedProfilesTableUpdateCompanionBuilder, - ( - CachedProfile, - BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>, - ), + (CachedProfile, BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>), CachedProfile, PrefetchHooks Function() > { - $$CachedProfilesTableTableManager( - _$AppDatabase db, - $CachedProfilesTable table, - ) : super( + $$CachedProfilesTableTableManager(_$AppDatabase db, $CachedProfilesTable table) + : super( TableManagerState( db: db, table: table, - createFilteringComposer: () => - $$CachedProfilesTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$CachedProfilesTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$CachedProfilesTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => $$CachedProfilesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => $$CachedProfilesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => $$CachedProfilesTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value did = const Value.absent(), @@ -2639,9 +2191,7 @@ class $$CachedProfilesTableTableManager fetchedAt: fetchedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), + withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), prefetchHooksCallback: null, ), ); @@ -2657,10 +2207,7 @@ typedef $$CachedProfilesTableProcessedTableManager = $$CachedProfilesTableAnnotationComposer, $$CachedProfilesTableCreateCompanionBuilder, $$CachedProfilesTableUpdateCompanionBuilder, - ( - CachedProfile, - BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>, - ), + (CachedProfile, BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>), CachedProfile, PrefetchHooks Function() >; @@ -2683,8 +2230,7 @@ typedef $$CachedPostsTableUpdateCompanionBuilder = Value rowid, }); -class $$CachedPostsTableFilterComposer - extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableFilterComposer extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableFilterComposer({ required super.$db, required super.$table, @@ -2692,34 +2238,22 @@ class $$CachedPostsTableFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get uri => $composableBuilder( - column: $table.uri, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get uri => $composableBuilder(column: $table.uri, builder: (column) => ColumnFilters(column)); - ColumnFilters get authorDid => $composableBuilder( - column: $table.authorDid, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get authorDid => + $composableBuilder(column: $table.authorDid, builder: (column) => ColumnFilters(column)); - ColumnFilters get payload => $composableBuilder( - column: $table.payload, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get payload => + $composableBuilder(column: $table.payload, builder: (column) => ColumnFilters(column)); - ColumnFilters get createdAt => $composableBuilder( - column: $table.createdAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => ColumnFilters(column)); - ColumnFilters get fetchedAt => $composableBuilder( - column: $table.fetchedAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnFilters(column)); } -class $$CachedPostsTableOrderingComposer - extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableOrderingComposer extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableOrderingComposer({ required super.$db, required super.$table, @@ -2727,34 +2261,23 @@ class $$CachedPostsTableOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get uri => $composableBuilder( - column: $table.uri, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get uri => + $composableBuilder(column: $table.uri, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get authorDid => $composableBuilder( - column: $table.authorDid, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get authorDid => + $composableBuilder(column: $table.authorDid, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get payload => $composableBuilder( - column: $table.payload, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get payload => + $composableBuilder(column: $table.payload, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get createdAt => $composableBuilder( - column: $table.createdAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get fetchedAt => $composableBuilder( - column: $table.fetchedAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnOrderings(column)); } -class $$CachedPostsTableAnnotationComposer - extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableAnnotationComposer extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableAnnotationComposer({ required super.$db, required super.$table, @@ -2762,20 +2285,15 @@ class $$CachedPostsTableAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get uri => - $composableBuilder(column: $table.uri, builder: (column) => column); + GeneratedColumn get uri => $composableBuilder(column: $table.uri, builder: (column) => column); - GeneratedColumn get authorDid => - $composableBuilder(column: $table.authorDid, builder: (column) => column); + GeneratedColumn get authorDid => $composableBuilder(column: $table.authorDid, builder: (column) => column); - GeneratedColumn get payload => - $composableBuilder(column: $table.payload, builder: (column) => column); + GeneratedColumn get payload => $composableBuilder(column: $table.payload, builder: (column) => column); - GeneratedColumn get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => column); + GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); - GeneratedColumn get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => column); + GeneratedColumn get fetchedAt => $composableBuilder(column: $table.fetchedAt, builder: (column) => column); } class $$CachedPostsTableTableManager @@ -2789,10 +2307,7 @@ class $$CachedPostsTableTableManager $$CachedPostsTableAnnotationComposer, $$CachedPostsTableCreateCompanionBuilder, $$CachedPostsTableUpdateCompanionBuilder, - ( - CachedPost, - BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>, - ), + (CachedPost, BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>), CachedPost, PrefetchHooks Function() > { @@ -2801,12 +2316,9 @@ class $$CachedPostsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => - $$CachedPostsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$CachedPostsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$CachedPostsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => $$CachedPostsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => $$CachedPostsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => $$CachedPostsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value uri = const Value.absent(), @@ -2839,9 +2351,7 @@ class $$CachedPostsTableTableManager fetchedAt: fetchedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), + withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), prefetchHooksCallback: null, ), ); @@ -2857,10 +2367,7 @@ typedef $$CachedPostsTableProcessedTableManager = $$CachedPostsTableAnnotationComposer, $$CachedPostsTableCreateCompanionBuilder, $$CachedPostsTableUpdateCompanionBuilder, - ( - CachedPost, - BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>, - ), + (CachedPost, BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>), CachedPost, PrefetchHooks Function() >; @@ -2872,15 +2379,9 @@ typedef $$SettingsTableCreateCompanionBuilder = Value rowid, }); typedef $$SettingsTableUpdateCompanionBuilder = - SettingsCompanion Function({ - Value key, - Value value, - Value updatedAt, - Value rowid, - }); + SettingsCompanion Function({Value key, Value value, Value updatedAt, Value rowid}); -class $$SettingsTableFilterComposer - extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableFilterComposer extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableFilterComposer({ required super.$db, required super.$table, @@ -2888,24 +2389,16 @@ class $$SettingsTableFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get key => $composableBuilder( - column: $table.key, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get key => $composableBuilder(column: $table.key, builder: (column) => ColumnFilters(column)); - ColumnFilters get value => $composableBuilder( - column: $table.value, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get value => + $composableBuilder(column: $table.value, builder: (column) => ColumnFilters(column)); - ColumnFilters get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); } -class $$SettingsTableOrderingComposer - extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableOrderingComposer extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableOrderingComposer({ required super.$db, required super.$table, @@ -2913,24 +2406,17 @@ class $$SettingsTableOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get key => $composableBuilder( - column: $table.key, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get key => + $composableBuilder(column: $table.key, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get value => $composableBuilder( - column: $table.value, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get value => + $composableBuilder(column: $table.value, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); } -class $$SettingsTableAnnotationComposer - extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableAnnotationComposer extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableAnnotationComposer({ required super.$db, required super.$table, @@ -2938,14 +2424,11 @@ class $$SettingsTableAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get key => - $composableBuilder(column: $table.key, builder: (column) => column); + GeneratedColumn get key => $composableBuilder(column: $table.key, builder: (column) => column); - GeneratedColumn get value => - $composableBuilder(column: $table.value, builder: (column) => column); + GeneratedColumn get value => $composableBuilder(column: $table.value, builder: (column) => column); - GeneratedColumn get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$SettingsTableTableManager @@ -2959,10 +2442,7 @@ class $$SettingsTableTableManager $$SettingsTableAnnotationComposer, $$SettingsTableCreateCompanionBuilder, $$SettingsTableUpdateCompanionBuilder, - ( - SettingsEntry, - BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>, - ), + (SettingsEntry, BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>), SettingsEntry, PrefetchHooks Function() > { @@ -2971,39 +2451,24 @@ class $$SettingsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => - $$SettingsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$SettingsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$SettingsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => $$SettingsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => $$SettingsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => $$SettingsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value key = const Value.absent(), Value value = const Value.absent(), Value updatedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => SettingsCompanion( - key: key, - value: value, - updatedAt: updatedAt, - rowid: rowid, - ), + }) => SettingsCompanion(key: key, value: value, updatedAt: updatedAt, rowid: rowid), createCompanionCallback: ({ required String key, required String value, Value updatedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => SettingsCompanion.insert( - key: key, - value: value, - updatedAt: updatedAt, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), + }) => SettingsCompanion.insert(key: key, value: value, updatedAt: updatedAt, rowid: rowid), + withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), prefetchHooksCallback: null, ), ); @@ -3019,10 +2484,7 @@ typedef $$SettingsTableProcessedTableManager = $$SettingsTableAnnotationComposer, $$SettingsTableCreateCompanionBuilder, $$SettingsTableUpdateCompanionBuilder, - ( - SettingsEntry, - BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>, - ), + (SettingsEntry, BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>), SettingsEntry, PrefetchHooks Function() >; @@ -3049,8 +2511,7 @@ typedef $$SavedFeedsTableUpdateCompanionBuilder = Value rowid, }); -class $$SavedFeedsTableFilterComposer - extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableFilterComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableFilterComposer({ required super.$db, required super.$table, @@ -3058,44 +2519,27 @@ class $$SavedFeedsTableFilterComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get id => $composableBuilder(column: $table.id, builder: (column) => ColumnFilters(column)); - ColumnFilters get accountDid => $composableBuilder( - column: $table.accountDid, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get accountDid => + $composableBuilder(column: $table.accountDid, builder: (column) => ColumnFilters(column)); - ColumnFilters get type => $composableBuilder( - column: $table.type, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get type => $composableBuilder(column: $table.type, builder: (column) => ColumnFilters(column)); - ColumnFilters get value => $composableBuilder( - column: $table.value, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get value => + $composableBuilder(column: $table.value, builder: (column) => ColumnFilters(column)); - ColumnFilters get pinned => $composableBuilder( - column: $table.pinned, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get pinned => + $composableBuilder(column: $table.pinned, builder: (column) => ColumnFilters(column)); - ColumnFilters get sortOrder => $composableBuilder( - column: $table.sortOrder, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get sortOrder => + $composableBuilder(column: $table.sortOrder, builder: (column) => ColumnFilters(column)); - ColumnFilters get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnFilters(column), - ); + ColumnFilters get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); } -class $$SavedFeedsTableOrderingComposer - extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableOrderingComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableOrderingComposer({ required super.$db, required super.$table, @@ -3103,44 +2547,28 @@ class $$SavedFeedsTableOrderingComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get id => $composableBuilder(column: $table.id, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get accountDid => $composableBuilder( - column: $table.accountDid, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get accountDid => + $composableBuilder(column: $table.accountDid, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get type => $composableBuilder( - column: $table.type, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get type => + $composableBuilder(column: $table.type, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get value => $composableBuilder( - column: $table.value, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get value => + $composableBuilder(column: $table.value, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get pinned => $composableBuilder( - column: $table.pinned, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get pinned => + $composableBuilder(column: $table.pinned, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get sortOrder => $composableBuilder( - column: $table.sortOrder, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get sortOrder => + $composableBuilder(column: $table.sortOrder, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnOrderings(column), - ); + ColumnOrderings get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); } -class $$SavedFeedsTableAnnotationComposer - extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableAnnotationComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableAnnotationComposer({ required super.$db, required super.$table, @@ -3148,28 +2576,19 @@ class $$SavedFeedsTableAnnotationComposer super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get accountDid => $composableBuilder( - column: $table.accountDid, - builder: (column) => column, - ); + GeneratedColumn get accountDid => $composableBuilder(column: $table.accountDid, builder: (column) => column); - GeneratedColumn get type => - $composableBuilder(column: $table.type, builder: (column) => column); + GeneratedColumn get type => $composableBuilder(column: $table.type, builder: (column) => column); - GeneratedColumn get value => - $composableBuilder(column: $table.value, builder: (column) => column); + GeneratedColumn get value => $composableBuilder(column: $table.value, builder: (column) => column); - GeneratedColumn get pinned => - $composableBuilder(column: $table.pinned, builder: (column) => column); + GeneratedColumn get pinned => $composableBuilder(column: $table.pinned, builder: (column) => column); - GeneratedColumn get sortOrder => - $composableBuilder(column: $table.sortOrder, builder: (column) => column); + GeneratedColumn get sortOrder => $composableBuilder(column: $table.sortOrder, builder: (column) => column); - GeneratedColumn get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$SavedFeedsTableTableManager @@ -3183,10 +2602,7 @@ class $$SavedFeedsTableTableManager $$SavedFeedsTableAnnotationComposer, $$SavedFeedsTableCreateCompanionBuilder, $$SavedFeedsTableUpdateCompanionBuilder, - ( - SavedFeedEntry, - BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>, - ), + (SavedFeedEntry, BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>), SavedFeedEntry, PrefetchHooks Function() > { @@ -3195,12 +2611,9 @@ class $$SavedFeedsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => - $$SavedFeedsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$SavedFeedsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$SavedFeedsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => $$SavedFeedsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => $$SavedFeedsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => $$SavedFeedsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), @@ -3241,9 +2654,7 @@ class $$SavedFeedsTableTableManager updatedAt: updatedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), + withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), prefetchHooksCallback: null, ), ); @@ -3259,10 +2670,7 @@ typedef $$SavedFeedsTableProcessedTableManager = $$SavedFeedsTableAnnotationComposer, $$SavedFeedsTableCreateCompanionBuilder, $$SavedFeedsTableUpdateCompanionBuilder, - ( - SavedFeedEntry, - BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>, - ), + (SavedFeedEntry, BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>), SavedFeedEntry, PrefetchHooks Function() >; @@ -3270,14 +2678,9 @@ typedef $$SavedFeedsTableProcessedTableManager = class $AppDatabaseManager { final _$AppDatabase _db; $AppDatabaseManager(this._db); - $$AccountsTableTableManager get accounts => - $$AccountsTableTableManager(_db, _db.accounts); - $$CachedProfilesTableTableManager get cachedProfiles => - $$CachedProfilesTableTableManager(_db, _db.cachedProfiles); - $$CachedPostsTableTableManager get cachedPosts => - $$CachedPostsTableTableManager(_db, _db.cachedPosts); - $$SettingsTableTableManager get settings => - $$SettingsTableTableManager(_db, _db.settings); - $$SavedFeedsTableTableManager get savedFeeds => - $$SavedFeedsTableTableManager(_db, _db.savedFeeds); + $$AccountsTableTableManager get accounts => $$AccountsTableTableManager(_db, _db.accounts); + $$CachedProfilesTableTableManager get cachedProfiles => $$CachedProfilesTableTableManager(_db, _db.cachedProfiles); + $$CachedPostsTableTableManager get cachedPosts => $$CachedPostsTableTableManager(_db, _db.cachedPosts); + $$SettingsTableTableManager get settings => $$SettingsTableTableManager(_db, _db.settings); + $$SavedFeedsTableTableManager get savedFeeds => $$SavedFeedsTableTableManager(_db, _db.savedFeeds); } diff --git a/lib/core/router/app_router.dart b/lib/core/router/app_router.dart index b9e1a38..af731fe 100644 --- a/lib/core/router/app_router.dart +++ b/lib/core/router/app_router.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:lazurite/features/auth/bloc/auth_bloc.dart'; +import 'package:lazurite/core/router/app_shell.dart'; import 'package:lazurite/features/auth/presentation/login_screen.dart'; import 'package:lazurite/features/feed/presentation/feed_management_screen.dart'; import 'package:lazurite/features/feed/presentation/home_feed_screen.dart'; @@ -14,8 +15,13 @@ class AppRouter { AppRouter({required this.authBloc, this.navigatorObserver}); final AuthBloc authBloc; final NavigatorObserver? navigatorObserver; + final GlobalKey _rootNavigatorKey = GlobalKey(debugLabel: 'root'); + final GlobalKey _homeNavigatorKey = GlobalKey(debugLabel: 'home'); + final GlobalKey _profileNavigatorKey = GlobalKey(debugLabel: 'profile'); + final GlobalKey _settingsNavigatorKey = GlobalKey(debugLabel: 'settings'); GoRouter get router => GoRouter( + navigatorKey: _rootNavigatorKey, refreshListenable: GoRouterRefreshStream(authBloc.stream), observers: navigatorObserver != null ? [navigatorObserver!] : null, redirect: (context, state) { @@ -33,15 +39,48 @@ class AppRouter { return null; }, routes: [ - GoRoute(path: '/', builder: (context, state) => const HomeFeedScreen()), GoRoute(path: '/login', builder: (context, state) => const LoginScreen()), - GoRoute( - path: '/profile', - builder: (context, state) => ProfileScreen(actor: state.uri.queryParameters['actor']), + StatefulShellRoute.indexedStack( + builder: (context, state, navigationShell) => AppShell(navigationShell: navigationShell), + branches: [ + StatefulShellBranch( + navigatorKey: _homeNavigatorKey, + routes: [ + GoRoute( + path: '/', + builder: (context, state) => const HomeFeedScreen(), + routes: [GoRoute(path: 'feeds', builder: (context, state) => const FeedManagementScreen())], + ), + ], + ), + StatefulShellBranch( + navigatorKey: _profileNavigatorKey, + routes: [ + GoRoute( + path: '/profile', + builder: (context, state) => const ProfileScreen(), + routes: [ + GoRoute( + path: 'view', + builder: (context, state) => + ProfileScreen(actor: state.uri.queryParameters['actor'], showBackButton: true), + ), + ], + ), + ], + ), + StatefulShellBranch( + navigatorKey: _settingsNavigatorKey, + routes: [ + GoRoute( + path: '/settings', + builder: (context, state) => const SettingsScreen(), + routes: [GoRoute(path: 'logs', builder: (context, state) => const LogsScreen())], + ), + ], + ), + ], ), - GoRoute(path: '/settings', builder: (context, state) => const SettingsScreen()), - GoRoute(path: '/logs', builder: (context, state) => const LogsScreen()), - GoRoute(path: '/feeds', builder: (context, state) => const FeedManagementScreen()), ], ); } diff --git a/lib/core/router/app_shell.dart b/lib/core/router/app_shell.dart new file mode 100644 index 0000000..eef5a5f --- /dev/null +++ b/lib/core/router/app_shell.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class AppShell extends StatelessWidget { + const AppShell({super.key, required this.navigationShell}); + + final StatefulNavigationShell navigationShell; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: navigationShell, + bottomNavigationBar: NavigationBar( + selectedIndex: navigationShell.currentIndex, + onDestinationSelected: (index) { + navigationShell.goBranch(index, initialLocation: index == navigationShell.currentIndex); + }, + destinations: const [ + NavigationDestination(icon: Icon(Icons.home_outlined), selectedIcon: Icon(Icons.home), label: 'Home'), + NavigationDestination(icon: Icon(Icons.person_outline), selectedIcon: Icon(Icons.person), label: 'Profile'), + NavigationDestination( + icon: Icon(Icons.settings_outlined), + selectedIcon: Icon(Icons.settings), + label: 'Settings', + ), + ], + ), + ); + } +} diff --git a/lib/features/feed/cubit/feed_preferences_cubit.dart b/lib/features/feed/cubit/feed_preferences_cubit.dart index 8fb5dbd..3aa6a2c 100644 --- a/lib/features/feed/cubit/feed_preferences_cubit.dart +++ b/lib/features/feed/cubit/feed_preferences_cubit.dart @@ -1,8 +1,11 @@ +import 'package:atproto_core/atproto_core.dart'; import 'package:bluesky/app_bsky_actor_defs.dart'; +import 'package:bluesky/app_bsky_feed_defs.dart'; import 'package:drift/drift.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lazurite/core/database/app_database.dart'; +import 'package:lazurite/core/logging/app_logger.dart'; import 'package:lazurite/features/feed/data/feed_repository.dart'; import 'package:uuid/uuid.dart'; @@ -21,6 +24,7 @@ class FeedPreferencesCubit extends Cubit { final String _accountDid; Future loadPreferences() async { + log.d('FeedPreferencesCubit: Loading feed preferences for $_accountDid'); emit(state.copyWith(status: FeedPreferencesStatus.loading)); try { @@ -28,27 +32,42 @@ class FeedPreferencesCubit extends Cubit { if (cachedFeeds.isNotEmpty) { final feeds = cachedFeeds.map(_mapFromCached).toList(); - emit(FeedPreferencesState.loaded(feeds: feeds)); + log.d('FeedPreferencesCubit: Loaded ${feeds.length} cached feeds for $_accountDid'); + _emitLoaded(feeds); } final result = await _feedRepository.getPreferences(); final savedFeedsPref = result.preferences.whereType().firstOrNull; if (savedFeedsPref != null) { - final feeds = savedFeedsPref.data.items; + final feeds = _ensureDefaultFeeds(savedFeedsPref.data.items); await _cacheFeeds(feeds); - emit(FeedPreferencesState.loaded(feeds: feeds)); + log.i('FeedPreferencesCubit: Loaded ${feeds.length} feed preferences from server for $_accountDid'); + _emitLoaded(feeds); + await _hydrateGeneratorViews(feeds); } else { final defaultFeeds = [_createDefaultTimelineFeed()]; await _cacheFeeds(defaultFeeds); - emit(FeedPreferencesState.loaded(feeds: defaultFeeds)); + log.i('FeedPreferencesCubit: No server feed preferences found, creating default timeline for $_accountDid'); + _emitLoaded(defaultFeeds); } - } catch (e) { + } catch (e, stackTrace) { final cachedFeeds = await _database.getSavedFeeds(_accountDid); if (cachedFeeds.isNotEmpty) { final feeds = cachedFeeds.map(_mapFromCached).toList(); - emit(FeedPreferencesState.loaded(feeds: feeds)); + log.w( + 'FeedPreferencesCubit: Falling back to ${feeds.length} cached feeds for $_accountDid after load failure', + error: e, + stackTrace: stackTrace, + ); + _emitLoaded(feeds); + await _hydrateGeneratorViews(feeds); } else { + log.e( + 'FeedPreferencesCubit: Failed to load feed preferences for $_accountDid with no cached fallback', + error: e, + stackTrace: stackTrace, + ); emit(FeedPreferencesState.error(message: e.toString())); } } @@ -109,6 +128,11 @@ class FeedPreferencesCubit extends Cubit { } Future addFeed({required SavedFeedType type, required String value, bool pinned = false}) async { + if (state.feeds.any((feed) => feed.value == value)) { + log.d('FeedPreferencesCubit: Ignoring duplicate feed $value for $_accountDid'); + return; + } + final newFeed = SavedFeed(id: _generateId(), type: type, value: value, pinned: pinned); final feeds = [...state.feeds, newFeed]; await _savePreferences(feeds); @@ -116,11 +140,10 @@ class FeedPreferencesCubit extends Cubit { Future _savePreferences(List feeds) async { final previousState = state; + log.d('FeedPreferencesCubit: Saving ${feeds.length} feed preferences for $_accountDid'); emit(state.copyWith(status: FeedPreferencesStatus.saving)); try { - await _cacheFeeds(feeds); - final result = await _feedRepository.getPreferences(); final preferences = List.from(result.preferences); @@ -128,11 +151,22 @@ class FeedPreferencesCubit extends Cubit { preferences.add(UPreferences.savedFeedsPrefV2(data: SavedFeedsPrefV2(items: feeds))); await _feedRepository.putPreferences(preferences: preferences); + await _cacheFeeds(feeds); - emit(FeedPreferencesState.loaded(feeds: feeds)); + log.i('FeedPreferencesCubit: Saved ${feeds.length} feed preferences for $_accountDid'); + _emitLoaded(feeds); + await _hydrateGeneratorViews(feeds); return true; - } catch (e) { - emit(FeedPreferencesState.saveError(feeds: feeds, message: e.toString(), previousState: previousState)); + } catch (e, stackTrace) { + log.e('FeedPreferencesCubit: Failed to save feed preferences for $_accountDid', error: e, stackTrace: stackTrace); + emit( + FeedPreferencesState.saveError( + feeds: previousState.feeds, + generatorViews: previousState.generatorViews, + message: e.toString(), + previousState: previousState, + ), + ); return false; } } @@ -172,6 +206,68 @@ class FeedPreferencesCubit extends Cubit { String _generateId() => const Uuid().v4(); + void _emitLoaded(List feeds) { + emit(FeedPreferencesState.loaded(feeds: feeds, generatorViews: _retainGeneratorViews(feeds))); + } + + List _ensureDefaultFeeds(List feeds) { + if (feeds.isNotEmpty) { + return feeds; + } + + return [_createDefaultTimelineFeed()]; + } + + List _retainGeneratorViews(List feeds) { + final values = feeds.map((feed) => feed.value).toSet(); + return state.generatorViews.where((view) => values.contains(view.uri.toString())).toList(growable: false); + } + + Future _hydrateGeneratorViews(List feeds) async { + final feedUris = []; + final seenUris = {}; + + for (final feed in feeds) { + if (!_isGeneratorFeed(feed)) { + continue; + } + + if (!seenUris.add(feed.value)) { + continue; + } + + try { + feedUris.add(AtUri.parse(feed.value)); + } catch (_) { + continue; + } + } + + if (feedUris.isEmpty) { + if (state.generatorViews.isNotEmpty) { + emit(state.copyWith(generatorViews: const [], status: FeedPreferencesStatus.loaded)); + } + return; + } + + try { + final generatorViews = await _feedRepository.getFeedGenerators(feedUris); + log.d('FeedPreferencesCubit: Hydrated ${generatorViews.length} generator views for $_accountDid'); + emit(state.copyWith(generatorViews: generatorViews, status: FeedPreferencesStatus.loaded, feeds: feeds)); + } catch (e, stackTrace) { + log.w( + 'FeedPreferencesCubit: Failed to hydrate ${feedUris.length} generator views for $_accountDid', + error: e, + stackTrace: stackTrace, + ); + } + } + + bool _isGeneratorFeed(SavedFeed feed) { + final feedType = feed.type; + return feedType is SavedFeedTypeKnownValue && feedType.data == KnownSavedFeedType.feed; + } + SavedFeed _createDefaultTimelineFeed() { return SavedFeed( id: _generateId(), @@ -185,24 +281,38 @@ class FeedPreferencesCubit extends Cubit { enum FeedPreferencesStatus { initial, loading, loaded, saving, saveError, error } class FeedPreferencesState extends Equatable { - const FeedPreferencesState._({required this.status, this.feeds = const [], this.message, this.previousState}); + const FeedPreferencesState._({ + required this.status, + this.feeds = const [], + this.generatorViews = const [], + this.message, + this.previousState, + }); const FeedPreferencesState.initial() : this._(status: FeedPreferencesStatus.initial); - const FeedPreferencesState.loaded({required List feeds}) - : this._(status: FeedPreferencesStatus.loaded, feeds: feeds); + const FeedPreferencesState.loaded({required List feeds, List generatorViews = const []}) + : this._(status: FeedPreferencesStatus.loaded, feeds: feeds, generatorViews: generatorViews); const FeedPreferencesState.error({required String message}) : this._(status: FeedPreferencesStatus.error, message: message); const FeedPreferencesState.saveError({ required List feeds, + required List generatorViews, required String message, required FeedPreferencesState previousState, - }) : this._(status: FeedPreferencesStatus.saveError, feeds: feeds, message: message, previousState: previousState); + }) : this._( + status: FeedPreferencesStatus.saveError, + feeds: feeds, + generatorViews: generatorViews, + message: message, + previousState: previousState, + ); final FeedPreferencesStatus status; final List feeds; + final List generatorViews; final String? message; final FeedPreferencesState? previousState; @@ -210,20 +320,66 @@ class FeedPreferencesState extends Equatable { List get unpinnedFeeds => feeds.where((f) => !f.pinned).toList(); + bool isTimeline(SavedFeed feed) { + final feedType = feed.type; + return feedType is SavedFeedTypeKnownValue && feedType.data == KnownSavedFeedType.timeline; + } + + GeneratorView? generatorFor(SavedFeed feed) { + for (final view in generatorViews) { + if (view.uri.toString() == feed.value) { + return view; + } + } + + return null; + } + + String displayNameFor(SavedFeed feed) { + if (isTimeline(feed)) { + return 'Following'; + } + + final generator = generatorFor(feed); + if (generator != null) { + return generator.displayName; + } + + final segments = feed.value.split('/'); + return segments.isEmpty ? 'Feed' : segments.last; + } + + String subtitleFor(SavedFeed feed) { + if (isTimeline(feed)) { + return 'Timeline'; + } + + final generator = generatorFor(feed); + if (generator != null) { + return 'by ${generator.creator.displayName ?? generator.creator.handle}'; + } + + return 'Custom Feed'; + } + + String? descriptionFor(SavedFeed feed) => generatorFor(feed)?.description; + FeedPreferencesState copyWith({ FeedPreferencesStatus? status, List? feeds, + List? generatorViews, String? message, FeedPreferencesState? previousState, }) { return FeedPreferencesState._( status: status ?? this.status, feeds: feeds ?? this.feeds, + generatorViews: generatorViews ?? this.generatorViews, message: message ?? this.message, previousState: previousState ?? this.previousState, ); } @override - List get props => [status, feeds, message, previousState]; + List get props => [status, feeds, generatorViews, message, previousState]; } diff --git a/lib/features/feed/presentation/feed_management_screen.dart b/lib/features/feed/presentation/feed_management_screen.dart index fcd22ad..bc9170d 100644 --- a/lib/features/feed/presentation/feed_management_screen.dart +++ b/lib/features/feed/presentation/feed_management_screen.dart @@ -1,4 +1,3 @@ -import 'package:atproto_core/atproto_core.dart'; import 'package:bluesky/app_bsky_actor_defs.dart'; import 'package:bluesky/app_bsky_feed_defs.dart'; import 'package:flutter/material.dart'; @@ -116,15 +115,13 @@ class _FeedManagementScreenState extends State { }, itemBuilder: (context, index) { final feed = pinnedFeeds[index]; - final isTimeline = - feed.type is SavedFeedTypeKnownValue && - (feed.type as SavedFeedTypeKnownValue).data == KnownSavedFeedType.timeline; + final isTimeline = state.isTimeline(feed); return ListTile( key: ValueKey(feed.id), leading: isTimeline ? _buildTimelineIcon(context) : _buildFeedIcon(context, feed.value), - title: Text(isTimeline ? 'Following' : _getFeedDisplayName(feed.value)), - subtitle: Text(isTimeline ? 'Timeline' : 'Custom Feed'), + title: Text(state.displayNameFor(feed)), + subtitle: Text(state.subtitleFor(feed)), trailing: ReorderableDragStartListener(index: index, child: const Icon(Icons.drag_handle)), ); }, @@ -156,14 +153,12 @@ class _FeedManagementScreenState extends State { } Widget _buildPinnedFeedItem(BuildContext context, SavedFeed feed, FeedPreferencesState state) { - final isTimeline = - feed.type is SavedFeedTypeKnownValue && - (feed.type as SavedFeedTypeKnownValue).data == KnownSavedFeedType.timeline; + final isTimeline = state.isTimeline(feed); return ListTile( leading: isTimeline ? _buildTimelineIcon(context) : _buildFeedIcon(context, feed.value), - title: Text(isTimeline ? 'Following' : _getFeedDisplayName(feed.value)), - subtitle: Text(isTimeline ? 'Timeline' : 'Custom Feed'), + title: Text(state.displayNameFor(feed)), + subtitle: Text(state.subtitleFor(feed)), trailing: IconButton( icon: const Icon(Icons.check_circle), color: Theme.of(context).colorScheme.primary, @@ -173,10 +168,13 @@ class _FeedManagementScreenState extends State { } Widget _buildSavedFeedItem(BuildContext context, SavedFeed feed) { + final state = context.watch().state; + final description = state.descriptionFor(feed); + return ListTile( leading: _buildFeedIcon(context, feed.value), - title: Text(_getFeedDisplayName(feed.value)), - subtitle: const Text('Custom Feed'), + title: Text(state.displayNameFor(feed)), + subtitle: Text(description ?? state.subtitleFor(feed)), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ @@ -333,15 +331,6 @@ class _FeedManagementScreenState extends State { ); } - String _getFeedDisplayName(String feedUri) { - try { - final uri = AtUri.parse(feedUri); - return uri.rkey; - } catch (_) { - return feedUri.split('/').lastOrNull ?? feedUri; - } - } - void _confirmRemoveFeed(BuildContext context, String feedId) { showDialog( context: context, diff --git a/lib/features/feed/presentation/home_feed_screen.dart b/lib/features/feed/presentation/home_feed_screen.dart index 0dfe51f..6ac79dc 100644 --- a/lib/features/feed/presentation/home_feed_screen.dart +++ b/lib/features/feed/presentation/home_feed_screen.dart @@ -17,7 +17,7 @@ class HomeFeedScreen extends StatefulWidget { class _HomeFeedScreenState extends State { late final PageController _pageController; - int _currentTabIndex = 0; + String? _selectedFeedId; @override void initState() { @@ -35,27 +35,75 @@ class _HomeFeedScreenState extends State { Widget build(BuildContext context) { return BlocBuilder( builder: (context, prefsState) { + if (prefsState.status == FeedPreferencesStatus.initial || prefsState.status == FeedPreferencesStatus.loading) { + return const Scaffold(body: Center(child: CircularProgressIndicator())); + } + + if (prefsState.status == FeedPreferencesStatus.error) { + return Scaffold( + appBar: AppBar(title: const Text('Home')), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Failed to load feeds', style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 8), + Text(prefsState.message ?? 'Unknown error', textAlign: TextAlign.center), + const SizedBox(height: 16), + FilledButton( + onPressed: () => context.read().loadPreferences(), + child: const Text('Retry'), + ), + ], + ), + ), + ); + } + final pinnedFeeds = prefsState.pinnedFeeds; if (pinnedFeeds.isEmpty) { return Scaffold( appBar: AppBar(title: const Text('Home')), - body: const Center(child: Text('No feeds pinned. Add feeds from settings.')), + body: Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('No feeds pinned', style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 8), + Text( + 'Pin a timeline or custom feed to build your home tabs.', + style: Theme.of(context).textTheme.bodyMedium, + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + FilledButton(onPressed: () => context.push('/feeds'), child: const Text('Manage Feeds')), + ], + ), + ), + ), ); } + final currentTabIndex = _selectedIndexFor(pinnedFeeds); + _syncSelectedFeed(pinnedFeeds, currentTabIndex); + return Scaffold( appBar: AppBar( title: const Text('Home'), - actions: [IconButton(icon: const Icon(Icons.settings_outlined), onPressed: () => context.push('/feeds'))], + actions: [ + IconButton(icon: const Icon(Icons.dynamic_feed_outlined), onPressed: () => context.push('/feeds')), + ], ), body: Column( children: [ - _buildTabBar(context, pinnedFeeds), + _buildTabBar(context, pinnedFeeds, prefsState, currentTabIndex), Expanded( child: PageView.builder( controller: _pageController, - onPageChanged: (index) => setState(() => _currentTabIndex = index), + onPageChanged: (index) => setState(() => _selectedFeedId = pinnedFeeds[index].id), itemCount: pinnedFeeds.length, itemBuilder: (context, index) => _FeedListView(feed: pinnedFeeds[index], key: ValueKey(pinnedFeeds[index].id)), @@ -68,7 +116,41 @@ class _HomeFeedScreenState extends State { ); } - Widget _buildTabBar(BuildContext context, List feeds) { + void _syncSelectedFeed(List feeds, int currentTabIndex) { + final selectedFeedId = feeds[currentTabIndex].id; + if (_selectedFeedId != selectedFeedId) { + _selectedFeedId = selectedFeedId; + } + + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted || !_pageController.hasClients) { + return; + } + + final roundedPage = _pageController.page?.round(); + if (roundedPage == currentTabIndex) { + return; + } + + _pageController.jumpToPage(currentTabIndex); + }); + } + + int _selectedIndexFor(List feeds) { + if (feeds.isEmpty) { + return 0; + } + + final index = feeds.indexWhere((feed) => feed.id == _selectedFeedId); + return index >= 0 ? index : 0; + } + + Widget _buildTabBar( + BuildContext context, + List feeds, + FeedPreferencesState prefsState, + int currentTabIndex, + ) { return Container( decoration: BoxDecoration( border: Border(bottom: BorderSide(color: Theme.of(context).dividerColor)), @@ -79,7 +161,7 @@ class _HomeFeedScreenState extends State { children: feeds.asMap().entries.map((entry) { final index = entry.key; final feed = entry.value; - final isSelected = _currentTabIndex == index; + final isSelected = currentTabIndex == index; return GestureDetector( onTap: () { @@ -88,7 +170,7 @@ class _HomeFeedScreenState extends State { duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, ); - setState(() => _currentTabIndex = index); + setState(() => _selectedFeedId = feed.id); }, child: Container( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), @@ -101,7 +183,7 @@ class _HomeFeedScreenState extends State { ), ), child: Text( - _getFeedName(feed), + prefsState.displayNameFor(feed), style: Theme.of(context).textTheme.bodyLarge?.copyWith( fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, color: isSelected @@ -116,16 +198,6 @@ class _HomeFeedScreenState extends State { ), ); } - - String _getFeedName(SavedFeed feed) { - if (feed.type is SavedFeedTypeKnownValue) { - final knownType = (feed.type as SavedFeedTypeKnownValue).data; - if (knownType == KnownSavedFeedType.timeline) { - return 'Following'; - } - } - return feed.value.split('/').lastOrNull ?? 'Feed'; - } } class _FeedListView extends StatefulWidget { diff --git a/lib/features/feed/presentation/widgets/facet_text.dart b/lib/features/feed/presentation/widgets/facet_text.dart index 46c7f74..64ef015 100644 --- a/lib/features/feed/presentation/widgets/facet_text.dart +++ b/lib/features/feed/presentation/widgets/facet_text.dart @@ -200,7 +200,7 @@ void _openProfile(BuildContext context, String actor) { return; } - router.push('/profile?actor=${Uri.encodeQueryComponent(actor)}'); + router.push('/profile/view?actor=${Uri.encodeQueryComponent(actor)}'); } Uri _searchUri(String tag) => Uri.https('bsky.app', '/search', {'q': '#$tag'}); diff --git a/lib/features/feed/presentation/widgets/post_card.dart b/lib/features/feed/presentation/widgets/post_card.dart index 0dbcaff..5cdc28d 100644 --- a/lib/features/feed/presentation/widgets/post_card.dart +++ b/lib/features/feed/presentation/widgets/post_card.dart @@ -341,7 +341,7 @@ class PostCard extends StatelessWidget { onTap: () { final router = GoRouter.maybeOf(context); if (router != null) { - router.push('/profile?actor=${Uri.encodeQueryComponent(quoted.author.did)}'); + router.push('/profile/view?actor=${Uri.encodeQueryComponent(quoted.author.did)}'); } }, borderRadius: BorderRadius.circular(16), diff --git a/lib/features/profile/presentation/profile_screen.dart b/lib/features/profile/presentation/profile_screen.dart index df67cb8..6bfb8ba 100644 --- a/lib/features/profile/presentation/profile_screen.dart +++ b/lib/features/profile/presentation/profile_screen.dart @@ -10,9 +10,10 @@ import 'package:lazurite/features/profile/bloc/profile_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; class ProfileScreen extends StatefulWidget { - const ProfileScreen({super.key, this.actor}); + const ProfileScreen({super.key, this.actor, this.showBackButton = false}); final String? actor; + final bool showBackButton; @override State createState() => _ProfileScreenState(); @@ -97,15 +98,14 @@ class _ProfileScreenState extends State with SingleTickerProvider stretch: true, title: innerBoxIsScrolled ? Text(profile?.displayName ?? profile?.handle ?? 'Profile') : null, flexibleSpace: FlexibleSpaceBar(background: _buildBanner(context, profile)), - leading: IconButton( - icon: const Icon(Icons.arrow_back), - onPressed: () => context.canPop() ? context.pop() : context.go('/'), - ), + leading: widget.showBackButton + ? IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => context.canPop() ? context.pop() : context.go('/profile'), + ) + : null, actions: [ - IconButton( - icon: const Icon(Icons.settings_outlined), - onPressed: () => context.push('/settings'), - ), + IconButton(icon: const Icon(Icons.settings_outlined), onPressed: () => context.go('/settings')), ], ), SliverToBoxAdapter( diff --git a/lib/features/settings/presentation/settings_screen.dart b/lib/features/settings/presentation/settings_screen.dart index c629c7d..e701710 100644 --- a/lib/features/settings/presentation/settings_screen.dart +++ b/lib/features/settings/presentation/settings_screen.dart @@ -38,7 +38,7 @@ class SettingsScreen extends StatelessWidget { title: Text(tokens.displayName ?? tokens.handle), subtitle: Text('@${tokens.handle}'), trailing: const Icon(Icons.chevron_right), - onTap: () => context.push('/profile'), + onTap: () => context.go('/profile'), ); }, ), @@ -47,6 +47,12 @@ class SettingsScreen extends StatelessWidget { _buildThemeSelector(context), const SizedBox(height: 24), _buildSectionHeader(context, 'Account'), + _SettingsTile( + icon: Icons.dynamic_feed_outlined, + title: 'Feeds', + subtitle: 'Manage pinned and saved feeds', + onTap: () => context.push('/feeds'), + ), _SettingsTile(icon: Icons.person_outline, title: 'Edit Profile', subtitle: 'Name, bio, avatar', onTap: () {}), _SettingsTile(icon: Icons.lock_outline, title: 'Privacy', subtitle: 'Visibility settings', onTap: () {}), const SizedBox(height: 24), @@ -68,7 +74,7 @@ class SettingsScreen extends StatelessWidget { icon: Icons.description_outlined, title: 'Logs', subtitle: 'View app log files', - onTap: () => context.push('/logs'), + onTap: () => context.push('/settings/logs'), ), _SettingsTile(icon: Icons.help_outline, title: 'Help & Support', onTap: () {}), _SettingsTile(icon: Icons.security_outlined, title: 'Privacy Policy', onTap: () {}), @@ -84,7 +90,7 @@ class SettingsScreen extends StatelessWidget { }, ), const SizedBox(height: 24), - Center(child: Text('Lazurite v1.0.0 (Phase 1)', style: Theme.of(context).textTheme.bodySmall)), + Center(child: Text('Lazurite v1.0.0 (Phase 2)', style: Theme.of(context).textTheme.bodySmall)), const SizedBox(height: 24), ], ), diff --git a/test/core/router/app_router_test.dart b/test/core/router/app_router_test.dart new file mode 100644 index 0000000..8678d00 --- /dev/null +++ b/test/core/router/app_router_test.dart @@ -0,0 +1,134 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:bluesky/app_bsky_actor_defs.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/core/router/app_router.dart'; +import 'package:lazurite/core/theme/app_theme.dart'; +import 'package:lazurite/features/auth/bloc/auth_bloc.dart'; +import 'package:lazurite/features/auth/data/models/auth_models.dart'; +import 'package:lazurite/features/feed/bloc/feed_bloc.dart'; +import 'package:lazurite/features/feed/cubit/feed_preferences_cubit.dart'; +import 'package:lazurite/features/profile/bloc/profile_bloc.dart'; +import 'package:lazurite/features/settings/bloc/settings_cubit.dart'; +import 'package:lazurite/features/settings/bloc/settings_state.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockAuthBloc extends MockBloc implements AuthBloc {} + +class MockFeedPreferencesCubit extends MockCubit implements FeedPreferencesCubit {} + +class MockProfileBloc extends MockBloc implements ProfileBloc {} + +class MockFeedBloc extends MockBloc implements FeedBloc {} + +class MockSettingsCubit extends MockCubit implements SettingsCubit {} + +void main() { + late MockAuthBloc authBloc; + late MockFeedPreferencesCubit feedPreferencesCubit; + late MockProfileBloc profileBloc; + late MockFeedBloc feedBloc; + late MockSettingsCubit settingsCubit; + + const tokens = AuthTokens( + accessToken: 'access', + refreshToken: 'refresh', + did: 'did:plc:me', + handle: 'me.bsky.social', + displayName: 'River Tam', + ); + + final profile = ProfileViewDetailed( + did: 'did:plc:me', + handle: 'me.bsky.social', + displayName: 'River Tam', + followersCount: 12, + followsCount: 8, + postsCount: 3, + createdAt: DateTime.utc(2024, 3, 1), + ); + + setUp(() { + authBloc = MockAuthBloc(); + feedPreferencesCubit = MockFeedPreferencesCubit(); + profileBloc = MockProfileBloc(); + feedBloc = MockFeedBloc(); + settingsCubit = MockSettingsCubit(); + + when(() => authBloc.state).thenReturn(const AuthState.authenticated(tokens)); + when(() => feedPreferencesCubit.state).thenReturn(const FeedPreferencesState.loaded(feeds: [])); + when(() => profileBloc.state).thenReturn(ProfileState.loaded(profile: profile)); + when(() => feedBloc.state).thenReturn( + const FeedState.loaded(actor: 'did:plc:me', posts: [], filter: FeedFilter.postsNoReplies, hasMore: false), + ); + when(() => settingsCubit.state).thenReturn( + const SettingsState( + themePalette: AppThemePalette.oxocarbon, + themeVariant: AppThemeVariant.dark, + useSystemTheme: false, + ), + ); + + whenListen(authBloc, const Stream.empty(), initialState: const AuthState.authenticated(tokens)); + whenListen( + feedPreferencesCubit, + const Stream.empty(), + initialState: const FeedPreferencesState.loaded(feeds: []), + ); + whenListen(profileBloc, const Stream.empty(), initialState: ProfileState.loaded(profile: profile)); + whenListen( + feedBloc, + const Stream.empty(), + initialState: const FeedState.loaded( + actor: 'did:plc:me', + posts: [], + filter: FeedFilter.postsNoReplies, + hasMore: false, + ), + ); + whenListen( + settingsCubit, + const Stream.empty(), + initialState: const SettingsState( + themePalette: AppThemePalette.oxocarbon, + themeVariant: AppThemeVariant.dark, + useSystemTheme: false, + ), + ); + }); + + Widget buildSubject() { + return MultiBlocProvider( + providers: [ + BlocProvider.value(value: authBloc), + BlocProvider.value(value: feedPreferencesCubit), + BlocProvider.value(value: profileBloc), + BlocProvider.value(value: feedBloc), + BlocProvider.value(value: settingsCubit), + ], + child: MaterialApp.router(routerConfig: AppRouter(authBloc: authBloc).router), + ); + } + + testWidgets('renders bottom navigation and switches authenticated branches', (tester) async { + await tester.pumpWidget(buildSubject()); + await tester.pumpAndSettle(); + + expect(find.text('Home'), findsAtLeastNWidgets(1)); + expect(find.text('Profile'), findsAtLeastNWidgets(1)); + expect(find.text('Settings'), findsAtLeastNWidgets(1)); + expect(find.text('No feeds pinned'), findsOneWidget); + + await tester.tap(find.text('Profile').last); + await tester.pumpAndSettle(); + + expect(find.text('River Tam'), findsOneWidget); + + await tester.tap(find.text('Settings').last); + await tester.pumpAndSettle(); + + expect(find.text('Settings'), findsAtLeastNWidgets(1)); + expect(find.text('APPEARANCE'), findsOneWidget); + }); +} diff --git a/test/features/feed/cubit/feed_preferences_cubit_test.dart b/test/features/feed/cubit/feed_preferences_cubit_test.dart index 34a8e68..59e4c46 100644 --- a/test/features/feed/cubit/feed_preferences_cubit_test.dart +++ b/test/features/feed/cubit/feed_preferences_cubit_test.dart @@ -1,5 +1,7 @@ +import 'package:atproto_core/atproto_core.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:bluesky/app_bsky_actor_defs.dart'; +import 'package:bluesky/app_bsky_feed_defs.dart'; import 'package:drift/drift.dart' hide isNotNull; import 'package:drift/native.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -258,7 +260,18 @@ void main() { build: () => FeedPreferencesCubit(feedRepository: mockFeedRepository, database: database, accountDid: 'did:plc:test'), seed: () => FeedPreferencesState.loaded(feeds: [createTestFeed(id: 'feed-1', pinned: true)]), - setUp: () { + setUp: () async { + await database.replaceSavedFeeds('did:plc:test', [ + SavedFeedsCompanion( + id: const Value('feed-1'), + accountDid: const Value('did:plc:test'), + type: const Value('{"\$type":"app.bsky.actor.defs#savedFeedTypeKnownValue","data":"feed"}'), + value: const Value('at://did:plc:test/app.bsky.feed.generator/test'), + pinned: const Value(false), + sortOrder: const Value(0), + updatedAt: Value(DateTime.now()), + ), + ]); when(() => mockFeedRepository.getPreferences()).thenThrow(Exception('API error')); }, act: (cubit) => cubit.pinFeed('feed-1'), @@ -266,8 +279,25 @@ void main() { isA().having((s) => s.status, 'status', FeedPreferencesStatus.saving), isA() .having((s) => s.status, 'status', FeedPreferencesStatus.saveError) + .having((s) => s.feeds.first.pinned, 'pinned', true) .having((s) => s.message, 'message', isNotNull), ], + verify: (_) async { + final cached = await database.getSavedFeeds('did:plc:test'); + expect(cached.single.pinned, isFalse); + }, + ); + + blocTest( + 'addFeed ignores duplicate feed values', + build: () => + FeedPreferencesCubit(feedRepository: mockFeedRepository, database: database, accountDid: 'did:plc:test'), + seed: () => FeedPreferencesState.loaded(feeds: [createTestFeed(id: 'feed-1', pinned: true)]), + act: (cubit) => cubit.addFeed( + type: const SavedFeedType.knownValue(data: KnownSavedFeedType.feed), + value: 'at://did:plc:test/app.bsky.feed.generator/test', + ), + expect: () => [], ); blocTest( @@ -276,6 +306,7 @@ void main() { FeedPreferencesCubit(feedRepository: mockFeedRepository, database: database, accountDid: 'did:plc:test'), seed: () => FeedPreferencesState.saveError( feeds: [createTestFeed(id: 'feed-1', pinned: true)], + generatorViews: const [], message: 'Error', previousState: FeedPreferencesState.loaded(feeds: [createTestFeed(id: 'feed-1', pinned: false)]), ), @@ -323,5 +354,23 @@ void main() { expect(copied.status, FeedPreferencesStatus.saving); expect(copied.feeds.length, 1); }); + + test('displayNameFor prefers hydrated generator metadata', () { + final state = FeedPreferencesState.loaded( + feeds: [createTestFeed(id: '1')], + generatorViews: [ + GeneratorView( + uri: const AtUri('at://did:plc:test/app.bsky.feed.generator/test'), + cid: 'cid-1', + creator: const ProfileView(did: 'did:plc:creator', handle: 'creator.bsky.social'), + did: 'did:plc:test', + displayName: 'What\'s Hot', + indexedAt: DateTime.utc(2026, 3, 16), + ), + ], + ); + + expect(state.displayNameFor(state.feeds.single), 'What\'s Hot'); + }); }); }