Add redux

This commit is contained in:
austinkelsay 2024-02-10 22:13:09 -06:00
parent 22fedb4203
commit e820e47148
9 changed files with 178 additions and 36 deletions

94
package-lock.json generated
View File

@ -8,12 +8,15 @@
"name": "plebdevs-new",
"version": "0.1.0",
"dependencies": {
"@reduxjs/toolkit": "^2.1.0",
"next": "14.0.4",
"next-auth": "^4.24.5",
"primeicons": "^6.0.1",
"primereact": "^10.2.1",
"react": "^18",
"react-dom": "^18"
"react-dom": "^18",
"react-redux": "^9.1.0",
"redux": "^5.0.1"
},
"devDependencies": {
"autoprefixer": "^10.0.1",
@ -438,6 +441,29 @@
"node": ">=14"
}
},
"node_modules/@reduxjs/toolkit": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.1.0.tgz",
"integrity": "sha512-nfJ/b4ZhzUevQ1ZPKjlDL6CMYxO4o7ZL7OSsvSOxzT/EN11LsBDgTqP7aedHtBrFSVoK7oTP1SbMWUwGb30NLg==",
"dependencies": {
"immer": "^10.0.3",
"redux": "^5.0.1",
"redux-thunk": "^3.1.0",
"reselect": "^5.0.1"
},
"peerDependencies": {
"react": "^16.9.0 || ^17.0.0 || ^18",
"react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
},
"peerDependenciesMeta": {
"react": {
"optional": true
},
"react-redux": {
"optional": true
}
}
},
"node_modules/@rushstack/eslint-patch": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz",
@ -486,6 +512,11 @@
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
"integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
},
"node_modules/@types/use-sync-external-store": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
"integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
},
"node_modules/@typescript-eslint/parser": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz",
@ -2313,6 +2344,15 @@
"node": ">= 4"
}
},
"node_modules/immer": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz",
"integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
}
},
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@ -3744,6 +3784,32 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-redux": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz",
"integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==",
"dependencies": {
"@types/use-sync-external-store": "^0.0.3",
"use-sync-external-store": "^1.0.0"
},
"peerDependencies": {
"@types/react": "^18.2.25",
"react": "^18.0",
"react-native": ">=0.69",
"redux": "^5.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"react-native": {
"optional": true
},
"redux": {
"optional": true
}
}
},
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@ -3780,6 +3846,19 @@
"node": ">=8.10.0"
}
},
"node_modules/redux": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="
},
"node_modules/redux-thunk": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
"integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
"peerDependencies": {
"redux": "^5.0.0"
}
},
"node_modules/reflect.getprototypeof": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
@ -3822,6 +3901,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/reselect": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz",
"integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg=="
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@ -4628,6 +4712,14 @@
"punycode": "^2.1.0"
}
},
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",

View File

@ -9,12 +9,15 @@
"lint": "next lint"
},
"dependencies": {
"@reduxjs/toolkit": "^2.1.0",
"next": "14.0.4",
"next-auth": "^4.24.5",
"primeicons": "^6.0.1",
"primereact": "^10.2.1",
"react": "^18",
"react-dom": "^18"
"react-dom": "^18",
"react-redux": "^9.1.0",
"redux": "^5.0.1"
},
"devDependencies": {
"autoprefixer": "^10.0.1",

View File

@ -2,29 +2,18 @@ import React from 'react';
import Image from 'next/image';
import { Button } from 'primereact/button';
import { Menubar } from 'primereact/menubar';
import { useSession, signIn, signOut } from 'next-auth/react';
import 'primereact/resources/primereact.min.css';
import 'primeicons/primeicons.css';
import styles from './navbar.module.css';
const Navbar = () => {
const { data: session } = useSession();
const handleAuthClick = () => {
if (session) {
signOut();
} else {
signIn();
}
};
const end = (
<Button
label={session ? "Logout" : "Login"}
label={"Login"}
icon="pi pi-user"
className="text-[#f8f8ff]"
rounded
onClick={handleAuthClick}
/>
);

View File

@ -1,18 +1,19 @@
import { PrimeReactProvider } from 'primereact/api';
import { Provider } from "react-redux";
import { store } from "@/redux/store";
import Navbar from '@/components/navbar/Navbar';
import { SessionProvider } from "next-auth/react"
import '@/styles/globals.css'
import 'primereact/resources/themes/lara-dark-indigo/theme.css';
export default function MyApp({
Component, pageProps: { session, ...pageProps }
}) {
Component, pageProps: { ...pageProps }
}) {
return (
<SessionProvider session={pageProps.session}>
<Provider store={store}>
<PrimeReactProvider>
<Navbar />
<Component {...pageProps} />
</PrimeReactProvider>
</SessionProvider>
</Provider>
);
}

View File

@ -1,12 +0,0 @@
import NextAuth from 'next-auth'
import GithubProvider from 'next-auth/providers/github'
export default NextAuth({
providers: [
// OAuth authentication providers...
GithubProvider({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET
}),
]
})

View File

@ -1,5 +0,0 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' })
}

View File

@ -0,0 +1,33 @@
import { createSlice, current } from '@reduxjs/toolkit';
const addItems = (state, action, key) => {
const items = current(state)[key];
if (Array.isArray(action.payload)) {
// If payload is an array, spread it into the existing array
state[key] = [...items, ...action.payload];
} else {
// If payload is a single item, push it into the array
items.push(action.payload);
}
};
export const eventsSlice = createSlice({
name: 'events',
initialState: {
resources: [],
courses: [],
},
reducers: {
setItems: (state, action) => {
if (action.payload.type === 'resource') {
addItems(state, action.payload.data, 'resources');
} else if (action.payload.type === 'course') {
addItems(state, action.payload.data, 'courses');
}
},
},
});
// Exports
export const { setItems } = eventsSlice.actions;
export default eventsSlice.reducer;

View File

@ -0,0 +1,31 @@
import { createSlice } from "@reduxjs/toolkit";
const initialRelays = [
"wss://nos.lol/",
"wss://relay.damus.io/",
"wss://relay.snort.social/",
"wss://relay.nostr.band/",
"wss://nostr.mutinywallet.com/",
"wss://relay.mutinywallet.com/",
"wss://relay.primal.net/"
];
export const userSlice = createSlice({
name: "user",
initialState: {
pubkey: '',
relays: initialRelays,
},
reducers: {
setRelays: (state, action) => {
state.relays = [...state.relays, action.payload];
},
setPubkey: (state, action) => {
state.pubkey = action.payload;
}
},
});
export const { setRelays, setPubkey } = userSlice.actions;
export default userSlice.reducer;

10
src/redux/store.js Normal file
View File

@ -0,0 +1,10 @@
import { configureStore } from "@reduxjs/toolkit";
import userReducer from "./reducers/userReducer";
import eventsReducer from "./reducers/eventsReducer";
export const store = configureStore({
reducer: {
user: userReducer,
events: eventsReducer,
}
});