Looking at some old (1.12.2) code from redstoneflux, I traced its fov changes back to cofhcore. In there, they subscribe to the FOVUpdateEvent, and test if the active itemstack's item is an instance of their modded bow. The event given by the subscription has a method to setNewFov, where they take the current fov, and subtract off (the bow's "progress" (how far the bow is pulled back) squared, times an arbitrary modifier, aka "zoom").
Hopefully this transfers over to 1.15 more easily, but even if it doesn't, that should at least provide some more insight about what to do.
related links:
FOVUpdateEvent: https://github.com/CoFH/CoFHCore/blob/dbab6db4bfa90dd0a4bb801330620dc34a0392a9/src/main/java/cofh/core/proxy/EventHandlerClient.java
Bow: https://github.com/CoFH/CoFHCore/blob/1.12/src/main/java/cofh/core/item/tool/ItemBowCore.java