diff --git a/package-lock.json b/package-lock.json
index 6216b1b..ad857b5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -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",
diff --git a/package.json b/package.json
index eb1cb36..9ae9c3c 100644
--- a/package.json
+++ b/package.json
@@ -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",
diff --git a/src/components/navbar/Navbar.js b/src/components/navbar/Navbar.js
index 5c04ba2..95902ae 100644
--- a/src/components/navbar/Navbar.js
+++ b/src/components/navbar/Navbar.js
@@ -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 = (
);
diff --git a/src/pages/_app.js b/src/pages/_app.js
index fb06494..8356fe0 100644
--- a/src/pages/_app.js
+++ b/src/pages/_app.js
@@ -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 (
-
+
-
+
);
}
\ No newline at end of file
diff --git a/src/pages/api/auth/[...nextauth].js b/src/pages/api/auth/[...nextauth].js
deleted file mode 100644
index 8c1314d..0000000
--- a/src/pages/api/auth/[...nextauth].js
+++ /dev/null
@@ -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
- }),
- ]
-})
diff --git a/src/pages/api/hello.js b/src/pages/api/hello.js
deleted file mode 100644
index df63de8..0000000
--- a/src/pages/api/hello.js
+++ /dev/null
@@ -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' })
-}
diff --git a/src/redux/reducers/eventsReducer.js b/src/redux/reducers/eventsReducer.js
new file mode 100644
index 0000000..d7aabde
--- /dev/null
+++ b/src/redux/reducers/eventsReducer.js
@@ -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;
diff --git a/src/redux/reducers/userReducer.js b/src/redux/reducers/userReducer.js
new file mode 100644
index 0000000..3fe28b4
--- /dev/null
+++ b/src/redux/reducers/userReducer.js
@@ -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;
\ No newline at end of file
diff --git a/src/redux/store.js b/src/redux/store.js
new file mode 100644
index 0000000..01e8895
--- /dev/null
+++ b/src/redux/store.js
@@ -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,
+ }
+});
\ No newline at end of file