Skip to content

Commit e42ccd3

Browse files
committed
fix: update QRModal button variant based on copy state and enhance subscriptionConfig with case-insensitive search parameter retrieval
1 parent a2b1bf9 commit e42ccd3

2 files changed

Lines changed: 29 additions & 9 deletions

File tree

src/components/qr-modal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export const QRModal = memo(({ link, open, onOpenChange }: QRModalProps) => {
192192
<Button
193193
onClick={handleCopyBase64}
194194
size="sm"
195-
variant="outline"
195+
variant={copiedBase64 ? 'default' : 'outline'}
196196
className="w-full gap-2 h-10 text-sm"
197197
>
198198
{copiedBase64 ? (

src/lib/subscriptionConfig.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const WIREGUARD_PROTOCOL = 'wireguard://'
2-
const TEXT_FILE_MIME_TYPE = 'text/plain;charset=utf-8'
2+
const TEXT_FILE_MIME_TYPE = 'application/octet-stream'
33

44
const safeDecodeURIComponent = (value: string) => {
55
try {
@@ -16,6 +16,20 @@ const formatCommaSeparatedValue = (value: string) =>
1616
.filter(Boolean)
1717
.join(', ')
1818

19+
const getSearchParam = (params: URLSearchParams, name: string) => {
20+
const directValue = params.get(name)
21+
if (directValue !== null) return directValue
22+
23+
const normalizedName = name.toLowerCase()
24+
for (const [key, value] of params.entries()) {
25+
if (key.toLowerCase() === normalizedName) {
26+
return value
27+
}
28+
}
29+
30+
return ''
31+
}
32+
1933
const sanitizeFileNameSegment = (value: string | null | undefined) => {
2034
if (!value) return ''
2135

@@ -38,6 +52,7 @@ const getWireGuardEndpointHost = (hostname: string) => {
3852
type ParsedWireGuardUri = {
3953
address: string
4054
allowedIps: string
55+
dns: string
4156
endpoint: string
4257
mtu: string
4358
port: string
@@ -63,18 +78,19 @@ const parseWireGuardUri = (value: string): ParsedWireGuardUri | null => {
6378
const endpointHost = getWireGuardEndpointHost(hostname)
6479

6580
return {
66-
address: parsed.searchParams.get('address') || '',
67-
allowedIps: parsed.searchParams.get('allowedips') || '',
81+
address: getSearchParam(parsed.searchParams, 'address'),
82+
allowedIps: getSearchParam(parsed.searchParams, 'allowedips'),
83+
dns: getSearchParam(parsed.searchParams, 'dns'),
6884
endpoint: port ? `${endpointHost}:${port}` : endpointHost,
69-
mtu: parsed.searchParams.get('mtu') || '',
85+
mtu: getSearchParam(parsed.searchParams, 'mtu'),
7086
port,
71-
preSharedKey: parsed.searchParams.get('presharedkey') || '',
87+
preSharedKey: getSearchParam(parsed.searchParams, 'presharedkey'),
7288
privateKey: safeDecodeURIComponent(parsed.username),
73-
publicKey: parsed.searchParams.get('publickey') || '',
89+
publicKey: getSearchParam(parsed.searchParams, 'publickey'),
7490
remark: safeDecodeURIComponent(parsed.hash.replace(/^#/, '')),
75-
reserved: parsed.searchParams.get('reserved') || '',
91+
reserved: getSearchParam(parsed.searchParams, 'reserved'),
7692
source,
77-
keepalive: parsed.searchParams.get('keepalive') || '',
93+
keepalive: getSearchParam(parsed.searchParams, 'keepalive'),
7894
}
7995
} catch {
8096
return null
@@ -100,6 +116,10 @@ export const convertWireGuardUrlToConfig = (value: string) => {
100116
lines.push(`PrivateKey = ${parsed.privateKey}`)
101117
lines.push(`Address = ${formatCommaSeparatedValue(parsed.address)}`)
102118

119+
if (parsed.dns) {
120+
lines.push(`DNS = ${formatCommaSeparatedValue(parsed.dns)}`)
121+
}
122+
103123
if (parsed.mtu) {
104124
lines.push(`MTU = ${parsed.mtu}`)
105125
}

0 commit comments

Comments
 (0)