From d5847e2d2b68a1eb41d43be170cd4ddff9003cff Mon Sep 17 00:00:00 2001
From: tobi <31960611+tsmethurst@users.noreply.github.com>
Date: Mon, 17 Mar 2025 15:06:17 +0100
Subject: [feature] Application creation + management via API + settings panel
(#3906)
* [feature] Application creation + management via API + settings panel
* fix docs links
* add errnorows test
* use known application as shorter
* add comment about side effects
---
.../settings/views/user/applications/callback.tsx | 121 +++++++++++++++++++++
1 file changed, 121 insertions(+)
create mode 100644 web/source/settings/views/user/applications/callback.tsx
(limited to 'web/source/settings/views/user/applications/callback.tsx')
diff --git a/web/source/settings/views/user/applications/callback.tsx b/web/source/settings/views/user/applications/callback.tsx
new file mode 100644
index 000000000..f1634cc6f
--- /dev/null
+++ b/web/source/settings/views/user/applications/callback.tsx
@@ -0,0 +1,121 @@
+/*
+ GoToSocial
+ Copyright (C) GoToSocial Authors admin@gotosocial.org
+ SPDX-License-Identifier: AGPL-3.0-or-later
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+import React from "react";
+import { useSearch } from "wouter";
+import { Error as ErrorCmp } from "../../../components/error";
+import { useGetAccessTokenForAppMutation, useGetAppQuery } from "../../../lib/query/user/applications";
+import { useCallbackURL } from "./common";
+import useFormSubmit from "../../../lib/form/submit";
+import { useValue } from "../../../lib/form";
+import MutationButton from "../../../components/form/mutation-button";
+import FormWithData from "../../../lib/form/form-with-data";
+import { App } from "../../../lib/types/application";
+import { OAuthAccessToken } from "../../../lib/types/oauth";
+
+export function AppTokenCallback({}) {
+ // Read the callback authorization
+ // information from the search params.
+ const search = useSearch();
+ const urlQueryParams = new URLSearchParams(search);
+ const code = urlQueryParams.get("code");
+ const appId = urlQueryParams.get("state");
+ const error = urlQueryParams.get("error");
+ const errorDescription = urlQueryParams.get("error_description");
+
+ if (error) {
+ let errString = error;
+ if (errorDescription) {
+ errString += ": " + errorDescription;
+ }
+ if (error === "invalid_scope") {
+ errString += ". You probably requested a token (sub-)scope that wasn't contained in the scopes of your application.";
+ }
+ const err = Error(errString);
+ return ;
+ }
+
+ if (!code || !appId) {
+ const err = Error("code or app id not defined");
+ return ;
+ }
+
+ return(
+ <>
+
+ >
+ );
+}
+
+
+function AccessForAppForm({ data: app, code }: { data: App, code: string }) {
+ const redirectURI = useCallbackURL();
+
+ // Prepare to call /oauth/token to
+ // exchange code for access token.
+ const form = {
+ client_id: useValue("client_id", app.client_id),
+ client_secret: useValue("client_secret", app.client_secret),
+ redirect_uri: useValue("redirect_uri", redirectURI),
+ code: useValue("code", code),
+ grant_type: useValue("grant_type", "authorization_code"),
+
+ };
+ const [ submit, result ] = useFormSubmit(form, useGetAccessTokenForAppMutation());
+
+ return (
+
+ );
+}
--
cgit v1.2.3