Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: クエスト詳細ページの簡易実装を追加 #461

Merged
merged 5 commits into from
Jun 30, 2024
Merged
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
14 changes: 10 additions & 4 deletions catalog/lib/ui/component/quest_list_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,17 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;
)
Widget asisScaffoldUseCase(BuildContext context) {
return QuestListTile(
quest: const Quest(
quest: Quest(
id: '1',
name: 'Quest 1',
description: 'Quest 1 description',
body: 'Quest 1 body',
title: 'title',
description: 'description',
begunAt: DateTime.now(),
endedAt: DateTime.now(),
categoryId: null,
status: QuestStatus.backlog,
coverImageUrl:
'https://raw.githubusercontent.com/tatsutakein-jp/asis-app/main/.idea/icon.svg',
note: 'note',
),
onTap: (quest) {},
);
Expand Down
3 changes: 2 additions & 1 deletion core/common/lib/extension.dart
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export 'src/extension/index.dart';
export 'src/extension/receiver.dart';
export 'src/extension/string.dart';
1 change: 0 additions & 1 deletion core/common/lib/src/extension/index.dart

This file was deleted.

24 changes: 24 additions & 0 deletions core/common/lib/src/extension/string.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
extension StringX on String {
/// 文字列をキャメルケースに変換
String toCamelCase() {
// 文字列を小文字に変換してスペースで分割
final words = toLowerCase().split(' ');

// StringBufferのインスタンスを作成
final buffer = StringBuffer();

// 最初の単語はそのまま
buffer.write(words[0]);

// 2単語目以降の最初の文字を大文字に変換
for (var i = 1; i < words.length; i++) {
final word = words[i];
if (word.isNotEmpty) {
buffer.write(word.substring(0, 1).toUpperCase());
buffer.write(word.substring(1));
}
}

return buffer.toString();
}
}
28 changes: 23 additions & 5 deletions core/data/lib/src/quest_repository.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:core_common/extension.dart';
import 'package:core_database/quest_dao.dart';
import 'package:core_model/quest.dart';
import 'package:core_network/core_network.dart';
Expand Down Expand Up @@ -35,10 +36,15 @@ class QuestRepository {
_dao.stream();

Future<void> insert({
required String userId,
required String title,
required String description,
required DateTime? begunAt,
required DateTime? endedAt,
required String? categoryId,
required QuestStatus status,
required String? coverImageUrl,
required String note,
required String userId,
}) async {
final id = await _remote.insertMainQuest(
title: title,
Expand All @@ -52,6 +58,12 @@ class QuestRepository {
id: id,
title: title,
description: description,
begunAt: begunAt,
endedAt: endedAt,
categoryId: categoryId,
status: status.name,
coverImageUrl: coverImageUrl,
note: note,
),
],
);
Expand All @@ -78,10 +90,16 @@ class QuestRepository {
await _dao.merges(
networkQuestList
.map(
(quest) => (
id: quest.id,
title: quest.title,
description: quest.description,
(e) => (
id: e.id,
title: e.title,
description: e.description,
begunAt: e.begunAt,
endedAt: e.endedAt,
categoryId: e.categoryId,
status: e.status.toCamelCase(),
coverImageUrl: e.coverImageUrl,
note: e.note,
),
)
.toList(),
Expand Down
6 changes: 6 additions & 0 deletions core/database/lib/src/quest/quest_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ abstract interface class QuestDao {
QuestId id,
String title,
String description,
DateTime? begunAt,
DateTime? endedAt,
String? categoryId,
String status,
String? coverImageUrl,
String note,
})>
quests,
);
Expand Down
27 changes: 22 additions & 5 deletions core/database_isar/lib/src/quest/isar_quest_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ final class IsarQuestDao implements QuestDao {
Future<bool> update({required Quest quest}) async => _isar.writeAsync(
(isar) => isar.quests.update(
id: quest.id,
name: quest.name,
title: quest.title,
description: quest.description,
body: quest.body,
note: quest.note,
),
);

Expand All @@ -95,17 +95,34 @@ final class IsarQuestDao implements QuestDao {

@override
Future<void> merges(
List<({String id, String title, String description})> quests,
List<
({
QuestId id,
String title,
String description,
DateTime? begunAt,
DateTime? endedAt,
String? categoryId,
String status,
String? coverImageUrl,
String note,
})>
quests,
) async {
await _isar.writeAsync(
(isar) => isar.quests.putAll(
quests
.map(
(e) => db.Quest(
id: e.id,
name: e.title,
title: e.title,
description: e.description,
body: '',
begunAt: e.begunAt,
endedAt: e.endedAt,
categoryId: e.categoryId,
status: e.status,
coverImageUrl: e.coverImageUrl,
note: e.note,
),
)
.toList(),
Expand Down
37 changes: 29 additions & 8 deletions core/database_isar/lib/src/quest/model/quest.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:core_model/quest.dart' as model;
import 'package:core_model/quest.dart';
import 'package:isar/isar.dart';

part 'quest.g.dart';
Expand All @@ -8,31 +9,51 @@ part 'quest.g.dart';
final class Quest {
Quest({
required this.id,
required this.name,
required this.title,
required this.description,
required this.body,
required this.begunAt,
required this.endedAt,
required this.categoryId,
required this.status,
required this.coverImageUrl,
required this.note,
});

final String id;
final String name;
final String title;
final String description;
final String body;
final DateTime? begunAt;
final DateTime? endedAt;
final String? categoryId;
final String status;
final String? coverImageUrl;
final String note;
}

extension QuestExtension on Quest {
model.Quest asModel() => model.Quest(
id: this.id,
name: name,
title: title,
description: description,
body: body,
begunAt: begunAt,
endedAt: endedAt,
categoryId: categoryId,
status: QuestStatus.values.byName(status),
coverImageUrl: coverImageUrl,
note: note,
);
}

extension QuestModelExtension on model.Quest {
Quest asDbModel() => Quest(
id: this.id,
name: name,
title: title,
description: description,
body: body,
begunAt: begunAt,
endedAt: endedAt,
categoryId: categoryId,
status: status.toString(),
coverImageUrl: coverImageUrl,
note: note,
);
}
Loading