KOMPAS.com - Chatbot berbasis kecerdasan buatan (artificial intelligence/AI), ChatGPT kini kedatangan dukungan plugin baru, yakni untuk aplikasi desain grafis Canva.

Menurut ChatGPT, integrasi Canva ke ChatGPT ini merevolusi cara pengguna menghasilkan konten visual. Sebab, kini, pengguna ChatGPT kini bisa membuat desain logo, presentasi PPT, posting media sosial, hingga materi promosi/iklan dengan template Canva secara langsung di ChatGPT.

Hal ini dimungkinkan berkat dukungan plugin. Plugin adalah perangkat lunak (software) tambahan yang bisa menambah kemampuan suatu software atau layanan supaya bisa mengakses beragam konten ekstra dari sumber luar atau layanan pihak ketiga.

Plugin juga memungkinkan ChatGPT bisa berinteraksi dengan sistem antarmuka dari sebuah aplikasi (Application Programming Interface/API). Dalam kasus ini, ChatGPT menjadi bisa memanfaatkan layanan atau fitur yang ada di platform Canva.

Baca juga: Cara Bikin Background Zoom via Canva dengan Berbagai Tema dan Template

Untuk memanfaatkan fitur ini, pengguna harus membuka ChatGPT di browser mereka. Kemudian mencari 'Plugin Store' di bagian plugin. Di sini, plugin Canva dapat diinstal dengan mudah.

Setelah terinstal, pengguna dapat menuju ke jendela utama ChatGPT dan memilih 'Canva' dari bagian plugin. 

Di kotak perintah chatbot, pengguna dapat mendeskripsikan visual yang ingin mereka buat. Misalnya, "Saya seorang penggemar AI yang aktif di Twitter. Buat banner untuk akun saya.".

ChatGPT bakal memberikan deretan konten visual sesuai intruksi. Pengguna dapat memilih opsi favorit mereka, mengeditnya di Canva, dan mengunduhnya langsung untuk digunakan sesuai kebutuhan.

Baca juga: Bos ChatGPT Sam Altman Jadi WNA Pertama yang Dapat Golden Visa Indonesia

Canva selama ini banyak digunakan pengguna karena memiliki fitur yang komplet. Dengan menggunakan Canva, pengguna bisa membuat tim, merencanakan konten, hingga menggunakan fitur Smartmockups untuk desain mereka.

Dalam aplikasi Canva, pengguna bisa membuat desain untuk presentasi, media sosial, video, produk cetak, situs web, dokumen, logo, resume, surat, dan masih banyak lagi.

Semua fitur Canva ini bakal bisa dinikmati ketika pengguna menggunakan ChatGPT. Demonstrasi pembuatan konten visual seperti PPT, banner, posting media sosial bisa disimak selengkapnya melalui threads X dari pengguna @markgadala di atas.

Integrasi Canva ke ChatGPT saat ini eksklusif untuk pengguna yang berlangganan ChatGPT Plus seharga 20 dollar AS atau setara dengan Rp 303.760 (kurs Rp 15.188) per bulan, sebagaimana dihimpun KompasTekno dari Decrypt, Selasa (5/9/2023).

Langganan ini memberikan akses ke plugin Canva dan juga memungkinkan pengguna menggunakan model bahasa besar (LLM) GPT-4 yang baru. GPT-4 diketahui lebih pintar dan lebih mumpuni mendeteksi dan menjelaskan gambar.


Simak breaking news dan berita pilihan kami langsung di ponselmu. Pilih saluran andalanmu akses berita Kompas.com WhatsApp Channel : https://www.whatsapp.com/channel/0029VaFPbedBPzjZrk13HO3D. Pastikan kamu sudah install aplikasi WhatsApp ya.




`);
var wSpecStop = createElementFromHTML(`

Konten disembunyikan.
Muat ulang halaman untuk perbarui rekomendasi.

