Skip to content
Merged

Dev #31

Show file tree
Hide file tree
Changes from all 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
5 changes: 4 additions & 1 deletion lib/features/overview/cubit/overview_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class OverviewCubit extends Cubit<OverviewState> {
try {
var stats =
await OverviewRepo().getSummaryStats(id: id, start: start, end: end);
logger.i(stats);
emit(state.copyWith(stats: stats, appState: AppState.complete));
} catch (e) {
emit(
Expand Down Expand Up @@ -52,7 +53,9 @@ class OverviewCubit extends Cubit<OverviewState> {
var res = await OverviewRepo().getPageviewStats(
id: id, unit: unit ?? state.unit, start: start, end: end);
emit(state.copyWith(pageview: res));
} catch (e) {
} catch (e, st) {
logger.i(e);
logger.i(st);
emit(
state.copyWith(errorMessage: e.toString(), appState: AppState.error));
}
Expand Down
2 changes: 1 addition & 1 deletion lib/features/overview/cubit/overview_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class OverviewState extends Equatable {
final Pageview? pageview;
const OverviewState(
{this.appState = AppState.initial,
this.metric = 'Url',
this.metric = 'Path',
this.unit = 'Day',
this.stats,
this.errorMessage,
Expand Down
1 change: 1 addition & 0 deletions lib/features/overview/repo/overview_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class OverviewRepo {
var res = await Requests.get(
endpoint:
'${Endpoints.websites}/$id/metrics?startAt=$startAt&endAt=$endAt&type=${metric.toLowerCase()}');
logger.d(res);
return Metric.toList(res);
}

Expand Down
61 changes: 44 additions & 17 deletions lib/features/overview/screens/overview_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -100,29 +100,56 @@ class _OverviewScreenState extends State<OverviewScreen> {
radius: 16,
fadeTheme: FadeTheme.light,
)
: StatCard(stat: state.stats!.entries.toList()[0]),
: StatCard(
stat: state.stats!.entries.first,
comp:
(state.stats!['comparison'] as Map<String, dynamic>)
.entries
.first,
),
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 15,
mainAxisSpacing: 15,
childAspectRatio: 1.3,
),
itemBuilder: (_, i) =>
state.stats == null || state.appState == AppState.loading
? FadeShimmer(
height: 8,
width: 150,
radius: 16,
fadeTheme: FadeTheme.light,
)
: StatCard(
stat: state.stats!.entries
.toList()
.getRange(1, state.stats!.length)
.toList()[i],
),
itemCount: (state.stats?.length ?? 5) - 1,
itemBuilder: (_, i) {
Map<String, dynamic> stats = {...state.stats ?? {}};
stats.removeWhere((key, value) => key == "comparison");

return state.stats == null ||
state.appState == AppState.loading
? FadeShimmer(
height: 8,
width: 150,
radius: 16,
fadeTheme: FadeTheme.light,
)
: StatCard(
stat: stats.entries
.toList()
.getRange(1, stats.length)
.toList()[i],
comp: (state.stats!['comparison']
as Map<String, dynamic>)
.entries
.toList()
.getRange(
1,
(state.stats!['comparison']
as Map<String, dynamic>)
.entries
.toList()
.length)
.toList()[i],
);
},
itemCount: (state.stats?.entries
.where((val) => val.key != 'comparison')
.length ??
5) -
1,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
),
Expand Down Expand Up @@ -161,7 +188,7 @@ class _OverviewScreenState extends State<OverviewScreen> {
removePadding: true,
selectedItem: state.metric,
items: [
'Url',
'Path',
'Referrer',
'Browser',
'OS',
Expand Down
15 changes: 10 additions & 5 deletions lib/features/overview/widgets/stat_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,20 @@ import '../../../widgets/container_wrapper.dart';

class StatCard extends StatelessWidget {
final MapEntry<String, dynamic> stat;
final MapEntry<String, dynamic> comp;

const StatCard({
super.key,
required this.stat,
required this.comp,
});

@override
Widget build(BuildContext context) {
double percentage = OverviewRepo().getPercentage(
current: stat.value['value'], previous: stat.value['prev']);
logger.i(stat);
logger.i(comp);
double percentage =
OverviewRepo().getPercentage(current: stat.value, previous: comp.value);
return ContainerWrapper(
padding: 15.0,
bRadius: 16,
Expand All @@ -28,15 +33,15 @@ class StatCard extends StatelessWidget {
style: kBodyTitleTextStyle.copyWith(color: kGreyColor)),
if (stat.key.toLowerCase() == 'totaltime')
FittedBox(
child: Text(formatDuration((stat.value as Map)['value']),
child: Text(formatDuration((stat.value)),
style: kTitleTextStyle.copyWith(
fontSize: kTitleTextStyle.fontSize! + 8)),
)
else
Text(NumberFormat.compact().format((stat.value as Map)['value']),
Text(NumberFormat.compact().format((stat.value)),
style: kTitleTextStyle.copyWith(
fontSize: kTitleTextStyle.fontSize! + 8)),
if (stat.value['prev'] != -1)
if (comp.value != -1)
Container(
padding: EdgeInsets.symmetric(horizontal: 14.0, vertical: 4),
decoration: BoxDecoration(
Expand Down
16 changes: 8 additions & 8 deletions lib/features/sessions/screens/session_details_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,14 @@ class _SessionDetailsScreenState extends State<SessionDetailsScreen> {
children: [
Expanded(
child: StatCard(
stat: MapEntry(
'views', {'value': widget.session.views, 'prev': -1}),
comp: MapEntry('pageviews', -1),
stat: MapEntry('pageviews', widget.session.views),
),
),
Expanded(
child: StatCard(
stat: MapEntry('visits',
{'value': widget.session.visits, 'prev': -1}),
comp: MapEntry('visits', -1),
stat: MapEntry('visits', widget.session.visits),
),
)
],
Expand All @@ -132,14 +132,14 @@ class _SessionDetailsScreenState extends State<SessionDetailsScreen> {
children: [
Expanded(
child: StatCard(
stat: MapEntry('events',
{'value': _session!.events, 'prev': -1}),
comp: MapEntry('events', -1),
stat: MapEntry('events', _session!.events),
),
),
Expanded(
child: StatCard(
stat: MapEntry('totaltime',
{'value': _session!.totaltime, 'prev': -1}),
comp: MapEntry('totaltime', -1),
stat: MapEntry('totaltime', _session!.totaltime),
),
)
],
Expand Down
1 change: 0 additions & 1 deletion lib/features/sessions/widget/session_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:pulse/features/sessions/screens/session_details_screen.dart';
import 'package:pulse/utils/colors.dart';
import 'package:pulse/utils/navigation.dart';
import 'package:pulse/utils/text.dart';
import 'package:pulse/utils/utils.dart';
import 'package:pulse/widgets/container_wrapper.dart';

import '../../../widgets/icon_btn.dart';
Expand Down
13 changes: 11 additions & 2 deletions lib/features/settings/screens/settings_screen.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:pulse/features/auth/repo/auth_repo.dart';
import 'package:pulse/features/settings/screens/model/btn.dart';
import 'package:pulse/utils/colors.dart';
Expand Down Expand Up @@ -78,9 +79,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
Links.goToLink('https://ericknamukolo.com');
},
),
Btn(
title: 'Coffee',
des: 'Buy me a coffe 🍵',
type: 'app',
icon: Bootstrap.cup_hot_fill,
click: () {
Links.goToLink('https://www.sonka.io/creator/erick');
},
),
// contact
Btn(
title: 'Help & Support',
title: 'Help & Support/Feature Suggestions',
des: 'Contact Me',
type: 'contact',
icon: Icons.contact_support_rounded,
Expand Down Expand Up @@ -109,7 +119,6 @@ class _SettingsScreenState extends State<SettingsScreen> {
}
},
),

Btn(
title: 'Logout',
des: 'Logout of your account',
Expand Down
8 changes: 7 additions & 1 deletion lib/features/websites/screens/websites_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:pulse/features/auth/repo/auth_repo.dart';
import 'package:pulse/features/settings/screens/settings_screen.dart';
import 'package:pulse/features/websites/cubit/website_cubit.dart';
import 'package:pulse/features/websites/screens/add_website_screen.dart';
Expand Down Expand Up @@ -77,7 +78,12 @@ class _WebsitesScreenState extends State<WebsitesScreen> {
icon: Icons.replay_outlined,
title: 'Refresh',
click: context.read<WebsiteCubit>().getWebsites,
)
),
MordernBtn(
icon: Icons.logout_rounded,
title: 'Logout',
click: () => AuthRepo().signOut(context),
),
],
)
: ListView.separated(
Expand Down
1 change: 0 additions & 1 deletion lib/utils/extensions.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:pulse/utils/utils.dart';

extension StringExtensions on String {
IconData get toDeviceIcon {
Expand Down
5 changes: 4 additions & 1 deletion lib/utils/requests.dart
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,14 @@ class Requests {
try {
http.Response res;
res = await fn.timeout(const Duration(seconds: 10));
logger.i(endpoint);

if (endpoint.contains('auth/login') && res.statusCode == 404) {
return throw Exception('Invalid host url');
}

if (res.statusCode != okStatusCode) {
logger.i(res.body);
logger.i(endpoint);
return throw Exception(
json.decode(res.body)?['error'] ?? 'Error occurred');
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: "A new Flutter project."
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev

version: 1.0.9+10
version: 1.0.12+13

environment:
sdk: ^3.6.1
Expand Down
Loading