Skip to content

Commit a8e2edf

Browse files
LexSwedMatej Lednicky
authored andcommitted
feat(DIST-41): Add response_id to onSubmit callback
1 parent 25375f8 commit a8e2edf

File tree

11 files changed

+105
-13
lines changed

11 files changed

+105
-13
lines changed

README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,27 @@ typeformEmbed.makePopup(url, options)
131131
)
132132
```
133133

134+
### `onSubmit` event
135+
136+
Callback function `onSubmit` receives `event` object with next properties:
137+
138+
| Parameter | Type | Description |
139+
| ------------- | ------ | ------------------ |
140+
| `response_id` | string | ID of the response |
141+
142+
#### Example:
143+
144+
```javascript
145+
const reference = typeformEmbed.makePopup(
146+
'https://admin.typeform.com/to/PlBzgL',
147+
{
148+
onSubmit: function (event) {
149+
console.log(event.response_id)
150+
}
151+
}
152+
)
153+
```
154+
134155
## Troubleshooting
135156

136157
### An element in my page is over the typeform

src/core/make-fullscreen.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
applyIOSIframeResizeHack,
66
replaceExistingKeys,
77
redirectToUrl,
8-
noop
8+
noop,
9+
getSubmitEventData
910
} from './utils'
1011
import onMessage from './utils/message-propagation'
1112

@@ -28,8 +29,8 @@ export default function makeFullScreen (iframe, url, options) {
2829

2930
iframe.src = appendParamsToUrl(url, replaceExistingKeys(options, queryStringKeys))
3031

31-
const onFormSubmit = () => {
32-
options.onSubmit()
32+
const onFormSubmit = (event) => {
33+
options.onSubmit(getSubmitEventData(event))
3334
}
3435

3536
ensureMetaViewport()

src/core/make-fullscreen.spec.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import CustomEvent from 'custom-event'
22

3+
import * as utils from './utils'
34
import makeFullScreen from './make-fullscreen'
45

56
describe('makeFullScreen', () => {
@@ -29,7 +30,12 @@ describe('makeFullScreen', () => {
2930
const onSubmitMock = jest.fn()
3031
makeFullScreen(iframe, URL, { onSubmit: onSubmitMock })
3132

32-
window.dispatchEvent(new CustomEvent('form-submit'))
33+
const getSubmitEventDataSpy = jest.spyOn(utils, 'getSubmitEventData')
34+
const event = new CustomEvent('form-submit')
35+
36+
window.dispatchEvent(event)
37+
38+
expect(getSubmitEventDataSpy).toHaveBeenCalledWith(event)
3339
expect(onSubmitMock).toHaveBeenCalled()
3440
})
3541
})

src/core/utils/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,7 @@ export const redirectToUrl = event => {
174174
document.body.removeChild(anchor)
175175
} catch (e) {}
176176
}
177+
178+
export const getSubmitEventData = (event) => {
179+
return { response_id: event && event.detail ? event.detail.response_id : undefined }
180+
}

src/core/utils/index.spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,15 @@ describe('Utilities', () => {
144144
expect(onMessage).not.toHaveBeenCalled()
145145
})
146146
})
147+
148+
describe('getSubmitEventData', () => {
149+
test('takes submission info from the event', () => {
150+
const detail = { response_id: 'response_id' }
151+
expect(utils.getSubmitEventData({ detail })).toEqual({ response_id: detail.response_id })
152+
})
153+
154+
test('returns undefined for empty object', () => {
155+
expect(utils.getSubmitEventData({ detail: {} })).toEqual({ response_id: undefined })
156+
})
157+
})
147158
})

src/core/views/mobile-modal.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
broadcastMessage,
1010
callIfEmbedIdMatches,
1111
redirectToUrl,
12-
updateQueryStringParameter
12+
updateQueryStringParameter,
13+
getSubmitEventData
1314
} from './../utils'
1415
import { DEFAULT_AUTOCLOSE_TIMEOUT } from './popup'
1516

@@ -116,8 +117,10 @@ class MobileModal extends Component {
116117
}
117118
}
118119

119-
handleFormSubmit () {
120-
this.props.onSubmit && this.props.onSubmit()
120+
handleFormSubmit (event) {
121+
if (this.props.onSubmit) {
122+
this.props.onSubmit(getSubmitEventData(event))
123+
}
121124
}
122125

123126
handleFormTheme (event) {

src/core/views/mobile-modal.spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import Enzyme, { shallow, mount } from 'enzyme'
44
import Adapter from 'enzyme-adapter-react-16'
55
import CustomEvent from 'custom-event'
66

7+
import * as utils from '../utils'
8+
79
import MobileModal from './mobile-modal'
810
import Iframe from './components/iframe'
911
import CloseIcon from './components/close-icon'
@@ -67,6 +69,17 @@ describe('MobileModal', () => {
6769
expect(onSubmitSpy).not.toHaveBeenCalled()
6870
})
6971

72+
it('passes event data to onSubmit callback', () => {
73+
const onSubmitSpy = jest.fn()
74+
const getSubmitEventDataSpy = jest.spyOn(utils, 'getSubmitEventData')
75+
const event = new CustomEvent('form-submit', { detail: { embedId: EMBED_ID } })
76+
77+
shallow(<MobileModal embedId={EMBED_ID} onSubmit={onSubmitSpy} url={URL} />)
78+
window.dispatchEvent(event)
79+
80+
expect(getSubmitEventDataSpy).toHaveBeenCalledWith(event)
81+
})
82+
7083
describe('prevent page below modal to scroll', () => {
7184
beforeEach(() => {
7285
document.body.classList.remove('__typeform-embed-mobile-modal-open')

src/core/views/popup.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
broadcastMessage,
1111
callIfEmbedIdMatches,
1212
redirectToUrl,
13-
updateQueryStringParameter
13+
updateQueryStringParameter,
14+
getSubmitEventData
1415
} from './../utils'
1516
import closeImg from './../../../assets/close.gif'
1617

@@ -225,8 +226,10 @@ class Popup extends Component {
225226
}
226227
}
227228

228-
handleFormSubmit () {
229-
this.props.options.onSubmit && this.props.options.onSubmit()
229+
handleFormSubmit (event) {
230+
if (this.props.options.onSubmit) {
231+
this.props.options.onSubmit(getSubmitEventData(event))
232+
}
230233
}
231234

232235
render () {

src/core/views/popup.spec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import CustomEvent from 'custom-event'
33
import Enzyme, { shallow, mount } from 'enzyme'
44
import Adapter from 'enzyme-adapter-react-16'
55

6+
import * as utils from '../utils'
7+
68
import Popup, {
79
POPUP,
810
DRAWER,
@@ -102,6 +104,18 @@ describe('Popup', () => {
102104
expect(onSubmitMock).not.toHaveBeenCalled()
103105
})
104106

107+
it('passes event data to onSubmit callback', () => {
108+
const onSubmitMock = jest.fn()
109+
const options = { ...popupOptions, onSubmit: onSubmitMock }
110+
const getSubmitEventDataSpy = jest.spyOn(utils, 'getSubmitEventData')
111+
const event = new CustomEvent('form-submit', { detail: { embedId: EMBED_ID } })
112+
113+
shallow(<Popup embedId={EMBED_ID} options={options} url={URL} />)
114+
115+
window.dispatchEvent(event)
116+
expect(getSubmitEventDataSpy).toHaveBeenCalledWith(event)
117+
})
118+
105119
describe(`upon receiving upon 'embed-auto-close-popup' event`, () => {
106120
let onCloseMock
107121
it('does not call onAutoClose callback function when auto close is not enabled', () => {

src/core/views/widget.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
isElementInViewport,
1010
callIfEmbedIdMatches,
1111
updateQueryStringParameter,
12-
redirectToUrl
12+
redirectToUrl,
13+
getSubmitEventData
1314
} from '../utils'
1415
import randomString from '../utils/random-string'
1516

@@ -192,8 +193,10 @@ class Widget extends Component {
192193
broadcastMessage(this.embedId, event)
193194
}
194195

195-
handleFormSubmit () {
196-
this.props.options.onSubmit && this.props.options.onSubmit()
196+
handleFormSubmit (event) {
197+
if (this.props.options.onSubmit) {
198+
this.props.options.onSubmit(getSubmitEventData(event))
199+
}
197200
}
198201

199202
reloadIframe () {

0 commit comments

Comments
 (0)