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

#118 ホスト作成、更新画面の作成 #184

Merged
merged 16 commits into from
Sep 8, 2023
Merged
Show file tree
Hide file tree
Changes from 15 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
40 changes: 40 additions & 0 deletions packages/firebase_common/lib/src/firestore_repositories/host.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,44 @@ class HostRepository {
/// 指定した [Host] を取得する。
Future<ReadHost?> fetchHost({required String hostId}) =>
_query.fetchDocument(hostId: hostId);

/// [Host] の情報を作成する。
Future<void> create({
required String workerId,
required String displayName,
required String introduction,
required Set<HostType> hostTypes,
required List<String> urls,
required String imageUrl,
}) =>
_query.set(
hostId: workerId,
createHost: CreateHost(
displayName: displayName,
introduction: introduction,
hostTypes: hostTypes,
urls: urls,
imageUrl: imageUrl,
),
);

/// [Host] の情報を更新する。
Future<void> update({
required String hostId,
String? displayName,
String? introduction,
Set<HostType>? hostTypes,
List<String>? urls,
String? imageUrl,
}) =>
_query.update(
hostId: hostId,
updateHost: UpdateHost(
displayName: displayName,
introduction: introduction,
hostTypes: hostTypes,
urls: urls,
imageUrl: imageUrl,
),
);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,52 @@
// import '../firestore_documents/host_location.dart';

import '../../firebase_common.dart';

class HostLocationRepository {
// final _query = HostLocationQuery();
final _query = HostLocationQuery();

/// 指定した [HostLocation] を取得する。
Future<ReadHostLocation?> fetchHostLocation({
required String hostLocationId,
}) =>
_query.fetchDocument(hostLocationId: hostLocationId);

/// [Host]から関連する[HostLocation]をすべて取得する。
Future<List<ReadHostLocation>> fetchHostLocationsFromHost({
required String hostId,
}) =>
_query.fetchDocuments(
queryBuilder: (query) => query.where('hostId', isEqualTo: hostId),
);

/// [HostLocation] の情報を作成する。
Future<void> create({
required String hostLocationId,
required String hostId,
required String address,
required Geo geo,
}) =>
_query.set(
hostLocationId: hostLocationId,
createHostLocation: CreateHostLocation(
hostId: hostId,
address: address,
geo: geo,
),
);

/// [HostLocation] の情報を更新する。
Future<void> update({
required String hostLocationId,
// hostIdは更新することがないので受け取らない
RikitoNoto marked this conversation as resolved.
Show resolved Hide resolved
required String? address,
required Geo? geo,
}) =>
_query.update(
hostLocationId: hostLocationId,
updateHostLocation: UpdateHostLocation(
address: address,
geo: geo,
),
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import '../../../auth/ui/auth_dependent_builder.dart';
import '../../../chat/read_status.dart';
import '../../../chat/ui/chat_room.dart';
import '../../../chat/ui/chat_rooms.dart';
import '../../../host/ui/create_or_update_host.dart';
import '../../../host/ui/host.dart';
import '../../../host/ui/host_create.dart';
import '../../../host/ui/host_update.dart';
import '../../../job/ui/job_create.dart';
import '../../../job/ui/job_detail.dart';
import '../../../job/ui/job_update.dart';
Expand Down Expand Up @@ -125,10 +126,15 @@ class DevelopmentItemsPage extends ConsumerWidget {
'flutter_google_maps, geolocator)',
),
onTap: () => context.router.pushNamed(
CreateOrUpdateHostPage.location(
userId: 'b1M4bcp7zEVpgHXYhOVWt8BMkq23',
actionType: ActionType.create.name,
),
HostCreatePage.location,
),
),
ListTile(
title: const Text(
'ホスト情報更新ページ',
),
onTap: () => context.router.pushNamed(
HostUpdatePage.location(hostId: 'b1M4bcp7zEVpgHXYhOVWt8BMkq23'),
),
),
const Divider(),
Expand Down
53 changes: 0 additions & 53 deletions packages/mottai_flutter_app/lib/host/ui/create_or_update_host.dart

This file was deleted.

7 changes: 2 additions & 5 deletions packages/mottai_flutter_app/lib/host/ui/host.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import '../../auth/ui/social_link_buttons.dart';
import '../../job/job.dart';
import '../../user/host.dart';
import '../../user/ui/user_mode.dart';
import 'create_or_update_host.dart';
import 'host_update.dart';

/// ホストページ。
@RoutePage()
Expand Down Expand Up @@ -79,10 +79,7 @@ class HostPageBody extends ConsumerWidget {
child: IconButton(
color: Theme.of(context).shadowColor,
onPressed: () => context.router.pushNamed(
CreateOrUpdateHostPage.location(
userId: userId,
actionType: ActionType.update.name,
),
HostUpdatePage.location(hostId: userId),
),
icon: const Icon(Icons.edit),
),
Expand Down
94 changes: 94 additions & 0 deletions packages/mottai_flutter_app/lib/host/ui/host_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import 'dart:io';

import 'package:firebase_common/firebase_common.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../../image/firebase_storage.dart';
import '../../user/host.dart';

final hostControllerProvider =
Provider.family.autoDispose<HostController, String>(
(ref, userId) => HostController(
hostService: ref.watch(hostServiceProvider),
firebaseStorageService: ref.watch(firebaseStorageServiceProvider),
userId: userId,
),
);

class HostController {
HostController({
required HostService hostService,
required FirebaseStorageService firebaseStorageService,
required String userId,
}) : _hostService = hostService,
_firebaseStorageService = firebaseStorageService,
_userId = userId;

/// storageの画像を保存するフォルダのパス
static const _storagePath = 'hosts';

final HostService _hostService;
final FirebaseStorageService _firebaseStorageService;
final String _userId;

/// [Host] と [HostLocation] の情報を作成する。
Future<void> create({
required String workerId,
required String displayName,
required String introduction,
required Set<HostType> hostTypes,
required List<String> urls,
required File imageFile,
required String address,
required Geo geo,
}) async {
// Hostの作成
final imageUrl = await _uploadImage(imageFile);
await _hostService.create(
workerId: workerId,
displayName: displayName,
introduction: introduction,
hostTypes: hostTypes,
urls: urls,
imageUrl: imageUrl,
address: address,
geo: geo,
);
}

/// [Host] と [HostLocation] を更新する。
Future<void> update({
required String hostId,
String? displayName,
String? introduction,
Set<HostType>? hostTypes,
List<String>? urls,
File? imageFile,
String? address,
Geo? geo,
}) async {
// Hostの更新
String? imageUrl;
if (imageFile != null) {
imageUrl = await _uploadImage(imageFile);
}
await _hostService.update(
hostId: hostId,
displayName: displayName,
introduction: introduction,
hostTypes: hostTypes,
urls: urls,
imageUrl: imageUrl,
address: address,
geo: geo,
);
}

Future<String> _uploadImage(File imageFile) {
final imagePath = '$_storagePath/$_userId-${DateTime.now()}.jpg';
return _firebaseStorageService.upload(
path: imagePath,
resource: FirebaseStorageFile(imageFile),
);
}
}
32 changes: 32 additions & 0 deletions packages/mottai_flutter_app/lib/host/ui/host_create.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../../auth/ui/auth_dependent_builder.dart';
import 'host_form.dart';

/// 仕事情報更新ページ。
@RoutePage()
class HostCreatePage extends ConsumerWidget {
const HostCreatePage({
super.key,
});

static const path = '/hosts/create';

/// [HostCreatePage] に遷移する際に `context.router.pushNamed` で指定する文字列。
static const location = path;

@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(title: const Text('お手伝い募集内容を入力')),
// TODO:なるんさんが実装中の「本人かどうかビルダー」に後で書き換える。
body: AuthDependentBuilder(
onAuthenticated: (hostId) {
return HostForm.create(workerId: hostId);
},
),
);
}
}
Loading
Loading