getData method

Future<Map<String, Map<String, String>>> getData()

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;
}