Skip to main content
Glama
ChooseScopeForm.tsx3.73 kB
// SPDX-FileCopyrightText: Copyright Orangebot, Inc. and Medplum contributors // SPDX-License-Identifier: Apache-2.0 import { Checkbox, Flex, Group, Stack, Title } from '@mantine/core'; import type { LoginAuthenticationResponse } from '@medplum/core'; import { useMedplum } from '@medplum/react-hooks'; import type { JSX } from 'react'; import { Fragment } from 'react/jsx-runtime'; import { Form } from '../Form/Form'; import { SubmitButton } from '../Form/SubmitButton'; import { Logo } from '../Logo/Logo'; export interface ChooseScopeFormProps { readonly login: string; readonly scope: string | undefined; readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void; } const openConditionScope = /^patient\/Condition\.(?:\*|c?r?u?d?s?)$/; const encounterDiagnosis = '?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis'; const problemListItem = '?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item'; const healthConcern = '?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern'; const openObservationScope = /^patient\/Observation\.(?:\*|c?r?u?d?s?)$/; const clinicalTest = '?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category|clinical-test'; const laboratory = '?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory'; const socialHistory = '?category=http://terminology.hl7.org/CodeSystem/observation-category|social-history'; const sdoh = '?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh'; const survey = '?category=http://terminology.hl7.org/CodeSystem/observation-category|survey'; const vitalSigns = '?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs'; export function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element { const medplum = useMedplum(); return ( <Form onSubmit={(formData: Record<string, string>) => { medplum .post('auth/scope', { login: props.login, scope: Object.keys(formData).join(' '), }) .then(props.handleAuthResponse) .catch(console.log); }} > <Stack> <Flex direction="column" align="center" justify="center"> <Logo size={32} /> <Title order={3} py="lg"> Choose scope </Title> </Flex> <Stack> {(props.scope ?? 'openid').split(' ').map((scopeName: string) => { let additionalScopes: string[] | undefined; if (openConditionScope.test(scopeName)) { additionalScopes = [ scopeName + encounterDiagnosis, scopeName + problemListItem, scopeName + healthConcern, ]; } else if (openObservationScope.test(scopeName)) { additionalScopes = [ scopeName + clinicalTest, scopeName + laboratory, scopeName + socialHistory, scopeName + sdoh, scopeName + survey, scopeName + vitalSigns, ]; } return ( <Fragment key={scopeName + '_group'}> <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked /> {additionalScopes?.map((scope) => ( <Checkbox key={scope} id={scope} name={scope} label={scope} /> ))} </Fragment> ); })} </Stack> <Group justify="flex-end" mt="xl"> <SubmitButton fullWidth>Set Scope</SubmitButton> </Group> </Stack> </Form> ); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/medplum/medplum'

If you have feedback or need assistance with the MCP directory API, please join our Discord server