Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(sdk.ts) - error handling #76

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 65 additions & 66 deletions packages/frame-sdk/src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import { AddFrame, type FrameClientEvent, SignIn } from '@farcaster/frame-core'
import { EventEmitter } from 'eventemitter3'
import { frameHost } from './frameHost'
import { provider } from './provider'
import type { Emitter, EventMap, FrameSDK } from './types'
import { AddFrame, type FrameClientEvent, SignIn } from "@farcaster/frame-core";
import { EventEmitter } from "eventemitter3";
import { frameHost } from "./frameHost";
import { provider } from "./provider";
import type { Emitter, EventMap, FrameSDK } from "./types";

export function createEmitter(): Emitter {
const emitter = new EventEmitter<EventMap>()
const emitter = new EventEmitter<EventMap>();

return {
get eventNames() {
return emitter.eventNames.bind(emitter)
return emitter.eventNames.bind(emitter);
},
get listenerCount() {
return emitter.listenerCount.bind(emitter)
return emitter.listenerCount.bind(emitter);
},
get listeners() {
return emitter.listeners.bind(emitter)
return emitter.listeners.bind(emitter);
},
addListener: emitter.addListener.bind(emitter),
emit: emitter.emit.bind(emitter),
Expand All @@ -24,10 +24,10 @@ export function createEmitter(): Emitter {
once: emitter.once.bind(emitter),
removeAllListeners: emitter.removeAllListeners.bind(emitter),
removeListener: emitter.removeListener.bind(emitter),
}
};
}

const emitter = createEmitter()
const emitter = createEmitter();

export const sdk: FrameSDK = {
...emitter,
Expand All @@ -37,94 +37,93 @@ export const sdk: FrameSDK = {
ready: frameHost.ready.bind(frameHost),
close: frameHost.close.bind(frameHost),
signIn: async (options) => {
const response = await frameHost.signIn(options)
const response = await frameHost.signIn(options);
if (response.result) {
return response.result
return response.result;
}

if (response.error.type === 'rejected_by_user') {
throw new SignIn.RejectedByUser()
if (response.error?.type === "rejected_by_user") {
throw new SignIn.RejectedByUser();
}

throw new Error('Unreachable')
throw new Error("Unreachable");
},
openUrl: (url: string) => {
return frameHost.openUrl(url.trim())
return frameHost.openUrl(url.trim());
},
addFrame: async () => {
const response = await frameHost.addFrame()
if (response.result) {
return response.result
}

if (response.error.type === 'invalid_domain_manifest') {
throw new AddFrame.InvalidDomainManifest()
const response = await frameHost.addFrame();
if (response.added) {
return response.notificationDetails; // Assuming this is what you want to return
}

if (response.error.type === 'rejected_by_user') {
throw new AddFrame.RejectedByUser()
switch (response.reason) {
case "invalid_domain_manifest":
throw new AddFrame.InvalidDomainManifest();
case "rejected_by_user":
throw new AddFrame.RejectedByUser();
default:
throw new Error("Unreachable");
}

throw new Error('Unreachable')
},
},
wallet: {
ethProvider: provider,
},
}
};

// Required to pass SSR
if (typeof document !== 'undefined') {
if (typeof document !== "undefined") {
// react native webview events
document.addEventListener('FarcasterFrameEvent', (event) => {
document.addEventListener("FarcasterFrameEvent", (event) => {
if (event instanceof MessageEvent) {
const frameEvent = event.data as FrameClientEvent
if (frameEvent.event === 'primary_button_clicked') {
emitter.emit('primaryButtonClicked')
} else if (frameEvent.event === 'frame_added') {
emitter.emit('frameAdded', {
const frameEvent = event.data as FrameClientEvent;
if (frameEvent.event === "primary_button_clicked") {
emitter.emit("primaryButtonClicked");
} else if (frameEvent.event === "frame_added") {
emitter.emit("frameAdded", {
notificationDetails: frameEvent.notificationDetails,
})
} else if (frameEvent.event === 'frame_add_rejected') {
emitter.emit('frameAddRejected', { reason: frameEvent.reason })
} else if (frameEvent.event === 'frame_removed') {
emitter.emit('frameRemoved')
} else if (frameEvent.event === 'notifications_enabled') {
emitter.emit('notificationsEnabled', {
});
} else if (frameEvent.event === "frame_add_rejected") {
emitter.emit("frameAddRejected", { reason: frameEvent.reason });
} else if (frameEvent.event === "frame_removed") {
emitter.emit("frameRemoved");
} else if (frameEvent.event === "notifications_enabled") {
emitter.emit("notificationsEnabled", {
notificationDetails: frameEvent.notificationDetails,
})
} else if (frameEvent.event === 'notifications_disabled') {
emitter.emit('notificationsDisabled')
});
} else if (frameEvent.event === "notifications_disabled") {
emitter.emit("notificationsDisabled");
}
}
})
});
}

// Required to pass SSR
if (typeof window !== 'undefined') {
if (typeof window !== "undefined") {
// web events
window.addEventListener('message', (event) => {
window.addEventListener("message", (event) => {
if (event instanceof MessageEvent) {
if (event.data.type === 'frameEvent') {
const frameEvent = event.data.event as FrameClientEvent
if (frameEvent.event === 'primary_button_clicked') {
emitter.emit('primaryButtonClicked')
} else if (frameEvent.event === 'frame_added') {
emitter.emit('frameAdded', {
if (event.data.type === "frameEvent") {
const frameEvent = event.data.event as FrameClientEvent;
if (frameEvent.event === "primary_button_clicked") {
emitter.emit("primaryButtonClicked");
} else if (frameEvent.event === "frame_added") {
emitter.emit("frameAdded", {
notificationDetails: frameEvent.notificationDetails,
})
} else if (frameEvent.event === 'frame_add_rejected') {
emitter.emit('frameAddRejected', { reason: frameEvent.reason })
} else if (frameEvent.event === 'frame_removed') {
emitter.emit('frameRemoved')
} else if (frameEvent.event === 'notifications_enabled') {
emitter.emit('notificationsEnabled', {
});
} else if (frameEvent.event === "frame_add_rejected") {
emitter.emit("frameAddRejected", { reason: frameEvent.reason });
} else if (frameEvent.event === "frame_removed") {
emitter.emit("frameRemoved");
} else if (frameEvent.event === "notifications_enabled") {
emitter.emit("notificationsEnabled", {
notificationDetails: frameEvent.notificationDetails,
})
} else if (frameEvent.event === 'notifications_disabled') {
emitter.emit('notificationsDisabled')
});
} else if (frameEvent.event === "notifications_disabled") {
emitter.emit("notificationsDisabled");
}
}
}
})
});
}