74 lines
1.9 KiB
JavaScript
74 lines
1.9 KiB
JavaScript
|
import localforage from "localforage";
|
||
|
import { matchSorter } from "match-sorter";
|
||
|
import sortBy from "sort-by";
|
||
|
|
||
|
export async function getContacts(query) {
|
||
|
await fakeNetwork(`getContacts:${query}`);
|
||
|
let contacts = await localforage.getItem("contacts");
|
||
|
if (!contacts) contacts = [];
|
||
|
if (query) {
|
||
|
contacts = matchSorter(contacts, query, { keys: ["first", "last"] });
|
||
|
}
|
||
|
return contacts.sort(sortBy("last", "createdAt"));
|
||
|
}
|
||
|
|
||
|
export async function createContact() {
|
||
|
await fakeNetwork();
|
||
|
let id = Math.random().toString(36).substring(2, 9);
|
||
|
let contact = { id, createdAt: Date.now() };
|
||
|
let contacts = await getContacts();
|
||
|
contacts.unshift(contact);
|
||
|
await set(contacts);
|
||
|
return contact;
|
||
|
}
|
||
|
|
||
|
export async function getContact(id) {
|
||
|
await fakeNetwork(`contact:${id}`);
|
||
|
let contacts = await localforage.getItem("contacts");
|
||
|
let contact = contacts.find(contact => contact.id === id);
|
||
|
return contact ?? null;
|
||
|
}
|
||
|
|
||
|
export async function updateContact(id, updates) {
|
||
|
await fakeNetwork();
|
||
|
let contacts = await localforage.getItem("contacts");
|
||
|
let contact = contacts.find(contact => contact.id === id);
|
||
|
if (!contact) throw new Error("No contact found for", id);
|
||
|
Object.assign(contact, updates);
|
||
|
await set(contacts);
|
||
|
return contact;
|
||
|
}
|
||
|
|
||
|
export async function deleteContact(id) {
|
||
|
let contacts = await localforage.getItem("contacts");
|
||
|
let index = contacts.findIndex(contact => contact.id === id);
|
||
|
if (index > -1) {
|
||
|
contacts.splice(index, 1);
|
||
|
await set(contacts);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function set(contacts) {
|
||
|
return localforage.setItem("contacts", contacts);
|
||
|
}
|
||
|
|
||
|
// fake a cache so we don't slow down stuff we've already seen
|
||
|
let fakeCache = {};
|
||
|
|
||
|
async function fakeNetwork(key) {
|
||
|
if (!key) {
|
||
|
fakeCache = {};
|
||
|
}
|
||
|
|
||
|
if (fakeCache[key]) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
fakeCache[key] = true;
|
||
|
return new Promise(res => {
|
||
|
setTimeout(res, Math.random() * 800);
|
||
|
});
|
||
|
}
|