mirrored_repositories/git-touch/lib
import 'package:antd_mobile/antd_mobile.dart';
import 'package:file_icon/file_icon.dart';
import 'package:filesize/filesize.dart';
import 'package:flutter/widgets.dart';
import 'package:git_touch/utils/utils.dart';

Widget _buildIcon(String type, String name) {
  switch (type) {
    case 'blob': // github gql, gitlab
    case 'file': // github rest, gitea
    case 'commit_file': // bitbucket
      return FileIcon(name, size: 26); // TODO: size
    case 'tree': // github gql, gitlab
    case 'dir': // github rest, gitea
    case 'commit_directory': // bitbucket
      return const Icon(AntIcons.folderOutline);
    case 'commit':
      return const Icon(AntIcons.fileOutline);
    default:
      throw 'object type error';
  }
}

AntListItem createObjectTreeItem({
  required String name,
  required String type,
  required String url,
  String? downloadUrl,
  int? size,
}) {
  return AntListItem(
    prefix: _buildIcon(type, name),
    extra: size == null ? null : Text(filesize(size)),
    onClick: () async {
      final finalUrl = [
        // Let system browser handle these files
        //
        // TODO:
        // Unhandled Exception: PlatformException(Error, Error while launching
        // https://github.com/flutter/flutter/issues/49162

        // Docs
        'pdf', 'docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls',
        // Fonts
        'ttf', 'otf', 'eot', 'woff', 'woff2',
        'svg',
      ].contains(name.ext)
          ? downloadUrl
          : url;
      await launchStringUrl(finalUrl);
    },
    arrow: size == null ? const Icon(AntIcons.rightOutline) : null,
    child: Text(name),
  );
}
