import { useState, type ChangeEvent, type ReactElement } from 'react'; import type { AmexSource, CalSource, DiscountSource, IsracardSource, MaxSource, OtsarHahayalSource, PoalimSource, SourceConfig, SourceType, } from './source-types.js'; type FieldProps = { label: string; name: string; value: string; required?: boolean; password?: boolean; onChange(e: ChangeEvent): void; }; function Field({ label, name, value, required, password, onChange }: FieldProps): ReactElement { const [show, setShow] = useState(false); return (
{password && ( )}
); } type ListFieldProps = { label: string; name: string; value: string; // comma-separated display value hint?: string; onChange(e: ChangeEvent): void; }; function ListField({ label, name, value, hint, onChange }: ListFieldProps): ReactElement { return (
{hint && {hint}}
); } function toList(csv: string): string[] | undefined { const parts = csv .split(',') .map(s => s.trim()) .filter(Boolean); const unique = [...new Set(parts)]; return unique.length > 0 ? unique : undefined; } function fromList(arr?: string[]): string { return arr ? arr.join(', ') : ''; } type PoalimFormProps = { initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function PoalimForm({ initial = {}, onSave, onCancel }: PoalimFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', userCode: initial.userCode ?? '', password: initial.password ?? '', isBusinessAccount: initial.options?.isBusinessAccount ?? false, acceptedAccountNumbers: fromList(initial.options?.acceptedAccountNumbers), acceptedBranchNumbers: fromList(initial.options?.acceptedBranchNumbers), ignoredAccountNumbers: fromList(initial.options?.ignoredAccountNumbers), ignoredBranchNumbers: fromList(initial.options?.ignoredBranchNumbers), }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); const opts = { isBusinessAccount: fields.isBusinessAccount ?? false, acceptedAccountNumbers: toList(fields.acceptedAccountNumbers), acceptedBranchNumbers: toList(fields.acceptedBranchNumbers), ignoredAccountNumbers: toList(fields.ignoredAccountNumbers), ignoredBranchNumbers: toList(fields.ignoredBranchNumbers), }; const hasOpts = Object.values(opts).some(v => v !== undefined); onSave({ nickname: fields.nickname || undefined, userCode: fields.userCode, password: fields.password, options: hasOpts ? opts : undefined, }); }} >
); } type DiscountFormProps = { initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function DiscountForm({ initial = {}, onSave, onCancel }: DiscountFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', ID: initial.ID ?? '', password: initial.password ?? '', code: initial.code ?? '', }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); onSave({ nickname: fields.nickname || undefined, ID: fields.ID, password: fields.password, code: fields.code || undefined, }); }} >
); } type IsracardAmexFormProps = { sourceType: 'isracard' | 'amex'; initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function IsracardAmexForm({ initial = {}, onSave, onCancel, }: IsracardAmexFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', ownerId: initial.ownerId ?? '', password: initial.password ?? '', last6Digits: initial.last6Digits ?? '', acceptedCardNumbers: fromList(initial.options?.acceptedCardNumbers), ignoredCardNumbers: fromList(initial.options?.ignoredCardNumbers), }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); const opts = { acceptedCardNumbers: toList(fields.acceptedCardNumbers), ignoredCardNumbers: toList(fields.ignoredCardNumbers), }; const hasOpts = Object.values(opts).some(v => v !== undefined); onSave({ nickname: fields.nickname || undefined, ownerId: fields.ownerId, password: fields.password, last6Digits: fields.last6Digits, options: hasOpts ? opts : undefined, }); }} >
); } type CalFormProps = { initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function CalForm({ initial = {}, onSave, onCancel }: CalFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', username: initial.username ?? '', password: initial.password ?? '', last4Digits: initial.last4Digits ?? '', acceptedCardNumbers: fromList(initial.options?.acceptedCardNumbers), ignoredCardNumbers: fromList(initial.options?.ignoredCardNumbers), }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); const opts = { acceptedCardNumbers: toList(fields.acceptedCardNumbers), ignoredCardNumbers: toList(fields.ignoredCardNumbers), }; const hasOpts = Object.values(opts).some(v => v !== undefined); onSave({ nickname: fields.nickname || undefined, username: fields.username, password: fields.password, last4Digits: fields.last4Digits, options: hasOpts ? opts : undefined, }); }} >
); } type MaxFormProps = { initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function MaxForm({ initial = {}, onSave, onCancel }: MaxFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', username: initial.username ?? '', password: initial.password ?? '', acceptedCardNumbers: fromList(initial.options?.acceptedCardNumbers), ignoredCardNumbers: fromList(initial.options?.ignoredCardNumbers), }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); const opts = { acceptedCardNumbers: toList(fields.acceptedCardNumbers), ignoredCardNumbers: toList(fields.ignoredCardNumbers), }; const hasOpts = Object.values(opts).some(v => v !== undefined); onSave({ nickname: fields.nickname || undefined, username: fields.username, password: fields.password, options: hasOpts ? opts : undefined, }); }} >
); } type OtsarHahayalFormProps = { initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function OtsarHahayalForm({ initial = {}, onSave, onCancel, }: OtsarHahayalFormProps): ReactElement { const [fields, setFields] = useState({ nickname: initial.nickname ?? '', userCode: initial.userCode ?? '', password: initial.password ?? '', }); function set(e: ChangeEvent) { setFields(f => ({ ...f, [e.target.name]: e.target.value })); } return (
{ e.preventDefault(); onSave({ nickname: fields.nickname || undefined, userCode: fields.userCode, password: fields.password, }); }} >
); } type SourceFormProps = { sourceType: SourceType; initial?: Partial; onSave(data: Omit): void; onCancel(): void; }; export function SourceForm({ sourceType, initial, onSave, onCancel, }: SourceFormProps): ReactElement { switch (sourceType) { case 'poalim': return ( } onSave={onSave} onCancel={onCancel} /> ); case 'discount': return ( } onSave={onSave} onCancel={onCancel} /> ); case 'isracard': case 'amex': return ( } onSave={onSave} onCancel={onCancel} /> ); case 'cal': return ( } onSave={onSave} onCancel={onCancel} /> ); case 'max': return ( } onSave={onSave} onCancel={onCancel} /> ); case 'otsar-hahayal': return ( } onSave={onSave} onCancel={onCancel} /> ); } }