diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 95c6a5f..8e9590e 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -17,15 +17,15 @@ interface IBlog { interface IUser { Type: "ADD_USER" Name?: string; - Email?: string; Wallet: string; Image?: string; CID?: string; Date?: Date; + Bio?: string; } interface IDatabase { Initialized: boolean; Blogs: IBlog[]; - Users: IUser[]; + Users: { [key: string]: IUser; }; } diff --git a/src/components/BlogComponent.tsx b/src/components/BlogComponent.tsx index d72a8aa..c4f76e0 100644 --- a/src/components/BlogComponent.tsx +++ b/src/components/BlogComponent.tsx @@ -1,5 +1,6 @@ import React from "react"; import Avatar from 'react-avatar'; +import { useSelector } from "react-redux"; interface IBlogComponent { blog: IBlog; @@ -7,12 +8,13 @@ interface IBlogComponent { const BlogComponent = (props: IBlogComponent) => { const { blog } = props; + const users = useSelector((state) => state.db.Users); return (
- -
{blog.Creator}
+ +
{users[blog.Creator]?.Name || blog.Creator}
{blog.Date?.toLocaleString() || ""}

{blog.Title}

diff --git a/src/components/Profile.tsx b/src/components/Profile.tsx index 8f6294f..e2fd8b7 100644 --- a/src/components/Profile.tsx +++ b/src/components/Profile.tsx @@ -1,11 +1,101 @@ -import React from 'react'; +import { Button, TextField } from '@mui/material'; +import React, { useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { createUser } from "slices/dbSlice"; +import { AppDispatch } from "slices/store"; +import { NotificationManager } from "./Notification"; +import { useNavigate } from "react-router-dom"; interface IProfile {} const Profile = (props: IProfile) => { + const navigate = useNavigate(); + const dispatch = useDispatch(); + const [name, setName] = useState(""); + const [bio, setBio] = useState(""); + const account = useSelector( + (state) => state.web3.selectedAddress + ); + const [avatar, setAvatar] = useState(null); + + const onCreate = () => { + if (!account) { + NotificationManager.warning("Please connect to the wallet", "Warn"); + return; + } + + const user: IUser = { + Type: "ADD_USER", + Name: name, + Wallet: account, + Bio: bio + }; + + dispatch(createUser(user)) + .unwrap() + .then((user) => { + // handle result here + NotificationManager.success(`"${user.Name}" Created`, "User Created"); + navigate("/main"); + console.log({user: user}); + }) + .catch((rejectedValueOrSerializedError) => { + // handle error here + console.log({rejectedValueOrSerializedError}); + }); + }; + + const onFile = (e: any) => { + setAvatar(e.target.files[0]); + } + return (
- Profile +

Profile

+ + setName(e.target.value)} + value={name} + /> + + setBio(e.target.value)} + value={bio} + /> +
+ +
); }; diff --git a/src/slices/dbSlice.ts b/src/slices/dbSlice.ts index 2105200..640fe95 100644 --- a/src/slices/dbSlice.ts +++ b/src/slices/dbSlice.ts @@ -9,7 +9,7 @@ const client = new Web3Storage({ token: config.REACT_APP_WEB3_STORAGE_API_TOKEN const initialState = { Initialized: false, Blogs: [] as IBlog[], - Users: [] as IUser[] + Users: {} as { [key: string]: IUser; } } as IDatabase; export const createBlog = createAsyncThunk('createBlog', async (blog: IBlog, {rejectWithValue}) => { @@ -29,6 +29,23 @@ export const createBlog = createAsyncThunk('createBlog', async (blog: IBlog, {re } }); +export const createUser = createAsyncThunk('createUser', async (user: IUser, {rejectWithValue}) => { + try { + const title = convertTitle(user.Wallet); + let blob = new File([JSON.stringify(user, null, 2)], title + "_2", {type: "application/json"}) + const rootCid = await client.put([blob], { + name: title, + maxRetries: 3, + wrapWithDirectory: false + }); + + user.CID = rootCid; + return user; + } catch (err: any) { + return rejectWithValue(err.response.data); + } +}); + export const dbSlice = createSlice({ name: 'dbSlice', // `createSlice` will infer the state type from the `initialState` argument @@ -38,23 +55,29 @@ export const dbSlice = createSlice({ // dispose individual action const blogs = state.Blogs; + const users = state.Users; const lastSyncNumber = getStorageItem(config.LAST_SYNC_NUMBER, 0) || 0; const startNumber = state.Initialized ? action.payload : 0; for (let i = startNumber; i < lastSyncNumber; i++) { const data = getStorageItem(config.LAST_SYNC_RECORD + i, {}) || {}; + data.Date = new Date(data.Date); switch (data.Type) { case "ADD_BLOG": - data.Date = new Date(data.Date); blogs.push(data); break; + case "ADD_USER": + users[data.Wallet] = data; + break; + default: break; } } state.Blogs = blogs; + state.Users = users; state.Initialized = true; } }, diff --git a/src/styles/components/_profile.scss b/src/styles/components/_profile.scss index 2d25904..5b066f8 100644 --- a/src/styles/components/_profile.scss +++ b/src/styles/components/_profile.scss @@ -1,2 +1,5 @@ .profile-page { + display: flex; + flex-direction: column; + gap: 20px; } \ No newline at end of file