Skip to content
Merged
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
2 changes: 1 addition & 1 deletion client/lib/base/base_rail.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class BaseRail extends HookConsumerWidget {
),
NavigationRailDestination(
icon: Icon(Icons.analytics),
label: Text('Stats'),
label: Text('Statistics'),
),
],
),
Expand Down
2 changes: 1 addition & 1 deletion client/lib/generated/api/api.pb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export 'location.pb.dart';
export 'schedule.pb.dart';
export 'session.pb.dart';
export 'settings.pb.dart';
export 'stats.pb.dart';
export 'statistics.pb.dart';
export 'team_member.pb.dart';
export 'user.pb.dart';

Expand Down
2 changes: 1 addition & 1 deletion client/lib/generated/api/api.pbenum.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ export 'location.pbenum.dart';
export 'schedule.pbenum.dart';
export 'session.pbenum.dart';
export 'settings.pbenum.dart';
export 'stats.pbenum.dart';
export 'statistics.pbenum.dart';
export 'team_member.pbenum.dart';
export 'user.pbenum.dart';
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// This is a generated file - do not edit.
//
// Generated from api/stats.proto.
// Generated from api/statistics.proto.

// @dart = 3.3

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// This is a generated file - do not edit.
//
// Generated from api/stats.proto.
// Generated from api/statistics.proto.

// @dart = 3.3

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// This is a generated file - do not edit.
//
// Generated from api/stats.proto.
// Generated from api/statistics.proto.

// @dart = 3.3

Expand All @@ -16,12 +16,12 @@ import 'dart:core' as $core;
import 'package:grpc/service_api.dart' as $grpc;
import 'package:protobuf/protobuf.dart' as $pb;

import 'stats.pb.dart' as $0;
import 'statistics.pb.dart' as $0;

export 'stats.pb.dart';
export 'statistics.pb.dart';

