Skip to content
Merged
55 changes: 50 additions & 5 deletions apps/demo-app/.env-cmdrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,46 +6,91 @@
"REACT_APP_ENVIRONMENT": "local",
"REACT_APP_LIVE_CONFIG_ID": "demo-app-development",
"REACT_APP_USE_LOCAL_CONFIG": "true",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",

"REACT_APP_AUTH_AUDIENCE": "https://api.monk.ai/v1/",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",
"REACT_APP_AUTH_CLIENT_ID": "O7geYcPM6zEJrHw0WvQVzSIzw4WzrAtH",
"REACT_APP_API_DOMAIN": "api.preview.monk.ai/v1",
"REACT_APP_THUMBNAIL_DOMAIN": "api.preview.monk.ai/image_resize",

"REACT_APP_AUTH_DOMAIN_US": "acv-staging.us.auth0.com",
"REACT_APP_AUTH_CLIENT_ID_US": "0tIBBTLd4uP52jtF2PcXawWYxW12mUfZ",
"REACT_APP_API_DOMAIN_US": "monk-us-core-api.gateway.staging.acvauctions.com/v1",
"REACT_APP_THUMBNAIL_DOMAIN_US": "monk-us-image.gateway.staging.acvauctions.com/image_resize",

"REACT_APP_SENTRY_DSN": "https://74f50bfe6f11de7aefd54acfa5dfed96@o4505669501648896.ingest.us.sentry.io/4506863461662720",
"REACT_APP_SENTRY_DEBUG": "true",
"REACT_APP_INSPECTION_REPORT_URL": "https://demo-capture.preview.monk.ai"
},
"development": {
"REACT_APP_ENVIRONMENT": "development",
"REACT_APP_LIVE_CONFIG_ID": "demo-app-development",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",

"REACT_APP_AUTH_AUDIENCE": "https://api.monk.ai/v1/",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",
"REACT_APP_AUTH_CLIENT_ID": "O7geYcPM6zEJrHw0WvQVzSIzw4WzrAtH",
"REACT_APP_API_DOMAIN": "api.preview.monk.ai/v1",
"REACT_APP_THUMBNAIL_DOMAIN": "api.preview.monk.ai/image_resize",

"REACT_APP_AUTH_DOMAIN_US": "acv-staging.us.auth0.com",
"REACT_APP_AUTH_CLIENT_ID_US": "0tIBBTLd4uP52jtF2PcXawWYxW12mUfZ",
"REACT_APP_API_DOMAIN_US": "monk-us-core-api.gateway.staging.acvauctions.com/v1",
"REACT_APP_THUMBNAIL_DOMAIN_US": "monk-us-image.gateway.staging.acvauctions.com/image_resize",

"REACT_APP_SENTRY_DSN": "https://74f50bfe6f11de7aefd54acfa5dfed96@o4505669501648896.ingest.us.sentry.io/4506863461662720",
"REACT_APP_INSPECTION_REPORT_URL": "https://demo-capture.preview.monk.ai"
},
"staging": {
"REACT_APP_ENVIRONMENT": "staging",
"REACT_APP_LIVE_CONFIG_ID": "demo-app-staging",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",

"REACT_APP_AUTH_AUDIENCE": "https://api.monk.ai/v1/",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",
"REACT_APP_AUTH_CLIENT_ID": "O7geYcPM6zEJrHw0WvQVzSIzw4WzrAtH",
"REACT_APP_API_DOMAIN": "api.preview.monk.ai/v1",
"REACT_APP_THUMBNAIL_DOMAIN": "api.preview.monk.ai/image_resize",

"REACT_APP_AUTH_DOMAIN_US": "acv-staging.us.auth0.com",
"REACT_APP_AUTH_CLIENT_ID_US": "0tIBBTLd4uP52jtF2PcXawWYxW12mUfZ",
"REACT_APP_API_DOMAIN_US": "monk-us-core-api.gateway.staging.acvauctions.com/v1",
"REACT_APP_THUMBNAIL_DOMAIN_US": "monk-us-image.gateway.staging.acvauctions.com/image_resize",

"REACT_APP_SENTRY_DSN": "https://74f50bfe6f11de7aefd54acfa5dfed96@o4505669501648896.ingest.us.sentry.io/4506863461662720",
"REACT_APP_INSPECTION_REPORT_URL": "https://demo-capture.preview.monk.ai"
},
"preview": {
"REACT_APP_ENVIRONMENT": "preview",
"REACT_APP_LIVE_CONFIG_ID": "demo-app-preview",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",

"REACT_APP_AUTH_AUDIENCE": "https://api.monk.ai/v1/",
"REACT_APP_AUTH_DOMAIN": "idp.preview.monk.ai",
"REACT_APP_AUTH_CLIENT_ID": "O7geYcPM6zEJrHw0WvQVzSIzw4WzrAtH",
"REACT_APP_API_DOMAIN": "api.preview.monk.ai/v1",
"REACT_APP_THUMBNAIL_DOMAIN": "api.preview.monk.ai/image_resize",

"REACT_APP_AUTH_DOMAIN_US": "acv-staging.us.auth0.com",
"REACT_APP_AUTH_CLIENT_ID_US": "0tIBBTLd4uP52jtF2PcXawWYxW12mUfZ",
"REACT_APP_API_DOMAIN_US": "monk-us-core-api.gateway.staging.acvauctions.com/v1",
"REACT_APP_THUMBNAIL_DOMAIN_US": "monk-us-image.gateway.staging.acvauctions.com/image_resize",

"REACT_APP_SENTRY_DSN": "https://74f50bfe6f11de7aefd54acfa5dfed96@o4505669501648896.ingest.us.sentry.io/4506863461662720",
"REACT_APP_INSPECTION_REPORT_URL": "https://demo-capture.preview.monk.ai"
},
"backend-staging-qa": {
"REACT_APP_ENVIRONMENT": "backend-staging-qa",
"REACT_APP_LIVE_CONFIG_ID": "demo-app-backend-staging-qa",
"REACT_APP_AUTH_DOMAIN": "idp.staging.monk.ai",

"REACT_APP_AUTH_AUDIENCE": "https://api.monk.ai/v1/",
"REACT_APP_AUTH_DOMAIN": "idp.staging.monk.ai",
"REACT_APP_AUTH_CLIENT_ID": "DAeZWqeeOfgItYBcQzFeFwSrlvmUdN7L",
"REACT_APP_API_DOMAIN": "api.preview.monk.ai/v1",
"REACT_APP_THUMBNAIL_DOMAIN": "api.staging.dev.monk.ai/image_resize",

"REACT_APP_AUTH_DOMAIN_US": "acv-staging.us.auth0.com",
"REACT_APP_AUTH_CLIENT_ID_US": "0tIBBTLd4uP52jtF2PcXawWYxW12mUfZ",
"REACT_APP_API_DOMAIN_US": "monk-us-core-api.gateway.staging.acvauctions.com/v1",
"REACT_APP_THUMBNAIL_DOMAIN_US": "monk-us-image.gateway.staging.acvauctions.com/image_resize",

"REACT_APP_SENTRY_DSN": "https://74f50bfe6f11de7aefd54acfa5dfed96@o4505669501648896.ingest.us.sentry.io/4506863461662720",
"REACT_APP_INSPECTION_REPORT_URL": "https://demo-capture.staging.monk.ai"
}
Expand Down
26 changes: 26 additions & 0 deletions apps/demo-app/src/auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { AuthorizationParams } from '@auth0/auth0-react';
import { getEnvOrThrow } from '@monkvision/common';
import { AuthConfig } from '@monkvision/network';

