stadsactiviteit_create.dart.txt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Automatic FlutterFlow imports
  2. import '/backend/schema/structs/index.dart';
  3. import '/flutter_flow/flutter_flow_theme.dart';
  4. import '/flutter_flow/flutter_flow_util.dart';
  5. import 'index.dart'; // Imports other custom actions
  6. import '/flutter_flow/custom_functions.dart'; // Imports custom functions
  7. import 'package:flutter/material.dart';
  8. // Begin custom action code
  9. // DO NOT REMOVE OR MODIFY THE CODE ABOVE!
  10. // ⬇⬇⬇ PLAK VANAF HIER — de drie importregels horen erbij! ⬇⬇⬇
  11. // Zonder 'package:http' faalt de build met: Undefined name 'http'.
  12. import 'dart:async';
  13. import 'dart:convert';
  14. import 'package:http/http.dart' as http;
  15. Future<dynamic> stadsactiviteitCreate(
  16. String sessionName,
  17. String sessionId,
  18. String token,
  19. String titel,
  20. String plaatsTid,
  21. String datumStart,
  22. String? datumEind,
  23. String? omschrijving,
  24. String? organisator,
  25. String? contact,
  26. String? adresStraat,
  27. String? adresPlaats,
  28. String? adresPostcode,
  29. String? entreePrijs,
  30. String? toelichtingEntree,
  31. List<String>? categorieTids,
  32. String? websiteUrl,
  33. String? logoFid,
  34. List<String>? fotosFids,
  35. String? entreeTid,
  36. ) async {
  37. if (titel.trim().isEmpty) {
  38. return {'success': false, 'error': 'Titel is verplicht'};
  39. }
  40. final plaatsTidInt = int.tryParse(plaatsTid.trim());
  41. if (plaatsTidInt == null) {
  42. return {'success': false, 'error': 'Ongeldige plaats'};
  43. }
  44. if (datumStart.trim().isEmpty) {
  45. return {'success': false, 'error': 'Datum is verplicht'};
  46. }
  47. // Einddatum mag niet vóór de startdatum liggen (P2-29 / A3).
  48. // Beide komen binnen als 'yyyy-MM-dd HH:mm:ss'; DateTime.tryParse
  49. // accepteert die vorm. Een lege einddatum betekent: geen einddatum.
  50. if ((datumEind ?? '').trim().isNotEmpty) {
  51. final start = DateTime.tryParse(datumStart.trim());
  52. final eind = DateTime.tryParse(datumEind!.trim());
  53. if (start != null && eind != null && eind.isBefore(start)) {
  54. return {
  55. 'success': false,
  56. 'error': 'De einddatum ligt vóór de startdatum',
  57. };
  58. }
  59. }
  60. final body = <String, dynamic>{
  61. 'titel': titel.trim(),
  62. 'plaats_tid': plaatsTidInt,
  63. 'datum_start': datumStart.trim(),
  64. };
  65. if ((datumEind ?? '').trim().isNotEmpty) {
  66. body['datum_eind'] = datumEind!.trim();
  67. }
  68. if ((omschrijving ?? '').trim().isNotEmpty) {
  69. body['omschrijving'] = omschrijving!.trim();
  70. }
  71. if ((organisator ?? '').trim().isNotEmpty) {
  72. body['organisator'] = organisator!.trim();
  73. }
  74. if ((contact ?? '').trim().isNotEmpty) {
  75. body['contact'] = contact!.trim();
  76. }
  77. if ((adresStraat ?? '').trim().isNotEmpty ||
  78. (adresPlaats ?? '').trim().isNotEmpty ||
  79. (adresPostcode ?? '').trim().isNotEmpty) {
  80. body['adres'] = {
  81. if ((adresStraat ?? '').trim().isNotEmpty)
  82. 'thoroughfare': adresStraat!.trim(),
  83. if ((adresPlaats ?? '').trim().isNotEmpty)
  84. 'locality': adresPlaats!.trim(),
  85. if ((adresPostcode ?? '').trim().isNotEmpty)
  86. 'postal_code': adresPostcode!.trim(),
  87. 'country': 'NL',
  88. };
  89. }
  90. if ((entreePrijs ?? '').trim().isNotEmpty) {
  91. body['entree_prijs'] = entreePrijs!.trim();
  92. }
  93. if ((toelichtingEntree ?? '').trim().isNotEmpty) {
  94. body['toelichting_entree'] = toelichtingEntree!.trim();
  95. }
  96. if (categorieTids != null && categorieTids.isNotEmpty) {
  97. final tids = categorieTids
  98. .map((e) => int.tryParse(e.trim()))
  99. .whereType<int>()
  100. .toList();
  101. if (tids.isNotEmpty) body['categorie_tids'] = tids;
  102. }
  103. if ((websiteUrl ?? '').trim().isNotEmpty) {
  104. body['website_url'] = websiteUrl!.trim();
  105. }
  106. if ((logoFid ?? '').trim().isNotEmpty) {
  107. final fid = int.tryParse(logoFid!.trim());
  108. if (fid != null) body['logo_fid'] = fid;
  109. }
  110. if (fotosFids != null && fotosFids.isNotEmpty) {
  111. final fids =
  112. fotosFids.map((e) => int.tryParse(e.trim())).whereType<int>().toList();
  113. if (fids.isNotEmpty) body['fotos_fids'] = fids;
  114. }
  115. if ((entreeTid ?? '').trim().isNotEmpty) {
  116. final tid = int.tryParse(entreeTid!.trim());
  117. if (tid != null) body['entree_tid'] = tid;
  118. }
  119. final headers = <String, String>{
  120. 'Accept': 'application/json',
  121. 'Content-Type': 'application/json',
  122. };
  123. if (sessionName.trim().isNotEmpty && sessionId.trim().isNotEmpty) {
  124. headers['Cookie'] = '$sessionName=$sessionId';
  125. }
  126. if (token.trim().isNotEmpty) {
  127. headers['X-CSRF-Token'] = token;
  128. }
  129. final base = FFAppState().apiBaseUrl.trim().isEmpty
  130. ? 'https://uitgaanskrant.com'
  131. : FFAppState().apiBaseUrl.trim();
  132. final url = '$base/en/flutterdrup/stadsactiviteiten/create.json';
  133. print('========================================');
  134. print('STADSACTIVITEIT CREATE');
  135. print('URL : $url');
  136. print('BODY : ${jsonEncode(body)}');
  137. print('========================================');
  138. try {
  139. final response = await http
  140. .post(Uri.parse(url), headers: headers, body: jsonEncode(body))
  141. .timeout(const Duration(seconds: 30));
  142. print('========================================');
  143. print('STATUS : ${response.statusCode}');
  144. print('BODY');
  145. print(response.body);
  146. print('========================================');
  147. dynamic data;
  148. try {
  149. data = jsonDecode(response.body);
  150. } catch (_) {
  151. data = response.body;
  152. }
  153. if (response.statusCode >= 200 && response.statusCode < 300) {
  154. return {
  155. 'success': true,
  156. 'nid': data is Map ? (data['nid']?.toString() ?? '') : '',
  157. 'status': data is Map ? (data['status']?.toString() ?? '') : '',
  158. };
  159. }
  160. return {
  161. 'success': false,
  162. 'statusCode': response.statusCode,
  163. 'error':
  164. data is Map ? (data['message'] ?? data.toString()) : data.toString(),
  165. };
  166. } on TimeoutException {
  167. return {'success': false, 'error': 'Timeout'};
  168. } catch (e, stack) {
  169. print(e);
  170. print(stack);
  171. return {'success': false, 'error': e.toString()};
  172. }
  173. }