Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
47b3fd5
feat: Add movie discovery onboarding page with a swipeable movie card…
LuizGarbini Mar 9, 2026
f4fd418
Merge branch 'main' of https://github.com/plotwist-app/plotwist into …
LuizGarbini Mar 9, 2026
b5a1c3e
feat(web): add layout wrapper to cleanly isolate onboarding view
LuizGarbini Mar 11, 2026
36acb12
feat(locales): add onboarding translation keys across all language di…
LuizGarbini Mar 11, 2026
11ed021
feat(web): implement fully localized multi-step onboarding with swiper
LuizGarbini Mar 11, 2026
c0cc92e
Merge branch 'main' of github.com:plotwist-app/plotwist into garbini/…
eulixir Mar 12, 2026
980e64f
chore: update pnpm lock
eulixir Mar 12, 2026
da0b153
refactor(onboarding): reorganize imports and improve code formatting …
eulixir Mar 12, 2026
f5df6c1
feat: Enhance onboarding flow with user item saving, updated genre se…
LuizGarbini Mar 12, 2026
b10056e
Merge branch 'garbini/plo-256-feature-onboarding' of github.com:plotw…
LuizGarbini Mar 12, 2026
5d0c3b3
refactor: Add explicit type="button" to all buttons in onboarding ste…
LuizGarbini Mar 12, 2026
9d49711
refactor(onboarding): fix biome key errors and screen transition flicker
LuizGarbini Mar 19, 2026
bed31e0
fix(auth): extract language from cookies and apply unconditional redi…
LuizGarbini Mar 25, 2026
0f2b372
refactor(layout): evaluate onboarding path in server component
LuizGarbini Mar 25, 2026
7948b17
fix(onboarding): adjust step cap, window fallback, and cleanup unused…
LuizGarbini Mar 25, 2026
08cdeae
feat(i18n): update onboarding dictionaries and celebration copy
LuizGarbini Mar 25, 2026
aeb8cc3
fix: lint biome
LuizGarbini Mar 25, 2026
70e11e6
fix: pnpm lock
LuizGarbini Mar 25, 2026
ccdf74e
fix: tailwind-version
LuizGarbini Mar 25, 2026
f6b690d
Merge branch 'main' of github.com:plotwist-app/plotwist into garbini/…
eulixir Mar 30, 2026
6c61337
Add local settings configuration and update LocalStack version in tests
eulixir Mar 30, 2026
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
7 changes: 7 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Bash(pnpm run:*)"
]
}
}
4 changes: 2 additions & 2 deletions apps/backend/src/test/global-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,13 @@ async function setupDatabase() {
}

