import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { Stack, useLocalSearchParams, useRouter } from "expo-router";
import { useEffect } from "react";
import { ActivityIndicator, Alert, Pressable, StyleSheet, Text, View } from "react-native";
import { getCard, publishCard, saveCard } from "../../src/api/cards";
import { BuilderCanvas } from "../../src/components/builder/BuilderCanvas";
import { useCardStore } from "../../src/stores/cardStore";
export default function BuilderScreen() {
const { cardId } = useLocalSearchParams<{ cardId: string }>();
const router = useRouter();
const queryClient = useQueryClient();
const load = useCardStore((s) => s.load);
const storeCard = useCardStore((s) => s.card);
const { data, isLoading } = useQuery({
queryKey: ["card", cardId],
queryFn: () => getCard(cardId),
enabled: !!cardId,
});
useEffect(() => {
if (data) load(data.definition);
}, [data, load]);
const save = useMutation({
mutationFn: () => {
const def = useCardStore.getState().card;
if (!def) throw new Error("no card loaded");
return saveCard(cardId, def);
},
onSuccess: () => queryClient.invalidateQueries({ queryKey: ["cards"] }),
});
const publish = useMutation({
mutationFn: async () => {
const def = useCardStore.getState().card;
if (def) await saveCard(cardId, def);
return publishCard(cardId);
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["cards"] });
router.replace(`/card/${cardId}/view`);
},
onError: () => Alert.alert("Couldn't publish", "Check your plan's active-card limit."),
});
if (isLoading || !storeCard) {
return (
);
}
return (
(
save.mutate()} disabled={save.isPending}>
Save
publish.mutate()} disabled={publish.isPending}>
Publish
),
}}
/>
);
}
const styles = StyleSheet.create({
center: { flex: 1, alignItems: "center", justifyContent: "center", backgroundColor: "#0a0a0c" },
headerActions: { flexDirection: "row", gap: 16 },
headerBtn: { color: "#f5f5f7", fontWeight: "600", fontSize: 16 },
publish: { color: "#ff3b30" },
});