Files
display-counter-cpone/lib/screen/settings/setting_screen_counter_dedicated.dart
2025-02-04 19:39:14 +07:00

657 lines
25 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:queuedisplay/app/route.dart';
import 'package:queuedisplay/model/branch_model.dart';
import 'package:queuedisplay/model/error_msg_model.dart';
import 'package:queuedisplay/model/layanan_dokter.dart';
import 'package:queuedisplay/model/service_model.dart';
import 'package:queuedisplay/provider/layanan_dokter_provider.dart';
import 'package:queuedisplay/provider/service_provider.dart';
import 'package:queuedisplay/screen/settings/branch_list_provider.dart';
import 'package:queuedisplay/widget/display_counter.dart';
import 'package:queuedisplay/widget/my_error_dialog_state.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../app/constant.dart';
import '../../model/counter_model.dart';
import '../../model/sampling_location_model.dart';
import '../../provider/all_service_provider.dart';
import '../../provider/counter_provider.dart';
import '../../provider/sampling_location_provider.dart';
import '../../widget/SamplingSoundSetting.dart';
import '../../widget/counter_sound_setting.dart';
import '../../widget/display_dokter.dart';
import '../../widget/my_error_dialog.dart';
class SettingScreenCounterDedicated extends HookConsumerWidget {
const SettingScreenCounterDedicated({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final init = useState(true);
final ctrlJudul = useTextEditingController(text: "");
final ctrlJudulError = useState(false);
final isLoading = useState(false);
final errorMessage = useState("");
final listService = useState<List<Layanan>>(List.empty());
final activeLayanan = useState<List>(List.empty());
final activeSoundCounter = useState<List>(List.empty());
final serviceIDArr = useState<List>(List.empty());
final data = useState('N');
final isLoadingDoctor = useState(false);
final listServiceDoctor = useState<List<LayananDokter>>(List.empty());
final activeSoundDoctor = useState<List>(List.empty());
// Sampling
final isLoadingSamplingLocation = useState(false);
final listSamplingLocation = useState<List<SamplingLocation>>(List.empty());
final activeSoundSamplingLocation = useState<List>(List.empty());
// Media Promo
final tanpaMediaPromo = useState(false);
final errorMsgList = useState<List<ErrorMsgModel>>(List.empty());
//Branch
final branchList = useState<List<BranchModel>>([]);
final selectedBranch = useState<BranchModel?>(null);
_isThereCurrentDialogShowing(BuildContext context) =>
ModalRoute.of(context)?.isCurrent != true;
// function
Future delData() async {
// Obtain shared preferences.
try {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('counter_dedicated');
} catch (e) {
// print(e);
}
}
Future getData() async {
try {
final prefs = await SharedPreferences.getInstance();
var rawData = prefs.getString('counter_dedicated') ?? 'a';
data.value = rawData;
if (rawData != 'a') {
listService.value = ref.read(allServiceProvider);
var data = json.decode(rawData);
ctrlJudul.text = data['judul'];
activeLayanan.value = data['activeLayanan'] ?? List.empty();
activeSoundCounter.value = data['activeSoundCounter'] ?? List.empty();
activeSoundDoctor.value = data['activeSoundDoctor'] ?? List.empty();
activeSoundSamplingLocation.value =
data['activeSoundSamplingLocation'] ?? List.empty();
selectedBranch.value = BranchModel.fromJson(data['selectedBranch']);
// media promo
tanpaMediaPromo.value = data['tanpaMediaPromo'] ?? List.empty();
if (activeLayanan.value.isNotEmpty) {
activeLayanan.value.forEach((e) {
listService.value.forEach((f) {
if (e == f.counterID) {
f.value = true;
}
});
});
}
// suara counter
if (activeSoundCounter.value.isNotEmpty) {
activeSoundCounter.value.forEach((e) {
listService.value.forEach((f) {
if (e == f.counterID) {
f.sound = true;
}
});
});
}
// suara sampling
if (activeSoundSamplingLocation.value.isNotEmpty) {
activeSoundSamplingLocation.value.forEach((e) {
listSamplingLocation.value.forEach((f) {
if (e == f.mLocationID) {
f.value = true;
// print(e);
}
});
});
}
// suara dokter
if (activeSoundDoctor.value.isNotEmpty) {
activeSoundDoctor.value.forEach((e) {
listServiceDoctor.value.forEach((f) {
if (e == f.id) {
f.value = true;
// print(e);
}
});
});
}
}
} catch (e) {
// print(e);
myErrorDialog(
context, e.toString(), 'ERROR: Get data shared preference');
}
}
Future<bool> saveData() async {
try {
final prefs = await SharedPreferences.getInstance();
var distinctList = activeLayanan.value.toSet().toList();
// suara counter
var distinctListCounterSnd = activeSoundCounter.value.toSet().toList();
// suara doctor
var distinctListDoctorSnd = activeSoundDoctor.value.toSet().toList();
// suara sampling
var distinctListSamplingSnd =
activeSoundSamplingLocation.value.toSet().toList();
// media promo
var distinctMediaPromoSnd = tanpaMediaPromo.value;
var serviceIDTemp = List.empty(growable: true);
var serviceIDTempSuara = List.empty(growable: true);
listService.value.forEach((i) {
distinctList.forEach((j) {
if (i.counterID == int.parse(j.toString())) {
if (i.serviceID != null) {
List listServiceIDx = i.serviceID!.split(',');
serviceIDTemp.addAll(listServiceIDx);
}
}
});
});
// suara counter
listService.value.forEach((i) {
distinctListCounterSnd.forEach((j) {
if (i.counterID == int.parse(j.toString())) {
if (i.serviceID != null) {
List listServiceIDx = i.serviceID!.split(',');
serviceIDTempSuara.addAll(listServiceIDx);
}
}
});
});
final Map<String, dynamic> data = {
"judul": ctrlJudul.text,
"activeLayanan": distinctList,
"activeSoundDoctor": distinctListDoctorSnd,
"activeSoundCounter": distinctListCounterSnd,
"activeSoundSamplingLocation": distinctListSamplingSnd,
"tanpaMediaPromo": distinctMediaPromoSnd,
"serviceID": serviceIDTemp,
"selectedBranch": selectedBranch.value,
"serviceIDSuara": serviceIDTempSuara,
};
await prefs.setString('counter_dedicated', json.encode(data));
// print(data);
return true;
} catch (e) {
myErrorDialog(
context, e.toString(), 'ERROR: Save data sahred preference');
// print(e);
return false;
}
}
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
ref.read(BranchListProvider.notifier).list();
// ref.read(layananProvider.notifier).list();
// ref.read(SamplingLocationProvider.notifier).list();
await getData();
});
return () {};
}, []);
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
if (selectedBranch.value != null) {
if (!init.value) {
activeLayanan.value = [];
listService.value = [];
activeSoundCounter.value = [];
}
init.value = false;
ref
.read(serviceProvider.notifier)
.list(selectedBranch.value?.mBranchID ?? ')');
}
});
return () {};
}, [selectedBranch.value]);
// counter
ref.listen(serviceProvider, (prev, next) {
if (next is ServiceListStateLoading) {
isLoading.value = true;
} else if (next is ServiceListStateError) {
isLoading.value = false;
errorMessage.value = next.message;
List<ErrorMsgModel> msg = ref.read(errorListMsgProvider);
msg.add(ErrorMsgModel(
title: "ERROR: Get data list counter", msg: next.message));
ref.read(errorListMsgProvider.notifier).state = msg;
if (!_isThereCurrentDialogShowing(context)) {
myErrorDialogState(context, 'ERROR: Get data list counter');
}
Timer(const Duration(seconds: 3), () {
errorMessage.value = "";
});
} else if (next is ServiceListStateDone) {
isLoading.value = false;
listService.value = next.model;
if (activeLayanan.value.isNotEmpty) {
activeLayanan.value.forEach((e) {
listService.value.forEach((f) {
if (e == f.counterID) {
f.value = true;
}
});
});
}
// suara aktif?
if (activeSoundCounter.value.isNotEmpty) {
activeSoundCounter.value.forEach((e) {
listService.value.forEach((f) {
if (e == f.counterID) {
f.sound = true;
}
});
});
}
}
});
// sampling location
ref.listen(SamplingLocationProvider, (prev, next) {
if (next is SamplingLocationListLoading) {
isLoadingSamplingLocation.value = true;
} else if (next is SamplingLocationListError) {
isLoadingSamplingLocation.value = false;
errorMessage.value = next.message;
List<ErrorMsgModel> msg = ref.read(errorListMsgProvider);
msg.add(ErrorMsgModel(
title: "ERROR: Get data list sampling sound", msg: next.message));
ref.read(errorListMsgProvider.notifier).state = msg;
if (!_isThereCurrentDialogShowing(context)) {
myErrorDialogState(context, 'ERROR: Get data list sampling sound');
}
Timer(const Duration(seconds: 3), () {
errorMessage.value = "";
});
} else if (next is SamplingLocationListDone) {
isLoadingSamplingLocation.value = false;
listSamplingLocation.value = next.model;
if (activeSoundSamplingLocation.value.isNotEmpty) {
activeSoundSamplingLocation.value.forEach((e) {
listSamplingLocation.value.forEach((f) {
if (e == f.mLocationID) {
f.value = true;
// print(e);
}
});
});
}
// print(jsonEncode(next.model));
}
});
// layanan dokter
ref.listen(layananProvider, (prev, next) {
if (next is LayananListStateLoading) {
isLoadingDoctor.value = true;
} else if (next is LayananListStateError) {
isLoadingDoctor.value = false;
errorMessage.value = next.message;
List<ErrorMsgModel> msg = ref.read(errorListMsgProvider);
msg.add(ErrorMsgModel(
title: "ERROR: Get data list sound doctor", msg: next.message));
ref.read(errorListMsgProvider.notifier).state = msg;
if (!_isThereCurrentDialogShowing(context)) {
myErrorDialogState(context, 'ERROR: Get data list sound doctor');
}
Timer(const Duration(seconds: 3), () {
errorMessage.value = "";
});
} else if (next is LayananListStateDone) {
isLoadingDoctor.value = false;
listServiceDoctor.value = next.model;
if (activeSoundDoctor.value.isNotEmpty) {
activeSoundDoctor.value.forEach((e) {
listServiceDoctor.value.forEach((f) {
if (e == f.id) {
f.value = true;
}
});
});
}
}
});
ref.listen(BranchListProvider, (previous, next) {
if (next is BranchListStateLoading) {
isLoading.value = true;
} else if (next is BranchListStateError) {
myErrorDialog(context, next.message, 'ERROR');
isLoading.value = false;
} else if (next is BranchListStateDone) {
// ref.read(allServiceProvider.notifier).state = next.model;
// print(ref.read(allServiceProvider));
branchList.value = next.model;
isLoading.value = false;
}
});
return Material(
child: Container(
height: Constant.getActualY(context: context, y: 982),
width: Constant.getActualX(context: context, x: 1512),
decoration: const BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: AssetImage('images/background.png'),
),
),
child: Center(
child: Card(
color: Colors.white,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(10),
),
),
elevation: 5,
child: SizedBox(
height: Constant.getActualY(context: context, y: 880),
width: Constant.getActualX(context: context, x: 1360),
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: Constant.getActualX(context: context, x: 30),
vertical: Constant.getActualY(context: context, y: 30),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
// TextButton(
// onPressed: () {
// Navigator.of(context)
// .popAndPushNamed(displayRoute);
// // print(pm.currentStatusUSB);
// // print(pm.currentStatusUSB);
// },
// child: const Text('back')),
Text(
'Setting',
style: Constant.subTitle(context: context),
),
// TextButton(
// onPressed: () {
// delData();
// },
// child: const Text('Delete All')),
],
),
SizedBox(
height: Constant.getActualY(context: context, y: 30),
),
Text(
'Cabang*',
style: Constant.label(context: context),
),
SizedBox(
height: Constant.getActualY(context: context, y: 60),
child: DropdownButtonFormField<BranchModel>(
style: Constant.normal(context: context)
.copyWith(color: Colors.black),
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(8),
),
),
),
menuMaxHeight:
Constant.getActualY(context: context, y: 500),
hint: Text(selectedBranch.value?.mBranchName ?? ''),
items: branchList.value
.map((e) => DropdownMenuItem<BranchModel>(
value: e, child: Text(e.mBranchName ?? '')))
.toList(),
onChanged: (BranchModel? e) {
// print(e);
selectedBranch.value = e!;
},
),
),
SizedBox(
height: Constant.getActualY(context: context, y: 20),
),
Text(
'Judul Header*',
style: Constant.label(context: context),
),
SizedBox(
width: Constant.getActualX(context: context, x: 1300),
child: TextField(
controller: ctrlJudul,
onChanged: (value) {
if (value.trim() == "") {
ctrlJudulError.value = true;
}
if (value.trim() != "") {
ctrlJudulError.value = false;
}
},
decoration: InputDecoration(
errorText: ctrlJudulError.value
? "Tidak boleh kosong"
: null,
border: const OutlineInputBorder(),
focusedBorder: const OutlineInputBorder(
borderSide:
BorderSide(color: Colors.blue, width: 2)),
hintText: "example Customer Service",
hintStyle: Constant.label(context: context)),
),
),
SizedBox(
height: Constant.getActualY(context: context, y: 20),
),
Text(
'Display Counter*',
style: Constant.label(context: context),
),
// widget counter
DisplayCounter(
isloading: isLoading,
listService: listService,
activeLayanan: activeLayanan,
),
//SOUND COUNTER
SizedBox(
height: Constant.getActualY(context: context, y: 50),
),
Text(
'Proses Suara Counter/FO',
style: Constant.label(context: context),
),
// suara
CounterSoundSetting(
isLoading: isLoading,
listService: listService,
activeSoundCounter: activeSoundCounter),
//END SOUND COUNTER
SizedBox(
height: Constant.getActualY(context: context, y: 50),
),
// Text(
// 'Proses Suara Sampling',
// style: Constant.label(context: context),
// ),
// SamplingSoundSetting(
// isloading: isLoadingSamplingLocation,
// listSamplingLocation: listSamplingLocation,
// activeSoundSampling: activeSoundSamplingLocation,
// ),
// SizedBox(
// height: Constant.getActualY(context: context, y: 50),
// ),
// Text(
// 'Proses Suara Layanan Dokter ',
// style: Constant.label(context: context),
// ),
// // DISPLAY LAYANAN DOKTER
// DisplayDoctor(
// isLoadingDoctor: isLoadingDoctor,
// listServiceDoctor: listServiceDoctor,
// activeSoundDoctor: activeSoundDoctor,
// ),
// // // END DISPLAY LAYANAN DOKTER
// Checkbox banner media promo start
// SizedBox(
// height: Constant.getActualY(context: context, y: 50),
// ),
Text(
'Media Promo',
style: Constant.label(context: context),
),
SizedBox(
// width: Constant.getActualX(
// context: context, x: 500),
height: Constant.getActualY(context: context, y: 200),
child: GridView.count(
childAspectRatio:
Constant.getActualY(context: context, y: 150) /
Constant.getActualX(context: context, x: 15),
crossAxisCount: 2,
children: [
Row(
children: [
FractionallySizedBox(
child: CupertinoSwitch(
value: tanpaMediaPromo.value,
onChanged: (val) {
if (val) {
var rwData =
json.encode(tanpaMediaPromo.value);
bool data = json.decode(rwData);
bool actlyn = data;
actlyn = !val;
tanpaMediaPromo.value = actlyn;
}
if (!val) {
var rwData =
json.encode(tanpaMediaPromo.value);
bool data = json.decode(rwData);
bool actlyn = data;
actlyn = !val;
tanpaMediaPromo.value = actlyn;
}
tanpaMediaPromo.value = val;
},
),
),
Expanded(
child: Text(
"Tanpa Media Promo",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: Constant.normal(context: context),
),
)
],
),
]),
),
// Checkbox banner media promo end
SizedBox(
height: Constant.getActualY(context: context, y: 20),
),
Center(
child: SizedBox(
height: Constant.getActualY(context: context, y: 60),
width: Constant.getActualX(context: context, x: 200),
child: TextButton(
onPressed: () {
if (ctrlJudul.text.isNotEmpty &&
activeLayanan.value.isNotEmpty &&
selectedBranch.value != null) {
saveData();
ref.read(allServiceProvider.notifier).state =
listService.value;
ref
.read(allServiceDoctorProvider.notifier)
.state = listServiceDoctor.value;
Navigator.of(context).pushNamedAndRemoveUntil(
customerServiceDedicatedRoute,
(route) => false);
return;
} else {
if (ctrlJudul.text.isEmpty) {
myErrorDialog(
context,
'Input bertanda * tidak boleh kosong',
'PERINGATAN');
} else if (activeLayanan.value.isEmpty) {
myErrorDialog(
context,
'Layanan belum ada yang aktif',
'PERINGATAN');
}
}
},
style: TextButton.styleFrom(
elevation: 5, backgroundColor: Colors.blue),
child: Text(
'Save',
style: Constant.subTitle(context: context)
.copyWith(color: Colors.white),
),
)),
)
],
),
),
),
),
),
),
));
}
}