Skip to content

Fix sync models #59

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 139 commits into from
Jul 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
e4954d5
chore: move shared files to the ui shared package
fulleni Jul 17, 2025
4d6b990
build: update flex_color_scheme to 8.2.0
fulleni Jul 17, 2025
2753b66
feat(app): Add demo data migration service
fulleni Jul 17, 2025
937a645
refactor(data): Migrate to new data layer
fulleni Jul 17, 2025
936eab5
refactor: rename Category to Topic
fulleni Jul 17, 2025
1ae0773
refactor(app): Rename AppConfig to RemoteConfig
fulleni Jul 17, 2025
85ef741
refactor(app): improve user settings and data migration
fulleni Jul 17, 2025
20530c8
Refactor: Update AccountBloc and event to use Topic instead of Category
fulleni Jul 17, 2025
cebd67f
refactor(account): Improve AccountBloc error handling
fulleni Jul 17, 2025
cb22ac5
fix(account): improve error handling in AccountBloc
fulleni Jul 17, 2025
75e72e5
refactor(bootstrap): reorder imports
fulleni Jul 18, 2025
37e25c3
feat(app): add font weight change event
fulleni Jul 18, 2025
5a68e11
feat(app): Add font weight setting
fulleni Jul 18, 2025
cb7b493
feat(app): add new app states
fulleni Jul 18, 2025
faa9bdf
feat(app): add app opened event
fulleni Jul 18, 2025
a3cc96f
feat(app): handle app opened event
fulleni Jul 18, 2025
1d6fd9a
refactor(app): improve locale handling
fulleni Jul 18, 2025
443090b
feat(account): add topic management pages
fulleni Jul 18, 2025
e3f119e
refactor(account): rename followedCategories to followedTopics
fulleni Jul 18, 2025
4bd0bf9
chore: init bloc boilerplate
fulleni Jul 18, 2025
d18677a
feat(account): improve available topics state
fulleni Jul 18, 2025
3bde1d7
feat(account): add fetch available topics event
fulleni Jul 18, 2025
609de1e
feat(account): Implement available topics bloc
fulleni Jul 18, 2025
10562e1
refactor(account): update sources page
fulleni Jul 18, 2025
86b0975
refactor(account): replace categories with topics
fulleni Jul 18, 2025
2ecc6ef
docs: add topic filter page translations
fulleni Jul 18, 2025
6d31cc5
docs(l10n): add Arabic translations for topic filtering
fulleni Jul 18, 2025
a2eb005
feat(l10n): add topic following/unfollowing strings
fulleni Jul 18, 2025
9d7665f
refactor(account): update followed topics page
fulleni Jul 18, 2025
a9a873e
docs: add followed topics strings
fulleni Jul 18, 2025
15d59fe
docs: add Arabic translations for followed topics
fulleni Jul 18, 2025
558837d
refactor(account): use localized strings in followed sources page
fulleni Jul 18, 2025
31fc344
docs: add followed sources messages
fulleni Jul 18, 2025
a082d5f
docs: add Arabic translations for followed sources
fulleni Jul 18, 2025
a969c5e
feat(l10n): add translations for followed sources and topics
fulleni Jul 18, 2025
9ff7bc0
docs: add topic filter label translation
fulleni Jul 18, 2025
0ff007e
feat(l10n): add topic filter label translation
fulleni Jul 18, 2025
0ee69a1
refactor(account): Rename categories to topics
fulleni Jul 18, 2025
14cb8dd
feat(feed): add feed injector service
fulleni Jul 18, 2025
fb39312
refactor(router): rename categories to topics
fulleni Jul 18, 2025
5244cd2
refactor(app,router): improve code style and structure
fulleni Jul 18, 2025
e83d4a7
refactor(account): remove unused role display
fulleni Jul 18, 2025
2e2a2e1
feat(widgets): add headline tile widgets
fulleni Jul 18, 2025
df19049
feat(shared): add shared widgets
fulleni Jul 18, 2025
26ad5dd
refactor(account): update AccountState error handling
fulleni Jul 18, 2025
9e4bbcc
refactor(account): rename clearErrorMessage to clearError
fulleni Jul 18, 2025
5b3adb0
fix(account): improve error handling in saved headlines
fulleni Jul 18, 2025
e74de5e
fix(account): Simplify error handling in followed items pages
fulleni Jul 18, 2025
8390763
refactor(app): Rename categoriesRepository to topicRepository
fulleni Jul 18, 2025
749a1a1
refactor(auth): Migrate to ht_ui_kit
fulleni Jul 18, 2025
2bfd135
refactor(auth): Migrate to ht_ui_kit
fulleni Jul 18, 2025
2b81c39
refactor(auth): Use ht_ui_kit for localization
fulleni Jul 18, 2025
78f0558
refactor(auth): improve authentication state management
fulleni Jul 18, 2025
c8a40fe
refactor(auth): Improve authentication bloc error handling
fulleni Jul 18, 2025
be14090
refactor(auth): remove unnecessary imports
fulleni Jul 18, 2025
3948800
fix(auth): Improve error handling in AuthenticationPage
fulleni Jul 18, 2025
99ea252
fix(auth): improve error handling in email verification
fulleni Jul 18, 2025
21e42b2
fix(auth): improve error handling and navigation
fulleni Jul 18, 2025
884ec8a
refactor(entity_details): improve EntityDetailsState
fulleni Jul 18, 2025
703214f
fix(entity_details): improve event descriptions
fulleni Jul 18, 2025
60f8ddc
chore: moved feed injector service
fulleni Jul 18, 2025
db9c931
refacotr: sync entity details with the updated shared package
fulleni Jul 18, 2025
908711c
refactor(entity_details): add userId and feedActionType to AppFeedAct…
fulleni Jul 18, 2025
1cc2e30
refactor(entity_details): update page to use ContentType and Topic
fulleni Jul 18, 2025
abcde38
refactor(entity_details): update bloc logic and simplify code
fulleni Jul 18, 2025
741b8a8
fix(entity_details): correct type casting and update feed action hand…
fulleni Jul 18, 2025
c042a10
fix(entity_details): use AppLocalizationsX for localization
fulleni Jul 18, 2025
c1dffb3
feat(l10n): add topic entity type translations
fulleni Jul 18, 2025
95dd4a6
lint: misc
fulleni Jul 18, 2025
f477ed2
refactor(headline-details): update similar headlines fetching logic
fulleni Jul 18, 2025
a61b084
refactor(headline-details): update HeadlineDetailsFailure state
fulleni Jul 18, 2025
624fa80
refactor(headline-details): improve error handling in HeadlineDetails…
fulleni Jul 18, 2025
3781c3d
refactor(headline-details): update UI and improve error handling
fulleni Jul 18, 2025
2c2e4d0
refactor(headline-details): remove unused import
fulleni Jul 18, 2025
36331bd
refactor(headlines-feed): replace categories with topics in filter
fulleni Jul 18, 2025
a1b0cf1
refactor(headlines-feed): rename CategoriesFilter to TopicsFilter
fulleni Jul 18, 2025
1e533e4
refactor(headlines-feed): rename CategoriesFilter to TopicsFilter
fulleni Jul 18, 2025
4c73b8d
refactor(headlines-feed): implement topics filter bloc
fulleni Jul 18, 2025
8ea8b2c
refactor(headlines-feed): rename `categories` to `topics` in Headline…
fulleni Jul 18, 2025
dc99eb9
refactor(headlines-feed): consolidate headlines feed states
fulleni Jul 18, 2025
adfe9ef
refactor(headlines-feed): revamp HeadlinesFeedBloc for improved state…
fulleni Jul 18, 2025
3818dea
feat(headlines-feed): implement feed action event dispatching
fulleni Jul 18, 2025
d3529e2
fix(headlines-feed): handle country filter load more and pagination
fulleni Jul 18, 2025
3656ad5
refactor(headlines-feed): update error type in CountriesFilterState
fulleni Jul 18, 2025
252c72d
fix(headlines-feed): use response.hasMore instead of cursor check
fulleni Jul 18, 2025
74c7d16
fix(headlines-feed): improve error handling in sources filter
fulleni Jul 18, 2025
0b02c36
fix(headlines-feed): improve error handling in sources filter
fulleni Jul 18, 2025
b26fb11
refactor(headlines-feed): remove unused CategoryFilterPage
fulleni Jul 18, 2025
5bf6218
refactor(headlines-feed): rename and simplify TopicFilterPage
fulleni Jul 18, 2025
48f5160
refactor(headlines-feed): improve feed loading logic and UI
fulleni Jul 18, 2025
db2ca85
feat(headlines-feed): replace categories with topics in filter
fulleni Jul 18, 2025
011cbba
refactor(headlines-feed): improve error handling and UI consistency
fulleni Jul 18, 2025
9dc4718
feat(headlines-feed): implement topic filter page with selection func…
fulleni Jul 18, 2025
1d6d2a6
refactor(headlines-feed): improve error handling and localization in …
fulleni Jul 18, 2025
7aa0e2d
refactor(router): update page builder for feed filter route
fulleni Jul 18, 2025
4a3465a
refactor(headlines-feed): remove unused import
fulleni Jul 18, 2025
eb33738
refactor: remove unused SearchModelType enum
fulleni Jul 18, 2025
be6c815
refactor(headlines-search): rename SearchModelType to ContentType
fulleni Jul 18, 2025
47b4560
refactor(headlines-search): update search functionality and models
fulleni Jul 18, 2025
a572c5b
fix(headlines-search): handle feed actions in headlines search
fulleni Jul 18, 2025
617407b
feat(l10n): add extension for localized content type names
fulleni Jul 18, 2025
cb84442
feat(l10n): add content type labels for Arabic and English
fulleni Jul 18, 2025
3a9e578
chore: l10n
fulleni Jul 18, 2025
24896d6
refactor(headlines-search): migrate to shared ContentType enum
fulleni Jul 18, 2025
1c68b29
style(headlines-search): add ignore_for_file comment for no_default_c…
fulleni Jul 18, 2025
c247b5b
refactor(headlines-search): rename Category to Topic
fulleni Jul 18, 2025
199b79e
feat(l10n): add searchingFor string for Arabic and English
fulleni Jul 18, 2025
3dfc2ec
feat(localization): add searching for subtitle localization
fulleni Jul 18, 2025
72d074c
style: format
fulleni Jul 18, 2025
bb8007a
refactor(settings): enhance initial settings setup and remove debug logs
fulleni Jul 18, 2025
c4a6044
refactor(settings): split SettingsFeedTileTypeChanged into SettingsHe…
fulleni Jul 18, 2025
7735f58
refactor(settings): update SettingsBloc to handle headline image styl…
fulleni Jul 18, 2025
f5d0769
refactor(settings): update imports and localize image style change
fulleni Jul 18, 2025
c654b0c
refactor(settings): update imports and error handling in settings page
fulleni Jul 18, 2025
76e9439
feat(l10n): add font weight labels for Arabic and English
fulleni Jul 18, 2025
59a1319
refactor(settings): update imports and localization in appearance set…
fulleni Jul 18, 2025
806e976
feat(settings): add localized font weight strings and update imports
fulleni Jul 18, 2025
b0d8f47
refactor(settings): update language settings page
fulleni Jul 18, 2025
118d9df
refactor(settings): update imports and localization
fulleni Jul 18, 2025
283db77
refactor(settings): replace AppSpacing with ht_ui_kit and update loca…
fulleni Jul 18, 2025
a5feff7
refactor(shared): update headline tile to use new models
fulleni Jul 19, 2025
c87ca08
chore: revert
fulleni Jul 19, 2025
b13ecf9
refactor(headline_tile_image_start):
fulleni Jul 19, 2025
ac5a09b
fix(shared): update argument property in entity details navigation
fulleni Jul 19, 2025
c4ec14a
refactor(shared): update HeadlineTileImageTop widget
fulleni Jul 19, 2025
b58f5d2
refactor(headline_tile_text_only): migrate to ContentType and simplif…
fulleni Jul 19, 2025
b98914e
refactor(feed): redesign FeedInjectorService for enhanced flexibility
fulleni Jul 19, 2025
369edc9
refactor(entity-details): update bloc to use remoteConfig instead of …
fulleni Jul 19, 2025
4af14bd
refactor(app): rename appConfig to remoteConfig in AppState
fulleni Jul 19, 2025
f90b7ac
chore: misc
fulleni Jul 19, 2025
dfc44b4
refactor(headlines-feed): rename variable for clarity
fulleni Jul 19, 2025
9084202
refactor(headlines-search): update RemoteConfigService parameter name
fulleni Jul 19, 2025
9a2a7db
fix(headlines-search): improve null safety and localization
fulleni Jul 19, 2025
ffbdfe8
fix(headlines-search): update condition for displaying topic description
fulleni Jul 19, 2025
6295c6d
fix(headlines-search): update condition for displaying source descrip…
fulleni Jul 19, 2025
3b47c3a
refactor: remove unused import
fulleni Jul 19, 2025
22bf985
refactor: remove unused import
fulleni Jul 19, 2025
a086895
refactor: remove unused l10n package import
fulleni Jul 19, 2025
ebee66b
style: format
fulleni Jul 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 119 additions & 59 deletions lib/account/bloc/account_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:ht_auth_repository/ht_auth_repository.dart';
import 'package:ht_data_repository/ht_data_repository.dart';
import 'package:ht_main/app/config/config.dart' as local_config;
import 'package:ht_shared/ht_shared.dart';
import 'package:logging/logging.dart';

