-
-
Notifications
You must be signed in to change notification settings - Fork 30
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
[FH-2] 8 Ball (#160) #178
[FH-2] 8 Ball (#160) #178
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,76 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'use client' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { BasicViewInspector, GatingInspector, Switch } from '@/sdk/components' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useFrameConfig } from '@/sdk/hooks' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Configuration } from '@/sdk/inspector' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import type { Config } from '.' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type GatingConfig = Required<Config['gating']> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export default function Inspector() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [config, updateConfig] = useFrameConfig<Config>() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const gatingConfig: GatingConfig = config.gating || { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
enabled: [], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
requirements: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxFid: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
minFid: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
score: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
channels: [], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exactFids: [], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
erc20: null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
erc721: null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
erc1155: null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
moxie: null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Configuration.Root> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Configuration.Section title="General"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<label> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Cooldown (seconds): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type="number" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value={config.cooldown} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
updateConfig({ cooldown: Number.parseInt(e.target.value) || -1 }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
min="-1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<label> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Public: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type="checkbox" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checked={config.isPublic} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => updateConfig({ isPublic: e.target.checked })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Configuration.Section> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Configuration.Section title="Cover"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<BasicViewInspector | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config={config.coverConfig} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(newCoverConfig) => updateConfig({ coverConfig: newCoverConfig })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Configuration.Section> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for cooldown input. The cooldown input currently allows negative values, which might not be the intended behavior for a cooldown setting. Consider adding validation to ensure the cooldown value is non-negative: <input
type="number"
value={config.cooldown}
onChange={(e) =>
- updateConfig({ cooldown: Number.parseInt(e.target.value) || -1 })
+ updateConfig({ cooldown: Math.max(0, Number.parseInt(e.target.value) || 0) })
}
- min="-1"
+ min="0"
/> This change ensures that the cooldown value is always non-negative, with a minimum of 0 seconds. 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Configuration.Section title="Answer"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<BasicViewInspector | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config={config.answerConfig} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(newAnswerConfig) => updateConfig({ answerConfig: newAnswerConfig })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Configuration.Section> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Configuration.Section title="Gating"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Switch | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checked={config.enableGating ?? false} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onCheckedChange={(checked) => updateConfig({ enableGating: checked })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{config.enableGating && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<GatingInspector | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config={gatingConfig} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(newGatingConfig) => updateConfig({ gating: newGatingConfig })} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Configuration.Section> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Configuration.Root> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,81 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'use server' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import type { BuildFrameData } from '@/lib/farcaster' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { runGatingChecks } from '@/lib/gating' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { loadGoogleFontAllVariants } from '@/sdk/fonts' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type ButtonConfig, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type ErrorDisplayConfig, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type HandlerContext, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Magic8BallError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkCooldown, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getRandomAnswer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateQuestion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from '../types' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import AnswerView from '../views/answer' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const errorDisplayConfig: ErrorDisplayConfig = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
style: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
backgroundColor: 'red', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
color: 'white', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
padding: '20px', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
borderRadius: '10px', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
textAlign: 'center', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fontSize: '24px', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buttons: [{ label: 'Try Again' }], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
handler: 'initial', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Extend To display specific error messages to the user, Update the const errorDisplayConfig: ErrorDisplayConfig = {
style: {
backgroundColor: 'red',
color: 'white',
padding: '20px',
borderRadius: '10px',
textAlign: 'center',
fontSize: '24px',
},
buttons: [{ label: 'Try Again' }],
handler: 'initial',
+ errorContent: '', // Placeholder for dynamic error messages
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const createButton = (label: string): ButtonConfig => ({ label }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const updateStorage = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
storage: HandlerContext['storage'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
body: HandlerContext['body'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
answer: string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...storage, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastAnswerTime: Date.now(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
questions: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...(storage.questions || []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
question: body.inputText, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
answer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
timestamp: Date.now(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fid: body.fid, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Use a single timestamp for consistency Currently, Apply this diff to capture const updateStorage = (
storage: HandlerContext['storage'],
body: HandlerContext['body'],
answer: string
) => {
+ const timestamp = Date.now()
return {
...storage,
- lastAnswerTime: Date.now(),
+ lastAnswerTime: timestamp,
questions: [
...(storage.questions || []),
{
question: body.inputText,
answer,
- timestamp: Date.now(),
+ timestamp,
fid: body.fid,
},
],
}
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export default async function ask({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
body, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
storage, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}: HandlerContext): Promise<BuildFrameData> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const roboto = await loadGoogleFontAllVariants('Roboto') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
runGatingChecks(body, config.gating) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateQuestion(body.inputText) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkCooldown(storage.lastAnswerTime, config.cooldown) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const answer = getRandomAnswer() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const newStorage = updateStorage(storage, body, answer) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buttons: [createButton('Ask Another Question')], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fonts: roboto, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: AnswerView(config, answer), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
handler: 'initial', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
storage: newStorage, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (error instanceof Magic8BallError) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...errorDisplayConfig, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Assuming you might want some error message or dynamic content here | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// errorContent: error.message, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Include error messages in user-facing error responses When catching a Apply this diff to include the error message: return {
...errorDisplayConfig,
+ errorContent: error.message,
} Ensure that 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw error | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export { default as initial } from './initial'; | ||
export { default as page } from './page'; | ||
export { default as ask } from './ask'; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { initial, ask, page} from './handlers'; | ||
|
||
export default { | ||
initial, | ||
ask, | ||
page | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
'use server' | ||
import type { BuildFrameData } from '@/lib/farcaster' | ||
import { loadGoogleFontAllVariants } from '@/sdk/fonts' | ||
import type { HandlerContext } from '../types' | ||
import CoverView from '../views/cover' | ||
|
||
export default async function initial({ | ||
config, | ||
storage, | ||
}: Omit<HandlerContext, 'body'>): Promise<BuildFrameData> { | ||
const roboto = await loadGoogleFontAllVariants('Roboto') | ||
|
||
return { | ||
buttons: [{ label: 'Ask' }], | ||
inputText: 'Ask a question...', | ||
fonts: roboto, | ||
component: CoverView(config), | ||
handler: 'ask', | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
'use server' | ||
import type { BuildFrameData, FramePayloadValidated } from '@/lib/farcaster' | ||
import { loadGoogleFontAllVariants } from '@/sdk/fonts' | ||
import type { Config, Storage } from '..' | ||
import PageView from '../views/page' | ||
|
||
export default async function page({ | ||
body, | ||
config, | ||
storage, | ||
params, | ||
}: { | ||
body: FramePayloadValidated | ||
config: Config | ||
storage: Storage | ||
params: any | ||
}): Promise<BuildFrameData> { | ||
const roboto = await loadGoogleFontAllVariants('Roboto') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider optimizing font loading Loading all variants of the Roboto font might be unnecessary and could impact performance. Consider loading only the specific font weights and styles required for this component. You could modify the font loading as follows: const roboto = await loadGoogleFontAllVariants('Roboto', ['400', '700']); // Example: load only regular and bold weights Ensure to update the |
||
|
||
return { | ||
buttons: [ | ||
{ | ||
label: '← Back to Magic 8 Ball', | ||
}, | ||
], | ||
fonts: roboto, | ||
component: PageView(config, storage, params), | ||
handler: 'initial', | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,89 @@ | ||||||
import type { BaseConfig, BaseStorage, BaseTemplate } from '@/lib/types' | ||||||
import type { GatingType } from '@/sdk/components/gating/types' | ||||||
import Inspector from './Inspector' | ||||||
import cover from './cover.jpeg' | ||||||
import handlers from './handlers' | ||||||
|
||||||
export interface Config extends BaseConfig { | ||||||
fontFamily?: string | ||||||
primaryColor?: string | ||||||
secondaryColor?: string | ||||||
titleWeight?: string | ||||||
titleStyle?: string | ||||||
background?: string | ||||||
bodyColor?: string | ||||||
cooldown: number | ||||||
isPublic: boolean | ||||||
coverConfig: { | ||||||
title: string | ||||||
subtitle: string | ||||||
bottomMessage: string | ||||||
backgroundColor: string | ||||||
textColor: string | ||||||
} | ||||||
answerConfig: { | ||||||
title: string | ||||||
bottomMessage: string | ||||||
backgroundColor: string | ||||||
textColor: string | ||||||
} | ||||||
gating: GatingType | undefined | ||||||
enableGating: boolean | undefined | ||||||
} | ||||||
developerfred marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
export interface Storage extends BaseStorage { | ||||||
lastAnswerTime?: number | ||||||
questions?: Array<{ | ||||||
question: string | ||||||
answer: string | ||||||
timestamp: number | ||||||
fid: number | ||||||
}> | ||||||
} | ||||||
|
||||||
export default { | ||||||
name: 'Magic 8 Ball', | ||||||
description: 'Ask a question and receive a mystical answer from the Magic 8 Ball!', | ||||||
shortDescription: 'Virtual fortune teller', | ||||||
icon: '', | ||||||
octicon: 'crystal-ball', | ||||||
creatorFid: '197049', | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure consistent data type for As mentioned in a previous review, the Apply this diff to update - creatorFid: '197049',
+ creatorFid: 197049, 📝 Committable suggestion
Suggested change
|
||||||
creatorName: 'codingsh', | ||||||
cover, | ||||||
enabled: true, | ||||||
Inspector, | ||||||
handlers, | ||||||
initialConfig: { | ||||||
cooldown: 60, | ||||||
isPublic: true, | ||||||
coverConfig: { | ||||||
title: 'Magic 8 Ball', | ||||||
subtitle: 'Ask a question and receive mystical guidance!', | ||||||
bottomMessage: "Tap 'Ask' to begin", | ||||||
backgroundColor: '#000000', | ||||||
textColor: '#FFFFFF', | ||||||
}, | ||||||
answerConfig: { | ||||||
title: 'The 8 Ball says...', | ||||||
bottomMessage: 'Ask another question to play again!', | ||||||
backgroundColor: '#000000', | ||||||
textColor: '#FFFFFF', | ||||||
}, | ||||||
enableGating: false, | ||||||
gating: { | ||||||
enabled: [], | ||||||
requirements: { | ||||||
maxFid: 0, | ||||||
minFid: 0, | ||||||
score: 0, | ||||||
channels: [], | ||||||
exactFids: [], | ||||||
erc20: null, | ||||||
erc721: null, | ||||||
erc1155: null, | ||||||
moxie: null, | ||||||
}, | ||||||
}, | ||||||
}, | ||||||
events: ['question.asked', 'question.answered'], | ||||||
} satisfies BaseTemplate |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider optimizing
gatingConfig
object creation.The
gatingConfig
object is currently defined inside the component, which means it will be recreated on every render. This could potentially impact performance, especially if the component re-renders frequently.Consider moving the
gatingConfig
object outside the component or memoizing it usinguseMemo
to optimize performance:This approach ensures that the
gatingConfig
object is only recreated whenconfig.gating
changes.