diff --git a/R/README.qmd b/R/README.qmd index 710010c9..eae97eb7 100644 --- a/R/README.qmd +++ b/R/README.qmd @@ -11,7 +11,7 @@ format: --- ::: {.callout-tip} -_Note: This README file is generated from [`README.qmd`](R/README.qmd) in the "R" directory of this repo._ +_Note: This README file is generated from [`README.qmd`](R/README.qmd) in the "R" directory of this repo with the command `npm run render:readme`._ ::: This is a set of React UI components, contexts, and services for any web application that is intended to interact with the [CORI Data API](https://github.com/ruralinnovation/cori-data-api) backend. diff --git a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts index f8067c34..f026a1d0 100644 --- a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts +++ b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts @@ -1,19 +1,24 @@ import React, { ReactElement } from "react"; +import { JWT } from "@aws-amplify/auth"; type AmplifyContextType = { domain?: string; region?: string; identityPoolId?: string; userPoolId?: string; userPoolClientId?: string; + token: JWT | null; }; export declare const AmplifyContext: React.Context; export default function AmplifyContextProvider(props: { children?: ReactElement; domain?: string; region?: string; + identityPoolId?: string; userPoolId?: string; userPoolClientId?: string; - identityPoolId?: string; + fetchAuthSession: Function; + getCurrentUser: Function; + signOut?: Function; }): React.JSX.Element; export {}; //# sourceMappingURL=AmplifyContextProvider.d.ts.map \ No newline at end of file diff --git a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts.map b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts.map index 498307cb..08e93343 100644 --- a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts.map +++ b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"AmplifyContextProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@cori-risi/cotexts/AmplifyContextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEV,YAAY,EAGf,MAAM,OAAO,CAAC;AAOf,KAAM,kBAAkB,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAUF,eAAO,MAAM,cAAc,0CAA+D,CAAC;AAE3F,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAE3B,qBA8FA"} \ No newline at end of file +{"version":3,"file":"AmplifyContextProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@cori-risi/cotexts/AmplifyContextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEV,YAAY,EAGf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAc,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAoBpD,KAAM,kBAAkB,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB,CAAC;AAWF,eAAO,MAAM,cAAc,0CAA+D,CAAC;AAM3F,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,cAAc,EAAE,QAAQ,CAAC;IACzB,OAAO,CAAC,EAAE,QAAQ,CAAA;CACrB,qBAiKA"} \ No newline at end of file diff --git a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js index f944003a..9e78e533 100644 --- a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js +++ b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js @@ -15,8 +15,10 @@ const initAmplifyContext = { identityPoolId: undefined, userPoolId: undefined, userPoolClientId: undefined, + token: null }; const AmplifyContext = createContext(initAmplifyContext); +let hasAuthSession = false; function AmplifyContextProvider(props) { const [state, setState] = useState(initAmplifyContext); useEffect(() => { @@ -25,7 +27,41 @@ function AmplifyContextProvider(props) { && !!props.identityPoolId && !!props.userPoolId && !!props.userPoolClientId) { - const { domain, region, identityPoolId, userPoolId, userPoolClientId } = props; + const { domain, region, identityPoolId, userPoolId, userPoolClientId, fetchAuthSession, getCurrentUser, signOut } = props; + // Ex. Auth data structure: + // Auth: { + // Cognito: { + // userPoolClientId: "5eusi16g0o2q1g1rr5ehgudodm", + // userPoolId: "us-east-1_QeA4600FA", + // userPoolEndpoint: "authcori.auth.us-east-1.amazoncognito.com", + // identityPoolId: "us-east-1:2194a76a-fa3d-4c33-999e-e3c4b2b049ee", + // loginWith: { // Optional + // oauth: { + // domain: 'authcori.auth.us-east-1.amazoncognito.com', + // scopes: ['email', 'openid', 'profile'], + // redirectSignIn: ["http://localhost:3000", "http://localhost:5173", "http://localhost:5174"], + // redirectSignOut: ["http://localhost:3000/", "http://localhost:5173/", "http://localhost:5174/"], + // responseType: 'code', + // }, + // username: true, + // email: true, // Optional + // phone: false, // Optional + // + // }, + // // signUpVerificationMethod: "", + // // userAttributes: "", + // // mfa: "", + // // passwordFormat: "", + // }, + // region: config.region, + // oauth: { + // scope: ['email', 'openid', 'profile'], + // redirectSignIn: '', + // redirectSignOut: '', + // responseType: 'code', + // mandatorySignIn: true, + // }, + // }, const aws_original_auth_config = { "Auth": { "domain": domain, @@ -49,19 +85,40 @@ function AmplifyContextProvider(props) { } } }; - Amplify.configure(Object.assign(Object.assign({}, Amplify.getConfig()), { Auth: Object.assign(Object.assign({}, Amplify.getConfig().Auth), { Cognito: Object.assign(Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito), aws_original_auth_config.Auth), { loginWith: Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito.loginWith), { oauth: Object.assign(Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito.loginWith.oauth), aws_original_auth_config.Auth.oauth), { redirectSignIn: [ + Amplify.configure((Object.assign(Object.assign({}, Amplify.getConfig()), { Auth: Object.assign(Object.assign({}, Amplify.getConfig().Auth), { Cognito: Object.assign(Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito), aws_original_auth_config.Auth), { loginWith: Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito.loginWith), { oauth: Object.assign(Object.assign(Object.assign({}, Amplify.getConfig().Auth.Cognito.loginWith.oauth), aws_original_auth_config.Auth.oauth), { redirectSignIn: [ aws_original_auth_config.Auth.oauth.redirectSignIn ], redirectSignOut: [ aws_original_auth_config.Auth.oauth.redirectSignOut ], responseType: aws_original_auth_config.Auth.oauth.responseType, scopes: [ ...aws_original_auth_config.Auth.oauth.scope - ] }), username: true }), userPoolClientId: aws_original_auth_config.Auth.clientId }) }) })); + ] }), username: true }), userPoolClientId: aws_original_auth_config.Auth.clientId }) }) }))); + const session = fetchAuthSession(); + getCurrentUser(); + session + .then((sess) => { + if (!hasAuthSession) { + hasAuthSession = true; + console.log("API Session is authenticated:", hasAuthSession); + console.log("API Session config:", sess); + const tokens = sess.tokens; + console.log("API tokens:", tokens); + setState({ + domain, + region, + identityPoolId, + userPoolId, + userPoolClientId, + token: tokens.idToken + }); + } + }); setState({ domain, region, identityPoolId, userPoolId, - userPoolClientId + userPoolClientId, + token: null }); } }, []); diff --git a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js.map b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js.map index 3903639a..15a08865 100644 --- a/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js.map +++ b/inst/dist/@cori-risi/cotexts/AmplifyContextProvider.js.map @@ -1 +1 @@ -{"version":3,"file":"AmplifyContextProvider.js","sources":["../../../../lib/@cori-risi/cotexts/AmplifyContextProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n useEffect,\n useState\n} from \"react\";\nimport { Amplify } from \"aws-amplify\";\n\nimport amplifyconfig from './amplifyconfiguration.json';\n\nAmplify.configure(amplifyconfig);\n\ntype AmplifyContextType = {\n domain?: string,\n region?: string,\n identityPoolId?: string,\n userPoolId?: string,\n userPoolClientId?: string,\n};\n\nconst initAmplifyContext: AmplifyContextType = {\n domain: undefined,\n region: undefined,\n identityPoolId: undefined,\n userPoolId: undefined,\n userPoolClientId: undefined,\n};\n\nexport const AmplifyContext = createContext(initAmplifyContext);\n\nexport default function AmplifyContextProvider(props: {\n children?: ReactElement,\n domain?: string,\n region?: string,\n userPoolId?: string,\n userPoolClientId?: string,\n identityPoolId?: string,\n\n}) {\n\n const [ state, setState ] = useState(initAmplifyContext);\n\n useEffect(() => {\n if (!!props.domain\n && !!props.region\n && !!props.identityPoolId\n && !!props.userPoolId\n && !!props.userPoolClientId\n ) {\n\n const {\n domain,\n region,\n identityPoolId,\n userPoolId,\n userPoolClientId\n } = props;\n\n const aws_original_auth_config = {\n \"Auth\": {\n \"domain\": domain,\n \"region\": region,\n \"identityPoolRegion\": region,\n \"identityPoolId\": identityPoolId,\n \"userPoolId\": userPoolId,\n // \"userPoolClientId\": userPoolClientId,\n \"userPoolWebClientId\": userPoolClientId,\n \"clientId\": userPoolClientId,\n \"oauth\": {\n \"domain\": domain,\n // \"scope\": [ \"email\", \"profile\", \"openid\", \"aws.cognito.signin.user.admin\" ],\n // \"scope\": [ \"email\", \"openid\", \"profile\" ],\n // \"scope\": [ \"email\" ],\n \"scope\": [\"openid\"],\n \"redirectSignIn\": window.location.protocol + \"//\" + window.location.hostname + ((!!window.location.port) ? \":\" + window.location.port : \"\"),\n \"redirectSignOut\": window.location.protocol + \"//\" + window.location.hostname + ((!!window.location.port) ? \":\" + window.location.port : \"\") + \"/\",\n \"responseType\": (\"code\" as \"code\") // ... or \"token\", note that REFRESH token will only\n // be generated when the responseType is \"code\"\n }\n }\n };\n\n Amplify.configure({\n // TODO: Why is this so ridiculous and how can these options be\n // specified exclusively in amplifyconfiguration.json ???\n ...Amplify.getConfig(),\n Auth: {\n ...Amplify.getConfig().Auth!,\n Cognito: {\n ...Amplify.getConfig().Auth!.Cognito!,\n ...aws_original_auth_config.Auth,\n loginWith: {\n ...Amplify.getConfig().Auth!.Cognito!.loginWith!,\n oauth: {\n ...Amplify.getConfig().Auth!.Cognito!.loginWith!.oauth!,\n ...aws_original_auth_config.Auth.oauth,\n redirectSignIn: [\n aws_original_auth_config.Auth.oauth.redirectSignIn\n ],\n redirectSignOut: [\n aws_original_auth_config.Auth.oauth.redirectSignOut\n ],\n responseType: (aws_original_auth_config.Auth.oauth.responseType as \"code\"),\n scopes: [\n ...aws_original_auth_config.Auth.oauth.scope\n ]\n },\n username: true,\n },\n userPoolClientId: aws_original_auth_config.Auth.clientId\n }\n }\n });\n\n setState({\n domain,\n region,\n identityPoolId,\n userPoolId,\n userPoolClientId\n });\n }\n\n }, []);\n\n\n return (\n
\n {props.children}\n
\n )\n\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"AmplifyContextProvider.js","sources":["../../../../lib/@cori-risi/cotexts/AmplifyContextProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n useEffect,\n useState\n} from \"react\";\nimport {Amplify, ResourcesConfig} from \"aws-amplify\";\n\nimport amplifyconfig from './amplifyconfiguration.json';\nimport { AuthTokens, JWT } from \"@aws-amplify/auth\";\nimport { User } from \"../models\";\n\nAmplify.configure(amplifyconfig);\n\ntype AWSCredentials = {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n expiration?: Date;\n};\n\ntype AuthSession = {\n tokens?: AuthTokens;\n credentials?: AWSCredentials;\n identityId?: string;\n userSub?: string;\n};\n\n\ntype AmplifyContextType = {\n domain?: string,\n region?: string,\n identityPoolId?: string,\n userPoolId?: string,\n userPoolClientId?: string,\n token: JWT | null;\n};\n\nconst initAmplifyContext: AmplifyContextType = {\n domain: undefined,\n region: undefined,\n identityPoolId: undefined,\n userPoolId: undefined,\n userPoolClientId: undefined,\n token: null\n};\n\nexport const AmplifyContext = createContext(initAmplifyContext);\n\nlet hasAuthSession = false;\nlet hasAuthUser = false;\nlet hasAuthClient = false;\n\nexport default function AmplifyContextProvider(props: {\n children?: ReactElement,\n domain?: string,\n region?: string,\n identityPoolId?: string,\n userPoolId?: string,\n userPoolClientId?: string,\n fetchAuthSession: Function,\n getCurrentUser: Function,\n signOut?: Function\n}) {\n\n const [ state, setState ] = useState(initAmplifyContext);\n\n useEffect(() => {\n if (!!props.domain\n && !!props.region\n && !!props.identityPoolId\n && !!props.userPoolId\n && !!props.userPoolClientId\n ) {\n\n const {\n domain,\n region,\n identityPoolId,\n userPoolId,\n userPoolClientId,\n fetchAuthSession,\n getCurrentUser,\n signOut\n } = props;\n\n // Ex. Auth data structure:\n // Auth: {\n // Cognito: {\n // userPoolClientId: \"5eusi16g0o2q1g1rr5ehgudodm\",\n // userPoolId: \"us-east-1_QeA4600FA\",\n // userPoolEndpoint: \"authcori.auth.us-east-1.amazoncognito.com\",\n // identityPoolId: \"us-east-1:2194a76a-fa3d-4c33-999e-e3c4b2b049ee\",\n // loginWith: { // Optional\n // oauth: {\n // domain: 'authcori.auth.us-east-1.amazoncognito.com',\n // scopes: ['email', 'openid', 'profile'],\n // redirectSignIn: [\"http://localhost:3000\", \"http://localhost:5173\", \"http://localhost:5174\"],\n // redirectSignOut: [\"http://localhost:3000/\", \"http://localhost:5173/\", \"http://localhost:5174/\"],\n // responseType: 'code',\n // },\n // username: true,\n // email: true, // Optional\n // phone: false, // Optional\n //\n // },\n // // signUpVerificationMethod: \"\",\n // // userAttributes: \"\",\n // // mfa: \"\",\n // // passwordFormat: \"\",\n // },\n // region: config.region,\n // oauth: {\n // scope: ['email', 'openid', 'profile'],\n // redirectSignIn: '',\n // redirectSignOut: '',\n // responseType: 'code',\n // mandatorySignIn: true,\n // },\n // },\n\n const aws_original_auth_config = {\n \"Auth\": {\n \"domain\": domain,\n \"region\": region,\n \"identityPoolRegion\": region,\n \"identityPoolId\": identityPoolId,\n \"userPoolId\": userPoolId,\n // \"userPoolClientId\": userPoolClientId,\n \"userPoolWebClientId\": userPoolClientId,\n \"clientId\": userPoolClientId,\n \"oauth\": {\n \"domain\": domain,\n // \"scope\": [ \"email\", \"profile\", \"openid\", \"aws.cognito.signin.user.admin\" ],\n // \"scope\": [ \"email\", \"openid\", \"profile\" ],\n // \"scope\": [ \"email\" ],\n \"scope\": [\"openid\"],\n \"redirectSignIn\": window.location.protocol + \"//\" + window.location.hostname + ((!!window.location.port) ? \":\" + window.location.port : \"\"),\n \"redirectSignOut\": window.location.protocol + \"//\" + window.location.hostname + ((!!window.location.port) ? \":\" + window.location.port : \"\") + \"/\",\n \"responseType\": (\"code\" as \"code\") // ... or \"token\", note that REFRESH token will only\n // be generated when the responseType is \"code\"\n }\n }\n };\n\n Amplify.configure(({\n // TODO: Why is this so ridiculous and how can these options be\n // specified exclusively in amplifyconfiguration.json ???\n ...Amplify.getConfig(),\n Auth: {\n ...Amplify.getConfig().Auth!,\n Cognito: {\n ...Amplify.getConfig().Auth!.Cognito!,\n ...aws_original_auth_config.Auth,\n loginWith: {\n ...Amplify.getConfig().Auth!.Cognito!.loginWith!,\n oauth: {\n ...Amplify.getConfig().Auth!.Cognito!.loginWith!.oauth!,\n ...aws_original_auth_config.Auth.oauth,\n redirectSignIn: [\n aws_original_auth_config.Auth.oauth.redirectSignIn\n ],\n redirectSignOut: [\n aws_original_auth_config.Auth.oauth.redirectSignOut\n ],\n responseType: (aws_original_auth_config.Auth.oauth.responseType as \"code\"),\n scopes: [\n ...aws_original_auth_config.Auth.oauth.scope\n ]\n },\n username: true,\n },\n userPoolClientId: aws_original_auth_config.Auth.clientId\n }\n }\n }) as ResourcesConfig);\n\n const session: Promise = fetchAuthSession();\n const user: Promise = getCurrentUser();\n\n session\n .then((sess) => {\n\n if (!hasAuthSession) {\n\n hasAuthSession = true;\n\n console.log(\"API Session is authenticated:\", hasAuthSession);\n console.log(\"API Session config:\", sess);\n\n const tokens = sess.tokens!;\n\n console.log(\"API tokens:\", tokens);\n\n setState({\n domain,\n region,\n identityPoolId,\n userPoolId,\n userPoolClientId,\n token: tokens.idToken!\n });\n }\n });\n\n setState({\n domain,\n region,\n identityPoolId,\n userPoolId,\n userPoolClientId,\n token: null\n });\n }\n\n }, []);\n\n\n return (\n
\n {props.children}\n
\n )\n\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts b/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts index 7dfad602..0b080425 100644 --- a/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts +++ b/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts @@ -14,6 +14,7 @@ export declare const ApiContext: React.Context; export default function ApiContextProvider(props: { children?: ReactElement; baseURL?: string; + token?: string; }): React.JSX.Element; export {}; //# sourceMappingURL=ApiContextProvider.d.ts.map \ No newline at end of file diff --git a/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts.map b/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts.map index 8667b2f3..88ba2ddf 100644 --- a/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts.map +++ b/inst/dist/@cori-risi/cotexts/ApiContextProvider.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ApiContextProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@cori-risi/cotexts/ApiContextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEV,YAAY,EAIf,MAAM,OAAO,CAAC;AACf,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAoB,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAc1D,OAAO,iCAAiC,CAAC;AAiBzC,UAAU,cAAc;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IAGvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5C;AAaD,eAAO,MAAM,UAAU,sCAAkD,CAAC;AAM1E,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAE,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,qBAmO/F"} \ No newline at end of file +{"version":3,"file":"ApiContextProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@cori-risi/cotexts/ApiContextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEV,YAAY,EAIf,MAAM,OAAO,CAAC;AACf,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAoB,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAe1D,OAAO,iCAAiC,CAAC;AAiBzC,UAAU,cAAc;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IAGvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5C;AAaD,eAAO,MAAM,UAAU,sCAAkD,CAAC;AAM1E,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAE,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAmO/G"} \ No newline at end of file diff --git a/inst/dist/@cori-risi/cotexts/ApiContextProvider.js.map b/inst/dist/@cori-risi/cotexts/ApiContextProvider.js.map index 31e663ed..d385a54f 100644 --- a/inst/dist/@cori-risi/cotexts/ApiContextProvider.js.map +++ b/inst/dist/@cori-risi/cotexts/ApiContextProvider.js.map @@ -1 +1 @@ -{"version":3,"file":"ApiContextProvider.js","sources":["../../../../lib/@cori-risi/cotexts/ApiContextProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n useContext,\n useEffect,\n useState\n} from \"react\";\nimport axios, { AxiosInstance } from 'axios';\nimport { fetchAuthSession, JWT } from \"@aws-amplify/auth\";\n// import { getCurrentUser } from \"@aws-amplify/auth/cognito\";\n// import { useAuthenticator, UseAuthenticator } from \"@aws-amplify/ui-react\";\n// import { useDispatch, useSelector } from \"react-redux\";\n// import {\n// updateUserId,\n// updateUserName,\n// updateUserTokens,\n// selectUser\n// } from \"../features\";\n// import { User } from '../models';\n\n// import { AmplifyContext } from \"./AmplifyContextProvider\";\n\nimport \"./styles/ApiContextProvider.css\";\n\nconst BASE_URL = \"http://localhost:8000\"; // `${import.meta.env.VITE_CORI_DATA_API}`;\n// TODO: From now on must pass dev/prod API url in as param to ApiContextProvider because:\n// cori.data.api/lib/@cori-risi/cotexts/ApiContextProvider.tsx:22\n// const BASE_URL = `${import.meta.env.VITE_CORI_DATA_API}`;\n// ^^^^\n// SyntaxError: Cannot use 'import.meta' outside a module\n//\n\nconst apiClient: AxiosInstance = axios.create({\n baseURL: BASE_URL,\n headers: {\n 'Content-Type': 'application/json'\n },\n});\n\ninterface ApiContextType {\n apiClient: AxiosInstance;\n authenticated: boolean;\n // authenticated_user: User | null;\n // autoSignOut: (() => void) | null;\n baseURL: string;\n token: JWT | null;\n data: any;\n setData: ((newData: any) => void) | null;\n}\n\nconst initState: ApiContextType = {\n apiClient: apiClient,\n authenticated: false,\n // authenticated_user: null,\n // autoSignOut: null,\n baseURL: BASE_URL,\n token: null,\n data: {},\n setData: null\n};\n\nexport const ApiContext = createContext(initState);\n\n// let hasAuthSession = false;\n// let hasAuthUser = false;\n// let hasAuthClient = false;\n\nexport default function ApiContextProvider (props: { children?: ReactElement, baseURL?: string }) {\n\n // const amplifyContext = useContext(AmplifyContext);\n // const authenticator = useAuthenticator();\n // const userState = useSelector(selectUser);\n // const dispatch = useDispatch();\n\n // const [ authenticated_user, setAuthenticatedUser ] = useState(userState);\n\n const [ state, setState ] = useState(initState);\n\n function setData(newData: any) {\n const currentState: ApiContextType = state!;\n setState({\n ...currentState,\n data: {\n ...currentState.data,\n ...newData\n },\n setData: setData\n });\n }\n\n useEffect(() => {\n\n // if (\n // amplifyContext !== null\n // && !!amplifyContext .domain\n // && !!amplifyContext .region\n // && !!amplifyContext .identityPoolId\n // && !!amplifyContext .userPoolId\n // && !!amplifyContext .userPoolClientId\n // ) {\n //\n // const session = fetchAuthSession();\n // const user: Promise = getCurrentUser();\n //\n // session\n // .then((sess) => {\n //\n // if (!hasAuthSession) {\n //\n // hasAuthSession = true;\n //\n // console.log(\"API Session is authenticated:\", hasAuthSession);\n // console.log(\"API Session config:\", sess);\n //\n // const {\n // // signIn,\n // // signUp,\n // // forceNewPassword,\n // // confirmResetPassword,\n // // confirmSignIn,\n // // confirmSignUp,\n // // confirmVerifyUser,\n // // forgotPassword,\n // // setupTotp,\n // // verifyUser,\n // signOut\n // } = authenticator;\n //\n // const tokens = sess.tokens!;\n //\n // console.log(\"API tokens:\", tokens);\n //\n // if (!!tokens.idToken && !hasAuthClient) {\n //\n // hasAuthClient = true;\n //\n // // const autoSignOut = () => {\n // // signOut();\n // // window.alert(\"Please refresh this session by clicking the browser's reload button!\");\n // // (window as any).location = window.location.protocol + \"//\" + window.location.host + window.location.pathname;\n // // };\n //\n // try {\n //\n // apiClient.interceptors.request.use(\n // (config) => {\n // const accessToken = tokens.idToken!.toString();\n // if (!!accessToken) {\n // config.headers.Authorization = `Bearer ${accessToken}`;\n // }\n // if (!!props.baseURL) {\n // config.baseURL = props.baseURL;\n // }\n // return config;\n // },\n // (error) => Promise.reject(error)\n // );\n //\n // setState({\n // apiClient: apiClient,\n // authenticated: true,\n // // authenticated_user: authenticated_user,\n // // autoSignOut: autoSignOut,\n // baseURL: props.baseURL || BASE_URL,\n // token: tokens.idToken,\n // data: {},\n // setData\n // });\n //\n // // TODO: Use autoSignOut to prompt user to refresh session on API error\n // // const remoteAPIStartTime = performance.now();\n // // apiClient.get(...)\n // // .then(response => ...)\n // // .catch(error => {\n // // const remoteAPIEndTime = performance.now();\n // //\n // // (window as any)[\"remoteAPIExecutionTime\"] = remoteAPIEndTime - remoteAPIStartTime;\n // // console.debug(`Remote API Call Execution took ${(window as any)[\"remoteAPIExecutionTime\"]} ms`);\n // //\n // // if (error.hasOwnProperty(\"code\")) {\n // // console.log(\"Error code:\", error.code!);\n // // if (error.code! === \"ERR_BAD_REQUEST\"\n // // || error.code! === \"ERR_NETWORK\"\n // // ) {\n // // autoSignOut();\n // //\n // // } else if (error.code === 'ERR_NAME_NOT_RESOLVED') {\n // // console.error('Invalid baseURL:', apiClient.defaults.baseURL);\n // // // Handle invalid baseURL error\n // // }\n // // } else {\n // // console.log(error.toString());\n // // }\n // // });\n //\n // } catch (e: any) {\n // console.log(\"Axios Error:\", e);\n // }\n //\n // user.then((u) => {\n // if (!hasAuthUser) {\n //\n // // console.log(\"Initial userState:\", userState);\n // // console.log(\"user type:\", u.constructor.name);\n //\n // hasAuthUser = true;\n //\n // console.log(\"API User is authenticated:\", hasAuthSession);\n // console.log(\"API User:\", u);\n //\n // // function updateUser (u: User) {\n // // try {\n // // if (!!u.userId) {\n // // console.log(\"Update userId:\", u.userId);\n // // dispatch(updateUserId(u.userId));\n // // }\n // // if (!!u.userId && !!u.username) {\n // // console.log(\"Update username:\", u.username);\n // // dispatch(updateUserName(u.username));\n // // }\n // //\n // // if (!!tokens.idToken) {\n // // console.log(\"Update user tokens:\", tokens);\n // // dispatch(updateUserTokens(JSON.stringify(tokens)));\n // // }\n // //\n // // } catch (e: any) {\n // // console.error(e);\n // // }\n // //\n // // // setState({\n // // // apiClient: (!!hasAuthClient) ? apiClient : axios.create({\n // // // baseURL: props.baseURL || BASE_URL,\n // // // headers: {\n // // // 'Content-Type': 'application/json',\n // // // 'Authorization': `Bearer ${accessToken}`,\n // // // },\n // // // }),\n // // // authenticated: true,\n // // // authenticated_user: u,\n // // // baseURL: props.baseURL || BASE_URL,\n // // // autoSignOut: signOut,\n // // // token: tokens.idToken,\n // // // data: {\n // // // ...state.data,\n // // // }\n // // // });\n // //\n // // setAuthenticatedUser(u);\n // // }\n //\n // // updateUser(u);\n // }\n // });\n // }\n // }\n // })\n // .catch((e: any) => {\n // console.log(\"API Session ERROR:\", e);\n // });\n //\n // } else {\n\n apiClient.interceptors.request.use(\n (config) => {\n if (!!props.baseURL) {\n config.baseURL = props.baseURL;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n setState({\n apiClient: apiClient,\n authenticated: false,\n // authenticated_user: authenticated_user,\n // autoSignOut: autoSignOut,\n baseURL: props.baseURL || BASE_URL,\n token: null,\n data: {},\n setData\n });\n // }\n\n }, []);\n\n return (<>\n \n {/**/}\n {props.children}\n {/**/}\n \n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAwBA,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AACzC;AACA;AACA;AACA;AACA;AACA;AAEA,MAAM,SAAS,GAAkB,KAAK,CAAC,MAAM,CAAC;AAC1C,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,OAAO,EAAE;AACL,QAAA,cAAc,EAAE,kBAAkB;AACrC,KAAA;AACJ,CAAA,CAAC,CAAC;AAaH,MAAM,SAAS,GAAmB;AAC9B,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,aAAa,EAAE,KAAK;;;AAGpB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,OAAO,EAAE,IAAI;CAChB,CAAC;MAEW,UAAU,GAAG,aAAa,CAAwB,SAAS,EAAE;AAE1E;AACA;AACA;AAEwB,SAAA,kBAAkB,CAAE,KAAoD,EAAA;;;;;;IAS5F,MAAM,CAAE,KAAK,EAAE,QAAQ,CAAE,GAAG,QAAQ,CAAwB,SAAS,CAAC,CAAC;IAEvE,SAAS,OAAO,CAAC,OAAY,EAAA;QACzB,MAAM,YAAY,GAAoB,KAAM,CAAC;AAC7C,QAAA,QAAQ,CACD,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,YAAY,CACf,EAAA,EAAA,IAAI,kCACG,YAAY,CAAC,IAAI,CAAA,EACjB,OAAO,CAEd,EAAA,OAAO,EAAE,OAAO,IAClB,CAAC;KACN;IAED,SAAS,CAAC,MAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6KP,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC9B,CAAC,MAAM,KAAI;AACP,YAAA,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE;AACjB,gBAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;aAClC;AACD,YAAA,OAAO,MAAM,CAAC;AAClB,SAAC,EACD,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACnC,CAAC;AAEF,QAAA,QAAQ,CAAC;AACL,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,KAAK;;;AAGpB,YAAA,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ;AAClC,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,IAAI,EAAE,EAAE;YACR,OAAO;AACV,SAAA,CAAC,CAAC;;KAGV,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,QAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACJ,QAAA,KAAA,CAAA,aAAA,CAAC,UAAU,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAExB,EAAA,KAAK,CAAC,QAAQ,CAED,CACvB,EAAE;AACT;;;;"} \ No newline at end of file +{"version":3,"file":"ApiContextProvider.js","sources":["../../../../lib/@cori-risi/cotexts/ApiContextProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n // useContext,\n useEffect,\n useState\n} from \"react\";\nimport axios, { AxiosInstance } from 'axios';\nimport { fetchAuthSession, JWT } from \"@aws-amplify/auth\";\n// import { getCurrentUser } from \"@aws-amplify/auth/cognito\";\n// import { useAuthenticator, UseAuthenticator } from \"@aws-amplify/ui-react\";\n// import { useDispatch, useSelector } from \"react-redux\";\n// import {\n// updateUserId,\n// updateUserName,\n// updateUserTokens,\n// selectUser\n// } from \"../features\";\n// import { User } from '../models';\n\n// TODO: (maybe?) move the token retrieval code & state prop to AmplifyContextProvider\n// import { AmplifyContext } from \"./AmplifyContextProvider\";\n\nimport \"./styles/ApiContextProvider.css\";\n\nconst BASE_URL = \"http://localhost:8000\"; // `${import.meta.env.VITE_CORI_DATA_API}`;\n// TODO: From now on must pass dev/prod API url in as param to ApiContextProvider because:\n// cori.data.api/lib/@cori-risi/cotexts/ApiContextProvider.tsx:22\n// const BASE_URL = `${import.meta.env.VITE_CORI_DATA_API}`;\n// ^^^^\n// SyntaxError: Cannot use 'import.meta' outside a module\n//\n\nconst apiClient: AxiosInstance = axios.create({\n baseURL: BASE_URL,\n headers: {\n 'Content-Type': 'application/json'\n },\n});\n\ninterface ApiContextType {\n apiClient: AxiosInstance;\n authenticated: boolean;\n // authenticated_user: User | null;\n // autoSignOut: (() => void) | null;\n baseURL: string;\n token: JWT | null;\n data: any;\n setData: ((newData: any) => void) | null;\n}\n\nconst initState: ApiContextType = {\n apiClient: apiClient,\n authenticated: false,\n // authenticated_user: null,\n // autoSignOut: null,\n baseURL: BASE_URL,\n token: null,\n data: {},\n setData: null\n};\n\nexport const ApiContext = createContext(initState);\n\n// let hasAuthSession = false;\n// let hasAuthUser = false;\n// let hasAuthClient = false;\n\nexport default function ApiContextProvider (props: { children?: ReactElement, baseURL?: string, token?: string }) {\n\n // const amplifyContext = useContext(AmplifyContext);\n // const authenticator = useAuthenticator();\n // const userState = useSelector(selectUser);\n // const dispatch = useDispatch();\n\n // const [ authenticated_user, setAuthenticatedUser ] = useState(userState);\n\n const [ state, setState ] = useState(initState);\n\n function setData(newData: any) {\n const currentState: ApiContextType = state!;\n setState({\n ...currentState,\n data: {\n ...currentState.data,\n ...newData\n },\n setData: setData\n });\n }\n\n useEffect(() => {\n\n // if (\n // amplifyContext !== null\n // && !!amplifyContext .domain\n // && !!amplifyContext .region\n // && !!amplifyContext .identityPoolId\n // && !!amplifyContext .userPoolId\n // && !!amplifyContext .userPoolClientId\n // ) {\n //\n // const session = fetchAuthSession();\n // const user: Promise = getCurrentUser();\n //\n // session\n // .then((sess) => {\n //\n // if (!hasAuthSession) {\n //\n // hasAuthSession = true;\n //\n // console.log(\"API Session is authenticated:\", hasAuthSession);\n // console.log(\"API Session config:\", sess);\n //\n // const {\n // // signIn,\n // // signUp,\n // // forceNewPassword,\n // // confirmResetPassword,\n // // confirmSignIn,\n // // confirmSignUp,\n // // confirmVerifyUser,\n // // forgotPassword,\n // // setupTotp,\n // // verifyUser,\n // signOut\n // } = authenticator;\n //\n // const tokens = sess.tokens!;\n //\n // console.log(\"API tokens:\", tokens);\n //\n // if (!!tokens.idToken && !hasAuthClient) {\n //\n // hasAuthClient = true;\n //\n // // const autoSignOut = () => {\n // // signOut();\n // // window.alert(\"Please refresh this session by clicking the browser's reload button!\");\n // // (window as any).location = window.location.protocol + \"//\" + window.location.host + window.location.pathname;\n // // };\n //\n // try {\n //\n // apiClient.interceptors.request.use(\n // (config) => {\n // const accessToken = tokens.idToken!.toString();\n // if (!!accessToken) {\n // config.headers.Authorization = `Bearer ${accessToken}`;\n // }\n // if (!!props.baseURL) {\n // config.baseURL = props.baseURL;\n // }\n // return config;\n // },\n // (error) => Promise.reject(error)\n // );\n //\n // setState({\n // apiClient: apiClient,\n // authenticated: true,\n // // authenticated_user: authenticated_user,\n // // autoSignOut: autoSignOut,\n // baseURL: props.baseURL || BASE_URL,\n // token: tokens.idToken,\n // data: {},\n // setData\n // });\n //\n // // TODO: Use autoSignOut to prompt user to refresh session on API error\n // // const remoteAPIStartTime = performance.now();\n // // apiClient.get(...)\n // // .then(response => ...)\n // // .catch(error => {\n // // const remoteAPIEndTime = performance.now();\n // //\n // // (window as any)[\"remoteAPIExecutionTime\"] = remoteAPIEndTime - remoteAPIStartTime;\n // // console.debug(`Remote API Call Execution took ${(window as any)[\"remoteAPIExecutionTime\"]} ms`);\n // //\n // // if (error.hasOwnProperty(\"code\")) {\n // // console.log(\"Error code:\", error.code!);\n // // if (error.code! === \"ERR_BAD_REQUEST\"\n // // || error.code! === \"ERR_NETWORK\"\n // // ) {\n // // autoSignOut();\n // //\n // // } else if (error.code === 'ERR_NAME_NOT_RESOLVED') {\n // // console.error('Invalid baseURL:', apiClient.defaults.baseURL);\n // // // Handle invalid baseURL error\n // // }\n // // } else {\n // // console.log(error.toString());\n // // }\n // // });\n //\n // } catch (e: any) {\n // console.log(\"Axios Error:\", e);\n // }\n //\n // user.then((u) => {\n // if (!hasAuthUser) {\n //\n // // console.log(\"Initial userState:\", userState);\n // // console.log(\"user type:\", u.constructor.name);\n //\n // hasAuthUser = true;\n //\n // console.log(\"API User is authenticated:\", hasAuthSession);\n // console.log(\"API User:\", u);\n //\n // // function updateUser (u: User) {\n // // try {\n // // if (!!u.userId) {\n // // console.log(\"Update userId:\", u.userId);\n // // dispatch(updateUserId(u.userId));\n // // }\n // // if (!!u.userId && !!u.username) {\n // // console.log(\"Update username:\", u.username);\n // // dispatch(updateUserName(u.username));\n // // }\n // //\n // // if (!!tokens.idToken) {\n // // console.log(\"Update user tokens:\", tokens);\n // // dispatch(updateUserTokens(JSON.stringify(tokens)));\n // // }\n // //\n // // } catch (e: any) {\n // // console.error(e);\n // // }\n // //\n // // // setState({\n // // // apiClient: (!!hasAuthClient) ? apiClient : axios.create({\n // // // baseURL: props.baseURL || BASE_URL,\n // // // headers: {\n // // // 'Content-Type': 'application/json',\n // // // 'Authorization': `Bearer ${accessToken}`,\n // // // },\n // // // }),\n // // // authenticated: true,\n // // // authenticated_user: u,\n // // // baseURL: props.baseURL || BASE_URL,\n // // // autoSignOut: signOut,\n // // // token: tokens.idToken,\n // // // data: {\n // // // ...state.data,\n // // // }\n // // // });\n // //\n // // setAuthenticatedUser(u);\n // // }\n //\n // // updateUser(u);\n // }\n // });\n // }\n // }\n // })\n // .catch((e: any) => {\n // console.log(\"API Session ERROR:\", e);\n // });\n //\n // } else {\n\n apiClient.interceptors.request.use(\n (config) => {\n if (!!props.baseURL) {\n config.baseURL = props.baseURL;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n setState({\n apiClient: apiClient,\n authenticated: false,\n // authenticated_user: authenticated_user,\n // autoSignOut: autoSignOut,\n baseURL: props.baseURL || BASE_URL,\n token: null,\n data: {},\n setData\n });\n // }\n\n }, []);\n\n return (<>\n \n {/**/}\n {props.children}\n {/**/}\n \n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAyBA,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AACzC;AACA;AACA;AACA;AACA;AACA;AAEA,MAAM,SAAS,GAAkB,KAAK,CAAC,MAAM,CAAC;AAC1C,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,OAAO,EAAE;AACL,QAAA,cAAc,EAAE,kBAAkB;AACrC,KAAA;AACJ,CAAA,CAAC,CAAC;AAaH,MAAM,SAAS,GAAmB;AAC9B,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,aAAa,EAAE,KAAK;;;AAGpB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,OAAO,EAAE,IAAI;CAChB,CAAC;MAEW,UAAU,GAAG,aAAa,CAAwB,SAAS,EAAE;AAE1E;AACA;AACA;AAEwB,SAAA,kBAAkB,CAAE,KAAoE,EAAA;;;;;;IAS5G,MAAM,CAAE,KAAK,EAAE,QAAQ,CAAE,GAAG,QAAQ,CAAwB,SAAS,CAAC,CAAC;IAEvE,SAAS,OAAO,CAAC,OAAY,EAAA;QACzB,MAAM,YAAY,GAAoB,KAAM,CAAC;AAC7C,QAAA,QAAQ,CACD,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,YAAY,CACf,EAAA,EAAA,IAAI,kCACG,YAAY,CAAC,IAAI,CAAA,EACjB,OAAO,CAEd,EAAA,OAAO,EAAE,OAAO,IAClB,CAAC;KACN;IAED,SAAS,CAAC,MAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6KP,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC9B,CAAC,MAAM,KAAI;AACP,YAAA,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE;AACjB,gBAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;aAClC;AACD,YAAA,OAAO,MAAM,CAAC;AAClB,SAAC,EACD,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACnC,CAAC;AAEF,QAAA,QAAQ,CAAC;AACL,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,KAAK;;;AAGpB,YAAA,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ;AAClC,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,IAAI,EAAE,EAAE;YACR,OAAO;AACV,SAAA,CAAC,CAAC;;KAGV,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,QAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACJ,QAAA,KAAA,CAAA,aAAA,CAAC,UAAU,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAExB,EAAA,KAAK,CAAC,QAAQ,CAED,CACvB,EAAE;AACT;;;;"} \ No newline at end of file diff --git a/lib/@cori-risi/cotexts/AmplifyContextProvider.tsx b/lib/@cori-risi/cotexts/AmplifyContextProvider.tsx index ddcced49..b8ee414a 100644 --- a/lib/@cori-risi/cotexts/AmplifyContextProvider.tsx +++ b/lib/@cori-risi/cotexts/AmplifyContextProvider.tsx @@ -4,18 +4,36 @@ import React, { useEffect, useState } from "react"; -import { Amplify } from "aws-amplify"; +import {Amplify, ResourcesConfig} from "aws-amplify"; import amplifyconfig from './amplifyconfiguration.json'; +import { AuthTokens, JWT } from "@aws-amplify/auth"; +import { User } from "../models"; Amplify.configure(amplifyconfig); +type AWSCredentials = { + accessKeyId: string; + secretAccessKey: string; + sessionToken?: string; + expiration?: Date; +}; + +type AuthSession = { + tokens?: AuthTokens; + credentials?: AWSCredentials; + identityId?: string; + userSub?: string; +}; + + type AmplifyContextType = { domain?: string, region?: string, identityPoolId?: string, userPoolId?: string, userPoolClientId?: string, + token: JWT | null; }; const initAmplifyContext: AmplifyContextType = { @@ -24,18 +42,25 @@ const initAmplifyContext: AmplifyContextType = { identityPoolId: undefined, userPoolId: undefined, userPoolClientId: undefined, + token: null }; export const AmplifyContext = createContext(initAmplifyContext); +let hasAuthSession = false; +let hasAuthUser = false; +let hasAuthClient = false; + export default function AmplifyContextProvider(props: { children?: ReactElement, domain?: string, region?: string, + identityPoolId?: string, userPoolId?: string, userPoolClientId?: string, - identityPoolId?: string, - + fetchAuthSession: Function, + getCurrentUser: Function, + signOut?: Function }) { const [ state, setState ] = useState(initAmplifyContext); @@ -53,9 +78,47 @@ export default function AmplifyContextProvider(props: { region, identityPoolId, userPoolId, - userPoolClientId + userPoolClientId, + fetchAuthSession, + getCurrentUser, + signOut } = props; + // Ex. Auth data structure: + // Auth: { + // Cognito: { + // userPoolClientId: "5eusi16g0o2q1g1rr5ehgudodm", + // userPoolId: "us-east-1_QeA4600FA", + // userPoolEndpoint: "authcori.auth.us-east-1.amazoncognito.com", + // identityPoolId: "us-east-1:2194a76a-fa3d-4c33-999e-e3c4b2b049ee", + // loginWith: { // Optional + // oauth: { + // domain: 'authcori.auth.us-east-1.amazoncognito.com', + // scopes: ['email', 'openid', 'profile'], + // redirectSignIn: ["http://localhost:3000", "http://localhost:5173", "http://localhost:5174"], + // redirectSignOut: ["http://localhost:3000/", "http://localhost:5173/", "http://localhost:5174/"], + // responseType: 'code', + // }, + // username: true, + // email: true, // Optional + // phone: false, // Optional + // + // }, + // // signUpVerificationMethod: "", + // // userAttributes: "", + // // mfa: "", + // // passwordFormat: "", + // }, + // region: config.region, + // oauth: { + // scope: ['email', 'openid', 'profile'], + // redirectSignIn: '', + // redirectSignOut: '', + // responseType: 'code', + // mandatorySignIn: true, + // }, + // }, + const aws_original_auth_config = { "Auth": { "domain": domain, @@ -80,7 +143,7 @@ export default function AmplifyContextProvider(props: { } }; - Amplify.configure({ + Amplify.configure(({ // TODO: Why is this so ridiculous and how can these options be // specified exclusively in amplifyconfiguration.json ??? ...Amplify.getConfig(), @@ -110,14 +173,43 @@ export default function AmplifyContextProvider(props: { userPoolClientId: aws_original_auth_config.Auth.clientId } } - }); + }) as ResourcesConfig); + + const session: Promise = fetchAuthSession(); + const user: Promise = getCurrentUser(); + + session + .then((sess) => { + + if (!hasAuthSession) { + + hasAuthSession = true; + + console.log("API Session is authenticated:", hasAuthSession); + console.log("API Session config:", sess); + + const tokens = sess.tokens!; + + console.log("API tokens:", tokens); + + setState({ + domain, + region, + identityPoolId, + userPoolId, + userPoolClientId, + token: tokens.idToken! + }); + } + }); setState({ domain, region, identityPoolId, userPoolId, - userPoolClientId + userPoolClientId, + token: null }); } diff --git a/lib/@cori-risi/cotexts/ApiContextProvider.tsx b/lib/@cori-risi/cotexts/ApiContextProvider.tsx index 66f8277e..41e4c0ff 100644 --- a/lib/@cori-risi/cotexts/ApiContextProvider.tsx +++ b/lib/@cori-risi/cotexts/ApiContextProvider.tsx @@ -1,7 +1,7 @@ import React, { createContext, ReactElement, - useContext, + // useContext, useEffect, useState } from "react"; @@ -18,6 +18,7 @@ import { fetchAuthSession, JWT } from "@aws-amplify/auth"; // } from "../features"; // import { User } from '../models'; +// TODO: (maybe?) move the token retrieval code & state prop to AmplifyContextProvider // import { AmplifyContext } from "./AmplifyContextProvider"; import "./styles/ApiContextProvider.css"; @@ -65,7 +66,7 @@ export const ApiContext = createContext(initState); // let hasAuthUser = false; // let hasAuthClient = false; -export default function ApiContextProvider (props: { children?: ReactElement, baseURL?: string }) { +export default function ApiContextProvider (props: { children?: ReactElement, baseURL?: string, token?: string }) { // const amplifyContext = useContext(AmplifyContext); // const authenticator = useAuthenticator(); diff --git a/rollup.config.js b/rollup.config.js index bf801412..3f050d87 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -47,7 +47,11 @@ import typescript from "rollup-plugin-typescript2"; // } export default [{ - external: [ "arquero", "axios", "aws-amplify", "d3", "d3-textwrap", "html-to-image", "react", "react-dom", "react-map-gl" ], + external: [ + "arquero", "axios", "aws-amplify", + "d3", "d3-textwrap", "html-to-image", + "fetchAuthSession", "getCurrentUser", + "react", "react-dom", "react-map-gl" ], input: "./lib/cori.data.api.ts", output: [ { @@ -71,7 +75,9 @@ export default [{ json(), peerDepsExternal(), // nodeResolve({ extensions: [".js", ".jsx"] }), - nodeResolve(), + nodeResolve({ + "preferBuiltins": false + }), commonjs(), postcss({ // extract: "styles.css",