95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
import {
|
|
addBlockToDB,
|
|
createAccount,
|
|
getActiveAccount,
|
|
getBlocks,
|
|
getLastLogin,
|
|
removeBlockFromDB,
|
|
updateAccount,
|
|
} from "@utils/storage";
|
|
import { create } from "zustand";
|
|
import { createJSONStorage, persist } from "zustand/middleware";
|
|
import { immer } from "zustand/middleware/immer";
|
|
|
|
export const useActiveAccount = create(
|
|
immer(
|
|
persist(
|
|
(set: any, get: any) => ({
|
|
account: null,
|
|
blocks: null,
|
|
lastLogin: null,
|
|
create: async (npub: string, pubkey: string, privkey: string) => {
|
|
const response = await createAccount(npub, pubkey, privkey, null, 1);
|
|
if (response) {
|
|
const activeAccount = await getActiveAccount();
|
|
await addBlockToDB(
|
|
activeAccount.id,
|
|
0,
|
|
"Freedom Awaits",
|
|
"https://void.cat/d/88M2kWHtjZLRtdyfAajHbu.webp",
|
|
);
|
|
set({
|
|
account: activeAccount,
|
|
});
|
|
}
|
|
},
|
|
fetch: async () => {
|
|
const response = await getActiveAccount();
|
|
set({ account: response });
|
|
},
|
|
fetchLastLogin: async () => {
|
|
const response = await getLastLogin();
|
|
set({ lastLogin: parseInt(response) });
|
|
},
|
|
fetchBlocks: async () => {
|
|
const account = get().account;
|
|
const response = await getBlocks(account.id);
|
|
set({ blocks: response });
|
|
},
|
|
addBlock: (kind: number, title: string, content: string) => {
|
|
const account = get().account;
|
|
// add to db
|
|
addBlockToDB(account.id, kind, title, content);
|
|
// update state
|
|
set((state: any) => ({
|
|
blocks: [
|
|
...state.blocks,
|
|
{
|
|
id: account.id + kind,
|
|
account_id: account.id,
|
|
kind,
|
|
title,
|
|
content,
|
|
},
|
|
],
|
|
}));
|
|
},
|
|
removeBlock: (id: string) => {
|
|
// remove from db
|
|
removeBlockFromDB(id);
|
|
// update state
|
|
set((state: any) => {
|
|
const target = state.blocks.findIndex(
|
|
(b: { id: string }) => b.id === id,
|
|
);
|
|
state.blocks.splice(target, 1);
|
|
});
|
|
},
|
|
updateFollows: (list: any) => {
|
|
const account = get().account;
|
|
// update db
|
|
updateAccount("follows", list, account.pubkey);
|
|
// update state
|
|
set((state: any) => ({
|
|
account: { ...state.account, follows: JSON.stringify(list) },
|
|
}));
|
|
},
|
|
}),
|
|
{
|
|
name: "account",
|
|
storage: createJSONStorage(() => sessionStorage),
|
|
},
|
|
),
|
|
),
|
|
);
|