diff --git a/.woodpecker/.audit.yaml b/.woodpecker/.audit.yaml new file mode 100644 index 0000000..905f259 --- /dev/null +++ b/.woodpecker/.audit.yaml @@ -0,0 +1,18 @@ +variables: + - shared-config: &shared-config + image: rg.fr-par.scw.cloud/asr-projects/beau-gosse-du-92/ci-lint-audit:latest + pull: true + +steps: + - name: dependencies + <<: *shared-config + commands: | + cargo deny check + # Not ready to block PR on fail + failure: ignore + +when: + - event: pull_request + +depends_on: + - lint diff --git a/.woodpecker/.dependencies.yaml b/.woodpecker/.dependencies.yaml index 9a6d3ce..7028509 100644 --- a/.woodpecker/.dependencies.yaml +++ b/.woodpecker/.dependencies.yaml @@ -2,7 +2,6 @@ steps: - name: renovate image: renovate/renovate pull: true - settings: commands: - renovate $${CI_REPO} environment: diff --git a/.woodpecker/.lint-audit-image.yaml b/.woodpecker/.lint-audit-image.yaml new file mode 100644 index 0000000..c0b02b7 --- /dev/null +++ b/.woodpecker/.lint-audit-image.yaml @@ -0,0 +1,17 @@ +steps: + dockerize: + image: woodpeckerci/plugin-kaniko + settings: + registry: rg.fr-par.scw.cloud + repo: asr-projects/beau-gosse-du-92/ci-lint-audit + dockerfile: ./docker/Dockerfile.ci-lint-audit + tags: latest + auto_tag: false + cache: false + username: nologin + password: + from_secret: registry-password + +when: + - event: push + path: ./docker/Dockerfile.ci-lint-audit diff --git a/.woodpecker/.lint.yaml b/.woodpecker/.lint.yaml new file mode 100644 index 0000000..6a2568f --- /dev/null +++ b/.woodpecker/.lint.yaml @@ -0,0 +1,45 @@ +variables: + - shared-config: &shared-config + image: rg.fr-par.scw.cloud/asr-projects/beau-gosse-du-92/ci-lint-audit:latest + pull: true + +steps: + - name: format + <<: *shared-config + commands: | + cargo fmt --all --check + + - name: sort derives + <<: *shared-config + commands: | + cargo sort-derives --check + + - name: clippy + <<: *shared-config + commands: | + cargo clippy --all --all-features -- -D warnings + # Not ready to block PR on fail + failure: ignore + + - name: spellcheck + <<: *shared-config + commands: | + cargo spellcheck + + - name: dependencies + <<: *shared-config + commands: | + cargo udeps + + - name: dockerizable (web) + image: woodpeckerci/plugin-kaniko + settings: + registry: rg.fr-par.scw.cloud + repo: asr-projects/beau-gosse-du-92-web + username: nologin + password: + from_secret: registry-password + dry-run: true + +when: + - event: pull_request diff --git a/.woodpecker/.validate.yaml b/.woodpecker/.validate.yaml deleted file mode 100644 index feed5aa..0000000 --- a/.woodpecker/.validate.yaml +++ /dev/null @@ -1,28 +0,0 @@ -steps: - - name: format - image: rust:latest - commands: - - rustup component add rustfmt - - cargo fmt --all --check - - - name: clippy - image: rust:latest - commands: - - apt update && apt install -y libgtk-3-dev libjavascriptcoregtk-4.1-dev libwebkit2gtk-4.1-dev - - rustup component add clippy - - cargo clippy --all --all-features -- -D warnings - # Not ready for clippy validation - failure: ignore - - # - name: build - # image: rust:latest - # commands: - # - cargo install dioxus-cli --locked -j ${JOBS_NB:-default} - # - rustup target add wasm32-unknown-unknown - # - cargo install -f wasm-bindgen-cli --version 0.2.93 - # - dx build -r --platform web -- -j ${JOBS_NB:-default} - -when: - - event: pull_request - # - event: push - # branch: ${CI_REPO_DEFAULT_BRANCH} diff --git a/Cargo.toml b/Cargo.toml index 4a03203..67e44fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,10 +2,14 @@ name = "beau-gosse-du-92" version = "0.1.0" edition = "2021" +license = "AGPL-3.0-or-later" [features] default = [] +[package.metadata.spellcheck] +config = "./spellcheck.toml" + [dependencies] # Errors anyhow = "1.0.75" @@ -46,9 +50,6 @@ turf = "0.9.3" dioxus-free-icons = { version = "0.9", features = ["ionicons", "font-awesome-solid"] } modx = "0.1.4" -# Matrix rich text editor -wysiwyg = { git = "https://github.com/matrix-org/matrix-rich-text-editor.git" } - [target.'cfg(target_family = "wasm")'.dependencies] # Logging/tracing tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/Dockerfile b/Dockerfile index c47e365..843e93d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,4 @@ -FROM rust:1.86 AS builder - -# Homemade docker image providing the dioxus-cli -COPY --from=rg.fr-par.scw.cloud/asr-projects/dioxus-cli:asr-0.6.3 /usr/local/bin/dx /usr/local/bin/dx +FROM rg.fr-par.scw.cloud/asr-projects/dioxus-cli-0.6.3:latest AS builder ARG JOBS_NB=${JOBS_NB:-default} # Disable incremental compilation @@ -10,6 +7,11 @@ ARG CARGO_INCREMENTAL=0 WORKDIR /usr/src/beau-gosse-du-92 +# git is required by the git-version crate +RUN apt update \ + && apt install -y --no-install-recommends git \ + && apt clean + COPY . . RUN dx build -r --platform web -- -j ${JOBS_NB} diff --git a/README.md b/README.md index c9ff9b0..ad23948 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ reinvent the wheel. This solution provides: - [Open-source protocol](https://spec.matrix.org/v1.9/). - Features expected for a messaging solution in 2024 (multi-devices management, emojis, integrations, redaction, spaces, ...). -- Multi-platforms clients (Android, iOS and Webclient). -- SDK available for each platform and a new Rust sdk supporting all the previously listed platforms. +- Multi-platforms clients (Android, iOS and web-client). +- SDK available for each platform and a new Rust SDK supporting all the previously listed platforms. - Conference stack ([Element Call](https://github.com/element-hq/element-call)). - End-to-end encryption. - Federation management. @@ -28,16 +28,16 @@ API)](https://spec.matrix.org/v1.9/client-server-api/) protocol. Even if the Rust SDK is still in beta, it seems to be the future one (cf. [Element X - experience the future of Element!](https://element.io/blog/element-x-experience-the-future-of-element/)) and a good choice for someone starting a -new client... from my point of vue. +new client... from my point of view. -The SDK choosen, a Rust (to avoid to use the bindings provided by the matrix-rust-sdk and mostly because I want to +The SDK chosen, a Rust (to avoid to use the bindings provided by the matrix-rust-sdk and mostly because I want to learn Rust) graphical library should be selected. The [Dioxus](https://dioxuslabs.com/) one seems to do the job: - React-inspired library for Rust. -- Multi-platforms (use of Webview or WGPU-enabled renderers). +- Multi-platforms (use of Web-view or WGPU-enabled renderers). # TODO - [ ] Test dioxus-radio. - [ ] Design system ? -- [ ] Implement MSN messenger features using Matrix.org sdk... +- [ ] Implement MSN messenger features using Matrix.org SDK... diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..9db3481 --- /dev/null +++ b/deny.toml @@ -0,0 +1,298 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# Root options + +# The graph table configures how the dependency graph is constructed and thus +# which crates the checks are performed against +[graph] +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #"x86_64-unknown-linux-musl", + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] +# When creating the dependency graph used as the source of truth when checks are +# executed, this field can be used to prune crates from the graph, removing them +# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate +# is pruned from the graph, all of its dependencies will also be pruned unless +# they are connected to another crate in the graph that hasn't been pruned, +# so it should be used with care. The identifiers are [Package ID Specifications] +# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) +#exclude = [] +# If true, metadata will be collected with `--all-features`. Note that this can't +# be toggled off if true, if you want to conditionally enable `--all-features` it +# is recommended to pass `--all-features` on the cmd line instead +all-features = false +# If true, metadata will be collected with `--no-default-features`. The same +# caveat with `all-features` applies +no-default-features = false +# If set, these feature will be enabled when collecting metadata. If `--features` +# is specified on the cmd line they will take precedence over this option. +#features = [] + +# The output table provides options for how/if diagnostics are outputted +[output] +# When outputting inclusion graphs in diagnostics that include features, this +# option can be used to specify the depth at which feature edges will be added. +# This option is included since the graphs can be quite large and the addition +# of features from the crate(s) to all of the graph roots can be far too verbose. +# This option can be overridden via `--feature-depth` on the cmd line +feature-depth = 1 + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory databases are cloned/fetched into +#db-path = "$CARGO_HOME/advisory-dbs" +# The url(s) of the advisory databases to use +#db-urls = ["https://github.com/rustsec/advisory-db"] +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + #"RUSTSEC-0000-0000", + #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" }, + #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish + #{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" }, +] +# If this is true, then cargo deny will use the git executable to fetch advisory database. +# If this is false, then it uses a built-in git library. +# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. +# See Git Authentication for more information about setting up git authentication. +#git-fetch-with-cli = true + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +version = 2 +# List of explicitly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + # Free software licenses compatible with (A)GPL. + # List extracted from: https://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses + # "GPL-3.0", + # "GPL-2.0", + "LGPL-3.0", + # "LGPL-2.1", + "AGPL-3.0", + # "FSFAP", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + # "Artistic-2.0", + # "ClArtistic", + # "Sleepycat", + "BSL-1.0", + "BSD-3-Clause", + # "CECILL-2.0", + # "BSD-3-Clause-Clear", + # "ECL-2.0", + # "EFL-2.0", + # "EUDatagrid", + "MIT", + "BSD-2-Clause", + # "FTL", + # "HPND", + # "iMatix", + # "Imlib2", + # "IJG", + # "Intel", + "ISC", + "MPL-2.0", + "NCSA", + # "OLDAP-2.7", + # "NIST-PD", + # "CC-PDDC", + "CC0-1.0", + # "Python-2.0", + # "Ruby", + # "SGI-B-2.0", + # "SMLNJ", + # "UPL-1.0", + "Unlicense", + # "Vim", + # "W3C", + # "WTFPL", + # "X11", + # "XFree86-1.1", + "Zlib", + # "zlib-acknowledgement", + # "ZPL-2.0", + # "ZPL-2.1", + # Not expressely listed as (A)GPL compatible in the page above, but + # according to https://opensource.org/licenses/0BSD it is a modification + # of the ISC license, which is compatible. Its text is also extremely + # simple and allows using the code for any purpose + "0BSD", + # Permissive license used by the Unicode consortium, similar in spirit + # to other permissive licenses: + # https://spdx.org/licenses/Unicode-DFS-2016.html + "Unicode-DFS-2016", + # Permissive license used by the Unicode consortium, similar in spirit + # to other permissive licenses: + # https://spdx.org/licenses/Unicode-3.0.html + "Unicode-3.0", +] +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.8 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + #{ allow = ["Zlib"], crate = "adler32" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +# [[licenses.clarify]] +# The package spec the clarification applies to +# crate = "ring" +# The SPDX expression for the license requirements of the crate +# expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +# license-files = [ +#Each entry is a crate relative path, and the (opaque) hash of its contents +# { path = "LICENSE", hash = 0xbd0eed23 } +# ] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries. +# To see how to mark a crate as unpublished (to the official registry), +# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. +ignore = false +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "warn" +# Lint level for when a crate version requirement is `*` +wildcards = "allow" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# The default lint level for `default` features for crates that are members of +# the workspace that is being checked. This can be overridden by allowing/denying +# `default` on a crate-by-crate basis if desired. +workspace-default-features = "allow" +# The default lint level for `default` features for external crates that are not +# members of the workspace. This can be overridden by allowing/denying `default` +# on a crate-by-crate basis if desired. +external-default-features = "allow" +# List of crates that are allowed. Use with care! +allow = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" }, +] +# List of crates to deny +deny = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" }, + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] }, +] + +# List of features to allow/deny +# Each entry the name of a crate and a version range. If version is +# not specified, all versions will be matched. +#[[bans.features]] +#crate = "reqwest" +# Features to not allow +#deny = ["json"] +# Features to allow +#allow = [ +# "rustls", +# "__rustls", +# "__tls", +# "hyper-rustls", +# "rustls", +# "rustls-pemfile", +# "rustls-tls-webpki-roots", +# "tokio-rustls", +# "webpki-roots", +#] +# If true, the allowed features must exactly match the enabled feature set. If +# this is set there is no point setting `deny` +#exact = true + +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" }, +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite. +skip-tree = [ + #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies + #{ crate = "ansi_term@0.11.0", depth = 20 }, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "warn" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "warn" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [ + "https://github.com/matrix-org/matrix-rust-sdk.git" +] + +[sources.allow-org] +# github.com organizations to allow git sources for +github = [] +# gitlab.com organizations to allow git sources for +gitlab = [] +# bitbucket.org organizations to allow git sources for +bitbucket = [] diff --git a/docker/Dockerfile.ci-lint-audit b/docker/Dockerfile.ci-lint-audit new file mode 100644 index 0000000..ef8515e --- /dev/null +++ b/docker/Dockerfile.ci-lint-audit @@ -0,0 +1,26 @@ +FROM rust:1.86 AS builder + +RUN apt update \ + && apt install -y --no-install-recommends libclang-dev hunspell \ + && apt clean + +RUN rustup default nightly \ + && rustup component add rustfmt clippy + +RUN cargo install cargo-binstall + +RUN cargo binstall cargo-sort-derives cargo-spellcheck cargo-udeps cargo-deny + + +FROM debian:trixie-slim + +RUN apt update \ + && apt install -y --no-install-recommends ca-certificates git rustup build-essential \ + libssl-dev pkg-config libglib2.0-0 libpango-1.0-0 libatk1.0-dev libgdk-pixbuf-2.0-dev \ + libcairo2-dev libgtk-3-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev \ + && apt clean + +COPY --from=builder /usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/ /root/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/ +COPY --from=builder /usr/local/cargo/bin /root/.cargo/bin/ + +RUN rustup default nightly diff --git a/spellcheck.dic b/spellcheck.dic new file mode 100644 index 0000000..f178181 --- /dev/null +++ b/spellcheck.dic @@ -0,0 +1,6 @@ +5 +Dioxus +MSN +renderers +SDK +TODO \ No newline at end of file diff --git a/spellcheck.toml b/spellcheck.toml new file mode 100644 index 0000000..e4b6e9a --- /dev/null +++ b/spellcheck.toml @@ -0,0 +1,10 @@ +# Also take into account developer comments +dev_comments = false + +# Skip the README.md file as defined in the cargo manifest +skip_readme = false + +[Hunspell] +lang = "en_US" +search_dirs = [ "." ] +extra_dictionaries = [ "./spellcheck.dic" ] diff --git a/src/domain/model/room.rs b/src/domain/model/room.rs index 91ce56a..28784b3 100644 --- a/src/domain/model/room.rs +++ b/src/domain/model/room.rs @@ -21,7 +21,7 @@ use crate::infrastructure::services::mozaik_builder::create_mozaik; pub type RoomId = OwnedRoomId; -#[derive(PartialEq, Clone)] +#[derive(Clone, PartialEq)] pub struct Invitation { invitee_id: UserId, sender_id: UserId, diff --git a/src/infrastructure/messaging/matrix/client.rs b/src/infrastructure/messaging/matrix/client.rs index a49a675..b50c2e2 100644 --- a/src/infrastructure/messaging/matrix/client.rs +++ b/src/infrastructure/messaging/matrix/client.rs @@ -43,7 +43,7 @@ use super::{ }; use crate::utils::oneshot; -#[derive(thiserror::Error, Debug)] +#[derive(Debug, thiserror::Error)] pub enum ClientError { #[error("Matrix client error: {0}")] Matrix(#[from] matrix_sdk::Error), diff --git a/src/infrastructure/services/random_svg_generators.rs b/src/infrastructure/services/random_svg_generators.rs index 2ca21e0..97e98d2 100644 --- a/src/infrastructure/services/random_svg_generators.rs +++ b/src/infrastructure/services/random_svg_generators.rs @@ -15,7 +15,7 @@ cfg_if! { } } -#[derive(Eq, PartialEq, Hash)] +#[derive(Eq, Hash, PartialEq)] pub enum AvatarFeeling { Ok, Warning, diff --git a/src/ui/components/button.rs b/src/ui/components/button.rs index d8fd046..5b586c6 100644 --- a/src/ui/components/button.rs +++ b/src/ui/components/button.rs @@ -3,7 +3,7 @@ use dioxus_free_icons::{Icon, IconShape}; turf::style_sheet!("src/ui/components/button.scss"); -#[derive(PartialEq, Clone, Props)] +#[derive(Clone, PartialEq, Props)] struct _ButtonProps { children: Element, #[props(default = false)] @@ -15,7 +15,7 @@ struct _ButtonProps { macro_rules! svg_text_icon { ($name:ident,$text:literal) => { - #[derive(Copy, Clone, PartialEq)] + #[derive(Clone, Copy, PartialEq)] struct $name; impl IconShape for $name { fn view_box(&self) -> &str { @@ -67,7 +67,7 @@ macro_rules! svg_text_button { }; } -#[derive(PartialEq, Clone, Props)] +#[derive(Clone, PartialEq, Props)] pub struct ButtonProps { #[props(default = false)] focus: bool, diff --git a/src/ui/components/icons.rs b/src/ui/components/icons.rs index 7516049..1a125bf 100644 --- a/src/ui/components/icons.rs +++ b/src/ui/components/icons.rs @@ -87,7 +87,7 @@ const _PYRAMID_VIEWBOX_HEIGHT: i64 = (_PYRAMID_CENTRAL_EDGE_E2_Y + _PYRAMID_STRO const _PYRAMID_VIEWBOX_WIDTH: i64 = (_PYRAMID_RIGHT_EDGE_E2_X + _PYRAMID_STROKE_WIDTH) as i64; const _PYRAMID_VIEWBOX: &str = formatcp!("0 0 {_PYRAMID_VIEWBOX_WIDTH} {_PYRAMID_VIEWBOX_HEIGHT}"); -#[derive(PartialEq, Clone)] +#[derive(Clone, PartialEq)] struct PyramidShape { color: String, ratio: f64, @@ -154,7 +154,7 @@ impl IconShape for PyramidShape { } } -#[derive(PartialEq, Clone, Props)] +#[derive(Clone, PartialEq, Props)] pub struct PyramidProps { color: Option, #[props(default = 0.5)] diff --git a/src/ui/components/modal.rs b/src/ui/components/modal.rs index f919c83..01c71b5 100644 --- a/src/ui/components/modal.rs +++ b/src/ui/components/modal.rs @@ -15,7 +15,7 @@ use style::{COLOR_CRITICAL_100, COLOR_SUCCESS_100, COLOR_WARNING_100}; turf::style_sheet!("src/ui/components/modal.scss"); -#[derive(Clone, Copy, Eq, PartialEq, Hash)] +#[derive(Clone, Copy, Eq, Hash, PartialEq)] pub enum Severity { Ok, Warning, @@ -42,7 +42,7 @@ fn avatar_configs() -> &'static HashMap> { }) } -#[derive(Props, Clone, PartialEq)] +#[derive(Clone, PartialEq, Props)] pub struct ModalProps { pub severity: Severity, #[props(optional)] diff --git a/src/ui/components/spinner.rs b/src/ui/components/spinner.rs index a45f2d9..9b8be93 100644 --- a/src/ui/components/spinner.rs +++ b/src/ui/components/spinner.rs @@ -5,7 +5,7 @@ use crate::ui::components::icons::LogoShape; turf::style_sheet!("src/ui/components/spinner.scss"); -#[derive(PartialEq, Clone, Props)] +#[derive(Clone, PartialEq, Props)] pub struct SpinnerProps { #[props(default = true)] animate: bool, diff --git a/src/ui/components/text_input.rs b/src/ui/components/text_input.rs index 8f34dd8..fc6ea75 100644 --- a/src/ui/components/text_input.rs +++ b/src/ui/components/text_input.rs @@ -9,7 +9,7 @@ turf::style_sheet!("src/ui/components/text_input.scss"); pub trait InputPropsData {} -#[derive(Props, Clone, PartialEq)] +#[derive(Clone, PartialEq, Props)] pub struct InputProps { value: Option, placeholder: Option, @@ -97,7 +97,7 @@ pub fn TextInput(props: InputProps) -> Element { } } -#[derive(Props, Clone, PartialEq)] +#[derive(Clone, PartialEq, Props)] pub struct PasswordInputState { text_input_state: TextInputState, #[props(default = 0.0)]