refactor: add CardBase and ModalBase components
- Add CardBase: reusable card with header, content, footer - Configurable via props: padding, border, text size, background - Add ModalBase: modal wrapper using CardBase internally - Provides backdrop, click-outside-to-close, Android back button - Refactor EventCardBase to use CardBase - Refactor DeleteEventModal to use ModalBase - Refactor EventOverlay (calendar.tsx) to use ModalBase - Update CLAUDE.md with component documentation
This commit is contained in:
74
apps/client/src/components/ModalBase.tsx
Normal file
74
apps/client/src/components/ModalBase.tsx
Normal file
@@ -0,0 +1,74 @@
|
||||
import { Modal, Pressable } from "react-native";
|
||||
import { ReactNode } from "react";
|
||||
import { useThemeStore } from "../stores/ThemeStore";
|
||||
import { CardBase } from "./CardBase";
|
||||
|
||||
type ModalBaseProps = {
|
||||
visible: boolean;
|
||||
onClose: () => void;
|
||||
title: string;
|
||||
subtitle?: string;
|
||||
children: ReactNode;
|
||||
footer?: {
|
||||
label: string;
|
||||
onPress: () => void;
|
||||
};
|
||||
scrollable?: boolean;
|
||||
maxContentHeight?: number;
|
||||
};
|
||||
|
||||
export const ModalBase = ({
|
||||
visible,
|
||||
onClose,
|
||||
title,
|
||||
subtitle,
|
||||
children,
|
||||
footer,
|
||||
scrollable,
|
||||
maxContentHeight,
|
||||
}: ModalBaseProps) => {
|
||||
const { theme } = useThemeStore();
|
||||
|
||||
return (
|
||||
<Modal
|
||||
visible={visible}
|
||||
transparent={true}
|
||||
animationType="fade"
|
||||
onRequestClose={onClose}
|
||||
>
|
||||
<Pressable
|
||||
className="flex-1 justify-center items-center"
|
||||
style={{ backgroundColor: "rgba(0,0,0,0.5)" }}
|
||||
onPress={onClose}
|
||||
>
|
||||
<Pressable
|
||||
className="w-11/12 rounded-2xl overflow-hidden"
|
||||
style={{
|
||||
backgroundColor: theme.primeBg,
|
||||
borderWidth: 4,
|
||||
borderColor: theme.borderPrimary,
|
||||
}}
|
||||
onPress={(e) => e.stopPropagation()}
|
||||
>
|
||||
<CardBase
|
||||
title={title}
|
||||
subtitle={subtitle}
|
||||
footer={footer}
|
||||
scrollable={scrollable}
|
||||
maxContentHeight={maxContentHeight}
|
||||
borderWidth={0}
|
||||
headerBorderWidth={3}
|
||||
headerPadding={4}
|
||||
contentPadding={4}
|
||||
headerTextSize="text-lg"
|
||||
contentBg={theme.primeBg}
|
||||
>
|
||||
{children}
|
||||
</CardBase>
|
||||
</Pressable>
|
||||
</Pressable>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default ModalBase;
|
||||
Reference in New Issue
Block a user