// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';

import '../router.dart';

/// GoRouter implementation of InheritedWidget.
///
/// Used for to find the current GoRouter in the widget tree. This is useful
/// when routing from anywhere in your app.
class InheritedGoRouter extends InheritedWidget {
  /// Default constructor for the inherited go router.
  const InheritedGoRouter({
    required Widget child,
    required this.goRouter,
    Key? key,
  }) : super(child: child, key: key);

  /// The [GoRouter] that is made available to the widget tree.
  final GoRouter goRouter;

  /// Used by the Router architecture as part of the InheritedWidget.
  @override
  // ignore: prefer_expression_function_bodies
  bool updateShouldNotify(covariant InheritedGoRouter oldWidget) {
    // avoid rebuilding the widget tree if the router has not changed
    return goRouter != oldWidget.goRouter;
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    properties.add(DiagnosticsProperty<GoRouter>('goRouter', goRouter));
  }
}
