Преглед на файлове

Adding logout and plugin iframe

bodicsek преди 3 години
родител
ревизия
967ac7d36e
променени са 9 файла, в които са добавени 469 реда и са изтрити 109 реда
  1. 1 1
      ojet.config.js
  2. 309 1
      package-lock.json
  3. 7 1
      package.json
  4. 29 81
      src/components/app.tsx
  5. 7 10
      src/components/content/index.tsx
  6. 2 2
      src/components/footer.tsx
  7. 19 11
      src/components/header.tsx
  8. 93 0
      src/hooks/useLogin.tsx
  9. 2 2
      tsconfig.json

+ 1 - 1
ojet.config.js

@@ -25,7 +25,7 @@ module.exports = {
    * @returns {object|undefined}
    */
   webpack: ({ context, config }) => {
-    if (context.buildType === 'release') {
+    if (context.buildType === "release") {
       // update config with release / production options
     } else {
       // update config with development options

+ 309 - 1
package-lock.json

@@ -1,5 +1,5 @@
 {
-  "name": "idcs-oauth-client",
+  "name": "occ-fw-ui",
   "version": "1.0.0",
   "lockfileVersion": 1,
   "requires": true,
@@ -93,6 +93,22 @@
         "fastq": "^1.6.0"
       }
     },
+    "@oracle/ojet-cli": {
+      "version": "13.0.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@oracle/ojet-cli/-/ojet-cli-13.0.0.tgz",
+      "integrity": "sha1-RF+ZGPwfbECfNE1E9oxzoo40Ioc=",
+      "dev": true,
+      "requires": {
+        "@oracle/oraclejet-templates": "~13.0.0",
+        "@oracle/oraclejet-tooling": "~13.0.0",
+        "@xmldom/xmldom": "0.8.1",
+        "adm-zip": "~0.4.7",
+        "fs-extra": "~8.1.0",
+        "glob": "7.2.0",
+        "inquirer": "~8.2.2",
+        "minimist": "~1.2.0"
+      }
+    },
     "@oracle/oraclejet": {
       "version": "13.0.3",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@oracle/oraclejet/-/oraclejet-13.0.3.tgz",
@@ -112,6 +128,12 @@
         "signals": "1.0.0"
       }
     },
+    "@oracle/oraclejet-templates": {
+      "version": "13.0.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@oracle/oraclejet-templates/-/oraclejet-templates-13.0.0.tgz",
+      "integrity": "sha1-VZFaaB0cvh5edwaYlrCzGrocXEo=",
+      "dev": true
+    },
     "@oracle/oraclejet-tooling": {
       "version": "13.0.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@oracle/oraclejet-tooling/-/oraclejet-tooling-13.0.1.tgz",
@@ -553,6 +575,12 @@
         "@xtuc/long": "4.2.2"
       }
     },
+    "@xmldom/xmldom": {
+      "version": "0.8.1",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@xmldom/xmldom/-/xmldom-0.8.1.tgz",
+      "integrity": "sha1-cMI5J1/G1qhOQbmo1iOpPA1ZtrQ=",
+      "dev": true
+    },
     "@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -587,6 +615,12 @@
       "integrity": "sha1-uitZOc5iwjjbbZPYHJsRGym4Vek=",
       "dev": true
     },
+    "adm-zip": {
+      "version": "0.4.16",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/adm-zip/-/adm-zip-0.4.16.tgz",
+      "integrity": "sha1-z0xQj9/6sCwmnLx/RxqHXwVXA2U=",
+      "dev": true
+    },
     "ajv": {
       "version": "8.11.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ajv/-/ajv-8.11.0.tgz",
@@ -617,6 +651,15 @@
         "fast-deep-equal": "^3.1.3"
       }
     },
+    "ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.21.3"
+      }
+    },
     "ansi-html-community": {
       "version": "0.0.8",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
@@ -944,6 +987,12 @@
         "supports-color": "^7.1.0"
       }
     },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=",
