Implementation
@override
Widget build(BuildContext context, WidgetRef ref) {
final settingsLoader = ref.watch(spaceAppSettingsProvider(spaceId));
return WithSidebar(
sidebar: SpaceSettingsMenu(spaceId: spaceId),
child: settingsLoader.when(
data: (appSettingsAndMembership) {
final appSettings = appSettingsAndMembership.settings;
final powerLevels = appSettingsAndMembership.powerLevels;
final defaultPw = powerLevels.eventsDefault();
final usersDefaultPw = powerLevels.usersDefault();
final maxPowerLevel = powerLevels.maxPowerLevel();
String defaultDesc = 'default';
if (usersDefaultPw >= defaultPw) {
defaultDesc = 'not set / everyone';
} else {
defaultDesc = 'default [everyone has $usersDefaultPw]';
}
final space = appSettingsAndMembership.space;
final canEdit = appSettingsAndMembership.member
?.canString('CanChangeAppSettings') ==
true;
final news = appSettings.news();
final events = appSettings.events();
final pins = appSettings.pins();
final tasks = appSettings.tasks();
final moreSections = [];
final labActions = [];
if (news.active()) {
final currentPw = powerLevels.news();
final pwText = maxPowerLevel == 100
? powerLevelName(currentPw)
: 'Custom ($currentPw)';
moreSections.add(
SettingsSection(
title: Text(L10n.of(context).updates),
tiles: [
SettingsTile(
enabled: canEdit,
title: const Text('Required PowerLevel'),
description: const Text(
'Minimum power level required to post news updates',
),
trailing:
currentPw != null ? Text(pwText) : Text(defaultDesc),
onPressed: (context) async =>
await updateFeatureLevelChangeDialog(
context,
maxPowerLevel,
currentPw,
space,
powerLevels,
powerLevels.newsKey(),
L10n.of(context).updates,
),
),
SettingsTile.switchTile(
title: const Text('Comments on Updates'),
description: const Text('not yet supported'),
enabled: false,
initialValue: false,
onToggle: (newVal) {},
),
],
),
);
}
if (pins.active()) {
final currentPw = powerLevels.pins();
final pwText = maxPowerLevel == 100
? powerLevelName(currentPw)
: 'Custom ($currentPw)';
moreSections.add(
SettingsSection(
title: const Text('Pin'),
tiles: [
SettingsTile(
enabled: canEdit,
title: const Text('Required PowerLevel'),
description: const Text(
'Minimum power level required to post and edit pins',
),
trailing:
currentPw != null ? Text(pwText) : Text(defaultDesc),
onPressed: (context) async =>
await updateFeatureLevelChangeDialog(
context,
maxPowerLevel,
currentPw,
space,
powerLevels,
powerLevels.pinsKey(),
L10n.of(context).pins,
),
),
SettingsTile.switchTile(
title: const Text('Comments on Pins'),
description: const Text('not yet supported'),
enabled: false,
initialValue: false,
onToggle: (newVal) {},
),
],
),
);
}
if (events.active()) {
final currentPw = powerLevels.events();
final pwText = maxPowerLevel == 100
? powerLevelName(currentPw)
: 'Custom ($currentPw)';
moreSections.add(
SettingsSection(
title: const Text('Calendar Events'),
tiles: [
SettingsTile(
enabled: canEdit,
title: const Text('Admin PowerLevel'),
description: const Text(
'Minimum power level required to post calendar events',
),
trailing:
currentPw != null ? Text(pwText) : Text(defaultDesc),
onPressed: (context) async =>
await updateFeatureLevelChangeDialog(
context,
maxPowerLevel,
currentPw,
space,
powerLevels,
powerLevels.eventsKey(),
L10n.of(context).events,
),
),
SettingsTile(
enabled: false,
title: const Text('RSVP PowerLevel'),
description: const Text(
'Minimum power level to RSVP to calendar events',
),
trailing: const Text('not yet implemented'),
),
SettingsTile.switchTile(
title: const Text('Comments'),
description: const Text('not yet supported'),
enabled: false,
initialValue: false,
onToggle: (newVal) {},
),
],
),
);
}
if (tasks.active()) {
final taskListCurrentPw = powerLevels.taskLists();
final tasksCurrentPw = powerLevels.tasks();
final pwTextTL = maxPowerLevel == 100
? powerLevelName(taskListCurrentPw)
: 'Custom ($taskListCurrentPw)';
final pwTextT = maxPowerLevel == 100
? powerLevelName(tasksCurrentPw)
: 'Custom ($tasksCurrentPw)';
moreSections.add(
SettingsSection(
title: const Text('Tasks'),
tiles: [
SettingsTile(
enabled: canEdit,
title: const Text('TaskList PowerLevel'),
description: const Text(
'Minimum power level required to create & manage task lists',
),
trailing: taskListCurrentPw != null
? Text(pwTextTL)
: Text(defaultDesc),
onPressed: (context) async =>
await updateFeatureLevelChangeDialog(
context,
maxPowerLevel,
taskListCurrentPw,
space,
powerLevels,
powerLevels.taskListsKey(),
L10n.of(context).taskList,
),
),
SettingsTile(
enabled: canEdit,
title: const Text('Tasks PowerLevel'),
description: const Text(
'Minimum power level required to interact with tasks',
),
trailing: tasksCurrentPw != null
? Text(pwTextT)
: Text(defaultDesc),
onPressed: (context) async =>
await updateFeatureLevelChangeDialog(
context,
maxPowerLevel,
tasksCurrentPw,
space,
powerLevels,
powerLevels.tasksKey(),
L10n.of(context).tasks,
),
),
SettingsTile.switchTile(
title: const Text('Comments'),
description: const Text('not yet supported'),
enabled: false,
initialValue: false,
onToggle: (newVal) {},
),
],
),
);
}
return Scaffold(
appBar: AppBar(
title: const Text('Apps Settings'),
automaticallyImplyLeading: !context.isLargeScreen,
),
body: SettingsList(
sections: [
SettingsSection(
title: const Text('Active Apps'),
tiles: [
SettingsTile.switchTile(
title: const Text('Updates'),
enabled: canEdit,
description: const Text('Post space-wide updates'),
initialValue: news.active(),
onToggle: (newVal) async => await setActerFeature(
context,
newVal,
appSettings,
space,
SpaceFeature.updates,
L10n.of(context).updates,
),
),
SettingsTile.switchTile(
title: const Text('Pins'),
enabled: canEdit,
description: const Text('Pin important information'),
initialValue: pins.active(),
onToggle: (newVal) async => await setActerFeature(
context,
newVal,
appSettings,
space,
SpaceFeature.pins,
L10n.of(context).pins,
),
),
SettingsTile.switchTile(
title: const Text('Events Calendar'),
enabled: canEdit,
description: const Text('Calender with Events'),
initialValue: events.active(),
onToggle: (newVal) async => await setActerFeature(
context,
newVal,
appSettings,
space,
SpaceFeature.events,
L10n.of(context).event,
),
),
SettingsTile.switchTile(
title: const Text('Tasks'),
key: tasksSwitch,
enabled: canEdit,
description: const Text('ToDo-Lists & Tasks'),
initialValue: tasks.active(),
onToggle: (newVal) async => await setActerFeature(
context,
newVal,
appSettings,
space,
SpaceFeature.tasks,
L10n.of(context).tasks,
),
),
...labActions,
],
),
...moreSections,
],
),
);
},
loading: () => const Center(child: Text('loading')),
error: (e, s) {
_log.severe('Failed to load space settings', e, s);
return Center(
child: Text(L10n.of(context).loadingFailed(e)),
);
},
),
);
}