/home/smartbloks/.trash/extendify/src/Assist/state/KnowledgeBase.js
import { create } from 'zustand'
import { devtools, persist, createJSONStorage } from 'zustand/middleware'
import {
getSupportArticlesData,
saveSupportArticlesData,
} from '@assist/api/Data'
const key = 'extendify-assist-knowledge-base'
const startingState = {
articles: [],
recentArticles: [],
viewedArticles: [],
activeCategory: null,
searchTerm: null,
offset: 0,
// Optimistically update from local storage - see storage.setItem below
...(JSON.parse(localStorage.getItem(key) || '{}')?.state ?? {}),
}
const state = (set) => ({
...startingState,
pushArticle(article) {
const { slug, title } = article
set((state) => {
const lastViewedAt = new Date().toISOString()
const firstViewedAt = lastViewedAt
const viewed = state.viewedArticles.find((a) => a.slug === slug)
return {
articles: [article, ...state.articles],
recentArticles: [article, ...state.recentArticles.slice(0, 9)],
viewedArticles: [
// Remove the article if it's already in the list
...state.viewedArticles.filter((a) => a.slug !== slug),
// Either add the article or update the count
viewed
? { ...viewed, count: viewed.count + 1, lastViewedAt }
: {
slug,
title,
firstViewedAt,
lastViewedAt,
count: 1,
},
],
}
})
},
popArticle() {
set((state) => ({ articles: state.articles.slice(1) }))
},
clearArticles() {
set({ articles: [] })
},
setActiveCategory(slug) {
set({ activeCategory: slug })
},
reset() {
set({ articles: [], activeCategory: null, searchTerm: null, offset: 0 })
},
updateTitle(slug, title) {
// We don't always know the title until after we fetch the article data
set((state) => ({
articles: state.articles.map((article) => {
if (article.slug === slug) {
article.title = title
}
return article
}),
}))
},
clearSearchTerm() {
set({ searchTerm: null, offset: 0 })
},
setSearchTerm(term) {
set({ searchTerm: term, offset: 0 })
},
setOffset(offset) {
set({ offset })
},
})
const storage = {
getItem: async () => JSON.stringify(await getSupportArticlesData()),
setItem: async (k, value) => {
// Stash here so we can use it on reload optimistically
localStorage.setItem(k, value)
await saveSupportArticlesData(value)
},
removeItem: () => undefined,
}
export const useKnowledgeBaseStore = create(
persist(devtools(state, { name: 'Extendify Assist Knowledge Base' }), {
name: key,
storage: createJSONStorage(() => storage),
partialize: (state) => {
delete state.articles
delete state.activeCategory
delete state.searchTerm
delete state.offset
return state
},
}),
state,
)