@@ -37,6 +37,8 @@ class ByHetzner extends Component
3737 // Step 1: Token selection
3838 public ?int $ selected_token_id = null ;
3939
40+ public ?string $ selectedTokenUuid = null ;
41+
4042 // Step 2: Server configuration
4143 public array $ locations = [];
4244
@@ -89,18 +91,24 @@ class ByHetzner extends Component
8991
9092 public bool $ from_onboarding = false ;
9193
92- public function mount ()
94+ public function mount (? string $ selectedTokenUuid = null )
9395 {
9496 try {
9597 $ this ->authorize ('viewAny ' , CloudProviderToken::class);
9698 $ this ->loadTokens ();
99+ $ this ->selectTokenFromUrl ($ selectedTokenUuid );
97100 $ this ->loadSavedCloudInitScripts ();
98101 $ this ->server_name = generate_random_name ();
99102 $ this ->private_keys = PrivateKey::ownedAndOnlySShKeys ()->where ('id ' , '!= ' , 0 )->get ();
100103
101104 if ($ this ->private_keys ->count () > 0 ) {
102105 $ this ->private_key_id = $ this ->private_keys ->first ()->id ;
103106 }
107+
108+ if ($ this ->selectedTokenUuid ) {
109+ $ this ->current_step = 2 ;
110+ $ this ->loading_data = true ;
111+ }
104112 } catch (\Throwable $ e ) {
105113 return handleError ($ e , $ this );
106114 }
@@ -207,9 +215,27 @@ protected function messages(): array
207215 ];
208216 }
209217
210- public function selectToken (int $ tokenId )
218+ public function selectToken (int $ tokenId ): mixed
211219 {
212220 $ this ->selected_token_id = $ tokenId ;
221+
222+ return $ this ->nextStep ();
223+ }
224+
225+ private function selectTokenFromUrl (?string $ selectedTokenUuid ): void
226+ {
227+ if (! $ selectedTokenUuid ) {
228+ return ;
229+ }
230+
231+ $ token = $ this ->available_tokens ->firstWhere ('uuid ' , $ selectedTokenUuid );
232+
233+ if (! $ token ) {
234+ return ;
235+ }
236+
237+ $ this ->selectedTokenUuid = $ selectedTokenUuid ;
238+ $ this ->selected_token_id = $ token ->id ;
213239 }
214240
215241 private function validateHetznerToken (string $ token ): bool
@@ -244,29 +270,45 @@ public function nextStep()
244270 ]);
245271
246272 try {
247- $ hetznerToken = $ this ->getHetznerToken ();
248-
249- if (! $ hetznerToken ) {
250- return $ this ->dispatch ('error ' , 'Please select a valid Hetzner token. ' );
273+ if (! $ this ->selectedTokenUuid ) {
274+ $ token = $ this ->available_tokens ->firstWhere ('id ' , $ this ->selected_token_id );
275+
276+ if ($ token ) {
277+ return $ this ->redirectRoute ('server.create.token ' , [
278+ 'type ' => 'hetzner ' ,
279+ 'token_uuid ' => $ token ->uuid ,
280+ ], navigate: true );
281+ }
251282 }
252283
253- // Load Hetzner data
254- $ this ->loadHetznerData ($ hetznerToken );
255-
256- // Move to step 2
284+ // Move to step 2; provider data is loaded after initial render via wire:init.
257285 $ this ->current_step = 2 ;
286+ $ this ->loading_data = true ;
258287 } catch (\Throwable $ e ) {
259288 return handleError ($ e , $ this );
260289 }
261290 }
262291
263292 public function previousStep ()
264293 {
294+ if ($ this ->selectedTokenUuid ) {
295+ return $ this ->redirectRoute ('server.create.type ' , ['type ' => 'hetzner ' ], navigate: true );
296+ }
297+
265298 $ this ->current_step = 1 ;
266299 }
267300
268- private function loadHetznerData (string $ token )
301+ public function loadHetznerData (): void
269302 {
303+ $ token = $ this ->getHetznerToken ();
304+
305+ if (! $ token ) {
306+ $ this ->loading_data = false ;
307+ $ this ->dispatch ('error ' , 'Please select a valid Hetzner token. ' );
308+
309+ return ;
310+ }
311+
270312 $ this ->loading_data = true ;
271313 $ this ->selectedHetznerSshKeyIds = [];
272314 $ this ->selectedHetznerFirewallIds = [];
0 commit comments