getData method
Implementation
Future<Map<String, Map<String, String>>> getData() async {
if (_sheet == null) await _connect();
await _initHeaders();
// we need keys and other valid locales != master
// trace('getting data, remote headers: ', remoteHeader, localHeader);
// trace('master', masterLanguage, masterLanguageCol);
trace('Requesting translated locales from GSheet ...');
/// TODO: query the rows that we need.
var ranges = <String>[];
for (var k in localHeader) {
if (k == masterLanguage) continue;
var col = remoteHeader.indexOf(k) + 1;
// trace( "key: ", k, " index: ", col , ' col: ', _getColumnLetter(col));
var colLetter = _getColumnLetter(col);
var range = '${colLetter}1:$colLetter';
ranges.add(range);
}
// var res = await _table.batchGet(['A1:A', 'C1:C', 'E1:E2000']);
final result = await _table.batchGet(ranges);
trace('Remote locales received.');
/// assure keys is 1st in list.
var keys = result.firstWhere((element) => element[0] == 'keys');
keys.removeAt(0);
result.remove(keys);
const loadingTranslation = 'Loading...';
/// make the map.
var output = <String, Map<String, String>>{};
var isLoadingTranslations = false;
var mapLoading = <String, bool>{};
for (var langCol in result) {
var headerKey = langCol.removeAt(0);
mapLoading[headerKey] = false;
final localMap = output[headerKey] = <String, String>{};
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var value = i >= langCol.length ? '' : langCol[i];
if (value.contains(loadingTranslation) &&
mapLoading[headerKey] == false) {
mapLoading[headerKey] = true;
trace('$headerKey still is loading translations...');
isLoadingTranslations = true;
}
localMap[key] = value;
}
}
if (isLoadingTranslations) {
trace(
'Translations are still loading in the sheet, please, run the cli again.');
}
return output;
}