Files
5chan/src/stores/use-media-hosting-store.ts
T
plebeius 96a4aaec0e feat(media-hosting): add multi-provider configurable upload with fallback
Add Random/Preferred/None modes, preferred provider selection, and provider-order fallback. Catbox/Imgur/PostImages on Android via WebView; Electron CDP automation for Imgur/PostImages. Hide upload controls on web runtime.
2026-02-18 18:51:02 +08:00

47 lines
1.3 KiB
TypeScript

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import type { ProviderId, UploadMode } from '../lib/media-hosting/types';
import { MEDIA_HOSTING_PROVIDERS as PROVIDER_REGISTRY } from '../lib/media-hosting/providers';
/** Provider registry for UI: id, label, homepage URL, runtime support */
export const MEDIA_HOSTING_PROVIDERS = PROVIDER_REGISTRY;
interface MediaHostingStore {
uploadMode: UploadMode;
preferredProvider: ProviderId;
setUploadMode: (mode: UploadMode) => void;
setPreferredProvider: (provider: ProviderId) => void;
}
const PERSIST_VERSION = 2;
function migrate(_state: unknown): MediaHostingStore {
return {
uploadMode: 'random',
preferredProvider: 'catbox',
} as MediaHostingStore;
}
const useMediaHostingStore = create<MediaHostingStore>()(
persist(
(set) => ({
uploadMode: 'random',
preferredProvider: 'catbox',
setUploadMode: (mode) => set({ uploadMode: mode }),
setPreferredProvider: (provider) => set({ preferredProvider: provider }),
}),
{
name: 'media-hosting-storage',
version: PERSIST_VERSION,
migrate: (persistedState, version) => {
if (version < PERSIST_VERSION) {
return migrate(persistedState);
}
return persistedState as MediaHostingStore;
},
},
),
);
export default useMediaHostingStore;