Skip to content

Commit 6635ae7

Browse files
committed
fix: PR fixes
1 parent 549e27b commit 6635ae7

File tree

9 files changed

+178
-6
lines changed

9 files changed

+178
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { default as withTokenSetup } from './withTokenSetup'
22
export { default as withProviders } from './withProviders'
3+
export { default as withMutationResolver } from './withMutationResolver'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React, { useEffect } from 'react'
2+
3+
import { createTestEnvironment } from '@baseapp-frontend/graphql'
4+
5+
import type { StoryContext, StoryFn } from '@storybook/react'
6+
import { Observable, OperationDescriptor } from 'relay-runtime'
7+
import { MockPayloadGenerator } from 'relay-test-utils'
8+
import { MockResolvers } from 'relay-test-utils/lib/RelayMockPayloadGenerator'
9+
10+
export type DynamicMockResolvers = (operation: OperationDescriptor) => MockResolvers
11+
12+
const withMutationResolver = (Story: StoryFn, context: StoryContext) => {
13+
const { environment, queueOperationResolver } = context.parameters
14+
.relayMockEnvironment as ReturnType<typeof createTestEnvironment>
15+
16+
const mockResolvers = context.parameters.mockResolvers || undefined
17+
const dynamicMockResolvers: DynamicMockResolvers =
18+
context.parameters.dynamicMockResolvers || undefined
19+
const mutationError: string = context.parameters.mutationError || undefined
20+
21+
useEffect(() => {
22+
const originalExecuteMutation = environment.executeMutation
23+
24+
environment.executeMutation = (request) => {
25+
if (!mutationError) {
26+
if (dynamicMockResolvers) {
27+
environment.mock.queueOperationResolver(() => {
28+
return MockPayloadGenerator.generate(
29+
request.operation,
30+
dynamicMockResolvers(request.operation),
31+
)
32+
})
33+
} else if (mockResolvers) {
34+
environment.mock.queueOperationResolver(() => {
35+
return MockPayloadGenerator.generate(request.operation, mockResolvers)
36+
})
37+
}
38+
}
39+
40+
const observable = originalExecuteMutation.call(environment, request)
41+
42+
return Observable.create((sink) => {
43+
if (mutationError) {
44+
setTimeout(() => {
45+
sink.error(new Error(mutationError))
46+
}, 100)
47+
} else {
48+
observable.subscribe({
49+
complete: () => {
50+
setTimeout(() => {
51+
sink.complete()
52+
}, 100)
53+
},
54+
})
55+
}
56+
})
57+
}
58+
59+
return () => {
60+
environment.executeMutation = originalExecuteMutation
61+
}
62+
}, [environment, queueOperationResolver])
63+
64+
return <Story />
65+
}
66+
67+
export default withMutationResolver
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { graphql } from 'react-relay'
2+
3+
export const ProfileSettingsRelayTest = graphql`
4+
query ProfileSettingsRelayTestQuery @relay_test_operation {
5+
profile: node(id: "test-id") {
6+
...ProfileComponentFragment
7+
}
8+
}
9+
`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { useLazyLoadQuery } from 'react-relay'
2+
3+
import { ProfileSettingsRelayTestQuery as QueryType } from '../../../../../__generated__/ProfileSettingsRelayTestQuery.graphql'
4+
import { ProfileSettingsRelayTest } from '../../../common/graphql/queries/ProfileSettingsRelayTest'
5+
import ProfileSettingsComponent from '../index'
6+
import { ProfileSettingsComponentProps } from '../types'
7+
8+
const ProfileSettingsComponentWithQuery = (props: ProfileSettingsComponentProps) => {
9+
const profileRef = useLazyLoadQuery<QueryType>(ProfileSettingsRelayTest, {})
10+
11+
return <ProfileSettingsComponent {...props} profile={profileRef.profile} />
12+
}
13+
14+
export default ProfileSettingsComponentWithQuery
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export const mockResolvers = {
2+
Node: () => ({
3+
__typename: 'Profile',
4+
id: '1',
5+
name: 'Profile 1',
6+
biography: 'Profile 1 biography',
7+
image: null,
8+
bannerImage: null,
9+
canChange: true,
10+
canDelete: true,
11+
urlPath: {
12+
path: '/profile/1',
13+
},
14+
owner: {
15+
phoneNumber: '1234567890',
16+
},
17+
}),
18+
Mutation: () => ({
19+
profileUpdate: {
20+
errors: null,
21+
},
22+
}),
23+
}
24+
25+
export const mockResolversWithMutationError = {
26+
...mockResolvers,
27+
Mutation: () => ({
28+
profileUpdate: {},
29+
}),
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { Meta, StoryFn, StoryObj } from '@storybook/react'
2+
3+
import { withMutationResolver } from '../../../../../.storybook/decorators'
4+
import { ProfileSettingsComponentProps } from '../types'
5+
import ProfileSettingsComponentWithQuery from './index'
6+
import { mockResolvers, mockResolversWithMutationError } from './mockResolver'
7+
8+
export default {
9+
title: '@baseapp-frontend-template / Pages/User/Settings/AccountSettings/AccountProfile',
10+
component: ProfileSettingsComponentWithQuery,
11+
decorators: [withMutationResolver],
12+
args: {
13+
profile: {},
14+
},
15+
argTypes: {
16+
profile: {
17+
description: 'Graphql reference to extract the Profile fragment.',
18+
table: {
19+
type: {
20+
summary: 'AccountProfileFragment$key | null',
21+
},
22+
},
23+
control: false,
24+
},
25+
},
26+
parameters: {
27+
layout: 'centered',
28+
},
29+
} as Meta
30+
31+
const Template: StoryFn = (args) => <ProfileSettingsComponentWithQuery {...args} />
32+
33+
type Story = StoryObj<ProfileSettingsComponentProps>
34+
35+
export const Default: Story = Template.bind({})
36+
Default.storyName = 'AccountProfile'
37+
Default.parameters = {
38+
mockResolvers,
39+
}
40+
41+
export const ErrorStatus: Story = Template.bind({})
42+
ErrorStatus.storyName = 'AccountProfile with Error'
43+
ErrorStatus.parameters = {
44+
mockResolvers: mockResolversWithMutationError,
45+
}

packages/components/modules/profiles/web/profile-popover/CurrentProfile/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const CurrentProfile: FC = () => {
2626

2727
{profile?.urlPath && (
2828
<Typography variant="body2" sx={{ color: 'text.secondary' }} noWrap>
29-
{profile.urlPath.replace('/', '')}
29+
{profile?.urlPath?.replace('/', '')}
3030
</Typography>
3131
)}
3232
</Box>

packages/design-system/components/web/inputs/PhoneNumberField/CountrySelect/index.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import { FC } from 'react'
22

33
import { MenuItem, Typography } from '@mui/material'
4-
import { CountryIso2, FlagImage, defaultCountries, parseCountry } from 'react-international-phone'
4+
import {
5+
CountryData,
6+
CountryIso2,
7+
FlagImage,
8+
defaultCountries,
9+
parseCountry,
10+
} from 'react-international-phone'
511

612
import { CountrySelectProps } from '../types'
7-
import { ContryTitle, Select as StyledSelect } from './styled'
13+
import { CountryTitle, Select as StyledSelect } from './styled'
814

915
export const CountrySelect: FC<CountrySelectProps> = ({
1016
country,
@@ -33,12 +39,12 @@ export const CountrySelect: FC<CountrySelectProps> = ({
3339
onChange={(event) => setCountry(event.target.value as CountryIso2)}
3440
renderValue={(value) => <FlagImage iso2={value as CountryIso2} />}
3541
>
36-
{defaultCountries.map((c: any) => {
42+
{defaultCountries.map((c: CountryData) => {
3743
const defaultCountry = parseCountry(c)
3844
return (
3945
<MenuItem {...optionProps} key={defaultCountry.iso2} value={defaultCountry.iso2}>
4046
<FlagImage iso2={defaultCountry.iso2} />
41-
<ContryTitle {...countryNameProps}>{defaultCountry.name}</ContryTitle>
47+
<CountryTitle {...countryNameProps}>{defaultCountry.name}</CountryTitle>
4248
<Typography {...countryDialCodeProps}>+{defaultCountry.dialCode}</Typography>
4349
</MenuItem>
4450
)

packages/design-system/components/web/inputs/PhoneNumberField/CountrySelect/styled.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const Select = styled((props) => <MUISelect {...props} />)<SelectProps>((
2323
},
2424
}))
2525

26-
export const ContryTitle = styled((props) => <Typography {...props} />)<TypographyProps>(
26+
export const CountryTitle = styled((props) => <Typography {...props} />)<TypographyProps>(
2727
({ theme }) => ({
2828
margin: theme.spacing(0, 1),
2929
}),

0 commit comments

Comments
 (0)