mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 18:19:43 +00:00
Add MCP server and enhance AI content tools
Implement self-hosted MCP server for admin actions, update AI generation tools in admin dashboard, and refine mobile app stores and components.
This commit is contained in:
1 parent
b0f1700e40
commit
4e40b92b16
71 files changed
+10511
-1008
No files matched your search
@@ -42,15 +42,15 @@ const getIntensityDisplay = (pack: QuestionPack) => {
|
||||
const min = isValidIntensity(pack.min_intensity) ? pack.min_intensity : null;
|
||||
const max = isValidIntensity(pack.max_intensity) ? pack.max_intensity : null;
|
||||
const avg = typeof pack.avg_intensity === "number" ? clampIntensity(pack.avg_intensity) : null;
|
||||
const fallback = avg ?? (pack.is_explicit ? 5 : 2);
|
||||
|
||||
const flameCount = max ?? avg ?? (pack.is_explicit ? 5 : 2);
|
||||
const label = min && max
|
||||
? min === max
|
||||
? INTENSITY_LABELS[min]
|
||||
: `${INTENSITY_LABELS[min]} - ${INTENSITY_LABELS[max]}`
|
||||
: INTENSITY_LABELS[flameCount];
|
||||
const minCount = min ?? max ?? fallback;
|
||||
const maxCount = max ?? min ?? fallback;
|
||||
const label = minCount === maxCount
|
||||
? INTENSITY_LABELS[minCount]
|
||||
: `${INTENSITY_LABELS[minCount]} - ${INTENSITY_LABELS[maxCount]}`;
|
||||
|
||||
return { flameCount, label };
|
||||
return { minCount, maxCount, label };
|
||||
};
|
||||
|
||||
|
||||
@@ -100,14 +100,19 @@ function PackRow({ pack, isEnabled, isPremiumLocked, isExpanded, onToggle, onPre
|
||||
</Text>
|
||||
<View style={styles.packIntensityRow}>
|
||||
<View style={styles.packIntensityFlames}>
|
||||
{Array.from({ length: 5 }).map((_, index) => (
|
||||
<Ionicons
|
||||
key={`intensity-${pack.id}-${index}`}
|
||||
name={index < intensityDisplay.flameCount ? "flame" : "flame-outline"}
|
||||
size={12}
|
||||
color={index < intensityDisplay.flameCount ? colors.primary : colors.textTertiary}
|
||||
/>
|
||||
))}
|
||||
{Array.from({ length: 5 }).map((_, index) => {
|
||||
const level = index + 1;
|
||||
const isInRange = level >= intensityDisplay.minCount && level <= intensityDisplay.maxCount;
|
||||
|
||||
return (
|
||||
<Ionicons
|
||||
key={`intensity-${pack.id}-${index}`}
|
||||
name={isInRange ? "flame" : "flame-outline"}
|
||||
size={12}
|
||||
color={isInRange ? colors.primary : colors.textTertiary}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</View>
|
||||
<Text style={styles.packIntensityText}>{intensityDisplay.label}</Text>
|
||||
</View>
|
||||
@@ -462,7 +467,15 @@ export default function QuestionPacksScreen() {
|
||||
|
||||
{(packsByCategory.get("uncategorized")?.length || 0) > 0 && (
|
||||
<CategorySection
|
||||
category={{ id: "uncategorized", name: "Other", description: null, icon: "📁", sort_order: 999, created_at: "" }}
|
||||
category={{
|
||||
id: "uncategorized",
|
||||
name: "Other",
|
||||
description: null,
|
||||
icon: "📁",
|
||||
sort_order: 999,
|
||||
created_at: "",
|
||||
is_public: true
|
||||
}}
|
||||
packs={packsByCategory.get("uncategorized") || []}
|
||||
enabledPackIds={enabledPackIds}
|
||||
hasPremiumAccess={hasPremiumAccess}
|
||||
@@ -727,6 +740,7 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
packIntensityFlames: {
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
gap: 2,
|
||||
},
|
||||
packIntensityText: {
|
||||
|
||||
@@ -71,7 +71,7 @@ export default function PackDetailsScreen() {
|
||||
try {
|
||||
const { data, error } = await supabase
|
||||
.from("questions")
|
||||
.select("*")
|
||||
.select("id, pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, created_at")
|
||||
.eq("pack_id", id)
|
||||
.order("created_at");
|
||||
|
||||
|
||||
Reference in new issue
Block a user