`);
reactionPopup.querySelector('.buttonShare').setAttribute('data-title', item.title);
reactionPopup.querySelector('.buttonShare').setAttribute('data-url', itemUrl);
reactionPopup.querySelector('.buttonShare').setAttribute('data-campaign', 'AIML_Widget_Desktop');

let userFeedback = new UserFeedback(resultObj.engine['tracker_algsrc'], itemUrl + tracker_params, jxRecHelper, index);

reactionPopup.querySelector('.buttonBookmark').addEventListener('click', function() {
do_bookmark(itemUrl, index, userFeedback);
});

reactionPopup.querySelector('.buttonShare').addEventListener('click', function() {
userFeedback.event('share');
});

reactionPopup.querySelector('.buttonNotInterest').addEventListener('click', function() {
if (getCookie('kmps_usrid')) {
hideThisArt(this);
userFeedback.event('not-interested');
} else {
const parentAction = this.parentElement.parentElement.parentElement
if (!!parentAction) {
let indexElement = parentAction.getAttribute('data-index')
if (indexElement != 'undefined') {
localStorage.setItem('reaction_not_interest_temp', JSON.stringify({
urlpage: items[indexElement].url
}))
}
}
window.location.href = "https://account.kompas.com/login/a29tcGFz/" + btoa(window.location.href);
}
});

/**
* trigger action "userFeedback" that user not interest item before, when not interest without login
*/
if (getCookie('kmps_usrid') && localStorage.getItem('reaction_not_interest_temp')) {
const tempUrlNotInterest = JSON.parse(localStorage.getItem('reaction_not_interest_temp'))
if (itemUrl == tempUrlNotInterest.urlpage) {
userFeedback.event('not-interested');
localStorage.removeItem('reaction_not_interest_temp');
}
}

wSpecStop.querySelector('.wSpec-stop-undo').addEventListener('click', function() {
showThisArt(this);
userFeedback.event('un-not-interested');
});

recItem.appendChild(buttonOption);
recItem.appendChild(reactionPopup);
recItem.appendChild(wSpecStop);
}

var recItemWrapperA = createElement('a', null, null, null);
recItemWrapperA.setAttribute('href', itemUrl + tracker_params);

var titleDiv = createElement('h4', null, null, [cssClasses.title]);
var titleTextNode = document.createTextNode(item.title);
if (item.itemType == 'video') {
var iconVideo = createElement('div', null, null, ['icoInline', 'icoVideo']);
iconVideo.style.marginRight = '5px';
titleDiv.appendChild(iconVideo);
}
titleDiv.appendChild(titleTextNode);

var sourceDiv = null;
if (item.hasOwnProperty('method')) {
sourceDiv = createElement('div', null, null, [cssClasses.source], resultObj.engine['type'] + ' . ' + item.method.toUpperCase());
} else {
var sourceDiv = createElement('div', null, null, [cssClasses.source], resultObj.engine['type']);
}

var textWrapper = createElement('div', null, null, [cssClasses.text_wrapper]);
textWrapper.appendChild(categoryDiv);
textWrapper.appendChild(titleDiv);
textWrapper.appendChild(sourceDiv);

recItemWrapper.appendChild(imgWrapper);
recItemWrapper.appendChild(textWrapper);

recItemWrapperA.appendChild(recItemWrapper);

recItem.appendChild(recItemWrapperA);

widgetWrapper.appendChild(recItem);
// hook up the click handler for this item
// recItem.onclick = handleClick.bind(null, jxRecHelper, itemUrl + tracker_params, index);
recItemWrapperA.onclick = handleClick.bind(null, jxRecHelper, itemUrl + tracker_params, index);
});
} // end while
var endDate = new Date();
var loadtime = (endDate.getTime() - startDate.getTime());
trackEventGa('AIML Article Recommendation', 'Content Loaded', 'algsrc='+algsrc+',site=TEKNO,device=desktop,loadtime=' + loadtime)

let domain = window.location.hostname;
if(domain=='www.kompas.com'){
var url=window.location.href.split("/");
domain=url[2]+'/'+url[3]
}
let user_subs_type = "Gues";
let subs_type = "";
let is_lgn = 0;
let engine = algsrc;
if(getCookie('kmps_usrid')){is_lgn=1};
let time_load = loadtime;

resolve();

/***
* JXRECSDK NOTES 3 of 5 -
* pass all the info about the items to the rec helper
* each one is an object: ALL MANDATORY
* div
* id
* pos
*/
jxRecHelper.items(widgetItemArr);
/***
* JXRECSDK NOTES 4 of 5 -
* Call the ready() of the helper object when the recommendation
* results have been populated to the widget
* (This will register the action=ready event)
*/
if (resultObj.engine['type'] == 'api-1') {
jxRecHelper.ready(resultObj.options.algo + ":" + resultObj.options.version);
} else {
jxRecHelper.ready(resultObj.engine['type']);
}
} else {
jxRecHelper.error(204);
console.error("Error: no recommendation items");
return;
}
} catch (err) {
jxRecHelper.error(901);
console.log(err.stack);
let domain = window.location.hostname;
if(domain=='www.kompas.com'){
var url=window.location.href.split("/");
domain=url[2]+'/'+url[3]
}
let user_subs_type = "Gues";
let subs_type = ""
let is_lgn = 0;
let engine = algsrc;
if(getCookie('kmps_usrid')){is_lgn=1};
let endDate = new Date();
let time_load = (endDate.getTime() - startDate.getTime());
}
});
}

const _jxRecSdkURL = 'https://scripts.jixie.media/jxrecsdk.1.0.min.js';
var startDate = new Date();
class OneWidget {
constructor() {
//this is also the one we will pass to the JX rec helper object when
//we instantiate it:
//In this implementation most of these come from the options obj
//on the publisher page.
this._options = {
accountid: '9262bf2590d558736cac4fff7978fcb1',
pageurl: 'https://tekno.kompas.com/read/2023/09/05/13400027/chatgpt-kini-bisa-desain-logo-ppt-dan-iklan-pakai-template-canva',
widget_id: '1000183-6xWeiWZFIM',
type: 'pages',
container: 'rekomendasi-konten-pilihan-untukmu-aiml',
keywords: content_tags,
title: title,
customid: "7",
count: 14,
};
this._containerId = this._options.container;
this._container = document.getElementById(this._containerId);
this._engines = [{"url":"https://recommendation.jixie.media/v1/recommendation","method":"GET","pageurl":"https://tekno.kompas.com/read/2023/09/05/13400027/chatgpt-kini-bisa-desain-logo-ppt-dan-iklan-pakai-template-canva","system":"jx","type":"api-1","tracker_params":"?source=widgetML","tracker_algsrc":"V","count":14,"page_status":"read","excludeitemids":"2023090513400027"}];
}
kickOff() {
startDate = new Date();
const rand = Math.floor(Math.random() * 1000);
/*const randSystem = Math.floor(Math.random() * 3);
this._engine = this._engines[randSystem]
if (location.hostname.indexOf('lestari') != -1) {
this._engine = this._engines[1]
}*/
this._engine = this._engines[0];
this._options.system = this._engine['system']
trackEventGa('AIML Article Recommendation', 'Widget load', 'algsrc=' + this._engine['tracker_algsrc'] + ',site=TEKNO,device=desktop')
let promJXSDK = fetchJSFileP(_jxRecSdkURL);
let thisObj = this;

// first we wait on the JX REC SDK to be loaded and initialized
let recHelperObj = null;
let recResults = null;
promJXSDK
.then(function() {
/***
* JXRECSDK NOTES 1 of 5 - INSTANTIATION OF A JX REC HELPER OBJECT
* Call this AFTER JX REC SDK is loaded but BEFORE you call your REC
* backend.
*
* param: MANDATORY options object
* options object must at a minimal have
* accountid: get from jixie
* widgetid: get from jixie
* container: DIV ID of the destination div to house the widget
* (for jixie widget this is just the options object passed from the page)
*
* (This will also register the action=load event)
*/
recHelperObj = jxRecMgr.createJxRecHelper(thisObj._options);

let basicInfo = thisObj._options;
basicInfo.engine = thisObj._engine

if (basicInfo.engine.type == 'api-1') {
var options = {
count: basicInfo['count'],
adpositions: "",
keywords: basicInfo['keywords'],
title: basicInfo['title'],
date_published: "2023-09-05",
pagecategory: "TEKNO",
algo: "mixed"
};

if(getCookie('kmps_usrid')){

var kg = {
pagetype:basicInfo.engine.page_status,
uid:getCookie('kmps_usrid'),
ukid:getCookie('kmp_uid')
}

if(basicInfo.engine.page_status=='read'){
kg['excludeitemids'] = basicInfo.engine.excludeitemids;
kg['multiFormat'] = true;
}

options['additional'] = {
kg:kg
};
}
return recHelperObj.getJxRecommendations(options);
} else {
return fetchRecommendationsP(basicInfo, recHelperObj.getJxUserInfo());
}
})
.then(function(resp) {
if (thisObj._engine.type == 'api-3') {
recResults = new Object
recResults.items = resp.docs.result;
} else {
recResults = resp;
}
recResults.engine = thisObj._engine;
if (!resp || !recResults.items || recResults.items.length == 0) {
/***
* JXRECSDK NOTES 2 of 5 -
* Call the error() function on the recHelper when either an error
* has occured in the fetching or there are no recommended items
*
* (This will register the action=error event)
*/
recHelperObj.error(204);
throw "no recommendation results";
}
})
.then(function() {
// everything is ready (recommendation results, css):
document.getElementById("rekomendasi-konten-pilihan-untukmu-aiml").classList.remove("-loading");
document.querySelector('.wSpec-list').remove();
createDisplay(rand, thisObj._container, recResults, recHelperObj)
.then(function() {
toggleDropdown();

//observe lozad
lozad('.lozad', {
load: function(el) {
el.src = el.dataset.src;
el.onload = function() {
el.classList.add('fade')
}
}
}).observe()
})
})
.catch(function(error) {
console.log(`Unable to create recommendations widget ${error.stack} ${error.message}`);
});
}
}

var limit_gtm_ready = 1;

function check_gtm_ready() {
if ('ga' in window) {
// create a new instance of our widget based on the options
const newW = new OneWidget();
newW.kickOff();
} else {
const timeout_gtm_ready = setTimeout(check_gtm_ready, 500)
limit_gtm_ready += 1;
if (limit_gtm_ready > 10) {
clearTimeout(timeout_gtm_ready);
const newW = new OneWidget();
newW.kickOff();
}
}
}

check_gtm_ready()

document.querySelector('.wSpec-secret').addEventListener('click', function(e) {
e.preventDefault();
let wSl = document.querySelectorAll('.wSpec-source');
if (wSl.length > 0) {
for (let i = 0; i < wSl.length; i++) {
wSl[i].classList.toggle('show')
}
}
})

function trackEventGa(category, action, label) {
if ("ga" in window) {
ga(function() {
tracker = ga.getAll()[0];
if (tracker) {
tracker.send("event", category, action, label);
console.log('track event ', category, action, label)
}
})
}
}

function formBody(obj) {
let formBody = [];
for (var property in obj) {
let encodedKey = encodeURIComponent(property);
let encodedValue = encodeURIComponent(obj[property]);
formBody.push(encodedKey + "=" + encodedValue);
}
return formBody.join("&");
}

function getCookie(name) {
var name = name + '=';
var cookies = decodeURIComponent(document.cookie).split(';');
for (var i = 0; i < cookies.length; i++) {
var c = cookies[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
}

function get_guid(url) {
const videoPath = url.match(//watch/(d+)/);
if (videoPath) {
return `video.${videoPath[1]}`;
}

let arrayUrl = url.split('/');
let readPath = arrayUrl.indexOf('read');
if (arrayUrl[readPath + 1] == 'xml') {
readPath += 1;
}
let year = arrayUrl[readPath + 1];
let month = arrayUrl[readPath + 2];
let date = arrayUrl[readPath + 3];
let id = arrayUrl[readPath + 4];
let guid = `.xml.${year}.${month}.${date}.${id}`;
return guid;
}

function toggleDropdown() {
let tdd = document.querySelectorAll('[data-dropdown]')
if (!!tdd) {
tdd.forEach((el) => {
el.addEventListener('click', function() {
el.parentElement.classList.toggle('-active')
let saved = el.parentElement.getAttribute('data-saved')
let kmps_usrid = getCookie('kmps_usrid');

if (kmps_usrid && !saved && el.parentElement.classList.contains('-active')) {
let url = el.parentElement.getAttribute('data-url');
let guid = get_guid(url);
check_bookmark(
kmps_usrid,
guid
).then(function(resp) {
if (resp.hasOwnProperty('total_data')) {
if (resp.total_data > 0) {
el.parentElement.querySelector('.buttonBookmark').classList.add('-active');
el.parentElement.querySelector('.buttonBookmark').innerHTML = 'Hapus dari tersimpan';
el.parentElement.setAttribute('data-saved', 'true');
} else {
el.parentElement.setAttribute('data-saved', 'false');
}
}
})
}
})
document.addEventListener("click", function(e) {
// console.log(e.target)
if (el.contains(e.target)) {
// console.log(tdd)
} else {
el.parentElement.classList.remove('-active')
}
});
});
}
}

function check_bookmark(kmps_usrid, guid) {
let url = `https://api.kompas.com/2021/reaction/bookmark/list?kmps_usrid=${kmps_usrid}&guid=${guid}`;
return new Promise(function(resolve, reject) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
resolve(JSON.parse(this.responseText))
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
});
}

