FE_Test / store /global.ts
GitHub Actions
Deploy from GitHub Actions [test] - 2025-10-31 10:18:25
5f2aab6
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のみ永続化
}),
},
),
);