aboutsummaryrefslogtreecommitdiff
path: root/src/webex/pages/error.tsx
blob: dee8ce44e5e4fd0a61c592dedec2e22ac9178ce5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 This file is part of TALER
 (C) 2015-2016 GNUnet e.V.

 TALER is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
 Foundation; either version 3, or (at your option) any later version.

 TALER is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */


/**
 * Page shown to the user to confirm creation
 * of a reserve, usually requested by the bank.
 *
 * @author Florian Dold
 */


import * as React from "react";
import * as ReactDOM from "react-dom";
import URI = require("urijs");

import * as wxApi from "../wxApi";

import { Collapsible } from "../renderHtml";

interface ErrorProps {
  report: any;
}

class ErrorView extends React.Component<ErrorProps, { }> {
  render(): JSX.Element {
    const report = this.props.report;
    if (!report) {
      return (
        <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>
          <p>Maybe the error occured before the browser was restarted or the wallet was reloaded.</p>
        </div>
      );
    }
    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 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>
        );
    }
  }
}

async function main() {
  const url = new URI(document.location.href);
  const query: any = URI.parseQuery(url.query());

  const container = document.getElementById("container");
  if (!container) {
    console.error("fatal: can't mount component, countainer missing");
    return;
  }

  // report that we'll render, either looked up from the
  // logging module or synthesized here for fixed/fatal errors
  let report;

  const reportUid: string = query.reportUid;
  if (!reportUid) {
    report = {
      name: "missing-error",
    };
  } else {
    report = await wxApi.getReport(reportUid);
  }

  ReactDOM.render(<ErrorView report={report} />, container);
}

document.addEventListener("DOMContentLoaded", () => main());