@@ -5,6 +5,7 @@ import { ModalContent, ModalFooter } from "@components/modal/Modal";
55import Paragraph from "@components/Paragraph" ;
66import SmallParagraph from "@components/SmallParagraph" ;
77import { Tabs , TabsList , TabsTrigger } from "@components/Tabs" ;
8+ import { cn } from "@utils/helpers" ;
89import { ExternalLinkIcon } from "lucide-react" ;
910import { usePathname } from "next/navigation" ;
1011import React from "react" ;
@@ -31,27 +32,36 @@ type OidcUserInfo = {
3132type Props = {
3233 showClose ?: boolean ;
3334 user ?: OidcUserInfo ;
35+ setupKey ?: string ;
3436} ;
3537
36- export default function SetupModal ( { showClose = true , user } : Props ) {
38+ export default function SetupModal ( {
39+ showClose = true ,
40+ user,
41+ setupKey,
42+ } : Readonly < Props > ) {
3743 return (
3844 < ModalContent showClose = { showClose } >
39- < SetupModalContent user = { user } />
45+ < SetupModalContent user = { user } setupKey = { setupKey } />
4046 </ ModalContent >
4147 ) ;
4248}
4349
50+ type SetupModalContentProps = {
51+ user ?: OidcUserInfo ;
52+ header ?: boolean ;
53+ footer ?: boolean ;
54+ tabAlignment ?: "center" | "start" | "end" ;
55+ setupKey ?: string ;
56+ } ;
57+
4458export function SetupModalContent ( {
4559 user,
4660 header = true ,
4761 footer = true ,
4862 tabAlignment = "center" ,
49- } : {
50- user ?: OidcUserInfo ;
51- header ?: boolean ;
52- footer ?: boolean ;
53- tabAlignment ?: "center" | "start" | "end" ;
54- } ) {
63+ setupKey,
64+ } : Readonly < SetupModalContentProps > ) {
5565 const os = useOperatingSystem ( ) ;
5666 const [ isFirstRun ] = useLocalStorage < boolean > ( "netbird-first-run" , true ) ;
5767 const pathname = usePathname ( ) ;
@@ -60,24 +70,33 @@ export function SetupModalContent({
6070 return (
6171 < >
6272 { header && (
63- < div className = { "text-center pb-8 pt-4 px-8" } >
64- < h2 className = { "text-3xl max-w-lg mx-auto" } >
73+ < div className = { "text-center pb-5 pt-4 px-8" } >
74+ < h2
75+ className = { cn (
76+ "max-w-lg mx-auto" ,
77+ setupKey ? "text-2xl" : "text-3xl" ,
78+ ) }
79+ >
6580 { isFirstRun && ! isInstallPage ? (
6681 < >
6782 Hello { user ?. given_name || "there" } ! 👋 < br />
6883 { `It's time to add your first device.` }
6984 </ >
7085 ) : (
71- < > Install NetBird</ >
86+ < > Install NetBird with Setup Key </ >
7287 ) }
7388 </ h2 >
74- < Paragraph className = { "max-w-xs mx-auto mt-3" } >
75- To get started, install NetBird and log in with your email account.
89+ < Paragraph
90+ className = { cn ( "mx-auto mt-3" , setupKey ? "max-w-sm" : "max-w-xs" ) }
91+ >
92+ { setupKey
93+ ? "To get started, install and run NetBird with your recently created setup key as a parameter."
94+ : "To get started, install NetBird and log in with your email account." }
7695 </ Paragraph >
7796 </ div >
7897 ) }
7998
80- < Tabs defaultValue = { String ( os ) } >
99+ < Tabs defaultValue = { String ( setupKey ? OperatingSystem . LINUX : os ) } >
81100 < TabsList justify = { tabAlignment } className = { "pt-2 px-3" } >
82101 < TabsTrigger value = { String ( OperatingSystem . LINUX ) } >
83102 < ShellIcon
@@ -103,22 +122,28 @@ export function SetupModalContent({
103122 />
104123 macOS
105124 </ TabsTrigger >
106- < TabsTrigger value = { String ( OperatingSystem . IOS ) } >
107- < IOSIcon
108- className = {
109- "fill-nb-gray-500 group-data-[state=active]/trigger:fill-netbird transition-all"
110- }
111- />
112- iOS
113- </ TabsTrigger >
114- < TabsTrigger value = { String ( OperatingSystem . ANDROID ) } >
115- < AndroidIcon
116- className = {
117- "fill-nb-gray-500 group-data-[state=active]/trigger:fill-netbird transition-all"
118- }
119- />
120- Android
121- </ TabsTrigger >
125+
126+ { ! setupKey && (
127+ < >
128+ < TabsTrigger value = { String ( OperatingSystem . IOS ) } >
129+ < IOSIcon
130+ className = {
131+ "fill-nb-gray-500 group-data-[state=active]/trigger:fill-netbird transition-all"
132+ }
133+ />
134+ iOS
135+ </ TabsTrigger >
136+ < TabsTrigger value = { String ( OperatingSystem . ANDROID ) } >
137+ < AndroidIcon
138+ className = {
139+ "fill-nb-gray-500 group-data-[state=active]/trigger:fill-netbird transition-all"
140+ }
141+ />
142+ Android
143+ </ TabsTrigger >
144+ </ >
145+ ) }
146+
122147 < TabsTrigger value = { String ( OperatingSystem . DOCKER ) } >
123148 < DockerIcon
124149 className = {
@@ -128,12 +153,19 @@ export function SetupModalContent({
128153 Docker
129154 </ TabsTrigger >
130155 </ TabsList >
131- < LinuxTab />
132- < WindowsTab />
133- < MacOSTab />
134- < AndroidTab />
135- < IOSTab />
136- < DockerTab />
156+
157+ < LinuxTab setupKey = { setupKey } />
158+ < WindowsTab setupKey = { setupKey } />
159+ < MacOSTab setupKey = { setupKey } />
160+
161+ { ! setupKey && (
162+ < >
163+ < AndroidTab />
164+ < IOSTab />
165+ </ >
166+ ) }
167+
168+ < DockerTab setupKey = { setupKey } />
137169 </ Tabs >
138170 { footer && (
139171 < ModalFooter variant = { "setup" } >
@@ -158,3 +190,18 @@ export function SetupModalContent({
158190 </ >
159191 ) ;
160192}
193+
194+ type SetupKeyParameterProps = {
195+ setupKey ?: string ;
196+ } ;
197+
198+ export const SetupKeyParameter = ( { setupKey } : SetupKeyParameterProps ) => {
199+ return (
200+ setupKey && (
201+ < >
202+ { " " }
203+ --setup-key < span className = { "text-netbird" } > { setupKey } </ span > { " " }
204+ </ >
205+ )
206+ ) ;
207+ } ;
0 commit comments