134 lines
4.4 KiB
TypeScript
134 lines
4.4 KiB
TypeScript
import { create } from "zustand"
|
|
import { persist } from "zustand/middleware"
|
|
|
|
interface WalletState {
|
|
walletConnected: boolean
|
|
walletAddress: string
|
|
username: string | null
|
|
isVerified: boolean
|
|
country: string | null
|
|
citizenshipVerified: boolean
|
|
eligibilityVerified: boolean
|
|
verificationStatus: string // "Unverified", "Verified", or "Fully Eligible"
|
|
perspectivesSubmittedToday: number
|
|
lastSubmissionDate: string | null
|
|
trustScore: number
|
|
dailyLimit: number
|
|
connectWallet: (address?: string, username?: string, isVerified?: boolean) => void
|
|
disconnectWallet: () => void
|
|
incrementPerspectiveCount: () => void
|
|
resetPerspectiveCount: () => void
|
|
updateTrustScore: (newScore: number) => void
|
|
updateDailyLimit: (newLimit: number) => void
|
|
toggleVerification: () => void
|
|
setVerificationDetails: (country: string, citizenshipVerified: boolean, eligibilityVerified: boolean, status: string) => void
|
|
setCountry: (country: string) => void
|
|
}
|
|
|
|
export const useWalletStore = create<WalletState>()(
|
|
persist(
|
|
(set, get) => ({
|
|
walletConnected: false,
|
|
walletAddress: "",
|
|
username: null,
|
|
isVerified: false,
|
|
country: null,
|
|
citizenshipVerified: false,
|
|
eligibilityVerified: false,
|
|
verificationStatus: "Unverified",
|
|
perspectivesSubmittedToday: 0,
|
|
lastSubmissionDate: null,
|
|
trustScore: 20, // Default trust score for new users
|
|
dailyLimit: 5, // Default daily limit for unverified users
|
|
connectWallet: (address = "0x1a2...3b4c", username = "VoxPop User", isVerified = false) =>
|
|
set({
|
|
walletConnected: true,
|
|
walletAddress: address,
|
|
username,
|
|
isVerified,
|
|
// Set daily limit to unlimited (99) if verified
|
|
dailyLimit: isVerified ? 99 : get().dailyLimit
|
|
}),
|
|
disconnectWallet: () => set({
|
|
walletConnected: false,
|
|
walletAddress: "",
|
|
username: null,
|
|
isVerified: false,
|
|
country: null,
|
|
citizenshipVerified: false,
|
|
eligibilityVerified: false,
|
|
verificationStatus: "Unverified",
|
|
perspectivesSubmittedToday: 0,
|
|
lastSubmissionDate: null,
|
|
trustScore: 20,
|
|
dailyLimit: 5
|
|
}),
|
|
incrementPerspectiveCount: () => {
|
|
const currentDate = new Date().toDateString();
|
|
const { lastSubmissionDate, perspectivesSubmittedToday } = get();
|
|
|
|
// Reset count if it's a new day
|
|
if (lastSubmissionDate !== currentDate) {
|
|
set({
|
|
perspectivesSubmittedToday: 1,
|
|
lastSubmissionDate: currentDate
|
|
});
|
|
} else {
|
|
set({
|
|
perspectivesSubmittedToday: perspectivesSubmittedToday + 1,
|
|
lastSubmissionDate: currentDate
|
|
});
|
|
}
|
|
},
|
|
resetPerspectiveCount: () => {
|
|
set({
|
|
perspectivesSubmittedToday: 0,
|
|
lastSubmissionDate: null
|
|
});
|
|
},
|
|
updateTrustScore: (newScore: number) => {
|
|
const currentScore = get().trustScore;
|
|
const updatedScore = Math.min(Math.max(newScore, 0), 100); // Clamp between 0-100
|
|
|
|
set({ trustScore: updatedScore });
|
|
|
|
// Update daily limit based on trust score if user is unverified
|
|
if (!get().isVerified) {
|
|
const newLimit = Math.floor(5 + (updatedScore / 20)); // 5 base + up to 5 more based on trust
|
|
set({ dailyLimit: newLimit });
|
|
}
|
|
},
|
|
updateDailyLimit: (newLimit: number) => {
|
|
set({ dailyLimit: newLimit });
|
|
},
|
|
toggleVerification: () => {
|
|
const currentVerificationStatus = get().isVerified;
|
|
set({
|
|
isVerified: !currentVerificationStatus,
|
|
// Update daily limit when toggling verification
|
|
dailyLimit: !currentVerificationStatus ? 99 : Math.floor(5 + (get().trustScore / 20))
|
|
});
|
|
},
|
|
setVerificationDetails: (country: string, citizenshipVerified: boolean, eligibilityVerified: boolean, status: string) => {
|
|
set({
|
|
country,
|
|
citizenshipVerified,
|
|
eligibilityVerified,
|
|
verificationStatus: status,
|
|
// Update isVerified based on citizenshipVerified (at minimum)
|
|
isVerified: citizenshipVerified,
|
|
// Update daily limit for verified users
|
|
dailyLimit: citizenshipVerified ? 99 : get().dailyLimit
|
|
});
|
|
},
|
|
setCountry: (country: string) => {
|
|
set({ country });
|
|
}
|
|
}),
|
|
{
|
|
name: "wallet-storage",
|
|
},
|
|
),
|
|
)
|
|
|