This commit is contained in:
Dmitry 2024-08-25 02:40:52 +03:00
parent 764ac1bb82
commit a348a0ac65
3 changed files with 170 additions and 148 deletions

View file

@ -1,6 +1,8 @@
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mnemo_cards/admin/admin_api.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
@ -57,6 +59,22 @@ class AddPromocodeCampaign {
return true;
}
Future<bool> _loadCampaign(String id) async {
try {
final campaign = await adminApi.getPromoCodeCampaign(id);
if (campaign != null) {
_campaigns.removeWhere((v) => v.id.toString() == id);
_campaigns.add(campaign);
campaignDto = campaign;
}
} catch (e, s) {
log('Error', error: e, stackTrace: s);
print('Error $e');
return false;
}
return true;
}
void _savePromoCodeCampaign() async {
final result = await adminApi.addPromoCodeCampaign(campaignDto);
if (!result) {
@ -105,6 +123,8 @@ class AddPromocodeCampaign {
child: Scaffold(
body: Material(
child: StatefulBuilder(builder: (context, setCampaign) {
final codes = campaignDto.promoCodes;
return ListView(
children: [
Header(
@ -112,13 +132,16 @@ class AddPromocodeCampaign {
hasPopButton: true,
trail: Row(
children: [
IconButton(
onPressed: () async {
await _loadCampaigns();
setCampaign(() {});
},
icon: Icon(Icons.sync),
),
if (campaignDto.id != null)
IconButton(
onPressed: () async {
await _loadCampaign(
campaignDto.id.toString(),
);
setCampaign(() {});
},
icon: Icon(Icons.note),
),
IconButton(
onPressed: _savePromoCodeCampaign,
icon: Icon(Icons.save),
@ -158,7 +181,7 @@ class AddPromocodeCampaign {
value: campaign?.id,
label: campaign == null
? 'New'
: '${campaign.name ?? campaign.promoCodes?.firstOrNull ?? campaign.id} ${campaign.status.name}',
: '${campaign.name ??campaign.id} ${campaign.status.name}',
);
}).toList(),
),
@ -166,147 +189,142 @@ class AddPromocodeCampaign {
return Padding(
padding: EdgeInsets.all(8.0),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
TextParam(
'Name',
campaignDto.name,
(v) {
campaignDto = campaignDto.copyWith(
name: v,
TextParam(
'Name',
campaignDto.name,
(v) {
campaignDto = campaignDto.copyWith(
name: v,
);
},
),
TextParam(
'Template',
campaignDto.template,
(v) {
campaignDto = campaignDto.copyWith(
template: v,
);
},
description:
r'$d - digit $l - letter $s - any',
),
IntParam(
'Generation size',
campaignDto.generationSize,
(v) {
campaignDto = campaignDto.copyWith(
generationSize: v);
},
),
IntParam(
'Activations per code',
campaignDto.activationsPerCode,
(v) {
campaignDto = campaignDto.copyWith(
activationsPerCode: v,
);
},
),
DateParam(
'Start',
campaignDto.start,
(v) {
setState(() {
campaignDto =
campaignDto.copyWith(start: v);
});
},
),
DateParam(
'Finish',
campaignDto.finish,
(v) {
setState(() {
campaignDto =
campaignDto.copyWith(finish: v);
});
},
),
EnumParam(
'Status',
PromoCodeCampaignStatus.values,
campaignDto.status, (v) {
setState(() {
campaignDto =
campaignDto.copyWith(status: v);
});
}),
Text(
'Created to generate promocodes\n'
'Disabled to disable\n'
'Dont use other statuses!',
style: TextStyle(fontSize: 12),
),
Text('Products:'),
ListView.builder(
shrinkWrap: true,
itemCount:
campaignDto.products.length + 1,
itemBuilder: (context, index) {
if (index ==
campaignDto.products.length) {
return ListTile(
title: Text('Add'),
onTap: () async {
final p =
await _showProductDialog(
context, null);
if (p != null) {
setState(() {
campaignDto.products.add(p);
});
}
},
);
}
final item =
campaignDto.products[index];
return ListTile(
title: Text(
'${item.type.name} ${item.id ?? ''}'),
onTap: () async {
final p = await _showProductDialog(
context,
item,
);
},
),
TextParam(
'Template',
campaignDto.template,
(v) {
campaignDto = campaignDto.copyWith(
template: v,
);
},
description:
r'$d - digit $l - letter $s - any',
),
IntParam(
'Generation size',
campaignDto.generationSize,
(v) {
campaignDto = campaignDto.copyWith(
generationSize: v);
},
),
IntParam(
'Activations per code',
campaignDto.activationsPerCode,
(v) {
campaignDto = campaignDto.copyWith(
activationsPerCode: v,
);
},
),
DateParam(
'Start',
campaignDto.start,
(v) {
setState(() {
campaignDto = campaignDto
.copyWith(start: v);
});
},
),
DateParam(
'Finish',
campaignDto.finish,
(v) {
setState(() {
campaignDto = campaignDto
.copyWith(finish: v);
});
},
),
DateParam(
'Finish',
campaignDto.finish,
(v) {
setState(() {
campaignDto = campaignDto
.copyWith(finish: v);
});
},
),
EnumParam(
'Status',
PromoCodeCampaignStatus.values,
campaignDto.status, (v) {
setState(() {
campaignDto =
campaignDto.copyWith(status: v);
});
}),
Text(
'Created to generate promocodes\n'
'Disabled to disable\n'
'Dont use other statuses!',
style: TextStyle(fontSize: 12),
),
Text('Products:'),
ListView.builder(
shrinkWrap: true,
itemCount:
campaignDto.products.length + 1,
itemBuilder: (context, index) {
if (index ==
campaignDto.products.length) {
return ListTile(
title: Text('Add'),
onTap: () async {
final p =
await _showProductDialog(
context, null);
if (p != null) {
setState(() {
campaignDto.products
.add(p);
});
}
},
);
if (p != null) {
setState(() {
campaignDto.products.add(p);
});
}
final item =
campaignDto.products[index];
return ListTile(
title: Text(
'${item.type.name} ${item.id ?? ''}'),
onTap: () async {
final p =
await _showProductDialog(
context,
item,
);
if (p != null) {
setState(() {
campaignDto.products.add(p);
});
}
},
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
setState(() {
campaignDto.products
.remove(item);
});
},
),
);
},
),
],
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
setState(() {
campaignDto.products
.remove(item);
});
},
),
);
},
),
SimpleTile.text(
text: codes == null
? 'Codes not loaded'
: 'Codes: ${codes.length == 1 ? codes.first : codes.length}',
onTap: () async {
if (codes != null) {
await Clipboard.setData(
ClipboardData(
text: codes.join('\n'),
),
);
}
},
),
],
),

View file

@ -4,6 +4,7 @@ import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:mnemo_cards/di/injector.dart';
import 'package:mnemo_cards/features/packs/packs_api.dart';
import 'package:mnemo_cards/features/worker/worker_ext.dart';
import 'package:mnemo_cards/managers/repository/api.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
@ -153,12 +154,15 @@ class AdminApi with Api {
}
Future<List<PromoCodesCampaignDto>> getPromoCodeCampaigns() async {
final r = await _dio.get<String>(
'$path/promocode/list',
);
final r = await _dio.get<String>('$path/promocode/list');
return (jsonDecode(r.data!)['campaigns'] as List)
.cast<Map<String, Object?>>()
.map(PromoCodesCampaignDto.fromJson)
.toList();
}
Future<PromoCodesCampaignDto?> getPromoCodeCampaign(String id) async {
final r = await _dio.get<String>('$path/promocode/$id');
return r.data?.isolatedDecode(PromoCodesCampaignDto.fromJson);
}
}