{"id":7262,"date":"2026-09-07T12:27:56","date_gmt":"2026-09-07T12:27:56","guid":{"rendered":"https:\/\/justfineinfotech.com\/how-vibe-coding-changed-the-way-i-run-my-business-and-why-every-solopreneur-should-try-it\/"},"modified":"2026-09-07T12:27:56","modified_gmt":"2026-09-07T12:27:56","slug":"how-vibe-coding-changed-the-way-i-run-my-business-and-why-every-solopreneur-should-try-it","status":"publish","type":"post","link":"https:\/\/justfineinfotech.com\/fr\/how-vibe-coding-changed-the-way-i-run-my-business-and-why-every-solopreneur-should-try-it\/","title":{"rendered":"How Vibe Coding Changed the Way I Run My Business (and Why Every Solopreneur Should Try It)"},"content":{"rendered":"<p>See All<br \/>\n${reply?.comment_author}${reply?.eln_tier_label ? &#8220; : &#8221;}<br \/>\n\u2022<br \/>\n\t\t\t\t\t\t\t${reply?.comment_relative_time}<br \/>\n${reply?.comment_content?.trim()}<\/p>\n<p>\t\t`;<br \/>\n\t}<\/p>\n<p>\tfunction createComment(comment, replies, isLastComment) {<br \/>\n\t\tconst commentListDiv = document.getElementById(PublicCommentSelectors.LIST);<\/p>\n<p>\t\tif (!commentListDiv) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst borderClasses = isLastComment ? &#8221; : &#8216;tw:border-b tw:border-slate-200&#8217;;<\/p>\n<p>\t\tconst currentUser = window?.tp?.pianoId?.getUser() ?? null;<br \/>\n\t\tconst currentUserInitials = currentUser<br \/>\n\t\t\t? getInitials(`${currentUser?.firstName ?? &#8221;} ${currentUser?.lastName ?? &#8221;}`)<br \/>\n\t\t\t: &#8221;;<\/p>\n<p>\t\tconst repliesHTML = replies.length ? `<br \/>\n\t\t\t${replies.map(buildReplyHTML).join(&#8221;)}<\/p>\n<p>\t\t` : &#8221;;<\/p>\n<p>\t\tconst replyButtonHTML = allowsComments ? `<\/p>\n<p>\t\t` : &#8221;;<\/p>\n<p>\t\tconst replyFormHTML = allowsComments ? `<\/p>\n<p>\t\t` : &#8221;;<\/p>\n<p>\t\tconst commentDiv = `<br \/>\n\t\t\t${comment?.comment_author}${comment?.eln_tier_label ? &#8220; : &#8221;}<br \/>\n\u2022<br \/>\n\t\t\t\t\t\t\t\t${comment?.comment_relative_time}<br \/>\n${comment?.comment_content?.trim()}<\/p>\n<p>\t\t\t\t\t\t${replyButtonHTML}<\/p>\n<p>\t\t\t\t${repliesHTML}<br \/>\n\t\t\t\t${replyFormHTML}<\/p>\n<p>\t\t`;<\/p>\n<p>\t\tcommentListDiv.innerHTML += commentDiv;<br \/>\n\t}<\/p>\n<p>\tfunction displayComments() {<br \/>\n\t\t\/\/ Empty out the comment list container before refreshing comments.<br \/>\n\t\tconst commentListDiv = document.getElementById(PublicCommentSelectors.LIST);<br \/>\n\t\tcommentListDiv.innerHTML = &#8221;;<\/p>\n<p>\t\tconst comments = state?.comments ?? [];<\/p>\n<p>\t\tif (!comments.length) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\t\/\/ Build a threaded structure: separate top-level from replies.<br \/>\n\t\tconst repliesByParent = {};<br \/>\n\t\tconst topLevelComments = [];<\/p>\n<p>\t\tcomments.forEach(comment =&gt; {<br \/>\n\t\t\tif (comment.comment_parent === 0) {<br \/>\n\t\t\t\ttopLevelComments.push(comment);<br \/>\n\t\t\t} else {<br \/>\n\t\t\t\tconst parentId = comment.comment_parent;<br \/>\n\t\t\t\tif (!repliesByParent[parentId]) {<br \/>\n\t\t\t\t\trepliesByParent[parentId] = [];<br \/>\n\t\t\t\t}<br \/>\n\t\t\t\trepliesByParent[parentId].push(comment);<br \/>\n\t\t\t}<br \/>\n\t\t});<\/p>\n<p>\t\t\/\/ Apply top-level sort order. Server returns DESC; reverse for oldest-first.<br \/>\n\t\tif (state.sortOrder === &#8216;oldest&#8217;) {<br \/>\n\t\t\ttopLevelComments.reverse();<br \/>\n\t\t}<\/p>\n<p>\t\t\/\/ Replies always show oldest first within a thread (server returns DESC, so reverse).<br \/>\n\t\tObject.keys(repliesByParent).forEach(parentId =&gt; {<br \/>\n\t\t\trepliesByParent[parentId].reverse();<br \/>\n\t\t});<\/p>\n<p>\t\ttopLevelComments.forEach((comment, index) =&gt; {<br \/>\n\t\t\tconst isLastComment = index === topLevelComments.length &#8211; 1;<br \/>\n\t\t\tconst replies = repliesByParent[comment.comment_ID] ?? [];<br \/>\n\t\t\tcreateComment(comment, replies, isLastComment);<br \/>\n\t\t});<\/p>\n<p>\t\tcreateCommentAvatars();<br \/>\n\t}<\/p>\n<p>\tfunction updateCommentCount() {<br \/>\n\t\tconst countDiv = document.getElementById(PublicCommentSelectors.COMMENT_COUNT);<br \/>\n\t\tconst sortControls = document.getElementById(PublicCommentSelectors.SORT_CONTROLS);<\/p>\n<p>\t\tif (!countDiv) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst count = state?.comments?.length ?? 0;<\/p>\n<p>\t\t\/\/ Do not display if there are no comments.<br \/>\n\t\tif (count === 0) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tcountDiv.innerHTML = `${count} Comment${count &gt; 1 ? &#8216;s&#8217; : &#8221;}`;<\/p>\n<p>\t\tif (sortControls) {<br \/>\n\t\t\tsortControls.classList.remove(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\tsortControls.classList.add(&#8216;tw:flex&#8217;);<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\tfunction displayLoader(show) {<br \/>\n\t\tconst loader = document.getElementById(PublicCommentSelectors.BUTTON_LOADER);<br \/>\n\t\tconst text = document.getElementById(PublicCommentSelectors.BUTTON_TEXT);<\/p>\n<p>\t\tif (!loader || !text) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\t\/\/ Show or hide the loader.<br \/>\n\t\tif (show) {<br \/>\n\t\t\tloader.classList.remove(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\ttext.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t} else {<br \/>\n\t\t\tloader.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\ttext.classList.remove(&#8216;tw:hidden&#8217;);<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\tfunction displayError(error) {<br \/>\n\t\tconst errorDiv = document.getElementById(PublicCommentSelectors.ERROR);<\/p>\n<p>\t\tif (!errorDiv) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tif (error) {<br \/>\n\t\t\terrorDiv.classList.add(&#8216;tw:block&#8217;);<br \/>\n\t\t\terrorDiv.classList.remove(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\terrorDiv.textContent = `Comment submission error: ${error}`;<br \/>\n\t\t} else {<br \/>\n\t\t\terrorDiv.classList.remove(&#8216;tw:block&#8217;);<br \/>\n\t\t\terrorDiv.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\terrorDiv.textContent = &#8221;;<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\tfunction clearCommentInput() {<br \/>\n\t\tconst commentField = document.getElementById(PublicCommentSelectors.INPUT);<\/p>\n<p>\t\tif (!commentField) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tcommentField.value = &#8221;;<br \/>\n\t}<\/p>\n<p>\tfunction updateComments(comments = []) {<br \/>\n\t\tstate.comments = comments;<br \/>\n\t\tdisplayComments();<br \/>\n\t\tupdateCommentCount();<br \/>\n\t}<\/p>\n<p>\tfunction runCommentProcess(type) {<br \/>\n\t\tif (type === &#8216;postComment&#8217;) {<br \/>\n\t\t\tconst comment = document.getElementById(PublicCommentSelectors.INPUT);<\/p>\n<p>\t\t\tif (!comment || !comment?.value) {<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\t\/\/ Hide errors, show loader.<br \/>\n\t\t\tdisplayError();<br \/>\n\t\t\tdisplayLoader(true);<br \/>\n\t\t}<\/p>\n<p>\t\tconst data = {<br \/>\n\t\t\ttype,<br \/>\n\t\t\tpostId: 444429,<br \/>\n\t\t};<\/p>\n<p>\t\t\/\/ Get a fresh nonce and either fetch comments or post comment.<br \/>\n\t\tfetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {<br \/>\n\t\t\tmethod: &#8216;POST&#8217;,<br \/>\n\t\t\theaders: {<br \/>\n\t\t\t\t&#8216;Content-Type&#8217;: &#8216;application\/json&#8217;,<br \/>\n\t\t\t},<br \/>\n\t\t\tbody: JSON.stringify(data),<br \/>\n\t\t})<br \/>\n\t\t.then((r) =&gt; r.json())<br \/>\n\t\t.then((response) =&gt; {<br \/>\n\t\t\t\/\/ Handle errors.<br \/>\n\t\t\tif (!response.success) {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tconsole.error(&#8216;Error getting nonce: &#8216;, response?.data?.message);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\tconst nonce = response?.data?.nonce;<\/p>\n<p>\t\t\t\/\/ Get comments.<br \/>\n\t\t\tif (type === &#8216;getComments&#8217;) {<br \/>\n\t\t\t\tgetComments(nonce);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\t\/\/ Post comment.<br \/>\n\t\t\tif (type === &#8216;postComment&#8217;) {<br \/>\n\t\t\t\tpostComment(nonce);<br \/>\n\t\t\t}<br \/>\n\t\t})<br \/>\n\t\t\t.catch((e) =&gt; {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tconsole.error(`Error running comment process ${type}: `, e);<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction getComments(nonce) {<br \/>\n\t\tconst data = {<br \/>\n\t\t\tnonce,<br \/>\n\t\t\tpostId: 444429,<br \/>\n\t\t};<\/p>\n<p>\t\t\/\/ Fetch comments.<br \/>\n\t\tfetch(`${adminAjaxUrl}?action=ep_get_public_comments`, {<br \/>\n\t\t\tmethod: &#8216;POST&#8217;,<br \/>\n\t\t\theaders: {<br \/>\n\t\t\t\t&#8216;Content-Type&#8217;: &#8216;application\/json&#8217;,<br \/>\n\t\t\t},<br \/>\n\t\t\tbody: JSON.stringify(data),<br \/>\n\t\t})<br \/>\n\t\t.then((r) =&gt; r.json())<br \/>\n\t\t.then((response) =&gt; {<br \/>\n\t\t\t\/\/ Handle errors.<br \/>\n\t\t\tif (!response.success) {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tconsole.error(&#8216;Error getting comments: &#8216;, response?.data?.message);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\tupdateComments(response?.data?.comments);<br \/>\n\t\t\tdisplayLoader(false);<br \/>\n\t\t})<br \/>\n\t\t\t.catch((e) =&gt; {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tconsole.error(&#8216;Error getting comments: &#8216;, e);<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction postComment(nonce) {<br \/>\n\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\tif (!user || !user?.uid) {<br \/>\n\t\t\tconsole.error(&#8216;Error posting comment: Unauthorized. Submission aborted.&#8217;);<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst comment = document.getElementById(PublicCommentSelectors.INPUT);<\/p>\n<p>\t\tif (!comment || !comment?.value) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst data = {<br \/>\n\t\t\tnonce,<br \/>\n\t\t\tcomment: comment.value,<br \/>\n\t\t\tcommentParent: 0,<br \/>\n\t\t\tpostId: 444429,<br \/>\n\t\t\tuid: user?.uid,<br \/>\n\t\t};<\/p>\n<p>\t\t\/\/ Post the comment.<br \/>\n\t\tfetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {<br \/>\n\t\t\tmethod: &#8216;POST&#8217;,<br \/>\n\t\t\theaders: {<br \/>\n\t\t\t\t&#8216;Content-Type&#8217;: &#8216;application\/json&#8217;,<br \/>\n\t\t\t},<br \/>\n\t\t\tcredentials: &#8216;include&#8217;,<br \/>\n\t\t\tbody: JSON.stringify(data),<br \/>\n\t\t})<br \/>\n\t\t.then((r) =&gt; r.json())<br \/>\n\t\t.then((response) =&gt; {<br \/>\n\t\t\t\/\/ Handle errors.<br \/>\n\t\t\tif (!response.success) {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tdisplayError(response?.data?.message, true);<br \/>\n\t\t\t\tconsole.error(&#8216;Error posting comment: &#8216;, response?.data?.message);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\t\/\/ Handle success.<br \/>\n\t\t\tclearCommentInput();<br \/>\n\t\t\trunCommentProcess(&#8216;getComments&#8217;);<br \/>\n\t\t})<br \/>\n\t\t\t.catch((e) =&gt; {<br \/>\n\t\t\t\tdisplayLoader(false);<br \/>\n\t\t\t\tdisplayError(e);<br \/>\n\t\t\t\tconsole.error(&#8216;Error posting comment: &#8216;, e);<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction toggleReplyForm(commentId) {<br \/>\n\t\t\/\/ Close any other open reply forms.<br \/>\n\t\tdocument.querySelectorAll(&#8216;.ep-reply-form&#8217;).forEach(function(form) {<br \/>\n\t\t\tif (form.dataset.parentId !== String(commentId)) {<br \/>\n\t\t\t\tform.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\t}<br \/>\n\t\t});<\/p>\n<p>\t\t\/\/ Toggle the targeted reply form.<br \/>\n\t\tconst targetForm = document.querySelector(&#8216;.ep-reply-form[data-parent-id=&#8221;&#8216; + commentId + &#8216;&#8221;]&#8217;);<\/p>\n<p>\t\tif (targetForm) {<br \/>\n\t\t\ttargetForm.classList.toggle(&#8216;tw:hidden&#8217;);<\/p>\n<p>\t\t\tif (!targetForm.classList.contains(&#8216;tw:hidden&#8217;)) {<br \/>\n\t\t\t\ttargetForm.querySelector(&#8216;.ep-reply-input&#8217;)?.focus();<br \/>\n\t\t\t}<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\tfunction setReplyLoading(formEl, isLoading) {<br \/>\n\t\tconst btn = formEl.querySelector(&#8216;.ep-reply-submit&#8217;);<br \/>\n\t\tconst btnText = formEl.querySelector(&#8216;.ep-reply-button-text&#8217;);<\/p>\n<p>\t\tif (!btn || !btnText) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tif (isLoading) {<br \/>\n\t\t\tbtnText.textContent = &#8216;Posting&#8230;&#8217;;<br \/>\n\t\t\tbtn.disabled = true;<br \/>\n\t\t} else {<br \/>\n\t\t\tbtnText.textContent = &#8216;Post Reply&#8217;;<br \/>\n\t\t\tbtn.disabled = false;<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\tfunction displayReplyError(formEl, error) {<br \/>\n\t\tconst errorDiv = formEl.querySelector(&#8216;.ep-reply-error&#8217;);<\/p>\n<p>\t\tif (!errorDiv || !error) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\terrorDiv.textContent = &#8216;Reply error: &#8216; + error;<br \/>\n\t\terrorDiv.classList.remove(&#8216;tw:hidden&#8217;);<br \/>\n\t\terrorDiv.classList.add(&#8216;tw:block&#8217;);<br \/>\n\t}<\/p>\n<p>\tfunction clearReplyError(formEl) {<br \/>\n\t\tconst errorDiv = formEl.querySelector(&#8216;.ep-reply-error&#8217;);<\/p>\n<p>\t\tif (!errorDiv) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\terrorDiv.textContent = &#8221;;<br \/>\n\t\terrorDiv.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\terrorDiv.classList.remove(&#8216;tw:block&#8217;);<br \/>\n\t}<\/p>\n<p>\tfunction postReply(nonce, parentId, replyText, formEl) {<br \/>\n\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\tif (!user || !user?.uid) {<br \/>\n\t\t\tsetReplyLoading(formEl, false);<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst data = {<br \/>\n\t\t\tnonce,<br \/>\n\t\t\tcomment: replyText,<br \/>\n\t\t\tcommentParent: parentId,<br \/>\n\t\t\tpostId: 444429,<br \/>\n\t\t\tuid: user?.uid,<br \/>\n\t\t};<\/p>\n<p>\t\tfetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {<br \/>\n\t\t\tmethod: &#8216;POST&#8217;,<br \/>\n\t\t\theaders: {<br \/>\n\t\t\t\t&#8216;Content-Type&#8217;: &#8216;application\/json&#8217;,<br \/>\n\t\t\t},<br \/>\n\t\t\tcredentials: &#8216;include&#8217;,<br \/>\n\t\t\tbody: JSON.stringify(data),<br \/>\n\t\t})<br \/>\n\t\t.then((r) =&gt; r.json())<br \/>\n\t\t.then((response) =&gt; {<br \/>\n\t\t\tsetReplyLoading(formEl, false);<\/p>\n<p>\t\t\tif (!response.success) {<br \/>\n\t\t\t\tdisplayReplyError(formEl, response?.data?.message);<br \/>\n\t\t\t\tconsole.error(&#8216;Error posting reply: &#8216;, response?.data?.message);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\tformEl.querySelector(&#8216;.ep-reply-input&#8217;).value = &#8221;;<br \/>\n\t\t\tformEl.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\trunCommentProcess(&#8216;getComments&#8217;);<br \/>\n\t\t})<br \/>\n\t\t\t.catch((e) =&gt; {<br \/>\n\t\t\t\tsetReplyLoading(formEl, false);<br \/>\n\t\t\t\tdisplayReplyError(formEl, &#8216;Network error. Please try again.&#8217;);<br \/>\n\t\t\t\tconsole.error(&#8216;Error posting reply: &#8216;, e);<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction submitReply(parentId, formEl) {<br \/>\n\t\tconst input = formEl.querySelector(&#8216;.ep-reply-input&#8217;);<\/p>\n<p>\t\tif (!input || !input.value.trim()) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\tif (!user || !user?.uid) {<br \/>\n\t\t\topenLoginModal();<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tsetReplyLoading(formEl, true);<br \/>\n\t\tclearReplyError(formEl);<\/p>\n<p>\t\tconst data = {<br \/>\n\t\t\ttype: &#8216;postComment&#8217;,<br \/>\n\t\t\tpostId: 444429,<br \/>\n\t\t};<\/p>\n<p>\t\tfetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {<br \/>\n\t\t\tmethod: &#8216;POST&#8217;,<br \/>\n\t\t\theaders: {<br \/>\n\t\t\t\t&#8216;Content-Type&#8217;: &#8216;application\/json&#8217;,<br \/>\n\t\t\t},<br \/>\n\t\t\tbody: JSON.stringify(data),<br \/>\n\t\t})<br \/>\n\t\t.then((r) =&gt; r.json())<br \/>\n\t\t.then((response) =&gt; {<br \/>\n\t\t\tif (!response.success) {<br \/>\n\t\t\t\tsetReplyLoading(formEl, false);<br \/>\n\t\t\t\tdisplayReplyError(formEl, response?.data?.message);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\tpostReply(response?.data?.nonce, parseInt(parentId, 10), input.value.trim(), formEl);<br \/>\n\t\t})<br \/>\n\t\t\t.catch((e) =&gt; {<br \/>\n\t\t\t\tsetReplyLoading(formEl, false);<br \/>\n\t\t\t\tdisplayReplyError(formEl, &#8216;Network error. Please try again.&#8217;);<br \/>\n\t\t\t\tconsole.error(&#8216;Error getting nonce for reply: &#8216;, e);<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction setupCommentListDelegation() {<br \/>\n\t\tconst commentListDiv = document.getElementById(PublicCommentSelectors.LIST);<\/p>\n<p>\t\tif (!commentListDiv) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tcommentListDiv.addEventListener(&#8216;click&#8217;, function(e) {<br \/>\n\t\t\t\/\/ Reply button: toggle the inline reply form.<br \/>\n\t\t\tconst replyButton = e.target.closest(&#8216;.&#8217; + PublicCommentSelectors.REPLY_BUTTON);<br \/>\n\t\t\tif (replyButton) {<br \/>\n\t\t\t\tconst commentId = replyButton.dataset.commentId;<br \/>\n\t\t\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\t\t\tif (!user) {<br \/>\n\t\t\t\t\topenLoginModal();<br \/>\n\t\t\t\t\treturn;<br \/>\n\t\t\t\t}<\/p>\n<p>\t\t\t\ttoggleReplyForm(commentId);<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\t\/\/ Reply cancel: hide the reply form.<br \/>\n\t\t\tconst replyCancel = e.target.closest(&#8216;.ep-reply-cancel&#8217;);<br \/>\n\t\t\tif (replyCancel) {<br \/>\n\t\t\t\tconst parentId = replyCancel.dataset.parentId;<br \/>\n\t\t\t\tconst form = document.querySelector(&#8216;.ep-reply-form[data-parent-id=&#8221;&#8216; + parentId + &#8216;&#8221;]&#8217;);<br \/>\n\t\t\t\tif (form) {<br \/>\n\t\t\t\t\tform.classList.add(&#8216;tw:hidden&#8217;);<br \/>\n\t\t\t\t}<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\t\/\/ Reply submit: post the reply.<br \/>\n\t\t\tconst replySubmit = e.target.closest(&#8216;.ep-reply-submit&#8217;);<br \/>\n\t\t\tif (replySubmit) {<br \/>\n\t\t\t\tconst parentId = replySubmit.dataset.parentId;<br \/>\n\t\t\t\tconst form = document.querySelector(&#8216;.ep-reply-form[data-parent-id=&#8221;&#8216; + parentId + &#8216;&#8221;]&#8217;);<br \/>\n\t\t\t\tif (form) {<br \/>\n\t\t\t\t\tsubmitReply(parentId, form);<br \/>\n\t\t\t\t}<br \/>\n\t\t\t}<br \/>\n\t\t});<br \/>\n\t}<\/p>\n<p>\tfunction setupUserAvatar() {<br \/>\n\t\tconst usernameDiv = document.getElementById(PublicCommentSelectors.USERNAME);<br \/>\n\t\tconst userAvatar = document.getElementById(PublicCommentSelectors.USER_AVATAR);<\/p>\n<p>\t\tif (!usernameDiv || !userAvatar) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\tif (!user) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\tconst fullName = `${user?.firstName ?? &#8221;} ${user?.lastName ?? &#8221;}`;<\/p>\n<p>\t\tusernameDiv.innerHTML = fullName;<br \/>\n\t\tuserAvatar.innerHTML = getInitials(fullName);<br \/>\n\t}<\/p>\n<p>\tfunction openLoginModal() {<br \/>\n\t\twindow?.tp?.pianoId?.show({ displayMode: &#8216;modal&#8217;, screen: &#8216;login&#8217; });<br \/>\n\t}<\/p>\n<p>\tfunction setupCommentSubmitButton() {<br \/>\n\t\tconst submitButton = document.getElementById(PublicCommentSelectors.SUBMIT);<\/p>\n<p>\t\tif (!submitButton || state.submitCommentButtonRegistered) {<br \/>\n\t\t\treturn;<br \/>\n\t\t}<\/p>\n<p>\t\t\/\/ Register a single click handler that checks auth state at click time.<br \/>\n\t\tsubmitButton.addEventListener(&#8216;click&#8217;, function() {<br \/>\n\t\t\tconst user = window?.tp?.pianoId?.getUser() ?? null;<\/p>\n<p>\t\t\tif (!user) {<br \/>\n\t\t\t\topenLoginModal();<br \/>\n\t\t\t\treturn;<br \/>\n\t\t\t}<\/p>\n<p>\t\t\trunCommentProcess(&#8216;postComment&#8217;);<br \/>\n\t\t});<\/p>\n<p>\t\tstate.submitCommentButtonRegistered = true;<br \/>\n\t}<\/p>\n<p>\tfunction setSortOrder(order) {<br \/>\n\t\tstate.sortOrder = order;<\/p>\n<p>\t\tconst newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);<br \/>\n\t\tconst oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);<\/p>\n<p>\t\tif (newestBtn &amp;&amp; oldestBtn) {<br \/>\n\t\t\tconst activeClasses = [&#8216;tw:font-bold&#8217;, &#8216;tw:text-blue-800&#8217;];<br \/>\n\t\t\tconst inactiveClasses = [&#8216;tw:font-normal&#8217;, &#8216;tw:text-slate-500&#8217;];<\/p>\n<p>\t\t\tif (order === &#8216;newest&#8217;) {<br \/>\n\t\t\t\tnewestBtn.classList.add(&#8230;activeClasses);<br \/>\n\t\t\t\tnewestBtn.classList.remove(&#8230;inactiveClasses);<br \/>\n\t\t\t\toldestBtn.classList.add(&#8230;inactiveClasses);<br \/>\n\t\t\t\toldestBtn.classList.remove(&#8230;activeClasses);<br \/>\n\t\t\t} else {<br \/>\n\t\t\t\toldestBtn.classList.add(&#8230;activeClasses);<br \/>\n\t\t\t\toldestBtn.classList.remove(&#8230;inactiveClasses);<br \/>\n\t\t\t\tnewestBtn.classList.add(&#8230;inactiveClasses);<br \/>\n\t\t\t\tnewestBtn.classList.remove(&#8230;activeClasses);<br \/>\n\t\t\t}<br \/>\n\t\t}<\/p>\n<p>\t\tdisplayComments();<br \/>\n\t}<\/p>\n<p>\tfunction setupSortControls() {<br \/>\n\t\tconst newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);<br \/>\n\t\tconst oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);<\/p>\n<p>\t\tif (newestBtn) {<br \/>\n\t\t\tnewestBtn.addEventListener(&#8216;click&#8217;, function() {<br \/>\n\t\t\t\tsetSortOrder(&#8216;newest&#8217;);<br \/>\n\t\t\t});<br \/>\n\t\t}<\/p>\n<p>\t\tif (oldestBtn) {<br \/>\n\t\t\toldestBtn.addEventListener(&#8216;click&#8217;, function() {<br \/>\n\t\t\t\tsetSortOrder(&#8216;oldest&#8217;);<br \/>\n\t\t\t});<br \/>\n\t\t}<br \/>\n\t}<\/p>\n<p>\trunCommentProcess(&#8216;getComments&#8217;);<br \/>\n\tlistenForPianoLogin();<br \/>\n\tsetupCommentSubmitButton();<br \/>\n\tsetupCommentListDelegation();<br \/>\n\tsetupSortControls();<br \/>\n});<\/p>\n<p>By Nellie Akalp<br \/>\nBy Entrepreneur Store<br \/>\nBy Paul Kluskowski<br \/>\nBy Jason Zickerman<br \/>\nBy Michal Beressi Golomb<br \/>\nBy Sherin Shibu<\/p>\n<div style=\"clear:both;margin:30px 0 15px 0\">\n<p>\n    <strong>Related:<\/strong><br \/>\n    &lt;a href=&quot;https:\/\/yoursite.com\/<a href=\"https:\/\/justfineinfotech.com\/ai-automation-proposed-to-modernise-pakistans-poultry-production\/\" title=\"AI, automation proposed to modernise Pakistan\u2019s poultry production\">automation<\/a>-training-benin\/&#8221; title=&#8221;Digital Automation Training Benin: 5 Winning Skills Employers Demand in 2026&#8243;&gt;<br \/>\n      Digital Automation Training Benin: 5 Winning Skills Employers Demand in 2026<br \/>\n    <\/a>\n  <\/p>\n<p>\n    &lt;a href=&quot;https:\/\/yoursite.com\/automation-africa\/&quot; title=&quot;<a href=\"https:\/\/justfineinfotech.com\/whatsapp-tests-third-party-ai-agent-integration-for-android-users\/\" title=\"WhatsApp tests third-party AI agent integration for Android users\">WhatsApp<\/a> <a href=\"https:\/\/justfineinfotech.com\/best-marketing-automation-software-2026-11-tools-compared-brevo\/\" title=\"Best Marketing Automation Software (2026): 11 Tools Compared | Brevo\">Marketing Automation<\/a> Africa: 6 Dangerous Mistakes Brands Make in Nigeria&#8221;&gt;<br \/>\n      WhatsApp Marketing Automation Africa: 6 Dangerous Mistakes Brands Make in Nigeria<br \/>\n    <\/a>\n  <\/p>\n<\/div>\n<div style=\"clear:both;margin:30px 0;padding:25px;background:#f8f9fc;border:1px solid #ddd;border-radius:8px;text-align:center\">\n<h3>Want to learn this practically?<\/h3>\n<p>Join <strong>Justfine Infotech<\/strong> and build real digital skills in AI, automation, web development, digital marketing, office productivity, e-commerce, freelancing and cybersecurity.<\/p>\n<p><strong>Available Programmes:<\/strong><br \/>\n  6 Weeks Certificate \u2022 3 Months Professional Certificate \u2022 6 Months Diploma \u2022 Full Professional Diploma<\/p>\n<p><strong>WhatsApp:<\/strong><br \/>\n  +229 01 57 57 99 15<br \/>\n  +229 01 66 68 11 60<\/p>\n<p><a href=\"https:\/\/api.whatsapp.com\/send?phone=2348132690270&amp;text=Hello\" target=\"_blank\" rel=\"noopener\">Enroll Now<\/a><\/p>\n<\/div>\n<p class=\"ani-source\">Source: <a href=\"https:\/\/www.entrepreneur.com\/business-news\/tech\/how-vibe-coding-changed-the-way-i-run-my-business-and-why-every-solopreneur-should-try-it\" target=\"_blank\" rel=\"nofollow noopener\">www.entrepreneur.com<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>See All ${reply?.comment_author}${reply?.eln_tier_label ? &#8220; : &#8221;} \u2022 ${reply?.comment_relative_time} ${reply?.comment_content?.trim()} `; } function createComment(comment, replies, isLastComment) { const commentListDiv = document.getElementById(PublicCommentSelectors.LIST); if (!commentListDiv) { return; } const borderClasses = isLastComment ? &#8221; : &#8216;tw:border-b tw:border-slate-200&#8217;; const currentUser = window?.tp?.pianoId?.getUser() ?? null; const currentUserInitials = currentUser ? getInitials(`${currentUser?.firstName ?? &#8221;} ${currentUser?.lastName ?? &#8221;}`) : &#8221;; const&hellip;<\/p>","protected":false},"author":1,"featured_media":7264,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[66],"tags":[238,1621,168,1280,1035],"class_list":["post-7262","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-skills-career-opportunities","tag-business","tag-changed","tag-coding","tag-every","tag-vibe"],"_links":{"self":[{"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/posts\/7262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/comments?post=7262"}],"version-history":[{"count":1,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/posts\/7262\/revisions"}],"predecessor-version":[{"id":7263,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/posts\/7262\/revisions\/7263"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/media\/7264"}],"wp:attachment":[{"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/media?parent=7262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/categories?post=7262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/justfineinfotech.com\/fr\/wp-json\/wp\/v2\/tags?post=7262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}