repositories
loading repo index
repositories
loading repo index
repository
loading code, commits, and activity
Projectflow
stars
latest
clone command
git clone gitlawb://did:key:z6Mkfh4Y...QBEi/projectflowgit clone gitlawb://did:key:z6Mkfh4Y.../projectflowb3cded1async from playground1d ago| #1 | import { StateCreator } from "zustand"; |
| #2 | import type { Sprint, Notification } from "../../../domain/entities"; |
| #3 | import { sprints as mockSprints } from "../../../infrastructure/mock-data/sprints"; |
| #4 | import { generateId } from "../../../infrastructure/helpers"; |
| #5 | import type { StoreState } from "../store.types"; |
| #6 | |
| #7 | export interface SprintSlice { |
| #8 | sprints: Sprint[]; |
| #9 | createSprint: (sprint: Omit<Sprint, "id">) => Sprint; |
| #10 | updateSprint: (id: string, updates: Partial<Sprint>) => void; |
| #11 | deleteSprint: (id: string) => void; |
| #12 | startSprint: (id: string) => void; |
| #13 | completeSprint: (id: string) => void; |
| #14 | addIssueToSprint: (issueId: string, sprintId: string) => void; |
| #15 | removeIssueFromSprint: (issueId: string) => void; |
| #16 | } |
| #17 | |
| #18 | export const createSprintSlice: StateCreator< |
| #19 | StoreState, |
| #20 | [], |
| #21 | [], |
| #22 | SprintSlice |
| #23 | > = (set, get) => ({ |
| #24 | sprints: mockSprints, |
| #25 | createSprint: (sprintData) => { |
| #26 | const newSprint = { ...sprintData, id: generateId() }; |
| #27 | set((s) => ({ sprints: [...s.sprints, newSprint] })); |
| #28 | return newSprint; |
| #29 | }, |
| #30 | updateSprint: (id, updates) => { |
| #31 | set((s) => ({ |
| #32 | sprints: s.sprints.map((sp) => |
| #33 | sp.id === id ? { ...sp, ...updates } : sp |
| #34 | ), |
| #35 | })); |
| #36 | }, |
| #37 | deleteSprint: (id) => { |
| #38 | set((s) => ({ |
| #39 | sprints: s.sprints.filter((sp) => sp.id !== id), |
| #40 | issues: s.issues.map((i) => |
| #41 | i.sprintId === id ? { ...i, sprintId: null } : i |
| #42 | ), |
| #43 | })); |
| #44 | }, |
| #45 | startSprint: (id) => { |
| #46 | const sprint = get().sprints.find((s) => s.id === id); |
| #47 | if (sprint) { |
| #48 | get().updateSprint(id, { status: "active" }); |
| #49 | const sprintIssues = get().issues.filter((i) => i.sprintId === id); |
| #50 | const notification: Notification = { |
| #51 | id: generateId(), |
| #52 | userId: get().currentUser?.id || "u1", |
| #53 | type: "sprint_started", |
| #54 | title: "Sprint started", |
| #55 | message: `${sprint.name} has started with ${sprintIssues.length} issues`, |
| #56 | read: false, |
| #57 | createdAt: new Date().toISOString(), |
| #58 | }; |
| #59 | set((s) => ({ |
| #60 | notifications: [notification, ...s.notifications], |
| #61 | })); |
| #62 | } |
| #63 | }, |
| #64 | completeSprint: (id) => { |
| #65 | get().updateSprint(id, { status: "completed" }); |
| #66 | }, |
| #67 | addIssueToSprint: (issueId, sprintId) => { |
| #68 | get().updateIssue(issueId, { sprintId }); |
| #69 | }, |
| #70 | removeIssueFromSprint: (issueId) => { |
| #71 | get().updateIssue(issueId, { sprintId: null, status: "backlog" }); |
| #72 | }, |
| #73 | }); |
| #74 |