import { Button, Card, Collection, Flex, Heading, TextField } from '@aws-amplify/ui-react'; import { API } from 'aws-amplify'; import _ from 'lodash'; import pluralize from 'pluralize'; import { useState } from 'react'; import { OperationStateIndicator, useOperationStateWrapper } from '.'; import { HarnessContext, HarnessContextType } from './HarnessContext'; type DetailState = 'view' | 'edit'; export type SimpleIdRecord = T & { id: string }; export type SimpleIdRecordProps = { record: SimpleIdRecord }; export type RecordComponentType = (props: SimpleIdRecordProps) => JSX.Element; export type createDetailComponentProps = { deleteMutation: string; recordName: string; ViewComp: RecordComponentType; EditComp: RecordComponentType; }; export const createDetailComponent = ({ deleteMutation, recordName, ViewComp, EditComp }: createDetailComponentProps): RecordComponentType => { const capitalizedRecordName = _.capitalize(recordName) return ({ record }: SimpleIdRecordProps) => { const { wrappedFn, opState } = useOperationStateWrapper(async ({ authMode }: HarnessContextType) => await API.graphql({ query: deleteMutation, variables: { input: { id: record.id } }, authMode })); const [detailState, setDetailState] = useState('view'); return ( { context => { capitalizedRecordName } ID: { record.id } { detailState === 'view' ? : } { detailState === 'view' ? : } } ); }; }; export type createCreateRecordComponentProps = { recordName: string; createMutation: string; sentinelData: any; }; export const createCreateRecordComponent = ({ recordName, createMutation, sentinelData }: createCreateRecordComponentProps) => { const capitalizedRecordName = _.capitalize(recordName); return () => { const { wrappedFn, opState } = useOperationStateWrapper(async ({ authMode }: HarnessContextType) => await API.graphql({ query: createMutation, variables: { input: { ...sentinelData, id } }, authMode })); const [id, setId] = useState(''); return ( { context => Create A { capitalizedRecordName } { setId(event.target.value) }}/> } ); }; }; export type createGetComponentProps = { getQuery: string; recordName: string; DetailComp: RecordComponentType; }; export const createGetRecordComponent = ({ getQuery, recordName, DetailComp }: createGetComponentProps) => { const getRecordDataLoc = _.camelCase(`get ${recordName}`); const capitalizedRecordName = _.capitalize(recordName); return () => { const [retrievedRecord, setRecord] = useState(); const [id, setId] = useState(''); const { wrappedFn, opState } = useOperationStateWrapper(async ({ authMode }: HarnessContextType) => { const response = await API.graphql({ query: getQuery, variables: { id }, authMode}); // @ts-ignore setRecord(response.data[getRecordDataLoc]); }); return ( { context => Get A { capitalizedRecordName } { setId(event.target.value) }}/>
{ retrievedRecord && } /> }
}
); }; }; export type createListComponentProps = { listQuery: string; recordName: string; DetailComp: RecordComponentType; }; export const createListComponent = ({ listQuery, recordName, DetailComp }: createListComponentProps) => { const listRecordsDataLoc = _.camelCase(`list ${pluralize(recordName)}`); const pluralizedRecordName = pluralize(recordName); const capitalizedPluralizedRecordName = _.capitalize(pluralizedRecordName); return () => { const [records, setRecords] = useState[]>([]); const { wrappedFn, opState } = useOperationStateWrapper(async ({ authMode }: HarnessContextType) => { const response = await API.graphql({ query: listQuery, authMode }) as any; setRecords(response.data[listRecordsDataLoc].items); }); return ( { context => List { capitalizedPluralizedRecordName }
{ (record: SimpleIdRecord) => }
}
); }; }; export type createViewCompProps = { recordName: string; fields: (keyof T)[]; }; export const createViewComp = ({ recordName, fields }: createViewCompProps): RecordComponentType => { return ({ record }: SimpleIdRecordProps) => { return (
    { fields.map((field) =>
  • { `${String(field)}: ${JSON.stringify(record[field])}`}
  • )}
); }; }; export type createEditCompProps = { recordName: string; updateMutation: string; fields: (keyof T)[]; }; export const createEditComp = ({ updateMutation, fields, recordName }: createEditCompProps): RecordComponentType => { return ({ record }: SimpleIdRecordProps) => { const [updatedFields, setUpdatedFields] = useState({}); const { wrappedFn, opState } = useOperationStateWrapper(async ({ authMode }: HarnessContextType) => await API.graphql({ query: updateMutation, variables: { input: { ...updatedFields, id: record.id} }, authMode })); const updateField = (fieldName: keyof T, updatedValue: string) => { setUpdatedFields((oldFields) => ({ ...oldFields, [fieldName]: updatedValue })); }; return ( { context => { fields.map(field => { return ( { updateField(field, event.target.value); }} /> ) }) } } ); }; };