messaging-api-messenger
Advanced tools
Comparing version 1.0.0-beta.23 to 1.0.0-beta.24
@@ -108,2 +108,13 @@ import FormData from 'form-data'; | ||
/** | ||
* User Level Persistent Menu | ||
* | ||
* https://developers.facebook.com/docs/messenger-platform/send-messages/persistent-menu#user_level_menu | ||
*/ | ||
getUserPersistentMenu(userId: string, { accessToken: customAccessToken }?: Types.AccessTokenOptions): Promise<Types.PersistentMenu | null>; | ||
setUserPersistentMenu(userId: string, menuItems: Types.MenuItem[] | Types.PersistentMenu, { composerInputDisabled, accessToken: customAccessToken, }?: { | ||
composerInputDisabled?: boolean; | ||
accessToken?: string; | ||
}): Promise<Types.MutationSuccessResponse>; | ||
deleteUserPersistentMenu(userId: string, { accessToken: customAccessToken }?: Types.AccessTokenOptions): Promise<Types.MutationSuccessResponse>; | ||
/** | ||
* Greeting Text | ||
@@ -110,0 +121,0 @@ * |
@@ -339,2 +339,47 @@ "use strict"; | ||
/** | ||
* User Level Persistent Menu | ||
* | ||
* https://developers.facebook.com/docs/messenger-platform/send-messages/persistent-menu#user_level_menu | ||
*/ | ||
getUserPersistentMenu(userId, { accessToken: customAccessToken } = {}) { | ||
return this._axios | ||
.get(`/me/custom_user_settings?psid=${userId}&access_token=${customAccessToken || | ||
this._accessToken}`) | ||
.then(res => res.data.data[0] | ||
? res.data.data[0].userLevelPersistentMenu | ||
: null, handleError); | ||
} | ||
setUserPersistentMenu(userId, menuItems, { composerInputDisabled = false, accessToken: customAccessToken, } = {}) { | ||
// menuItems is in type PersistentMenu | ||
if (menuItems.some((item) => item.locale === 'default')) { | ||
return this._axios | ||
.post(`/me/custom_user_settings?access_token=${customAccessToken || | ||
this._accessToken}`, { | ||
psid: userId, | ||
persistentMenu: menuItems, | ||
}) | ||
.then(res => res.data, handleError); | ||
} | ||
// menuItems is in type MenuItem[] | ||
return this._axios | ||
.post(`/me/custom_user_settings?access_token=${customAccessToken || | ||
this._accessToken}`, { | ||
psid: userId, | ||
persistentMenu: [ | ||
{ | ||
locale: 'default', | ||
composerInputDisabled, | ||
callToActions: menuItems, | ||
}, | ||
], | ||
}) | ||
.then(res => res.data, handleError); | ||
} | ||
deleteUserPersistentMenu(userId, { accessToken: customAccessToken } = {}) { | ||
return this._axios | ||
.delete(`/me/custom_user_settings?psid=${userId}¶ms=[%22persistent_menu%22]&access_token=${customAccessToken || | ||
this._accessToken}`) | ||
.then(res => res.data, handleError); | ||
} | ||
/** | ||
* Greeting Text | ||
@@ -341,0 +386,0 @@ * |
@@ -337,2 +337,6 @@ /// <reference types="node" /> | ||
}; | ||
export declare type UserPersistentMenu = { | ||
userLevelPersistentMenu?: PersistentMenu; | ||
pageLevelPersistentMenu?: PersistentMenu; | ||
}; | ||
export declare type MessengerProfile = { | ||
@@ -339,0 +343,0 @@ getStarted?: { |
@@ -9,3 +9,3 @@ { | ||
}, | ||
"version": "1.0.0-beta.23", | ||
"version": "1.0.0-beta.24", | ||
"main": "dist/index.js", | ||
@@ -17,7 +17,7 @@ "browser": "lib/browser.js", | ||
"axios": "^0.19.2", | ||
"axios-error": "^1.0.0-beta.16", | ||
"axios-error": "^1.0.0-beta.24", | ||
"form-data": "^3.0.0", | ||
"invariant": "^2.2.4", | ||
"lodash": "^4.17.15", | ||
"messaging-api-common": "^1.0.0-beta.23", | ||
"messaging-api-common": "^1.0.0-beta.24", | ||
"warning": "^4.0.3" | ||
@@ -32,5 +32,5 @@ }, | ||
"engines": { | ||
"node": ">=8" | ||
"node": ">=10" | ||
}, | ||
"gitHead": "5de733d62d61798bdb1d4b19b363bbe216b324e8" | ||
"gitHead": "18258941a920ed2aabf7b12f17e10e8c14238c15" | ||
} |
@@ -6,2 +6,3 @@ import MockAdapter from 'axios-mock-adapter'; | ||
const ACCESS_TOKEN = '1234567890'; | ||
const USER_ID = 'abcdefg'; | ||
@@ -569,2 +570,280 @@ let axios; | ||
}); | ||
describe('#getUserPersistentMenu', () => { | ||
it('should respond data of persistent menu', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
data: [ | ||
{ | ||
user_level_persistent_menu: [ | ||
{ | ||
locale: 'default', | ||
composer_input_disabled: true, | ||
call_to_actions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
], | ||
}, | ||
], | ||
}, | ||
], | ||
}; | ||
let url; | ||
mock.onGet().reply(config => { | ||
url = config.url; | ||
return [200, reply]; | ||
}); | ||
const res = await client.getUserPersistentMenu(USER_ID); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?psid=${USER_ID}&access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(res).toEqual([ | ||
{ | ||
locale: 'default', | ||
composerInputDisabled: true, | ||
callToActions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
], | ||
}, | ||
]); | ||
}); | ||
it('should respond null when data is an empty array', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
data: [], | ||
}; | ||
let url; | ||
mock.onGet().reply(config => { | ||
url = config.url; | ||
return [200, reply]; | ||
}); | ||
const res = await client.getUserPersistentMenu(USER_ID); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?psid=${USER_ID}&access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(res).toEqual(null); | ||
}); | ||
}); | ||
describe('#setUserPersistentMenu', () => { | ||
it('should respond success result', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
result: 'success', | ||
}; | ||
let url; | ||
let data; | ||
mock.onPost().reply(config => { | ||
url = config.url; | ||
data = config.data; | ||
return [200, reply]; | ||
}); | ||
const res = await client.setUserPersistentMenu(USER_ID, [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
]); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(JSON.parse(data)).toEqual({ | ||
psid: USER_ID, | ||
persistent_menu: [ | ||
{ | ||
locale: 'default', | ||
composer_input_disabled: false, | ||
call_to_actions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
], | ||
}, | ||
], | ||
}); | ||
expect(res).toEqual(reply); | ||
}); | ||
it('should respond success result if input is a full PersistentMenu, not MenuItem[]', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
result: 'success', | ||
}; | ||
let url; | ||
let data; | ||
mock.onPost().reply(config => { | ||
url = config.url; | ||
data = config.data; | ||
return [200, reply]; | ||
}); | ||
const res = await client.setUserPersistentMenu(USER_ID, [ | ||
{ | ||
locale: 'default', | ||
composerInputDisabled: false, | ||
callToActions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
], | ||
}, | ||
]); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(JSON.parse(data)).toEqual({ | ||
psid: USER_ID, | ||
persistent_menu: [ | ||
{ | ||
locale: 'default', | ||
composer_input_disabled: false, | ||
call_to_actions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
{ | ||
type: 'web_url', | ||
title: 'Powered by ALOHA.AI, Yoctol', | ||
url: 'https://www.yoctol.com/', | ||
}, | ||
], | ||
}, | ||
], | ||
}); | ||
expect(res).toEqual(reply); | ||
}); | ||
it('should support disabled input', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
result: 'success', | ||
}; | ||
let url; | ||
let data; | ||
mock.onPost().reply(config => { | ||
url = config.url; | ||
data = config.data; | ||
return [200, reply]; | ||
}); | ||
const items = [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
]; | ||
const res = await client.setUserPersistentMenu(USER_ID, items, { | ||
composerInputDisabled: true, | ||
}); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(JSON.parse(data)).toEqual({ | ||
psid: USER_ID, | ||
persistent_menu: [ | ||
{ | ||
locale: 'default', | ||
composer_input_disabled: true, | ||
call_to_actions: [ | ||
{ | ||
type: 'postback', | ||
title: 'Restart Conversation', | ||
payload: 'RESTART', | ||
}, | ||
], | ||
}, | ||
], | ||
}); | ||
expect(res).toEqual(reply); | ||
}); | ||
}); | ||
describe('#deleteUserPersistentMenu', () => { | ||
it('should respond success result', async () => { | ||
const { client, mock } = createMock(); | ||
const reply = { | ||
result: 'success', | ||
}; | ||
let url; | ||
mock.onDelete().reply(config => { | ||
url = config.url; | ||
return [200, reply]; | ||
}); | ||
const res = await client.deleteUserPersistentMenu(USER_ID); | ||
expect(url).toEqual( | ||
`/me/custom_user_settings?psid=${USER_ID}¶ms=[%22persistent_menu%22]&access_token=${ACCESS_TOKEN}` | ||
); | ||
expect(res).toEqual(reply); | ||
}); | ||
}); | ||
}); | ||
@@ -571,0 +850,0 @@ |
@@ -525,2 +525,83 @@ import crypto from 'crypto'; | ||
/** | ||
* User Level Persistent Menu | ||
* | ||
* https://developers.facebook.com/docs/messenger-platform/send-messages/persistent-menu#user_level_menu | ||
*/ | ||
getUserPersistentMenu( | ||
userId: string, | ||
{ accessToken: customAccessToken }: Types.AccessTokenOptions = {} | ||
): Promise<Types.PersistentMenu | null> { | ||
return this._axios | ||
.get( | ||
`/me/custom_user_settings?psid=${userId}&access_token=${customAccessToken || | ||
this._accessToken}` | ||
) | ||
.then( | ||
res => | ||
res.data.data[0] | ||
? (res.data.data[0].userLevelPersistentMenu as Types.PersistentMenu) | ||
: null, | ||
handleError | ||
); | ||
} | ||
setUserPersistentMenu( | ||
userId: string, | ||
menuItems: Types.MenuItem[] | Types.PersistentMenu, | ||
{ | ||
composerInputDisabled = false, | ||
accessToken: customAccessToken, | ||
}: { | ||
composerInputDisabled?: boolean; | ||
accessToken?: string; | ||
} = {} | ||
): Promise<Types.MutationSuccessResponse> { | ||
// menuItems is in type PersistentMenu | ||
if ( | ||
menuItems.some((item: Record<string, any>) => item.locale === 'default') | ||
) { | ||
return this._axios | ||
.post( | ||
`/me/custom_user_settings?access_token=${customAccessToken || | ||
this._accessToken}`, | ||
{ | ||
psid: userId, | ||
persistentMenu: menuItems as Types.PersistentMenu, | ||
} | ||
) | ||
.then(res => res.data, handleError); | ||
} | ||
// menuItems is in type MenuItem[] | ||
return this._axios | ||
.post( | ||
`/me/custom_user_settings?access_token=${customAccessToken || | ||
this._accessToken}`, | ||
{ | ||
psid: userId, | ||
persistentMenu: [ | ||
{ | ||
locale: 'default', | ||
composerInputDisabled, | ||
callToActions: menuItems as Types.MenuItem[], | ||
}, | ||
], | ||
} | ||
) | ||
.then(res => res.data, handleError); | ||
} | ||
deleteUserPersistentMenu( | ||
userId: string, | ||
{ accessToken: customAccessToken }: Types.AccessTokenOptions = {} | ||
): Promise<Types.MutationSuccessResponse> { | ||
return this._axios | ||
.delete( | ||
`/me/custom_user_settings?psid=${userId}¶ms=[%22persistent_menu%22]&access_token=${customAccessToken || | ||
this._accessToken}` | ||
) | ||
.then(res => res.data, handleError); | ||
} | ||
/** | ||
* Greeting Text | ||
@@ -527,0 +608,0 @@ * |
@@ -444,2 +444,7 @@ import fs from 'fs'; | ||
export type UserPersistentMenu = { | ||
userLevelPersistentMenu?: PersistentMenu; | ||
pageLevelPersistentMenu?: PersistentMenu; | ||
}; | ||
export type MessengerProfile = { | ||
@@ -446,0 +451,0 @@ getStarted?: { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
729971
13006