Skip to content

Commit e26d16e

Browse files
committed
✨ feat: base popup dialog widget 추가 및 챌린지 디테일 팝업 구현
1 parent 2bf6ca0 commit e26d16e

25 files changed

+633
-43
lines changed

client/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
22
<application
3+
android:enableOnBackInvokedCallback="true"
34
android:label="habit_earth"
45
android:name="${applicationName}"
56
android:icon="@mipmap/ic_launcher">

client/lib/config/app_pages.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:greenap/views/mypage/mypage_screen.dart';
66
import 'package:greenap/views/root/root_screen.dart';
77
import 'package:greenap/views/verification/verification_screen.dart';
88
import 'package:greenap/views/category_detail/category_detail_screen.dart';
9-
import 'package:greenap/models/challenge_category.dart';
9+
import 'package:greenap/domain/models/challenge_category.dart';
1010
import 'package:greenap/bindings/root_binding.dart';
1111
import 'package:greenap/bindings/category_detail_binding.dart';
1212
import 'app_routes.dart';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ enum ChallengeStatus { running, completed }
33
enum ChallengeFilterStatus { all, running, completed }
44

55
enum ChallengeCertificated { FAILED, SUCESSED }
6+
7+
enum ChallengeDuration { sevenDays, tenDays, fifteenDays, thirtyDays }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import '../enums/challenge.dart';
2+
3+
extension ChallengeDurationExtension on ChallengeDuration {
4+
int get days {
5+
switch (this) {
6+
case ChallengeDuration.sevenDays:
7+
return 7;
8+
case ChallengeDuration.tenDays:
9+
return 10;
10+
case ChallengeDuration.fifteenDays:
11+
return 15;
12+
case ChallengeDuration.thirtyDays:
13+
return 30;
14+
}
15+
}
16+
}
File renamed without changes.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'challenge_item.dart';
2+
3+
class ChallengeDetailModel extends ChallengeItemModel {
4+
final String preDescription;
5+
final String certificationMethodDescription;
6+
final List<int> participationDates;
7+
final double percentOfCompletedUser;
8+
9+
ChallengeDetailModel({
10+
required int id,
11+
required String title,
12+
required String description,
13+
required String mainImageUrl,
14+
required this.preDescription,
15+
required this.certificationMethodDescription,
16+
required this.participationDates,
17+
required this.percentOfCompletedUser,
18+
}) : super(
19+
id: id,
20+
title: title,
21+
description: description,
22+
mainImageUrl: mainImageUrl,
23+
);
24+
25+
factory ChallengeDetailModel.fromJson(Map<String, dynamic> json) {
26+
return ChallengeDetailModel(
27+
id: json['id'],
28+
title: json['title'],
29+
description: json['description'],
30+
mainImageUrl:
31+
json['image_url'], // 상세 API는 `mainImageUrl` 대신 `image_url`을 쓰므로 여기에 맞춤
32+
preDescription: json['pre_description'],
33+
certificationMethodDescription: json['certification_method_description'],
34+
participationDates:
35+
(json['participation_dates'] as List)
36+
.map((e) => int.parse(e.toString()))
37+
.toList(),
38+
percentOfCompletedUser: double.parse(
39+
(json['percent_of_completed_user']).toStringAsFixed(2),
40+
),
41+
);
42+
}
43+
}
File renamed without changes.
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
import 'package:greenap/domain/models/challenge_detail.dart';
2+
3+
final List<ChallengeDetailModel> dummyChallengeDetails = [
4+
ChallengeDetailModel(
5+
id: 1,
6+
title: "멀티탭, 안 쓰는 조명 끄기",
7+
preDescription: "멀티탭, 안 쓰는 조명 끄기 챌린지는 환경 보호를 실천하는 활동입니다.",
8+
description: "대기전력을 차단해 전기 절약과 탄소 감축을 실천하는 챌린지입니다.",
9+
mainImageUrl: "assets/images/resource/resource_challenge1.png",
10+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
11+
participationDates: [7, 10, 15, 30],
12+
percentOfCompletedUser: 0.52,
13+
),
14+
ChallengeDetailModel(
15+
id: 2,
16+
title: "배달 일회용품 줄이기",
17+
preDescription: "배달 일회용품 줄이기 챌린지는 환경 보호를 실천하는 활동입니다.",
18+
description: "배달 시 일회용 대신 다회용 식기를 쓰는 챌린지입니다.",
19+
mainImageUrl: "assets/images/resource/resource_challenge2.png",
20+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
21+
participationDates: [7, 10, 15, 30],
22+
percentOfCompletedUser: 0.54,
23+
),
24+
ChallengeDetailModel(
25+
id: 3,
26+
title: "에어컨, 난방 끄고 환기 시키기",
27+
preDescription: "에어컨, 난방 끄고 환기 시키기 챌린지는 환경 보호를 실천하는 활동입니다.",
28+
description: "에어컨이나 난방을 잠시 끄고 창문을 열어 환기하며 에너지를 아끼는 챌린지입니다.",
29+
mainImageUrl: "assets/images/resource/resource_challenge3.png",
30+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
31+
participationDates: [7, 10, 15, 30],
32+
percentOfCompletedUser: 0.56,
33+
),
34+
ChallengeDetailModel(
35+
id: 4,
36+
title: "양치컵 사용하기",
37+
preDescription: "양치컵 사용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
38+
description: "양치할 때 물을 틀어놓지 않고 양치컵을 사용하는 챌린지입니다.",
39+
mainImageUrl: "assets/images/resource/resource_challenge4.png",
40+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
41+
participationDates: [7, 10, 15, 30],
42+
percentOfCompletedUser: 0.58,
43+
),
44+
ChallengeDetailModel(
45+
id: 5,
46+
title: "다회용 빨대 사용하기",
47+
preDescription: "다회용 빨대 사용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
48+
description: "음료를 마실 때 일회용 대신 다회용 빨대를 사용하는 챌린지입니다.",
49+
mainImageUrl: "assets/images/reuse/reuse_challenge1.png",
50+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
51+
participationDates: [7, 10, 15, 30],
52+
percentOfCompletedUser: 0.5,
53+
),
54+
ChallengeDetailModel(
55+
id: 6,
56+
title: "장바구니 사용하기",
57+
preDescription: "장바구니 사용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
58+
description: "장을 볼 때 비닐봉투 대신 장바구니를 사용하는 챌린지입니다.",
59+
mainImageUrl: "assets/images/reuse/reuse_challenge2.png",
60+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
61+
participationDates: [7, 10, 15, 30],
62+
percentOfCompletedUser: 0.52,
63+
),
64+
ChallengeDetailModel(
65+
id: 7,
66+
title: "다회용 행주 사용하기",
67+
preDescription: "다회용 행주 사용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
68+
description: "키친타올이나 물티슈 대신 다회용 행주를 사용하는 챌린지입니다.",
69+
mainImageUrl: "assets/images/reuse/reuse_challenge3.png",
70+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
71+
participationDates: [7, 10, 15, 30],
72+
percentOfCompletedUser: 0.54,
73+
),
74+
ChallengeDetailModel(
75+
id: 8,
76+
title: "텀블러 사용하기",
77+
preDescription: "텀블러 사용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
78+
description: "카페나 사무실에서 종이컵 대신 텀블러를 사용하는 챌린지입니다.",
79+
mainImageUrl: "assets/images/reuse/reuse_challenge4.png",
80+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
81+
participationDates: [7, 10, 15, 30],
82+
percentOfCompletedUser: 0.56,
83+
),
84+
ChallengeDetailModel(
85+
id: 9,
86+
title: "전자 영수증 받기",
87+
preDescription: "전자 영수증 받기 챌린지는 환경 보호를 실천하는 활동입니다.",
88+
description: "영수증을 종이로 받지 않고 대신 전자 영수증을 받는 챌린지입니다.",
89+
mainImageUrl: "assets/images/reuse/reuse_challenge5.png",
90+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
91+
participationDates: [7, 10, 15, 30],
92+
percentOfCompletedUser: 0.58,
93+
),
94+
ChallengeDetailModel(
95+
id: 10,
96+
title: "친환경 인증 마크 수집",
97+
preDescription: "친환경 인증 마크 수집 챌린지는 환경 보호를 실천하는 활동입니다.",
98+
description: "친환경 인증 마크가 있는 제품을 찾아 사용하는 챌린지입니다.",
99+
mainImageUrl: "assets/images/eco/eco_challenge1.png",
100+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
101+
participationDates: [7, 10, 15, 30],
102+
percentOfCompletedUser: 0.5,
103+
),
104+
ChallengeDetailModel(
105+
id: 11,
106+
title: "SNS 사용 시간 단축",
107+
preDescription: "SNS 사용 시간 단축 챌린지는 환경 보호를 실천하는 활동입니다.",
108+
description: "SNS 사용 시간을 줄여 디지털 탄소까지 줄이는 습관을 만드는 챌린지입니다.",
109+
mainImageUrl: "assets/images/eco/eco_challenge2.png",
110+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
111+
participationDates: [7, 10, 15, 30],
112+
percentOfCompletedUser: 0.52,
113+
),
114+
ChallengeDetailModel(
115+
id: 12,
116+
title: "이메일 정리",
117+
preDescription: "이메일 정리 챌린지는 환경 보호를 실천하는 활동입니다.",
118+
description: "불필요한 이메일을 정리해 저장된 디지털 탄소자료를 줄이는 챌린지입니다.",
119+
mainImageUrl: "assets/images/eco/eco_challenge3.png",
120+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
121+
participationDates: [7, 10, 15, 30],
122+
percentOfCompletedUser: 0.54,
123+
),
124+
ChallengeDetailModel(
125+
id: 13,
126+
title: "채식 식사 인증",
127+
preDescription: "채식 식사 인증 챌린지는 환경 보호를 실천하는 활동입니다.",
128+
description: "1일 1끼 이상 채식 식사를 실천해 지구 자원 절약을 실천하는 챌린지입니다.",
129+
mainImageUrl: "assets/images/eco/eco_challenge4.png",
130+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
131+
participationDates: [7, 10, 15, 30],
132+
percentOfCompletedUser: 0.56,
133+
),
134+
ChallengeDetailModel(
135+
id: 14,
136+
title: "유통기한 임박 식품 소비 인증",
137+
preDescription: "유통기한 임박 식품 소비 인증 챌린지는 환경 보호를 실천하는 활동입니다.",
138+
description: "유통기한이 임박한 식품을 소비하여 식량 자원 낭비를 줄이는 챌린지입니다.",
139+
mainImageUrl: "assets/images/eco/eco_challenge5.png",
140+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
141+
participationDates: [7, 10, 15, 30],
142+
percentOfCompletedUser: 0.58,
143+
),
144+
ChallengeDetailModel(
145+
id: 15,
146+
title: "도보 15분 이상 실천하기",
147+
preDescription: "도보 15분 이상 실천하기 챌린지는 환경 보호를 실천하는 활동입니다.",
148+
description: "하루 15분 이상 걷기를 통해 차량 사용을 줄이고 탄소 배출을 낮추는 챌린지입니다.",
149+
mainImageUrl: "assets/images/transport/transport_challenge1.png",
150+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
151+
participationDates: [7, 10, 15, 30],
152+
percentOfCompletedUser: 0.5,
153+
),
154+
ChallengeDetailModel(
155+
id: 16,
156+
title: "친환경적인 이동",
157+
preDescription: "친환경적인 이동 챌린지는 환경 보호를 실천하는 활동입니다.",
158+
description: "자전거나 전동 킥보드 등의 이동수단을 이용해 탄소 배출을 줄이는 챌린지입니다.",
159+
mainImageUrl: "assets/images/transport/transport_challenge2.png",
160+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
161+
participationDates: [7, 10, 15, 30],
162+
percentOfCompletedUser: 0.52,
163+
),
164+
ChallengeDetailModel(
165+
id: 17,
166+
title: "계단 오르기",
167+
preDescription: "계단 오르기 챌린지는 환경 보호를 실천하는 활동입니다.",
168+
description: "엘리베이터 대신 계단을 이용해 에너지를 아끼고 건강을 챙기는 챌린지입니다.",
169+
mainImageUrl: "assets/images/transport/transport_challenge3.png",
170+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
171+
participationDates: [7, 10, 15, 30],
172+
percentOfCompletedUser: 0.54,
173+
),
174+
ChallengeDetailModel(
175+
id: 18,
176+
title: "대중교통 이용하기",
177+
preDescription: "대중교통 이용하기 챌린지는 환경 보호를 실천하는 활동입니다.",
178+
description: "자동차 대신 버스나 지하철을 타는 챌린지입니다.",
179+
mainImageUrl: "assets/images/transport/transport_challenge4.png",
180+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
181+
participationDates: [7, 10, 15, 30],
182+
percentOfCompletedUser: 0.56,
183+
),
184+
ChallengeDetailModel(
185+
id: 19,
186+
title: "플로깅 실천하기",
187+
preDescription: "플로깅 실천하기 챌린지는 환경 보호를 실천하는 활동입니다.",
188+
description: "조깅하면서 쓰레기를 줍는 플로깅으로 지역 환경을 깨끗하게 만드는 챌린지입니다.",
189+
mainImageUrl: "assets/images/transport/transport_challenge5.png",
190+
certificationMethodDescription: "활동을 실천한 인증 사진을 촬영해 주세요.",
191+
participationDates: [7, 10, 15, 30],
192+
percentOfCompletedUser: 0.58,
193+
),
194+
];

client/lib/models/dummy/challenge_dummy.dart renamed to client/lib/domain/models/dummy/challenge_dummy.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import 'package:greenap/models/challenge_category.dart';
2-
import 'package:greenap/models/challenge_item.dart';
1+
import 'package:greenap/domain/models/challenge_category.dart';
2+
import 'package:greenap/domain/models/challenge_item.dart';
33

44
final List<ChallengeCategoryModel> dummyChallengeCategory = [
55
ChallengeCategoryModel(

client/lib/models/dummy/my_challenge_dummy.dart renamed to client/lib/domain/models/dummy/my_challenge_dummy.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import 'package:greenap/models/my_challenge.dart';
2-
import 'package:greenap/enums/challenge.dart';
1+
import 'package:greenap/domain/models/my_challenge.dart';
2+
import 'package:greenap/domain/enums/challenge.dart';
33

44
final List<MyChallengeModel> dummyMyChallenges = [
55
MyChallengeModel(

0 commit comments

Comments
 (0)