Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
41f2191
docs: capture initial times
damian-molinski Oct 14, 2025
71dc0fb
chore: remove cacheDocument
damian-molinski Oct 14, 2025
913dbfe
turn off logging
damian-molinski Oct 14, 2025
1d1df95
chore: use debugPrint instead of logger
damian-molinski Oct 14, 2025
64211fb
feat: bulk documents save
damian-molinski Oct 16, 2025
80ad2ac
batching sync
damian-molinski Oct 16, 2025
0d28bc3
chore: move exact ref resoling to getDocumentData instead of index
damian-molinski Oct 16, 2025
737c738
fix: DocumentRepository
damian-molinski Oct 16, 2025
61181ac
chore: simplify getting documents data
damian-molinski Oct 16, 2025
c46152b
remove getAllDocumentsRefs and getCachedDocumentsRefs from DocumentRe…
damian-molinski Oct 17, 2025
00e043d
chore: update docs
damian-molinski Oct 17, 2025
91b8e8a
Merge feat/face-performance-optimization-3352 into feat/documents_ind…
damian-molinski Oct 17, 2025
9cae1af
simplified document index endpoint
damian-molinski Oct 17, 2025
7fb96c4
remove randomness from LocalCatGateway
damian-molinski Oct 17, 2025
bf5ef8e
indexing by batch size
damian-molinski Oct 17, 2025
744e90f
wip: filtering by types
damian-molinski Oct 17, 2025
dbc6220
Rework filtering refs + checking all refs if already cached in parallel
damian-molinski Oct 20, 2025
cca0f61
docs
damian-molinski Oct 20, 2025
b44d0fa
update indexing.csv
damian-molinski Oct 20, 2025
3447cbb
update indexing csv
damian-molinski Oct 20, 2025
37b779b
Merge branch 'feat/face-performance-optimization-3352' into feat/docu…
damian-molinski Oct 20, 2025
7d5ca0f
chore: cleanup
damian-molinski Oct 20, 2025
87fce14
trailing new line
damian-molinski Oct 20, 2025
e6121ec
chore
damian-molinski Oct 20, 2025
abceccb
move performance tab to docs
damian-molinski Oct 21, 2025
e5d2d9e
bulk saving typed docs in parallel
damian-molinski Oct 21, 2025
8affeea
chore: revert hardcoded timestamp
damian-molinski Oct 21, 2025
c55fe99
chore: typos
damian-molinski Oct 21, 2025
7499081
Merge feat/face-performance-optimization-3352 into feat/documents_ind…
damian-molinski Oct 21, 2025
547429d
split _sync into smaller functions + add documentation
damian-molinski Oct 21, 2025
8c3fc8e
little refactor
damian-molinski Oct 21, 2025
d8f6674
fix: analyzer
damian-molinski Oct 21, 2025
e5ef512
Merge feat/face-performance-optimization-3352 into feat/database_opti…
damian-molinski Oct 23, 2025
206d2c1
initial v2 tables
damian-molinski Oct 24, 2025
6000884
wip
damian-molinski Oct 24, 2025
c35ee54
wip
damian-molinski Oct 27, 2025
cd4388f
feat: database migration
damian-molinski Oct 27, 2025
ddead17
Merge branch 'feat/database_optimization_3528' into feat/database_opt…
damian-molinski Oct 27, 2025
c1b325b
chore: cleanup
damian-molinski Oct 27, 2025
3cb81d0
bump batch size
damian-molinski Oct 27, 2025
665f47e
cleanup
damian-molinski Oct 27, 2025
33cda42
chore: remove defensive content decoding
damian-molinski Oct 27, 2025
a7ea4ed
chore: daos
damian-molinski Oct 27, 2025
ed01732
spelling
damian-molinski Oct 27, 2025
7f497ff
saveAll
damian-molinski Oct 27, 2025
be8233f
test on platform
damian-molinski Oct 27, 2025
d671da1
chore: update build scripts
damian-molinski Oct 27, 2025
92dfe47
oMerge branch 'feat/database_optimization_3528_part1' into feat/datab…
damian-molinski Oct 27, 2025
a5c681a
feat: DocumentsV2Dao methods
damian-molinski Oct 27, 2025
1f387b2
simple proposals pagination query
damian-molinski Oct 27, 2025
3b1fa7d
chore: create a JoinedProposalBriefEntity
damian-molinski Oct 27, 2025
ee54e67
rename method
damian-molinski Oct 27, 2025
6b9ab3c
feat: exclude hidden proposals
damian-molinski Oct 28, 2025
988a2e6
more tests
damian-molinski Oct 28, 2025
976a606
renaming and splitting logic into smaller parts
damian-molinski Oct 28, 2025
3dbaeed
feat: per language strategy
damian-molinski Oct 28, 2025
54229c3
remove CatalystDatabaseLanguage in favor of raw queries as they are e…
damian-molinski Oct 28, 2025
8c048ac
remove Index Strategy Documentation
damian-molinski Oct 29, 2025
93009d8
handle case where ref is empty
damian-molinski Oct 29, 2025
df39b3b
migration now includes indexes
damian-molinski Oct 29, 2025
3e8a137
use v2 documents table for saveAll and isCachedBulk
damian-molinski Oct 29, 2025
53cdd96
adds ActionType to JoinedProposalBriefEntity
damian-molinski Oct 29, 2025
a15b83c
adds versionIds to JoinedProposalBriefEntity
damian-molinski Oct 29, 2025
624a021
comments count
damian-molinski Oct 29, 2025
64e208b
adds isFavorite to JoinedProposalBriefEntity
damian-molinski Oct 29, 2025
7e9a9b0
add template to JoinedProposalBriefEntity
damian-molinski Oct 30, 2025
7cf109f
adds documentsLocalMetadata table for auto updates
damian-molinski Oct 30, 2025
1db5318
Update docs
damian-molinski Oct 30, 2025
2b404f0
use v2 proposals query for discovery most recent section
damian-molinski Oct 30, 2025
5e94d09
feat: simplify most recent proposals section
damian-molinski Oct 30, 2025
3ee0b22
add proposal fav status for v2 tables
damian-molinski Oct 30, 2025
4e3f95c
local proposal fav status update
damian-molinski Oct 30, 2025
37ccfc0
update fav state locally for faster feedback
damian-molinski Oct 30, 2025
37fd0ea
self review
damian-molinski Oct 31, 2025
6f1d412
fix tests
damian-molinski Oct 31, 2025
0c46ebc
update times
damian-molinski Oct 31, 2025
8f97f78
fix: analyzer
damian-molinski Oct 31, 2025
f2283b1
more migration test data
damian-molinski Oct 31, 2025
adb9b1a
clean up constructors
damian-molinski Oct 31, 2025
dd14d87
cleanup
damian-molinski Oct 31, 2025
a15d7ee
fix: template tests
damian-molinski Oct 31, 2025
fe18381
Merge branch 'feat/database_optimization_3528_part1' into feat/databa…
damian-molinski Oct 31, 2025
a30e83f
spelling
damian-molinski Oct 31, 2025
c5613a5
fix: spelling
damian-molinski Oct 31, 2025
2f5e8aa
Merge branch 'feat/database_optimization_3528_part1' into feat/databa…
damian-molinski Oct 31, 2025
3494db5
chore: PR review adjustments
damian-molinski Oct 31, 2025
f23144b
add order parameter
damian-molinski Oct 31, 2025
aa3946b
ProposalsOrder docs
damian-molinski Oct 31, 2025
ddaabbb
GetProposalsBriefPage supports order
damian-molinski Oct 31, 2025
b48c51a
add filters object
damian-molinski Oct 31, 2025
1a0fe4f
proposalsBriefPage filtering
damian-molinski Nov 2, 2025
1401e8f
fix: status filtering
damian-molinski Nov 2, 2025
2fbac90
more draft proposals filtering tests
damian-molinski Nov 2, 2025
73c02c7
Campaign proposals filter
damian-molinski Nov 2, 2025
d81c1cb
update docs
damian-molinski Nov 2, 2025
aa8c19c
expose getVisibleProposalsCount and tests
damian-molinski Nov 3, 2025
bfbe047
expose filters parameter
damian-molinski Nov 3, 2025
9fb55e6
integrate proposals page with v2 queries
damian-molinski Nov 3, 2025
964dc8f
chore: increase time diff between proposals
damian-molinski Nov 3, 2025
bbbe4ee
chore: reduce count query tables watched when not needed
damian-molinski Nov 3, 2025
7cd6cca
local proposals cubit
damian-molinski Nov 4, 2025
9014f00
local proposal fav staus update
damian-molinski Nov 4, 2025
e39e388
docs
damian-molinski Nov 4, 2025
a16db4f
fix: add discovery specific colors (#3637)
LynxLynxx Nov 4, 2025
627a948
fix code-generator earthly target
damian-molinski Nov 4, 2025
5c77e43
use logger in migration + wrap in transaction
damian-molinski Nov 4, 2025
b4a2ef9
Merge feat/database_optimization_3528_part1 into feat/database_optimi…
damian-molinski Nov 4, 2025
b74dee8
Merge branch 'feat/database_optimization_3528_part2' of github.com:in…
damian-molinski Nov 4, 2025
a37fe49
Merge branch 'feat/database_optimization_3528_part2' into feat/databa…
damian-molinski Nov 4, 2025
10c7fcf
spelling
damian-molinski Nov 4, 2025
dd23637
Merge feat/database_optimization_3528 into feat/database_optimization…
damian-molinski Nov 5, 2025
ece746c
Merge branch 'feat/database_optimization_3528' into feat/database_opt…
damian-molinski Nov 5, 2025
3ddcb22
rename category to categoryId for better consistency
damian-molinski Nov 5, 2025
ed6eb83
proposals per tab selector
damian-molinski Nov 5, 2025
d5ebc6a
release completed in close
damian-molinski Nov 5, 2025
452862e
extract early return logic into function
damian-molinski Nov 5, 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
3 changes: 0 additions & 3 deletions catalyst_voices/apps/voices/lib/app/view/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,6 @@ class _AppState extends State<App> {
BlocProvider<SessionCubit>(
create: (_) => Dependencies.instance.get<SessionCubit>(),
),
BlocProvider<ProposalsCubit>(
create: (_) => Dependencies.instance.get<ProposalsCubit>(),
),
BlocProvider<VotingCubit>(
create: (_) => Dependencies.instance.get<VotingCubit>(),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ final class Dependencies extends DependencyProvider {
blockchainConfig: get<AppConfig>().blockchain,
);
})
..registerLazySingleton<ProposalsCubit>(
..registerFactory<ProposalsCubit>(
() => ProposalsCubit(
get<UserService>(),
get<CampaignService>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';

import 'package:catalyst_voices/common/error_handler.dart';
import 'package:catalyst_voices/common/signal_handler.dart';
import 'package:catalyst_voices/dependency/dependencies.dart';
import 'package:catalyst_voices/pages/campaign_phase_aware/proposal_submission_phase_aware.dart';
import 'package:catalyst_voices/pages/proposals/widgets/proposals_content.dart';
import 'package:catalyst_voices/pages/proposals/widgets/proposals_header.dart';
Expand All @@ -17,7 +18,7 @@ import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

class ProposalsPage extends StatefulWidget {
final SignedDocumentRef? categoryId;
final String? categoryId;
final ProposalsPageTab? tab;

const ProposalsPage({
Expand All @@ -35,18 +36,28 @@ class _ProposalsPageState extends State<ProposalsPage>
TickerProviderStateMixin,
ErrorHandlerStateMixin<ProposalsCubit, ProposalsPage>,
SignalHandlerStateMixin<ProposalsCubit, ProposalsSignal, ProposalsPage> {
late final _cubit = Dependencies.instance.get<ProposalsCubit>();
late VoicesTabController<ProposalsPageTab> _tabController;
late final PagingController<ProposalBrief> _pagingController;
late final StreamSubscription<List<ProposalsPageTab>> _tabsSubscription;

@override
ProposalsCubit get errorEmitter => _cubit;

@override
ProposalsCubit get signalEmitter => _cubit;

@override
Widget build(BuildContext context) {
return ProposalSubmissionPhaseAware(
activeChild: HeaderAndContentLayout(
header: const ProposalsHeader(),
content: ProposalsContent(
tabController: _tabController,
pagingController: _pagingController,
return BlocProvider.value(
value: _cubit,
child: ProposalSubmissionPhaseAware(
activeChild: HeaderAndContentLayout(
header: const ProposalsHeader(),
content: ProposalsContent(
tabController: _tabController,
pagingController: _pagingController,
),
),
),
);
Expand All @@ -59,10 +70,9 @@ class _ProposalsPageState extends State<ProposalsPage>
final tab = widget.tab ?? ProposalsPageTab.total;

if (widget.categoryId != oldWidget.categoryId || widget.tab != oldWidget.tab) {
context.read<ProposalsCubit>().changeFilters(
onlyMy: Optional(tab == ProposalsPageTab.my),
category: Optional(widget.categoryId),
type: tab.filter,
_cubit.changeFilters(
categoryId: Optional(widget.categoryId),
tab: Optional(tab),
);

_doResetPagination();
Expand All @@ -75,6 +85,7 @@ class _ProposalsPageState extends State<ProposalsPage>

@override
void dispose() {
unawaited(_cubit.close());
_tabController.dispose();
_pagingController.dispose();
unawaited(_tabsSubscription.cancel());
Expand Down Expand Up @@ -105,9 +116,8 @@ class _ProposalsPageState extends State<ProposalsPage>
void initState() {
super.initState();

final proposalsCubit = context.read<ProposalsCubit>();
final sessionCubit = context.read<SessionCubit>();
final supportedTabs = _determineTabs(sessionCubit.state.isProposerUnlock, proposalsCubit.state);
final supportedTabs = _determineTabs(sessionCubit.state.isProposerUnlock, _cubit.state);
final selectedTab = _determineTab(supportedTabs, widget.tab);

_tabController = VoicesTabController(
Expand All @@ -123,15 +133,13 @@ class _ProposalsPageState extends State<ProposalsPage>

_tabsSubscription = Rx.combineLatest2(
sessionCubit.watchState().map((e) => e.isProposerUnlock),
proposalsCubit.watchState(),
_cubit.watchState(),
_determineTabs,
).distinct().listen(_updateTabsIfNeeded);

proposalsCubit.init(
onlyMyProposals: selectedTab == ProposalsPageTab.my,
category: widget.categoryId,
type: selectedTab.filter,
order: const Alphabetical(),
_cubit.init(
categoryId: widget.categoryId,
tab: widget.tab ?? ProposalsPageTab.total,
);

_pagingController
Expand Down Expand Up @@ -167,15 +175,15 @@ class _ProposalsPageState extends State<ProposalsPage>
ProposalBrief? lastProposalId,
) async {
final request = PageRequest(page: pageKey, size: pageSize);
await context.read<ProposalsCubit>().getProposals(request);
await _cubit.getProposals(request);
}

void _updateRoute({
Optional<String>? categoryId,
ProposalsPageTab? tab,
}) {
Router.neglect(context, () {
final effectiveCategoryId = categoryId.dataOr(widget.categoryId?.id);
final effectiveCategoryId = categoryId.dataOr(widget.categoryId);
final effectiveTab = tab?.name ?? widget.tab?.name;

ProposalsRoute(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@ class ProposalsPaginationTile extends StatelessWidget {
unawaited(route.push(context));
},
onFavoriteChanged: (isFavorite) {
context.read<ProposalsCubit>().onChangeFavoriteProposal(
proposal.selfRef,
isFavorite: isFavorite,
unawaited(
context.read<ProposalsCubit>().onChangeFavoriteProposal(
proposal.selfRef,
isFavorite: isFavorite,
),
);
},
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:catalyst_voices/widgets/tabbar/voices_tab_bar.dart';
import 'package:catalyst_voices/widgets/tabbar/voices_tab_controller.dart';
import 'package:catalyst_voices_blocs/catalyst_voices_blocs.dart';
import 'package:catalyst_voices_localization/catalyst_voices_localization.dart';
import 'package:catalyst_voices_models/catalyst_voices_models.dart';
import 'package:catalyst_voices_view_models/catalyst_voices_view_models.dart';
import 'package:flutter/material.dart';

Expand All @@ -15,29 +14,6 @@ class ProposalsTabs extends StatelessWidget {
required this.controller,
});

@override
Widget build(BuildContext context) {
return BlocSelector<ProposalsCubit, ProposalsState, ProposalsCount>(
selector: (state) => state.count,
builder: (context, state) {
return _ProposalsTabs(
data: state,
controller: controller,
);
},
);
}
}

class _ProposalsTabs extends StatelessWidget {
final ProposalsCount data;
final VoicesTabController<ProposalsPageTab> controller;

const _ProposalsTabs({
required this.data,
required this.controller,
});

@override
Widget build(BuildContext context) {
return VoicesTabBar(
Expand All @@ -51,13 +27,30 @@ class _ProposalsTabs extends StatelessWidget {
VoicesTab(
data: tab,
key: tab.tabKey(),
child: VoicesTabText(tab.noOf(context, count: data.ofType(tab.filter))),
child: _TabText(key: ValueKey('${tab.name}Text'), tab: tab),
),
],
);
}
}

class _TabText extends StatelessWidget {
final ProposalsPageTab tab;

const _TabText({
required super.key,
required this.tab,
});

@override
Widget build(BuildContext context) {
return BlocSelector<ProposalsCubit, ProposalsState, int>(
selector: (state) => state.count[tab] ?? 0,
builder: (context, state) => VoicesTabText(tab.noOf(context, count: state)),
);
}
}

extension on ProposalsPageTab {
String noOf(
BuildContext context, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,10 @@ final class ProposalsRoute extends GoRouteData with FadePageTransitionMixin {

@override
Widget build(BuildContext context, GoRouterState state) {
final categoryId = this.categoryId;
final categoryRef = categoryId != null ? SignedDocumentRef(id: categoryId) : null;

final tab = ProposalsPageTab.values.asNameMap()[this.tab];

return ProposalsPage(
categoryId: categoryRef,
categoryId: categoryId,
tab: tab,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class DiscoveryCubit extends Cubit<DiscoveryState> with BlocErrorEmitterMixin {
unawaited(_proposalsV2Sub?.cancel());

_proposalsV2Sub = _proposalService
.watchProposalsBriefPage(
.watchProposalsBriefPageV2(
request: const PageRequest(page: 0, size: _maxRecentProposalsCount),
)
.map((page) => page.items)
Expand Down
Loading