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. +

+
+
+

{token}

+
+ + + +
+
+ )} +
+ ); +} + +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 = () => { +