+      "dev": true
+    },
     "chokidar": {
       "version": "3.5.3",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/chokidar/-/chokidar-3.5.3.tgz",
@@ -986,6 +1035,27 @@
         "source-map": "~0.6.0"
       }
     },
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^3.1.0"
+      }
+    },
+    "cli-spinners": {
+      "version": "2.7.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/cli-spinners/-/cli-spinners-2.7.0.tgz",
+      "integrity": "sha1-+BX9MLX56qwC22BMeiMe18sveXo=",
+      "dev": true
+    },
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=",
+      "dev": true
+    },
     "cliui": {
       "version": "4.1.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/cliui/-/cliui-4.1.0.tgz",
@@ -997,6 +1067,12 @@
         "wrap-ansi": "^2.0.0"
       }
     },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
     "clone-deep": {
       "version": "4.0.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -1430,6 +1506,15 @@
         }
       }
     },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
     "define-lazy-prop": {
       "version": "2.0.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -1552,6 +1637,12 @@
       "integrity": "sha1-xiA1g4kKv4jfwL4EbNctO0j4vrY=",
       "dev": true
     },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+      "dev": true
+    },
     "emojis-list": {
       "version": "3.0.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/emojis-list/-/emojis-list-3.0.0.tgz",
@@ -1616,6 +1707,12 @@
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
       "dev": true
     },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
     "eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -1746,6 +1843,17 @@
         }
       }
     },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
     "extract-zip": {
       "version": "1.7.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/extract-zip/-/extract-zip-1.7.0.tgz",
@@ -1821,6 +1929,15 @@
         "pend": "~1.2.0"
       }
     },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/fill-range/-/fill-range-7.0.1.tgz",
@@ -2283,6 +2400,74 @@
       "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=",
       "dev": true
     },
+    "inquirer": {
+      "version": "8.2.4",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/inquirer/-/inquirer-8.2.4.tgz",
+      "integrity": "sha1-3b/obKL2dkmmfapvEFHBKPaE8LQ=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.1",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.21",
+        "mute-stream": "0.0.8",
+        "ora": "^5.4.1",
+        "run-async": "^2.4.0",
+        "rxjs": "^7.5.5",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6",
+        "wrap-ansi": "^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.1",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        },
+        "wrap-ansi": {
+          "version": "7.0.0",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
     "invert-kv": {
       "version": "2.0.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/invert-kv/-/invert-kv-2.0.0.tgz",
@@ -2331,6 +2516,12 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4=",
+      "dev": true
+    },
     "is-number": {
       "version": "7.0.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/is-number/-/is-number-7.0.0.tgz",
@@ -2358,6 +2549,12 @@
       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
       "dev": true
     },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=",
+      "dev": true
+    },
     "is-wsl": {
       "version": "1.1.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/is-wsl/-/is-wsl-1.1.0.tgz",
@@ -2583,6 +2780,16 @@
       "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
       "dev": true
     },
+    "log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      }
+    },
     "lower-case": {
       "version": "2.0.2",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/lower-case/-/lower-case-2.0.2.tgz",
@@ -2763,6 +2970,12 @@
         "thunky": "^1.0.2"
       }
     },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=",
+      "dev": true
+    },
     "nanocolors": {
       "version": "0.1.12",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/nanocolors/-/nanocolors-0.1.12.tgz",
@@ -2905,6 +3118,40 @@
         "is-wsl": "^1.1.0"
       }
     },
+    "ora": {
+      "version": "5.4.1",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=",
+      "dev": true,
+      "requires": {
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "6.0.1",
+          "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        }
+      }
+    },
     "os-locale": {
       "version": "3.1.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/os-locale/-/os-locale-3.1.0.tgz",
@@ -2916,6 +3163,12 @@
         "mem": "^4.0.0"
       }
     },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
     "p-defer": {
       "version": "1.0.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/p-defer/-/p-defer-1.0.0.tgz",
@@ -3436,6 +3689,16 @@
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/reselect/-/reselect-4.1.6.tgz",
       "integrity": "sha1-GcotPQs1Nzp03ByYaSza/7ZgJlY="
     },
