9.1 KiB
9.1 KiB
TODO
General
- Implement targeted previews
- Implement tinted/colored menu icons + config for line weight etc.
- Refactor: Change "ImageType" to "IconType", and "imageValue" to "imageType"
- Move menu icon related properties to "icon":
{ icon: { iconType: '', iconValue: '', tint: ''} } - Impl. support for icon weight
- Implement
ImageType.ASSETto support: "create an image from an image asset or image file located in your app’s main bundle"
- The
imageValuestring fromMenuAction/MenuConfigwill be used to init aUIImage, like:UIImage(named: imageValue)
- Implement
ImageType.REQUIREto support using images viarequire(path/to/image)
- One way to implement is to use
Image.resolveAssetSource(source);from the RN docs. So we have something like:{ imageType: 'REQUIRE', imageValue: require('path/to/image.png') }.- Reference: Medium Article. Explains how
Image.resolveAssetSourceworks.
- Reference: Medium Article. Explains how
- Attempted to impl. this but ran into problems: when in debug mode, assets are provided via a local URL via the metro bundler.
- Implement
ActionSheetModuleto display an "Action Sheet" menu viaUIAlertController.
- Reference: Article in the apple developer about "Alerts and Action Sheets"
- Reference: 
ActionSheetIOS JS code. The native module is calledRCTActionSheetManager(link to JS native module, and link to native code) - Reference: @react-native-menu/menu library has a very good looking
ActionSheetfallback with icons and disabled menu actions.
ContextMenu— Add support forUIDefferedElement
- In
MenuConfig.menuItemsproperty or in themenuConfigprop, if an object has a property calleddefferedKey, then it means we want to create aUIDefferedElementelement. - Impl.
onRequestDefferedElementfunction. This function is called whenever aUIDefferedElementitem needs to be loaded.- This function will receive a
defferedKey. This function must return a promise, i.e. either aMenuConfigorMenuActionobject. - If the returned promise is a
MenuActionobject, it will usedefferedKeyfor theactionKeyproperty. - In this function, based on the
defferedKeyit must return a correspondingMenuConfig/MenuActionobject. Ifnullis returned, then it means it failed. - This function is invoked from the native side. Native UI component
NativeCommandsdon't natively support promises, so a workaround must be used based onrequestcallbacks (like the one i used on react-native-ios-modal). ButNativeModulefunctions has support for promises built in.- We can use
findNodeHandle(this.nativeCompRef)to get a node handle. Then we can useself.bridge.uiManager.view(forReactTag: node)to get a ref to the component. Then we cast it to the correct type:component as? RCTContextMenuViewand then call the completion function for the correspondingUIDefferedElement, something like:contextMenuView.resolveDefferedMenuElement(for: defferedKey, item: menuElementDict)
- We can use
- We need to create a class to create a
UIDeferredMenuElement. It will extendRCTMenuElementand can be init from a dictionary. Probably name it something like:RCTMenuDefferedItem. It will have one property:defferedKeyRCTMenuItem.createMenufunction must be updated to also handle creating aRCTMenuDefferedItemitem.
- On the native side when we create a
UIDeferredMenuElementwe do this:UIDeferredMenuElement { completion in self.completionDict[defferedKey] = completion }, and then invoke a RN event:self.onRequestDefferedElement([defferedKey: defferedKey]).onRequestDefferedElementevent prop will be invoked. We wait for the promise to return some value and then call aNativeModulefunction.- The
NativeModulefunction will probably look like this:ContextMenuViewModule.resolveDefferedMenuElement({nodeHandle, defferedKey, menuItem}); - Completion handlers will be stored in a dictionary. I'm not sure if I can use
NSMapTable. I can use a plainNSDictionarybut if I accidentally forget to cleanup (i.e. remove the completion handler from the dict) then that completion handler will be retained, causing a memory leak.- Completion handlers, i.e. closures, are reference types. If I assign it to
NSMapTablewithvalueOptions: .weakMemory, will it be automatically be released when it's no longer used? Will it be retained while it's in use or will it be released the moment i add it toNSMapTablebecause nothing is using it? Technically, it is in use because it's inUIDeferredMenuElementargument (so the ref count should increase?)
- Completion handlers, i.e. closures, are reference types. If I assign it to
- This function will receive a
ContextMenu— AdddiscoverabilityTitletoUIAction- Test
ContextMenuViewandContextMenuButtonon different react native versions- Test on 0.60
- Test on 0.61
- Test on 0.62
- Test on 0.63.3
react-native-context-menuuses autolinking for installation. Check if this library will work on older react-native versions prior to 0.60 i.e testContextMenuViewandContextMenuButtonon react native versions older than 0.60- Test on 0.59
- Test on 0.58
ContextMenuView
- ⭐️ Export
ActionSheetFallbackfunction and add it to the docs. - 🛠 Rename
RCTContextMenuManagertoRCTContextMenuViewManagerand update corresponding js native component - ⭐️ Impl. iOS 14 specific feature:
UpdateVisibleMenu - ⭐️ Impl. iOS 14 specific feature:
dismissMenu
- Try implementing this via
NativeModule
- ⭐️ Custom Preview - Add support for custom previews, i.e by passing a child component to
RCTContextMenuView, and wrapping that child inside a view controller and passing it as the preview target inUIMenuconfig. The first child of theRCTContextMenuViewwill be reserved for the custom menu preview. If no child is passed, i.e no custom preview is configured, then the preview target is not set for theUIMenu. The preview view should only be mounted when the menu is visible, and thus, it should support setting the preferred size of the preview target. Test if the preview target can be changed when it's already visible.- ⭐️ Custom Preview - Add support for setting an image as the custom preview. Use the built-in
Imagereact native component to handle setting the image source + sizing. Receive the image as a child fromRCTContextMenuViewand cast it toRCTImageif necessary. The image will then be wrapped inside a view controller and is set as theUIMenu's preview target. The view should be resized to fit the screen.
- ⭐️ Custom Preview - Add support for setting an image as the custom preview. Use the built-in
ContextMenuButton
- Finish initial impl. with 1 working simple example
- Add documentation for
ContextMenuButton - Add
SystemImagecomponent for creating aUIImagethat uses SF Icons (Research first if the built-in image component already supports this). - Add example for
wrapNativeComponentprop, i.e. example for using a different "button" component.
Documentation
- First remove all the links that point to the examples directory or links to different section. Highlight them in yellow then replace the highlighted text in the documentation with the new/updated section/examples links.
- Move
ContextMenuViewexamples + tests inexamples/srctoexamples/src/ContextMenuViewthen update documentation links - In the "Examples" section add section for
ContextMenuViewandContextMenuButton, then update the documentation "jump to" heading links - Update and rename Images/Gifs
- Move gifs for
ContextMenuViewin/assetstoassets/ContextMenuView/ - Rename
ContextMenuViewgifs i.e. prefix them with "ContextMenuView" e.g.SimpleExample-1-2-3-4.gifbecomesContextMenuView-SimpleExample-1-2-3-4.gif, etc. - In the
/assets/example-screenshotsfolder, prefix images with "ContextMenuView", e.g.SimpleExample01.pngbecomesContextMenuView-SimpleExample01.png, etc.
- Move gifs for
- Move
- In the "Documentation" section, add
ContextMenuButtonprops. - In the
MenuActionObject section, add example object with comments. - In the
MenuConfigObject section, add example object with comments. - Finish
onPressMenuItemnativeEventObject section. - Create collapsable "Table of Contents"
- Make examples content collapsable
- Add section for
useActionSheetFallbackprop - Add
README.mdin example directory