Settler
Settler is a web application built with Next.js and TypeScript, utilizing the powerful Shadcn UI component library.
Primarily used for settling after a Poker session.
It translates chips into real-world money using an intelligent distribution algorithm.
A user-intuitive web application built with Next.js and TypeScript, utilizing the powerful Shadcn UI component library.
It seamlessly integrates with the Splitwise API, enabling a superfluous creation and updating of expenses.
Settler using Splitwise's Oauth 2.0 flow fetches groups and group members for a selected group using the signed-in user's access token. It makes an API call to a custom server I built on the Python Flask framework to serve Splitwise-based requests.
sObj = Splitwise(consumer_key, consumer_secret)
sObj.setAccessToken(session['access_token'])
groups = sObj.getGroups()
# Convert the groups to a JSON-serializable format
serialized_groups = []
for group in groups:
serialized_group = {
'id': group.id,
'name': group.name,
# Include any other required attributes
}
serialized_groups.append(serialized_group)
Additionally, Settler implements Passage for secure passkey authentication, ensuring a robust and reliable user authentication mechanism.
Setting up Passage was fairly straightforward. Based on the authentication state, I would decide between rendering the Passage's Login component or my authenticated route "/dashboard".
return (
<>
{loading && (
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', minHeight: '100vh' }}>
{loading && <DotWave color={dotWaveColor}/>}
</div>
)}
{!authenticated && <PassageLogin/>}
</>
)
require('@passageidentity/passage-elements/passage-auth');
//...
<passage-auth app-id={process.env.PASSAGE_APP_ID}></passage-auth>
Also uses Supabase integration with Passage to persist user information.
I then instantiate a Supabase client which updates the user's most frequently used Splitwise group for ease of flow. And fetches this every time the user is logged in with Passage.
import { createClient } from '@supabase/supabase-js'
//...
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
options
)
The documentation available along with the walkthrough containing the sample project on Supabase's website was exceptionally helpful.
Subscribe to my newsletter
Read articles from Joqim directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by