soundboardFeedStore.ts 1.3 Ko
Télécharger le fichier
import { createOctaneStore } from '@/state/createOctaneStore';
export const SOUNDBOARD_FEED_LIMIT = 4;
export const SOUNDBOARD_FEED_DURATION_MS = 4_500;
export interface SoundboardFeedEntry {
key: number;
username: string;
userId: number;
soundName: string;
soundId: number;
}
interface SoundboardFeedState {
entries: SoundboardFeedEntry[];
lastPlayed: { soundId: number; at: number } | null;
// Never reset: a dismiss timer that fires after a clear must not hit a newer entry.
nextKey: number;
push: (entry: Omit<SoundboardFeedEntry, 'key'>) => number;
dismiss: (key: number) => void;
clear: () => void;
}
export const useSoundboardFeedStore = createOctaneStore<SoundboardFeedState>()((set, get) => ({
entries: [],
lastPlayed: null,
nextKey: 1,
push: (entry) => {
const key = get().nextKey;
set((state) => ({
entries: [{ ...entry, key }, ...state.entries].slice(0, SOUNDBOARD_FEED_LIMIT),
lastPlayed: { soundId: entry.soundId, at: Date.now() },
nextKey: key + 1
}));
return key;
},
dismiss: (key) => set((state) => ({ entries: state.entries.filter((entry) => entry.key !== key) })),
clear: () => set({ entries: [], lastPlayed: null })
}));
