mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-27 06:34:12 +00:00
* feat(www): add login blocks * chore(www): restructure for blocks * chore: build registry * chore: clean up chunks * fix(www): chart categories * feat(www): big registry refactor * feat(www): update blocks * feat: complex blocks * fix: update schema * feat: sync new-york and default * fix: lint * feat: move charts * fix(www): code * fix: src path * chore: rebuild registry * fix: screenshot * fix: set new-york as default
50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
"use client"
|
|
|
|
import * as React from "react"
|
|
import { useAtom } from "jotai"
|
|
import { atomWithStorage } from "jotai/utils"
|
|
|
|
type Project = {
|
|
blocks: string[]
|
|
}
|
|
|
|
const projectAtom = atomWithStorage<Project>("project", {
|
|
blocks: [],
|
|
})
|
|
|
|
export function useProject() {
|
|
const [isAdded, setIsAdded] = React.useState(false)
|
|
const [project, setProject] = useAtom(projectAtom)
|
|
|
|
const addBlock = React.useCallback((block: string) => {
|
|
setProject((prev) => {
|
|
if (prev.blocks.includes(block)) {
|
|
return prev
|
|
}
|
|
return { ...prev, blocks: [...prev.blocks, block] }
|
|
})
|
|
setIsAdded(true)
|
|
|
|
setTimeout(() => {
|
|
setIsAdded(false)
|
|
}, 2000)
|
|
}, [])
|
|
|
|
const removeBlock = React.useCallback((block: string) => {
|
|
setProject((prev) => ({
|
|
...prev,
|
|
blocks: prev.blocks.filter((b) => b !== block),
|
|
}))
|
|
}, [])
|
|
|
|
const hasBlock = React.useCallback((block: string) => {
|
|
return project.blocks.includes(block)
|
|
}, [])
|
|
|
|
const resetProject = React.useCallback(() => {
|
|
setProject({ blocks: [] })
|
|
}, [])
|
|
|
|
return { project, addBlock, removeBlock, resetProject, hasBlock, isAdded }
|
|
}
|