ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto
16
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(oauth): wire up login for atproto

byarielm.fyi 9aee418b 0cf6c918

verified
+18 -22
+6
.gitignore
··· 24 24 25 25 # Platform specific 26 26 .DS_Store 27 + 28 + # Documents and dev config 29 + CLAUDE.md 30 + .claude/ 31 + .serena/ 32 + .zed/
+4 -3
app/controllers/oauth_controller.ts
··· 3 3 import { loginRequestValidator, signupRequestValidator } from '#validators/oauth' 4 4 5 5 export default class OAuthController { 6 - async handleLogin({ request, response, oauth, logger }: HttpContext) { 6 + async handleLogin({ request, response, oauth, logger, inertia }: HttpContext) { 7 7 // input should be a handle or service URL: 8 8 const { input } = await request.validateUsing(loginRequestValidator) 9 9 try { 10 10 const authorizationUrl = await oauth.authorize(input) 11 11 12 - response.redirect().toPath(authorizationUrl) 12 + //response.redirect().toPath(authorizationUrl) 13 + return inertia.location(authorizationUrl) 13 14 } catch (err) { 14 15 logger.error(err, 'Error starting AT Protocol OAuth flow') 15 16 if (err instanceof OAuthResolverError) { ··· 62 63 return response.redirect().toPath('/') 63 64 } 64 65 } 65 - } 66 + }
+8 -19
inertia/pages/auth/login.vue
··· 10 10 </div> 11 11 12 12 <div> 13 - <Form route="session.store" #default="{ processing, errors }"> 13 + <Form route="oauth.login" #default="{ processing, errors }"> 14 14 <div> 15 - <label for="email">Email</label> 15 + <label for="athandle">Atmosphere Handle</label> 16 16 <input 17 - type="email" 18 - name="email" 19 - id="email" 17 + type="text" 18 + name="input" 19 + id="input" 20 20 autocomplete="username" 21 - :data-invalid="errors.email ? 'true' : undefined" 21 + palceholder="username.bsky.social" 22 + :data-invalid="errors.input ? 'true' : undefined" 22 23 /> 23 - <div v-if="errors.email">{{ errors.email }}</div> 24 - </div> 25 - 26 - <div> 27 - <label for="password">Password</label> 28 - <input 29 - type="password" 30 - name="password" 31 - id="password" 32 - autocomplete="current-password" 33 - :data-invalid="errors.password ? 'true' : undefined" 34 - /> 35 - <div v-if="errors.password">{{ errors.password }}</div> 24 + <div v-if="errors.input">{{ errors.input }}</div> 36 25 </div> 37 26 38 27 <div>