Skip to content

Commit 105880d

Browse files
YumNummcursoragent
andcommitted
feat: 地震履歴検索に震央地・地域検索機能を追加
- 震央地コードによる地震検索に対応 - 都道府県・市区町村による地域検索に対応 - 検索モーダルにパラメータを追加 Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 401cf93 commit 105880d

File tree

4 files changed

+158
-23
lines changed

4 files changed

+158
-23
lines changed

app/lib/feature/earthquake_history/data/notifier/earthquake_history_notifier.dart

Lines changed: 90 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,93 @@ class EarthquakeHistoryNotifier extends _$EarthquakeHistoryNotifier {
5353
}) async {
5454
ref.invalidate(earthquakeHistoryDetailsProvider);
5555

56-
final result = await ref
57-
.read(earthquakeHistoryRepositoryProvider)
58-
.fetchEarthquakeList(
59-
depthGte: param.depthGte,
60-
depthLte: param.depthLte,
61-
intensityGte: param.intensityGte?.value,
62-
intensityLte: param.intensityLte?.value,
63-
magnitudeGte: param.magnitudeGte,
64-
magnitudeLte: param.magnitudeLte,
65-
statuses: param.statuses?.map((s) => s.name.toUpperCase()).toList(),
66-
limit: limit,
67-
);
56+
return _fetchData(param: param, limit: limit, cursor: null);
57+
}
58+
59+
Future<EarthquakeHistoryNotifierState> _fetchData({
60+
required EarthquakeHistoryParameter param,
61+
required int limit,
62+
required String? cursor,
63+
}) async {
64+
final repository = ref.read(earthquakeHistoryRepositoryProvider);
65+
final statuses = param.statuses?.map((s) => s.name.toUpperCase()).toList();
66+
67+
// 震央地検索の場合
68+
if (param.hasEpicenterFilter && param.epicenterCode != null) {
69+
final result = await repository.searchByEpicenter(
70+
code: param.epicenterCode!,
71+
limit: limit,
72+
cursor: cursor,
73+
depthGte: param.depthGte,
74+
depthLte: param.depthLte,
75+
intensityGte: param.intensityGte?.value,
76+
intensityLte: param.intensityLte?.value,
77+
magnitudeGte: param.magnitudeGte,
78+
magnitudeLte: param.magnitudeLte,
79+
statuses: statuses,
80+
);
81+
return (
82+
items: result.items.map((e) => e.earthquake).toList(),
83+
nextToken: result.nextToken,
84+
);
85+
}
86+
87+
// 地域検索(都道府県)の場合
88+
if (param.hasRegionFilter &&
89+
param.regionCode != null &&
90+
param.regionSearchType == RegionSearchType.prefecture) {
91+
final result = await repository.searchByPrefecture(
92+
code: param.regionCode!,
93+
limit: limit,
94+
cursor: cursor,
95+
depthGte: param.depthGte,
96+
depthLte: param.depthLte,
97+
intensityGte: param.regionIntensityGte?.value,
98+
intensityLte: param.regionIntensityLte?.value,
99+
magnitudeGte: param.magnitudeGte,
100+
magnitudeLte: param.magnitudeLte,
101+
statuses: statuses,
102+
);
103+
return (
104+
items: result.items.map((e) => e.earthquake).toList(),
105+
nextToken: result.nextToken,
106+
);
107+
}
108+
109+
// 地域検索(市区町村)の場合
110+
if (param.hasRegionFilter &&
111+
param.regionCode != null &&
112+
param.regionSearchType == RegionSearchType.city) {
113+
final result = await repository.searchByCity(
114+
code: param.regionCode!,
115+
limit: limit,
116+
cursor: cursor,
117+
depthGte: param.depthGte,
118+
depthLte: param.depthLte,
119+
intensityGte: param.regionIntensityGte?.value,
120+
intensityLte: param.regionIntensityLte?.value,
121+
magnitudeGte: param.magnitudeGte,
122+
magnitudeLte: param.magnitudeLte,
123+
statuses: statuses,
124+
);
125+
return (
126+
items: result.items.map((e) => e.earthquake).toList(),
127+
nextToken: result.nextToken,
128+
);
129+
}
130+
131+
// 通常の地震一覧取得
132+
final result = await repository.fetchEarthquakeList(
133+
depthGte: param.depthGte,
134+
depthLte: param.depthLte,
135+
intensityGte: param.intensityGte?.value,
136+
intensityLte: param.intensityLte?.value,
137+
magnitudeGte: param.magnitudeGte,
138+
magnitudeLte: param.magnitudeLte,
139+
statuses: statuses,
140+
limit: limit,
141+
cursor: cursor,
142+
);
68143
return (
69144
items: result.items,
70145
nextToken: result.nextToken,
@@ -94,17 +169,10 @@ class EarthquakeHistoryNotifier extends _$EarthquakeHistoryNotifier {
94169
}
95170

96171
state = await state.guardPlus(() async {
97-
final repository = ref.read(earthquakeHistoryRepositoryProvider);
98-
final result = await repository.fetchEarthquakeList(
99-
depthGte: parameter.depthGte,
100-
depthLte: parameter.depthLte,
101-
intensityGte: parameter.intensityGte?.value,
102-
intensityLte: parameter.intensityLte?.value,
103-
magnitudeGte: parameter.magnitudeGte,
104-
magnitudeLte: parameter.magnitudeLte,
105-
statuses: parameter.statuses?.map((s) => s.name.toUpperCase()).toList(),
106-
cursor: currentState.nextToken,
172+
final result = await _fetchData(
173+
param: parameter,
107174
limit: 50,
175+
cursor: currentState.nextToken,
108176
);
109177
final mergedItems = <EarthquakePartial>[
110178
...currentState.items,

app/lib/feature/earthquake_history/data/notifier/earthquake_history_notifier.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/feature/earthquake_history/data/repository/earthquake_history_repository.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,31 @@ class EarthquakeHistoryRepository {
151151
statuses: statuses,
152152
);
153153
}
154+
155+
/// 震源地から地震検索
156+
Future<EpicenterSearchResponse> searchByEpicenter({
157+
required int code,
158+
int? limit,
159+
String? cursor,
160+
double? magnitudeLte,
161+
double? magnitudeGte,
162+
int? depthLte,
163+
int? depthGte,
164+
String? intensityLte,
165+
String? intensityGte,
166+
List<String>? statuses,
167+
}) async {
168+
return _api.earthquake.searchByEpicenter(
169+
code: code,
170+
limit: limit,
171+
cursor: cursor,
172+
magnitudeLte: magnitudeLte,
173+
magnitudeGte: magnitudeGte,
174+
depthLte: depthLte,
175+
depthGte: depthGte,
176+
intensityLte: intensityLte,
177+
intensityGte: intensityGte,
178+
statuses: statuses,
179+
);
180+
}
154181
}

app/lib/feature/earthquake_history/ui/components/earthquake_history_search_parameter_modal.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,45 @@ class EarthquakeHistorySearchParameterModal extends HookConsumerWidget {
303303
_MagnitudeRangeSelector.initialMax
304304
? magnitudeMax.value
305305
: null,
306+
// 震央地名
307+
epicenterCode:
308+
isEpicenterEnabled.value &&
309+
selectedEpicenterCode.value != null
310+
? int.tryParse(selectedEpicenterCode.value!)
311+
: null,
312+
epicenterName:
313+
isEpicenterEnabled.value &&
314+
selectedEpicenterCode.value != null
315+
? selectedEpicenterName.value
316+
: null,
317+
// 地域の震度
318+
regionSearchType:
319+
isRegionIntensityEnabled.value &&
320+
selectedRegionCode.value != null
321+
? (selectedRegionType.value == 'prefecture'
322+
? RegionSearchType.prefecture
323+
: RegionSearchType.city)
324+
: null,
325+
regionCode: isRegionIntensityEnabled.value
326+
? selectedRegionCode.value
327+
: null,
328+
regionName: isRegionIntensityEnabled.value
329+
? selectedRegionName.value
330+
: null,
331+
regionIntensityGte:
332+
isRegionIntensityEnabled.value &&
333+
selectedRegionCode.value != null &&
334+
regionIntensityMin.value !=
335+
_IntensityRangeSelector.initialMin
336+
? regionIntensityMin.value
337+
: null,
338+
regionIntensityLte:
339+
isRegionIntensityEnabled.value &&
340+
selectedRegionCode.value != null &&
341+
regionIntensityMax.value !=
342+
_IntensityRangeSelector.initialMax
343+
? regionIntensityMax.value
344+
: null,
306345
);
307346
Navigator.of(context).pop(parameter);
308347
},
@@ -423,6 +462,7 @@ class _DateRangeSelector extends StatelessWidget {
423462
context: context,
424463
firstDate: DateTime(1919),
425464
lastDate: DateTime.now(),
465+
initialEntryMode: DatePickerEntryMode.input,
426466
initialDateRange: dateRange,
427467
builder: (context, child) {
428468
return Theme(

0 commit comments

Comments
 (0)