+    "restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=",
+      "dev": true,
+      "requires": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
     "retry": {
       "version": "0.13.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/retry/-/retry-0.13.1.tgz",
@@ -3457,6 +3720,12 @@
         "glob": "^7.1.3"
       }
     },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=",
+      "dev": true
+    },
     "run-parallel": {
       "version": "1.2.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -3466,6 +3735,15 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "rxjs": {
+      "version": "7.5.7",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/rxjs/-/rxjs-7.5.7.tgz",
+      "integrity": "sha1-LsDVf9yJ7OIg0ucCcwro8eSd7zk=",
+      "dev": true,
+      "requires": {
+        "tslib": "^2.1.0"
+      }
+    },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -4025,6 +4303,12 @@
         }
       }
     },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
     "thunky": {
       "version": "1.1.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/thunky/-/thunky-1.1.0.tgz",
@@ -4062,6 +4346,15 @@
         }
       }
     },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
     "to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4127,6 +4420,12 @@
       "integrity": "sha1-fOyqfwc85oCgWEeqd76UEJjzbcM=",
       "dev": true
     },
+    "type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=",
+      "dev": true
+    },
     "type-is": {
       "version": "1.6.18",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/type-is/-/type-is-1.6.18.tgz",
@@ -4240,6 +4539,15 @@
         "minimalistic-assert": "^1.0.0"
       }
     },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
     "webpack": {
       "version": "5.60.0",
       "resolved": "https://artifactory.oci.oraclecorp.com:443/api/npm/global-dev-npm/webpack/-/webpack-5.60.0.tgz",

+ 7 - 1
package.json

@@ -1,7 +1,12 @@
 {
-  "name": "idcs-oauth-client",
+  "name": "occ-fw-ui",
   "version": "1.0.0",
   "description": "An Oracle JavaScript Extension Toolkit(JET) web app",
+  "scripts": {
+    "start": "ojet serve",
+    "build": "ojet build",
+    "release": "ojet build --release"
+  },
   "dependencies": {
     "@oracle/oraclejet": "~13.0.0",
     "@reduxjs/toolkit": "^1.8.5",
@@ -10,6 +15,7 @@
     "react-redux": "^8.0.2"
   },
   "devDependencies": {
+    "@oracle/ojet-cli": "^13.0.0",
     "@oracle/oraclejet-tooling": "~13.0.0",
     "@prefresh/babel-plugin": "0.4.3",
     "@prefresh/webpack": "3.3.4",

+ 29 - 81
src/components/app.tsx

@@ -1,95 +1,43 @@
-import { method, registerCustomElement } from "ojs/ojvcomponent";
-import { h } from "preact";
-import { useState } from "preact/hooks";
+import { registerCustomElement } from "ojs/ojvcomponent";
+import { FunctionComponent } from "preact";
 import { useEffect } from "preact/hooks";
-import Context = require("ojs/ojcontext");
+import { Provider } from "react-redux";
 import { Footer } from "./footer";
 import { Header } from "./header";
 import { Content } from "./content/index";
-import { Provider } from "react-redux";
 import { store } from "../state/store";
+import { useLogin } from "../hooks/useLogin";
+import Context = require("ojs/ojcontext");
 
 type Props = Readonly<{
   appName?: string;
   userLogin?: string;
 }>;
 
-const parseJwt = token => {
-  var base64Url = token.split('.')[1];
-  var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
-  var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(
-    c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
-  ).join(''));
-  return JSON.parse(jsonPayload);
-};
+const AppComponent: FunctionComponent<Props> = ({ appName = "OCC" }) => {
+  const { userLogin, login, logout } = useLogin();
 
-const login = () => {
-  const state = crypto.randomUUID();
-  const nonce = crypto.randomUUID();
-  sessionStorage.setItem("oauth", JSON.stringify({ state, nonce }));
-  window.location.href = "https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/authorize" +
-    "?client_id=4e728d65cf5b482ea81e56bf23a9ad8a" +
-    "&response_type=code" +
-    "&redirect_uri=https%3A%2F%2Flocalhost%3A8000" +
-    "&scope=openid" +
-    `&nonce=${nonce}` +
-    `&state=${state}`;
-};
-
-export const App = registerCustomElement(
-  "app-root",
-  ({ appName = "App Name" }: Props) => {
-    const [userLogin, setUserLogin] = useState("");
+  useEffect(() => {
+    Context.getPageContext().getBusyContext().applicationBootstrapComplete();
+  }, []);
 
-    useEffect(() => {
-      Context.getPageContext().getBusyContext().applicationBootstrapComplete();
-
-      const searchParams = new URLSearchParams(window.location.search);
-      if (searchParams.has("code") && searchParams.has("state")) {
-        const { state } = JSON.parse(sessionStorage.getItem("oauth"));
-        const receivedState = searchParams.get("state");
-        if (receivedState !== state) {
-          return;
-        }
-        // Get the tokens using the received authorization code
-        const code = searchParams.get("code");
-        console.log("code", code);
-        fetch("https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/token", {
-          method: "POST",
-          headers: new Headers({
-            Authorization: "Basic NGU3MjhkNjVjZjViNDgyZWE4MWU1NmJmMjNhOWFkOGE6ZGM1NDdkYmUtOGQ0Yi00MTU1LWEzNzgtZjNhMDNkNTZhNjU0",
-            "Content-Type": "application/x-www-form-urlencoded"
-          }),
-          body: new URLSearchParams({
-            grant_type: "authorization_code",
-            code
-          })
-        })
-          .then(response => response.json())
-          .then(body => {
-            const idToken = parseJwt(body.id_token);
-            setUserLogin(idToken.user_displayname);
-          })
-          .finally(() => sessionStorage.removeItem("oauth"));
-        // Clear the search parameter from the url
-        window.history.pushState({}, document.title, window.location.pathname);
-      } else {
-        sessionStorage.removeItem("oauth");
-      }
-    }, []);
+  return (
+    <Provider store={store}>
+      <div id="appContainer" class="oj-web-applayout-page">
+        <Header
+          appName={appName}
+          userLogin={userLogin}
+          login={login}
+          logout={logout}
+        />
+        <Content pluginUrl={userLogin ? "https://localhost:8001" : ""} />
+        <Footer />
+      </div>
+    </Provider>
+  );
+};
 
-    return (
-      <Provider store={store}>
-        <div id="appContainer" class="oj-web-applayout-page">
-          <Header
-            appName={appName}
-            userLogin={userLogin}
-            login={login}
-          />
-          <Content />
-          <Footer />
-        </div>
-      </Provider>
-    );
-  }
-);
+  export const App = registerCustomElement(
+    "app-root",
+    AppComponent
+  );

+ 7 - 10
src/components/content/index.tsx

@@ -1,16 +1,13 @@
-import { h } from "preact";
-import { useSelector, useDispatch } from "react-redux";
-import { increment } from "../../state/counterReducer";
-import { State } from "../../state/store";
+import { FunctionComponent } from "preact";
 
-export function Content() {
-  const { value: counter } = useSelector((state: State) => state.counter);
-  const dispatch = useDispatch();
+type Props = Readonly<{
+  pluginUrl: string;
+}>;
 
+export const Content: FunctionComponent<Props> = ({ pluginUrl }) => {
   return (
-    <div class="oj-web-applayout-max-width oj-web-applayout-content">
-      <div>{counter}</div>
-      <button onClick={() => dispatch(increment())}>Increment</button>
+    <div class="oj-web-applayout-max-width oj-flex-item oj-flex">
+      {pluginUrl && <iframe src={pluginUrl} className="oj-flex-item"></iframe>}
     </div>
   );
 };

+ 2 - 2
src/components/footer.tsx

@@ -1,4 +1,4 @@
-import { h } from "preact";
+import { FunctionComponent } from "preact";
 
 type Props = {
   links?: FooterLink[]
@@ -38,7 +38,7 @@ const _DEFAULT_LINKS: FooterLink[] = [
   }
 ]
 
-export function Footer({ links = _DEFAULT_LINKS } : Props ) {
+export const Footer: FunctionComponent<Props> = ({ links = _DEFAULT_LINKS }) => {
   return (
     <footer class="oj-web-applayout-footer" role="contentinfo">
       <div class="oj-web-applayout-footer-item oj-web-applayout-max-width">

+ 19 - 11
src/components/header.tsx

@@ -1,18 +1,20 @@
-import { h } from "preact";
-import { useRef, useState, useEffect } from "preact/hooks";
-import { ojButton } from "ojs/ojbutton";
-import * as ResponsiveUtils from "ojs/ojresponsiveutils";
 import "ojs/ojtoolbar";
 import "ojs/ojmenu";
 import "ojs/ojbutton";
+import * as ResponsiveUtils from "ojs/ojresponsiveutils";
+import { ojMenu } from "ojs/ojmenu";
+import { ojButton } from "ojs/ojbutton";
+import { FunctionComponent } from "preact";
+import { useRef, useState, useEffect } from "preact/hooks";
 
 type Props = Readonly<{
   appName: string,
   userLogin: string,
-  login: () => void
+  login: () => void,
+  logout: () => void
 }>;
 
-export function Header({ appName, userLogin, login }: Props) {
+export const Header: FunctionComponent<Props> = ({ appName, userLogin, login, logout }) => {
   const mediaQueryRef = useRef<MediaQueryList>(window.matchMedia(ResponsiveUtils.getFrameworkQuery("sm-only")));
 
   const [isSmallWidth, setIsSmallWidth] = useState(mediaQueryRef.current.matches);
@@ -34,11 +36,18 @@ export function Header({ appName, userLogin, login }: Props) {
     return (isSmallWidth ? "oj-icon demo-appheader-avatar" : "oj-component-icon oj-button-menu-dropdown-icon");
   }
 
-  const buttonAction = (event: ojButton.ojAction) => {
-    console.log("Login clicked");
+  const loginButtonAction = (_: ojButton.ojAction) => {
     login();
   };
 
+  const userMenuAction = (event: ojMenu.ojMenuAction) => {
+    switch (event.detail.selectedValue) {
+      case "out":
+        logout();
+        break;
+    }
+  };
+
   return (
     <header role="banner" class="oj-web-applayout-header">
       <div class="oj-web-applayout-max-width oj-flex-bar oj-sm-align-items-center">
@@ -56,15 +65,14 @@ export function Header({ appName, userLogin, login }: Props) {
         </div>
         <div class="oj-flex-bar-end">
           <oj-toolbar>
-
             {!userLogin &&
-              <oj-button id="chroming_button5" chroming="danger" onojAction={buttonAction}>Login</oj-button>
+              <oj-button id="chroming_button5" chroming="danger" onojAction={loginButtonAction}>Login</oj-button>
             }
             {userLogin &&
               <oj-menu-button id="userMenu" display={getDisplayType()} chroming="borderless">
                 <span>{userLogin}</span>
                 <span slot="endIcon" class={getEndIconClass()}></span>
-                <oj-menu id="menu1" slot="menu">
+                <oj-menu id="menu1" slot="menu" onojMenuAction={userMenuAction}>
                   <oj-option id="pref" value="pref">Preferences</oj-option>
                   <oj-option id="help" value="help">Help</oj-option>
                   <oj-option id="about" value="about">About</oj-option>

+ 93 - 0
src/hooks/useLogin.tsx

@@ -0,0 +1,93 @@
+import { useEffect, useMemo, useState } from "preact/hooks";
+
+const parseJwt = token => {
+    var base64Url = token.split('.')[1];
+    var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
+    var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(
+      c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
+    ).join(''));
+    return JSON.parse(jsonPayload);
+  };
+  
+  // const idcsStripe = "https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com";
+  const idcsStripe = "https://idcs-login-stage.identity.oraclecloud.com";
+  // const clientId = "4e728d65cf5b482ea81e56bf23a9ad8a";
+  const clientId = "754db2d1964d4f12ab312a2ab6f025ed";
+  
+  const login = () => {
+    const state = crypto.randomUUID();
+    const nonce = crypto.randomUUID();
+    sessionStorage.setItem("oauth", JSON.stringify({ state, nonce }));
+    window.location.href = `${idcsStripe}/oauth2/v1/authorize` +
+      `?client_id=${clientId}` +
+      "&response_type=code" +
+      "&redirect_uri=https%3A%2F%2Flocalhost%3A8000" +
+      "&scope=openid" +
+      `&nonce=${nonce}` +
+      `&state=${state}`;
+  };
+  
+  const logout = (token: string) => () => {
+    // fetch(
+    //   `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/userlogout?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&id_token_hint=${token}`,
+    //   // `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/sso/v1/user/logout?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&id_token_hint=${token}`,
+    //   // `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/userlogout?id_token_hint=${token}`,
+    //   // `${idcsStripe}/oauth2/v1/userlogout`,
+    //   {
+    //     headers: {
+    //       "Content-Type": "application/scim+json",
+    //       // Authorization: `Bearer ${accessToken}`
+    //       // Authorization: "Basic NGU3MjhkNjVjZjViNDgyZWE4MWU1NmJmMjNhOWFkOGE6ZGM1NDdkYmUtOGQ0Yi00MTU1LWEzNzgtZjNhMDNkNTZhNjU0"
+    //     }
+    //   }
+    // );
+    window.location.href = `${idcsStripe}/sso/v1/user/logout`;
+  }
+
+export const useLogin = () => {
+    const [userLogin, setUserLogin] = useState("");
+    const [accessToken, setAccessToken] = useState("");
+    const [idToken, setIdToken] = useState("");
+
+    useEffect(() => {
+        const searchParams = new URLSearchParams(window.location.search);
+      if (searchParams.has("code") && searchParams.has("state")) {
+        const { state, nonce } = JSON.parse(sessionStorage.getItem("oauth"));
+        const receivedState = searchParams.get("state");
+        if (receivedState !== state) {
+          return;
+        }
+        // Get the tokens using the received authorization code
+        const code = searchParams.get("code");
+        console.log("code", code);
+        fetch("http://localhost:3000/auth/login", {
+          method: "POST",
+          headers: new Headers({
+            "Content-Type": "application/json"
+          }),
+          body: JSON.stringify({ code, nonce })
+        })
+          .then(response => response.json())
+          .then(body => {
+            const idToken = parseJwt(body.idToken);
+            setUserLogin(idToken.user_displayname);
+            setIdToken(body.idToken);
+            setAccessToken(body.accessToken);
+            console.log("Tokens:", { idToken, accessToken: parseJwt(body.accessToken) })
+          })
+          .finally(() => sessionStorage.removeItem("oauth"));
+        // Clear the search parameter from the url
+        window.history.pushState({}, document.title, window.location.pathname);
+      } else {
+        sessionStorage.removeItem("oauth");
+      }
+    }, []);
+
+    return {
+        userLogin,
+        idToken,
+        accessToken,
+        login,
+        logout: logout(idToken)
+    };
+};

+ 2 - 2
tsconfig.json

@@ -31,10 +31,10 @@
         "./node_modules/@oracle/oraclejet/dist/js/libs/preact"
       ],
       "react": [
-        "/Users/dnabracz/Projects/idcs-oauth-client/node_modules/preact/compat/src/index.d.ts"
+        "./node_modules/preact/compat/src/index.d.ts"
       ],
       "react-dom": [
-        "/Users/dnabracz/Projects/idcs-oauth-client/node_modules/preact/compat/src/index.d.ts"
+        "./node_modules/preact/compat/src/index.d.ts"
       ]
     },
     "declaration": true,