Files
ncd-fe/packages/pl-fe/src/stores/status-meta.ts
nicole mikołajczyk 3a1d51d030 pl-fe: hotfix
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-10-22 23:42:11 +02:00

92 lines
3.3 KiB
TypeScript

import { create } from 'zustand';
import { mutative } from 'zustand-mutative';
type State = {
statuses: Record<string, {
expanded?: boolean;
mediaVisible?: boolean;
currentLanguage?: string;
targetLanguage?: string;
showPollResults?: boolean;
}>;
actions: {
expandStatuses: (statusIds: Array<string>) => void;
collapseStatuses: (statusIds: Array<string>) => void;
revealStatusesMedia: (statusIds: Array<string>) => void;
hideStatusesMedia: (statusIds: Array<string>) => void;
toggleStatusesMediaHidden: (statusIds: Array<string>) => void;
fetchTranslation: (statusId: string, targetLanguage: string) => void;
hideTranslation: (statusId: string) => void;
setStatusLanguage: (statusId: string, language: string) => void;
toggleShowPollResults: (statusId: string) => void;
};
};
const useStatusMetaStore = create<State>()(mutative((set) => ({
statuses: {},
actions: {
expandStatuses: (statusIds) => set((state: State) => {
for (const statusId of statusIds) {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].expanded = true;
}
}),
collapseStatuses: (statusIds) => set((state: State) => {
for (const statusId of statusIds) {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].expanded = false;
}
}),
revealStatusesMedia: (statusIds) => set((state: State) => {
for (const statusId of statusIds) {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].mediaVisible = true;
}
}),
hideStatusesMedia: (statusIds) => set((state: State) => {
for (const statusId of statusIds) {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].mediaVisible = false;
}
}),
toggleStatusesMediaHidden: (statusIds) => (state: State) => {
for (const statusId of statusIds) {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].mediaVisible = !state.statuses[statusId].mediaVisible;
}
},
fetchTranslation: (statusId, targetLanguage) => set((state: State) => {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].targetLanguage = targetLanguage;
}),
hideTranslation: (statusId) => set((state: State) => {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].targetLanguage = undefined;
}),
setStatusLanguage: (statusId, language) => set((state: State) => {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].currentLanguage = language;
}),
toggleShowPollResults: (statusId) => set((state: State) => {
if (!state.statuses[statusId]) state.statuses[statusId] = {};
state.statuses[statusId].showPollResults = !state.statuses[statusId].showPollResults;
}),
},
})));
const emptyStatusMeta = {};
const useStatusMeta = (statusId: string) => useStatusMetaStore((state) => state.statuses[statusId] || emptyStatusMeta);
const useStatusMetaActions = () => useStatusMetaStore((state) => state.actions);
export { useStatusMetaStore, useStatusMeta, useStatusMetaActions };