loadState method
Implementation
Future<Map<String, dynamic>> loadState(String atSign) async {
await ensureReady();
final normalized = normalizeAtSign(atSign);
final file = _fileForAtSign(normalized);
if (!await file.exists()) {
final legacyFile = _legacyFileForAtSign(normalized);
if (await legacyFile.exists()) {
try {
final legacyContents = await legacyFile.readAsString();
await file.writeAsString(legacyContents);
} catch (_) {
// Fall back to the default empty state below.
}
}
}
if (!await file.exists()) {
return {
'atSign': normalized,
'otpHistory': <Map<String, dynamic>>[],
'autoApprovalServices': <Map<String, dynamic>>[],
'history': <Map<String, dynamic>>[],
};
}
try {
final raw = await file.readAsString();
if (raw.trim().isEmpty) {
return {'atSign': normalized, 'otpHistory': <Map<String, dynamic>>[]};
}
final decoded = jsonDecode(raw);
if (decoded is Map<String, dynamic>) {
return {
'atSign': normalized,
'otpHistory': _normalizeOtpHistory(decoded['otpHistory']),
'autoApprovalServices': _normalizeAutoApprovalServices(
decoded['autoApprovalServices'],
),
'history': _normalizeHistory(decoded['history']),
...decoded,
};
}
if (decoded is Map) {
final casted = decoded.cast<String, dynamic>();
return {
'atSign': normalized,
'otpHistory': _normalizeOtpHistory(casted['otpHistory']),
'autoApprovalServices': _normalizeAutoApprovalServices(
casted['autoApprovalServices'],
),
'history': _normalizeHistory(casted['history']),
...casted,
};
}
} catch (_) {
// Fall back to an empty state.
}
return {
'atSign': normalized,
'otpHistory': <Map<String, dynamic>>[],
'autoApprovalServices': <Map<String, dynamic>>[],
'history': <Map<String, dynamic>>[],
};
}