উন্নত জায়গার বিবরণ কম্পোনেন্ট

জায়গার বিবরণ কম্পোনেন্টের উন্নত ভার্সন Places Details Essentials-এর মতো একই ফিচার অফার করে। এছাড়াও, এটি আপনাকে জায়গার নাম দেখানো হবে কিনা তা বেছে নিতে, কম্পোনেন্টের অ্যাকশন বোতাম কনফিগার করতে এবং দেখানো রিভিউ ও মিডিয়াতে সার্চ ও ফিল্টার করার বিকল্প প্রয়োগ করতে দেয়।

উন্নত Place Details কনফিগারেশন

উন্নত ফিচার অ্যাক্সেস করতে AdvancedPlaceDetailsView অথবা AdvancedPlaceDetailsCompactView ব্যবহার করুন।

কন্টেন্ট ডিসপ্লে সংক্রান্ত বিকল্প

AdvancedPlaceDetailsContent-এ enum ব্যবহার করে আপনি কোন কন্টেন্ট দেখাতে চান তা নির্দিষ্ট করতে পারবেন। আপনি জায়গার বিবরণ সংক্রান্ত প্রয়োজনীয় তথ্য-এর মতো একই কন্টেন্ট কনফিগার করতে পারবেন এবং জায়গার নাম দেখানো হবে কিনা তাও বেছে নিতে পারবেন।

অ্যাকশন বোতাম কনফিগার করুন

অ্যাকশন বোতাম সরাতে বা কাস্টমাইজ করতে AdvancedPlaceDetailsView বা AdvancedPlaceDetailsCompactView-এর .cornerActions এবং .mainActions পদ্ধতি ব্যবহার করুন।

ভিজ্যুয়াল অ্যাট্রিবিউশন সংক্রান্ত প্রয়োজনীয়তা

কাস্টমাইজ করা বোতাম সহ জায়গার বিবরণ কম্প্যাক্ট ভিউ
কাস্টমাইজ করা বোতাম সহ উন্নত জায়গার বিবরণ কম্প্যাক্ট ভিউ

গুরুত্বপূর্ণ: কাস্টম অ্যাকশন বোতাম Google ছাড়া অন্য কোনও থার্ড-পার্টির সাথে ব্যবহারকারীর তথ্য শেয়ার করলে, আপনাকে অবশ্যই ব্যবহারকারীকে তা স্পষ্টভাবে জানাতে হবে। ভিজ্যুয়াল অ্যাট্রিবিউশন সংক্রান্ত প্রয়োজনীয়তা দেখুন।

ডানদিকের উদাহরণে একটি কাস্টম ছবি দেখানো হয়েছে যা থেকে স্পষ্ট বোঝা যাচ্ছে যে ব্যবহারকারীর তথ্য "Altostrat"-এ পাঠানো হবে।

সার্চ ও ফিল্টার করার বিকল্প প্রয়োগ করুন

মিডিয়া বা রিভিউয়ের জন্য সার্চ ও ফিল্টার করার সুবিধা চালু করতে AdvancedPlaceDetailsView বা AdvancedPlaceDetailsCompactView-এর .searchMediaOptions ও .searchReviewOptions পদ্ধতি ব্যবহার করুন।

কাস্টম কন্টেন্ট স্লট তৈরি করুন

কাস্টম কন্টেন্ট স্লট প্লেসমেন্ট সংক্রান্ত বিকল্প

কাস্টম কন্টেন্ট স্লট আপনাকে সরাসরি আগে থেকে নির্ধারিত লেআউট জোনে আপনার নিজস্ব কন্টেন্ট (যেমন AI-জেনারেটেড সারসংক্ষেপ, ভ্রমণসূচীর টাইমস্ট্যাম্প বা কাস্টম ব্যাজ) যোগ করতে দেয়।

কাস্টম কন্টেন্ট s যোগ করতে, AdvancedPlaceDetailsCompactView-এর .placeDetailsCompactContentSlot পদ্ধতি ব্যবহার করুন। উপলভ্য পজিশনগুলি হল .basicSectionTop এবং .basicSectionBottom।

কন্টেন্ট স্লটের জন্য অ্যাট্রিবিউশন সংক্রান্ত প্রয়োজনীয়তা ও কন্টেন্ট সাজেশন

কাস্টম কন্টেন্ট স্লট মাউন্ট করা হলে, কোন কন্টেন্ট Google প্রদান করেছে এবং কোন কন্টেন্ট থার্ড-পার্টি প্রদান করেছে তা স্পষ্ট করার জন্য ডিসক্লোজার অটোমেটিক আপডেট হয়।

কী করতে হবে

তথ্যের সোর্স সম্পর্কে কোনও অস্পষ্টতা এড়াতে Google Place-এর বিবরণ এবং কাস্টম কন্টেন্টের মধ্যে একটি স্পষ্ট ভিজ্যুয়াল হায়ারার্কি বজায় রাখুন।

তথ্যের সোর্স সম্পর্কে অস্পষ্টতা প্রতিরোধ করা

