- 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>
41 lines
1.3 KiB
Dart
41 lines
1.3 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import '../../injection.dart';
|
|
import '../constant/local_storage_key.dart';
|
|
|
|
void dismissKeyboard(BuildContext context) {
|
|
final currentFocus = FocusScope.of(context);
|
|
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
}
|
|
}
|
|
|
|
String getNormalizePhone(String phoneNumber) {
|
|
final normalizedPhone = phoneNumber.startsWith('08')
|
|
? phoneNumber.replaceFirst('0', '')
|
|
: phoneNumber;
|
|
return '62$normalizedPhone';
|
|
}
|
|
|
|
/// UUID v4 acak dari [Random.secure], dipakai sebagai `Idempotency-Key`
|
|
/// dan `device_id`.
|
|
String generateUuidV4() {
|
|
final random = Random.secure();
|
|
final bytes = List<int>.generate(16, (_) => random.nextInt(256));
|
|
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
final hex = bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
|
|
return '${hex.substring(0, 8)}-${hex.substring(8, 12)}-'
|
|
'${hex.substring(12, 16)}-${hex.substring(16, 20)}-${hex.substring(20)}';
|
|
}
|
|
|
|
Map<String, dynamic> getAuthorizationHeader() {
|
|
return {
|
|
'Authorization':
|
|
'Bearer ${getIt<SharedPreferences>().getString(LocalStorageKey.token)}',
|
|
};
|
|
}
|