part 'account_event.dart';
part 'account_state.dart';
Expand All @@ -16,9 +17,11 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
required HtDataRepository<UserContentPreferences>
userContentPreferencesRepository,
required local_config.AppEnvironment environment,
Logger? logger,
}) : _authenticationRepository = authenticationRepository,
_userContentPreferencesRepository = userContentPreferencesRepository,
_environment = environment,
_logger = logger ?? Logger('AccountBloc'),
super(const AccountState()) {
// Listen to user changes from HtAuthRepository
_userSubscription = _authenticationRepository.authStateChanges.listen((
Expand All @@ -31,16 +34,16 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
on<AccountUserChanged>(_onAccountUserChanged);
on<AccountLoadUserPreferences>(_onAccountLoadUserPreferences);
on<AccountSaveHeadlineToggled>(_onAccountSaveHeadlineToggled);
on<AccountFollowCategoryToggled>(_onAccountFollowCategoryToggled);
on<AccountFollowTopicToggled>(_onAccountFollowTopicToggled);
on<AccountFollowSourceToggled>(_onAccountFollowSourceToggled);
// AccountFollowCountryToggled handler removed
on<AccountClearUserPreferences>(_onAccountClearUserPreferences);
}

final HtAuthRepository _authenticationRepository;
final HtDataRepository<UserContentPreferences>
_userContentPreferencesRepository;
final local_config.AppEnvironment _environment;
final Logger _logger;
late StreamSubscription<User?> _userSubscription;

Future<void> _onAccountUserChanged(
Expand Down Expand Up @@ -72,7 +75,7 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: preferences,
clearErrorMessage: true,
clearError: true,
),
);
} on NotFoundException {
Expand All @@ -86,48 +89,54 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
if (_environment == local_config.AppEnvironment.demo) {
// ignore: inference_failure_on_instance_creation
await Future.delayed(const Duration(milliseconds: 50));
// After delay, re-attempt to read the preferences.
// This is crucial because migration might have completed during the delay.
// After delay, re-attempt to read the preferences. This is crucial
// because migration might have completed during the delay.
try {
final migratedPreferences = await _userContentPreferencesRepository
.read(id: event.userId, userId: event.userId);
emit(
state.copyWith(
status: AccountStatus.success,
preferences: migratedPreferences,
clearErrorMessage: true,
clearError: true,
),
);
return; // Exit if successfully read after migration
} on NotFoundException {
// Still not found after delay, proceed to create default.
print(
_logger.info(
'[AccountBloc] UserContentPreferences still not found after '
'migration delay. Creating default preferences.',
);
}
}
// If preferences not found (either initially or after re-attempt),
// create a default one for the user.
final defaultPreferences = UserContentPreferences(id: event.userId);
// If preferences not found (either initially or after re-attempt), create
// a default one for the user.
final defaultPreferences = UserContentPreferences(
id: event.userId,
followedCountries: const [],
followedSources: const [],
followedTopics: const [],
savedHeadlines: const [],
);
try {
await _userContentPreferencesRepository.create(
item: defaultPreferences,
userId: event.userId,
);
emit(
state.copyWith(
status: AccountStatus.success,
preferences: defaultPreferences,
clearErrorMessage: true,
clearError: true,
status: AccountStatus.success,
),
);
} on ConflictException {
// If a conflict occurs during creation (e.g., another process
// created it concurrently), attempt to read it again to get the
// existing one. This can happen if the migration service
// created it right after the second NotFoundException.
print(
// created it concurrently), attempt to read it again to get the existing
// one. This can happen if the migration service created it right after
// the second NotFoundException.
_logger.info(
'[AccountBloc] Conflict during creation of UserContentPreferences. '
'Attempting to re-read.',
);
Expand All @@ -137,26 +146,44 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: existingPreferences,
clearErrorMessage: true,
clearError: true,
),
);
} catch (e) {
} on HtHttpException catch (e) {
_logger.severe(
'Failed to create default preferences with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'Failed to create default preferences with unexpected error: $e',
e,
st,
);
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'Failed to create default preferences: $e',
error: OperationFailedException(
'Failed to create default preferences: $e',
),
),
);
}
} on HtHttpException catch (e) {
emit(
state.copyWith(status: AccountStatus.failure, errorMessage: e.message),
_logger.severe(
'AccountLoadUserPreferences failed with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'AccountLoadUserPreferences failed with unexpected error: $e',
e,
st,
);
} catch (e) {
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'An unexpected error occurred.',
error: OperationFailedException('An unexpected error occurred: $e'),
),
);
}
Expand Down Expand Up @@ -197,46 +224,51 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: updatedPrefs,
clearErrorMessage: true,
clearError: true,
),
);
} on HtHttpException catch (e) {
emit(
state.copyWith(status: AccountStatus.failure, errorMessage: e.message),
_logger.severe(
'AccountSaveHeadlineToggled failed with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'AccountSaveHeadlineToggled failed with unexpected error: $e',
e,
st,
);
} catch (e) {
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'Failed to update saved headlines.',
error: OperationFailedException(
'Failed to update saved headlines: $e',
),
),
);
}
}

