Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ final class Dependencies extends DependencyProvider {
get<ProposalService>(),
get<DocumentMapper>(),
get<DownloaderService>(),
get<UserService>(),
);
})
..registerFactory<ProposalBuilderBloc>(() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,56 @@ import 'dart:async';
import 'package:catalyst_voices/common/error_handler.dart';
import 'package:catalyst_voices/common/signal_handler.dart';
import 'package:catalyst_voices/pages/campaign_phase_aware/proposal_submission_phase_aware.dart';
import 'package:catalyst_voices/pages/workspace/header/workspace_header.dart';
import 'package:catalyst_voices/pages/workspace/page/workspace_error.dart';
import 'package:catalyst_voices/pages/workspace/page/workspace_loading.dart';
import 'package:catalyst_voices/pages/workspace/page/workspace_user_proposals.dart';
import 'package:catalyst_voices/pages/workspace/submission_closing_warning_dialog.dart';
import 'package:catalyst_voices/pages/workspace/widgets/header/workspace_header.dart';
import 'package:catalyst_voices/pages/workspace/widgets/workspace_content.dart';
import 'package:catalyst_voices/routes/routing/proposal_builder_route.dart';
import 'package:catalyst_voices/routes/routing/spaces_route.dart';
import 'package:catalyst_voices/widgets/snackbar/common_snackbars.dart';
import 'package:catalyst_voices/widgets/snackbar/voices_snackbar.dart';
import 'package:catalyst_voices/widgets/snackbar/voices_snackbar_type.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_view_models/catalyst_voices_view_models.dart';
import 'package:flutter/material.dart';

class WorkspacePage extends StatefulWidget {
const WorkspacePage({super.key});
final WorkspacePageTab? tab;

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

@override
State<WorkspacePage> createState() => _WorkspacePageState();
}

class _WorkspacePageState extends State<WorkspacePage>
with
TickerProviderStateMixin,
SignalHandlerStateMixin<WorkspaceBloc, WorkspaceSignal, WorkspacePage>,
ErrorHandlerStateMixin<WorkspaceBloc, WorkspacePage> {
late final VoicesTabController<WorkspacePageTab> _tabController;

@override
Widget build(BuildContext context) {
return const ProposalSubmissionPhaseAware(
return ProposalSubmissionPhaseAware(
activeChild: Scaffold(
body: WorkspaceLoading(
child: CustomScrollView(
slivers: [
SliverToBoxAdapter(
const SliverToBoxAdapter(
child: SizedBox(height: 10),
),
SliverToBoxAdapter(
const SliverToBoxAdapter(
child: WorkspaceHeader(),
),
SliverToBoxAdapter(
const SliverToBoxAdapter(
child: WorkspaceError(),
),
WorkspaceUserProposals(),
SliverToBoxAdapter(
WorkspaceContent(tabController: _tabController),
const SliverToBoxAdapter(
child: SizedBox(height: 50),
),
],
Expand All @@ -55,6 +62,23 @@ class _WorkspacePageState extends State<WorkspacePage>
);
}

@override
void didUpdateWidget(WorkspacePage oldWidget) {
super.didUpdateWidget(oldWidget);

final tab = widget.tab ?? WorkspacePageTab.proposals;

if (widget.tab != oldWidget.tab) {
_tabController.animateToTab(tab);
}
}

@override
void dispose() {
_tabController.dispose();
super.dispose();
}

@override
void handleError(Object error) {
if (error is LocalizedProposalDeletionException) {
Expand All @@ -67,6 +91,8 @@ class _WorkspacePageState extends State<WorkspacePage>
@override
void handleSignal(WorkspaceSignal signal) {
switch (signal) {
case ChangeTabWorkspaceSignal(:final tab):
_updateRoute(tab: tab);
case ImportedProposalWorkspaceSignal():
unawaited(
ProposalBuilderRoute.fromRef(ref: signal.proposalRef).push(context),
Expand All @@ -90,8 +116,21 @@ class _WorkspacePageState extends State<WorkspacePage>
final bloc = context.read<WorkspaceBloc>();
// ignore: cascade_invocations
bloc
..add(const WatchUserCatalystIdEvent())
..add(const WatchUserProposalsEvent())
..add(const GetTimelineItemsEvent());

final selectedTab = _determineTab(widget.tab);

_tabController = VoicesTabController(
initialTab: selectedTab,
tabs: WorkspacePageTab.values,
vsync: this,
);
}

WorkspacePageTab _determineTab(WorkspacePageTab? initialTab) {
return initialTab ?? widget.tab ?? WorkspacePageTab.proposals;
}

void _dontShowCampaignSubmissionClosingDialog(bool value) {
Expand Down Expand Up @@ -138,4 +177,16 @@ class _WorkspacePageState extends State<WorkspacePage>
dontShowAgain: _dontShowCampaignSubmissionClosingDialog,
);
}

void _updateRoute({
WorkspacePageTab? tab,
}) {
Router.neglect(context, () {
final effectiveTab = tab ?? widget.tab;

WorkspaceRoute(
tab: effectiveTab?.name,
).replace(context);
});
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:typed_data';

import 'package:catalyst_voices/common/ext/build_context_ext.dart';
import 'package:catalyst_voices/common/ext/space_ext.dart';
import 'package:catalyst_voices/pages/workspace/header/workspace_timeline.dart';
import 'package:catalyst_voices/pages/workspace/widgets/header/workspace_timeline.dart';
import 'package:catalyst_voices/widgets/buttons/create_proposal_button.dart';
import 'package:catalyst_voices/widgets/widgets.dart';
import 'package:catalyst_voices_assets/catalyst_voices_assets.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:catalyst_voices/common/ext/build_context_ext.dart';
import 'package:catalyst_voices/pages/workspace/header/workspace_campaign_timeline.dart';
import 'package:catalyst_voices/pages/workspace/widgets/header/workspace_campaign_timeline.dart';
import 'package:catalyst_voices/routes/routing/spaces_route.dart';
import 'package:catalyst_voices/widgets/gesture/voices_gesture_detector.dart';
import 'package:catalyst_voices_assets/catalyst_voices_assets.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import 'package:catalyst_voices/common/ext/build_context_ext.dart';
import 'package:catalyst_voices/widgets/empty_state/empty_state.dart';
import 'package:catalyst_voices/widgets/images/voices_image_scheme.dart';
import 'package:catalyst_voices_assets/catalyst_voices_assets.dart';
import 'package:catalyst_voices_blocs/catalyst_voices_blocs.dart';
import 'package:catalyst_voices_localization/catalyst_voices_localization.dart';
import 'package:catalyst_voices_view_models/catalyst_voices_view_models.dart';
import 'package:flutter/material.dart';

class UserProposalInvitesSection extends StatelessWidget {
const UserProposalInvitesSection({super.key});

@override
Widget build(BuildContext context) {
return BlocSelector<WorkspaceBloc, WorkspaceState, UserProposalInvites>(
selector: (state) {
return state.userProposalInvites.pendingInvites;
},
builder: (context, invites) {
return _PendingProposalInvites(invites: invites);
},
);
}
}

class _EmptyProposalInvites extends StatelessWidget {
const _EmptyProposalInvites();

@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: EmptyState(
title: Text(context.l10n.noPendingInvitesMessage),
image: VoicesImagesScheme(
image: VoicesAssets.images.svg.noProposalForeground.buildPicture(),
background: Container(
height: 180,
decoration: BoxDecoration(
color: context.colors.onSurfaceNeutral08,
shape: BoxShape.circle,
),
),
),
),
);
}
}

class _PendingProposalInvites extends StatelessWidget {
final UserProposalInvites invites;

const _PendingProposalInvites({required this.invites});

@override
Widget build(BuildContext context) {
if (invites.items.isEmpty) {
return const _EmptyProposalInvites();
}

return SliverList.builder(
itemCount: invites.items.length,
itemBuilder: (context, index) {
// final item = invites.items[index];

// TODO(LynxLynxx): Return invite widget
return const Text('');
},
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:catalyst_voices/pages/workspace/user_proposals/proposal_card/workspace_proposal_card.dart';
import 'package:catalyst_voices/pages/workspace/widgets/user_proposals/proposal_card/workspace_proposal_card.dart';
import 'package:catalyst_voices/widgets/headers/section_learn_more_header.dart';
import 'package:catalyst_voices_view_models/catalyst_voices_view_models.dart';
import 'package:flutter/foundation.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import 'package:catalyst_voices/common/constants/constants.dart';
import 'package:catalyst_voices/common/ext/build_context_ext.dart';
import 'package:catalyst_voices/pages/workspace/user_proposals/user_proposal_section.dart';
import 'package:catalyst_voices/widgets/widgets.dart';
import 'package:catalyst_voices/pages/workspace/widgets/user_proposals/user_proposal_section.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';
Expand All @@ -13,51 +11,14 @@ class UserProposals extends StatelessWidget {

@override
Widget build(BuildContext context) {
return const SliverPadding(
padding: EdgeInsets.symmetric(horizontal: 32),
sliver: SliverMainAxisGroup(
slivers: <Widget>[
SliverToBoxAdapter(
child: _Header(),
),
SliverToBoxAdapter(
child: _Divider(),
),
SliverToBoxAdapter(
child: SizedBox(height: 20),
),
_UserSubmittedProposals(),
_UserDraftProposals(),
_UserLocalProposals(),
_UserInactiveProposals(),
],
),
);
}
}

class _Divider extends StatelessWidget {
const _Divider();

@override
Widget build(BuildContext context) {
return VoicesDivider(
indent: 0,
endIndent: 0,
height: 24,
color: context.colorScheme.primary,
);
}
}

class _Header extends StatelessWidget {
const _Header();

@override
Widget build(BuildContext context) {
return Text(
context.l10n.myProposals,
style: context.textTheme.headlineSmall,
return BlocSelector<WorkspaceBloc, WorkspaceState, bool>(
selector: (state) => state.showProposals,
builder: (context, show) {
if (!show) {
return const SliverToBoxAdapter(child: SizedBox.shrink());
}
return const _UserProposals();
},
);
}
}
Expand Down Expand Up @@ -130,6 +91,22 @@ class _UserLocalProposals extends StatelessWidget {
}
}

class _UserProposals extends StatelessWidget {
const _UserProposals();

@override
Widget build(BuildContext context) {
return const SliverMainAxisGroup(
slivers: <Widget>[
_UserSubmittedProposals(),
_UserDraftProposals(),
_UserLocalProposals(),
_UserInactiveProposals(),
],
);
}
}

class _UserSubmittedProposals extends StatelessWidget {
const _UserSubmittedProposals();

Expand Down
Loading
Loading