Skip to content

Latest commit

 

History

History
142 lines (115 loc) · 3.48 KB

README.md

File metadata and controls

142 lines (115 loc) · 3.48 KB

topsort.swift

Install

Using package.swift

let package = Package(
    ...
    dependencies: [
        .package(url: "https://github.com/Topsort/topsort.swift.git", from: "1.0.0"),
    ]
    ...
)

Usage

Setup

import SwiftUI
import Topsort

@main
struct MyApp: App {
    init() {
        Topsort.shared.configure(apiKey: "your-api-key", url: "https://api.topsort.com")
    }
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Auctions

View all auction models and their definitions in the Swift package link.

import SwiftUI
import Topsort

let products = AuctionProducts(ids: ["p_dsad", "p_dvra", "p_oplf", "p_gjfo"])

let category = AuctionCategory(id: "c_fdfa")

let auctions = [
    Auction(type: "banners", slots: 1, slotId: "home-banner", device: "mobile", category: category),
    Auction(type: "listings", slots: 2, device: "mobile", products: products)
]
let result: AuctionResponse = await Topsort.shared.executeAuctions(auctions: auctions)

Events

View all event models and their definitions in the Swift package link.

Impression & click

struct Product {
    let id: String
    let image_url: URL
    let name: String
    let resolvedBidId: String?
    let price: Double
}

struct ProductView: View {
    @State
    public var product: Product

    private func event() -> Event {
        var event: Event;
        if (self.product.resolvedBidId != nil) {
            event = Event(resolvedBidId: self.product.resolvedBidId!, occurredAt: Date.now)
        } else {
            event = Event(entity: Entity(type: EntityType.product, id: self.product.id), occurredAt: Date.now)
        }
        return event
    }

    var body: some View {
        VStack {
            AsyncImage(url: self.product.image_url)
            Text(self.product.name)
        }
        .onAppear {
            Topsort.shared.track(impression: self.event())
        }
        .onTapGesture {
            Topsort.shared.track(click: self.event())
        }
    }
}

Purchase

struct ContentView: View {
    var myProduct = Product(id: "123", image_url: URL(string: "https://loremflickr.com/640/480?lock=1234")!, name: "My Product", resolvedBidId: "123", price: 12.00)
    var body: some View {
        VStack {
            ProductView(product: myProduct)
            Button("Purchase me!") {
                let item = PurchaseItem(productId: myProduct.id, unitPrice: myProduct.price)
                let event = PurchaseEvent(items: [item], occurredAt: Date.now)
                Topsort.shared.track(purchase: event)
            }
        }
        .padding()
    }
}

Banners

import TopsortBanners

struct ContentView: View {
    var body: some View {
        TopsortBanner(
            apiKey: "API_KEY",
            url: "https://api.topsort.com/v2",
            width: width,
            height: height,
            slotId: "slotId",
            deviceType: "device"
        ) { response in
            // function to execute when banner is clicked
        }
    }
}

This code will display a banner, send an impression event when the banner is shown, and send a click event when the banner is clicked. Inside the callback, you can add logic to execute when the banner is clicked, such as redirecting to the product page.