mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-07-16 01:56:19 +00:00
@ -5,7 +5,9 @@
|
|||||||
<application
|
<application
|
||||||
android:label="syncrow_app"
|
android:label="syncrow_app"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher">
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:allowBackup="false"
|
||||||
|
>
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
@ -274,35 +274,39 @@ class AuthCubit extends Cubit<AuthState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTokenAndValidate() async {
|
getTokenAndValidate() async {
|
||||||
emit(AuthTokenLoading());
|
try {
|
||||||
const storage = FlutterSecureStorage();
|
emit(AuthTokenLoading());
|
||||||
final firstLaunch =
|
const storage = FlutterSecureStorage();
|
||||||
await SharedPreferencesHelper.readBoolFromSP(StringsManager.firstLaunch) ?? true;
|
final firstLaunch =
|
||||||
|
await SharedPreferencesHelper.readBoolFromSP(StringsManager.firstLaunch) ?? true;
|
||||||
|
|
||||||
if (firstLaunch) {
|
if (firstLaunch) {
|
||||||
storage.deleteAll();
|
storage.deleteAll();
|
||||||
}
|
|
||||||
|
|
||||||
await SharedPreferencesHelper.saveBoolToSP(StringsManager.firstLaunch, false);
|
|
||||||
|
|
||||||
final value = await storage.read(key: Token.loginAccessTokenKey) ?? '';
|
|
||||||
if (value.isEmpty) {
|
|
||||||
emit(AuthTokenError(message: "Token not found"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final tokenData = Token.decodeToken(value);
|
|
||||||
|
|
||||||
if (tokenData.containsKey('exp')) {
|
|
||||||
final exp = tokenData['exp'] ?? 0;
|
|
||||||
final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
|
||||||
|
|
||||||
if (currentTime < exp) {
|
|
||||||
emit(AuthTokenSuccess());
|
|
||||||
} else {
|
|
||||||
emit(AuthTokenError(message: "Token expired"));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
await SharedPreferencesHelper.saveBoolToSP(StringsManager.firstLaunch, false);
|
||||||
|
|
||||||
|
final value = await storage.read(key: Token.loginAccessTokenKey) ?? '';
|
||||||
|
if (value.isEmpty) {
|
||||||
|
emit(AuthTokenError(message: "Token not found"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final tokenData = Token.decodeToken(value);
|
||||||
|
|
||||||
|
if (tokenData.containsKey('exp')) {
|
||||||
|
final exp = tokenData['exp'] ?? 0;
|
||||||
|
final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
||||||
|
|
||||||
|
if (currentTime < exp) {
|
||||||
|
emit(AuthTokenSuccess());
|
||||||
|
} else {
|
||||||
|
emit(AuthTokenError(message: "Token expired"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emit(AuthTokenError(message: "Something went wrong"));
|
||||||
|
}
|
||||||
|
} catch (_) {
|
||||||
emit(AuthTokenError(message: "Something went wrong"));
|
emit(AuthTokenError(message: "Something went wrong"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,11 +25,10 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
|||||||
|
|
||||||
static List<DevicesCategoryModel>? allCategories;
|
static List<DevicesCategoryModel>? allCategories;
|
||||||
|
|
||||||
Future<void> _onFetchAllDevices(
|
Future<void> _onFetchAllDevices(FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
|
||||||
FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
|
|
||||||
emit(state.copyWith(loading: true));
|
emit(state.copyWith(loading: true));
|
||||||
try {
|
try {
|
||||||
final allDevices = await HomeManagementAPI.fetchDevicesByUserId();
|
final allDevices = await HomeManagementAPI.fetchDevicesByUnitId();
|
||||||
emit(state.copyWith(devices: allDevices, loading: false));
|
emit(state.copyWith(devices: allDevices, loading: false));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
emit(state.copyWith(error: e.toString(), loading: false));
|
emit(state.copyWith(error: e.toString(), loading: false));
|
||||||
@ -47,16 +46,14 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onSelectCategory(
|
void _onSelectCategory(SelectCategory event, Emitter<DeviceManagerState> emit) {
|
||||||
SelectCategory event, Emitter<DeviceManagerState> emit) {
|
|
||||||
for (var i = 0; i < allCategories!.length; i++) {
|
for (var i = 0; i < allCategories!.length; i++) {
|
||||||
allCategories![i].isSelected = i == event.index;
|
allCategories![i].isSelected = i == event.index;
|
||||||
}
|
}
|
||||||
emit(state.copyWith(categoryChanged: true));
|
emit(state.copyWith(categoryChanged: true));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onUnselectAllCategories(
|
void _onUnselectAllCategories(UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
|
||||||
UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
|
|
||||||
for (var category in allCategories!) {
|
for (var category in allCategories!) {
|
||||||
category.isSelected = false;
|
category.isSelected = false;
|
||||||
}
|
}
|
||||||
@ -100,8 +97,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
|||||||
_updateDevicesStatus(category, emit);
|
_updateDevicesStatus(category, emit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onTurnOnOffDevice(
|
void _onTurnOnOffDevice(TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
|
||||||
TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
|
|
||||||
var device = event.device;
|
var device = event.device;
|
||||||
device.isOnline = !device.isOnline!;
|
device.isOnline = !device.isOnline!;
|
||||||
DevicesCategoryModel category = allCategories!.firstWhere((category) {
|
DevicesCategoryModel category = allCategories!.firstWhere((category) {
|
||||||
@ -124,8 +120,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
|||||||
emit(state.copyWith(categoryChanged: true)); // Set category changed state
|
emit(state.copyWith(categoryChanged: true)); // Set category changed state
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updateDevicesStatus(
|
void _updateDevicesStatus(DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
|
||||||
DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
|
|
||||||
if (category.devices != null && category.devices!.isNotEmpty) {
|
if (category.devices != null && category.devices!.isNotEmpty) {
|
||||||
bool? tempStatus = category.devices![0].isOnline;
|
bool? tempStatus = category.devices![0].isOnline;
|
||||||
for (var device in category.devices!) {
|
for (var device in category.devices!) {
|
||||||
@ -145,8 +140,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
|||||||
try {
|
try {
|
||||||
final deviceFunctions = await DevicesAPI.deviceFunctions(event.deviceId);
|
final deviceFunctions = await DevicesAPI.deviceFunctions(event.deviceId);
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.copyWith(functionsLoading: false, deviceFunctions: deviceFunctions));
|
||||||
functionsLoading: false, deviceFunctions: deviceFunctions));
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
emit(state.copyWith(functionsLoading: false, error: e.toString()));
|
emit(state.copyWith(functionsLoading: false, error: e.toString()));
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
List<SceneStaticFunction> tempTasksList = [];
|
List<SceneStaticFunction> tempTasksList = [];
|
||||||
final Map<String, dynamic> selectedValues = {};
|
final Map<String, dynamic> selectedValues = {};
|
||||||
|
|
||||||
FutureOr<void> _onAddSceneTask(
|
FutureOr<void> _onAddSceneTask(AddTaskEvent event, Emitter<CreateSceneState> emit) {
|
||||||
AddTaskEvent event, Emitter<CreateSceneState> emit) {
|
|
||||||
final copyList = List<SceneStaticFunction>.from(tempTasksList);
|
final copyList = List<SceneStaticFunction>.from(tempTasksList);
|
||||||
tasksList.addAll(copyList);
|
tasksList.addAll(copyList);
|
||||||
tempTasksList.clear();
|
tempTasksList.clear();
|
||||||
@ -87,16 +86,16 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
}
|
}
|
||||||
|
|
||||||
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
||||||
|
emit(AddSceneTask(tasksList: tasksList));
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _selectedValue(
|
FutureOr<void> _selectedValue(SelectedValueEvent event, Emitter<CreateSceneState> emit) {
|
||||||
SelectedValueEvent event, Emitter<CreateSceneState> emit) {
|
|
||||||
selectedValues[event.code] = event.value;
|
selectedValues[event.code] = event.value;
|
||||||
emit(SelectedTaskValueState(value: event.value));
|
emit(SelectedTaskValueState(value: event.value));
|
||||||
|
emit(AddSceneTask(tasksList: tasksList));
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _removeTaskById(
|
FutureOr<void> _removeTaskById(RemoveTaskByIdEvent event, Emitter<CreateSceneState> emit) {
|
||||||
RemoveTaskByIdEvent event, Emitter<CreateSceneState> emit) {
|
|
||||||
emit(CreateSceneLoading());
|
emit(CreateSceneLoading());
|
||||||
|
|
||||||
for (var element in tasksList) {
|
for (var element in tasksList) {
|
||||||
@ -116,6 +115,8 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
tempTasksList.remove(element);
|
tempTasksList.remove(element);
|
||||||
|
|
||||||
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
||||||
|
emit(AddSceneTask(tasksList: tasksList));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -141,8 +142,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _clearTaskList(
|
FutureOr<void> _clearTaskList(ClearTaskListEvent event, Emitter<CreateSceneState> emit) {
|
||||||
ClearTaskListEvent event, Emitter<CreateSceneState> emit) {
|
|
||||||
tasksList.clear();
|
tasksList.clear();
|
||||||
emit(AddSceneTask(tasksList: tasksList));
|
emit(AddSceneTask(tasksList: tasksList));
|
||||||
}
|
}
|
||||||
@ -154,8 +154,8 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
try {
|
try {
|
||||||
final response = await SceneApi.getSceneDetails(event.sceneId);
|
final response = await SceneApi.getSceneDetails(event.sceneId);
|
||||||
if (response.id.isNotEmpty) {
|
if (response.id.isNotEmpty) {
|
||||||
tasksList = List<SceneStaticFunction>.from(getTaskListFunctionsFromApi(
|
tasksList =
|
||||||
actions: response.actions, deviceId: response.id));
|
List<SceneStaticFunction>.from(getTaskListFunctionsFromApi(actions: response.actions));
|
||||||
emit(AddSceneTask(
|
emit(AddSceneTask(
|
||||||
tasksList: tasksList,
|
tasksList: tasksList,
|
||||||
));
|
));
|
||||||
@ -167,11 +167,11 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _clearTempTaskList(
|
FutureOr<void> _clearTempTaskList(ClearTempTaskListEvent event, Emitter<CreateSceneState> emit) {
|
||||||
ClearTempTaskListEvent event, Emitter<CreateSceneState> emit) {
|
|
||||||
tempTasksList.clear();
|
tempTasksList.clear();
|
||||||
selectedValues.clear();
|
selectedValues.clear();
|
||||||
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
emit(TempHoldSceneTask(tempTasksList: tempTasksList));
|
||||||
|
emit(AddSceneTask(tasksList: tempTasksList));
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _removeFromSelectedValueById(
|
FutureOr<void> _removeFromSelectedValueById(
|
||||||
@ -179,16 +179,15 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
|
|||||||
if (selectedValues.containsKey(event.code)) {
|
if (selectedValues.containsKey(event.code)) {
|
||||||
selectedValues.remove(event.code);
|
selectedValues.remove(event.code);
|
||||||
emit(const SelectedTaskValueState(value: null));
|
emit(const SelectedTaskValueState(value: null));
|
||||||
|
emit(AddSceneTask(tasksList: tasksList));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _deleteScene(
|
FutureOr<void> _deleteScene(DeleteSceneEvent event, Emitter<CreateSceneState> emit) async {
|
||||||
DeleteSceneEvent event, Emitter<CreateSceneState> emit) async {
|
|
||||||
emit(DeleteSceneLoading());
|
emit(DeleteSceneLoading());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final response = await SceneApi.deleteScene(
|
final response = await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid);
|
||||||
sceneId: event.sceneId, unitUuid: event.unitUuid);
|
|
||||||
if (response == true) {
|
if (response == true) {
|
||||||
emit(const DeleteSceneSuccess(true));
|
emit(const DeleteSceneSuccess(true));
|
||||||
} else {
|
} else {
|
||||||
|
@ -8,8 +8,6 @@ sealed class CreateSceneEvent extends Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AddTaskEvent extends CreateSceneEvent {
|
class AddTaskEvent extends CreateSceneEvent {
|
||||||
final bool updateTaskListFromTemp;
|
|
||||||
const AddTaskEvent({required this.updateTaskListFromTemp});
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [];
|
List<Object> get props => [];
|
||||||
}
|
}
|
||||||
|
@ -18,15 +18,18 @@ class SceneBloc extends Bloc<SceneEvent, SceneState> {
|
|||||||
emit(SceneLoading());
|
emit(SceneLoading());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final scenes = await SceneApi.getScenesByUnitId(event.unitId);
|
if (event.unitId.isNotEmpty) {
|
||||||
emit(SceneLoaded(scenes));
|
final scenes = await SceneApi.getScenesByUnitId(event.unitId);
|
||||||
|
emit(SceneLoaded(scenes));
|
||||||
|
} else {
|
||||||
|
const SceneError(message: '');
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
emit(const SceneError(message: 'Something went wrong'));
|
emit(const SceneError(message: 'Something went wrong'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onSceneTrigger(
|
Future<void> _onSceneTrigger(SceneTrigger event, Emitter<SceneState> emit) async {
|
||||||
SceneTrigger event, Emitter<SceneState> emit) async {
|
|
||||||
final currentState = state;
|
final currentState = state;
|
||||||
if (currentState is SceneLoaded) {
|
if (currentState is SceneLoaded) {
|
||||||
emit(SceneLoaded(currentState.scenes, loadingSceneId: event.sceneId));
|
emit(SceneLoaded(currentState.scenes, loadingSceneId: event.sceneId));
|
||||||
|
@ -15,7 +15,8 @@ import 'package:syncrow_app/utils/context_extension.dart';
|
|||||||
mixin SceneLogicHelper {
|
mixin SceneLogicHelper {
|
||||||
bool isOnlyDelayOrDelayLast(List<SceneStaticFunction> tasks) {
|
bool isOnlyDelayOrDelayLast(List<SceneStaticFunction> tasks) {
|
||||||
final lastTask = tasks.last;
|
final lastTask = tasks.last;
|
||||||
return tasks.every((task) => task.code == 'delay') || lastTask.code == 'delay';
|
return tasks.every((task) => task.code == 'delay') ||
|
||||||
|
lastTask.code == 'delay';
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleSaveButtonPress(
|
void handleSaveButtonPress(
|
||||||
@ -44,14 +45,14 @@ mixin SceneLogicHelper {
|
|||||||
tasks.length,
|
tasks.length,
|
||||||
(index) {
|
(index) {
|
||||||
final task = tasks[index];
|
final task = tasks[index];
|
||||||
if (task.code == 'delay') {
|
if (task.deviceId == 'delay') {
|
||||||
return CreateSceneAction(
|
return CreateSceneAction(
|
||||||
entityId: tasks[index].deviceId,
|
entityId: tasks[index].deviceId,
|
||||||
actionExecutor: 'delay',
|
actionExecutor: 'delay',
|
||||||
executorProperty: CreateSceneExecutorProperty(
|
executorProperty: CreateSceneExecutorProperty(
|
||||||
functionCode: task.code,
|
functionCode: '',
|
||||||
functionValue: task.operationalValues.first.value,
|
functionValue: '',
|
||||||
delaySeconds: 0,
|
delaySeconds: task.functionValue,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -60,7 +61,7 @@ mixin SceneLogicHelper {
|
|||||||
actionExecutor: 'device_issue',
|
actionExecutor: 'device_issue',
|
||||||
executorProperty: CreateSceneExecutorProperty(
|
executorProperty: CreateSceneExecutorProperty(
|
||||||
functionCode: task.code,
|
functionCode: task.code,
|
||||||
functionValue: task.operationalValues.first.value,
|
functionValue: task.functionValue,
|
||||||
delaySeconds: 0,
|
delaySeconds: 0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -121,7 +122,8 @@ mixin SceneLogicHelper {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return AlertDialogCountdown(
|
return AlertDialogCountdown(
|
||||||
durationValue: listOfSceneStaticFunction[index].functionValue ?? taskItem.functionValue,
|
durationValue: listOfSceneStaticFunction[index].functionValue ??
|
||||||
|
taskItem.functionValue,
|
||||||
functionValue: taskItem.functionValue,
|
functionValue: taskItem.functionValue,
|
||||||
function: listOfSceneStaticFunction[index],
|
function: listOfSceneStaticFunction[index],
|
||||||
);
|
);
|
||||||
|
@ -458,11 +458,6 @@ mixin SceneOperationsDataHelper {
|
|||||||
icon: Assets.assetsAcPower, description: "ON", value: true),
|
icon: Assets.assetsAcPower, description: "ON", value: true),
|
||||||
SceneOperationalValue(
|
SceneOperationalValue(
|
||||||
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
||||||
SceneOperationalValue(
|
|
||||||
icon: Assets.assetsSceneRefresh,
|
|
||||||
description: "Reverse Switch",
|
|
||||||
value: null,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
@ -477,11 +472,6 @@ mixin SceneOperationsDataHelper {
|
|||||||
icon: Assets.assetsAcPower, description: "ON", value: true),
|
icon: Assets.assetsAcPower, description: "ON", value: true),
|
||||||
SceneOperationalValue(
|
SceneOperationalValue(
|
||||||
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
||||||
SceneOperationalValue(
|
|
||||||
icon: Assets.assetsSceneRefresh,
|
|
||||||
description: "Reverse Switch",
|
|
||||||
value: null,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
@ -496,11 +486,6 @@ mixin SceneOperationsDataHelper {
|
|||||||
icon: Assets.assetsAcPower, description: "ON", value: true),
|
icon: Assets.assetsAcPower, description: "ON", value: true),
|
||||||
SceneOperationalValue(
|
SceneOperationalValue(
|
||||||
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
|
||||||
SceneOperationalValue(
|
|
||||||
icon: Assets.assetsSceneRefresh,
|
|
||||||
description: "Reverse Switch",
|
|
||||||
value: null,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
@ -660,20 +645,42 @@ mixin SceneOperationsDataHelper {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////&************ END of get function with icons for device *************&&////////
|
||||||
|
///
|
||||||
|
///
|
||||||
List<SceneStaticFunction> getTaskListFunctionsFromApi({
|
List<SceneStaticFunction> getTaskListFunctionsFromApi({
|
||||||
required List<Action> actions,
|
required List<Action> actions,
|
||||||
required String deviceId,
|
|
||||||
}) {
|
}) {
|
||||||
List<SceneStaticFunction> functions = [];
|
List<SceneStaticFunction> functions = [];
|
||||||
|
|
||||||
for (var action in actions) {
|
for (var action in actions) {
|
||||||
|
if (action.entityId == 'delay') {
|
||||||
|
functions.add(
|
||||||
|
SceneStaticFunction(
|
||||||
|
deviceId: action.entityId,
|
||||||
|
deviceName: 'delay',
|
||||||
|
deviceIcon: Assets.delay,
|
||||||
|
icon: Assets.delay,
|
||||||
|
operationName: 'delay',
|
||||||
|
functionValue: action.executorProperty.delaySeconds,
|
||||||
|
code: '',
|
||||||
|
operationalValues: [
|
||||||
|
SceneOperationalValue(
|
||||||
|
icon: '',
|
||||||
|
description: "",
|
||||||
|
value: action.executorProperty.delaySeconds,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
ExecutorProperty executorProperty = action.executorProperty;
|
ExecutorProperty executorProperty = action.executorProperty;
|
||||||
|
|
||||||
switch (executorProperty.functionCode) {
|
switch (executorProperty.functionCode) {
|
||||||
case 'sensitivity':
|
case 'sensitivity':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Presence Sensor',
|
deviceName: 'Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsSensitivityFunction,
|
icon: Assets.assetsSensitivityFunction,
|
||||||
@ -738,7 +745,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'normal_open_switch':
|
case 'normal_open_switch':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'WIFI LOCK PRO',
|
deviceName: 'WIFI LOCK PRO',
|
||||||
deviceIcon: Assets.assetsIconsDoorLock,
|
deviceIcon: Assets.assetsIconsDoorLock,
|
||||||
icon: Assets.assetsIconsDoorLock,
|
icon: Assets.assetsIconsDoorLock,
|
||||||
@ -760,7 +767,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'far_detection':
|
case 'far_detection':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Human Presence Sensor',
|
deviceName: 'Human Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsFarDetection,
|
icon: Assets.assetsFarDetection,
|
||||||
@ -823,7 +830,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'motion_sensitivity_value':
|
case 'motion_sensitivity_value':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Human Presence Sensor',
|
deviceName: 'Human Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsMotionDetection,
|
icon: Assets.assetsMotionDetection,
|
||||||
@ -863,7 +870,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'motionless_sensitivity':
|
case 'motionless_sensitivity':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Human Presence Sensor',
|
deviceName: 'Human Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsMotionlessDetection,
|
icon: Assets.assetsMotionlessDetection,
|
||||||
@ -908,7 +915,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'indicator':
|
case 'indicator':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Human Presence Sensor',
|
deviceName: 'Human Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsIndicator,
|
icon: Assets.assetsIndicator,
|
||||||
@ -930,7 +937,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'presence_time':
|
case 'presence_time':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Human Presence Sensor',
|
deviceName: 'Human Presence Sensor',
|
||||||
deviceIcon: Assets.assetsIconsSensors,
|
deviceIcon: Assets.assetsIconsSensors,
|
||||||
icon: Assets.assetsNobodyTime,
|
icon: Assets.assetsNobodyTime,
|
||||||
@ -946,7 +953,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'switch_alarm_sound':
|
case 'switch_alarm_sound':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Multi-Mode Gateway Z-W-B',
|
deviceName: 'Multi-Mode Gateway Z-W-B',
|
||||||
deviceIcon: Assets.assetsIconsGateway,
|
deviceIcon: Assets.assetsIconsGateway,
|
||||||
icon: Assets.assetsSwitchAlarmSound,
|
icon: Assets.assetsSwitchAlarmSound,
|
||||||
@ -970,7 +977,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'master_state':
|
case 'master_state':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Multi-Mode Gateway Z-W-B',
|
deviceName: 'Multi-Mode Gateway Z-W-B',
|
||||||
deviceIcon: Assets.assetsIconsGateway,
|
deviceIcon: Assets.assetsIconsGateway,
|
||||||
icon: Assets.assetsMasterState,
|
icon: Assets.assetsMasterState,
|
||||||
@ -995,7 +1002,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
case 'factory_reset':
|
case 'factory_reset':
|
||||||
functions.add(
|
functions.add(
|
||||||
SceneStaticFunction(
|
SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Multi-Mode Gateway Z-W-B',
|
deviceName: 'Multi-Mode Gateway Z-W-B',
|
||||||
deviceIcon: Assets.assetsIconsGateway,
|
deviceIcon: Assets.assetsIconsGateway,
|
||||||
icon: Assets.assetsFactoryReset,
|
icon: Assets.assetsFactoryReset,
|
||||||
@ -1018,7 +1025,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'switch_1':
|
case 'switch_1':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsAcPower,
|
icon: Assets.assetsAcPower,
|
||||||
@ -1045,7 +1052,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'switch_2':
|
case 'switch_2':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsAcPower,
|
icon: Assets.assetsAcPower,
|
||||||
@ -1069,7 +1076,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'switch_3':
|
case 'switch_3':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsAcPower,
|
icon: Assets.assetsAcPower,
|
||||||
@ -1093,7 +1100,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'countdown_1':
|
case 'countdown_1':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsLightCountdown,
|
icon: Assets.assetsLightCountdown,
|
||||||
@ -1107,7 +1114,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'countdown_2':
|
case 'countdown_2':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsLightCountdown,
|
icon: Assets.assetsLightCountdown,
|
||||||
@ -1121,7 +1128,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'countdown_3':
|
case 'countdown_3':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: '3 Gang Button Switch L-L',
|
deviceName: '3 Gang Button Switch L-L',
|
||||||
deviceIcon: Assets.assetsIcons3GangSwitch,
|
deviceIcon: Assets.assetsIcons3GangSwitch,
|
||||||
icon: Assets.assetsLightCountdown,
|
icon: Assets.assetsLightCountdown,
|
||||||
@ -1135,7 +1142,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'switch':
|
case 'switch':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
||||||
deviceIcon: Assets.assetsIconsAC,
|
deviceIcon: Assets.assetsIconsAC,
|
||||||
icon: Assets.assetsAcPower,
|
icon: Assets.assetsAcPower,
|
||||||
@ -1158,14 +1165,14 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'temp_set':
|
case 'temp_set':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
||||||
deviceIcon: Assets.assetsIconsAC,
|
deviceIcon: Assets.assetsIconsAC,
|
||||||
icon: Assets.assetsTempreture,
|
icon: Assets.assetsTempreture,
|
||||||
operationName: 'Set Temperature',
|
operationName: 'Set Temperature',
|
||||||
code: 'temp_set',
|
code: 'temp_set',
|
||||||
functionValue: executorProperty.functionValue != null
|
functionValue: executorProperty.functionValue != null
|
||||||
? ((executorProperty.functionValue / 10) as double).toInt()
|
? ((executorProperty.functionValue! / 10) as double).toInt()
|
||||||
: null,
|
: null,
|
||||||
operationalValues: [
|
operationalValues: [
|
||||||
SceneOperationalValue(
|
SceneOperationalValue(
|
||||||
@ -1178,7 +1185,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'mode':
|
case 'mode':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
||||||
deviceIcon: Assets.assetsIconsAC,
|
deviceIcon: Assets.assetsIconsAC,
|
||||||
icon: Assets.assetsFreezing,
|
icon: Assets.assetsFreezing,
|
||||||
@ -1206,7 +1213,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'level':
|
case 'level':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
||||||
deviceIcon: Assets.assetsIconsAC,
|
deviceIcon: Assets.assetsIconsAC,
|
||||||
icon: Assets.assetsFanSpeed,
|
icon: Assets.assetsFanSpeed,
|
||||||
@ -1239,7 +1246,7 @@ mixin SceneOperationsDataHelper {
|
|||||||
break;
|
break;
|
||||||
case 'child_lock':
|
case 'child_lock':
|
||||||
functions.add(SceneStaticFunction(
|
functions.add(SceneStaticFunction(
|
||||||
deviceId: deviceId,
|
deviceId: action.entityId,
|
||||||
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
deviceName: 'Smart AC Thermostat - Grey - Model A',
|
||||||
deviceIcon: Assets.assetsIconsAC,
|
deviceIcon: Assets.assetsIconsAC,
|
||||||
icon: Assets.assetsChildLock,
|
icon: Assets.assetsChildLock,
|
||||||
@ -1267,6 +1274,11 @@ mixin SceneOperationsDataHelper {
|
|||||||
return functions;
|
return functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///// END of get fucntion for once device based on the CODE ***** ///////
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
|
||||||
List<SceneStaticFunction> getOperationsForOneFunction({
|
List<SceneStaticFunction> getOperationsForOneFunction({
|
||||||
required String deviceId,
|
required String deviceId,
|
||||||
required SceneStaticFunction taskItem,
|
required SceneStaticFunction taskItem,
|
||||||
|
@ -183,9 +183,9 @@ class CreateSceneExecutorProperty {
|
|||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() {
|
||||||
return {
|
return {
|
||||||
'functionCode': functionCode,
|
if (functionCode.isNotEmpty == true) 'functionCode': functionCode,
|
||||||
'functionValue': functionValue,
|
if (functionValue != '') 'functionValue': functionValue,
|
||||||
'delaySeconds': delaySeconds,
|
if (delaySeconds > 0) 'delaySeconds': delaySeconds,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,8 +81,8 @@ class ExecutorProperty {
|
|||||||
factory ExecutorProperty.fromJson(Map<String, dynamic> json) =>
|
factory ExecutorProperty.fromJson(Map<String, dynamic> json) =>
|
||||||
ExecutorProperty(
|
ExecutorProperty(
|
||||||
functionCode: json["functionCode"] ?? '',
|
functionCode: json["functionCode"] ?? '',
|
||||||
functionValue: json["functionValue"],
|
functionValue: json["functionValue"] ?? '',
|
||||||
delaySeconds: json["delaySeconds"],
|
delaySeconds: json["delaySeconds"] ?? 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
|
@ -46,9 +46,7 @@ class DeviceFunctionsView extends StatelessWidget
|
|||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context
|
context.read<CreateSceneBloc>().add(AddTaskEvent());
|
||||||
.read<CreateSceneBloc>()
|
|
||||||
.add(const AddTaskEvent(updateTaskListFromTemp: true));
|
|
||||||
Navigator.popUntil(context, (route) {
|
Navigator.popUntil(context, (route) {
|
||||||
return route.settings.name == Routes.sceneTasksRoute;
|
return route.settings.name == Routes.sceneTasksRoute;
|
||||||
});
|
});
|
||||||
@ -62,7 +60,19 @@ class DeviceFunctionsView extends StatelessWidget
|
|||||||
],
|
],
|
||||||
leading: TextButton(
|
leading: TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.read<CreateSceneBloc>().add(const ClearTaskListEvent());
|
final selectedValue =
|
||||||
|
context.read<CreateSceneBloc>().selectedValues;
|
||||||
|
for (var element in device.functions) {
|
||||||
|
if (selectedValue.containsKey(element.code)) {
|
||||||
|
context
|
||||||
|
.read<CreateSceneBloc>()
|
||||||
|
.add(RemoveTempTaskByIdEvent(code: element.code!));
|
||||||
|
context
|
||||||
|
.read<CreateSceneBloc>()
|
||||||
|
.add(RemoveFromSelectedValueById(code: element.code!));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
child: BodyMedium(
|
child: BodyMedium(
|
||||||
@ -123,6 +133,7 @@ class DeviceFunctionsView extends StatelessWidget
|
|||||||
final functionValues = context
|
final functionValues = context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.selectedValues[functions[index].code];
|
.selectedValues[functions[index].code];
|
||||||
|
|
||||||
context.customAlertDialog(
|
context.customAlertDialog(
|
||||||
alertBody: functions[index].code == 'temp_set'
|
alertBody: functions[index].code == 'temp_set'
|
||||||
? AlertDialogTemperatureBody(
|
? AlertDialogTemperatureBody(
|
||||||
@ -154,6 +165,9 @@ class DeviceFunctionsView extends StatelessWidget
|
|||||||
final selectedValue = context
|
final selectedValue = context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.selectedValues[functions[index].code];
|
.selectedValues[functions[index].code];
|
||||||
|
if (selectedValue == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
context
|
context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.add(TempHoldSceneTasksEvent(
|
.add(TempHoldSceneTasksEvent(
|
||||||
@ -174,22 +188,22 @@ class DeviceFunctionsView extends StatelessWidget
|
|||||||
final tempTaskList = context
|
final tempTaskList = context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.tempTasksList;
|
.tempTasksList;
|
||||||
if (tempTaskList.isEmpty) {
|
// if (tempTaskList.isEmpty) {
|
||||||
context
|
// context
|
||||||
.read<CreateSceneBloc>()
|
// .read<CreateSceneBloc>()
|
||||||
.add(const ClearTempTaskListEvent());
|
// .add(const ClearTempTaskListEvent());
|
||||||
} else {
|
// } else {
|
||||||
for (var element in tempTaskList) {
|
for (var element in tempTaskList) {
|
||||||
if (element.code == functions[index].code) {
|
if (element.code == functions[index].code) {
|
||||||
context.read<CreateSceneBloc>().add(
|
context.read<CreateSceneBloc>().add(
|
||||||
RemoveTempTaskByIdEvent(
|
RemoveTempTaskByIdEvent(
|
||||||
code: functions[index].code));
|
code: functions[index].code));
|
||||||
context.read<CreateSceneBloc>().add(
|
context.read<CreateSceneBloc>().add(
|
||||||
RemoveFromSelectedValueById(
|
RemoveFromSelectedValueById(
|
||||||
code: functions[index].code));
|
code: functions[index].code));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//}
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -33,11 +33,14 @@ class SceneTasksView extends StatelessWidget {
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: 40,
|
width: 40,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: () {
|
onTap: sceneSettings.sceneName.isEmpty
|
||||||
context.customBottomSheet(
|
? null
|
||||||
child: DeleteBottomSheetContent(sceneId: sceneSettings.sceneId),
|
: () {
|
||||||
);
|
context.customBottomSheet(
|
||||||
},
|
child: DeleteBottomSheetContent(
|
||||||
|
sceneId: sceneSettings.sceneId),
|
||||||
|
);
|
||||||
|
},
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
Assets.assetsIconsSettings,
|
Assets.assetsIconsSettings,
|
||||||
colorFilter: const ColorFilter.mode(
|
colorFilter: const ColorFilter.mode(
|
||||||
|
@ -7,6 +7,7 @@ import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_event.dart';
|
|||||||
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart';
|
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart';
|
||||||
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart';
|
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
|
import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
||||||
|
|
||||||
import 'package:syncrow_app/utils/context_extension.dart';
|
import 'package:syncrow_app/utils/context_extension.dart';
|
||||||
|
|
||||||
@ -16,8 +17,8 @@ class SceneView extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (BuildContext context) => SceneBloc()
|
create: (BuildContext context) =>
|
||||||
..add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!)),
|
SceneBloc()..add(LoadScenes(HomeCubit.getInstance().selectedSpace?.id ?? '')),
|
||||||
child: BlocBuilder<CreateSceneBloc, CreateSceneState>(
|
child: BlocBuilder<CreateSceneBloc, CreateSceneState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
if (state is DeleteSceneSuccess) {
|
if (state is DeleteSceneSuccess) {
|
||||||
@ -26,12 +27,17 @@ class SceneView extends StatelessWidget {
|
|||||||
.add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!));
|
.add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (state is CreateSceneWithTasks) {
|
||||||
|
if (state.success == true) {
|
||||||
|
BlocProvider.of<SceneBloc>(context)
|
||||||
|
.add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!));
|
||||||
|
}
|
||||||
|
}
|
||||||
return BlocListener<SceneBloc, SceneState>(
|
return BlocListener<SceneBloc, SceneState>(
|
||||||
listener: (context, state) {
|
listener: (context, state) {
|
||||||
if (state is SceneTriggerSuccess) {
|
if (state is SceneTriggerSuccess) {
|
||||||
context.showCustomSnackbar(
|
context.showCustomSnackbar(
|
||||||
message:
|
message: 'Scene ${state.sceneName} triggered successfully!');
|
||||||
'Scene ${state.sceneName} triggered successfully!');
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: HomeCubit.getInstance().spaces?.isEmpty ?? true
|
child: HomeCubit.getInstance().spaces?.isEmpty ?? true
|
||||||
@ -55,12 +61,22 @@ class SceneView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (state is SceneLoaded) {
|
if (state is SceneLoaded) {
|
||||||
return Expanded(
|
if (state.scenes.isNotEmpty) {
|
||||||
child: SceneGrid(
|
return Expanded(
|
||||||
scenes: state.scenes,
|
child: SceneGrid(
|
||||||
loadingSceneId: state.loadingSceneId,
|
scenes: state.scenes,
|
||||||
),
|
loadingSceneId: state.loadingSceneId,
|
||||||
);
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: BodyMedium(
|
||||||
|
text: 'No scenes have been added yet',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return const SizedBox();
|
return const SizedBox();
|
||||||
|
@ -61,7 +61,10 @@ class _AlertDialogCountdownState extends State<AlertDialogCountdown> {
|
|||||||
durationInSeconds = newDuration.inSeconds;
|
durationInSeconds = newDuration.inSeconds;
|
||||||
});
|
});
|
||||||
context.read<CreateSceneBloc>().add(SelectedValueEvent(
|
context.read<CreateSceneBloc>().add(SelectedValueEvent(
|
||||||
value: newDuration.inSeconds, code: widget.function.code));
|
value: newDuration.inSeconds,
|
||||||
|
code: widget.function.deviceId == 'delay'
|
||||||
|
? 'delay'
|
||||||
|
: widget.function.code));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -29,9 +29,10 @@ class _AlertDialogFunctionsOperationsBodyState
|
|||||||
didChangeDependencies() {
|
didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
|
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
|
||||||
if (tempTaskList.isEmpty) {
|
|
||||||
context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent());
|
|
||||||
} else if (tempTaskList.isNotEmpty) {
|
|
||||||
|
if (tempTaskList.isNotEmpty) {
|
||||||
for (var element in tempTaskList) {
|
for (var element in tempTaskList) {
|
||||||
if (element.code == widget.functions[widget.index].code) {
|
if (element.code == widget.functions[widget.index].code) {
|
||||||
groupValue = element.functionValue;
|
groupValue = element.functionValue;
|
||||||
|
@ -95,7 +95,7 @@ class CustomBottomSheetWidget extends StatelessWidget {
|
|||||||
deviceName: 'Delay The Action',
|
deviceName: 'Delay The Action',
|
||||||
icon: '',
|
icon: '',
|
||||||
operationName: 'Delay The Action',
|
operationName: 'Delay The Action',
|
||||||
code: 'delay',
|
code: '',
|
||||||
functionValue: 0,
|
functionValue: 0,
|
||||||
operationalValues: [
|
operationalValues: [
|
||||||
SceneOperationalValue(icon: '', value: 0),
|
SceneOperationalValue(icon: '', value: 0),
|
||||||
@ -111,11 +111,11 @@ class CustomBottomSheetWidget extends StatelessWidget {
|
|||||||
title: functions[0].operationName,
|
title: functions[0].operationName,
|
||||||
onConfirm: () {
|
onConfirm: () {
|
||||||
final selectedValue =
|
final selectedValue =
|
||||||
context.read<CreateSceneBloc>().selectedValues[functions[0].code];
|
context.read<CreateSceneBloc>().selectedValues['delay'];
|
||||||
context.read<CreateSceneBloc>().add(TempHoldSceneTasksEvent(
|
context.read<CreateSceneBloc>().add(TempHoldSceneTasksEvent(
|
||||||
deviceControlModel: DeviceControlModel(
|
deviceControlModel: DeviceControlModel(
|
||||||
deviceId: 'delay',
|
deviceId: '',
|
||||||
code: functions[0].code,
|
code: '',
|
||||||
value: selectedValue,
|
value: selectedValue,
|
||||||
),
|
),
|
||||||
deviceId: 'delay',
|
deviceId: 'delay',
|
||||||
@ -124,27 +124,26 @@ class CustomBottomSheetWidget extends StatelessWidget {
|
|||||||
deviceName: 'Delay The Action',
|
deviceName: 'Delay The Action',
|
||||||
uniqueId: functions[0].uniqueCustomId,
|
uniqueId: functions[0].uniqueCustomId,
|
||||||
));
|
));
|
||||||
context
|
context.read<CreateSceneBloc>().add(AddTaskEvent());
|
||||||
.read<CreateSceneBloc>()
|
Navigator.pop(context);
|
||||||
.add(const AddTaskEvent(updateTaskListFromTemp: true));
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
onDismiss: () {
|
onDismiss: () {
|
||||||
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
|
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
|
||||||
if (tempTaskList.isEmpty) {
|
// if (tempTaskList.isNotEmpty) {
|
||||||
context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent());
|
// context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent());
|
||||||
} else {
|
// } else {
|
||||||
for (var element in tempTaskList) {
|
for (var element in tempTaskList) {
|
||||||
if (element.code == functions[0].code) {
|
if (element.code == functions[0].code) {
|
||||||
context
|
context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.add(RemoveTempTaskByIdEvent(code: functions[0].code));
|
.add(RemoveTempTaskByIdEvent(code: functions[0].code));
|
||||||
context
|
context
|
||||||
.read<CreateSceneBloc>()
|
.read<CreateSceneBloc>()
|
||||||
.add(RemoveFromSelectedValueById(code: functions[0].code));
|
.add(RemoveFromSelectedValueById(code: functions[0].code));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -45,7 +45,6 @@ class _CreateSceneSaveButtonState extends State<CreateSceneSaveButton>
|
|||||||
if (state.success == true) {
|
if (state.success == true) {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
|
||||||
context.showCustomSnackbar(
|
context.showCustomSnackbar(
|
||||||
message: 'Scene created successfully',
|
message: 'Scene created successfully',
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
@ -123,7 +122,7 @@ class _CreateSceneSaveButtonState extends State<CreateSceneSaveButton>
|
|||||||
),
|
),
|
||||||
isLoading: state is CreateSceneLoading,
|
isLoading: state is CreateSceneLoading,
|
||||||
child: BodyLarge(
|
child: BodyLarge(
|
||||||
text: 'Save',
|
text: widget.sceneName.isNotEmpty ? 'Update' : 'Save',
|
||||||
style: context.bodyLarge.copyWith(color: Colors.white),
|
style: context.bodyLarge.copyWith(color: Colors.white),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -33,7 +33,8 @@ class ThenAddedTasksContainer extends StatelessWidget
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
String operationValue = '';
|
String operationValue = '';
|
||||||
if (taskItem.code.contains('countdown')) {
|
if (taskItem.code.contains('countdown') ||
|
||||||
|
taskItem.deviceId.contains('delay')) {
|
||||||
final functionValue =
|
final functionValue =
|
||||||
taskItem.functionValue ?? taskItem.operationalValues.first.value;
|
taskItem.functionValue ?? taskItem.operationalValues.first.value;
|
||||||
final duration =
|
final duration =
|
||||||
|
@ -55,6 +55,7 @@ class ThenDefaultContainer extends StatelessWidget {
|
|||||||
if (state is CreateSceneLoading) {
|
if (state is CreateSceneLoading) {
|
||||||
return const Center(child: LinearProgressIndicator());
|
return const Center(child: LinearProgressIndicator());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state is AddSceneTask) {
|
if (state is AddSceneTask) {
|
||||||
final taskLists = state.tasksList;
|
final taskLists = state.tasksList;
|
||||||
if (taskLists.isNotEmpty) {
|
if (taskLists.isNotEmpty) {
|
||||||
|
@ -9,8 +9,7 @@ abstract class ApiEndpoints {
|
|||||||
static const String deleteUser = '$baseUrl/authentication/user/delete/{id}';
|
static const String deleteUser = '$baseUrl/authentication/user/delete/{id}';
|
||||||
static const String sendOtp = '$baseUrl/authentication/user/send-otp';
|
static const String sendOtp = '$baseUrl/authentication/user/send-otp';
|
||||||
static const String verifyOtp = '$baseUrl/authentication/user/verify-otp';
|
static const String verifyOtp = '$baseUrl/authentication/user/verify-otp';
|
||||||
static const String forgetPassword =
|
static const String forgetPassword = '$baseUrl/authentication/user/forget-password';
|
||||||
'$baseUrl/authentication/user/forget-password';
|
|
||||||
|
|
||||||
////////////////////////////////////// Spaces ///////////////////////////////////////
|
////////////////////////////////////// Spaces ///////////////////////////////////////
|
||||||
|
|
||||||
@ -20,12 +19,10 @@ abstract class ApiEndpoints {
|
|||||||
static const String addCommunityToUser = '$baseUrl/community/user';
|
static const String addCommunityToUser = '$baseUrl/community/user';
|
||||||
//GET
|
//GET
|
||||||
static const String communityByUuid = '$baseUrl/community/{communityUuid}';
|
static const String communityByUuid = '$baseUrl/community/{communityUuid}';
|
||||||
static const String communityChild =
|
static const String communityChild = '$baseUrl/community/child/{communityUuid}';
|
||||||
'$baseUrl/community/child/{communityUuid}';
|
|
||||||
static const String communityUser = '$baseUrl/community/user/{userUuid}';
|
static const String communityUser = '$baseUrl/community/user/{userUuid}';
|
||||||
//PUT
|
//PUT
|
||||||
static const String renameCommunity =
|
static const String renameCommunity = '$baseUrl/community/rename/{communityUuid}';
|
||||||
'$baseUrl/community/rename/{communityUuid}';
|
|
||||||
|
|
||||||
///Building Module
|
///Building Module
|
||||||
//POST
|
//POST
|
||||||
@ -34,12 +31,10 @@ abstract class ApiEndpoints {
|
|||||||
//GET
|
//GET
|
||||||
static const String buildingByUuid = '$baseUrl/building/{buildingUuid}';
|
static const String buildingByUuid = '$baseUrl/building/{buildingUuid}';
|
||||||
static const String buildingChild = '$baseUrl/building/child/{buildingUuid}';
|
static const String buildingChild = '$baseUrl/building/child/{buildingUuid}';
|
||||||
static const String buildingParent =
|
static const String buildingParent = '$baseUrl/building/parent/{buildingUuid}';
|
||||||
'$baseUrl/building/parent/{buildingUuid}';
|
|
||||||
static const String buildingUser = '$baseUrl/building/user/{userUuid}';
|
static const String buildingUser = '$baseUrl/building/user/{userUuid}';
|
||||||
//PUT
|
//PUT
|
||||||
static const String renameBuilding =
|
static const String renameBuilding = '$baseUrl/building/rename/{buildingUuid}';
|
||||||
'$baseUrl/building/rename/{buildingUuid}';
|
|
||||||
|
|
||||||
///Floor Module
|
///Floor Module
|
||||||
//POST
|
//POST
|
||||||
@ -62,8 +57,7 @@ abstract class ApiEndpoints {
|
|||||||
static const String unitChild = '$baseUrl/unit/child/';
|
static const String unitChild = '$baseUrl/unit/child/';
|
||||||
static const String unitParent = '$baseUrl/unit/parent/{unitUuid}';
|
static const String unitParent = '$baseUrl/unit/parent/{unitUuid}';
|
||||||
static const String unitUser = '$baseUrl/unit/user/';
|
static const String unitUser = '$baseUrl/unit/user/';
|
||||||
static const String invitationCode =
|
static const String invitationCode = '$baseUrl/unit/{unitUuid}/invitation-code';
|
||||||
'$baseUrl/unit/{unitUuid}/invitation-code';
|
|
||||||
static const String verifyInvitationCode = '$baseUrl/unit/user/verify-code';
|
static const String verifyInvitationCode = '$baseUrl/unit/user/verify-code';
|
||||||
|
|
||||||
//PUT
|
//PUT
|
||||||
@ -86,8 +80,7 @@ abstract class ApiEndpoints {
|
|||||||
static const String controlGroup = '$baseUrl/group/control';
|
static const String controlGroup = '$baseUrl/group/control';
|
||||||
//GET
|
//GET
|
||||||
static const String groupBySpace = '$baseUrl/group/{unitUuid}';
|
static const String groupBySpace = '$baseUrl/group/{unitUuid}';
|
||||||
static const String devicesByGroupName =
|
static const String devicesByGroupName = '$baseUrl/group/{unitUuid}/devices/{groupName}';
|
||||||
'$baseUrl/group/{unitUuid}/devices/{groupName}';
|
|
||||||
|
|
||||||
static const String groupByUuid = '$baseUrl/group/{groupUuid}';
|
static const String groupByUuid = '$baseUrl/group/{groupUuid}';
|
||||||
//DELETE
|
//DELETE
|
||||||
@ -99,19 +92,16 @@ abstract class ApiEndpoints {
|
|||||||
static const String addDeviceToRoom = '$baseUrl/device/room';
|
static const String addDeviceToRoom = '$baseUrl/device/room';
|
||||||
static const String addDeviceToGroup = '$baseUrl/device/group';
|
static const String addDeviceToGroup = '$baseUrl/device/group';
|
||||||
static const String controlDevice = '$baseUrl/device/{deviceUuid}/control';
|
static const String controlDevice = '$baseUrl/device/{deviceUuid}/control';
|
||||||
static const String firmwareDevice =
|
static const String firmwareDevice = '$baseUrl/device/{deviceUuid}/firmware/{firmwareVersion}';
|
||||||
'$baseUrl/device/{deviceUuid}/firmware/{firmwareVersion}';
|
|
||||||
static const String getDevicesByUserId = '$baseUrl/device/user/{userId}';
|
static const String getDevicesByUserId = '$baseUrl/device/user/{userId}';
|
||||||
|
static const String getDevicesByUnitId = '$baseUrl/device/unit/{unitUuid}';
|
||||||
|
|
||||||
//GET
|
//GET
|
||||||
static const String deviceByRoom = '$baseUrl/device/room';
|
static const String deviceByRoom = '$baseUrl/device/room';
|
||||||
static const String deviceByUuid = '$baseUrl/device/{deviceUuid}';
|
static const String deviceByUuid = '$baseUrl/device/{deviceUuid}';
|
||||||
static const String deviceFunctions =
|
static const String deviceFunctions = '$baseUrl/device/{deviceUuid}/functions';
|
||||||
'$baseUrl/device/{deviceUuid}/functions';
|
static const String gatewayApi = '$baseUrl/device/gateway/{gatewayUuid}/devices';
|
||||||
static const String gatewayApi =
|
static const String deviceFunctionsStatus = '$baseUrl/device/{deviceUuid}/functions/status';
|
||||||
'$baseUrl/device/gateway/{gatewayUuid}/devices';
|
|
||||||
static const String deviceFunctionsStatus =
|
|
||||||
'$baseUrl/device/{deviceUuid}/functions/status';
|
|
||||||
|
|
||||||
///Device Permission Module
|
///Device Permission Module
|
||||||
//POST
|
//POST
|
||||||
@ -119,16 +109,14 @@ abstract class ApiEndpoints {
|
|||||||
//GET
|
//GET
|
||||||
static const String devicePermissionList = '$baseUrl/device-permission/list';
|
static const String devicePermissionList = '$baseUrl/device-permission/list';
|
||||||
//PUT
|
//PUT
|
||||||
static const String editDevicePermission =
|
static const String editDevicePermission = '$baseUrl/device-permission/edit/{userId}';
|
||||||
'$baseUrl/device-permission/edit/{userId}';
|
|
||||||
|
|
||||||
static const String assignDeviceToRoom = '$baseUrl/device/room';
|
static const String assignDeviceToRoom = '$baseUrl/device/room';
|
||||||
|
|
||||||
/// Scene API ////////////////////
|
/// Scene API ////////////////////
|
||||||
/// POST
|
/// POST
|
||||||
static const String createScene = '$baseUrl/scene/tap-to-run';
|
static const String createScene = '$baseUrl/scene/tap-to-run';
|
||||||
static const String triggerScene =
|
static const String triggerScene = '$baseUrl/scene/tap-to-run/trigger/{sceneId}';
|
||||||
'$baseUrl/scene/tap-to-run/trigger/{sceneId}';
|
|
||||||
|
|
||||||
/// GET
|
/// GET
|
||||||
static const String getUnitScenes = '$baseUrl/scene/tap-to-run/{unitUuid}';
|
static const String getUnitScenes = '$baseUrl/scene/tap-to-run/{unitUuid}';
|
||||||
@ -139,8 +127,7 @@ abstract class ApiEndpoints {
|
|||||||
static const String updateScene = '$baseUrl/scene/tap-to-run/{sceneId}';
|
static const String updateScene = '$baseUrl/scene/tap-to-run/{sceneId}';
|
||||||
|
|
||||||
/// DELETE
|
/// DELETE
|
||||||
static const String deleteScene =
|
static const String deleteScene = '$baseUrl/scene/tap-to-run/{unitUuid}/{sceneId}';
|
||||||
'$baseUrl/scene/tap-to-run/{unitUuid}/{sceneId}';
|
|
||||||
|
|
||||||
//////////////////////Door Lock //////////////////////
|
//////////////////////Door Lock //////////////////////
|
||||||
//online
|
//online
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
|
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||||
import 'package:syncrow_app/features/auth/model/user_model.dart';
|
import 'package:syncrow_app/features/auth/model/user_model.dart';
|
||||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||||
import 'package:syncrow_app/services/api/api_links_endpoints.dart';
|
import 'package:syncrow_app/services/api/api_links_endpoints.dart';
|
||||||
@ -23,6 +24,20 @@ class HomeManagementAPI {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<List<DeviceModel>> fetchDevicesByUnitId() async {
|
||||||
|
List<DeviceModel> list = [];
|
||||||
|
await _httpService.get(
|
||||||
|
path: ApiEndpoints.getDevicesByUnitId
|
||||||
|
.replaceAll("{unitUuid}", HomeCubit.getInstance().selectedSpace?.id ?? ''),
|
||||||
|
showServerMessage: false,
|
||||||
|
expectedResponseModel: (json) {
|
||||||
|
json.forEach((value) {
|
||||||
|
list.add(DeviceModel.fromJson(value));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
static Future<Map<String, dynamic>> assignDeviceToRoom(Map<String, String> body) async {
|
static Future<Map<String, dynamic>> assignDeviceToRoom(Map<String, String> body) async {
|
||||||
try {
|
try {
|
||||||
final response = await _httpService.put(
|
final response = await _httpService.put(
|
||||||
|
@ -5,7 +5,7 @@ description: This is the mobile application project, developed with Flutter for
|
|||||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||||
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
version: 1.0.8+9
|
version: 1.0.0+10
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.6 <4.0.0"
|
sdk: ">=3.0.6 <4.0.0"
|
||||||
|
Reference in New Issue
Block a user