UNPKG

zendesk-themer

Version:

CLI for zendesk hc theme deploy

120 lines (108 loc) 3.56 kB
/* eslint no-unused-vars: 0 */ /* eslint-env browser */ async function graphQl (query, variables = null) { const headers = new Headers() headers.append('X-CSRF-Token', window.THEMING.CSRFToken) const body = new FormData() body.append('graphql', JSON.stringify({ query, variables })) const res = await fetch('/theming/graphql', { method: 'post', credentials: 'same-origin', body, headers }) return res.json().then(json => { // error handler if (json.errors) throw JSON.stringify(json.errors) return json }) } function workbench () { // eslint-disable-next-line no-undef const brandId = String(THEMING.accountInformation.brand_id) return graphQl(` query ($brandFilters: [String!]){ workbench (brandFilters: $brandFilters) { id name nickname live expert author thumbnail updatedAt } }`, { brandFilters: [brandId] }).then(json => json.data.workbench) } async function exportTheme (themeId) { const job = await createExportThemeJob(themeId) await waitJob(job.id) return job.downloadUrl } function createExportThemeJob (themeId) { return graphQl(` mutation($input: CreateExportThemeJobInputType!) { createExportThemeJob(input: $input) { jobId, downloadUrl } }`, { input: { themeId } }) .then(json => json.data.createExportThemeJob) .then(job => ( { id: job.jobId, downloadUrl: job.downloadUrl } )) } function createImportThemeJob () { // eslint-disable-next-line no-undef const brandId = String(THEMING.accountInformation.brand_id) return graphQl(` mutation($input: CreateImportThemeJobInputType!) { createImportThemeJob(input: $input) { jobId, themeId, uploadUrl, uploadParams } }`, { input: { brandId, origin: 'ZIP' } }) .then(json => json.data.createImportThemeJob) .then(job => ( { id: job.jobId, themeId: job.themeId, uploadUrl: job.uploadUrl, uploadParams: JSON.parse(job.uploadParams) } )) } function archiveTheme (themeId) { return graphQl(` mutation($input: ArchiveThemeInputType!) { archiveTheme(input: $input) { id } }`, { input: { themeId: themeId } }) .then(json => json.data.archiveTheme.id) } function publishTheme (themeId) { return graphQl(` mutation($input: PublishThemeInputType!) { publishTheme(input: $input) { theme { id } } }`, { input: { themeId: themeId } }) .then(json => json.data.publishTheme.theme.id) } async function waitJob (jobId) { const res = await graphQl(`{job(id: "${jobId}") { status, errors{ message } }}`) .then(json => json.data.job) if (res.status === 'pending') return delay(250).then(() => waitJob(jobId)) if (res.status === 'failed') throw new Error(res.errors[0].message) } function delay (ms) { return new Promise(resolve => setTimeout(resolve, ms)) }