diff --git a/app/id/route.ts b/app/id/route.ts index 751c46d..d8d2503 100644 --- a/app/id/route.ts +++ b/app/id/route.ts @@ -10,8 +10,7 @@ function buildClientIdentifierDoc() { post_logout_redirect_uris: [baseUrl], // Support refresh_tokens for refreshing the session: grant_types: ["authorization_code", "refresh_token"], - // The scope must be explicit, as the default doesn't include offline_access, - // preventing the refresh token from being issued. + // The default scopes don't include offline_access scope: "openid webid offline_access", response_types: ["code"], token_endpoint_auth_method: "none", diff --git a/package-lock.json b/package-lock.json index 526493a..6b62fa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@inrupt/solid-client": "^1.30.0", "@inrupt/solid-client-authn-browser": "^1.17.1", "@inrupt/solid-ui-react": "^2.9.0", @@ -463,6 +465,52 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -5436,6 +5484,36 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, + "@fortawesome/fontawesome-common-types": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", + "peer": true, + "requires": { + "@fortawesome/fontawesome-common-types": "6.5.1" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.5.1" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "requires": { + "prop-types": "^15.8.1" + } + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", diff --git a/package.json b/package.json index 158a721..63da87c 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@inrupt/solid-client": "^1.30.0", "@inrupt/solid-client-authn-browser": "^1.17.1", "@inrupt/solid-ui-react": "^2.9.0", diff --git a/src/components/AddBookForm.module.css b/src/components/AddBookForm.module.css new file mode 100644 index 0000000..a0ab6de --- /dev/null +++ b/src/components/AddBookForm.module.css @@ -0,0 +1,92 @@ +.addBookFormContainer { + display: flex; + justify-content: center; +} + +.addBookForm { + border: black solid 1px; + border-radius: 1em; + padding: 1em; + margin: 1em; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: min-content min-content min-content; +} + +#bookTitleField { + grid-column: 1; + grid-row: 1; +} + +#langTagField { + grid-column: 2; + grid-row: 1; +} + +#authorField { + grid-column: 1; + grid-row: 2; +} + +#seriesField { + grid-column: 2; + grid-row: 2; + display: flex; +} + +#isbnField { + grid-column: 1; + grid-row: 3; +} + +#submitButton { + grid-column: 1 / span 2; + grid-row: 4; +} + + /* The Modal (background) */ + .barcode-modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ + } + + /* See the following link for ideas */ + /* https://codepen.io/havardob/pen/eYJPwdb */ + + .barcode-container { + display: flex; + justify-content: center; + } + + .barcode-container canvas { + /* The barcode library adds an extraneous canvas */ + display: none; + } + + /* Modal Content/Box */ + .barcode-viewer { + padding: 1em; + } + + /* The Close Button */ + .close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + } + + .close:hover, + .close:focus { + color: black; + text-decoration: none; + cursor: pointer; + } \ No newline at end of file diff --git a/src/components/AddBookForm.tsx b/src/components/AddBookForm.tsx index 75519af..79b7d18 100644 --- a/src/components/AddBookForm.tsx +++ b/src/components/AddBookForm.tsx @@ -1,14 +1,18 @@ "use client"; -import { BARCODE_CONTAINER_ID } from "../../src/components/domConstants"; +import { BARCODE_VIEWER_ID } from "../../src/components/domConstants"; import { Field, FieldArray, Formik, useFormikContext } from "formik"; -import { ChangeEventHandler, useContext, useState } from "react"; +import { ChangeEventHandler, useContext, useEffect, useState } from "react"; import type { Book } from "../lib/data/books"; import { addBookToDataset, bookToRdf } from "../lib/data/books"; import { getSourceIri, getThingAll, setThing } from "@inrupt/solid-client"; import { LibraryContext } from "../contexts/libraryContext"; import BarcodeReader from "./barcode"; +import style from "./AddBookForm.module.css"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faBarcode } from "@fortawesome/free-solid-svg-icons"; + const BookTitleField = ({ handleChange, title @@ -17,16 +21,18 @@ const BookTitleField = ({ title: string }) => { return ( -