Merge branch 'main' into avm99963-monorail

Merged commit 34d8229ae2b51fb1a15bd208e6fe6185c94f6266

GitOrigin-RevId: 7ee0917f93a577e475f8e09526dd144d245593f4
diff --git a/static_src/shared/convertersV0.js b/static_src/shared/convertersV0.js
index ffb8a36..5a50d8a 100644
--- a/static_src/shared/convertersV0.js
+++ b/static_src/shared/convertersV0.js
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -14,7 +14,7 @@
 
 import qs from 'qs';
 
-import {equalsIgnoreCase, capitalizeFirst} from './helpers.js';
+import {equalsIgnoreCase, capitalizeFirst, generateProjectIssueURL} from './helpers.js';
 import {fromShortlink} from 'shared/federated.js';
 import {UserInputError} from 'shared/errors.js';
 import './typedef.js';
@@ -522,14 +522,11 @@
     return extRef.toURL();
   }
 
-  let paramString = '';
   if (Object.keys(queryParamsCopy).length) {
     delete queryParamsCopy.id;
-
-    paramString = `&${qs.stringify(queryParamsCopy)}`;
   }
-
-  return `/p/${ref.projectName}/issues/detail?id=${ref.localId}${paramString}`;
+  const params = {'id': ref.localId, ...queryParamsCopy};
+  return generateProjectIssueURL(ref.projectName, '/detail', params);
 }
 
 /**