tabsProvider top-level property

dynamic tabsProvider
final

Implementation

final tabsProvider =
    FutureProvider.family<List<TabEntry>, String>((ref, spaceId) async {
  final space = await ref.watch(spaceProvider(spaceId).future);

  List<TabEntry> tabs = [];

  final spaceTopic = space.topic();
  if (spaceTopic != null) {
    tabs.add(TabEntry.overview);
  }

  if ((await space.isActerSpace()) == true) {
    final appSettings = await space.appSettings();
    if (appSettings.pins().active()) {
      final pinsList = await ref.watch(pinListProvider(spaceId).future);
      if (pinsList.isNotEmpty) {
        tabs.add(TabEntry.pins);
      }
    }

    if (appSettings.tasks().active()) {
      final taskList = await ref.watch(taskListProvider(spaceId).future);
      if (taskList.isNotEmpty) {
        tabs.add(TabEntry.tasks);
      }
    }

    if (appSettings.events().active()) {
      final eventList = await ref.watch(allEventListProvider(spaceId).future);
      if (eventList.isNotEmpty) {
        tabs.add(TabEntry.events);
      }
    }
  }

  final hasSpaces = await ref.watch(hasSubSpacesProvider(spaceId).future);
  if (hasSpaces) {
    tabs.add(TabEntry.spaces);
  }

  final hasChats = await ref.watch(hasSubChatsProvider(spaceId).future);
  if (hasChats) {
    tabs.add(TabEntry.chats);
  }

  tabs.add(TabEntry.members);

  final membership = ref.watch(roomMembershipProvider(spaceId));
  bool canAddPin = membership.valueOrNull?.canString('CanPostPin') == true;
  bool canAddEvent = membership.valueOrNull?.canString('CanPostEvent') == true;
  bool canAddTask =
      membership.valueOrNull?.canString('CanPostTaskList') == true;
  bool canLinkSpaces =
      membership.valueOrNull?.canString('CanLinkSpaces') == true;

  //Show action menu only if you have at lease one permission
  if (canAddPin | canAddEvent | canAddTask | canLinkSpaces) {
    tabs.add(TabEntry.actions);
  }
  return tabs;
});