getValidMediaRules method

List<CSSRule>? getValidMediaRules(
  1. double? windowWidth,
  2. double? windowHeight,
  3. bool isDarkMode
)

Implementation

List<CSSRule>? getValidMediaRules(double? windowWidth, double? windowHeight, bool isDarkMode) {
  List<CSSRule>? _mediaRules = [];
  if (rules == null) {
    return _mediaRules;
  }
  if (cssMediaQuery == null) {
    return rules;
  }
  // bool isMediaTypeNotOp = cssMediaQuery._mediaUnary == TokenKind.MEDIA_OP_ONLY;
  //w3c has media type screen/print/speech/all, but webf only work on screen and all
  String? mediaType = cssMediaQuery!._mediaType?.name;
  if (mediaType != null && mediaType != MediaType.SCREEN && mediaType != MediaType.ALL) {
    return _mediaRules;
  }
  List<bool> conditions = [];
  List<bool> ops = [];
  for (CSSMediaExpression expression in cssMediaQuery!.expressions) {
    // [max-width: 1800px, min-width: 450px]
    if (expression.mediaStyle != null) {
      dynamic maxAspectRatio = expression.mediaStyle!['max-aspect-ratio'];
      if (maxAspectRatio != null && windowWidth != null && windowHeight != null) {
        double? maxAPS;
        if (maxAspectRatio is String) {
          maxAPS = parseStringToDouble(maxAspectRatio);
        } else if (maxAspectRatio is double) {
          maxAPS = maxAspectRatio;
        }
        if (maxAPS != null) {
          bool condition = windowWidth / windowHeight <= maxAPS;
          conditions.add(condition);
          ops.add(expression.op == MediaOperator.AND);
        }
      }
      dynamic minAspectRatio = expression.mediaStyle!['min-aspect-ratio'];
      if (minAspectRatio != null && windowWidth != null && windowHeight != null) {
        double? minAPS;
        if (minAspectRatio is String) {
          minAPS = parseStringToDouble(minAspectRatio);
        } else if (minAspectRatio is double) {
          minAPS = minAspectRatio;
        }
        if (minAPS != null) {
          bool condition = windowWidth / windowHeight >= minAPS;
          conditions.add(condition);
          ops.add(expression.op == MediaOperator.AND);
        }
      }
      dynamic maxWidth = expression.mediaStyle!['max-width'];
      if (windowWidth != null && maxWidth != null) {
        double maxWidthValue = CSSLength.parseLength(maxWidth, null).value ?? -1;
        bool condition = windowWidth < maxWidthValue;
        conditions.add(condition);
        ops.add(expression.op == MediaOperator.AND);
      }
      dynamic minWidth = expression.mediaStyle!['min-width'];
      if (windowWidth != null && minWidth != null) {
        double minWidthValue = CSSLength.parseLength(minWidth, null).value ?? -1;
        bool condition = windowWidth > minWidthValue;
        conditions.add(condition);
        ops.add(expression.op == MediaOperator.AND);
      }
      dynamic prefersColorScheme = expression.mediaStyle!['prefers-color-scheme'];
      if (prefersColorScheme != null) {
        bool isMediaDarkMode = prefersColorScheme == 'dark';
        bool condition = isMediaDarkMode == isDarkMode;
        conditions.add(condition);
        ops.add(expression.op == MediaOperator.AND);
      }
    }
  }
  bool isValid = true;
  for (int i = 0; i < conditions.length; i ++) {
    bool con = conditions[i];
    bool isAnd = ops[i];
    if (isAnd) {
      isValid = isValid && con;
    } else {
      isValid = isValid || con;
    }
  }
  if (isValid) {
    _mediaRules = rules;
  }
  return _mediaRules;
}