3
3
4
4
package com.tailscale.ipn.ui.view
5
5
6
+ import android.content.Intent
7
+ import android.net.Uri
6
8
import androidx.compose.foundation.background
7
9
import androidx.compose.foundation.layout.Arrangement
8
10
import androidx.compose.foundation.layout.Column
@@ -12,6 +14,7 @@ import androidx.compose.foundation.layout.padding
12
14
import androidx.compose.foundation.lazy.LazyColumn
13
15
import androidx.compose.material.icons.Icons
14
16
import androidx.compose.material.icons.filled.MoreVert
17
+ import androidx.compose.material3.AlertDialog
15
18
import androidx.compose.material3.DropdownMenu
16
19
import androidx.compose.material3.DropdownMenuItem
17
20
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -20,12 +23,15 @@ import androidx.compose.material3.IconButton
20
23
import androidx.compose.material3.MaterialTheme
21
24
import androidx.compose.material3.Scaffold
22
25
import androidx.compose.material3.Text
26
+ import androidx.compose.material3.TextButton
23
27
import androidx.compose.runtime.Composable
24
28
import androidx.compose.runtime.collectAsState
25
29
import androidx.compose.runtime.getValue
26
30
import androidx.compose.runtime.mutableStateOf
27
31
import androidx.compose.runtime.remember
32
+ import androidx.compose.runtime.setValue
28
33
import androidx.compose.ui.Modifier
34
+ import androidx.compose.ui.platform.LocalContext
29
35
import androidx.compose.ui.res.stringResource
30
36
import androidx.compose.ui.tooling.preview.Preview
31
37
import androidx.compose.ui.unit.dp
@@ -50,6 +56,11 @@ fun UserSwitcherView(nav: UserSwitcherNav, viewModel: UserSwitcherViewModel = vi
50
56
val users by viewModel.loginProfiles.collectAsState()
51
57
val currentUser by viewModel.loggedInUser.collectAsState()
52
58
val showHeaderMenu by viewModel.showHeaderMenu.collectAsState()
59
+ var showDeleteDialog by remember { mutableStateOf(false ) }
60
+ val context = LocalContext .current
61
+ val netmap = viewModel.netmap.collectAsState()
62
+ val CapabilityIsOwner = " https://tailscale.com/capability/is-owner"
63
+ val isOwner = netmap.value?.hasCap(CapabilityIsOwner ) == true
53
64
54
65
Scaffold (
55
66
topBar = {
@@ -138,10 +149,41 @@ fun UserSwitcherView(nav: UserSwitcherNav, viewModel: UserSwitcherViewModel = vi
138
149
}
139
150
})
140
151
}
152
+
153
+ Lists .SectionDivider ()
154
+ Setting .Text (R .string.delete_tailnet, destructive = true ) {
155
+ showDeleteDialog = true
156
+ }
141
157
}
142
158
}
143
159
}
144
160
}
161
+
162
+ if (showDeleteDialog) {
163
+ AlertDialog (
164
+ onDismissRequest = { showDeleteDialog = false },
165
+ title = { Text (text = stringResource(R .string.delete_tailnet)) },
166
+ text = { Text (text = stringResource(if (isOwner) R .string.request_deletion_owner else R .string.request_deletion_nonowner)) },
167
+ confirmButton = {
168
+ TextButton (
169
+ onClick = {
170
+ // Call into your ViewModel
171
+ // viewModel.onDeleteClicked(viewModel.currentTailnetId)
172
+
173
+ val intent =
174
+ Intent (Intent .ACTION_VIEW , Uri .parse(" https://tailscale.com/contact/support" ))
175
+ context.startActivity(intent)
176
+ showDeleteDialog = false
177
+ }) {
178
+ Text (text = stringResource(R .string.contact_support))
179
+ }
180
+ },
181
+ dismissButton = {
182
+ TextButton (onClick = { showDeleteDialog = false }) {
183
+ Text (text = stringResource(R .string.cancel))
184
+ }
185
+ })
186
+ }
145
187
}
146
188
147
189
@Composable
0 commit comments