dorm static method

Future<void> dorm(
  1. UDormResponse item, {
  2. VoidCallback? onDone,
})

Implementation

static Future<void> dorm(UDormResponse item, {VoidCallback? onDone}) async {
  final (UResponse<UDormResponse>? fetched, _, _) = await UServices.hotel.readDormById(
    p: UIdParams(
      id: item.id,
      selectorArgs: const UDormSelectorArgs(media: UMediaSelectorArgs()),
    ),
  );
  final UDormResponse dorm = fetched?.result ?? item;
  final UDormJson d = dorm.jsonData;

  final List<int> tags = List<int>.from(dorm.tags);
  List<String> highlights = List<String>.from(d.highlights);
  List<UPlaceNearby> nearby = List<UPlaceNearby>.from(d.nearby);
  List<UPlaceFaq> faqs = List<UPlaceFaq>.from(d.faqs);
  final TextEditingController website = TextEditingController(text: d.website);
  final TextEditingController whatsapp = TextEditingController(text: d.whatsapp);
  final TextEditingController instagram = TextEditingController(text: d.instagram);
  final TextEditingController telegram = TextEditingController(text: d.telegram);
  final TextEditingController curfew = TextEditingController(text: d.curfewTime);
  final TextEditingController minStay = TextEditingController(text: d.minimumStayMonths?.toString());
  final TextEditingController walk = TextEditingController(text: d.universityWalkMinutes?.toString());
  final TextEditingController policies = TextEditingController(text: d.policies);
  final TextEditingController howToGetThere = TextEditingController(text: d.howToGetThere);
  final UAdminMediaDraft draft = UAdminMediaDraft();
  final List<UMediaResponse> media = (dorm.media ?? <UMediaResponse>[]).sortedForGallery();

  await _open(
    title: "${U.s.detailsAndPhotos} — ${dorm.title}",
    onDone: onDone,
    body: (BuildContext context, StateSetter setState) => Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        UAdminSection(
          title: U.s.visibility,
          children: <Widget>[
            UAdminTagChips<TagDorm>(title: U.s.featured, options: const <TagDorm>[TagDorm.featured], tags: tags),
            UAdminTagChips<TagDorm>(title: U.s.approval, options: TagDorm.values.group(400), tags: tags, single: true),
          ],
        ),
        UAdminSection(
          title: U.s.photos,
          children: <Widget>[UAdminMediaManager(media: media, draft: draft)],
        ),
        UAdminSection(
          title: U.s.details,
          children: <Widget>[
            UAdminStringList(title: U.s.highlights, items: highlights, addLabel: U.s.addHighlight, onChanged: (List<String> v) => highlights = v),
            URow(
              children: <Widget>[
                UTextField(expanded: 1, controller: curfew, labelText: U.s.curfewTime, margin: const EdgeInsets.symmetric(vertical: 6)),
                const SizedBox(width: 8),
                UTextField(expanded: 1, controller: walk, labelText: U.s.universityWalkMinutes, keyboardType: TextInputType.number, margin: const EdgeInsets.symmetric(vertical: 6)),
              ],
            ),
            UAdminTagChips<TagDorm>(title: U.s.acceptedResidents, options: TagDorm.values.group(300), tags: tags),
          ],
        ),
        UAdminSection(
          title: U.s.amenities,
          children: <Widget>[UAdminTagChips<TagDorm>(title: U.s.amenities, options: TagDorm.values.group(500), tags: tags)],
        ),
        UAdminSection(
          title: U.s.servicesIncluded,
          children: <Widget>[
            UAdminTagChips<TagDorm>(title: U.s.includedInRent, options: TagDorm.values.group(700), tags: tags),
            UAdminTagChips<TagDorm>(title: U.s.mealServices, options: TagDorm.values.group(600), tags: tags),
          ],
        ),
        UAdminSection(
          title: U.s.policies,
          children: <Widget>[
            _text(minStay, U.s.minimumStayMonths, number: true),
            _text(policies, U.s.policies, lines: 3),
          ],
        ),
        UAdminSection(title: U.s.socialMedia, children: <Widget>[_text(website, U.s.website), _text(whatsapp, U.s.whatsapp), _text(instagram, U.s.instagram), _text(telegram, U.s.telegram)]),
        UAdminSection(
          title: U.s.nearbyPlaces,
          children: <Widget>[
            _text(howToGetThere, U.s.howToGetThere, lines: 2),
            UAdminNearbyEditor(items: nearby, onChanged: (List<UPlaceNearby> v) => nearby = v),
          ],
        ),
        UAdminSection(
          title: U.s.faqs,
          children: <Widget>[UAdminFaqEditor(items: faqs, onChanged: (List<UPlaceFaq> v) => faqs = v)],
        ),
      ],
    ),
    save: () async {
      final (UEmptyResponse? ok, UEmptyResponse? error, String? exception) = await UServices.hotel.updateDorm(
        p: UDormUpdateParams(
          id: dorm.id,
          tags: tags,
          highlights: highlights,
          website: _str(website),
          whatsapp: _str(whatsapp),
          instagram: _str(instagram),
          telegram: _str(telegram),
          curfewTime: _str(curfew),
          minimumStayMonths: _int(minStay),
          universityWalkMinutes: _int(walk),
          policies: _str(policies),
          howToGetThere: _str(howToGetThere),
          nearby: nearby,
          faqs: faqs,
        ),
      );
      if (!_isOk(ok, error, exception)) return false;
      await UAdminMediaSync.apply(draft: draft, existing: media, dormId: dorm.id);
      return true;
    },
  );
}