function do_bookmark(pageurl, pos, userFeedback) {
const wSpecItem = document.querySelector(`.wSpec-item[data-index="${pos}"]`);
const btnBookmark = wSpecItem.querySelector('.buttonBookmark');
const kmps_usrid = getCookie('kmps_usrid');
const guid = get_guid(pageurl);
const type = pageurl.match(//watch/(d+)/) ? 'video' : 'article';

if (kmps_usrid) {
if (btnBookmark.classList.contains('-active')) {
set_unbookmark({
guid: guid,
kmps_usrid: kmps_usrid,
type: type
}).then(function(resp) {
btnBookmark.classList.remove('-active');
btnBookmark.innerHTML = 'Simpan artikel';
reactionToast('Artikel berhasil dihapus dari list yang disimpan');
userFeedback.event('un-save');

}).catch(function(resp) {
// message: "Data doesn't exists"
if (resp.hasOwnProperty('message') && resp.message.includes('exist')) {
btnBookmark.classList.remove('-active');
btnBookmark.innerHTML = 'Simpan artikel';
reactionToast('Artikel berhasil dihapus dari list yang disimpan');
}
})
} else {
const user_bookmark_url = "https://activity.kompas.com/saved?order=desc";
set_bookmark({
guid: guid,
kmps_usrid: kmps_usrid,
type: type,
publisher: 'kompas',
platform: 'desktop'
}).then(function(resp) {
btnBookmark.classList.add('-active');
btnBookmark.innerHTML = 'Hapus dari tersimpan';
reactionToast('Artikel berhasil disimpan', user_bookmark_url);
userFeedback.event('save');
}).catch(function(resp) {
// message: "Data already exist"
if (resp.hasOwnProperty('message') && resp.message.includes('exist')) {
btnBookmark.classList.add('-active');
btnBookmark.innerHTML = 'Hapus dari tersimpan';
reactionToast('Artikel berhasil disimpan', user_bookmark_url);
}
})
}
} else {
const login_url = "https://account.kompas.com/login/a29tcGFz/" + btoa(window.location.href);
window.location.href = login_url;
}
}

function set_bookmark(data) {
const url = "https://api.kompas.com/2021/reaction/bookmark/add";
return new Promise(function(resolve, reject) {
const xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 201) {
resolve(JSON.parse(this.responseText));
} else if (this.readyState == 4 && this.status == 400) {
reject(JSON.parse(this.responseText));
}
};
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
xmlhttp.send(formBody(data));
});
}

