chore(firestore): use internal/detect (#10561)

diff --git a/firestore/client.go b/firestore/client.go
index 5f5e186..3049e22 100644
--- a/firestore/client.go
+++ b/firestore/client.go
@@ -27,11 +27,11 @@
 	vkit "cloud.google.com/go/firestore/apiv1"
 	pb "cloud.google.com/go/firestore/apiv1/firestorepb"
 	"cloud.google.com/go/firestore/internal"
+	"cloud.google.com/go/internal/detect"
 	"cloud.google.com/go/internal/trace"
 	gax "github.com/googleapis/gax-go/v2"
 	"google.golang.org/api/iterator"
 	"google.golang.org/api/option"
-	"google.golang.org/api/transport"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
@@ -62,7 +62,7 @@
 // if no credentials were provided. When providing credentials, not all
 // options will allow NewClient to extract the project ID. Specifically a JWT
 // does not have the project ID encoded.
-const DetectProjectID = "*detect-project-id*"
+const DetectProjectID = detect.ProjectIDSentinel
 
 // DefaultDatabaseID is name of the default database
 const DefaultDatabaseID = "(default)"
@@ -88,21 +88,17 @@
 			return nil, fmt.Errorf("firestore: dialing address from env var FIRESTORE_EMULATOR_HOST: %s", err)
 		}
 		o = []option.ClientOption{option.WithGRPCConn(conn)}
-		if projectID == DetectProjectID {
-			projectID, _ = detectProjectID(ctx, opts...)
-			if projectID == "" {
-				projectID = "dummy-emulator-firestore-project"
-			}
+		projectID, _ = detect.ProjectID(ctx, projectID, "", opts...)
+		if projectID == "" {
+			projectID = "dummy-emulator-firestore-project"
 		}
 	}
 	o = append(o, opts...)
 
-	if projectID == DetectProjectID {
-		detected, err := detectProjectID(ctx, o...)
-		if err != nil {
-			return nil, err
-		}
-		projectID = detected
+	// Detect project ID.
+	projectID, err := detect.ProjectID(ctx, projectID, "", o...)
+	if err != nil {
+		return nil, err
 	}
 
 	vc, err := vkit.NewClient(ctx, o...)
@@ -135,17 +131,6 @@
 	return client, nil
 }
 
-func detectProjectID(ctx context.Context, opts ...option.ClientOption) (string, error) {
-	creds, err := transport.Creds(ctx, opts...)
-	if err != nil {
-		return "", fmt.Errorf("fetching creds: %w", err)
-	}
-	if creds.ProjectID == "" {
-		return "", errors.New("firestore: see the docs on DetectProjectID")
-	}
-	return creds.ProjectID, nil
-}
-
 // Close closes any resources held by the client.
 //
 // Close need not be called at program exit.