diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 7487c61..0996f93 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -53,11 +53,15 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- - name: Restart Node 1
+ - name: Restart Node 1 Main
if: github.ref == 'refs/heads/main'
run: |
curl -X POST ${{ secrets.RESTART_URL }}
-
+
+ - name: Restart Node 1 Dev
+ if: github.ref == 'refs/heads/dev'
+ run: |
+ curl -X POST ${{ secrets.RESTART_URL_DEV }}
- name: Setup Node.js environment
uses: actions/setup-node@v2.4.1
diff --git a/components/settings/apiAccess.tsx b/components/settings/apiAccess.tsx
new file mode 100644
index 0000000..019883e
--- /dev/null
+++ b/components/settings/apiAccess.tsx
@@ -0,0 +1,123 @@
+import React, { useState, Fragment, useRef, useEffect } from "react";
+import { Dialog, Transition } from "@headlessui/react";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faLock, faCircleNotch } from "@fortawesome/free-solid-svg-icons";
+import toast from "react-hot-toast";
+import { CopyToClipboard } from 'react-copy-to-clipboard';
+
+function ApiAccess({ userDetails, userApiDetails }: any) {
+ const [token, setToken] = useState("");
+ const [apiAccess, setApiAccess] = useState(false);
+ const [apiAccessLoading, setApiAccessLoading] = useState(false);
+
+ useEffect(() => {
+ if (userDetails.api_access) {
+ setApiAccess(true);
+ if(userApiDetails === null) {
+ setToken("No token found.");
+ toast.error("No token found, please re-enable API access.");
+ return;
+ }
+ setToken(userApiDetails.token);
+ } else {
+ setApiAccess(false);
+ }
+ }, [userDetails, userApiDetails]);
+
+ const toggleApiAccess = async () => {
+ setApiAccessLoading(true);
+ const res = await fetch(process.env.NEXT_PUBLIC_API_DOMAIN + "/user/api_access", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ user_id: userDetails.user_id,
+ api_access: !apiAccess,
+ }),
+ });
+
+ const data = await res.json();
+
+ if (!res.ok) {
+ toast.error(data.message);
+ setApiAccessLoading(false);
+ return;
+ }
+
+ setApiAccessLoading(false);
+ setApiAccess(!apiAccess);
+ setToken(data.token);
+ toast.success(data.message);
+ };
+
+ return (
+
+
API Settings
+
+
+
API Access
+
+ Enable this to get access to the Solun API, with this you can fetch mails,
+ create accounts and more.
+
+
+ {!apiAccess ? (
+
+ ) : (
+
+ )}
+
+
+
+ {apiAccess && (
+
+
API Token
+
+ Copy your unique token, and follow our documentation to get started.
+
+
+
+ )}
+
+ );
+}
+
+export default ApiAccess;
diff --git a/hooks/fetchUserApiToken.tsx b/hooks/fetchUserApiToken.tsx
new file mode 100644
index 0000000..ea38504
--- /dev/null
+++ b/hooks/fetchUserApiToken.tsx
@@ -0,0 +1,41 @@
+import { useRouter } from "next/navigation";
+import { useEffect, useState } from "react";
+
+export const useFetchUserApiToken = () => {
+ const [userApiDetails, setUserApiDetails] = useState(null);
+ const router = useRouter();
+
+ useEffect(() => {
+ const fetchUserInfo = async () => {
+ const token = localStorage.getItem("jwt");
+
+ if (!token) {
+ router.push("/login");
+ return;
+ }
+
+ const response = await fetch(process.env.NEXT_PUBLIC_API_DOMAIN + "/user/get_api_details", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ token: token,
+ }),
+ });
+
+ if (!response.ok) {
+ localStorage.removeItem("jwt");
+ router.push("/login");
+ return;
+ }
+
+ const data = await response.json();
+ setUserApiDetails(data.data);
+ };
+
+ fetchUserInfo();
+ }, []);
+
+ return { userApiDetails };
+};
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 157050e..2297ab5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "solun-auth",
- "version": "0.3.53",
+ "version": "0.3.60",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "solun-auth",
- "version": "0.3.53",
+ "version": "0.3.60",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.4.0",
diff --git a/package.json b/package.json
index 9688f62..1d78dae 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "solun-auth",
- "version": "0.3.53",
+ "version": "0.3.60",
"private": true,
"scripts": {
"dev": "next dev",
diff --git a/pages/subpages/settings.tsx b/pages/subpages/settings.tsx
index 5a56bb1..4a3359b 100644
--- a/pages/subpages/settings.tsx
+++ b/pages/subpages/settings.tsx
@@ -9,10 +9,13 @@ import ChangePassword from "@/components/settings/changePassword";
import PrivacySettings from "@/components/settings/privacySettings";
import { useFetchUserInfo } from "@/hooks/fetchUserInfo";
import Recovery from "@/components/settings/recovery";
+import { useFetchUserApiToken } from "@/hooks/fetchUserApiToken";
+import ApiAccess from "@/components/settings/apiAccess";
const SettingsPage = () => {
const router = useRouter();
const { userInfo, userDetails } = useFetchUserInfo() as any;
+ const { userApiDetails } = useFetchUserApiToken() as any;
if (!userInfo || !userDetails) {
return null;
@@ -25,6 +28,7 @@ const SettingsPage = () => {
+