diff --git a/advanced/dapps/pos-dapp/package.json b/advanced/dapps/pos-dapp/package.json
index dbc2cfe49..c937f71bc 100644
--- a/advanced/dapps/pos-dapp/package.json
+++ b/advanced/dapps/pos-dapp/package.json
@@ -9,12 +9,12 @@
"lint": "eslint"
},
"dependencies": {
- "@reown/appkit": "1.8.2",
+ "@reown/appkit": "1.8.12",
"next": "15.5.2",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-hot-toast": "^2.6.0",
- "@walletconnect/pos-client": "0.0.0-canary.1"
+ "@walletconnect/pos-client": "0.0.0-canary.4"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
diff --git a/advanced/dapps/pos-dapp/src/app/page.tsx b/advanced/dapps/pos-dapp/src/app/page.tsx
index 41eb3fba9..21f8357f9 100644
--- a/advanced/dapps/pos-dapp/src/app/page.tsx
+++ b/advanced/dapps/pos-dapp/src/app/page.tsx
@@ -82,6 +82,9 @@ export default function Home() {
const [merchantAddress, setMerchantAddress] = useState("");
const [isSetupComplete, setIsSetupComplete] = useState(false);
const [tempMerchantAddress, setTempMerchantAddress] = useState("");
+ const [isManualControl, setIsManualControl] = useState(false);
+ const [isWalletConnected, setIsWalletConnected] = useState(false);
+ const [hasRequestsSent, setHasRequestsSent] = useState(false);
useEffect(() => {
// Check for saved merchant address in localStorage
@@ -91,6 +94,12 @@ export default function Home() {
setIsSetupComplete(true);
}
+ // Check for saved manual mode state
+ const savedManualMode = localStorage.getItem("isManualMode");
+ if (savedManualMode !== null) {
+ setIsManualControl(savedManualMode === "true");
+ }
+
if (appkit) return;
setPaymentState("connecting");
@@ -134,9 +143,10 @@ export default function Home() {
const setupEventListeners = () => {
if (!posClient) return;
- posClient.on("connected", (connected) => {
- connected = true;
- console.log("connected", connected);
+ posClient.on("connected", ({ session }) => {
+ console.log("connected", session);
+ setIsWalletConnected(true);
+ setHasRequestsSent(false);
toast.success("Customer wallet connected", {
icon: "🔗",
duration: 3000,
@@ -146,6 +156,7 @@ export default function Home() {
posClient.on("disconnected", (disconnected) => {
console.log("disconnected", disconnected);
+ setIsWalletConnected(false);
toast.error("Customer wallet disconnected", {
icon: "🔌",
duration: 3000,
@@ -193,13 +204,14 @@ export default function Home() {
});
appkit?.close();
setPaymentState("payment_failed");
+ setIsWalletConnected(false);
});
- posClient.on("payment_broadcasted", (paymentBroadcasted) => {
- console.log("paymentBroadcasted", paymentBroadcasted);
+ posClient.on("payment_broadcasted", ({ result }) => {
+ console.log("paymentBroadcasted", result);
setTransactionHashes((prev) => {
const newTransaction: TransactionHash = {
- hash: paymentBroadcasted,
+ hash: result,
status: "pending",
};
const newHashes = [...prev, newTransaction];
@@ -224,14 +236,13 @@ export default function Home() {
setPaymentState("payment_requesting");
});
- posClient.on("payment_successful", (paymentSuccessful) => {
- console.log("paymentSuccessful", paymentSuccessful);
- const { transaction } = paymentSuccessful;
+ posClient.on("payment_successful", ({ result }) => {
+ console.log("paymentSuccessful", result);
// Update transaction status to successful
setTransactionHashes((prev) =>
prev.map((tx) =>
- tx.hash === transaction
+ tx.hash === result
? { ...tx, status: "success" as TransactionStatus }
: tx
)
@@ -351,7 +362,10 @@ export default function Home() {
);
try {
- await posClient.createPaymentIntent({ paymentIntents });
+ await posClient.createPaymentIntent({
+ paymentIntents,
+ manualControl: isManualControl,
+ });
toast.success(
`Payment request created for ${paymentItems.length} item${
paymentItems.length > 1 ? "s" : ""
@@ -401,6 +415,8 @@ export default function Home() {
const resetTransaction = () => {
setPaymentState("idle");
setTransactionHashes([]);
+ setIsWalletConnected(false);
+ setHasRequestsSent(false);
// Reset all payment item statuses to idle
setPaymentItems((prev) =>
prev.map((item) => ({ ...item, status: "idle" as PaymentItemStatus }))
@@ -410,6 +426,8 @@ export default function Home() {
const restart = (reinit = true) => {
setPaymentState("idle");
setTransactionHashes([]);
+ setIsWalletConnected(false);
+ setHasRequestsSent(false);
// Reset all payment item statuses to idle
setPaymentItems((prev) =>
prev.map((item) => ({ ...item, status: "idle" as PaymentItemStatus }))
@@ -444,6 +462,33 @@ export default function Home() {
setIsSetupComplete(false);
};
+ const handleManualModeToggle = () => {
+ const newValue = !isManualControl;
+ setIsManualControl(newValue);
+ localStorage.setItem("isManualControl", String(newValue));
+ };
+
+ const handleSendRequestsToWallet = async () => {
+ if (!posClient) {
+ toast.error("POS client not available");
+ return;
+ }
+
+ setHasRequestsSent(true);
+
+ try {
+ await posClient.sendPaymentsToWallet();
+ toast.success("Payment requests sent to wallet", {
+ icon: "📤",
+ duration: 3000,
+ });
+ } catch (error) {
+ console.error("Failed to send payment requests:", error);
+ toast.error("Failed to send payment requests");
+ setHasRequestsSent(false);
+ }
+ };
+
const getStatusMessage = () => {
switch (paymentState) {
case "connecting":
@@ -549,12 +594,37 @@ export default function Home() {
{/* Merchant Address Display */}
-
- Merchant Address:
-
-
- {merchantAddress}
-
+
+
+
+ Merchant Address:
+
+
+ {merchantAddress}
+
+
+
+
+
+
+
{/* Status Display */}
@@ -801,6 +871,19 @@ export default function Home() {
) : (
+ {isManualControl && isWalletConnected && (
+
+ )}