Future<void> _onAccountFollowCategoryToggled(
AccountFollowCategoryToggled event,
Future<void> _onAccountFollowTopicToggled(
AccountFollowTopicToggled event,
Emitter<AccountState> emit,
) async {
if (state.user == null || state.preferences == null) return;
emit(state.copyWith(status: AccountStatus.loading));

final currentPrefs = state.preferences!;
final isCurrentlyFollowed = currentPrefs.followedCategories.any(
(c) => c.id == event.category.id,
final isCurrentlyFollowed = currentPrefs.followedTopics.any(
(t) => t.id == event.topic.id,
);
final List<Category> updatedFollowedCategories;
final List<Topic> updatedFollowedTopics;

if (isCurrentlyFollowed) {
updatedFollowedCategories = List.from(currentPrefs.followedCategories)
..removeWhere((c) => c.id == event.category.id);
} else {
updatedFollowedCategories = List.from(currentPrefs.followedCategories)
..add(event.category);
}
updatedFollowedTopics = isCurrentlyFollowed
? (List.from(currentPrefs.followedTopics)
..removeWhere((t) => t.id == event.topic.id))
: (List.from(currentPrefs.followedTopics)..add(event.topic));

final updatedPrefs = currentPrefs.copyWith(
followedCategories: updatedFollowedCategories,
followedTopics: updatedFollowedTopics,
);

try {
Expand All @@ -249,18 +281,26 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: updatedPrefs,
clearErrorMessage: true,
clearError: true,
),
);
} on HtHttpException catch (e) {
emit(
state.copyWith(status: AccountStatus.failure, errorMessage: e.message),
_logger.severe(
'AccountFollowTopicToggled failed with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'AccountFollowTopicToggled failed with unexpected error: $e',
e,
st,
);
} catch (e) {
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'Failed to update followed categories.',
error: OperationFailedException(
'Failed to update followed topics: $e',
),
),
);
}
Expand Down Expand Up @@ -301,33 +341,45 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: updatedPrefs,
clearErrorMessage: true,
clearError: true,
),
);
} on HtHttpException catch (e) {
emit(
state.copyWith(status: AccountStatus.failure, errorMessage: e.message),
_logger.severe(
'AccountFollowSourceToggled failed with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'AccountFollowSourceToggled failed with unexpected error: $e',
e,
st,
);
} catch (e) {
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'Failed to update followed sources.',
error: OperationFailedException(
'Failed to update followed sources: $e',
),
),
);
}
}

