- Add ContactMaybeWithJsonStrings type usage for internal database operations - Implement $normalizeContacts() method to handle both JSON string and array formats - Update $contacts(), $getContact(), and $getAllContacts() to use normalization - Fix $updateContact() to properly convert contactMethods arrays to JSON strings - Add validation to filter out malformed contact method objects - Update ContactEditView to handle malformed data gracefully Resolves issue where contactMethods could be stored as JSON strings in database but expected as arrays in components, causing "Cannot create property 'label' on number '0'" errors.
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
export type ContactMethod = {
|
|
label: string;
|
|
type: string; // eg. "EMAIL", "SMS", "WHATSAPP", maybe someday "GOOGLE-CONTACT-API"
|
|
value: string;
|
|
};
|
|
|
|
export type Contact = {
|
|
//
|
|
// When adding a property:
|
|
// - Consider whether it should be added when exporting & sharing contacts, eg. DataExportSection
|
|
// - If it's a boolean, it should be converted from a 0/1 integer in PlatformServiceMixin._mapColumnsToValues
|
|
|
|
did: string;
|
|
contactMethods?: Array<ContactMethod>;
|
|
iViewContent?: boolean;
|
|
name?: string;
|
|
nextPubKeyHashB64?: string; // base64-encoded SHA256 hash of next public key
|
|
notes?: string;
|
|
profileImageUrl?: string;
|
|
publicKeyBase64?: string;
|
|
seesMe?: boolean; // cached value of the server setting
|
|
registered?: boolean; // cached value of the server setting
|
|
};
|
|
|
|
/**
|
|
* This is for those cases (eg. with a DB) where every field is a primitive (and not an object).
|
|
*
|
|
* This is so that we can reuse most of the type and don't have to maintain another copy.
|
|
* Another approach uses typescript conditionals: https://chatgpt.com/share/6855cdc3-ab5c-8007-8525-726612016eb2
|
|
*/
|
|
export type ContactWithJsonStrings = Omit<Contact, "contactMethods"> & {
|
|
contactMethods?: string;
|
|
};
|
|
|
|
/**
|
|
* This is for those cases (eg. with a DB) where field values may be all primitives or may be JSON values.
|
|
* See src/db/databaseUtil.ts parseJsonField for more details.
|
|
*
|
|
* This is so that we can reuse most of the type and don't have to maintain another copy.
|
|
* Another approach uses typescript conditionals: https://chatgpt.com/share/6855cdc3-ab5c-8007-8525-726612016eb2
|
|
*/
|
|
export type ContactMaybeWithJsonStrings = Omit<Contact, "contactMethods"> & {
|
|
contactMethods?: string | Array<ContactMethod>;
|
|
};
|
|
|
|
export const ContactSchema = {
|
|
contacts: "&did, name", // no need to key by other things
|
|
};
|