export const AUTHORIZATION_PARAMS: AuthorizationParams = {
redirect_uri: window.location.origin,
audience: getEnvOrThrow('REACT_APP_AUTH_AUDIENCE'),
prompt: 'login',
};

export const authConfigs: AuthConfig[] = [
{
domain: getEnvOrThrow('REACT_APP_AUTH_DOMAIN'),
clientId: getEnvOrThrow('REACT_APP_AUTH_CLIENT_ID'),
apiDomain: getEnvOrThrow('REACT_APP_API_DOMAIN'),
thumbnailDomain: getEnvOrThrow('REACT_APP_THUMBNAIL_DOMAIN'),
authorizationParams: AUTHORIZATION_PARAMS,
},
{
domain: getEnvOrThrow('REACT_APP_AUTH_DOMAIN_US'),
clientId: getEnvOrThrow('REACT_APP_AUTH_CLIENT_ID_US'),
apiDomain: getEnvOrThrow('REACT_APP_API_DOMAIN_US'),
thumbnailDomain: getEnvOrThrow('REACT_APP_THUMBNAIL_DOMAIN_US'),
authorizationParams: AUTHORIZATION_PARAMS,
},
];
4 changes: 4 additions & 0 deletions apps/demo-app/src/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ import { getEnvOrThrow, MonkProvider } from '@monkvision/common';
import { useTranslation } from 'react-i18next';
import { LiveConfigAppProvider } from '@monkvision/common-ui-web';
import { LiveConfig } from '@monkvision/types';
import { getAuthConfig } from '@monkvision/network';
import { Page } from '../pages';
import * as config from '../local-config.json';
import { AppContainer } from './AppContainer';
import { authConfigs } from '../auth';