@$pb.GrpcServiceName('tk.api.StatsService')
class StatsServiceClient extends $grpc.Client {
@$pb.GrpcServiceName('tk.api.StatisticsService')
class StatisticsServiceClient extends $grpc.Client {
/// The hostname for this service.
static const $core.String defaultHost = '';

Expand All @@ -30,7 +30,7 @@ class StatsServiceClient extends $grpc.Client {
'',
];

StatsServiceClient(super.channel, {super.options, super.interceptors});
StatisticsServiceClient(super.channel, {super.options, super.interceptors});

$grpc.ResponseFuture<$0.GetLeaderboardResponse> getLeaderboard(
$0.GetLeaderboardRequest request, {
Expand All @@ -43,16 +43,16 @@ class StatsServiceClient extends $grpc.Client {

static final _$getLeaderboard =
$grpc.ClientMethod<$0.GetLeaderboardRequest, $0.GetLeaderboardResponse>(
'/tk.api.StatsService/GetLeaderboard',
'/tk.api.StatisticsService/GetLeaderboard',
($0.GetLeaderboardRequest value) => value.writeToBuffer(),
$0.GetLeaderboardResponse.fromBuffer);
}

@$pb.GrpcServiceName('tk.api.StatsService')
abstract class StatsServiceBase extends $grpc.Service {
$core.String get $name => 'tk.api.StatsService';
@$pb.GrpcServiceName('tk.api.StatisticsService')
abstract class StatisticsServiceBase extends $grpc.Service {
$core.String get $name => 'tk.api.StatisticsService';

StatsServiceBase() {
StatisticsServiceBase() {
$addMethod($grpc.ServiceMethod<$0.GetLeaderboardRequest,
$0.GetLeaderboardResponse>(
'GetLeaderboard',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// This is a generated file - do not edit.
//
// Generated from api/stats.proto.
// Generated from api/statistics.proto.

// @dart = 3.3

Expand Down
17 changes: 17 additions & 0 deletions client/lib/helpers/kiosk_mode_native.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:window_manager/window_manager.dart';

bool get isKioskModeSupported => true;

Future<void> enableKioskMode() async {
await windowManager.ensureInitialized();
await windowManager.setFullScreen(true);
await windowManager.setAlwaysOnTop(true);
await windowManager.setPreventClose(true);
}

Future<void> disableKioskMode() async {
await windowManager.ensureInitialized();
await windowManager.setPreventClose(false);
await windowManager.setAlwaysOnTop(false);
await windowManager.setFullScreen(false);
}
5 changes: 5 additions & 0 deletions client/lib/helpers/kiosk_mode_stub.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
bool get isKioskModeSupported => false;

Future<void> enableKioskMode() async {}

Future<void> disableKioskMode() async {}
5 changes: 5 additions & 0 deletions client/lib/helpers/kiosk_mode_web.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
bool get isKioskModeSupported => false;

Future<void> enableKioskMode() async {}

Future<void> disableKioskMode() async {}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import 'package:time_keeper/generated/db/db.pb.dart';

/// Time range filter for the stats dashboard.
enum StatsRange { day, week, month, all }
/// Time range filter for the statistics dashboard.
enum StatisticsRange { day, week, month, all }

String statsRangeLabel(StatsRange range) {
String statisticsRangeLabel(StatisticsRange range) {
switch (range) {
case StatsRange.day:
case StatisticsRange.day:
return 'Today';
case StatsRange.week:
case StatisticsRange.week:
return 'This Week';
case StatsRange.month:
case StatisticsRange.month:
return 'This Month';
case StatsRange.all:
case StatisticsRange.all:
return 'All Time';
}
}
Expand Down
39 changes: 39 additions & 0 deletions client/lib/providers/kiosk_mode_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:time_keeper/helpers/local_storage.dart';
import 'package:time_keeper/utils/logger.dart';

import 'package:time_keeper/helpers/kiosk_mode_stub.dart'
if (dart.library.io) 'package:time_keeper/helpers/kiosk_mode_native.dart'
if (dart.library.js_interop) 'package:time_keeper/helpers/kiosk_mode_web.dart';

part 'kiosk_mode_provider.g.dart';

@Riverpod(keepAlive: true)
class KioskMode extends _$KioskMode {
static const String _key = 'kiosk_mode';

Future<void> toggle() async {
final newValue = !state;
if (newValue) {
await enableKioskMode();
logger.i('Kiosk mode enabled');
} else {
await disableKioskMode();
logger.i('Kiosk mode disabled');
}
localStorage.setBool(_key, newValue);
state = newValue;
}

@override
bool build() {
final stored = localStorage.getBool(_key) ?? false;

// Restore kiosk mode on app start if it was previously enabled
if (stored && isKioskModeSupported) {
enableKioskMode();
}

return stored;
}
}
61 changes: 61 additions & 0 deletions client/lib/providers/kiosk_mode_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:time_keeper/generated/api/stats.pbgrpc.dart';
import 'package:time_keeper/generated/api/statistics.pbgrpc.dart';
import 'package:time_keeper/helpers/auth_interceptor.dart';
import 'package:time_keeper/providers/auth_provider.dart';
import 'package:time_keeper/providers/grpc_channel_provider.dart';

part 'stats_provider.g.dart';
part 'statistics_provider.g.dart';

@Riverpod(keepAlive: true)
StatsServiceClient statsService(Ref ref) {
StatisticsServiceClient statisticsService(Ref ref) {
final channel = ref.watch(grpcChannelProvider);
final token = ref.watch(tokenProvider);
final options = authCallOptions(token);

return StatsServiceClient(channel, options: options);
return StatisticsServiceClient(channel, options: options);
}

@riverpod
Future<GetLeaderboardResponse> leaderboard(Ref ref) async {
final client = ref.watch(statsServiceProvider);
final client = ref.watch(statisticsServiceProvider);
return client.getLeaderboard(GetLeaderboardRequest());
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion client/lib/router/app_routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ enum AppRoute {
team(path: '/team', name: 'team', railIndex: 2),
sessions(path: '/sessions', name: 'sessions', railIndex: 3),
locations(path: '/locations', name: 'locations', railIndex: 4),
stats(path: '/stats', name: 'stats', railIndex: 5);
statistics(path: '/statistics', name: 'statistics', railIndex: 5);

const AppRoute({
required this.path,
Expand Down
Loading
Loading