diff --git a/locales/en.json b/locales/en.json index 3291349ad..18be08aa8 100644 --- a/locales/en.json +++ b/locales/en.json @@ -296,6 +296,7 @@ "connect-oura-button": "Connect Oura", "connect-oura-intro": "You can share data from your Oura account if you have one. To begin, click or tap below to log in with your Oura credentials.", "connect-to-device": "Connect to @@DEVICE@@", + "connect-to-new-provider": "Connection obsolete. Please connect to the new provider", "connected": "Connected", "core-sleep-time": "Core Sleep Time", "create-report": "Create PDF Report", @@ -390,6 +391,7 @@ "heart-rate-range": "Heart Rate Range", "heart-rate-variability": "Heart Rate Variability", "help": "Help", + "here": "here", "high-stress-time": "High Stress Time", "highest-systolic": "Highest Systolic", "hours-abbreviation": "h", diff --git a/locales/fr-CA.json b/locales/fr-CA.json index dc02a1dc3..43ad5c47c 100644 --- a/locales/fr-CA.json +++ b/locales/fr-CA.json @@ -296,6 +296,7 @@ "connect-oura-button": "Connecter Oura", "connect-oura-intro": "Vous pouvez partager les données de votre compte Oura si vous en avez un. Pour commencer, cliquez ou appuyez ci-dessous pour vous connecter avec vos identifiants Oura.", "connect-to-device": "Se connecter à @@DEVICE@@", + "connect-to-new-provider": "Connexion obsolète. Veuillez vous connecter au nouveau fournisseur", "connected": "Connecté", "core-sleep-time": "Temps de sommeil principal", "create-report": "Créer un rapport PDF", @@ -396,6 +397,7 @@ "how-severe-is": "Quelle est la gravité de votre", "how-severe-was": "Quelle était la gravité de votre", "how-to-enable": "Comment activer", + "here": "ici", "immunizations-title": "Vaccinations", "in-bed-time": "Temps au lit", "inbox-history-view-empty-text": "Vous n'avez aucun élément dans l'historique de votre boîte de réception.", diff --git a/package-lock.json b/package-lock.json index e41655bee..5bf8ea0b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,13 @@ { "name": "@careevolution/mydatahelps-ui", + "version": "3.2.1-boris-provider-successor-mdhui.2", "version": "3.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@careevolution/mydatahelps-ui", + "version": "3.2.1-boris-provider-successor-mdhui.2", "version": "3.8.0", "license": "MIT", "dependencies": { @@ -77,11 +79,26 @@ "@rollup/rollup-linux-x64-gnu": "4.6.1" }, "peerDependencies": { - "@careevolution/mydatahelps-js": "^5.0.0", + "@careevolution/mydatahelps-js": "^5.1.1", "react": "^18.2.0", "react-dom": "^18.2.0" } }, + "../MyDataHelps.js/dist/npm": { + "name": "@careevolution/mydatahelps-js", + "version": "5.1.0", + "extraneous": true, + "license": "Apache-2.0", + "devDependencies": { + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^11.1.6", + "rollup": "^4.18.0", + "rollup-plugin-import-css": "^3.5.0", + "typescript": "^5.4.5" + } + }, "node_modules/@adobe/css-tools": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", @@ -1933,9 +1950,9 @@ "license": "MIT" }, "node_modules/@careevolution/mydatahelps-js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@careevolution/mydatahelps-js/-/mydatahelps-js-5.0.0.tgz", - "integrity": "sha512-w1ThT1TCngPoDIoxJFGKltNQ45SAkRfzj+H/axdlmAoCVIMrmF/AYvkw1i82jGiOX227zNGA2R391XIk/s6iCA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@careevolution/mydatahelps-js/-/mydatahelps-js-5.1.1.tgz", + "integrity": "sha512-odLxblQEb6i10ETv4nG38WsDktS19b5C5AfweG/BFuL4Hf2g27ZDG05TMYaSv7SWrjX/zVhvQlDTv8On+Zv9PA==", "license": "Apache-2.0", "peer": true }, diff --git a/package.json b/package.json index 1ae35eef9..81be1697f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "@careevolution/mydatahelps-ui", + "version": "3.2.1-boris-provider-successor-mdhui.2", "version": "3.8.0", "description": "MyDataHelps UI Library", "main": "dist/cjs/index.js", @@ -106,7 +107,7 @@ "zod": "^3.23.8" }, "peerDependencies": { - "@careevolution/mydatahelps-js": "^5.0.0", + "@careevolution/mydatahelps-js": "^5.1.1", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/src/components/container/ExternalAccountList/ExternalAccountList.previewdata.tsx b/src/components/container/ExternalAccountList/ExternalAccountList.previewdata.tsx index a76c148e7..524f31307 100644 --- a/src/components/container/ExternalAccountList/ExternalAccountList.previewdata.tsx +++ b/src/components/container/ExternalAccountList/ExternalAccountList.previewdata.tsx @@ -12,7 +12,8 @@ export var previewExternalAccounts: ExternalAccount[] = "name": "Cedars-Sinai Health System", "category": "Provider", "logoUrl": "https://mdhorg.ce.dev/api/v1/delegated/externalaccountproviders/37/logo", - "enabled": true + "enabled": true, + "successorID": 99 } as ExternalAccountProvider }, { id: 2, @@ -21,10 +22,11 @@ export var previewExternalAccounts: ExternalAccount[] = provider: { "id": 1, - "name": "Kaiser Permanente", + "name": "CareEVolution", "category": "Provider", "logoUrl": "https://mdhorg.ce.dev/api/v1/delegated/externalaccountproviders/1/logo", - "enabled": true + "enabled": true, + "successorID": 1 } as ExternalAccountProvider }, { id: 3, diff --git a/src/components/container/ExternalAccountList/ExternalAccountList.tsx b/src/components/container/ExternalAccountList/ExternalAccountList.tsx index 07e0a63fb..830b8b15e 100644 --- a/src/components/container/ExternalAccountList/ExternalAccountList.tsx +++ b/src/components/container/ExternalAccountList/ExternalAccountList.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import MyDataHelps, { ConnectExternalAccountOptions, ExternalAccount } from '@careevolution/mydatahelps-js'; +import MyDataHelps, { ConnectExternalAccountOptions, ExternalAccount, ExternalAccountProvider } from '@careevolution/mydatahelps-js'; import { Card, LoadingIndicator, SingleExternalAccount } from '../../presentational' import { previewExternalAccounts } from './ExternalAccountList.previewdata' @@ -53,6 +53,15 @@ export default function (props: ExternalAccountListProps) { }); } + const connectToSuccessorProvider = async (provider: ExternalAccountProvider): Promise => { + if (provider.successorID) { + MyDataHelps.connectExternalAccount(provider.successorID, props.connectExternalAccountOptions ?? { openNewWindow: true }) + .then(function () { + loadExternalAccounts(); + }); + } + }; + useEffect(() => { initialize(); MyDataHelps.on("applicationDidBecomeVisible", initialize); @@ -70,7 +79,10 @@ export default function (props: ExternalAccountListProps) { onAccountRemoved(account)} - onReconnectAccount={(account: ExternalAccount) => reconnectAccount(account)} /> + onReconnectAccount={(account: ExternalAccount) => reconnectAccount(account)} + onConnectToSuccessorProvider={(provider: ExternalAccountProvider) => connectToSuccessorProvider(provider)} + externalAccountProviderIds={externalAccounts.map(a => a.provider.id)} + /> )} {loading && diff --git a/src/components/presentational/SingleExternalAccount/SingleExternalAccount.css b/src/components/presentational/SingleExternalAccount/SingleExternalAccount.css index 5323466e1..46ed621c3 100644 --- a/src/components/presentational/SingleExternalAccount/SingleExternalAccount.css +++ b/src/components/presentational/SingleExternalAccount/SingleExternalAccount.css @@ -4,6 +4,14 @@ background: var(--mdhui-background-color-0); } +.mdhui-single-external-account .provider-successor-connection-nudge { + padding: 16px; + padding-bottom: 0; + padding-top: 0; + float: right; + font-size: .88em; +} + .mdhui-single-external-account .external-account-header { position: relative; padding: 8px; diff --git a/src/components/presentational/SingleExternalAccount/SingleExternalAccount.tsx b/src/components/presentational/SingleExternalAccount/SingleExternalAccount.tsx index 6420cd641..7f5053c3f 100644 --- a/src/components/presentational/SingleExternalAccount/SingleExternalAccount.tsx +++ b/src/components/presentational/SingleExternalAccount/SingleExternalAccount.tsx @@ -1,7 +1,7 @@ import UnstyledButton from '../UnstyledButton'; import { faRefresh, faRepeat, faTrash } from '@fortawesome/free-solid-svg-icons' import React, { useState } from 'react'; -import MyDataHelps, { ExternalAccount } from '@careevolution/mydatahelps-js'; +import MyDataHelps, { ExternalAccount, ExternalAccountProvider } from '@careevolution/mydatahelps-js'; import language from '../../../helpers/language'; import "./SingleExternalAccount.css"; import { getRelativeDateString } from "../../../helpers/date-helpers"; @@ -12,10 +12,12 @@ export interface SingleExternalAccountProps { externalAccount: ExternalAccount; onAccountRemoved: (account: ExternalAccount) => void; onReconnectAccount: (account: ExternalAccount) => void; + onConnectToSuccessorProvider: (provider: ExternalAccountProvider) => void; innerRef?: React.Ref; + externalAccountProviderIds?: number[]; } -export default function SingleExternalAccount (props: SingleExternalAccountProps) { +export default function SingleExternalAccount(props: SingleExternalAccountProps) { const [statusOverride, setStatusOverride] = useState(""); function removeAccount() { @@ -52,6 +54,12 @@ export default function SingleExternalAccount (props: SingleExternalAccountProps } + {/* Show link to connect to successor provider if there is one and user doesn't already have an account with them */} + {props.externalAccount.provider.successorID && (!props.externalAccountProviderIds || !props.externalAccountProviderIds.includes(props.externalAccount.provider.successorID)) && +

+ {language('connect-to-new-provider')} { e.preventDefault(); props.onConnectToSuccessorProvider(props.externalAccount.provider); }}>{language('here')}. +

+ }
{getStatus() === "unauthorized" &&