// _onAccountFollowCountryToggled method removed

Future<void> _onAccountClearUserPreferences(
AccountClearUserPreferences event,
Emitter<AccountState> emit,
) async {
emit(state.copyWith(status: AccountStatus.loading));
try {
// Create a new default preferences object to "clear" existing ones
final defaultPreferences = UserContentPreferences(id: event.userId);
final defaultPreferences = UserContentPreferences(
id: event.userId,
followedCountries: const [],
followedSources: const [],
followedTopics: const [],
savedHeadlines: const [],
);
await _userContentPreferencesRepository.update(
id: event.userId,
item: defaultPreferences,
Expand All @@ -337,18 +389,26 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
state.copyWith(
status: AccountStatus.success,
preferences: defaultPreferences,
clearErrorMessage: true,
clearError: true,
),
);
} on HtHttpException catch (e) {
emit(
state.copyWith(status: AccountStatus.failure, errorMessage: e.message),
_logger.severe(
'AccountClearUserPreferences failed with HtHttpException: $e',
);
emit(state.copyWith(status: AccountStatus.failure, error: e));
} catch (e, st) {
_logger.severe(
'AccountClearUserPreferences failed with unexpected error: $e',
e,
st,
);
} catch (e) {
emit(
state.copyWith(
status: AccountStatus.failure,
errorMessage: 'Failed to clear user preferences.',
error: OperationFailedException(
'Failed to clear user preferences: $e',
),
),
);
}
Expand Down
8 changes: 4 additions & 4 deletions lib/account/bloc/account_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ class AccountSaveHeadlineToggled extends AccountEvent {
List<Object> get props => [headline];
}

class AccountFollowCategoryToggled extends AccountEvent {
const AccountFollowCategoryToggled({required this.category});
final Category category;
class AccountFollowTopicToggled extends AccountEvent {
const AccountFollowTopicToggled({required this.topic});
final Topic topic;

@override
List<Object> get props => [category];
List<Object> get props => [topic];
}

class AccountFollowSourceToggled extends AccountEvent {
Expand Down
Loading
Loading