refresh method

Future<bool> refresh()

Refreshes Spreadsheet.

Should be called if you believe, that spreadsheet has been changed by another user (such as added/deleted/renamed worksheets, or data that specified in SpreadsheetData changed).

Returns Future true in case of success.

Implementation

Future<bool> refresh() async {
  final response = await _client.get(
    '$_sheetsEndpoint$id'.toUri(),
  );

  if (response.statusCode == 200) {
    final json = jsonDecode(response.body);
    _data = SpreadsheetData._fromJson(json);
    final newSheets = (json['sheets'] as List)
        .where(gridSheetsFilter)
        .map((json) => Worksheet._fromJson(
              json,
              _client,
              id,
              renderOption,
              inputOption,
            ))
        .toList();
    // removing deleted sheets
    final newIds = newSheets.map((s) => s.id).toSet();
    final oldIds = sheets.map((s) => s.id).toSet();
    final deleted = oldIds.difference(newIds);
    for (final id in deleted) {
      sheets.removeWhere((s) => s.id == id);
    }
    // adding and updating sheets
    for (final sheet in newSheets) {
      final changed = sheets.firstWhereOrNull(
        (s) => s.id == sheet.id,
      );
      if (changed == null) {
        // adding new sheet
        sheets.add(sheet);
      } else {
        // updating old sheet
        changed._title = sheet._title;
        changed._index = sheet._index;
        changed._rowCount = sheet._rowCount;
        changed._columnCount = sheet._columnCount;
      }
    }
    return true;
  }
  return false;
}