Files
ppc_amnet/amnet-native/app/CardManager.tsx
T
2024-09-04 12:12:58 +01:00

82 lines
3.0 KiB
TypeScript

import * as Clipboard from "expo-clipboard";
import {FlatList, View} from "react-native";
import React, {useCallback, useMemo} from "react";
import {Button, useTheme} from "react-native-paper";
import {CreditCard, Plus} from "lucide-react-native";
import ContextMenu from "react-native-context-menu-view";
import {AMCard} from "../models/AMCard";
import {AimeCard} from "../components/AimeCard";
import RealmContext from "../models/RealmContext";
import {EmptyStatePlaceholder} from "../components/EmptyStatePlaceholder";
const {useQuery, useRealm} = RealmContext;
function CardEntry(props: { card: AMCard, navigation: any }) {
const realm = useRealm();
const callback = useCallback(async (indexPath: number[]) => {
if (!props.card.isValid()) {
return;
}
switch (indexPath.toString()) {
// copy card
case "0":
await Clipboard.setStringAsync(props.card.code);
return;
// edit card
case "1,0":
props.navigation.navigate('add-card', {cardId: props.card.code, cardName: props.card.name});
return;
// remove card
case "1,1":
realm.write(() => realm.delete(props.card));
return;
}
}, [realm, props.card, props.navigation]);
return (
<ContextMenu
onPress={e => callback(e.nativeEvent?.indexPath)}
actions={[
{title: "Copy Card Number", systemIcon: "doc.on.doc"},
{
title: "",
inlineChildren: true,
actions: [
{title: "Edit Card", systemIcon: "square.and.pencil"},
{title: "Delete Card", destructive: true, systemIcon: "trash"}]
}]}>
<AimeCard card={props.card} showFullCardNumber/>
</ContextMenu>
);
}
export default function CardManager({navigation}) {
const query = useQuery(AMCard);
const cards = useMemo(() => query.sorted("added", true), [query]);
const theme = useTheme();
if (!cards.length) {
return (
<View style={{flex: 1, gap: 10, justifyContent: "center", alignItems: "center"}}>
<EmptyStatePlaceholder message="No cards added yet" icon={<CreditCard color="gray"/>}/>
<Button mode="text" onPress={() => navigation.navigate('add-card')}
icon={() => <Plus size={18} color={theme.colors.primary}/>}>Add Card</Button>
</View>
)
}
return (
<FlatList contentInsetAdjustmentBehavior="always"
style={{padding: 16, paddingTop: 24}}
data={cards}
keyExtractor={i => i._id.toString()}
contentContainerStyle={{paddingBottom: 120}}
ItemSeparatorComponent={() => <View style={{height: 15}}/>}
renderItem={i => <CardEntry card={i.item} navigation={navigation}/>}/>
)
}