Spaces:
Sleeping
Sleeping
| import { create } from 'zustand'; | |
| import { persist } from 'zustand/middleware'; | |
| interface StoreState { | |
| noticeDialog: boolean; | |
| dummyMode: boolean; | |
| contentImagesHidden: Record<string, boolean>; // タブIDごとの画像非表示状態 | |
| userIdentifier: string; // ユーザー識別子(永続化) | |
| setDummyMode: (dummyMode: boolean) => void; | |
| setNoticeDialog: (notice: boolean) => void; | |
| toggleContentImages: (tabId: string) => void; | |
| resetAllContentImages: () => void; | |
| isContentImagesHidden: (tabId: string) => boolean; | |
| setUserIdentifier: (email?: string | null) => void; // メールアドレスでユーザー識別子を更新 | |
| getUserIdentifier: () => string; // ユーザー識別子を取得 | |
| } | |
| // セッションIDを生成(メールアドレスがない場合のフォールバック) | |
| const generateSessionId = (): string => { | |
| if (typeof window === 'undefined') { | |
| return `server-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; | |
| } | |
| return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; | |
| }; | |
| export const useGlobalStore = create<StoreState>()( | |
| persist( | |
| (set, get) => ({ | |
| dummyMode: false, | |
| contentImagesHidden: {}, | |
| userIdentifier: generateSessionId(), // 初期値はセッションID | |
| noticeDialog: false, | |
| setDummyMode: (dummyMode: boolean) => set(() => ({ dummyMode })), | |
| setNoticeDialog: (notice: boolean) => set(() => ({ noticeDialog: notice })), | |
| toggleContentImages: (tabId: string) => | |
| set((state) => ({ | |
| contentImagesHidden: { | |
| ...state.contentImagesHidden, | |
| [tabId]: !state.contentImagesHidden[tabId], | |
| }, | |
| })), | |
| resetAllContentImages: () => set(() => ({ contentImagesHidden: {} })), | |
| isContentImagesHidden: (tabId: string) => get().contentImagesHidden[tabId] || false, | |
| setUserIdentifier: (email?: string | null) => { | |
| // メールアドレスがあればそれを使用、なければセッションIDを生成 | |
| const identifier = email || generateSessionId(); | |
| set(() => ({ userIdentifier: identifier })); | |
| }, | |
| getUserIdentifier: () => get().userIdentifier, | |
| }), | |
| { | |
| name: 'global-store', | |
| partialize: (state) => ({ | |
| userIdentifier: state.userIdentifier, // userIdentifierのみ永続化 | |
| }), | |
| }, | |
| ), | |
| ); | |