EnakPoint & EnakCoin wallet, PIN, outlet, order, community, reward

- Wallet EnakPoint & EnakCoin: beranda, riwayat, saldo kedaluwarsa, kode
  bayar, tukar EnakCoin, transfer
- PIN (buat, ganti, lupa), outlet, riwayat order, game spin
- Halaman community, webview, coming soon, dan ikon menu beranda baru
- Redesign Reward Saya: kartu tiket, filter chip, detail kode + QR
- Hapus customer point loader, menu, dan checkout lama
- Base URL ke enaklo-pos-api.altru.id

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
efrilm
2026-10-01 01:43:22 +07:00
co-authored by Claude Opus 5.5
parent 5954510b93
commit f5e3075205
253 changed files with 47212 additions and 17437 deletions
+15 -4
View File
@@ -17,6 +17,7 @@ import 'interceptors/bad_request_interceptor.dart';
import 'interceptors/connection_timeout_interceptor.dart';
import 'interceptors/internal_server_interceptor.dart';
import 'interceptors/not_found_interceptor.dart';
import 'interceptors/sensitive_aware_log_interceptor.dart';
import 'interceptors/unauthorized_interceptor.dart';
@lazySingleton
@@ -37,10 +38,12 @@ class ApiClient {
if (kDebugMode) {
_dio.interceptors.add(
AwesomeDioInterceptor(
logResponseHeaders: false,
logRequestTimeout: false,
logRequestHeaders: true,
SensitiveAwareLogInterceptor(
AwesomeDioInterceptor(
logResponseHeaders: false,
logRequestTimeout: false,
logRequestHeaders: true,
),
),
);
}
@@ -54,6 +57,7 @@ class ApiClient {
bool followRedirects = true,
bool Function(int?)? validateStatus,
String? contentType,
Map<String, dynamic>? extra,
}) async {
try {
return await _dio.post(
@@ -64,6 +68,7 @@ class ApiClient {
followRedirects: followRedirects,
validateStatus: validateStatus,
contentType: contentType,
extra: extra,
),
queryParameters: params,
);
@@ -103,6 +108,7 @@ class ApiClient {
bool followRedirects = true,
bool Function(int?)? validateStatus,
String? contentType,
Map<String, dynamic>? extra,
}) async {
try {
return await _dio.get(
@@ -112,6 +118,7 @@ class ApiClient {
followRedirects: followRedirects,
validateStatus: validateStatus,
contentType: contentType,
extra: extra,
),
queryParameters: params,
);
@@ -153,6 +160,7 @@ class ApiClient {
bool Function(int?)? validateStatus,
String? contentType,
void Function(int count, int total)? onSendProgress,
Map<String, dynamic>? extra,
}) async {
try {
return await _dio.put(
@@ -163,6 +171,7 @@ class ApiClient {
followRedirects: followRedirects,
validateStatus: validateStatus,
contentType: contentType,
extra: extra,
),
queryParameters: params,
onSendProgress: onSendProgress,
@@ -204,6 +213,7 @@ class ApiClient {
bool followRedirects = true,
bool Function(int?)? validateStatus,
String? contentType,
Map<String, dynamic>? extra,
}) async {
try {
return await _dio.delete(
@@ -214,6 +224,7 @@ class ApiClient {
followRedirects: followRedirects,
validateStatus: validateStatus,
contentType: contentType,
extra: extra,
),
queryParameters: params,
);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,32 @@
import 'package:dio/dio.dart';
/// Key untuk `Options.extra` yang menandai request berisi data rahasia
/// (PIN, OTP). Request bertanda ini tidak dicetak ke log sama sekali.
const String kSensitiveRequest = 'sensitive';
class SensitiveAwareLogInterceptor extends Interceptor {
final Interceptor _logger;
SensitiveAwareLogInterceptor(this._logger);
bool _isSensitive(RequestOptions options) =>
options.extra[kSensitiveRequest] == true;
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
if (_isSensitive(options)) return handler.next(options);
_logger.onRequest(options, handler);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
if (_isSensitive(response.requestOptions)) return handler.next(response);
_logger.onResponse(response, handler);
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
if (_isSensitive(err.requestOptions)) return handler.next(err);
_logger.onError(err, handler);
}
}