async function setupLocalStack() {
const container = await new GenericContainer('localstack/localstack:latest')
const container = await new GenericContainer('localstack/localstack:3')
.withEnvironment({
SERVICES: 'sqs',
DOCKER_HOST: 'unix:///var/run/docker.sock',
})
.withExposedPorts(4566)
.withWaitStrategy(Wait.forLogMessage(/.*Ready.*/))
.withWaitStrategy(Wait.forHttp('/_localstack/health', 4566))
.start()

localstackConfig = {
Expand Down
2 changes: 1 addition & 1 deletion apps/web/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
import "./.next/dev/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
4 changes: 2 additions & 2 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@
"jsdom": "^27.4.0",
"msw": "^2.12.7",
"orval": "^8.5.3",
"tailwindcss": "^3.4.17",
"tailwindcss": "^3.4.19",
"typescript": "^5.9.3",
"vitest": "^4.0.16"
}
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -887,5 +887,35 @@
"feature_stats_title": "Sieh dir deine Statistiken an",
"feature_stats_description": "Visualisiere deine Gewohnheiten mit detaillierten Statistiken und Einblicken.",
"app_section_title": "Nimm Plotwist mit",
"app_section_subtitle": "Verfolge unterwegs mit der Plotwist iOS-App. Wische zum Entdecken, verfolge Episoden und verpasse nie einen Titel."
"app_section_subtitle": "Verfolge unterwegs mit der Plotwist iOS-App. Wische zum Entdecken, verfolge Episoden und verpasse nie einen Titel.",
"onboarding": {
"welcome_title": "Verfolge, entdecke und verpasse keinen Titel",
"welcome_subtitle": "Tritt der Gemeinschaft der Film- und Serienliebhaber bei.",
"get_started": "Los geht's",
"name_title": "Sag uns deinen Namen, um Plotwist zu deinem zu machen",
"name_placeholder": "Dein Name",
"content_types_title": "Was schaust du am liebsten?",
"content_types_movie": "Filme",
"content_types_tv": "Serien",
"content_types_anime": "Anime",
"content_types_dorama": "Dorama",
"genres_title": "Wähle deine Lieblingsgenres",
"genres_subtitle": "Wähle mindestens ein Genre",
"genres_select_prompt": "Wähle ein Genre",
"swiper_title": "Titel entdecken",
"swiper_subtitle": "Wische zur Seite, um zu deiner Liste hinzuzufügen",
"swiper_watched": "Gesehen",
"swiper_watching": "Laufend",
"swiper_want_to_watch": "Möchte ich sehen",
"swiper_skip": "Überspringen",
"swiper_empty": "Keine Titel mit diesen Einstellungen gefunden.",
"swiper_fetching": "Suche Titel...",
"swiper_finish_ready": "Los geht's!",
"swiper_finish_remaining": "Titel übrig",
"celebration_title": "Alles bereit!",
"celebration_subtitle": "Dein Profil ist fertig. Lass uns anfangen.",
"go_to_profile": "Zum Profil",
"continue": "Weiter",
"syncing": "Profil wird gespeichert..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -889,5 +889,35 @@
"feature_stats_title": "See your stats",
"feature_stats_description": "Visualize your watching habits with detailed statistics and insights.",
"app_section_title": "Take Plotwist with you",
"app_section_subtitle": "Track on the go with the Plotwist iOS app. Swipe to discover, track episodes, and never miss a title."
"app_section_subtitle": "Track on the go with the Plotwist iOS app. Swipe to discover, track episodes, and never miss a title.",
"onboarding": {
"welcome_title": "Track, discover and never miss a title",
"welcome_subtitle": "Join the community of movie and TV show lovers.",
"get_started": "Get started",
"name_title": "Tell us your name so we can make Plotwist feel like yours",
"name_placeholder": "Your name",
"content_types_title": "What do you like to watch?",
"content_types_movie": "Movies",
"content_types_tv": "TV Series",
"content_types_anime": "Anime",
"content_types_dorama": "K-Drama",
"genres_title": "Pick your favorite genres",
"genres_subtitle": "Select at least one genre",
"genres_select_prompt": "Select a genre",
"swiper_title": "Discover titles",
"swiper_subtitle": "Swipe sideways to add to your list",
"swiper_watched": "Watched",
"swiper_watching": "Watching",
"swiper_want_to_watch": "Want to watch",
"swiper_skip": "Skip",
"swiper_empty": "No titles found with these preferences.",
"swiper_fetching": "Fetching titles...",
"swiper_finish_ready": "Let's go!",
"swiper_finish_remaining": "titles to go",
"celebration_title": "You're all set!",
"celebration_subtitle": "Your profile is ready. Let's start tracking.",
"go_to_profile": "Go to Profile",
"continue": "Continue",
"syncing": "Saving profile..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/es-ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -891,5 +891,35 @@
"feature_stats_title": "Mira tus estadísticas",
"feature_stats_description": "Visualiza tus hábitos con estadísticas detalladas e insights.",
"app_section_title": "Lleva Plotwist contigo",
"app_section_subtitle": "Sigue desde cualquier lugar con la app de Plotwist para iOS. Desliza para descubrir, sigue episodios y nunca te pierdas un título."
"app_section_subtitle": "Sigue desde cualquier lugar con la app de Plotwist para iOS. Desliza para descubrir, sigue episodios y nunca te pierdas un título.",
"onboarding": {
"welcome_title": "Sigue, descubre y no te pierdas ningún título",
"welcome_subtitle": "Únete a la comunidad de amantes del cine y series.",
"get_started": "Empezar",
"name_title": "Dinos tu nombre para hacer que Plotwist sea tuyo",
"name_placeholder": "Tu nombre",
"content_types_title": "¿Qué prefieres ver?",
"content_types_movie": "Películas",
"content_types_tv": "Series",
"content_types_anime": "Anime",
"content_types_dorama": "Dorama",
"genres_title": "Elige tus géneros favoritos",
"genres_subtitle": "Selecciona al menos un género",
"genres_select_prompt": "Selecciona un género",
"swiper_title": "Descubre títulos",
"swiper_subtitle": "Desliza hacia los lados para agregar a tu lista",
"swiper_watched": "Visto",
"swiper_watching": "Viendo",
"swiper_want_to_watch": "Quiero ver",
"swiper_skip": "Saltar",
"swiper_empty": "No se encontraron títulos con estas preferencias.",
"swiper_fetching": "Buscando títulos...",
"swiper_finish_ready": "¡Vamos!",
"swiper_finish_remaining": "títulos faltan",
"celebration_title": "¡Todo listo!",
"celebration_subtitle": "Tu perfil está listo. Empecemos.",
"go_to_profile": "Ir a Perfil",
"continue": "Continuar",
"syncing": "Guardando perfil..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -893,5 +893,35 @@
"feature_stats_title": "Consultez vos statistiques",
"feature_stats_description": "Visualisez vos habitudes avec des statistiques détaillées.",
"app_section_title": "Emportez Plotwist avec vous",
"app_section_subtitle": "Suivez vos titres partout avec l'app Plotwist pour iOS. Glissez pour découvrir, suivez les épisodes et ne manquez jamais un titre."
"app_section_subtitle": "Suivez vos titres partout avec l'app Plotwist pour iOS. Glissez pour découvrir, suivez les épisodes et ne manquez jamais un titre.",
"onboarding": {
"welcome_title": "Suivez, découvrez et ne manquez jamais un titre",
"welcome_subtitle": "Rejoignez la communauté des amateurs de films et séries.",
"get_started": "Commencer",
"name_title": "Dites-nous votre nom pour personnaliser Plotwist",
"name_placeholder": "Votre nom",
"content_types_title": "Que préférez-vous regarder ?",
"content_types_movie": "Films",
"content_types_tv": "Séries",
"content_types_anime": "Anime",
"content_types_dorama": "Dramas",
"genres_title": "Choisissez vos genres préférés",
"genres_subtitle": "Sélectionnez au moins un genre",
"genres_select_prompt": "Sélectionnez un genre",
"swiper_title": "Découvrez des titres",
"swiper_subtitle": "De glisser sur les côtés pour ajouter à votre liste",
"swiper_watched": "Vu",
"swiper_watching": "En cours",
"swiper_want_to_watch": "À voir",
"swiper_skip": "Passer",
"swiper_empty": "Aucun titre trouvé avec ces préférences.",
"swiper_fetching": "Recherche de titres...",
"swiper_finish_ready": "Allons-y !",
"swiper_finish_remaining": "titres restants",
"celebration_title": "Tout est prêt !",
"celebration_subtitle": "Votre profil est prêt. Commençons.",
"go_to_profile": "Aller au profil",
"continue": "Continuer",
"syncing": "Enregistrement du profil..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/it-IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -890,5 +890,35 @@
"feature_stats_title": "Guarda le tue statistiche",
"feature_stats_description": "Visualizza le tue abitudini con statistiche dettagliate.",
"app_section_title": "Porta Plotwist con te",
"app_section_subtitle": "Segui ovunque con l'app Plotwist per iOS. Scorri per scoprire, segui gli episodi e non perdere mai un titolo."
"app_section_subtitle": "Segui ovunque con l'app Plotwist per iOS. Scorri per scoprire, segui gli episodi e non perdere mai un titolo.",
"onboarding": {
"welcome_title": "Tieni traccia, scopri e non perdere mai un titolo",
"welcome_subtitle": "Unisciti alla comunità degli amanti di film e serie TV.",
"get_started": "Inizia",
"name_title": "Dicci il tuo nome per rendere Plotwist tuo",
"name_placeholder": "Il tuo nome",
"content_types_title": "Cosa preferisci guardare?",
"content_types_movie": "Film",
"content_types_tv": "Serie",
"content_types_anime": "Anime",
"content_types_dorama": "Dorama",
"genres_title": "Scegli i tuoi generi preferiti",
"genres_subtitle": "Seleziona almeno un genere",
"genres_select_prompt": "Seleziona un genere",
"swiper_title": "Scopri titoli",
"swiper_subtitle": "Scorri di lato per aggiungere alla tua lista",
"swiper_watched": "Visto",
"swiper_watching": "In corso",
"swiper_want_to_watch": "Voglio vedere",
"swiper_skip": "Salta",
"swiper_empty": "Nessun titolo trovato con queste preferenze.",
"swiper_fetching": "Ricerca titoli...",
"swiper_finish_ready": "Andiamo!",
"swiper_finish_remaining": "titoli mancanti",
"celebration_title": "Tutto pronto!",
"celebration_subtitle": "Il tuo profilo è pronto. Iniziamo.",
"go_to_profile": "Vai al Profilo",
"continue": "Continua",
"syncing": "Salvataggio profilo..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -893,5 +893,35 @@
"feature_stats_title": "統計を確認",
"feature_stats_description": "詳細な統計とインサイトで視聴習慣を可視化。",
"app_section_title": "Plotwistを持ち歩こう",
"app_section_subtitle": "Plotwist iOSアプリでどこでも追跡。スワイプで発見、エピソードを追跡、タイトルを見逃さない。"
"app_section_subtitle": "Plotwist iOSアプリでどこでも追跡。スワイプで発見、エピソードを追跡、タイトルを見逃さない。",
"onboarding": {
"welcome_title": "記録して、発見して、見逃さない",
"welcome_subtitle": "映画やドラマ好きのコミュニティに参加しよう。",
"get_started": "はじめる",
"name_title": "Plotwistをあなたらしくするために名前を教えてください",
"name_placeholder": "あなたの名前",
"content_types_title": "何を見るのが好きですか?",
"content_types_movie": "映画",
"content_types_tv": "ドラマ・アニメ",
"content_types_anime": "アニメ",
"content_types_dorama": "韓国ドラマ",
"genres_title": "好きなジャンルを選んでください",
"genres_subtitle": "少なくとも1つのジャンルを選択してください",
"genres_select_prompt": "ジャンルを選択",
"swiper_title": "タイトルを発見",
"swiper_subtitle": "左右にスワイプしてリストに追加",
"swiper_watched": "見た",
"swiper_watching": "見ている",
"swiper_want_to_watch": "見たい",
"swiper_skip": "スキップ",
"swiper_empty": "これらの設定で見つかったタイトルはありません。",
"swiper_fetching": "タイトルを検索中...",
"swiper_finish_ready": "行こう!",
"swiper_finish_remaining": "タイトル残り",
"celebration_title": "準備完了!",
"celebration_subtitle": "プロフィールが完成しました。始めましょう。",
"go_to_profile": "プロフィールへ",
"continue": "続ける",
"syncing": "プロフィールを保存中..."
}
}
32 changes: 31 additions & 1 deletion apps/web/public/dictionaries/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -892,5 +892,35 @@
"feature_stats_title": "Veja suas estatísticas",
"feature_stats_description": "Visualize seus hábitos com estatísticas detalhadas e insights.",
"app_section_title": "Leve o Plotwist com você",
"app_section_subtitle": "Acompanhe de qualquer lugar com o app Plotwist para iOS. Deslize para descobrir, acompanhe episódios e nunca perca um título."
"app_section_subtitle": "Acompanhe de qualquer lugar com o app Plotwist para iOS. Deslize para descobrir, acompanhe episódios e nunca perca um título.",
"onboarding": {
"welcome_title": "Acompanhe, descubra e nunca perca um título",
"welcome_subtitle": "Junte-se à comunidade de amantes de filmes e séries.",
"get_started": "Começar",
"name_title": "Diga-nos seu nome para tornar o Plotwist a sua cara",
"name_placeholder": "Seu nome",
"content_types_title": "O que você prefere assistir?",
"content_types_movie": "Filmes",
"content_types_tv": "Séries",
"content_types_anime": "Anime",
"content_types_dorama": "Dorama",
"genres_title": "Escolha seus gêneros favoritos",
"genres_subtitle": "Selecione ao menos um gênero",
"genres_select_prompt": "Selecione um gênero",
"swiper_title": "Descubra títulos",
"swiper_subtitle": "Arraste para os lados para adicionar à sua lista",
"swiper_watched": "Já assisti",
"swiper_watching": "Assistindo",
"swiper_want_to_watch": "Quero assistir",
"swiper_skip": "Pular",
"swiper_empty": "Nenhum título localizado com essas preferências.",
"swiper_fetching": "Buscando títulos...",
"swiper_finish_ready": "Vamos lá!",
"swiper_finish_remaining": "títulos faltando",
"celebration_title": "Tudo pronto!",
"celebration_subtitle": "Seu perfil está pronto. Vamos começar.",
"go_to_profile": "Ir para o Perfil",
"continue": "Continuar",
"syncing": "Salvando perfil..."
}
}
28 changes: 26 additions & 2 deletions apps/web/src/actions/auth/sign-in.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
'use server'

import { cookies } from 'next/headers'
import { redirect } from 'next/navigation'
import { postLogin } from '@/api/auth'
import { getMe } from '@/api/users'
import { createSession } from '@/app/lib/session'
import { setAuthToken } from '@/services/api-client'

type SignInInput = {
login: string
Expand All @@ -26,7 +29,28 @@ export async function signIn({ login, password, redirectTo }: SignInInput) {

await createSession({ token })

if (redirectTo) {
redirect(redirectTo)
let finalRedirectTo = redirectTo

try {
setAuthToken(token)
const { data } = await getMe()

if (data?.user && !data.user.displayName) {
const cookieStore = await cookies()
const lang =
cookieStore.get('NEXT_LOCALE')?.value ||
cookieStore.get('i18next')?.value ||
'en-US'
finalRedirectTo = `/${lang}/onboarding`
}
} catch (error) {
console.error(
'Failed to fetch user during sign in for onboarding check',
error
)
}

if (finalRedirectTo) {
redirect(finalRedirectTo)
}
}
Loading
Loading