interact-fb
Version:
A comprehensive NPM package for interacting with Facebook Graph API across frontend frameworks (React, Vue, Angular, Svelte, Vanilla JS)
193 lines (154 loc) • 4.98 kB
JavaScript
// src/forms.js
import { graphAPI } from './graph.js';
import { getConfig } from './config.js';
import { handleError } from './errors.js';
import { resolveAccessToken, assertString, assertPositiveInteger, assertObject } from './utils.js';
/**
* Fetches lead generation forms for a Facebook Page with enhanced options
* @param {string} pageId - Facebook Page ID
* @param {string} accessToken - Page access token
* @param {object} [options={}] - Query options
* @param {string} [options.fields] - Comma-separated fields to request
* @param {number} [options.limit] - Maximum number of forms to fetch
* @param {string} [options.status] - Filter by form status ('ACTIVE', 'ARCHIVED', 'DRAFT')
* @returns {Promise<object>} Facebook response containing lead forms
*/
export async function getLeadForms(pageId, accessToken, options = {}) {
try {
assertString(pageId, 'pageId');
const config = getConfig();
const {
fields = config.defaultFields.leadForms,
limit,
status,
apiOptions = {}
} = options;
assertObject(options, 'options');
if (limit != null) assertPositiveInteger(limit, 'options.limit');
// Build query parameters
const params = { fields };
if (limit) params.limit = limit;
if (status) params.status = status;
return await graphAPI(
`${pageId}/leadgen_forms`,
await resolveAccessToken(accessToken),
'GET',
params,
apiOptions
);
} catch (error) {
throw handleError(
error,
'getLeadForms',
{ pageId, options }
);
}
}
/**
* Fetches detailed information about a specific lead form
* @param {string} formId - Lead generation form ID
* @param {string} accessToken - Page access token
* @param {object} [options={}] - Query options
* @returns {Promise<object>} Detailed form information
*/
export async function getLeadFormDetails(formId, accessToken, options = {}) {
try {
const {
fields = 'id,name,status,leads_count,created_time,questions,privacy_policy_url,follow_up_action_url,expired_leads_count,page',
apiOptions = {}
} = options;
assertString(formId, 'formId');
assertObject(options, 'options');
return await graphAPI(
formId,
await resolveAccessToken(accessToken),
'GET',
{ fields },
apiOptions
);
} catch (error) {
throw handleError(
error,
'getLeadFormDetails',
{ formId, options }
);
}
}
/**
* Fetches only active lead forms for a page
* @param {string} pageId - Facebook Page ID
* @param {string} accessToken - Page access token
* @param {object} [options={}] - Query options
* @returns {Promise<object>} Active lead forms
*/
export async function getActiveLeadForms(pageId, accessToken, options = {}) {
return await getLeadForms(pageId, accessToken, {
...options,
status: 'ACTIVE'
});
}
/**
* Fetches lead forms from multiple pages
* @param {Array} pageIds - Array of Facebook Page IDs
* @param {string} accessToken - Access token
* @param {object} [options={}] - Query options
* @returns {Promise<object>} Object with pageId as keys and forms as values
*/
export async function getLeadFormsFromMultiplePages(pageIds, accessToken, options = {}) {
try {
if (!Array.isArray(pageIds) || pageIds.length === 0) {
throw new Error('pageIds must be a non-empty array');
}
const results = {};
// Process pages concurrently
const promises = pageIds.map(async (pageId) => {
try {
const forms = await getLeadForms(pageId, accessToken, {
...options,
});
return { pageId, forms, success: true };
} catch (error) {
return { pageId, error: error.message, success: false };
}
});
const responses = await Promise.all(promises);
responses.forEach(({ pageId, forms, error, success }) => {
results[pageId] = success ? forms : { error };
});
return results;
} catch (error) {
throw handleError(
error,
'getLeadFormsFromMultiplePages',
{ pageIds, options }
);
}
}
/**
* Gets lead form statistics
* @param {string} formId - Lead generation form ID
* @param {string} accessToken - Page access token
* @param {object} [options={}] - Query options
* @returns {Promise<object>} Form statistics
*/
export async function getLeadFormStats(formId, accessToken, options = {}) {
try {
const {
fields = 'leads_count,expired_leads_count,created_time,status',
apiOptions = {}
} = options;
return await graphAPI(
formId,
accessToken,
'GET',
{ fields },
apiOptions
);
} catch (error) {
throw handleError(
error,
'getLeadFormStats',
{ formId, options }
);
}
}