instantPurchaseOptionFactory = $instantPurchaseOptionFactory; $this->config = $config; $this->paymentTokenChooser = $paymentTokenChooser; $this->shippingAddressChooser = $shippingAddressChooser; $this->billingAddressChooser = $billingAddressChooser; $this->shippingMethodChooser = $shippingMethodChooser; } /** * @inheritdoc */ public function getOption( Store $store, Customer $customer ): InstantPurchaseOption { if (!$this->isInstantPurchaseButtonEnabled($store)) { return $this->instantPurchaseOptionFactory->createDisabledOption(); } $paymentToken = $this->paymentTokenChooser->choose($store, $customer); $shippingAddress = $this->shippingAddressChooser->choose($customer); $billingAddress = $this->billingAddressChooser->choose($customer); if ($shippingAddress) { $shippingMethod = $this->shippingMethodChooser->choose($shippingAddress); } else { $shippingMethod = null; } $option = $this->instantPurchaseOptionFactory->create( $paymentToken, $shippingAddress, $billingAddress, $shippingMethod ); return $option; } /** * Checks if button available. * * @param Store $store * @return bool */ private function isInstantPurchaseButtonEnabled(Store $store): bool { return $this->config->isModuleEnabled($store->getId()); } }