Encrypt data before sending it to server in a way that makes it unreadable to anyone except the user who sent it
a few comments, from high to low-level:

Usability

users are generally pretty terrible with passwords!  having them "lose" all their data if they forget their password often isn't something they expect.  i.e. they just want to do a "password reset" and get access to everything again.  I know this is at odds with what you (and lots of similar designs) are trying to do, but thought it useful to point out

Separate authentication from encryption

I'd be tempted to use a more conventional protocol for authentication, probably also separating out passwords used for authentication and encryption.  This would let you, e.g., incrementally increase the Argon2 complexity without invalidating their login (this is something you really need to allow for).  It would also let you use some sort of federated authentication system which might be nice

Crypto usage


CBC doesn't provide any authenticity.  i.e. you won't know if the right password has been used / some attacker is trying to decieve you.  I'd suggest using another block mode, or maybe a stream cipher like chacha20-poly1305
I'd probably just use the hash of the email as the salt, using password as well doesn't seem to help much.
your use of Argon2 in encrypt_payload seems to misunderstand its purpose as a general KDF.  You should just request the amount of output you want, e.g., 48 bytes of keying material from Argon2 and use 32 bytes of that as key and 16 bytes as IV.  that means you just need a single 128bit "key" per file rather than a "salt" and an "IV".  your usage isn't any more secure, 128bits is a big enough state space to stop a brute force attack while access to your storage server would give them the header anyway


API usage


argon2::hash_encoded is mostly designed for hashing passwords for authentication.  you almost certainly want to be using hash_raw to just get the keying material out
it might be useful if your design allowed the Config parameters over time to increase computation complexity.  you really want to record the parameter values used somewhere so the right ones can be used