Emisell Helpdesk

ReactTypeScriptTailwind CSSZustandTanStack QueryZodshadcn/ui
Emisell Helpdesk

Overview

Emisell Helpdesk is a help center platform built for merchants on the Emisell platform. It covers three major areas: merchant account integration with the helpdesk, an AI chat assistant with contextual knowledge, and a structured ticket system for merchant-to-admin communication.

Problem

Merchants often struggle to find answers quickly when issues arise — and reaching out to admin feels slow and unstructured. Emisell Helpdesk was built to solve this by giving merchants a self-serve knowledge base, an AI assistant for instant answers, and a proper ticketing channel when human support is needed.

Key Features

  • Account Integration — merchants log in via their dashboard and connect seamlessly to the helpdesk
  • AI Chat Assistant — a conversational AI (similar to ChatGPT/Gemini) with context limited to Emisell-related topics and selected help articles
  • Knowledge Base — categorized help articles covering Getting Started, Products & Collections, Billing & Subscription, and more, with live search and recent search history
  • Ticket System — merchants can create and manage support tickets directed to admin, with a rich text editor for detailed submissions

Technical Highlights

Hybrid state management for AI chat was the most complex challenge. Chat messages exist in two states simultaneously — temporary (optimistic, pre-response) and server-confirmed. Zustand was used to bridge this gap: unresolved messages are persisted in localStorage for unauthenticated users, while in-flight messages remain visible during loading. Once the server responds, the temporary state is extended and reconciled with the real data — keeping the UI seamless throughout.

Binary stream response handling was a first — instead of a standard JSON response, the AI chat consumes a streaming binary response and renders content progressively as chunks arrive, similar to how modern AI chat interfaces work.

TanStack Query handled all server state for tickets and articles. Its mutation-and-invalidation pattern made it easy to automatically refetch related data when a ticket was submitted or an article was updated — without manual cache management.

Rich text editor was built into the ticket submission form, paired with React Hook Form and Zod for schema-based validation. shadcn/ui with Radix UI's data-state attribute pattern enabled clean conditional styling without JavaScript-driven class toggling.

An iframe-based article renderer was implemented to safely display rich article content without style bleed into the surrounding UI.