From 8697efd2c8751717a3a3fcaf72feb7c49ebfec02 Mon Sep 17 00:00:00 2001
From: Florian Dold <florian.dold@gmail.com>
Date: Sun, 27 Aug 2017 03:56:19 +0200
Subject: implement refunds

---
 src/webex/renderHtml.tsx | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'src/webex/renderHtml.tsx')

diff --git a/src/webex/renderHtml.tsx b/src/webex/renderHtml.tsx
index 51f9019ef..fe964e68a 100644
--- a/src/webex/renderHtml.tsx
+++ b/src/webex/renderHtml.tsx
@@ -73,6 +73,8 @@ export function renderAmount(amount: AmountJson) {
   return <span>{x}&nbsp;{amount.currency}</span>;
 }
 
+export const AmountDisplay = ({amount}: {amount: AmountJson}) => renderAmount(amount);
+
 
 /**
  * Abbreviate a string to a given length, and show the full
-- 
cgit v1.2.3


From 24181bdf20e0d23ec5ec5d2eaa08ae1cfb905f0f Mon Sep 17 00:00:00 2001
From: Florian Dold <florian.dold@gmail.com>
Date: Sun, 27 Aug 2017 04:19:11 +0200
Subject: better error report / retry prompt for failed payments

---
 src/webex/notify.ts                        |  1 +
 src/webex/pages/confirm-create-reserve.tsx | 36 +----------------------
 src/webex/pages/error.tsx                  | 46 ++++++++++++++++++++++++++----
 src/webex/renderHtml.tsx                   | 37 ++++++++++++++++++++++++
 4 files changed, 79 insertions(+), 41 deletions(-)

(limited to 'src/webex/renderHtml.tsx')

diff --git a/src/webex/notify.ts b/src/webex/notify.ts
index da4657a96..5e024d619 100644
--- a/src/webex/notify.ts
+++ b/src/webex/notify.ts
@@ -120,6 +120,7 @@ async function handlePaymentResponse(maybeFoundResponse: QueryPaymentResult) {
     // Gives the user the option to retry / abort and refresh
     wxApi.logAndDisplayError({
       name: "pay-post-failed",
+      contractTerms: walletResp.contractTerms,
       message: e.message,
       response: e.response,
     });
diff --git a/src/webex/pages/confirm-create-reserve.tsx b/src/webex/pages/confirm-create-reserve.tsx
index 4e3b6748f..f957364c4 100644
--- a/src/webex/pages/confirm-create-reserve.tsx
+++ b/src/webex/pages/confirm-create-reserve.tsx
@@ -41,7 +41,7 @@ import {
   getReserveCreationInfo,
 } from "../wxApi";
 
-import {renderAmount} from "../renderHtml";
+import {Collapsible, renderAmount} from "../renderHtml";
 
 import * as React from "react";
 import * as ReactDOM from "react-dom";
@@ -80,40 +80,6 @@ class EventTrigger {
 }
 
 
-interface CollapsibleState {
-  collapsed: boolean;
-}
-
-interface CollapsibleProps {
-  initiallyCollapsed: boolean;
-  title: string;
-}
-
-class Collapsible extends React.Component<CollapsibleProps, CollapsibleState> {
-  constructor(props: CollapsibleProps) {
-    super(props);
-    this.state = { collapsed: props.initiallyCollapsed };
-  }
-  render() {
-    const doOpen = (e: any) => {
-      this.setState({collapsed: false});
-      e.preventDefault();
-    };
-    const doClose = (e: any) => {
-      this.setState({collapsed: true});
-      e.preventDefault();
-    };
-    if (this.state.collapsed) {
-      return <h2><a className="opener opener-collapsed" href="#" onClick={doOpen}>{this.props.title}</a></h2>;
-    }
-    return (
-      <div>
-        <h2><a className="opener opener-open" href="#" onClick={doClose}>{this.props.title}</a></h2>
-        {this.props.children}
-      </div>
-    );
-  }
-}
 
 function renderAuditorDetails(rci: ReserveCreationInfo|null) {
   console.log("rci", rci);
diff --git a/src/webex/pages/error.tsx b/src/webex/pages/error.tsx
index 3f3940d72..2edef5e5b 100644
--- a/src/webex/pages/error.tsx
+++ b/src/webex/pages/error.tsx
@@ -29,6 +29,8 @@ import URI = require("urijs");
 
 import * as wxApi from "../wxApi";
 
+import { Collapsible } from "../renderHtml";
+
 interface ErrorProps {
   report: any;
 }
@@ -38,7 +40,7 @@ class ErrorView extends React.Component<ErrorProps, { }> {
     const report = this.props.report;
     if (!report) {
       return (
-        <div>
+        <div id="main">
           <h1>Error Report Not Found</h1>
           <p>This page is supposed to display an error reported by the GNU Taler wallet,
               but the corresponding error report can't be found.</p>
@@ -46,15 +48,47 @@ class ErrorView extends React.Component<ErrorProps, { }> {
         </div>
       );
     }
-    switch (report.name) {
-      default:
+    try {
+      switch (report.name) {
+        case "pay-post-failed": {
+          const summary = report.contractTerms.summary || report.contractTerms.order_id;
+          return (
+            <div id="main">
+              <h1>Failed to send payment</h1>
+              <p>Failed to send payment for <strong>{summary}</strong> to merchant <strong>{report.contractTerms.merchant.name}</strong>.</p>
+              <p>You can <a href={report.contractTerms.fulfillment_url}>retry</a> the payment.  If this problem persists,
+                please contact the mechant with the error details below.</p>
+              <Collapsible initiallyCollapsed={true} title="Error Details">
+                <pre>
+                  {JSON.stringify(report, null, " ")}
+                </pre>
+              </Collapsible>
+            </div>
+          );
+        }
+        default:
+          return (
+            <div id="main">
+              <h1>Unknown Error</h1>
+              The GNU Taler wallet reported an unknown error.  Here are the details:
+              <pre>
+                {JSON.stringify(report, null, " ")}
+              </pre>
+            </div>
+          );
+      }
+    } catch (e) {
         return (
-          <div>
-            <h1>Unknown Error</h1>
-            The GNU Taler wallet reported an unknown error.  Here are the details:
+          <div id="main">
+            <h1>Error</h1>
+            The GNU Taler wallet reported an error.  Here are the details:
             <pre>
               {JSON.stringify(report, null, " ")}
             </pre>
+            A detailed error report could not be generated:
+            <pre>
+              {e.toString()}
+            </pre>
           </div>
         );
     }
diff --git a/src/webex/renderHtml.tsx b/src/webex/renderHtml.tsx
index fe964e68a..2a5b50533 100644
--- a/src/webex/renderHtml.tsx
+++ b/src/webex/renderHtml.tsx
@@ -91,3 +91,40 @@ export function abbrev(s: string, n: number = 5) {
     </span>
   );
 }
+
+
+
+interface CollapsibleState {
+  collapsed: boolean;
+}
+
+interface CollapsibleProps {
+  initiallyCollapsed: boolean;
+  title: string;
+}
+
+export class Collapsible extends React.Component<CollapsibleProps, CollapsibleState> {
+  constructor(props: CollapsibleProps) {
+    super(props);
+    this.state = { collapsed: props.initiallyCollapsed };
+  }
+  render() {
+    const doOpen = (e: any) => {
+      this.setState({collapsed: false});
+      e.preventDefault();
+    };
+    const doClose = (e: any) => {
+      this.setState({collapsed: true});
+      e.preventDefault();
+    };
+    if (this.state.collapsed) {
+      return <h2><a className="opener opener-collapsed" href="#" onClick={doOpen}>{this.props.title}</a></h2>;
+    }
+    return (
+      <div>
+        <h2><a className="opener opener-open" href="#" onClick={doClose}>{this.props.title}</a></h2>
+        {this.props.children}
+      </div>
+    );
+  }
+}
-- 
cgit v1.2.3

