diff --git a/actions/publications/subscribeEmail.tsx b/actions/publications/subscribeEmail.tsx
index 554a84cb..3b63096f 100644
--- a/actions/publications/subscribeEmail.tsx
+++ b/actions/publications/subscribeEmail.tsx
@@ -22,6 +22,7 @@ import {
publishAtprotoSubscriptionForDid,
unsubscribeToPublication,
} from "app/lish/subscribeToPublication";
+import type { OAuthSessionError } from "src/atproto-oauth";
import { normalizePublicationRecord } from "src/utils/normalizeRecords";
type RequestError =
@@ -36,7 +37,11 @@ type ConfirmError =
| "link_invalid_state"
| "email_belongs_to_other_account"
| ConfirmationError;
-type UnsubscribeError = "unauthorized" | "not_subscribed" | "database_error";
+type UnsubscribeError =
+ | "unauthorized"
+ | "not_subscribed"
+ | "database_error"
+ | OAuthSessionError;
export async function requestPublicationEmailSubscription(
publicationUri: string,
@@ -315,7 +320,8 @@ export async function unsubscribeFromPublication(
}
if (atprotoSub) {
- await unsubscribeToPublication(publicationUri);
+ const atprotoResult = await unsubscribeToPublication(publicationUri);
+ if (!atprotoResult.success) return Err(atprotoResult.error);
}
// NOTE: Postmark Suppressions API is deliberately NOT called here. Per spec,
diff --git a/components/Subscribe/ManageSubscribe.tsx b/components/Subscribe/ManageSubscribe.tsx
index 003481e4..fcf34569 100644
--- a/components/Subscribe/ManageSubscribe.tsx
+++ b/components/Subscribe/ManageSubscribe.tsx
@@ -6,6 +6,7 @@ import { CheckTiny } from "components/Icons/CheckTiny";
import { GoToArrow } from "components/Icons/GoToArrow";
import { Modal } from "components/Modal";
import { useToaster } from "components/Toast";
+import { isOAuthSessionError, OAuthErrorMessage } from "components/OAuthError";
import { LinkHandle } from "./HandleSubscribe";
import { EmailInput, EmailConfirm } from "./EmailSubscribe";
import type { ViewerUser } from "./viewerSubscription";
@@ -102,9 +103,11 @@ export const ManageSubscription = (props: {
if (!res.ok) {
toaster({
type: "error",
- content: (
+ content: isOAuthSessionError(res.error) ? (
+