import 'dart:math'; import 'package:flutter/material.dart'; import 'package:outbag_app/backend/permissions.dart'; import 'package:outbag_app/backend/request.dart'; import 'package:outbag_app/backend/room.dart'; import 'package:outbag_app/tools/fetch_wrapper.dart'; import 'package:routemaster/routemaster.dart'; class EditRoomPermissionSetPage extends StatefulWidget { final String server; final String tag; const EditRoomPermissionSetPage(this.server, this.tag, {super.key}); @override State createState() => _EditRoomPermissionSetPageState(); } class _EditRoomPermissionSetPageState extends State { List items = RoomPermission.asList; int permissions = 0; void fetchInfo() { final rmaster = Routemaster.of(context); final sm = ScaffoldMessenger.of(context); doNetworkRequest( sm, req: (user) => postWithCreadentials( path: 'getRoomInfo', credentials: user!, target: (user.server), body: {'room': widget.tag, 'server': widget.server}), onAnyErr: () { // user should not be here // close screen rmaster.replace('/'); return false; }, onOK: (body) async { final info = RoomInfo.fromJSON(body['data']); setState(() { permissions = info.permissions; }); return true; }, ); } @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) => fetchInfo()); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Default permissions'), leading: IconButton( onPressed: () { // go back Navigator.of(context).pop(); }, icon: const Icon(Icons.arrow_back), tooltip: "Go back", ), ), body: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { final item = items[index]; final int col = pow(2, index + 1) as int; return SwitchListTile( title: Text(RoomPermission.name(item)), subtitle: Text(RoomPermission.describe(item)), onChanged: (state) { setState(() { permissions += (state ? 1 : -1) * col; }); }, value: permissions & col != 0); }, ), floatingActionButton: FloatingActionButton.extended( icon: const Icon(Icons.edit), tooltip: "Update default permission set", label: const Text('Edit'), onPressed: () { final rmaster = Routemaster.of(context); final sm = ScaffoldMessenger.of(context); // update permissions doNetworkRequest(sm, req: (user) => postWithCreadentials( path: 'setRoomRight', credentials: user!, target: user.server, body: { 'room': widget.tag, 'server': widget.server, 'rights': permissions }), onOK: (_) { rmaster.pop(); }); }, ), ); } }