Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,6 @@ flutter {
source '../..'
}

dependencies {}
dependencies {
implementation 'com.naver.maps:map-sdk:3.19.1'
}
3 changes: 3 additions & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ allprojects {
repositories {
google()
mavenCentral()
maven {
url 'https://repository.map.naver.com/archive/maven'
}
}
}

Expand Down
145 changes: 34 additions & 111 deletions lib/Screen/Car/car_add_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'package:appfront/Screen/Car/services/car_add_service.dart';
import 'package:appfront/userData.dart';

class CarAddScreen extends ConsumerStatefulWidget {
Expand All @@ -17,125 +15,50 @@ class _CarAddScreenState extends ConsumerState<CarAddScreen> {
TextEditingController carNumberController = TextEditingController();

Future<void> registerCar() async {
String apiUrl = "https://api.parkchargego.link/api/v1/car";
String carNum = carNumberController.text;

if (carNum.isEmpty) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Error"),
content: const Text("차량 번호는 필수 요소입니다."),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
_showDialog("Error", "차량 번호는 필수 요소입니다.");
return;
}

debugPrint("Request Body: $carNum");
try {
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");
var response = await http.post(
Uri.parse(apiUrl),
headers: {
'Content-Type': 'application/json',
'Cookie': 'access-token=$accessToken; refresh-token=$refreshToken'
},
body: jsonEncode({"carNum": carNum}),
);
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");

debugPrint("Response status: ${response.statusCode}");
debugPrint("Response body: ${response.body}");
final response =
await CarService.registerCar(carNum, accessToken!, refreshToken!);

if (response.statusCode == 201) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Success"),
content: const Text("차량 등록 성공."),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
Navigator.of(context).pop();
},
),
],
);
},
);
} else if (response.statusCode == 409) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Error"),
content: const Text("이미 등록된 차량 번호입니다."),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
} else {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Error"),
content: const Text("차량 등록 실패"),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
} catch (e) {
print("차량 등록 실패");
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Error"),
content: const Text("차량 등록 실패"),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
if (response == 201) {
_showDialog("Success", "차량 등록 성공.", onSuccess: true);
} else if (response == 409) {
_showDialog("Error", "이미 등록된 차량 번호입니다.");
} else {
_showDialog("Error", "차량 등록 실패");
}
}

void _showDialog(String title, String content, {bool onSuccess = false}) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(title),
content: Text(content),
actions: [
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.of(context).pop();
if (onSuccess) Navigator.of(context).pop();
},
),
],
);
},
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand Down
150 changes: 40 additions & 110 deletions lib/Screen/Car/car_screen.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'package:appfront/Screen/Car/car_add_screen.dart';
import 'package:appfront/Screen/Car/services/car_service.dart';
import 'package:appfront/Screen/Car/widgets/car_list.dart';
import 'package:appfront/userData.dart';
import 'package:appfront/Screen/Car/car_add_screen.dart';

class CarScreen extends ConsumerStatefulWidget {
const CarScreen({super.key});
Expand All @@ -25,128 +23,60 @@ class _CarScreenState extends ConsumerState<CarScreen> {
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");
fetchCars(accessToken!, refreshToken!);
await _fetchCars(accessToken!, refreshToken!);
});
}

Future<void> fetchCars(String accessToken, String refreshToken) async {
String apiUrl = "https://api.parkchargego.link/api/v1/car";
try {
var response = await http.get(Uri.parse(apiUrl), headers: {
'Cookie': 'access-token=$accessToken; refresh-token=$refreshToken'
Future<void> _fetchCars(String accessToken, String refreshToken) async {
final fetchedCars = await CarService.fetchCars(accessToken, refreshToken);
if (fetchedCars != null) {
setState(() {
cars = fetchedCars;
isLoading = false;
});
debugPrint("Response headers: ${response.headers}");
debugPrint("Response Body: ${response.body}");
debugPrint("Response statusCode: ${response.statusCode}");
if (response.statusCode == 200) {
var jsonResponse = jsonDecode(response.body) as List;
setState(() {
cars = jsonResponse.map((car) {
return {
'id': car['id'].toString(),
'carNum': car['carNum'].toString()
};
}).toList();
isLoading = false;
});
} else {
setState(() {
isLoading = false;
});
}
} catch (e) {
print('차량 조회 실패');
} else {
setState(() {
isLoading = false;
});
}
}

Future<void> deleteCar(String carId) async {
Future<void> _deleteCar(String carId) async {
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");
String apiUrl = "https://api.parkchargego.link/api/v1/car/$carId";
try {
var response = await http.delete(Uri.parse(apiUrl), headers: {
'Content-Type': 'application/json',
'Cookie': 'access-token=$accessToken; refresh-token=$refreshToken'
});
if (response.statusCode == 200) {
print("차량 삭제 성공");
await fetchCars(accessToken!, refreshToken!);
} else {
print("차량 삭제 실패");
}
} catch (e) {
print('차량 삭제 실패');
}
await CarService.deleteCar(carId, accessToken!, refreshToken!);
await _fetchCars(accessToken, refreshToken);
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("차량 관리"),
centerTitle: true,
),
body: Center(
child: isLoading
? const CircularProgressIndicator()
: cars.isEmpty
? null
: ListView.builder(
itemCount: cars.length,
itemBuilder: (context, index) {
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(
vertical: 5, horizontal: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: const Color(0xFF39c5bb),
width: 3,
),
borderRadius: BorderRadius.circular(12),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'차량 번호: ${cars[index]['carNum']}',
style: const TextStyle(fontSize: 16),
),
IconButton(
icon: const Icon(Icons.delete,
color: Colors.blueGrey),
onPressed: () async {
await deleteCar(cars[index]['id']!);
},
),
],
),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const CarAddScreen()),
);
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");
fetchCars(accessToken!, refreshToken!);
},
foregroundColor: Colors.white,
backgroundColor: const Color(0xFF39c5bb),
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
child: const Icon(Icons.add),
));
appBar: AppBar(
title: const Text("차량 관리"),
centerTitle: true,
),
body: isLoading
? const Center(child: CircularProgressIndicator())
: cars.isEmpty
? const Center(child: Text('차량이 없습니다.'))
: CarList(cars: cars, onDelete: _deleteCar),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const CarAddScreen()),
);
final data = ref.read(userDataProvider);
final accessToken = await data.storage!.read(key: "accessToken");
final refreshToken = await data.storage!.read(key: "refreshToken");
await _fetchCars(accessToken!, refreshToken!);
},
foregroundColor: Colors.white,
backgroundColor: const Color(0xFF39c5bb),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
child: const Icon(Icons.add),
),
);
}
}
24 changes: 24 additions & 0 deletions lib/Screen/Car/services/car_add_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'dart:convert';
import 'package:http/http.dart' as http;

class CarService {
static const String apiUrl = "https://api.parkchargego.link/api/v1/car";

static Future<int?> registerCar(
String carNum, String accessToken, String refreshToken) async {
try {
var response = await http.post(
Uri.parse(apiUrl),
headers: {
'Content-Type': 'application/json',
'Cookie': 'access-token=$accessToken; refresh-token=$refreshToken'
},
body: jsonEncode({"carNum": carNum}),
);
return response.statusCode;
} catch (e) {
print("차량 등록 실패: $e");
return null;
}
}
}
Loading