কী করতে হবে

আপনার ব্যবহারকারীদের তাৎক্ষণিক লক্ষ্যের জন্য তৈরি করা স্থানীয়, উচ্চ-মূল্যের ইনসাইট বিবেচনা করুন। রিয়েল-টাইম বুকিং উইন্ডো বা বর্তমান উপলভ্যতার মতো মানানসই কন্টেন্ট ব্যবহারকারীদের দ্রুত, আরও তথ্যপূর্ণ সিদ্ধান্ত নিতে সাহায্য করে।

গুরুত্বপূর্ণ ইনসাইট প্রদান করা

করবেন না

Google-এর দেওয়া কন্টেন্ট লুকিয়ে রাখলেও, রেটিং, রিভিউ বা ব্যবসার সময়সূচির মতো Google Place-এর বিবরণ ডুপ্লিকেট করবেন না। এটি করলে, কন্টেন্টের সোর্স সম্পর্কে ব্যবহারকারী বিভ্রান্ত হতে পারেন এবং কন্টেন্টটি Google নাকি থার্ড-পার্টির থেকে এসেছে তা বুঝতে পারবেন না।

আগে থেকে আছে এমন Google Place-এর বিবরণ ডুপ্লিকেট করবেন না

করবেন না

অ্যাট্রিবিউট করা হয়নি এমন দাবি বা ব্যাজ (যেমন, "সেরা সাজেশন!") দেখাবেন না, যা Google-এর অফিসিয়াল অনুমোদন বলে ভুল হতে পারে। কাস্টম কন্টেন্টে অবশ্যই তার সোর্স উল্লেখ করতে হবে।

অ্যাট্রিবিউট করা হয়নি এমন দাবি বা ব্যাজ দেখাবেন না

করবেন না

কাস্টম প্লেস কন্টেনারে বিজ্ঞাপন, মার্কেটিং কপি, প্রোমোশনাল ছাড় বা সাবস্ক্রিপশন প্রম্পট অন্তর্ভুক্ত করবেন না।

বিজ্ঞাপন, মার্কেটিং কপি, প্রোমোশনাল ছাড় বা সাবস্ক্রিপশন প্রম্পট অন্তর্ভুক্ত করবেন না

Advanced Place Details-এর উদাহরণ

জায়গার নাম বাদ দিন

জায়গার নাম বাদ দিতে, AdvancedPlaceDetailsConfiguration-এর content প্যারামিটারে .name অন্তর্ভুক্ত করবেন না।

Swift

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

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content:[.address()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
  }
}

অ্যাকশন বোতাম সরিয়ে দিন

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ _ in
      return []
    }
  }
}

কাস্টম ও আগে থেকে নির্ধারিত অ্যাকশন যোগ করুন

এই স্যাম্পেলটি ব্যবহারকারীর জন্য কোনও জায়গাকে ফেভারিট বা আনফেভারিট করার বিকল্প যোগ করে, এর সাথে আগে থেকে নির্ধারিত Maps-এ খুলুন অ্যাকশনও থাকে।

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  
  @State var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .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
    }
    .cornerActions { place in
      var actions: [CornerPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart.fill"),
              accessibilityLabel: "Unfavorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart"),
              accessibilityLabel: "Favorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
  }

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

রিভিউ ও মিডিয়া ফিল্টার করুন

এই কোড স্যাম্পেল শুধুমাত্র সেইসব মিডিয়া ও রিভিউ দেখায় যেখানে "কফি" উল্লেখ করা আছে।

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee")
  let searchReviewsOptions = SearchReviewsOptions(query: "coffee")

  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)")
      }
    }
  }
}

কন্টেন্ট স্লট তৈরি করুন

এই স্যাম্পেল basicSectionTop এবং basicSectionBottom স্লটে কন্টেন্ট যোগ করে।

Swift

import SwiftUI
import PlacesSwift

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

    @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
      identifier: .placeID(peetsCoffeePlaceID)
    )

    var body: some View {
      AdvancedPlaceDetailsCompactView(
        orientation: .vertical,
        query: $query,
        configuration: AdvancedPlaceDetailsCompactConfiguration(
          content: AdvancedPlaceDetailsCompactView.allContent,
          theme: PlacesMaterialTheme()
        ),
        placeDetailsCallback: { _ in }
      )
      .placeDetailsCompactContentSlot(position: .basicSectionTop) { place in
        Text("Day 2 • 2:30 PM")
          .font(.caption)
          .fontWeight(.bold)
          .foregroundColor(.accentColor)
      }
      .placeDetailsCompactContentSlot(position: .basicSectionBottom) { place in
        VStack(alignment: .leading, spacing: 4) {
          Text("AI Notes")
            .font(.caption)
            .bold()
          Text("Great quiet atmosphere for morning meetings. Famous for house-roasted pour-overs.")
            .font(.footnote)
            .foregroundColor(.secondary)
        }
        .padding(8)
        .background(Color(.systemGray6))
        .cornerRadius(8)
      }
    }
}