Skip to content
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
27 changes: 13 additions & 14 deletions lib/features/seller/data/models/listing_draft.dart
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,23 @@ CreateListingRequest listingDraftRequest({
required ListingCondition condition,
required String currency,
required PriceMode priceMode,
required int price,
required int weightG,
required int quantity,
List<CreateVariantRequest>? variants,
int? price,
int? weightG,
int? quantity,
List<String> attachments = const [],
List<String> tags = const [],
Map<String, Object> specifications = const {},
}) {
final slugs = listingTags(tags);
final finalVariants = variants ?? [
CreateVariantRequest(
price: price ?? 0,
quantity: quantity ?? 1,
attributes: defaultVariantAttributes,
packageDetails: <String, Object>{'weight_g': weightG ?? 500},
),
];

return CreateListingRequest(
name: name,
Expand All @@ -114,16 +123,6 @@ CreateListingRequest listingDraftRequest({
attachments: attachments.isEmpty ? null : attachments,
tags: slugs.isEmpty ? null : slugs,
specifications: specifications.isEmpty ? null : specifications,
variants: [
// One variant: this is a marketplace for used goods, so a listing is
// normally the one item in the seller's hands. Price and parcel weight
// live on the variant, which is why it exists at all.
CreateVariantRequest(
price: price,
quantity: quantity,
attributes: defaultVariantAttributes,
packageDetails: <String, Object>{'weight_g': weightG},
),
],
variants: finalVariants,
);
}
27 changes: 22 additions & 5 deletions lib/features/seller/data/repositories/seller_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:shopnexus_flutter_app/api/generated/model/create_bank_account_re
import 'package:shopnexus_flutter_app/api/generated/model/payment_session.dart';
import 'package:shopnexus_flutter_app/api/generated/model/transaction.dart';
import 'package:shopnexus_flutter_app/api/generated/model/update_bank_account_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/create_variant_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/update_variant_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/create_withdrawal_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/listing.dart';
Expand All @@ -20,6 +21,7 @@ import 'package:shopnexus_flutter_app/api/generated/model/order_item.dart';
import 'package:shopnexus_flutter_app/api/generated/model/order_state.dart';
import 'package:shopnexus_flutter_app/api/generated/model/order_summary.dart';
import 'package:shopnexus_flutter_app/api/generated/model/listing_detail.dart';
import 'package:shopnexus_flutter_app/api/generated/model/publish_listing_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/tax_info.dart';
import 'package:shopnexus_flutter_app/api/generated/model/update_listing_request.dart';
import 'package:shopnexus_flutter_app/api/generated/model/upsert_tax_info_request.dart';
Expand Down Expand Up @@ -254,11 +256,26 @@ class SellerRepository {
Future<void> hideListing(String id) =>
_catalogApi.listingsIdPublicationDelete(id: id);

/// Re-queues a hidden listing for moderation, so it comes back as `pending`
/// rather than straight to `active`. That is also the route out of a takedown —
/// it clears the marker and its reason and the listing is reviewed again.
Future<void> publishListing(String id) =>
_catalogApi.listingsIdPublicationPost(id: id);
Future<void> publishListing(String id, {String? pickupContactId}) =>
_catalogApi.listingsIdPublicationPost(
id: id,
publishListingRequest: pickupContactId == null
? null
: PublishListingRequest(pickupContactId: pickupContactId),
);

Future<ListingDetail> addVariant(
String listingId,
CreateVariantRequest request,
) async {
final response = await _catalogApi.listingsIdVariantsPost(
id: listingId,
createVariantRequest: request,
);
final detail = response.data?.data;
if (detail == null) throw StateError('empty add variant response');
return detail;
}

Future<void> deleteVariant(String id) => _catalogApi.variantsIdDelete(id: id);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ class SellerProductsNotifier extends _$SellerProductsNotifier {
await refresh();
}

/// Sends a draft or inactive listing to moderation (`pending`).
Future<void> publishListing(String id, {String? pickupContactId}) async {
await ref.read(sellerRepositoryProvider).publishListing(
id,
pickupContactId: pickupContactId,
);
await refresh();
}

Future<void> deleteListing(String id) async {
await ref.read(sellerRepositoryProvider).deleteListing(id);
await refresh();
Expand Down
Loading
Loading