import AsyncStorage from "@react-native-async-storage/async-storage"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import { seedSubscriptions } from "@/lib/data/seed"; import type { Fulfillment, PaymentMethod } from "@/lib/stores/locationStore"; export type SubscriptionStatus = "active" | "paused" | "cancelled"; export type RefillSubscription = { id: string; productId: string; productName: string; quantity: number; frequencyDays: number; fulfillment: Fulfillment; paymentMethod: PaymentMethod; memberId?: string | null; status: SubscriptionStatus; nextFulfillmentAt: string; }; type SubState = { items: RefillSubscription[]; add: ( s: Omit ) => void; pause: (id: string) => void; resume: (id: string) => void; cancel: (id: string) => void; }; function nextDate(days: number) { const d = new Date(); d.setDate(d.getDate() + days); return d.toISOString(); } export const useSubscriptionStore = create()( persist( (set, get) => ({ items: seedSubscriptions, add: (s) => set({ items: [ { ...s, id: `sub_${Date.now()}`, status: "active", nextFulfillmentAt: nextDate(s.frequencyDays), }, ...get().items, ], }), pause: (id) => set({ items: get().items.map((i) => i.id === id ? { ...i, status: "paused" } : i ), }), resume: (id) => set({ items: get().items.map((i) => i.id === id ? { ...i, status: "active", nextFulfillmentAt: nextDate(i.frequencyDays), } : i ), }), cancel: (id) => set({ items: get().items.map((i) => i.id === id ? { ...i, status: "cancelled" } : i ), }), }), { name: "gishen-subscriptions", storage: createJSONStorage(() => AsyncStorage), version: 2, migrate: (persisted: unknown) => { const state = (persisted ?? {}) as Partial; return !state.items?.length ? { ...state, items: seedSubscriptions } : state; }, } ) );