function set_unbookmark(data) {
const url = "https://api.kompas.com/2021/reaction/bookmark/delete";
return new Promise(function(resolve, reject) {
const xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
resolve(JSON.parse(this.responseText));
} else if (this.readyState == 4 && this.status == 400) {
reject(JSON.parse(this.responseText));
}
};
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
xmlhttp.send(formBody(data));
});
}

class UserFeedback {

constructor(engine, pageurl, jxRecHelper, pos) {
this.engine = engine;
this.pageurl = pageurl;
this.jxRecHelper = jxRecHelper;
this.pos = pos;
}

event(feedback) {
if (this.engine == 'C') {
const xmlhttp = new XMLHttpRequest();
let params = {
domain: 'kompas.com',
ce_userid: getCookie('kmps_usrid'),
ce_sessionid: getCookie('ukid'),
ce_pageurl: this.pageurl,
engine: 'C',
ce_feedback: feedback
}
xmlhttp.open("GET", 'https://apis.kgdata.dev/v1/aiml/feedback-widgetml' + formatParams(params));
xmlhttp.send();
} else if (this.engine == 'V') {
if (feedback == 'share') {
this.jxRecHelper.shared(this.pos);
} else if (feedback == 'save') {
this.jxRecHelper.bookmarked(this.pos);
} else if (feedback == 'not-interested') {
this.jxRecHelper.hidden(this.pos);
} else if (feedback == 'un-not-interested') {
this.jxRecHelper.unhidden(this.pos);
}
}
}
}

function formatParams(params) {
return "?" + Object
.keys(params)
.map(function(key) {
return key + "=" + encodeURIComponent(params[key])
})
.join("&")
}

document.addEventListener("click", function(e){
let dx = document.querySelectorAll('[data-dropdown]')
if(dx) {
dx.forEach(function(el){
if(el.contains(e.target)) {
el.parentElement.classList.toggle('-active')
} else {
el.parentElement.classList.remove('-active')
}
})
}
})