const localConfig =
process.env['REACT_APP_USE_LOCAL_CONFIG'] === 'true'
Expand All @@ -20,6 +22,8 @@ export function App() {
<LiveConfigAppProvider
id={getEnvOrThrow('REACT_APP_LIVE_CONFIG_ID')}
localConfig={localConfig}
apiDomain={getAuthConfig(authConfigs)?.apiDomain}
thumbnailDomain={getAuthConfig(authConfigs)?.thumbnailDomain}
onFetchAuthToken={() => navigate(Page.CREATE_INSPECTION)}
onFetchLanguage={(lang) => i18n.changeLanguage(lang)}
lang={i18n.language}
Expand Down
16 changes: 4 additions & 12 deletions apps/demo-app/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,20 @@
import ReactDOM from 'react-dom';
import { MonitoringProvider } from '@monkvision/monitoring';
import { AnalyticsProvider } from '@monkvision/analytics';
import { Auth0Provider } from '@auth0/auth0-react';
import { getEnvOrThrow } from '@monkvision/common';
import { AuthProvider } from '@monkvision/network';
import { sentryMonitoringAdapter } from './sentry';
import { posthogAnalyticsAdapter } from './posthog';
import { AppRouter } from './components';
import { authConfigs } from './auth';
import './index.css';
import './i18n';

ReactDOM.render(
<MonitoringProvider adapter={sentryMonitoringAdapter}>
<AnalyticsProvider adapter={posthogAnalyticsAdapter}>
<Auth0Provider
domain={getEnvOrThrow('REACT_APP_AUTH_DOMAIN')}
clientId={getEnvOrThrow('REACT_APP_AUTH_CLIENT_ID')}
authorizationParams={{
redirect_uri: window.location.origin,
audience: getEnvOrThrow('REACT_APP_AUTH_AUDIENCE'),
prompt: 'login',
}}
>
<AuthProvider configs={authConfigs}>
<AppRouter />
</Auth0Provider>
</AuthProvider>
</AnalyticsProvider>
</MonitoringProvider>,
document.getElementById('root'),
Expand Down
2 changes: 0 additions & 2 deletions apps/demo-app/src/local-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
"createInspectionOptions": {
"tasks": ["damage_detection", "wheel_analysis"]
},
"apiDomain": "api.preview.monk.ai/v1",
"thumbnailDomain": "api.preview.monk.ai/image_resize",
"enableTutorial": "first_time_only",
"enableSightTutorial": "modern",
"startTasksOnComplete": true,
Expand Down
8 changes: 0 additions & 8 deletions configs/test-utils/src/__mocks__/@auth0/auth0-react.ts

This file was deleted.

14 changes: 14 additions & 0 deletions configs/test-utils/src/__mocks__/@auth0/auth0-react.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const mockAuth0Provider = ({ children, ...props }: any) => {
(global as any).__auth0ProviderLastProps = props;
return <>{children}</>;
};

export = {
/* Actual exports */
/* Mocks */
useAuth0: jest.fn(() => ({
getAccessTokenWithPopup: jest.fn(() => Promise.resolve('')),
logout: jest.fn(),
})),
Auth0Provider: mockAuth0Provider,
};
3 changes: 3 additions & 0 deletions configs/test-utils/src/__mocks__/@monkvision/common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const {
email,
getVehicleModel,
getAspectRatio,
MonkSearchParam,
} = jest.requireActual('@monkvision/common');

export = {
Expand Down Expand Up @@ -71,6 +72,7 @@ export = {
email,
getVehicleModel,
getAspectRatio,
MonkSearchParam,

/* Mocks */
useMonkTheme: jest.fn(() => createTheme()),
Expand Down Expand Up @@ -148,4 +150,5 @@ export = {
requestCompassPermission: jest.fn(() => Promise.resolve()),
})),
useSafeTimeout: jest.fn(() => jest.fn()),
useMonkSearchParams: jest.fn(() => ({ get: jest.fn(() => null) })),
};
2 changes: 2 additions & 0 deletions configs/test-utils/src/__mocks__/@monkvision/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ export = {
decodeMonkJwt: jest.fn((str) => str),
isUserAuthorized: jest.fn(() => true),
isTokenExpired: jest.fn(() => false),
isTokenValid: jest.fn(() => true),
getAuthConfig: jest.fn(),
useAuth: jest.fn(() => ({
authToken: null,
login: jest.fn(() => Promise.resolve('')),
Expand Down
56 changes: 35 additions & 21 deletions documentation/src/utils/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
MileageUnit,
MonkApiPermission,
PhotoCaptureSightGuidelinesOption,
PhotoCaptureSightTutorialOption,
PhotoCaptureTutorialOption,
SteeringWheelPosition,
TaskName,
Expand Down Expand Up @@ -269,44 +270,57 @@ export const CreateInspectionDiscriminatedUnionSchema = z.discriminatedUnion(

const domainsByEnv = {
staging: {
api: 'api.staging.monk.ai/v1',
thumbnail: 'api.staging.monk.ai/image_resize',
api: ['api.staging.monk.ai/v1', 'monk-us-core-api.gateway.dev.acvauctions.com/v1'],
thumbnail: [
'api.staging.monk.ai/image_resize',
'monk-us-image.gateway.dev.acvauctions.com/image_resize',
],
},
preview: {
api: 'api.preview.monk.ai/v1',
thumbnail: 'api.preview.monk.ai/image_resize',
api: ['api.preview.monk.ai/v1', 'monk-us-core-api.gateway.staging.acvauctions.com/v1'],
thumbnail: [
'api.preview.monk.ai/image_resize',
'monk-us-image.gateway.staging.acvauctions.com/image_resize',
],
},
production: {
api: 'api.monk.ai/v1',
thumbnail: 'api.monk.ai/image_resize',
api: ['api.monk.ai/v1', 'monk-us-core-api.gateway.acvauctions.com/v1'],
thumbnail: ['api.monk.ai/image_resize', 'monk-us-image.gateway.acvauctions.com/image_resize'],
},
};

const apiDomains = Object.values(domainsByEnv).map((env) => env.api) as [string, ...string[]];
const thumbnailDomains = Object.values(domainsByEnv).map((env) => env.thumbnail) as [
const apiDomains = [...new Set(Object.values(domainsByEnv).flatMap((env) => env.api))] as [
string,
...string[],
];
const thumbnailDomains = [
...new Set(Object.values(domainsByEnv).flatMap((env) => env.thumbnail)),
] as [string, ...string[]];

export const DomainsSchema = z
.object({
apiDomain: z.enum(apiDomains),
thumbnailDomain: z.enum(thumbnailDomains),
apiDomain: z.enum(apiDomains).optional(),
thumbnailDomain: z.enum(thumbnailDomains).optional(),
})
.refine(
(data) => {
const apiEnv = Object.values(domainsByEnv).find((env) => env.api === data.apiDomain);
const thumbnailEnv = Object.values(domainsByEnv).find(
(env) => env.thumbnail === data.thumbnailDomain,
const { apiDomain, thumbnailDomain } = data;

if (!apiDomain || !thumbnailDomain) {
return true;
}

const apiEnv = Object.values(domainsByEnv).find((env) => env.api.includes(apiDomain));
const thumbnailEnv = Object.values(domainsByEnv).find((env) =>
env.thumbnail.includes(thumbnailDomain),
);
return !!apiEnv && apiEnv === thumbnailEnv;

return Boolean(apiEnv && thumbnailEnv && apiEnv === thumbnailEnv);
},
(data) => ({
message: `The selected thumbnailDomain must correspond to the selected apiDomain. Please use the corresponding thumbnailDomain: ${
thumbnailDomains[apiDomains.indexOf(data.apiDomain)]
}`,
{
message: 'The selected thumbnailDomain must correspond to the selected apiDomain.',
path: ['thumbnailDomain'],
}),
},
);

export const LiveConfigSchema = z
Expand All @@ -329,8 +343,8 @@ export const LiveConfigSchema = z
sightGuidelines: z.array(SightGuidelineSchema).optional(),
enableTutorial: z.nativeEnum(PhotoCaptureTutorialOption).optional(),
allowSkipTutorial: z.boolean().optional(),
enableSightTutorial: z.boolean().optional(),
sightTutorial: z.array(SightGuidelineSchema).optional(),
enableSightTutorial: z.nativeEnum(PhotoCaptureSightTutorialOption).optional(),
sightTutorial: z.array(SightTutorialSchema).optional(),
defaultVehicleType: z.nativeEnum(VehicleType),
allowManualLogin: z.boolean(),
allowVehicleTypeSelection: z.boolean(),
Expand Down
Loading