d3275207bd
Commit 39d5e5d added `Bearer ${apiKey}` to the axios client but this
Postiz instance expects the raw API key with no prefix. Reverting to
the original format that was confirmed working in the initial commit.
Same fix applied to the image upload header in compose.tsx.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
145 lines
3.6 KiB
TypeScript
145 lines
3.6 KiB
TypeScript
import axios, { AxiosInstance } from "axios";
|
|
import * as SecureStore from "expo-secure-store";
|
|
import React, {
|
|
createContext,
|
|
useCallback,
|
|
useContext,
|
|
useEffect,
|
|
useState,
|
|
} from "react";
|
|
|
|
const API_KEY_STORAGE = "postiz_api_key";
|
|
const BASE_URL_STORAGE = "postiz_base_url";
|
|
const DEFAULT_BASE_URL = "https://postiz.gyozamancave.fr/api/public/v1";
|
|
|
|
export interface PostizIntegration {
|
|
id: string;
|
|
name: string;
|
|
type: string;
|
|
picture?: string;
|
|
identifier?: string;
|
|
internalType?: string;
|
|
}
|
|
|
|
export interface PostizMediaItem {
|
|
id: string;
|
|
path: string;
|
|
}
|
|
|
|
export interface PostizPost {
|
|
id: string;
|
|
content: string;
|
|
state: "QUEUE" | "PUBLISHED" | "ERROR" | "DRAFT";
|
|
publishDate: string;
|
|
integration?: PostizIntegration;
|
|
integrations?: PostizIntegration[];
|
|
image?: PostizMediaItem[];
|
|
group?: string;
|
|
}
|
|
|
|
export interface PostizUploadResult {
|
|
id: string;
|
|
path: string;
|
|
}
|
|
|
|
interface PostizContextValue {
|
|
apiKey: string;
|
|
baseUrl: string;
|
|
isConfigured: boolean;
|
|
isLoading: boolean;
|
|
client: AxiosInstance | null;
|
|
saveSettings: (apiKey: string, baseUrl: string) => Promise<void>;
|
|
clearSettings: () => Promise<void>;
|
|
}
|
|
|
|
const PostizContext = createContext<PostizContextValue>({
|
|
apiKey: "",
|
|
baseUrl: DEFAULT_BASE_URL,
|
|
isConfigured: false,
|
|
isLoading: true,
|
|
client: null,
|
|
saveSettings: async () => {},
|
|
clearSettings: async () => {},
|
|
});
|
|
|
|
function createClient(apiKey: string, baseUrl: string): AxiosInstance {
|
|
const normalizedUrl = baseUrl.endsWith("/") ? baseUrl : baseUrl + "/";
|
|
const instance = axios.create({
|
|
baseURL: normalizedUrl,
|
|
headers: {
|
|
Authorization: apiKey,
|
|
"Content-Type": "application/json",
|
|
},
|
|
timeout: 15000,
|
|
});
|
|
instance.interceptors.request.use((config) => {
|
|
console.log(">>> REQUEST:", config.method?.toUpperCase(), (config.baseURL || "") + (config.url || ""));
|
|
return config;
|
|
});
|
|
return instance;
|
|
}
|
|
|
|
export function PostizProvider({ children }: { children: React.ReactNode }) {
|
|
const [apiKey, setApiKey] = useState("");
|
|
const [baseUrl, setBaseUrl] = useState(DEFAULT_BASE_URL);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const [client, setClient] = useState<AxiosInstance | null>(null);
|
|
|
|
useEffect(() => {
|
|
(async () => {
|
|
try {
|
|
const storedKey = await SecureStore.getItemAsync(API_KEY_STORAGE);
|
|
const storedUrl = await SecureStore.getItemAsync(BASE_URL_STORAGE);
|
|
if (storedKey) {
|
|
const url = (storedUrl || DEFAULT_BASE_URL).replace(/\/$/, "");
|
|
setApiKey(storedKey);
|
|
setBaseUrl(url);
|
|
setClient(() => createClient(storedKey, url));
|
|
}
|
|
} catch {
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
})();
|
|
}, []);
|
|
|
|
const saveSettings = useCallback(
|
|
async (newApiKey: string, newBaseUrl: string) => {
|
|
await SecureStore.setItemAsync(API_KEY_STORAGE, newApiKey);
|
|
await SecureStore.setItemAsync(BASE_URL_STORAGE, newBaseUrl);
|
|
setApiKey(newApiKey);
|
|
setBaseUrl(newBaseUrl);
|
|
setClient(() => createClient(newApiKey, newBaseUrl));
|
|
},
|
|
[]
|
|
);
|
|
|
|
const clearSettings = useCallback(async () => {
|
|
await SecureStore.deleteItemAsync(API_KEY_STORAGE);
|
|
await SecureStore.deleteItemAsync(BASE_URL_STORAGE);
|
|
setApiKey("");
|
|
setBaseUrl(DEFAULT_BASE_URL);
|
|
setClient(null);
|
|
}, []);
|
|
|
|
return (
|
|
<PostizContext.Provider
|
|
value={{
|
|
apiKey,
|
|
baseUrl,
|
|
isConfigured: !!apiKey,
|
|
isLoading,
|
|
client,
|
|
saveSettings,
|
|
clearSettings,
|
|
}}
|
|
>
|
|
{children}
|
|
</PostizContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function usePostiz() {
|
|
return useContext(PostizContext);
|
|
}
|