Composant Advanced Place Search

La version Advanced du composant Place Search offre les mêmes fonctionnalités que Place Search Essentials. Elle vous permet également de configurer les boutons d'action du composant et d'appliquer des options de recherche et de filtrage aux avis et aux contenus multimédias qui s'affichent.

Configuration d'Advanced Place Search

Utilisez AdvancedPlaceSearchView pour accéder aux fonctionnalités avancées.

Configurer les boutons d'action

Utilisez les méthodes .cornerActions et .mainActions de AdvancedPlaceSearchView pour supprimer ou personnaliser les boutons d'action.

Exigences concernant l'attribution visuelle

Vue AdvancedPlace Search avec des boutons personnalisés
Résultat de recherche de lieux avec un bouton personnalisé

Important : Vous devez indiquer clairement aux utilisateurs quand un bouton d'action personnalisé partagera des informations utilisateur avec un tiers autre que Google. Consultez les exigences concernant l'attribution visuelle.

L'exemple montre une image personnalisée qui indique clairement que les informations utilisateur seront envoyées à "Altostrat".

Appliquer des options de recherche et de filtrage

Utilisez les méthodes .searchMediaOptions et .searchReviewOptions de AdvancedPlaceSearchView pour activer la recherche et le filtrage des contenus multimédias ou des avis.

Exemples d'Advanced Place Search

Créer un bouton d'action principal et supprimer les actions d'angle

Cet exemple de code crée un bouton d'action principal pour ajouter un lieu aux favoris ou le supprimer. Il garantit également qu'aucune action d'angle n'est configurée.

Swift

struct AdvancedPlaceSearchDemoView: View {
  private let configuration = AdvancedPlaceSearchConfiguration(
    content: [.address(), .rating(), .type()],
    preferTruncation: true, // default is false
    theme: PlacesMaterialTheme(),
    attributionPosition: .bottom, // default is top
    mediaSize = .medium, // default is .small
    selectable: true // default is false
  )
  // can also do let placeSearchViewRequest = .searchNearby(...) to  configure a searchNearby request
  @State private var placeSearchViewRequest = .searchByText(
    SearchByTextRequest(
      textQuery: "Googleplex",
      placeProperties: [.all],
      locationBias: CircularCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 0, longitude: 0),
        radius: 0
      )
    )
  )

  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceSearchView(
      orientation: .horizontal, // default is vertical
      request: placeSearchViewRequest,
      configuration: configuration
    )
    .onLoad { places in
      print("places: \(places)")
    }
    .onRequestError { error in
      print("error: \(error)")
    }
    .onPlaceSelected { place, index in
      print("place: \(place)")
      print("index: \(index)")
    }
    .mainActions { place in
      var actions: [MainPlaceActionElement] = []

      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart.fill"),
              label: "Unfavorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart"),
              label: "Favorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
    // Ensures that there are no corner actions.
    .cornerActions { _ in
      return []
    }
  }

  func toggleFavorite(_ placeID: String) {
    if favoritePlaces.contains(placeID) {
      favoritePlaces.remove(placeID)
    } else {
      favoritePlaces.insert(placeID)
    }
  }
}

        

Filtrer les avis et les contenus multimédias

Cet exemple de code filtre les résultats de recherche pour n'afficher que les contenus multimédias et les avis qui mentionnent "café".

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee", rankPreference: .newest)
  let searchReviewOptions = SearchReviewsOptions(query: "coffee", rankPreference: .newest)

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: [.media(), .reviews()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { _ in }
    )
    .searchMediaOptions(searchMediaOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
    .searchReviewsOptions(searchReviewsOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
  }