From ccca15d361ead9cf1d1a71eaaff906fe025638ab Mon Sep 17 00:00:00 2001
From: Jaylen Bian <jabian@linkedin.com>
Date: Wed, 28 Jul 2021 17:35:57 +0800
Subject: [PATCH] [infra_ui][overlay] Add delegate to overlay item

---
 .../lib/src/flowy_overlay/flowy_overlay.dart  | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart b/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart
index 5af51e3471..5dac9ae149 100644
--- a/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart
+++ b/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart
@@ -1,6 +1,5 @@
-import 'package:dartz/dartz.dart' show Tuple2;
+import 'package:dartz/dartz.dart' show Tuple3;
 import 'package:flutter/material.dart';
-import 'package:flutter/scheduler.dart';
 
 /// Specifies how overlay are anchored to the SourceWidget
 enum AnchorDirection {
@@ -53,6 +52,10 @@ TransitionBuilder overlayManagerBuilder() {
   };
 }
 
+abstract class FlowyOverlayDelegate {
+  void didRemove();
+}
+
 class FlowyOverlay extends StatefulWidget {
   const FlowyOverlay({
     Key? key,
@@ -105,22 +108,26 @@ class FlowyOverlay extends StatefulWidget {
 }
 
 class FlowyOverlayState extends State<FlowyOverlay> {
-  List<Tuple2<Widget, String>> _overlayList = [];
+  List<Tuple3<Widget, String, FlowyOverlayDelegate?>> _overlayList = [];
 
-  void insert(Widget widget, String identifier) {
+  void insert(Widget widget, String identifier, FlowyOverlayDelegate? delegate) {
     setState(() {
-      _overlayList.add(Tuple2(widget, identifier));
+      _overlayList.add(Tuple3(widget, identifier, delegate));
     });
   }
 
   void remove(String identifier) {
     setState(() {
-      _overlayList.removeWhere((ele) => ele.value2 == identifier);
+      final index = _overlayList.indexWhere((ele) => ele.value2 == identifier);
+      _overlayList.removeAt(index).value3?.didRemove();
     });
   }
 
   void removeAll() {
     setState(() {
+      for (var ele in _overlayList.reversed) {
+        ele.value3?.didRemove();
+      }
       _overlayList = [];
     });
   }