Skip to content

Commit

Permalink
feat: connect to server api
Browse files Browse the repository at this point in the history
  • Loading branch information
jjoonleo committed Apr 4, 2024
1 parent 7b269e4 commit 96ac3ed
Show file tree
Hide file tree
Showing 15 changed files with 206 additions and 163 deletions.
9 changes: 5 additions & 4 deletions front/lib/app/config/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:front/features/mypage/presentation/screen/change_info_list.dart'
import 'package:front/features/mypage/presentation/screen/main_screen.dart';
import 'package:front/features/mypage/presentation/screen/my_info_screen.dart';
import 'package:front/features/mypage/presentation/screen/social_login_info_screen.dart';
import 'package:front/features/project/entities/project.dart';
import 'package:front/features/project/presentaion/screen/project_creation.dart';
import 'package:front/features/project/presentaion/screen/project_detail.dart';
import 'package:front/features/project/presentaion/screen/project_update.dart';
Expand Down Expand Up @@ -56,9 +57,9 @@ final router = GoRouter(initialLocation: '/', routes: [
},
),
GoRoute(
path: 'projectDetail',
name: 'projectDetail',
builder: (context, state) => const ProjectDetailScreen(),
path: 'projectDetail/:projectId',
name: 'projectDetail/:projectId',
builder: (context, state) => ProjectDetailScreen(projectId: int.parse(state.pathParameters['projectId']!)),
),
GoRoute(
path: 'projectCreate/:teamId',
Expand All @@ -69,7 +70,7 @@ final router = GoRouter(initialLocation: '/', routes: [
GoRoute(
path: 'projectUpdate',
name: 'projectUpdate',
builder: (context, state) => ProjectUpdateScreen(),
builder: (context, state) => ProjectUpdateScreen(project: state.extra! as Project),
),
GoRoute(
path: 'main',
Expand Down
15 changes: 0 additions & 15 deletions front/lib/features/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,6 @@ class HomeScreen extends StatelessWidget {
},
child: const Text('formExample'),
),
ElevatedButton(
onPressed: () {
context.go('/projectDetail');
},
child: const Text('프로젝트')),
ElevatedButton(
onPressed: () {
context.go('/projectCreate');
},
child: const Text('프로젝트 생성')),
ElevatedButton(
onPressed: () {
context.go('/projectUpdate');
},
child: const Text('프로젝트 수정')),
ElevatedButton(
onPressed: () {
context.go('/main');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ abstract class ProjectRemoteDataSource {
Future<List<ProjectModel>> getProjectsByTeamId(int teamId);
Future<ProjectModel> getProjectById(int projectId);
Future<ProjectModel> createProject(ProjectRequestModel project, int teamId);
Future<ProjectModel> updateProjectById(
Future<ProjectRequestModel> updateProjectById(
ProjectRequestModel project, int projectId);
Future<void> deleteProjectById(int projectId);
}
Expand All @@ -21,6 +21,7 @@ class ProjectRemoteDataSourceImpl implements ProjectRemoteDataSource {
@override
Future<List<ProjectModel>> getProjectsByTeamId(int teamId) async {
try {
dio.options.headers = {'accessToken': 'true'};
debugPrint('teamId: $teamId');
var response = await dio.get(
'/v1/team/$teamId/projects',
Expand All @@ -43,6 +44,7 @@ class ProjectRemoteDataSourceImpl implements ProjectRemoteDataSource {
@override
Future<ProjectModel> getProjectById(int projectId) async {
try {
dio.options.headers = {'accessToken': 'true'};
var response = await dio.get('/v1/project/$projectId');

if (response.statusCode == 200 && response.data?['resultCode'] == 200) {
Expand All @@ -59,8 +61,16 @@ class ProjectRemoteDataSourceImpl implements ProjectRemoteDataSource {
Future<ProjectModel> createProject(
ProjectRequestModel project, int teamId) async {
try {
var response =
await dio.post('/v1/team/$teamId/project', data: project.toJson());
dio.options.headers = {'accessToken': 'true'};
var response = await dio.post(
'/v1/team/$teamId/project',
data: project.toJson(),
options: Options(
headers: {
'accessToken': 'true',
},
),
);
if (response.statusCode == 201 && response.data?['resultCode'] == 201) {
return ProjectModel.fromJson(response.data['result']);
} else {
Expand All @@ -75,31 +85,35 @@ class ProjectRemoteDataSourceImpl implements ProjectRemoteDataSource {
@override
Future<void> deleteProjectById(int projectId) async {
try {
dio.options.headers = {'accessToken': 'true'};
var response = await dio.delete('/v1/project/$projectId');

if (response.statusCode == 200 && response.data?['resultCode'] == 200) {
return;
} else {
throw ServerException();
}
} on DioException {
} on DioException catch (e){
debugPrint(e.response?.toString());
throw ServerException();
}
}

@override
Future<ProjectModel> updateProjectById(
Future<ProjectRequestModel> updateProjectById(
ProjectRequestModel project, int projectId) async {
try {
dio.options.headers = {'accessToken': 'true'};
var response =
await dio.patch('/v1/project/$projectId', data: project.toJson());
await dio.patch('/v1/project/$projectId', data: project.toJson(),);

if (response.statusCode == 200 && response.data?['resultCode'] == 204) {
return ProjectModel.fromJson(response.data['result']);
if (response.statusCode == 204 && response.data?['resultCode'] == 204) {
return project;
} else {
throw ServerException();
}
} on DioException {
} on DioException catch (e) {
debugPrint(e.response?.toString());
throw ServerException();
}
}
Expand Down
9 changes: 9 additions & 0 deletions front/lib/features/project/data/models/project_request.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:equatable/equatable.dart';
import 'package:front/features/project/entities/project.dart';

class ProjectRequestModel extends Equatable {
const ProjectRequestModel({
Expand All @@ -15,6 +16,14 @@ class ProjectRequestModel extends Equatable {
);
}

factory ProjectRequestModel.fromEntity(Project project) {
return ProjectRequestModel(
name: project.name,
description: project.description,
managerId: project.managerId,
);
}

Map<String, dynamic> toJson() {
return {
'name': name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,12 @@ class ProjectRepositoryImpl implements ProjectRepository {

@override
Future<Either<Failure, Project>> updateProjectById(
ProjectRequestModel project, int projectId) async {
Project project, int projectId) async {
try {
var result =
await projectRemoteDataSource.updateProjectById(project, projectId);
projects.addAll({result.projectId: result.toEntity()});
return Right(result.toEntity());
await projectRemoteDataSource.updateProjectById(ProjectRequestModel.fromEntity(project), projectId);
projects.addAll({projectId: project});
return Right(project);
} on ServerException {
return const Left(ServerFailure('An error has occurred'));
} on SocketException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,12 @@ class _ProjectCreateScreenState extends ConsumerState<ProjectCreateScreen> {
}
}

// //component
//component

// @widgetbook.UseCase(
// name: '',
// type: ProjectCreateScreen,
// )
// Widget projectCreateScreenUseCase(BuildContext context) {
// return ProjectCreateScreen();
// }
@widgetbook.UseCase(
name: '',
type: ProjectCreateScreen,
)
Widget projectCreateScreenUseCase(BuildContext context) {
return ProjectCreateScreen(teamId: 1);
}
84 changes: 54 additions & 30 deletions front/lib/features/project/presentaion/screen/project_detail.dart
Original file line number Diff line number Diff line change
@@ -1,53 +1,76 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:front/core/const/enum.dart';
import 'package:front/features/project/entities/project.dart';
import 'package:front/features/project/presentaion/component/task_component.dart';
import 'package:front/features/project/presentaion/viewmodel/project.dart';
import 'package:front/shared/atom/bottom_navigation_bar.dart';
import 'package:front/shared/utils/intl_format_date.dart';
import 'package:go_router/go_router.dart';
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;

class ProjectDetailScreen extends StatelessWidget {
const ProjectDetailScreen({super.key});
class ProjectDetailScreen extends ConsumerStatefulWidget {
const ProjectDetailScreen({super.key, required this.projectId});

final int projectId;

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: const _Body(),
floatingActionButton: const _AddTaskButton(),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
bottomNavigationBar: const ProjectBottomNavigationBar(),
);
}
ConsumerState<ProjectDetailScreen> createState() =>
_ProjectDetailScreenState();
}

class _Body extends StatelessWidget {
const _Body({Key? key}) : super(key: key);
class _ProjectDetailScreenState extends ConsumerState<ProjectDetailScreen> {
late ProjectViewmodel viewmodel;

@override
void initState() {
super.initState();
viewmodel = ref.read(projectViewmodelProvider.notifier);
viewmodel.getProjectById(widget.projectId);
}

@override
Widget build(BuildContext context) {
var projectName = 'title';
var projectState = ref.watch(projectViewmodelProvider);
var projectStartTime = DateTime.now();
var projectTask = [];
var h1Textstyle =
const TextStyle(fontSize: 20, fontWeight: FontWeight.bold);
return SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'$projectName의 TimeLine',
style: h1Textstyle,
return Scaffold(
appBar: AppBar(),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: SingleChildScrollView(
child: projectState.when(
(project) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${project.name}의 TimeLine',
style: h1Textstyle,
),
Text('${intlFormatDate(projectStartTime)}~'),
Text(project.description),
for (int i = 0; i < projectTask.length; i++)
TaskComponent(task: projectTask[i]),
TextButton(
child: Text('수정d'),
onPressed: () =>
context.push('/projectUpdate', extra: project),
)
],
),
Text('${intlFormatDate(projectStartTime)}~'),
const Text('프로젝트 설명'),
for (int i = 0; i < projectTask.length; i++)
TaskComponent(task: projectTask[i])
],
loading: () => const CircularProgressIndicator(),
error: (message) => Text(message.toString()),

),
),
),
),
floatingActionButton: const _AddTaskButton(),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
bottomNavigationBar: const ProjectBottomNavigationBar(),
);
}
}
Expand All @@ -73,5 +96,6 @@ class _AddTaskButton extends StatelessWidget {
type: ProjectDetailScreen,
)
Widget ProjectDetailScreenUseCase(BuildContext context) {
return const ProjectDetailScreen();
return ProjectDetailScreen(
projectId: 1);
}
Loading

0 comments on commit 96ac3ed

Please sign in to comment.